From 3deff3dc4a044fdea44f6ac41ee1b3812b185d1e Mon Sep 17 00:00:00 2001 From: 0xjei Date: Wed, 2 Sep 2026 15:39:51 +0200 Subject: [PATCH 1/9] feat: migrate fhe.rs to core/lbfv branch (Step 0 of Secure-16384 presets) Migrate the workspace from fhe.rs v0.2.2 to the core/lbfv branch (experimental-mbfv) as Step 0 toward adding Secure-16384 BFV presets: - Pin fhe/fhe-traits/fhe-math/fhe-util to branch core/lbfv - Bump num-bigint to ^0.5.1 (rand_0_9 feature), rand to =0.9.4, zeroize to ^1.9.0 - Thread mult_depth through generate_smudging_error, calculate_error_size, requests/events, and smudging configs (new_multiplicative, fallible) - Add INSECURE_512/SECURE_8192/SECURE_16384 mult_depth constants and the mult_depth field on PresetSearchDefaults - Replace fhe_math::Error::Default with structured variants; reflect ThresholdError::InvalidPartyCount - Drop k1.center(t) in user_data_encryption and share_encryption circuits to match core/lbfv to_poly (uncentered scaled plaintext) - Migrate smudging range expectations (28/30/31 -> 38/40/41) --- Cargo.lock | 323 ++++++++---------- Cargo.toml | 14 +- crates/compute-provider/Cargo.toml | 2 +- crates/evm/src/interfold/events.rs | 36 +- crates/fhe-params/src/constants.rs | 7 + crates/fhe-params/src/presets.rs | 9 + .../effects/initialize_dkg.rs | 1 + crates/polynomial/Cargo.toml | 2 +- crates/polynomial/src/crt_polynomial.rs | 57 ++-- crates/support/Cargo.toml | 8 +- crates/test-helpers/src/application.rs | 4 +- crates/test-helpers/src/usecase_helpers.rs | 3 +- crates/tests/tests/integration.rs | 6 + crates/trbfv/src/gen_pk_share_and_sk_sss.rs | 6 +- crates/trbfv/src/helpers.rs | 4 +- crates/trbfv/src/trbfv_request.rs | 2 + crates/zk-helpers/src/bin/compute_vk_hash.rs | 9 +- .../dkg/share_computation/computation.rs | 12 +- .../circuits/dkg/share_computation/sample.rs | 5 +- .../circuits/dkg/share_decryption/sample.rs | 2 +- .../dkg/share_encryption/computation.rs | 1 - .../circuits/dkg/share_encryption/sample.rs | 5 +- .../decrypted_shares_aggregation/sample.rs | 2 +- .../threshold/pk_generation/computation.rs | 6 +- .../threshold/pk_generation/sample.rs | 8 +- .../threshold/share_decryption/sample.rs | 2 +- .../user_data_encryption/computation.rs | 1 - crates/zk-helpers/src/math.rs | 7 +- .../tests/common/node_fold_witness.rs | 2 +- examples/CRISP/Cargo.toml | 8 +- examples/CRISP/crates/crisp-utils/Cargo.toml | 2 +- .../CRISP/crates/zk-inputs-wasm/Cargo.toml | 2 +- examples/CRISP/crates/zk-inputs/Cargo.toml | 2 +- examples/CRISP/program/Cargo.toml | 2 +- examples/CRISP/server/Cargo.toml | 2 +- templates/default/Cargo.toml | 4 +- 36 files changed, 288 insertions(+), 280 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 244f203b7a..9bf136d6b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,7 +20,7 @@ dependencies = [ "serde-big-array", "strum 0.28.0", "strum_macros 0.28.0", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -110,7 +110,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.2", + "rand 0.9.4", "sha1", "smallvec", "tokio", @@ -269,7 +269,7 @@ dependencies = [ "itertools 0.15.0", "rustc-hash", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -288,7 +288,7 @@ dependencies = [ "log", "p256", "sha2 0.11.0", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -373,15 +373,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -464,7 +455,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -501,7 +492,7 @@ dependencies = [ "futures", "futures-util", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -543,7 +534,7 @@ dependencies = [ "alloy-rlp", "crc", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -567,7 +558,7 @@ dependencies = [ "alloy-rlp", "k256 0.13.4", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -589,7 +580,7 @@ dependencies = [ "serde", "serde_with", "sha2 0.10.9", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -642,7 +633,7 @@ dependencies = [ "http 1.4.0", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -669,7 +660,7 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -701,7 +692,7 @@ dependencies = [ "rand 0.8.5", "serde_json", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", "url", ] @@ -725,7 +716,7 @@ dependencies = [ "keccak-asm", "paste", "proptest", - "rand 0.9.2", + "rand 0.9.4", "ruint", "rustc-hash", "serde", @@ -773,7 +764,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tracing", "url", @@ -937,7 +928,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -951,7 +942,7 @@ dependencies = [ "alloy-serde", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -989,7 +980,7 @@ dependencies = [ "either", "elliptic-curve 0.13.8", "k256 0.13.4", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -1005,7 +996,7 @@ dependencies = [ "async-trait", "k256 0.13.4", "rand 0.8.5", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -1097,7 +1088,7 @@ dependencies = [ "parking_lot 0.12.5", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tower 0.5.3", "tracing", @@ -1735,7 +1726,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror 2.0.18", + "thiserror 2.0.20", "time", ] @@ -2291,7 +2282,7 @@ dependencies = [ "itertools 0.15.0", "num-bigint 0.5.1", "num-traits", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -3091,7 +3082,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ab67060fc6b8ef687992d439ca0fa36e7ed17e9a0b16b25b601e8757df720de" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] @@ -3363,8 +3354,8 @@ dependencies = [ "fhe-math", "fhe-traits", "futures", - "num-bigint 0.4.6", - "rand 0.9.2", + "num-bigint 0.5.1", + "rand 0.9.4", "serde", "tracing", ] @@ -3379,7 +3370,7 @@ dependencies = [ "e3-zk-helpers", "fhe", "fhe-traits", - "rand 0.9.2", + "rand 0.9.4", "thiserror 1.0.69", ] @@ -3458,7 +3449,7 @@ dependencies = [ "petname", "phf", "rand 0.8.5", - "rand 0.9.2", + "rand 0.9.4", "reqwest", "serde", "serde_json", @@ -3494,9 +3485,9 @@ dependencies = [ "hex", "lean-imt", "light-poseidon", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "serde_json", @@ -3519,7 +3510,7 @@ dependencies = [ "hex", "path-clean", "petname", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_yaml", "shellexpand", @@ -3546,7 +3537,7 @@ dependencies = [ "async-trait", "bincode", "e3-utils", - "rand 0.9.2", + "rand 0.9.4", "serde", "tokio", "tracing", @@ -3647,7 +3638,7 @@ dependencies = [ "libc", "libp2p", "phf", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "reqwest", "serde", @@ -3686,7 +3677,7 @@ dependencies = [ "hex", "once_cell", "proptest", - "rand 0.9.2", + "rand 0.9.4", "serde", "sha2 0.10.9", "strum 0.27.2", @@ -3722,7 +3713,7 @@ dependencies = [ "e3-zk-helpers", "futures-util", "hex", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "serde", "serde_json", "tokio", @@ -3766,7 +3757,7 @@ dependencies = [ "fhe", "fhe-traits", "fhe-util", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "tracing", @@ -3782,9 +3773,9 @@ dependencies = [ "clap", "fhe", "fhe-traits", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "thiserror 1.0.69", @@ -3825,7 +3816,7 @@ dependencies = [ "eyre", "fhe", "fhe-traits", - "rand 0.9.2", + "rand 0.9.4", "serde", "thiserror 1.0.69", "tokio", @@ -3875,7 +3866,7 @@ dependencies = [ "fhe", "fhe-traits", "ndarray", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_core 0.9.5", "serde", @@ -3919,8 +3910,8 @@ dependencies = [ "fhe-math", "fhe-traits", "ndarray", - "num-bigint 0.4.6", - "rand 0.9.2", + "num-bigint 0.5.1", + "rand 0.9.4", "rayon", "thiserror 1.0.69", "tokio", @@ -3947,7 +3938,7 @@ dependencies = [ "futures", "hex", "libp2p", - "rand 0.9.2", + "rand 0.9.4", "serde", "sha2 0.10.9", "tokio", @@ -3960,7 +3951,7 @@ dependencies = [ name = "e3-parity-matrix" version = "0.14.0" dependencies = [ - "num-bigint 0.4.6", + "num-bigint 0.5.1", "num-traits", "proptest", "serde", @@ -3974,7 +3965,7 @@ dependencies = [ "bincode", "criterion", "fhe-math", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -4071,8 +4062,8 @@ dependencies = [ "e3-request", "e3-utils", "num", - "num-bigint 0.4.6", - "rand 0.9.2", + "num-bigint 0.5.1", + "rand 0.9.4", "serde", "tokio", "tracing", @@ -4137,7 +4128,7 @@ dependencies = [ "fhe-traits", "hex", "libp2p", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "tokio", "tracing", @@ -4182,8 +4173,8 @@ dependencies = [ "fhe", "fhe-traits", "fhe-util", - "num-bigint 0.4.6", - "rand 0.9.2", + "num-bigint 0.5.1", + "rand 0.9.4", "rand_chacha 0.9.0", "serde_json", "serial_test", @@ -4212,9 +4203,9 @@ dependencies = [ "fhe-math", "fhe-traits", "ndarray", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "petname", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "tokio", @@ -4234,7 +4225,7 @@ dependencies = [ "derivative", "e3-utils-derive", "hex", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "regex", "serde", @@ -4283,10 +4274,10 @@ dependencies = [ "hex", "itertools 0.14.0", "ndarray", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "num-integer", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rayon", "serde", "serde_json", @@ -4335,10 +4326,10 @@ dependencies = [ "nargo", "ndarray", "noirc_abi", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "num-traits", "paste", - "rand 0.9.2", + "rand 0.9.4", "rayon", "reqwest", "serde", @@ -4516,26 +4507,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -4554,9 +4525,9 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" [[package]] name = "event-listener" @@ -4603,7 +4574,7 @@ checksum = "4e7f34442dbe69c60fe8eaf58a8cafff81a1f278816d8ab4db255b3bef4ac3c4" dependencies = [ "getrandom 0.3.4", "libm", - "rand 0.9.2", + "rand 0.9.4", "siphasher", ] @@ -4658,25 +4629,25 @@ dependencies = [ [[package]] name = "fhe" version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#525bc84c4fc0dc2089053c4c9297c6445189fd9e" dependencies = [ "bincode", "doc-comment", "fhe-math", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "num-traits", - "prost 0.14.3", + "prost 0.14.4", "prost-build", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_distr", "rayon", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", "zeroize_derive", ] @@ -4684,46 +4655,44 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#525bc84c4fc0dc2089053c4c9297c6445189fd9e" dependencies = [ "ethnum", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint 0.4.6", + "num-bigint 0.5.1", "num-bigint-dig", "num-traits", - "prost 0.14.3", + "prost 0.14.4", "prost-build", "pulp", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "sha2 0.10.9", - "tfhe-ntt", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", ] [[package]] name = "fhe-traits" version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#525bc84c4fc0dc2089053c4c9297c6445189fd9e" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", ] [[package]] name = "fhe-util" version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#525bc84c4fc0dc2089053c4c9297c6445189fd9e" dependencies = [ "num-bigint-dig", "num-traits", "prime_factorization", - "rand 0.8.5", - "rand 0.9.2", + "rand 0.9.4", "rand_distr", "rayon", ] @@ -5300,10 +5269,10 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "ring", "socket2 0.5.10", - "thiserror 2.0.18", + "thiserror 2.0.20", "tinyvec", "tokio", "tracing", @@ -5323,10 +5292,10 @@ dependencies = [ "moka", "once_cell", "parking_lot 0.12.5", - "rand 0.9.2", + "rand 0.9.4", "resolv-conf", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tracing", ] @@ -5699,7 +5668,7 @@ dependencies = [ "hyper", "hyper-util", "log", - "rand 0.9.2", + "rand 0.9.4", "tokio", "url", "xmltree", @@ -6012,7 +5981,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tower 0.5.3", "tracing", @@ -6027,7 +5996,7 @@ dependencies = [ "http 1.4.0", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -6174,7 +6143,7 @@ dependencies = [ "multiaddr", "pin-project", "rw-stream-sink", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -6218,7 +6187,7 @@ dependencies = [ "quick-protobuf", "rand 0.8.5", "rw-stream-sink", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", "unsigned-varint 0.8.0", "web-time", @@ -6287,7 +6256,7 @@ dependencies = [ "quick-protobuf", "quick-protobuf-codec", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -6304,7 +6273,7 @@ dependencies = [ "quick-protobuf", "rand 0.8.5", "sha2 0.10.9", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", "zeroize", ] @@ -6330,7 +6299,7 @@ dependencies = [ "rand 0.8.5", "sha2 0.10.9", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", "uint 0.10.0", "web-time", @@ -6408,7 +6377,7 @@ dependencies = [ "ring", "rustls", "socket2 0.5.10", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tracing", ] @@ -6495,7 +6464,7 @@ dependencies = [ "ring", "rustls", "rustls-webpki", - "thiserror 2.0.18", + "thiserror 2.0.20", "x509-parser", "yasna", ] @@ -6835,7 +6804,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", "url", "walkdir", @@ -6922,7 +6891,7 @@ dependencies = [ "log", "netlink-packet-core", "netlink-sys", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -6983,7 +6952,7 @@ dependencies = [ "num-traits", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "toml", ] @@ -7008,7 +6977,7 @@ dependencies = [ "noirc_printable_type", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -7075,7 +7044,7 @@ dependencies = [ "serde_json", "serde_with", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -7108,7 +7077,7 @@ dependencies = [ "smol_str", "strum 0.28.0", "strum_macros 0.28.0", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -7174,8 +7143,6 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "rand 0.8.5", - "serde", ] [[package]] @@ -7186,6 +7153,9 @@ checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" dependencies = [ "num-integer", "num-traits", + "rand 0.9.4", + "rand_core 0.9.5", + "serde", ] [[package]] @@ -7199,7 +7169,7 @@ dependencies = [ "num-iter", "num-traits", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "serde", "smallvec", ] @@ -7413,7 +7383,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -7445,7 +7415,7 @@ dependencies = [ "opentelemetry_sdk", "prost 0.13.5", "reqwest", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tonic", "tracing", @@ -7487,9 +7457,9 @@ dependencies = [ "glob", "opentelemetry", "percent-encoding", - "rand 0.9.2", + "rand 0.9.4", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tokio-stream", "tracing", @@ -7717,7 +7687,7 @@ checksum = "9cd31dcfdbbd7431a807ef4df6edd6473228e94d5c805e8cf671227a21bad068" dependencies = [ "anyhow", "clap", - "itertools 0.14.0", + "itertools 0.15.0", "proc-macro2", "quote", "rand 0.8.5", @@ -8082,7 +8052,7 @@ dependencies = [ "bit-vec 0.8.0", "bitflags 2.10.0", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_xorshift 0.4.0", "regex-syntax", @@ -8103,19 +8073,19 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ "bytes", - "prost-derive 0.14.3", + "prost-derive 0.14.4", ] [[package]] name = "prost-build" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", "itertools 0.14.0", @@ -8123,7 +8093,7 @@ dependencies = [ "multimap", "petgraph", "prettyplease", - "prost 0.14.3", + "prost 0.14.4", "prost-types", "regex", "syn 2.0.117", @@ -8145,9 +8115,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", "itertools 0.14.0", @@ -8158,18 +8128,18 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" dependencies = [ - "prost 0.14.3", + "prost 0.14.4", ] [[package]] name = "pulp" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" dependencies = [ "bytemuck", "cfg-if", @@ -8184,9 +8154,9 @@ dependencies = [ [[package]] name = "pulp-wasm-simd-flag" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" [[package]] name = "quick-error" @@ -8231,7 +8201,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.6.2", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tracing", "web-time", @@ -8247,13 +8217,13 @@ dependencies = [ "fastbloom", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.20", "tinyvec", "tracing", "web-time", @@ -8314,9 +8284,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -8386,7 +8356,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] @@ -8528,7 +8498,7 @@ checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", "libredox", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -8741,7 +8711,7 @@ dependencies = [ "primitive-types", "proptest", "rand 0.8.5", - "rand 0.9.2", + "rand 0.9.4", "rlp", "ruint-macro", "serde_core", @@ -9802,17 +9772,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "tfhe-ntt" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10650c743ade46b166c698c8349902ed5986784a7db418c51f810bea25f09e3d" -dependencies = [ - "aligned-vec", - "bytemuck", - "pulp", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -9824,11 +9783,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.20", ] [[package]] @@ -9844,13 +9803,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.3", ] [[package]] @@ -10319,11 +10278,11 @@ dependencies = [ "http 1.4.0", "httparse", "log", - "rand 0.9.2", + "rand 0.9.4", "rustls", "rustls-pki-types", "sha1", - "thiserror 2.0.18", + "thiserror 2.0.20", "utf-8", ] @@ -11114,7 +11073,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper", - "thiserror 2.0.18", + "thiserror 2.0.20", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -11142,7 +11101,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror 2.0.18", + "thiserror 2.0.20", "time", ] @@ -11252,18 +11211,18 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 7eb9f2b841..62a3d362f7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -152,10 +152,10 @@ dirs = "=5.0.1" dialoguer = "=0.11.0" duct = "=1.0.0" eyre = { version = "=0.6.12" } -fhe = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-math = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } +fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv", features = ["experimental-mbfv"] } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe-math = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } figment = { version = "=0.10.19", features = ["env", "yaml", "test"] } futures = "=0.3.31" futures-util = "=0.3.31" @@ -164,7 +164,7 @@ git2 = "=0.20.2" hex = "=0.4.3" lazy_static = "=1.5.0" num = "=0.4.3" -num-bigint = { version = "=0.4.6" } +num-bigint = { version = "^0.5.1" } num-traits = "=0.2.19" num-integer = "0.1.46" ndarray = { version = "=0.17.2", features = ["serde"] } @@ -180,7 +180,7 @@ proptest = "=1.11.0" proc-macro2 = "=1.0.106" quote = "=1.0.45" rand_chacha = "=0.9.0" -rand = "=0.9.2" +rand = "=0.9.4" rand_core = "=0.9.5" rayon = "=1.10.0" regex = "=1.11.1" @@ -220,4 +220,4 @@ libp2p = { version = "=0.56.0", features = [ "request-response", "cbor" ]} -zeroize = "=1.8.2" +zeroize = "^1.9.0" diff --git a/crates/compute-provider/Cargo.toml b/crates/compute-provider/Cargo.toml index 8ae44e2e49..237ea89670 100644 --- a/crates/compute-provider/Cargo.toml +++ b/crates/compute-provider/Cargo.toml @@ -11,7 +11,7 @@ serde = { workspace = true, features = ["derive", "std"] } lean-imt = "=0.1.2" sha3 = "=0.10.8" sha2 = "=0.10.9" -num-bigint = "=0.4.6" +num-bigint = "^0.5.1" num-traits = "=0.2.19" hex = "=0.4.3" light-poseidon = "=0.2.0" diff --git a/crates/evm/src/interfold/events.rs b/crates/evm/src/interfold/events.rs index 70c48ca99f..3c3641d471 100644 --- a/crates/evm/src/interfold/events.rs +++ b/crates/evm/src/interfold/events.rs @@ -84,21 +84,27 @@ impl E3RequestedWithChainId { .map_err(|e| anyhow::anyhow!("Failed to build lambda for preset: {}", e))?; let lambda_value = lambda.value(); - let error_size = match calculate_error_size(params_arc, threshold_n, threshold_m, lambda) { - Ok(size) => { - let size_bytes = size.to_bytes_be(); - info!( - "Calculated error_size for E3 (threshold_n={}, threshold_m={}, lambda={}): {} bytes", - threshold_n, threshold_m, lambda_value, size_bytes.len() - ); - ArcBytes::from_bytes(&size_bytes) - } - Err(e) => { - warn!( - "Failed to calculate error_size, using fallback: {}. \ - This may cause decryption failures!", - e - ); + let mult_depth = params_preset + .search_defaults() + .map(|sd| sd.mult_depth) + .ok_or_else(|| anyhow::anyhow!("Failed to get search defaults for preset"))?; + + let error_size = + match calculate_error_size(params_arc, threshold_n, threshold_m, mult_depth, lambda) { + Ok(size) => { + let size_bytes = size.to_bytes_be(); + info!( + "Calculated error_size for E3 (threshold_n={}, threshold_m={}, lambda={}): {} bytes", + threshold_n, threshold_m, lambda_value, size_bytes.len() + ); + ArcBytes::from_bytes(&size_bytes) + } + Err(e) => { + warn!( + "Failed to calculate error_size, using fallback: {}. \ + This may cause decryption failures!", + e + ); ArcBytes::from_bytes( &BigUint::from(36128399948547143872891754381312u128).to_bytes_be(), ) diff --git a/crates/fhe-params/src/constants.rs b/crates/fhe-params/src/constants.rs index df92176194..d3668d5751 100644 --- a/crates/fhe-params/src/constants.rs +++ b/crates/fhe-params/src/constants.rs @@ -85,4 +85,11 @@ pub mod defaults { pub const DEFAULT_INSECURE_LAMBDA: usize = 2; /// Default secure security parameter (λ). pub const DEFAULT_SECURE_LAMBDA: usize = 50; + + /// Multiplicative depth for insecure-512 preset (no l-BFV support). + pub const INSECURE_512_MULT_DEPTH: u32 = 0; + /// Multiplicative depth for secure-8192 preset (no l-BFV support). + pub const SECURE_8192_MULT_DEPTH: u32 = 0; + /// Multiplicative depth for secure-16384 preset. + pub const SECURE_16384_MULT_DEPTH: u32 = 3; } diff --git a/crates/fhe-params/src/presets.rs b/crates/fhe-params/src/presets.rs index 63c313bc6c..de375ad9b2 100644 --- a/crates/fhe-params/src/presets.rs +++ b/crates/fhe-params/src/presets.rs @@ -9,6 +9,8 @@ use crate::builder::{build_bfv_params_from_set, build_bfv_params_from_set_arc}; use crate::constants::{ defaults::DEFAULT_INSECURE_LAMBDA, defaults::DEFAULT_SECURE_LAMBDA, + defaults::INSECURE_512_MULT_DEPTH, + defaults::SECURE_8192_MULT_DEPTH, insecure_512, insecure_search_defaults::{ B as INSECURE_B, B_CHI as INSECURE_B_CHI, SEARCH_K as INSECURE_SEARCH_K, @@ -200,6 +202,11 @@ pub struct PresetSearchDefaults { /// Used to generate the secret key sk_i of each party i. /// This bound is used in security analysis equations. pub b_chi: u128, + /// Multiplicative depth for l-BFV smudging noise computation. + /// + /// Set to 0 for presets without l-BFV support (insecure-512, secure-8192). + /// Set to 3 for secure-16384. + pub mult_depth: u32, } #[derive(ThisError, Debug)] @@ -476,6 +483,7 @@ impl BfvPreset { lambda: DEFAULT_INSECURE_LAMBDA as u32, b: INSECURE_B, b_chi: INSECURE_B_CHI, + mult_depth: INSECURE_512_MULT_DEPTH, }), BfvPreset::SecureThreshold8192 => Some(PresetSearchDefaults { n: SEARCH_N, @@ -484,6 +492,7 @@ impl BfvPreset { lambda: DEFAULT_SECURE_LAMBDA as u32, b: B, b_chi: B_CHI, + mult_depth: SECURE_8192_MULT_DEPTH, }), _ => None, } diff --git a/crates/keyshare/src/threshold_keyshare/effects/initialize_dkg.rs b/crates/keyshare/src/threshold_keyshare/effects/initialize_dkg.rs index d3a1aeabbf..1a63e4aae7 100644 --- a/crates/keyshare/src/threshold_keyshare/effects/initialize_dkg.rs +++ b/crates/keyshare/src/threshold_keyshare/effects/initialize_dkg.rs @@ -142,6 +142,7 @@ impl ThresholdKeyshare { crp, lambda: threshold_preset.lambda_config(), num_ciphertexts: defaults.z as usize, + mult_depth: defaults.mult_depth, }), CorrelationId::new(), e3_id, diff --git a/crates/polynomial/Cargo.toml b/crates/polynomial/Cargo.toml index b06b5b44aa..8f5c0e85b7 100644 --- a/crates/polynomial/Cargo.toml +++ b/crates/polynomial/Cargo.toml @@ -7,7 +7,7 @@ description = "A polynomial library with big integer coefficients for cryptograp repository.workspace = true [dependencies] -num-bigint = { workspace = true, features = ["rand", "serde"] } +num-bigint = { workspace = true, features = ["rand_0_9", "serde"] } num-traits = { workspace = true } serde = { workspace = true, optional = true, features = ["rc"] } bincode = { workspace = true, optional = true } diff --git a/crates/polynomial/src/crt_polynomial.rs b/crates/polynomial/src/crt_polynomial.rs index 0e0654bc39..7ab1ffa7fa 100644 --- a/crates/polynomial/src/crt_polynomial.rs +++ b/crates/polynomial/src/crt_polynomial.rs @@ -114,30 +114,44 @@ impl CrtPolynomial { let degree = ctx.degree; let l = ctx.q.len(); if self.limbs.len() != l { - return Err(fhe_math::Error::Default(format!( - "CrtPolynomial::to_fhe_polynomial: {} limbs != ctx.q.len() {}", - self.limbs.len(), - l - ))); + return Err(fhe_math::Error::InvalidCoefficientCount { + representation: fhe_math::rq::Representation::PowerBasis, + actual: self.limbs.len(), + degree, + moduli: l, + }); } if moduli.len() != l { - return Err(fhe_math::Error::Default(format!( - "CrtPolynomial::to_fhe_polynomial: {} moduli != ctx.q.len() {}", - moduli.len(), - l - ))); + return Err(fhe_math::Error::InvalidCoefficientCount { + representation: fhe_math::rq::Representation::PowerBasis, + actual: moduli.len(), + degree, + moduli: l, + }); } let mut data = Vec::with_capacity(l * degree); for (i, &qi) in moduli.iter().enumerate().take(l) { let coeffs = self.limb(i).coefficients(); if coeffs.len() != degree { - return Err(fhe_math::Error::Default(format!( - "CrtPolynomial::to_fhe_polynomial: limb {i} len {} != ctx.degree {degree}", - coeffs.len() - ))); + return Err(fhe_math::Error::InvalidCoefficientCount { + representation: fhe_math::rq::Representation::PowerBasis, + actual: coeffs.len(), + degree, + moduli: l, + }); } for coeff in coeffs.iter().take(degree) { - let u = bigint_to_u64_mod(coeff, qi)?; + let bm = BigInt::from(qi); + let mut r = coeff % &bm; + if r < BigInt::zero() { + r += bm; + } + let u = r.to_u64().ok_or(fhe_math::Error::InvalidCoefficientCount { + representation: fhe_math::rq::Representation::PowerBasis, + actual: 1, + degree, + moduli: l, + })?; data.push(u); } } @@ -255,16 +269,3 @@ impl CrtPolynomial { &self.limbs[i] } } - -fn bigint_to_u64_mod(c: &BigInt, m: u64) -> Result { - let bm = BigInt::from(m); - let mut r = c % &bm; - if r < BigInt::zero() { - r += bm; - } - r.to_u64().ok_or_else(|| { - fhe_math::Error::Default(format!( - "CrtPolynomial::to_fhe_polynomial: coefficient does not fit u64 after mod {m}: {r}" - )) - }) -} diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index fe6b61bdd3..38b687a8ed 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -69,12 +69,12 @@ sha2 = "=0.10.9" # soon as one contains this code, and record the tag here. `pnpm check:image-id` warns until then. # It is deliberately a `rev` and not a `tag`: a tag can be moved, and the pin decides which code # the guest runs, so it should be content-addressed even when it names a release. -fhe = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } +fhe = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv", features = ["experimental-mbfv"] } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } e3-compute-provider = { git = "https://github.com/theinterfold/interfold", rev = "5b2ca6619a07aec6104f9b877bff948bd976b6cf" } tokio = { version = "=1.46.1", features = ["full"] } -rand = { version = "=0.9.2" } +rand = { version = "=0.9.4" } tracing-subscriber = { version = "=0.3.20", features = ["env-filter"] } boundless-market = { version = "=1.1.0" } url = { version = "=2.5.4" } diff --git a/crates/test-helpers/src/application.rs b/crates/test-helpers/src/application.rs index f7683cda47..da965c28b4 100644 --- a/crates/test-helpers/src/application.rs +++ b/crates/test-helpers/src/application.rs @@ -20,7 +20,7 @@ pub fn generate_ciphertexts( num_voters: usize, num_votes_per_voter: usize, ) -> (Vec>, Vec>) { - let params = &pk.par; + let params = &pk.params; let dist = Uniform::new_inclusive(0, 1).expect("valid uniform range"); let mut rng = rand::rng(); println!("generating ciphertexts..."); @@ -64,7 +64,7 @@ pub fn run_application( } let mut sums: Vec = (0..num_votes_per_voter) - .map(|_| Ciphertext::zero(&pk.par)) + .map(|_| Ciphertext::zero(&pk.params)) .collect(); for ct_group in ciphertexts { diff --git a/crates/test-helpers/src/usecase_helpers.rs b/crates/test-helpers/src/usecase_helpers.rs index c9b9942dfa..343f74ba71 100644 --- a/crates/test-helpers/src/usecase_helpers.rs +++ b/crates/test-helpers/src/usecase_helpers.rs @@ -75,8 +75,9 @@ pub fn generate_shares_hash_map( GenPkShareAndSkSssRequest { trbfv_config: trbfv_config.clone(), crp: ArcBytes::from_bytes(&crp.to_bytes()), - lambda: LambdaConfig::Insecure(40), + lambda: LambdaConfig::Insecure(2), num_ciphertexts: 1, + mult_depth: 0, }, ) }?; diff --git a/crates/tests/tests/integration.rs b/crates/tests/tests/integration.rs index 0c33d94fe7..2bcc9df24d 100644 --- a/crates/tests/tests/integration.rs +++ b/crates/tests/tests/integration.rs @@ -1441,10 +1441,16 @@ async fn test_trbfv_actor() -> Result<()> { let lambda = benchmark_params.bfv_preset.lambda()?; let seed = create_seed_from_u64(123); + let mult_depth = benchmark_params + .bfv_preset + .search_defaults() + .ok_or_else(|| anyhow::anyhow!("Failed to get search defaults for preset"))? + .mult_depth; let error_size = ArcBytes::from_bytes(&BigUint::to_bytes_be(&calculate_error_size( params_raw.clone(), threshold_n, threshold_m, + mult_depth, lambda, )?)); diff --git a/crates/trbfv/src/gen_pk_share_and_sk_sss.rs b/crates/trbfv/src/gen_pk_share_and_sk_sss.rs index 33273652e4..e1b71345b9 100644 --- a/crates/trbfv/src/gen_pk_share_and_sk_sss.rs +++ b/crates/trbfv/src/gen_pk_share_and_sk_sss.rs @@ -36,6 +36,8 @@ pub struct GenPkShareAndSkSssRequest { pub lambda: LambdaConfig, /// Number of ciphertexts (z) for smudging noise generation. pub num_ciphertexts: usize, + /// Multiplicative depth for l-BFV smudging noise computation. + pub mult_depth: u32, } struct InnerRequest { @@ -43,6 +45,7 @@ struct InnerRequest { pub crp: CommonRandomPoly, pub lambda: LambdaConfig, pub num_ciphertexts: usize, + pub mult_depth: u32, } impl TryFrom for InnerRequest { @@ -55,6 +58,7 @@ impl TryFrom for InnerRequest { crp, lambda: value.lambda, num_ciphertexts: value.num_ciphertexts, + mult_depth: value.mult_depth, }) } } @@ -135,7 +139,7 @@ pub fn gen_pk_share_and_sk_sss( let share_manager_for_esm = ShareManager::new(num_ciphernodes as usize, threshold as usize, params.clone())?; let lambda = req.lambda.into_lambda()?; - let esi_coeffs = trbfv.generate_smudging_error(req.num_ciphertexts, lambda, rng)?; + let esi_coeffs = trbfv.generate_smudging_error(req.num_ciphertexts, req.mult_depth, lambda, rng)?; let e_sm_rns = share_manager_for_esm.bigints_to_poly(&esi_coeffs)?; let e_sm_raw = ArcBytes::from_bytes(&e_sm_rns.deref().to_bytes()); diff --git a/crates/trbfv/src/helpers.rs b/crates/trbfv/src/helpers.rs index 7813934489..f5ba594b03 100644 --- a/crates/trbfv/src/helpers.rs +++ b/crates/trbfv/src/helpers.rs @@ -77,9 +77,11 @@ pub fn calculate_error_size( params: Arc, n: usize, num_ciphertexts: usize, + mult_depth: u32, lambda: Lambda, ) -> Result { - let config = SmudgingBoundCalculatorConfig::new(params, n, num_ciphertexts, lambda); + let config = + SmudgingBoundCalculatorConfig::new_multiplicative(params, n, num_ciphertexts, mult_depth, lambda)?; let calculator = SmudgingBoundCalculator::new(config); Ok(calculator.calculate_sm_bound()?) } diff --git a/crates/trbfv/src/trbfv_request.rs b/crates/trbfv/src/trbfv_request.rs index 3e436c38b1..c85c954708 100644 --- a/crates/trbfv/src/trbfv_request.rs +++ b/crates/trbfv/src/trbfv_request.rs @@ -149,6 +149,7 @@ pub struct ThresholdFailure { #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum ThresholdFailureKind { InvalidPartyId, + InvalidPartyCount, DuplicatePartyId, InvalidThreshold, ShareCountMismatch, @@ -182,6 +183,7 @@ impl ThresholdFailure { // explicit decision here rather than silently degrading to an unattributed failure. let (kind, party_id) = match t { TE::InvalidPartyId { party_id, .. } => (K::InvalidPartyId, Some(*party_id)), + TE::InvalidPartyCount { .. } => (K::InvalidPartyCount, None), TE::DuplicatePartyId { party_id } => (K::DuplicatePartyId, Some(*party_id)), TE::MalformedShares { party_id, .. } => (K::MalformedShares, Some(*party_id)), TE::InvalidThreshold { .. } => (K::InvalidThreshold, None), diff --git a/crates/zk-helpers/src/bin/compute_vk_hash.rs b/crates/zk-helpers/src/bin/compute_vk_hash.rs index b364923483..df3e73d700 100644 --- a/crates/zk-helpers/src/bin/compute_vk_hash.rs +++ b/crates/zk-helpers/src/bin/compute_vk_hash.rs @@ -34,12 +34,9 @@ fn field_from_vk_hash_file(path: &std::path::Path) -> Result { bail!("{}: expected 32 bytes, got {}", path.display(), bytes.len()); } let n = BigUint::from_bytes_be(&bytes); - let bigint = ::BigInt::try_from(n).map_err(|_| { - anyhow::anyhow!( - "{}: vk_hash integer does not fit the field's BigInt representation", - path.display() - ) - })?; + let mut limbs = n.to_u64_digits(); + limbs.resize(4, 0); + let bigint = ark_ff::BigInt::new([limbs[0], limbs[1], limbs[2], limbs[3]]); Fr::from_bigint(bigint).ok_or_else(|| { anyhow::anyhow!( "{}: vk_hash is not in the canonical range [0, p)", diff --git a/crates/zk-helpers/src/circuits/dkg/share_computation/computation.rs b/crates/zk-helpers/src/circuits/dkg/share_computation/computation.rs index b1bc2b22bc..c4a5800693 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_computation/computation.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_computation/computation.rs @@ -164,12 +164,14 @@ impl Computation for Bounds { // Use the same committee size as C1 (pk_generation) so smudging bounds and // bit widths match PK_GENERATION_BIT_E_SM / SHARE_COMPUTATION_E_SM_BIT_SECRET. - let e_sm_config = SmudgingBoundCalculatorConfig::new( + let e_sm_config = SmudgingBoundCalculatorConfig::new_multiplicative( threshold_params, data.n_parties as usize, num_ciphertexts as usize, + defaults.mult_depth, lambda, - ); + ) + .map_err(|e| CircuitsErrors::Sample(format!("Failed to create smudging config: {:?}", e)))?; let e_sm_calculator = SmudgingBoundCalculator::new(e_sm_config); @@ -349,9 +351,9 @@ mod tests { fn insecure_smudging_ranges_match_pk_generation() { let preset = BfvPreset::InsecureThreshold512; for (size, expected_bits) in [ - (CiphernodesCommitteeSize::Minimum, 28), - (CiphernodesCommitteeSize::Micro, 30), - (CiphernodesCommitteeSize::Small, 31), + (CiphernodesCommitteeSize::Minimum, 38), + (CiphernodesCommitteeSize::Micro, 40), + (CiphernodesCommitteeSize::Small, 41), ] { let committee = size.values(); let sample = ShareComputationCircuitData::generate_sample( diff --git a/crates/zk-helpers/src/circuits/dkg/share_computation/sample.rs b/crates/zk-helpers/src/circuits/dkg/share_computation/sample.rs index eb15e028db..118918d2cb 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_computation/sample.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_computation/sample.rs @@ -88,8 +88,11 @@ impl ShareComputationCircuitData { let lambda = preset .lambda() .map_err(|e| CircuitsErrors::Sample(e.to_string()))?; + let sd = preset + .search_defaults() + .ok_or_else(|| CircuitsErrors::Sample("Preset has no search defaults".into()))?; let esi_coeffs = trbfv - .generate_smudging_error(committee.n, lambda, &mut rng) + .generate_smudging_error(committee.n, sd.mult_depth, lambda, &mut rng) .map_err(|e| { CircuitsErrors::Sample(format!( "Failed to generate smudging error: {:?}", diff --git a/crates/zk-helpers/src/circuits/dkg/share_decryption/sample.rs b/crates/zk-helpers/src/circuits/dkg/share_decryption/sample.rs index ce1a61f2e2..31eac679ba 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_decryption/sample.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_decryption/sample.rs @@ -87,7 +87,7 @@ impl ShareDecryptionCircuitData { } DkgInputType::SmudgingNoise => { let esi_coeffs = trbfv - .generate_smudging_error(sd.z as usize, lambda, &mut rng) + .generate_smudging_error(sd.z as usize, sd.mult_depth, lambda, &mut rng) .map_err(|e| { CircuitsErrors::Sample(format!( "Failed to generate smudging error: {:?}", diff --git a/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs b/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs index 03aeca4dd3..bdd85e2f50 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs @@ -386,7 +386,6 @@ impl Computation for Inputs { let mut k1 = Polynomial::from_u64_vector(k1_u64); k1.reverse(); - k1.center(&BigInt::from(t)); let mut message = Polynomial::from_u64_vector(plaintext_poly_u64(&pt)?); message.reverse(); diff --git a/crates/zk-helpers/src/circuits/dkg/share_encryption/sample.rs b/crates/zk-helpers/src/circuits/dkg/share_encryption/sample.rs index 1049180113..8b7f93a310 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_encryption/sample.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_encryption/sample.rs @@ -70,8 +70,11 @@ impl ShareEncryptionCircuitData { sk_sss_u64[0].row(0).to_vec() } DkgInputType::SmudgingNoise => { + let sd = preset + .search_defaults() + .ok_or_else(|| CircuitsErrors::Sample("Preset has no search defaults".into()))?; let esi_coeffs = trbfv - .generate_smudging_error(num_ciphertexts as usize, lambda, &mut rng) + .generate_smudging_error(num_ciphertexts as usize, sd.mult_depth, lambda, &mut rng) .map_err(|e| { CircuitsErrors::Sample(format!( "Failed to generate smudging error: {:?}", diff --git a/crates/zk-helpers/src/circuits/threshold/decrypted_shares_aggregation/sample.rs b/crates/zk-helpers/src/circuits/threshold/decrypted_shares_aggregation/sample.rs index bcc27e36d9..100b55f05a 100644 --- a/crates/zk-helpers/src/circuits/threshold/decrypted_shares_aggregation/sample.rs +++ b/crates/zk-helpers/src/circuits/threshold/decrypted_shares_aggregation/sample.rs @@ -105,7 +105,7 @@ impl DecryptedSharesAggregationCircuitData { })?; let esi_coeffs = trbfv - .generate_smudging_error(sd.z as usize, lambda, &mut rng) + .generate_smudging_error(sd.z as usize, sd.mult_depth, lambda, &mut rng) .map_err(|e| { CircuitsErrors::Sample(format!( "Failed to generate smudging error: {:?}", diff --git a/crates/zk-helpers/src/circuits/threshold/pk_generation/computation.rs b/crates/zk-helpers/src/circuits/threshold/pk_generation/computation.rs index 5b4bc26e41..6b82d48545 100644 --- a/crates/zk-helpers/src/circuits/threshold/pk_generation/computation.rs +++ b/crates/zk-helpers/src/circuits/threshold/pk_generation/computation.rs @@ -194,12 +194,14 @@ impl Computation for Bounds { let lambda = preset .lambda() .map_err(|e| CircuitsErrors::Other(e.to_string()))?; - let smudging_config = SmudgingBoundCalculatorConfig::new( + let smudging_config = SmudgingBoundCalculatorConfig::new_multiplicative( threshold_params.clone(), committee_n, sd.z as usize, + sd.mult_depth, lambda, - ); + ) + .map_err(|e| CircuitsErrors::Other(format!("Failed to create smudging config: {:?}", e)))?; let smudging_calculator = SmudgingBoundCalculator::new(smudging_config); let e_sm_bound = smudging_calculator.calculate_sm_bound().map_err(|e| { CircuitsErrors::Other(format!("Failed to calculate smudging bound: {:?}", e)) diff --git a/crates/zk-helpers/src/circuits/threshold/pk_generation/sample.rs b/crates/zk-helpers/src/circuits/threshold/pk_generation/sample.rs index bf5e50ba52..18b2568d3d 100644 --- a/crates/zk-helpers/src/circuits/threshold/pk_generation/sample.rs +++ b/crates/zk-helpers/src/circuits/threshold/pk_generation/sample.rs @@ -56,8 +56,12 @@ impl PkGenerationCircuitData { let share_manager = ShareManager::new(num_parties, threshold, threshold_params)?; // Generate smudging error coefficients - let esi_coeffs = - trbfv.generate_smudging_error(num_ciphertexts as usize, lambda, &mut rng)?; + let esi_coeffs = trbfv.generate_smudging_error( + num_ciphertexts as usize, + defaults.mult_depth, + lambda, + &mut rng, + )?; // Convert to polynomial in RNS representation // bigints_to_poly returns Zeroizing, we need to clone the inner Poly diff --git a/crates/zk-helpers/src/circuits/threshold/share_decryption/sample.rs b/crates/zk-helpers/src/circuits/threshold/share_decryption/sample.rs index cea27069a1..2868fd82d7 100644 --- a/crates/zk-helpers/src/circuits/threshold/share_decryption/sample.rs +++ b/crates/zk-helpers/src/circuits/threshold/share_decryption/sample.rs @@ -113,7 +113,7 @@ impl ShareDecryptionCircuitData { all_party_sk_shares.push(sk_sss); let esi_coeffs = trbfv - .generate_smudging_error(num_ciphertexts, lambda, &mut rng) + .generate_smudging_error(num_ciphertexts, sd.mult_depth, lambda, &mut rng) .map_err(|e| { CircuitsErrors::Sample(format!("Failed to generate smudging error: {:?}", e)) })?; diff --git a/crates/zk-helpers/src/circuits/threshold/user_data_encryption/computation.rs b/crates/zk-helpers/src/circuits/threshold/user_data_encryption/computation.rs index 7a81c06851..610bb94570 100644 --- a/crates/zk-helpers/src/circuits/threshold/user_data_encryption/computation.rs +++ b/crates/zk-helpers/src/circuits/threshold/user_data_encryption/computation.rs @@ -370,7 +370,6 @@ impl Computation for Inputs { let mut k1 = Polynomial::from_u64_vector(k1_u64); k1.reverse(); - k1.center(&BigInt::from(t)); // Reconstruct u and e1 as polynomials (only the first limb is needed) let mut u = CrtPolynomial::from_fhe_polynomial(&u).limb(0).clone(); diff --git a/crates/zk-helpers/src/math.rs b/crates/zk-helpers/src/math.rs index 6a21f57c09..af51c03e7c 100644 --- a/crates/zk-helpers/src/math.rs +++ b/crates/zk-helpers/src/math.rs @@ -135,9 +135,10 @@ pub fn compute_k0is(moduli: &[u64], plaintext_modulus: u64) -> Result, CircuitsErrors::Sample(format!("Failed to create modulus for k0is: {:?}", e)) })?; let k0qi = m.inv(m.neg(plaintext_modulus)).ok_or_else(|| { - CircuitsErrors::Fhe(fhe::Error::MathError(fhe_math::Error::Default( - "Failed to calculate modulus inverse for k0qi".into(), - ))) + CircuitsErrors::Fhe(fhe::Error::MathError(fhe_math::Error::NonInvertible { + value: m.neg(plaintext_modulus), + modulus: qi, + })) })?; k0is.push(k0qi); } diff --git a/crates/zk-prover/tests/common/node_fold_witness.rs b/crates/zk-prover/tests/common/node_fold_witness.rs index 299e9ece59..8f8b8b2088 100644 --- a/crates/zk-prover/tests/common/node_fold_witness.rs +++ b/crates/zk-prover/tests/common/node_fold_witness.rs @@ -79,7 +79,7 @@ pub fn pk_generation_sample_with_esi( .map_err(|e| CircuitsErrors::Sample(format!("Failed to create ShareManager: {:?}", e)))?; let esi_coeffs: Vec = trbfv - .generate_smudging_error(num_ciphertexts as usize, lambda, &mut rng) + .generate_smudging_error(num_ciphertexts as usize, defaults.mult_depth, lambda, &mut rng) .map_err(|e| { CircuitsErrors::Sample(format!("Failed to generate smudging error: {:?}", e)) })?; diff --git a/examples/CRISP/Cargo.toml b/examples/CRISP/Cargo.toml index 6556e323fb..ebbeeca759 100644 --- a/examples/CRISP/Cargo.toml +++ b/examples/CRISP/Cargo.toml @@ -47,10 +47,10 @@ log = { version = "=0.4.27" } reqwest = { version = "=0.12.22", features = ["json"] } serde = { version = "=1.0.228", features = ["derive", "std"] } serde_json = "=1.0.145" -fhe = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-math = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } +fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv", features = ["experimental-mbfv"] } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe-math = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } tokio = { version = "=1.46.1", features = ["full"] } rand = { version = "0.9" } tracing-subscriber = { version = "=0.3.20", features = ["env-filter"] } diff --git a/examples/CRISP/crates/crisp-utils/Cargo.toml b/examples/CRISP/crates/crisp-utils/Cargo.toml index c9080c78e4..8aa6f4ebcd 100644 --- a/examples/CRISP/crates/crisp-utils/Cargo.toml +++ b/examples/CRISP/crates/crisp-utils/Cargo.toml @@ -10,5 +10,5 @@ repository.workspace = true e3-sdk = { workspace = true, default-features = false, features=["bfv"] } e3-bfv-client = { workspace = true } eyre = { workspace = true } -num-bigint = "=0.4.6" +num-bigint = "^0.5.1" diff --git a/examples/CRISP/crates/zk-inputs-wasm/Cargo.toml b/examples/CRISP/crates/zk-inputs-wasm/Cargo.toml index 63e5fee47c..eeb001b66d 100644 --- a/examples/CRISP/crates/zk-inputs-wasm/Cargo.toml +++ b/examples/CRISP/crates/zk-inputs-wasm/Cargo.toml @@ -18,7 +18,7 @@ web-sys = "0.3" getrandom = { version = "0.3", features = ["wasm_js"] } getrandom2 = { package = "getrandom", version = "0.2", features = ["js"] } serde_json.workspace = true -num-bigint = "0.4.6" +num-bigint = "^0.5.1" [dev-dependencies] wasm-bindgen-test = "0.2" diff --git a/examples/CRISP/crates/zk-inputs/Cargo.toml b/examples/CRISP/crates/zk-inputs/Cargo.toml index e6b1d556d1..562ad45514 100644 --- a/examples/CRISP/crates/zk-inputs/Cargo.toml +++ b/examples/CRISP/crates/zk-inputs/Cargo.toml @@ -17,7 +17,7 @@ e3-zk-helpers = { workspace = true } e3-polynomial = { workspace = true, features = ["serde"] } serde.workspace = true serde_json.workspace = true -num-bigint = "0.4.6" +num-bigint = "^0.5.1" num-traits = "0.2" rayon = "1.10.0" rand = "0.9" diff --git a/examples/CRISP/program/Cargo.toml b/examples/CRISP/program/Cargo.toml index c22250bb27..a7966b73da 100644 --- a/examples/CRISP/program/Cargo.toml +++ b/examples/CRISP/program/Cargo.toml @@ -12,7 +12,7 @@ e3-fhe-params = { workspace = true } [dev-dependencies] hex = "=0.4.3" -num-bigint = "=0.4.6" +num-bigint = "^0.5.1" serde_json = "=1.0.145" sha3 = "=0.10.8" e3-bfv-client = { workspace = true } diff --git a/examples/CRISP/server/Cargo.toml b/examples/CRISP/server/Cargo.toml index 72a6028a6e..f4dac069bf 100644 --- a/examples/CRISP/server/Cargo.toml +++ b/examples/CRISP/server/Cargo.toml @@ -38,7 +38,7 @@ fhe-traits.workspace = true ark-bn254 = "=0.4.0" ark-ff = "=0.4.2" light-poseidon = "=0.1.0" -num-bigint = "=0.4.6" +num-bigint = "^0.5.1" lean-imt = "=0.1.2" # Local dependencies diff --git a/templates/default/Cargo.toml b/templates/default/Cargo.toml index 9ca8e25b5d..5f3cbe8c67 100644 --- a/templates/default/Cargo.toml +++ b/templates/default/Cargo.toml @@ -7,8 +7,8 @@ members = [ [workspace.dependencies] e3-user-program = { path = "./program" } -fhe = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", tag = "v0.2.2" } +fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv", features = ["experimental-mbfv"] } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } e3-program-server = { path = "../../crates/program-server" } e3-bfv-client = { path = "../../crates/bfv-client" } e3-fhe-params = { path = "../../crates/fhe-params" } From c868391939badf96e21d87a246e344635a3cef83 Mon Sep 17 00:00:00 2001 From: 0xjei Date: Wed, 2 Sep 2026 15:41:16 +0200 Subject: [PATCH 2/9] style: apply rustfmt to mult_depth call sites [skip-line-limit] --- crates/evm/src/interfold/events.rs | 29 +++++++++++-------- crates/trbfv/src/gen_pk_share_and_sk_sss.rs | 3 +- crates/trbfv/src/helpers.rs | 9 ++++-- .../dkg/share_computation/computation.rs | 4 ++- .../circuits/dkg/share_computation/sample.rs | 6 ++-- .../circuits/dkg/share_encryption/sample.rs | 13 ++++++--- .../tests/common/node_fold_witness.rs | 7 ++++- 7 files changed, 47 insertions(+), 24 deletions(-) diff --git a/crates/evm/src/interfold/events.rs b/crates/evm/src/interfold/events.rs index 3c3641d471..dad7d9c756 100644 --- a/crates/evm/src/interfold/events.rs +++ b/crates/evm/src/interfold/events.rs @@ -89,22 +89,27 @@ impl E3RequestedWithChainId { .map(|sd| sd.mult_depth) .ok_or_else(|| anyhow::anyhow!("Failed to get search defaults for preset"))?; - let error_size = - match calculate_error_size(params_arc, threshold_n, threshold_m, mult_depth, lambda) { - Ok(size) => { - let size_bytes = size.to_bytes_be(); - info!( + let error_size = match calculate_error_size( + params_arc, + threshold_n, + threshold_m, + mult_depth, + lambda, + ) { + Ok(size) => { + let size_bytes = size.to_bytes_be(); + info!( "Calculated error_size for E3 (threshold_n={}, threshold_m={}, lambda={}): {} bytes", threshold_n, threshold_m, lambda_value, size_bytes.len() ); - ArcBytes::from_bytes(&size_bytes) - } - Err(e) => { - warn!( - "Failed to calculate error_size, using fallback: {}. \ + ArcBytes::from_bytes(&size_bytes) + } + Err(e) => { + warn!( + "Failed to calculate error_size, using fallback: {}. \ This may cause decryption failures!", - e - ); + e + ); ArcBytes::from_bytes( &BigUint::from(36128399948547143872891754381312u128).to_bytes_be(), ) diff --git a/crates/trbfv/src/gen_pk_share_and_sk_sss.rs b/crates/trbfv/src/gen_pk_share_and_sk_sss.rs index e1b71345b9..cef728f6bd 100644 --- a/crates/trbfv/src/gen_pk_share_and_sk_sss.rs +++ b/crates/trbfv/src/gen_pk_share_and_sk_sss.rs @@ -139,7 +139,8 @@ pub fn gen_pk_share_and_sk_sss( let share_manager_for_esm = ShareManager::new(num_ciphernodes as usize, threshold as usize, params.clone())?; let lambda = req.lambda.into_lambda()?; - let esi_coeffs = trbfv.generate_smudging_error(req.num_ciphertexts, req.mult_depth, lambda, rng)?; + let esi_coeffs = + trbfv.generate_smudging_error(req.num_ciphertexts, req.mult_depth, lambda, rng)?; let e_sm_rns = share_manager_for_esm.bigints_to_poly(&esi_coeffs)?; let e_sm_raw = ArcBytes::from_bytes(&e_sm_rns.deref().to_bytes()); diff --git a/crates/trbfv/src/helpers.rs b/crates/trbfv/src/helpers.rs index f5ba594b03..1dad8afe74 100644 --- a/crates/trbfv/src/helpers.rs +++ b/crates/trbfv/src/helpers.rs @@ -80,8 +80,13 @@ pub fn calculate_error_size( mult_depth: u32, lambda: Lambda, ) -> Result { - let config = - SmudgingBoundCalculatorConfig::new_multiplicative(params, n, num_ciphertexts, mult_depth, lambda)?; + let config = SmudgingBoundCalculatorConfig::new_multiplicative( + params, + n, + num_ciphertexts, + mult_depth, + lambda, + )?; let calculator = SmudgingBoundCalculator::new(config); Ok(calculator.calculate_sm_bound()?) } diff --git a/crates/zk-helpers/src/circuits/dkg/share_computation/computation.rs b/crates/zk-helpers/src/circuits/dkg/share_computation/computation.rs index c4a5800693..49c5521274 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_computation/computation.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_computation/computation.rs @@ -171,7 +171,9 @@ impl Computation for Bounds { defaults.mult_depth, lambda, ) - .map_err(|e| CircuitsErrors::Sample(format!("Failed to create smudging config: {:?}", e)))?; + .map_err(|e| { + CircuitsErrors::Sample(format!("Failed to create smudging config: {:?}", e)) + })?; let e_sm_calculator = SmudgingBoundCalculator::new(e_sm_config); diff --git a/crates/zk-helpers/src/circuits/dkg/share_computation/sample.rs b/crates/zk-helpers/src/circuits/dkg/share_computation/sample.rs index 118918d2cb..605a011ad2 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_computation/sample.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_computation/sample.rs @@ -88,9 +88,9 @@ impl ShareComputationCircuitData { let lambda = preset .lambda() .map_err(|e| CircuitsErrors::Sample(e.to_string()))?; - let sd = preset - .search_defaults() - .ok_or_else(|| CircuitsErrors::Sample("Preset has no search defaults".into()))?; + let sd = preset.search_defaults().ok_or_else(|| { + CircuitsErrors::Sample("Preset has no search defaults".into()) + })?; let esi_coeffs = trbfv .generate_smudging_error(committee.n, sd.mult_depth, lambda, &mut rng) .map_err(|e| { diff --git a/crates/zk-helpers/src/circuits/dkg/share_encryption/sample.rs b/crates/zk-helpers/src/circuits/dkg/share_encryption/sample.rs index 8b7f93a310..38ca5bf438 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_encryption/sample.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_encryption/sample.rs @@ -70,11 +70,16 @@ impl ShareEncryptionCircuitData { sk_sss_u64[0].row(0).to_vec() } DkgInputType::SmudgingNoise => { - let sd = preset - .search_defaults() - .ok_or_else(|| CircuitsErrors::Sample("Preset has no search defaults".into()))?; + let sd = preset.search_defaults().ok_or_else(|| { + CircuitsErrors::Sample("Preset has no search defaults".into()) + })?; let esi_coeffs = trbfv - .generate_smudging_error(num_ciphertexts as usize, sd.mult_depth, lambda, &mut rng) + .generate_smudging_error( + num_ciphertexts as usize, + sd.mult_depth, + lambda, + &mut rng, + ) .map_err(|e| { CircuitsErrors::Sample(format!( "Failed to generate smudging error: {:?}", diff --git a/crates/zk-prover/tests/common/node_fold_witness.rs b/crates/zk-prover/tests/common/node_fold_witness.rs index 8f8b8b2088..8aa18d691e 100644 --- a/crates/zk-prover/tests/common/node_fold_witness.rs +++ b/crates/zk-prover/tests/common/node_fold_witness.rs @@ -79,7 +79,12 @@ pub fn pk_generation_sample_with_esi( .map_err(|e| CircuitsErrors::Sample(format!("Failed to create ShareManager: {:?}", e)))?; let esi_coeffs: Vec = trbfv - .generate_smudging_error(num_ciphertexts as usize, defaults.mult_depth, lambda, &mut rng) + .generate_smudging_error( + num_ciphertexts as usize, + defaults.mult_depth, + lambda, + &mut rng, + ) .map_err(|e| { CircuitsErrors::Sample(format!("Failed to generate smudging error: {:?}", e)) })?; From 330a45965c2b45cd8252d96bd0243fcfde532057 Mon Sep 17 00:00:00 2001 From: 0xjei Date: Wed, 2 Sep 2026 16:52:56 +0200 Subject: [PATCH 3/9] feat: port multiplicative-depth-aware BFV search and set Secure-16384 (Step 1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Port the up-to-date BFV parameter search from enclave-research/Parameters/BFV: - Fixed ring dimension N=16384, exactly 5 CRT primes; Prop. 20 recursion B_C^(i+1) = 2kN^2||sk||·B_C^i + B_relin, with B_relin from Eq. (30). - B_sm = 2^(lambda+1)·d·B_C; second set enforces qi > 2·max_qi_first gap. - NTT prime table switched to p ≡ 1 (mod 32768); drop composite 40-48-bit buckets, keep validated 49-62-bit primes only. - Add mult_depth to BfvSearchConfig/BfvSearchResult and search_params CLI. Regenerate Secure-16384 for n=20, mult_depth=3, lambda=38, k=1000: - threshold: d=16384, 5x54-bit qi, q≈2^266, mult_depth=3 - DKG: k = max_qi, 2x56-bit qi - SECURE_16384_MULT_DEPTH 2 -> 3; runtime SmudgingBoundCalculator feasible. --- crates/fhe-params/src/bin/search_params.rs | 101 +- crates/fhe-params/src/builder.rs | 91 +- crates/fhe-params/src/constants.rs | 46 +- crates/fhe-params/src/presets.rs | 113 +- crates/fhe-params/src/search/bfv.rs | 1148 ++++++----------- crates/fhe-params/src/search/constants.rs | 319 +---- crates/fhe-params/src/search/prime.rs | 188 +-- .../src/bin/generate_parity_matrices.rs | 2 + 8 files changed, 808 insertions(+), 1200 deletions(-) diff --git a/crates/fhe-params/src/bin/search_params.rs b/crates/fhe-params/src/bin/search_params.rs index 18ec2bd2ce..6b903c0dd2 100644 --- a/crates/fhe-params/src/bin/search_params.rs +++ b/crates/fhe-params/src/bin/search_params.rs @@ -6,54 +6,58 @@ //! BFV Parameter Search CLI //! -//! Standalone command-line tool for searching BFV parameters using NTT-friendly primes. +//! Standalone command-line tool for searching BFV parameters using NTT-friendly +//! CRT primes over the fixed ring dimension N = 16384. use clap::Parser; use e3_fhe_params::search::bfv::{ bfv_search, bfv_search_second_param, BfvSearchConfig, BfvSearchResult, }; -use e3_fhe_params::search::constants::K_MAX; +use e3_fhe_params::search::constants::{K_MAX, RING_DIM, TARGET_NUM_PRIMES}; use e3_fhe_params::search::prime::{build_prime_items, build_prime_items_for_second}; -use e3_fhe_params::search::utils::{approx_bits_from_log2, fmt_big_summary}; +use e3_fhe_params::search::utils::{approx_bits_from_log2, fmt_big_summary, log2_big}; use num_bigint::BigUint; #[derive(Parser, Debug, Clone)] #[command( version, - about = "Search BFV params with NTT-friendly CRT primes (40..63 bits)" + about = "Search BFV params with NTT-friendly CRT primes (ring dimension N=16384)" )] struct Args { - /// Number of parties n (e.g. ciphernodes, default is 1000) - #[arg(long, default_value_t = 1000u128)] + /// Number of ciphernodes n. + #[arg(long, default_value_t = 20u128)] n: u128, - /// Number of fresh ciphertext z, i.e. number of votes. Note that the BFV plaintext modulus k will be defined as k = z - #[arg(long, default_value_t = 1000u128)] + /// Number of fresh-ciphertext additions z summed before the multiplicative + /// circuit (also caps the plaintext space). + #[arg(long, default_value_t = 3u128)] z: u128, - /// Plaintext modulus k (plaintext space). + /// Total multiplicative circuit depth (Prop. 20 recursion). + #[arg(long, default_value_t = 3u32)] + mult_depth: u32, + + /// BFV plaintext modulus k. #[arg(long, default_value_t = 1000u128)] k: u128, - /// Statistical Security parameter λ (negl(λ)=2^{-λ}). - #[arg(long, default_value_t = 80u32)] + /// Statistical security parameter λ (negl(λ)=2^{-λ}). + #[arg(long, default_value_t = 38u32)] lambda: u32, - /// Bound B on the error distribution \psi (see pdf) used generate e1 when encrypting (e.g., 20 for CBD with σ≈3.2). + /// Bound B on the error distribution ψ (e.g. 20 for CBD with σ≈3.2). #[arg(long, default_value_t = 20u128)] b: u128, - /// Bound B_{\chi} on the distribution \chi (see pdf) used generate the secret key sk_i of each party i. - /// By default, it is fixed to be 20 (that is the case when \chi is CBD with with σ≈3.2, which - /// is the distribution by default in fhe.rs). + /// Bound B_χ on the secret-key distribution χ. #[arg(long, default_value_t = 1u128)] b_chi: u128, - /// Min margin. - #[arg(long, default_value_t = 1f64)] + /// Minimum correctness margin in bits (log2(Δ) − log2(LHS)). + #[arg(long, default_value_t = 2.0f64)] min_margin: f64, - /// Verbose per-candidate logging + /// Verbose per-candidate logging. #[arg(long, default_value_t = false)] verbose: bool, } @@ -73,7 +77,7 @@ fn variance_uniform_str(b: u128) -> String { } fn variance_uniform_big_str(b: &BigUint) -> String { - // Variance for Uniform(-B..B): Var = B^2 / 3 + // Variance for Uniform(-B..B): Var = B^2 / 3. let var = (b * b) / 3u32; var.to_str_radix(10) } @@ -94,7 +98,10 @@ fn print_param_set( println!(); if show_common { println!(" n (ciphernodes) = {}", config.n); - println!(" z (votes) = {}", config.z); + println!(" z (additions) = {}", config.z); + if result.mult_depth > 0 { + println!(" mult_depth = {}", result.mult_depth); + } } println!( " k (plaintext space) = {} ({} bits)", @@ -136,7 +143,20 @@ fn print_param_set( " B_fresh = {}", result.b_fresh.to_str_radix(10) ); - println!(" B_C = {}", result.b_c.to_str_radix(10)); + println!(" B_C (additions) = {}", result.b_c.to_str_radix(10)); + if result.mult_depth > 0 { + println!(" mult_depth = {}", result.mult_depth); + println!( + " B_relin (Eq. 30) = {} (log₂ ≈ {:.1})", + result.b_relin.to_str_radix(10), + log2_big(&result.b_relin) + ); + println!( + " B_C (after mult) = {} (log₂ ≈ {:.1})", + result.b_c_final.to_str_radix(10), + log2_big(&result.b_c_final) + ); + } println!( " B_sm = {}", result.b_sm_min.to_str_radix(10) @@ -177,21 +197,22 @@ fn main() { println!(); println!("Inputs:"); println!(" n (ciphernodes) = {}", args.n); - println!(" z (votes) = {}", args.z); + println!(" z (additions) = {}", args.z); + println!(" mult_depth = {}", args.mult_depth); println!(" k (plaintext space) = {}", args.k); println!(" λ (statistical sec) = {}", args.lambda); println!(" B (error bound) = {}", args.b); println!(" B_χ (secret bound) = {}", args.b_chi); println!(); - // Enforce constraints on z and k + // Enforce constraints on z and k. if args.z == 0 { eprintln!("ERROR: z must be positive."); std::process::exit(1); } if args.z > K_MAX { eprintln!( - "ERROR: too many votes — z = {} exceeds 2^25 = {}.", + "ERROR: too many additions — z = {} exceeds {}.", args.z, K_MAX ); std::process::exit(1); @@ -200,17 +221,22 @@ fn main() { eprintln!("ERROR: user-supplied plaintext space k must be positive."); std::process::exit(1); } - if !args.min_margin.is_finite() || args.min_margin < 0.0 { eprintln!("ERROR: --min-margin must be a finite, non-negative number."); std::process::exit(1); } + println!( + "Fixed ring dimension set: N={}, {} CRT primes.", + RING_DIM, TARGET_NUM_PRIMES + ); + let config = BfvSearchConfig { n: args.n, z: args.z, k: args.k, lambda: args.lambda, + mult_depth: args.mult_depth, b: args.b, b_chi: args.b_chi, min_margin: args.min_margin, @@ -218,13 +244,16 @@ fn main() { }; println!("Prime pools:"); - println!(" First set: {} primes", build_prime_items().len()); println!( - " Second set: {} primes", + " First set: {} primes (49-62 bit, q ≡ 1 mod 32768)", + build_prime_items().len() + ); + println!( + " Second set: {} primes (50-62 bit, q ≡ 1 mod 32768)", build_prime_items_for_second().len() ); - // Search for first parameter set + // Search for the first parameter set. if args.verbose { println!(); println!( @@ -236,13 +265,17 @@ fn main() { ); } - let Ok(bfv) = bfv_search(&config) else { - eprintln!("\nERROR: No feasible first parameter set found."); - eprintln!("Try reducing n, z, k, λ, B, B_χ or min_margin."); - std::process::exit(1); + let bfv = match bfv_search(&config) { + Ok(res) => res, + Err(err) => { + eprintln!("\nERROR: No feasible first parameter set found."); + eprintln!("{err}"); + eprintln!("Try reducing n, z, k, λ, B, B_χ or min_margin."); + std::process::exit(1); + } }; - // Decide distributions: CBD for B ≤ 32, otherwise Uniform + // Decide distributions: CBD for B ≤ 32, otherwise Uniform. let (dist_b, var_b) = if args.b <= 32 { ("CBD", variance_cbd_str(args.b)) } else { @@ -252,7 +285,7 @@ fn main() { let var_chi = variance_cbd_str(args.b_chi); let var_enc = variance_uniform_big_str(&bfv.benc_min); - // Search for second parameter set + // Search for the second parameter set. if args.verbose { println!(); println!( diff --git a/crates/fhe-params/src/builder.rs b/crates/fhe-params/src/builder.rs index 4dcd4792be..a0f239667f 100644 --- a/crates/fhe-params/src/builder.rs +++ b/crates/fhe-params/src/builder.rs @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -use crate::constants::{insecure_512, secure_8192}; +use crate::constants::{insecure_512, secure_16384, secure_8192}; use crate::presets::{BfvParamSet, BfvPreset, PresetError}; use fhe::bfv::{BfvParameters, BfvParametersBuilder}; use num_bigint::BigUint; @@ -54,6 +54,25 @@ pub fn build_pair_for_preset( Ok((params_threshold, params_dkg)) } + BfvPreset::SecureThreshold16384 => { + let params_threshold = BfvParametersBuilder::new() + .set_degree(secure_16384::DEGREE) + .set_plaintext_modulus(secure_16384::threshold::PLAINTEXT_MODULUS) + .set_moduli(secure_16384::threshold::MODULI) + .set_error1_variance_str(secure_16384::threshold::ERROR1_VARIANCE) + .unwrap() + .build_arc() + .unwrap(); + + let params_dkg = BfvParametersBuilder::new() + .set_degree(secure_16384::DEGREE) + .set_plaintext_modulus(secure_16384::dkg::PLAINTEXT_MODULUS) + .set_moduli(secure_16384::dkg::MODULI) + .build_arc() + .unwrap(); + + Ok((params_threshold, params_dkg)) + } other => Err(PresetError::MissingPair(other.name())), } } @@ -145,7 +164,7 @@ pub fn try_build_bfv_params_arc( #[cfg(test)] mod tests { use super::*; - use crate::constants::{defaults, insecure_512, secure_8192}; + use crate::constants::{defaults, insecure_512, secure_16384, secure_8192}; use crate::presets::BfvPreset; use num_bigint::BigUint; use std::str::FromStr; @@ -292,4 +311,72 @@ mod tests { &BigUint::from_str(secure_8192::threshold::ERROR1_VARIANCE).unwrap() ); } + + #[test] + fn test_build_secure_16384_pair() { + let (threshold, dkg) = BfvPreset::SecureThreshold16384.build_pair().unwrap(); + assert_eq!(threshold.degree(), secure_16384::DEGREE); + assert_eq!( + threshold.plaintext(), + secure_16384::threshold::PLAINTEXT_MODULUS + ); + assert_eq!(threshold.moduli(), secure_16384::threshold::MODULI); + assert_eq!( + threshold.get_error1_variance(), + &BigUint::from_str(secure_16384::threshold::ERROR1_VARIANCE).unwrap() + ); + assert_eq!(dkg.degree(), secure_16384::DEGREE); + assert_eq!(dkg.plaintext(), secure_16384::dkg::PLAINTEXT_MODULUS); + assert_eq!(dkg.moduli(), secure_16384::dkg::MODULI); + } + + #[test] + fn test_build_secure_16384_threshold_from_set() { + let preset = BfvPreset::SecureThreshold16384; + let param_set: BfvParamSet = preset.into(); + let params = build_bfv_params_from_set(param_set); + + assert_eq!(params.degree(), secure_16384::DEGREE); + assert_eq!( + params.plaintext(), + secure_16384::threshold::PLAINTEXT_MODULUS + ); + assert_eq!(params.moduli(), secure_16384::threshold::MODULI); + assert_eq!( + params.get_error1_variance(), + &BigUint::from_str(secure_16384::threshold::ERROR1_VARIANCE).unwrap() + ); + } + + /// Runtime feasibility guard: the `SmudgingBoundCalculator` must accept the + /// Secure-16384 threshold parameters at the full committee (n=20) with the + /// configured smudging `m=z=3`, `mult_depth=3`, `lambda=38`. This encodes + /// the `2*(B_C + n*B_sm) < Delta` correctness budget; if the constants are + /// ever tightened beyond it, this test fails. + #[test] + fn test_secure_16384_smudging_bound_feasible() { + use crate::presets::LambdaConfig; + use fhe::trbfv::{SmudgingBoundCalculator, SmudgingBoundCalculatorConfig}; + use num_traits::Zero; + + let preset = BfvPreset::SecureThreshold16384; + let params = build_bfv_params_from_set_arc(BfvParamSet::from(preset)); + let defaults = preset.search_defaults().unwrap(); + + let lambda = LambdaConfig::Secure(defaults.lambda as usize) + .into_lambda() + .unwrap(); + let config = SmudgingBoundCalculatorConfig::new_multiplicative( + params.clone(), + defaults.n as usize, + defaults.z as usize, + defaults.mult_depth, + lambda, + ) + .expect("config construction should succeed"); + let bound = SmudgingBoundCalculator::new(config) + .calculate_sm_bound() + .expect("2*(B_C + n*B_sm) < Delta must hold at the configured depth"); + assert!(!bound.is_zero()); + } } diff --git a/crates/fhe-params/src/constants.rs b/crates/fhe-params/src/constants.rs index d3668d5751..fb447a86e4 100644 --- a/crates/fhe-params/src/constants.rs +++ b/crates/fhe-params/src/constants.rs @@ -51,6 +51,35 @@ pub mod secure_8192 { } } +/// Secure preset constants (degree 16384) - PRODUCTION READY. The runtime +/// `SmudgingBoundCalculator` enforces `2*(B_C + n*B_sm) < Delta = floor(Q/t)`; +/// these 16384 parameters were regenerated with the multiplicative-depth-aware +/// search (Prop. 20 recursion) and support `mult_depth` 0-3 at runtime. +pub mod secure_16384 { + pub const DEGREE: usize = 16384; + pub const NUM_PARTIES: u128 = 20; // real - used in the search default + + /// Threshold BFV parameters + pub mod threshold { + pub const PLAINTEXT_MODULUS: u64 = 1000; + pub const MODULI: &[u64] = &[ + 0x0020000000c70001, + 0x0020000000c10001, + 0x0020000000bf0001, + 0x0020000000b30001, + 0x0020000000970001, + ]; + pub const ERROR1_VARIANCE: &str = "4326914048779023023775413607683413333"; + } + + /// DKG parameters + pub mod dkg { + pub const PLAINTEXT_MODULUS: u64 = 9007199267782657; + pub const MODULI: &[u64] = &[0x0080000000080001, 0x0080000000130001]; + pub const ERROR1_VARIANCE: &str = "10"; + } +} + /// Common search defaults shared across presets /// Search defaults for the SecureThreshold8192 preset (production scale). /// The InsecureThreshold512 preset uses its own smaller values (see `insecure_search_defaults`) @@ -74,6 +103,17 @@ pub mod insecure_search_defaults { pub const SEARCH_Z: u128 = 1024; } +/// Search defaults for the SecureThreshold16384 preset (production scale). +/// `SEARCH_Z` is the number of summed ciphertexts (smudging `m`); the runtime +/// multiplicative depth is `SECURE_16384_MULT_DEPTH` (= 3). +pub mod secure_16384_search_defaults { + pub const B: u128 = 20; + pub const B_CHI: u128 = 1; + pub const SEARCH_N: u128 = 20; + pub const SEARCH_K: u128 = 1000; + pub const SEARCH_Z: u128 = 3; +} + /// Default values for BFV parameters pub mod defaults { /// Default variance for BFV parameters when not explicitly set @@ -83,13 +123,17 @@ pub mod defaults { /// Default insecure security parameter (λ). pub const DEFAULT_INSECURE_LAMBDA: usize = 2; - /// Default secure security parameter (λ). + /// Default secure security parameter (λ) for the 8192 presets. pub const DEFAULT_SECURE_LAMBDA: usize = 50; + /// Statistical security parameter (λ) for the 16384 presets. + pub const DEFAULT_SECURE_16384_LAMBDA: usize = 38; /// Multiplicative depth for insecure-512 preset (no l-BFV support). pub const INSECURE_512_MULT_DEPTH: u32 = 0; /// Multiplicative depth for secure-8192 preset (no l-BFV support). pub const SECURE_8192_MULT_DEPTH: u32 = 0; /// Multiplicative depth for secure-16384 preset. + /// + /// Depth 3 is feasible with the regenerated (larger-q) parameters. pub const SECURE_16384_MULT_DEPTH: u32 = 3; } diff --git a/crates/fhe-params/src/presets.rs b/crates/fhe-params/src/presets.rs index de375ad9b2..04e45785b0 100644 --- a/crates/fhe-params/src/presets.rs +++ b/crates/fhe-params/src/presets.rs @@ -8,8 +8,10 @@ use crate::builder::build_pair_for_preset; use crate::builder::{build_bfv_params_from_set, build_bfv_params_from_set_arc}; use crate::constants::{ defaults::DEFAULT_INSECURE_LAMBDA, + defaults::DEFAULT_SECURE_16384_LAMBDA, defaults::DEFAULT_SECURE_LAMBDA, defaults::INSECURE_512_MULT_DEPTH, + defaults::SECURE_16384_MULT_DEPTH, defaults::SECURE_8192_MULT_DEPTH, insecure_512, insecure_search_defaults::{ @@ -17,6 +19,11 @@ use crate::constants::{ SEARCH_N as INSECURE_SEARCH_N, SEARCH_Z as INSECURE_SEARCH_Z, }, search_defaults::{B, B_CHI, SEARCH_K, SEARCH_N, SEARCH_Z}, + secure_16384, + secure_16384_search_defaults::{ + B as SECURE_16384_B, B_CHI as SECURE_16384_B_CHI, SEARCH_K as SECURE_16384_K, + SEARCH_N as SECURE_16384_N, SEARCH_Z as SECURE_16384_Z, + }, secure_8192, }; use serde::{Deserialize, Serialize}; @@ -63,6 +70,19 @@ pub enum BfvPreset { /// a standard BFV key-pair to encrypt secret shares. These are temporary keys used /// only during the key generation process. SecureDkg8192, + /// Secure threshold BFV parameters (degree 16384) - PRODUCTION READY + /// + /// Used for threshold encryption (GRECO) and threshold decryption operations with + /// multiplicative depth 2 (l-BFV support; depth 3 exceeds the runtime correctness + /// budget for these constants). These parameters define the threshold public key + /// that data providers use to encrypt inputs. + SecureThreshold16384, + /// Secure DKG parameters (degree 16384) - PRODUCTION READY + /// + /// Used during Phase 0-1 (BFV Key Setup and DKG) where each ciphernode generates + /// a standard BFV key-pair to encrypt secret shares. These are temporary keys used + /// only during the key generation process. + SecureDkg16384, } impl BfvPreset { @@ -72,6 +92,7 @@ impl BfvPreset { match value { 0 => Some(BfvPreset::InsecureThreshold512), 1 => Some(BfvPreset::SecureThreshold8192), + 2 => Some(BfvPreset::SecureThreshold16384), _ => None, } } @@ -289,16 +310,19 @@ impl BfvParamSet { } impl BfvPreset { - pub const ALL: [BfvPreset; 4] = [ + pub const ALL: [BfvPreset; 6] = [ BfvPreset::InsecureThreshold512, BfvPreset::InsecureDkg512, BfvPreset::SecureThreshold8192, BfvPreset::SecureDkg8192, + BfvPreset::SecureThreshold16384, + BfvPreset::SecureDkg16384, ]; - pub const PAIR_PRESETS: [BfvPreset; 2] = [ + pub const PAIR_PRESETS: [BfvPreset; 3] = [ BfvPreset::InsecureThreshold512, BfvPreset::SecureThreshold8192, + BfvPreset::SecureThreshold16384, ]; pub fn from_name(name: &str) -> Result { @@ -308,6 +332,8 @@ impl BfvPreset { "INSECURE_DKG_512" => Ok(Self::InsecureDkg512), "SECURE_THRESHOLD_8192" => Ok(Self::SecureThreshold8192), "SECURE_DKG_8192" => Ok(Self::SecureDkg8192), + "SECURE_THRESHOLD_16384" => Ok(Self::SecureThreshold16384), + "SECURE_DKG_16384" => Ok(Self::SecureDkg16384), _ => Err(PresetError::UnknownPreset(name.to_string())), } } @@ -318,6 +344,8 @@ impl BfvPreset { BfvPreset::InsecureDkg512 => "INSECURE_DKG_512", BfvPreset::SecureThreshold8192 => "SECURE_THRESHOLD_8192", BfvPreset::SecureDkg8192 => "SECURE_DKG_8192", + BfvPreset::SecureThreshold16384 => "SECURE_THRESHOLD_16384", + BfvPreset::SecureDkg16384 => "SECURE_DKG_16384", } } @@ -374,7 +402,10 @@ impl BfvPreset { match self { BfvPreset::InsecureThreshold512 => Some(BfvPreset::InsecureDkg512), BfvPreset::SecureThreshold8192 => Some(BfvPreset::SecureDkg8192), - BfvPreset::InsecureDkg512 | BfvPreset::SecureDkg8192 => None, + BfvPreset::SecureThreshold16384 => Some(BfvPreset::SecureDkg16384), + BfvPreset::InsecureDkg512 | BfvPreset::SecureDkg8192 | BfvPreset::SecureDkg16384 => { + None + } } } @@ -387,7 +418,10 @@ impl BfvPreset { match self { BfvPreset::InsecureDkg512 => Some(BfvPreset::InsecureThreshold512), BfvPreset::SecureDkg8192 => Some(BfvPreset::SecureThreshold8192), - BfvPreset::InsecureThreshold512 | BfvPreset::SecureThreshold8192 => None, + BfvPreset::SecureDkg16384 => Some(BfvPreset::SecureThreshold16384), + BfvPreset::InsecureThreshold512 + | BfvPreset::SecureThreshold8192 + | BfvPreset::SecureThreshold16384 => None, } } @@ -429,6 +463,24 @@ impl BfvPreset { parameter_type: ParameterType::DKG, security: SecurityTier::SECURE, }, + BfvPreset::SecureThreshold16384 => PresetMetadata { + name: self.name(), + degree: secure_16384::DEGREE, + num_moduli: secure_16384::threshold::MODULI.len(), + num_parties: secure_16384::NUM_PARTIES, + lambda: DEFAULT_SECURE_16384_LAMBDA, + parameter_type: ParameterType::THRESHOLD, + security: SecurityTier::SECURE, + }, + BfvPreset::SecureDkg16384 => PresetMetadata { + name: self.name(), + degree: secure_16384::DEGREE, + num_moduli: secure_16384::dkg::MODULI.len(), + num_parties: secure_16384::NUM_PARTIES, + lambda: DEFAULT_SECURE_16384_LAMBDA, + parameter_type: ParameterType::DKG, + security: SecurityTier::SECURE, + }, } } @@ -494,6 +546,15 @@ impl BfvPreset { b_chi: B_CHI, mult_depth: SECURE_8192_MULT_DEPTH, }), + BfvPreset::SecureThreshold16384 => Some(PresetSearchDefaults { + n: SECURE_16384_N, + k: SECURE_16384_K, + z: SECURE_16384_Z, + lambda: DEFAULT_SECURE_16384_LAMBDA as u32, + b: SECURE_16384_B, + b_chi: SECURE_16384_B_CHI, + mult_depth: SECURE_16384_MULT_DEPTH, + }), _ => None, } } @@ -530,6 +591,18 @@ impl From for BfvParamSet { moduli: secure_8192::dkg::MODULI, error1_variance: Some(secure_8192::dkg::ERROR1_VARIANCE), }, + BfvPreset::SecureThreshold16384 => BfvParamSet { + degree: secure_16384::DEGREE, + plaintext_modulus: secure_16384::threshold::PLAINTEXT_MODULUS, + moduli: secure_16384::threshold::MODULI, + error1_variance: Some(secure_16384::threshold::ERROR1_VARIANCE), + }, + BfvPreset::SecureDkg16384 => BfvParamSet { + degree: secure_16384::DEGREE, + plaintext_modulus: secure_16384::dkg::PLAINTEXT_MODULUS, + moduli: secure_16384::dkg::MODULI, + error1_variance: Some(secure_16384::dkg::ERROR1_VARIANCE), + }, } } } @@ -537,7 +610,7 @@ impl From for BfvParamSet { #[cfg(test)] mod tests { use super::*; - use crate::constants::{insecure_512, secure_8192}; + use crate::constants::{insecure_512, secure_16384, secure_16384_search_defaults, secure_8192}; #[test] fn from_name_accepts_all_presets() { @@ -603,6 +676,17 @@ mod tests { assert_eq!(dkg.degree(), secure_8192::DEGREE); assert_eq!(dkg.plaintext(), secure_8192::dkg::PLAINTEXT_MODULUS); assert_eq!(dkg.moduli(), secure_8192::dkg::MODULI); + + let (threshold, dkg) = BfvPreset::SecureThreshold16384.build_pair().unwrap(); + assert_eq!(threshold.degree(), secure_16384::DEGREE); + assert_eq!( + threshold.plaintext(), + secure_16384::threshold::PLAINTEXT_MODULUS + ); + assert_eq!(threshold.moduli(), secure_16384::threshold::MODULI); + assert_eq!(dkg.degree(), secure_16384::DEGREE); + assert_eq!(dkg.plaintext(), secure_16384::dkg::PLAINTEXT_MODULUS); + assert_eq!(dkg.moduli(), secure_16384::dkg::MODULI); } #[test] @@ -647,6 +731,12 @@ mod tests { assert_eq!(metadata.degree, secure_8192::DEGREE); assert_eq!(metadata.num_parties, secure_8192::NUM_PARTIES); assert_eq!(metadata.lambda, DEFAULT_SECURE_LAMBDA); + + let secure16384 = BfvPreset::SecureThreshold16384; + let metadata = secure16384.metadata(); + assert_eq!(metadata.degree, secure_16384::DEGREE); + assert_eq!(metadata.num_parties, secure_16384::NUM_PARTIES); + assert_eq!(metadata.lambda, DEFAULT_SECURE_16384_LAMBDA); } #[test] @@ -665,9 +755,17 @@ mod tests { assert_eq!(defaults.z, SEARCH_Z); assert_eq!(defaults.lambda, DEFAULT_SECURE_LAMBDA as u32); + let preset = BfvPreset::SecureThreshold16384; + let defaults = preset.search_defaults().unwrap(); + assert_eq!(defaults.n, secure_16384_search_defaults::SEARCH_N); + assert_eq!(defaults.k, secure_16384_search_defaults::SEARCH_K); + assert_eq!(defaults.z, secure_16384_search_defaults::SEARCH_Z); + assert_eq!(defaults.lambda, DEFAULT_SECURE_16384_LAMBDA as u32); + // DKG presets don't have search defaults assert!(BfvPreset::InsecureDkg512.search_defaults().is_none()); assert!(BfvPreset::SecureDkg8192.search_defaults().is_none()); + assert!(BfvPreset::SecureDkg16384.search_defaults().is_none()); } #[test] @@ -682,5 +780,10 @@ mod tests { "secure-8192" ); assert_eq!(BfvPreset::SecureDkg8192.artifacts_dir(), "secure-8192"); + assert_eq!( + BfvPreset::SecureThreshold16384.artifacts_dir(), + "secure-16384" + ); + assert_eq!(BfvPreset::SecureDkg16384.artifacts_dir(), "secure-16384"); } } diff --git a/crates/fhe-params/src/search/bfv.rs b/crates/fhe-params/src/search/bfv.rs index 6f0fcdbe1a..168b7476af 100644 --- a/crates/fhe-params/src/search/bfv.rs +++ b/crates/fhe-params/src/search/bfv.rs @@ -6,85 +6,100 @@ //! BFV Parameter Search Library //! -//! This library provides functionality to search for optimal BFV (Brakerski-Fan-Vercauteren) -//! parameters using NTT-friendly primes. It implements exact arithmetic for security analysis -//! and parameter validation. -use std::collections::BTreeMap; +//! Searches for BFV (Brakerski–Fan–Vercauteren) parameters over the fixed +//! ring dimension N = 16384 using NTT-friendly CRT primes. The first parameter +//! set models multiplicative depth (`z` is the total circuit depth) with a +//! relinearization-noise recursion (Proposition 20 of the White Paper), and the +//! second set satisfies the centered-RNS "large gap" rule `qi > 2·max_qi_first`. -use crate::search::constants::{D_POW2_MAX, K_MAX}; -use crate::search::errors::{BfvParamsResult, SearchError, ValidationError}; -use crate::search::prime::PrimeItem; -use crate::search::prime::{ - build_prime_items, build_prime_items_for_second, is_ntt_friendly, select_max_q_under_cap, -}; -use crate::search::utils::{approx_bits_from_log2, big_shift_pow2, log2_big, product}; use num_bigint::BigUint; -use num_traits::ToPrimitive; -use num_traits::Zero; -use std::collections::HashSet; +use num_traits::{One, ToPrimitive, Zero}; + +use crate::search::constants::{K_MAX, RING_DIM, TARGET_NUM_PRIMES}; +use crate::search::errors::{BfvParamsResult, SearchError, ValidationError}; +use crate::search::prime::{build_prime_items, build_prime_items_for_second}; +use crate::search::prime::{group_by_bits, has_duplicate_primes, PrimeItem}; +use crate::search::utils::{log2_big, product}; /// Fixed ring dimension used for both parameter sets. -const RING_DIM: u64 = 8192; +const D: u64 = RING_DIM; -/// First-set prime bit-size bounds. The 50-bit floor avoids the <0.2-bit -/// correctness margin of 49-bit primes; the 60-bit cap leaves 61/62-bit primes -/// for the second set (centered-RNS gap requirement). +/// Minimum prime bit-size for the first set. const FIRST_MIN_PRIME_BITS: u8 = 50; -const FIRST_MAX_PRIME_BITS: u8 = 60; -const FIRST_TARGET_NUM_PRIMES: usize = 3; -const FIRST_MAX_NUM_PRIMES: usize = 6; +/// Maximum prime bit-size for the first set. +const FIRST_MAX_PRIME_BITS: u8 = 62; -/// Second-set search bounds. +/// Minimum prime bit-size for the second set. const SECOND_MIN_PRIME_BITS: u8 = 50; +/// Maximum prime bit-size for the second set. const SECOND_MAX_PRIME_BITS: u8 = 62; +/// Target number of primes for the second set. const SECOND_TARGET_NUM_PRIMES: usize = 2; +/// Maximum number of primes to try for the second set. const SECOND_MAX_NUM_PRIMES: usize = 8; -/// Configuration for BFV parameter search +/// Configuration for BFV parameter search. #[derive(Debug, Clone)] pub struct BfvSearchConfig { - /// Number of parties n (e.g. ciphernodes) + /// Number of parties n (e.g. ciphernodes). pub n: u128, - /// Number of fresh ciphertext additions z (number of votes) - equal to k_plain_eff. + /// Number of fresh-ciphertext additions z summed before the multiplicative + /// circuit (e.g. number of votes). This scales the additive `B_C^0` term + /// and caps the plaintext space (`k_plain_eff = max(k, z)`). pub z: u128, /// Plaintext modulus k (plaintext space). pub k: u128, - /// Statistical Security parameter λ (negl(λ)=2^{-λ}) + /// Statistical security parameter λ (negl(λ) = 2^{-λ}). pub lambda: u32, - /// Bound B on the error distribution ψ used generate e1 when encrypting (e.g., 20 for CBD with σ≈3.2). + /// Total multiplicative circuit depth applied by the Prop. 20 recursion. + pub mult_depth: u32, + /// Bound B on the error distribution ψ (e.g. 20 for CBD with σ ≈ 3.2). pub b: u128, - /// Bound B_{\chi} on the distribution \chi used generate the secret key sk_i of each party i. + /// Bound B_χ on the secret-key distribution χ. pub b_chi: u128, - /// Min supported margin. + /// Minimum correctness margin in bits (log2(Δ) − log2(LHS)). pub min_margin: f64, - /// Verbose output showing detailed parameter search process + /// Verbose per-candidate logging. pub verbose: bool, } -/// Result of BFV parameter search +/// Result of BFV parameter search. #[derive(Debug, Clone)] pub struct BfvSearchResult { - /// Chosen degree and primes + /// Chosen degree and primes. pub d: u64, - pub k_plain_eff: u128, // = z + /// Effective plaintext space (max of user k and z). + pub k_plain_eff: u128, + /// Ciphertext modulus q. pub q_bfv: BigUint, + /// Selected CRT primes. pub selected_primes: Vec, + /// q mod k. pub rkq: u128, + /// Δ = ⌊q/k⌋. pub delta: BigUint, - /// Noise budgets + /// Noise budgets. pub benc_min: BigUint, pub b_fresh: BigUint, + /// B_C after `z` additions (before multiplication) for the first set. pub b_c: BigUint, + /// B_C after `mult_depth` levels of mult + relin (first set; = B_C if no mult). + pub b_c_final: BigUint, + /// 2^{λ+1}·d·B_C (first-set smudging bound). pub b_sm_min: BigUint, + /// Relinearization noise bound from Eq. (30) (zero if no mult). + pub b_relin: BigUint, + /// Total multiplicative depth ⌈log2(z)⌉ (first set), 0 for the second set. + pub mult_depth: u32, - /// Validation logs + /// Validation logs. pub lhs_log2: f64, pub rhs_log2: f64, } impl BfvSearchResult { - /// Extract prime values as u64 for BFV parameter construction + /// Extract prime values as u64 for BFV parameter construction. pub fn qi_values(&self) -> Vec { self.selected_primes .iter() @@ -93,268 +108,294 @@ impl BfvSearchResult { } } -/// Search for optimal BFV parameters that satisfy all security constraints. -/// -/// This function implements a search algorithm that: -/// 1. Iterates through polynomial degrees d (powers of 2) -/// 2. For each d, finds the maximum q under the Eq4 constraint -/// 3. Validates the candidate against Eq1 (noise bound) -/// 4. Refines the result by decreasing q to find the minimal valid parameters -/// -/// Returns the first feasible parameter set found, or an error if none exist. -/// -/// Note: Some resulting parameter sets from this search are hardcoded as presets -/// in the `presets.rs` file for production use (e.g., `BfvPreset::SecureThreshold8192`). -pub fn bfv_search(bfv_search_config: &BfvSearchConfig) -> BfvParamsResult { - // Quick checks on k := z - if bfv_search_config.z == 0 || bfv_search_config.z > K_MAX { +/// Search for the first BFV parameter set over the fixed ring dimension N=16384. +pub fn bfv_search(first: &BfvSearchConfig) -> BfvParamsResult { + if first.z == 0 || first.z > K_MAX { return Err(ValidationError::InvalidVotes { - z: bfv_search_config.z, - reason: "z must be positive and less than 2^25".to_string(), + z: first.z, + reason: "z must be positive and at most 1_000_000".to_string(), } .into()); } - let verbose = bfv_search_config.verbose; let prime_items = build_prime_items(); - let log2_b = (bfv_search_config.b as f64).log2(); + match bfv_search_first(first, &prime_items) { + Some(res) => Ok(res), + None => Err(SearchError::NoFeasibleParameters.into()), + } +} - // Buckets sorted DESCENDING within each bit-length (largest prime first), so - // taking the first `num_primes` of a bucket maximises q for that prime size. - let by_bits = group_by_bits_desc(&prime_items); +/// Search for the first BFV parameter set (fixed d = 16384, exactly 5 primes). +pub fn bfv_search_first( + config: &BfvSearchConfig, + prime_items: &[PrimeItem], +) -> Option { + if config.z == 0 { + eprintln!("ERROR: number of votes z must be positive."); + return None; + } - // Show available buckets (pool is independent of d, so print once). - if verbose { + let d = D; + let log2_b = (config.b as f64).log2(); + let log2_q_limit = log2_b + ((d as f64) - 75.0) / 37.5; + + let min_log2_q = calculate_min_q_bits(config, d); + + if config.verbose { + println!("\n[BFV-1st] Fixed d={d}"); + println!(" Security limit: log2(q) <= {log2_q_limit:.1}"); + println!(" Correctness requires: log2(q) >= {min_log2_q:.1}"); + } + + let by_bits = group_by_bits(prime_items, false); + + if config.verbose { for bb in FIRST_MIN_PRIME_BITS..=FIRST_MAX_PRIME_BITS { if let Some(bucket) = by_bits.get(&bb) { let max_log2 = bucket.first().map(|p| p.log2).unwrap_or(0.0); let min_log2 = bucket.last().map(|p| p.log2).unwrap_or(0.0); println!( - " {}-bit bucket: {} primes, log2 range [{:.2}, {:.2}]", - bb, - bucket.len(), - min_log2, - max_log2 + " {bb}-bit bucket: {} primes, log2 range [{min_log2:.2}, {max_log2:.2}]", + bucket.len() ); } } } - // Search increasing ring dimensions: start at RING_DIM and only step up when - // no q satisfies both correctness (lower) and Eq4 security (upper) bounds at - // the current d. A larger d raises the security limit far faster than the - // correctness requirement, so high-λ requests resolve at a bigger ring. - let mut d = RING_DIM; - while d <= D_POW2_MAX { - // Keep only primes that are NTT-friendly for this ring dimension - // (p ≡ 1 mod 2d). At d == RING_DIM every table entry already qualifies, - // but doubling d below can exclude primes (e.g. 60-bit) that only - // satisfy the smaller modulus. - let by_bits_d: BTreeMap> = by_bits - .iter() - .filter_map(|(&bb, bucket)| { - let filtered: Vec = bucket - .iter() - .filter(|p| is_ntt_friendly(&p.value, d)) - .cloned() - .collect(); - (!filtered.is_empty()).then_some((bb, filtered)) - }) - .collect(); - - // Minimum log2(q) for correctness (Eq1); exact margin check is in finalize. - let min_log2_q = calculate_min_q_bits(bfv_search_config, d); - // Eq4 security upper bound: log2(q) <= log2(B) + (d-75)/37.5. - let log2_q_limit = log2_b + ((d as f64) - 75.0) / 37.5; - - if verbose { - println!("\n[BFV-1st] d={d}"); - println!(" Security limit: log2(q) <= {log2_q_limit:.1}"); - println!(" Correctness requires: log2(q) >= {min_log2_q:.1}"); + for num_primes in TARGET_NUM_PRIMES..=TARGET_NUM_PRIMES { + if config.verbose { + println!("\n === Trying {num_primes} primes ==="); } - // Try the fewest primes first, then the smallest prime bit-size that - // meets the correctness bound. This mirrors the reference bucket scan. - for num_primes in FIRST_TARGET_NUM_PRIMES..=FIRST_MAX_NUM_PRIMES { - if verbose { - println!("\n === Trying {num_primes} primes ==="); + for bb in FIRST_MIN_PRIME_BITS..=FIRST_MAX_PRIME_BITS { + let bucket = match by_bits.get(&bb) { + Some(b) => b, + None => continue, + }; + + if bucket.len() < num_primes { + if config.verbose { + println!( + " {num_primes} × {bb}-bit: only {} primes available (need {num_primes})", + bucket.len() + ); + } + continue; } - for bb in FIRST_MIN_PRIME_BITS..=FIRST_MAX_PRIME_BITS { - let bucket = match by_bits_d.get(&bb) { - Some(b) => b, - None => continue, - }; - - if bucket.len() < num_primes { - if verbose { - println!( - " {} × {}-bit: only {} primes available (need {})", - num_primes, - bb, - bucket.len(), - num_primes - ); - } - continue; + let sel: Vec = bucket.iter().take(num_primes).cloned().collect(); + + let q = product(sel.iter().map(|pi| pi.value.clone())); + let q_bits = log2_big(&q); + let max_qi_log2 = sel.iter().map(|p| p.log2).fold(0.0_f64, f64::max); + + if q_bits < min_log2_q { + if config.verbose { + println!( + " {num_primes} × {bb}-bit: log2(q)={q_bits:.2} < {min_log2_q:.1} needed, skipping" + ); } + continue; + } - // Slide a window of `num_primes` over the descending bucket. The - // largest window is tried first; if it exceeds the security cap, - // smaller windows in the same bucket may still fit - // [min_log2_q, log2_q_limit]. - for start in 0..=(bucket.len() - num_primes) { - let sel: Vec = bucket[start..start + num_primes].to_vec(); - let q = product(sel.iter().map(|pi| pi.value.clone())); - let q_bits = log2_big(&q); - let max_qi_log2 = sel.iter().map(|p| p.log2).fold(0.0_f64, f64::max); - - // Because the bucket is descending, later windows only get smaller. - if q_bits < min_log2_q { - if verbose { - println!( - " {} × {}-bit: log2(q)={:.2} < {:.1} needed, abandoning bucket", - num_primes, bb, q_bits, min_log2_q - ); - } - break; - } - - if q_bits > log2_q_limit { - if verbose { - println!( - " {} × {}-bit: log2(q)={:.2} > {:.1} security limit, trying smaller primes", - num_primes, bb, q_bits, log2_q_limit - ); - } - continue; - } - - if let Some(res) = finalize_bfv_candidate(bfv_search_config, d, sel) { - if verbose { - println!( - "\n✓ Found first set: {} × {}-bit primes, d={}, log2(q)={:.2}, max_qi={:.2} bits", - num_primes, bb, d, q_bits, max_qi_log2 - ); - } - return Ok(res); - } else if verbose { - println!( - " {} × {}-bit: log2(q)={:.2} ❌ fails correctness or margin < {:.1} bits", - num_primes, bb, q_bits, bfv_search_config.min_margin - ); - } + if q_bits > log2_q_limit { + if config.verbose { + println!( + " {num_primes} × {bb}-bit: log2(q)={q_bits:.2} > {log2_q_limit:.1} security limit, skipping" + ); } + continue; } - } - if verbose { - println!("\n no feasible set at d={d}; increasing ring dimension…"); + if let Some(res) = finalize_first_param(config, d, sel.clone(), config.verbose) { + if config.verbose { + println!( + "\n✓ Found first set: {num_primes} × {bb}-bit primes, log2(q)={q_bits:.2}, max_qi={max_qi_log2:.2}" + ); + } + return Some(res); + } else if config.verbose { + println!( + " {num_primes} × {bb}-bit: log2(q)={q_bits:.2} ❌ fails correctness or margin < {:.1} bits", + config.min_margin + ); + } } - d <<= 1; } - if verbose { - eprintln!("\nERROR: No valid first parameter set found"); - } - Err(SearchError::NoFeasibleParameters.into()) + eprintln!("\nERROR: No valid first parameter set found"); + None } -/// Minimum log2(q) needed for correctness (Eq1), ignoring r_k(q). -/// -/// finalize_bfv_candidate performs the exact check (including r_k(q) and the -/// margin); this is only used to prune prime selections that are too small. -fn calculate_min_q_bits(bfv_search_config: &BfvSearchConfig, d: u64) -> f64 { - let two_pow_lambda = big_shift_pow2(bfv_search_config.lambda); +/// Total multiplicative depth: the search models the circuit depth directly. +fn total_mult_depth(config: &BfvSearchConfig) -> u32 { + config.mult_depth +} - let benc_min = (BigUint::from(2u32) - * BigUint::from(d) - * BigUint::from(bfv_search_config.n) - * BigUint::from(bfv_search_config.b) - * BigUint::from(bfv_search_config.b_chi)) - * &two_pow_lambda; +/// Relinearization noise bound from Eq. (30): +/// `||e_relin|| ≤ N·l·||sk||·B_g·B + 2·N²·l²·||sk||²·B_g·B` +/// where `||sk||_∞ = n_sk_norm = n · B_χ`. +fn compute_b_relin(d: u64, l: u64, n_sk_norm: &BigUint, b_g: &BigUint, b: u128) -> BigUint { + let d_big = BigUint::from(d); + let l_big = BigUint::from(l); + let b_big = BigUint::from(b); + let term1 = &d_big * &l_big * n_sk_norm * b_g * &b_big; + let term2 = BigUint::from(2u32) + * &d_big + * &d_big + * &l_big + * &l_big + * n_sk_norm + * n_sk_norm + * b_g + * &b_big; + term1 + term2 +} - let term_d_b_b_chi_n = BigUint::from(d) - * BigUint::from(bfv_search_config.b) - * BigUint::from(bfv_search_config.b_chi) - * BigUint::from(bfv_search_config.n); - let b_fresh = &benc_min + &term_d_b_b_chi_n + &term_d_b_b_chi_n; +/// Apply the Proposition 20 noise recursion for `depth` levels of BFV mult+relin: +/// `B_C^(i+1) = k · N² · ||sk|| · 2 · B_C^(i) + B_relin`. +/// Returns (b_c_final, b_relin); b_relin is zero when depth == 0. +#[allow(clippy::too_many_arguments)] +fn apply_mult_recursion( + b_c_init: &BigUint, + depth: u32, + k: u128, + d: u64, + l: u64, + n_sk_norm: &BigUint, + b_g: &BigUint, + b: u128, +) -> (BigUint, BigUint) { + if depth == 0 { + return (b_c_init.clone(), BigUint::zero()); + } + let b_relin = compute_b_relin(d, l, n_sk_norm, b_g, b); + let k_big = BigUint::from(k); + let d_big = BigUint::from(d); + // Prop. 20 first-term coefficient: k · N² · ||sk|| · 2. + let coeff = BigUint::from(2u32) * &k_big * &d_big * &d_big * n_sk_norm; + let mut b_c = b_c_init.clone(); + for _ in 0..depth { + b_c = &coeff * &b_c + &b_relin; + } + (b_c, b_relin) +} - let b_c = BigUint::from(bfv_search_config.z) * &b_fresh; - let b_sm_min = &b_c * &two_pow_lambda; +/// Minimum log2(q) needed for correctness (conservative pruning lower bound). +fn calculate_min_q_bits(config: &BfvSearchConfig, d: u64) -> f64 { + let two_pow_lambda = BigUint::one() << config.lambda; - let lhs = (&b_c + BigUint::from(bfv_search_config.n) * &b_sm_min) << 1; + let benc_min = BigUint::from(2u32) + * BigUint::from(d) + * BigUint::from(config.n) + * BigUint::from(config.b) + * BigUint::from(config.b_chi) + * &two_pow_lambda; + + // d·||e^(ek)||·B_χ + d·B·||sk||: e^(ek) and sk are each n-term sums (DKG Eq. 3), + // so both terms scale with n. + let term_dn_bb_chi = BigUint::from(d) + * BigUint::from(config.b) + * BigUint::from(config.b_chi) + * BigUint::from(config.n); + let b_fresh = &benc_min + &term_dn_bb_chi + &term_dn_bb_chi; + + let b_c_agg = BigUint::from(config.z) * &b_fresh; + + let depth = total_mult_depth(config); + let n_sk_norm = BigUint::from(config.n * config.b_chi); + // Conservative B_g underestimate (2^FIRST_MIN_PRIME_BITS) avoids pruning valid candidates. + let b_g_conservative = BigUint::one() << FIRST_MIN_PRIME_BITS; + let k_eff = config.k.max(config.z); + let (b_c_final, _) = apply_mult_recursion( + &b_c_agg, + depth, + k_eff, + d, + TARGET_NUM_PRIMES as u64, + &n_sk_norm, + &b_g_conservative, + config.b, + ); + + let b_sm_min = &b_c_final * (&two_pow_lambda << 1u32) * BigUint::from(d); + let lhs = (&b_c_final + BigUint::from(config.n) * &b_sm_min) << 1; let lhs_log2 = log2_big(&lhs); - let log2_k = (bfv_search_config.k.max(bfv_search_config.z) as f64).log2(); + let log2_k = (k_eff as f64).log2(); lhs_log2 + log2_k } -/// Group primes by bit-length, sorting each bucket descending by value. -fn group_by_bits_desc(prime_items: &[PrimeItem]) -> BTreeMap> { - let mut by_bits: BTreeMap> = BTreeMap::new(); - for p in prime_items { - by_bits.entry(p.bitlen).or_default().push(p.clone()); - } - for v in by_bits.values_mut() { - v.sort_by(|a, b| b.value.cmp(&a.value)); - } - by_bits -} - -/// Validate a candidate parameter set and compute all noise bounds. -/// -/// Computes noise budgets (B_Enc, B_fresh, B_C, B_sm) and checks if Eq1 is satisfied: -/// 2*(B_C + n*B_sm) < Δ -/// -/// Returns None if validation fails, otherwise returns the complete result. -pub fn finalize_bfv_candidate( - bfv_search_config: &BfvSearchConfig, +/// Finalize and verify the first parameter set. +pub fn finalize_first_param( + config: &BfvSearchConfig, d: u64, chosen: Vec, + verbose: bool, ) -> Option { - let q_bfv = product(chosen.iter().map(|pi| pi.value.clone())); - - // Compute plaintext space: max of user-defined k and z - let k_plain_eff: u128 = bfv_search_config.k.max(bfv_search_config.z); + if has_duplicate_primes(&chosen) { + return None; + } - // r_k(q) = q mod k + let q_bfv = product(chosen.iter().map(|pi| pi.value.clone())); + let k_plain_eff = config.k.max(config.z); let k_big = BigUint::from(k_plain_eff); - let rkq_big = &q_bfv % &k_big; - let rkq: u128 = rkq_big.to_u128().unwrap_or(0); - // Δ = floor(q / k) + let rkq: u128 = (&q_bfv % &k_big).to_u128().unwrap_or(0); let delta = &q_bfv / &k_big; - // Eq2: 2 d n B B_chi ≤ B_Enc * 2^{-λ} => B_Enc ≥ (2 d n B B_chi) * 2^{λ} - let two_pow_lambda = big_shift_pow2(bfv_search_config.lambda); - let benc_min = (BigUint::from(2u32) + let two_pow_lambda = BigUint::one() << config.lambda; + + let benc_min = BigUint::from(2u32) * BigUint::from(d) - * BigUint::from(bfv_search_config.n) - * BigUint::from(bfv_search_config.b) - * BigUint::from(bfv_search_config.b_chi)) + * BigUint::from(config.n) + * BigUint::from(config.b) + * BigUint::from(config.b_chi) * &two_pow_lambda; - // B_fresh ≤ B_Enc + d B B_chi n+ d B B_chi n - let term_d_b_b_chi_n = BigUint::from(d) - * BigUint::from(bfv_search_config.b) - * BigUint::from(bfv_search_config.b_chi) - * BigUint::from(bfv_search_config.n); - let b_fresh = &benc_min + &term_d_b_b_chi_n + &term_d_b_b_chi_n; + let term_dn_bb_chi = BigUint::from(d) + * BigUint::from(config.b) + * BigUint::from(config.b_chi) + * BigUint::from(config.n); + let b_fresh = &benc_min + &term_dn_bb_chi + &term_dn_bb_chi; - // B_C = z (B_fresh + r_k(q)) - let b_c = BigUint::from(bfv_search_config.z) * (&b_fresh + BigUint::from(rkq)); + let b_c = BigUint::from(config.z) * (&b_fresh + BigUint::from(rkq)); - // Eq3: B_C ≤ B_sm * 2^{-λ} => B_sm ≥ B_C * 2^{λ} - let b_sm_min = &b_c * &two_pow_lambda; + // Multiplication noise: B_g = max prime (RNS gadget), l = number of primes. + let depth = total_mult_depth(config); + let l = chosen.len() as u64; + let b_g = chosen + .iter() + .map(|p| p.value.clone()) + .max() + .unwrap_or_else(BigUint::zero); + let n_sk_norm = BigUint::from(config.n * config.b_chi); + let (b_c_final, b_relin) = + apply_mult_recursion(&b_c, depth, k_plain_eff, d, l, &n_sk_norm, &b_g, config.b); - // Eq1: 2*(B_C + n*B_sm) < Δ - let lhs = (&b_c + BigUint::from(bfv_search_config.n) * &b_sm_min) << 1; + let b_sm_min = &b_c_final * (&two_pow_lambda << 1u32) * BigUint::from(d); + let lhs = (&b_c_final + BigUint::from(config.n) * &b_sm_min) << 1; let lhs_log2 = log2_big(&lhs); let rhs_log2 = log2_big(&delta); + let margin = rhs_log2 - lhs_log2; + let ok = lhs < delta && margin >= config.min_margin; + + if verbose { + if depth > 0 { + println!( + " mult_depth={depth}, log2(B_relin)={:.2}, log2(B_C_final)={:.2}", + log2_big(&b_relin), + log2_big(&b_c_final) + ); + } + println!( + " Detailed check: log2(LHS)={lhs_log2:.2}, log2(Δ)={rhs_log2:.2}, margin={margin:.2} bits => {}", + if ok { "PASS" } else { "FAIL" } + ); + } - if lhs >= delta || margin < bfv_search_config.min_margin { + if !ok { return None; } @@ -367,245 +408,82 @@ pub fn finalize_bfv_candidate( delta, benc_min, b_fresh, - b_c, + b_c: b_c.clone(), + b_c_final, b_sm_min, + b_relin, + mult_depth: depth, lhs_log2, rhs_log2, }) } -/// Refine parameters by decreasing q in 2-bit steps from an initial feasible set. -/// -/// Starting from a valid parameter set, this function decreases the bit size of q -/// by 2 bits per iteration, keeping the last passing configuration before the first failure. -/// This finds the minimal valid q for the given degree d. -pub fn refine_from_initial( - bfv_search_config: &BfvSearchConfig, - d: u64, - prime_items: &[PrimeItem], - initial_sel: Vec, -) -> Option { - // Determine initial bits and then decrease by 2 bits per step. - let initial_q = product(initial_sel.iter().map(|pi| pi.value.clone())); - let mut current_bits = approx_bits_from_log2(log2_big(&initial_q)); - - // Start with the initial feasible result - let mut last_passing = finalize_bfv_candidate(bfv_search_config, d, initial_sel.clone())?; - - // Walk down in steps of 2 bits, keeping the last passing set before the first failure - while current_bits > 40 { - let target_bits = current_bits.saturating_sub(2); - if let Some(res) = - construct_qi_for_target_bits(bfv_search_config, d, prime_items, target_bits) - { - // Update last_passing to this new passing result - last_passing = res; - current_bits = target_bits; - continue; - } else { - // Stop at the first failure; return the last passing result - break; - } - } - - Some(last_passing) -} - -/// Construct a CRT prime selection targeting a specific bit size for q. +/// Search for the second BFV parameter set. /// -/// Uses a greedy packing strategy: divides target bits by number of primes needed, -/// then tries combinations of floor/ceil bit-length buckets to get closest to target. -/// Validates the selection and returns a result if it passes Eq1. -pub fn construct_qi_for_target_bits( - bfv_search_config: &BfvSearchConfig, - d: u64, - prime_items: &[PrimeItem], - target_bits: u64, -) -> Option { - // Build buckets sorted ascending (smallest first) to allow tight packing - let mut by_bits_small: BTreeMap> = BTreeMap::new(); - let mut by_bits_large: BTreeMap> = BTreeMap::new(); - for p in prime_items.iter() { - by_bits_small.entry(p.bitlen).or_default().push(p.clone()); - by_bits_large.entry(p.bitlen).or_default().push(p.clone()); - } - for v in by_bits_small.values_mut() { - v.sort_by(|a, b| a.value.cmp(&b.value)); - } - for v in by_bits_large.values_mut() { - v.sort_by(|a, b| b.value.cmp(&a.value)); - } - - let target_f = target_bits as f64; - - // Compute the actual maximum bit length available in the prime buckets - let max_bit = by_bits_small.keys().max().cloned().unwrap_or(61); - - // Fewest primes first: start from minimal s needed to reach target with max_bit primes - let s = target_bits.div_ceil(max_bit as u64).max(2) as usize; - - let r_float = target_f / (s as f64); - let floor_r = r_float.floor().clamp(40.0, max_bit as f64) as u8; - let ceil_r = r_float.ceil().clamp(40.0, max_bit as f64) as u8; - - // Build candidate selections mixing floor/ceil buckets; choose best by closeness once - let mut tried: Vec> = Vec::new(); - for k in 0..=s { - let take_ceil = k; - let take_floor = s - k; - let mut sel: Vec = Vec::new(); - if take_floor > 0 { - if let Some(b) = by_bits_small.get(&floor_r) { - if b.len() < take_floor { - continue; - } - sel.extend(b.iter().take(take_floor).cloned()); - } else { - continue; - } - } - if take_ceil > 0 { - if let Some(b) = by_bits_small.get(&ceil_r) { - if b.len() < take_ceil { - continue; - } - sel.extend(b.iter().take(take_ceil).cloned()); - } else { - continue; - } - } - if sel.len() == s { - tried.push(sel); - } - } - // Also consider pure buckets - if let Some(b) = by_bits_large.get(&floor_r) { - if b.len() >= s { - tried.push(b.iter().take(s).cloned().collect()); - } - } - if let Some(b) = by_bits_large.get(&ceil_r) { - if b.len() >= s { - tried.push(b.iter().take(s).cloned().collect()); - } - } - - // Pick selection closest to target bits and test exactly once - let mut best: Option<(f64, Vec)> = None; - for sel in tried { - let q = product(sel.iter().map(|pi| pi.value.clone())); - let qbits = log2_big(&q); - let diff = (qbits - target_f).abs(); - if let Some((best_diff, _)) = &best { - if diff < *best_diff { - best = Some((diff, sel)); - } - } else { - best = Some((diff, sel)); - } - } - if let Some((_, sel)) = best { - // During decreasing, use plaintext from qi (not max with user k) - return finalize_bfv_candidate(bfv_search_config, d, sel.clone()); - } - - None -} - -/// Search for a second BFV parameter set with plaintext space derived from the first set. -/// -/// The plaintext modulus k is set to the actual maximum qi value of the first set. -/// fhe.rs centered RNS requires every second-set qi > 2*k (the "large gap" rule), -/// and second-set primes must be disjoint from the first set. The smallest valid -/// primes (fewest and smallest) that satisfy correctness are chosen. Uses a -/// separate prime pool that includes 62-bit primes. +/// k_second = max(qi_first); the centered-RNS rule requires every second-set +/// prime `qi > 2·max_qi_first` (large gap), and second-set primes must be +/// disjoint from the first set. The smallest valid primes are chosen. pub fn bfv_search_second_param( - bfv_search_config: &BfvSearchConfig, + config: &BfvSearchConfig, first: &BfvSearchResult, ) -> Option { let d = first.d; - // Plaintext space for second set: k = max qi of first set (actual value). let max_qi_first: BigUint = first .selected_primes .iter() - .map(|pi| pi.value.clone()) + .map(|pi| &pi.value) .max() - .expect("first set has at least one prime"); - let k_second: u128 = max_qi_first.to_u128().unwrap_or(u128::MAX); + .unwrap() + .clone(); + let max_qi_bits = log2_big(&max_qi_first); - let verbose = bfv_search_config.verbose; + let k_second: u128 = max_qi_first.to_u128().unwrap_or(u128::MAX); - // Centered-RNS gap rule: qi > 2*k. + // fhe.rs centered RNS requires qi_second > 2·max(qi_first) to avoid + // sign-flip errors in the centered-representation scaler. let min_qi_second = &max_qi_first << 1; + let min_qi_log2 = log2_big(&min_qi_second); - // Eq4 security upper bound: log2(q) <= log2(B) + (d-75)/37.5. - let log2_b = (bfv_search_config.b as f64).log2(); + let log2_b = (config.b as f64).log2(); let log2_q_limit = log2_b + ((d as f64) - 75.0) / 37.5; - if verbose { - println!( - "\n[BFV-2nd] Fixed d={d}, k = max_qi_first = {k_second} ({:.2} bits)", - log2_big(&max_qi_first) - ); - println!( - " Minimum qi required: {:.2} bits (fhe.rs centered RNS: qi > 2*k)", - log2_big(&min_qi_second) - ); + if config.verbose { + println!("\n[BFV-2nd] Fixed d={d}, k = max_qi_first = {k_second} ({max_qi_bits:.2} bits)"); + println!(" Minimum qi required: {min_qi_log2:.2} bits (fhe.rs centered RNS: qi > 2*k)"); println!(" Security limit: log2(q) <= {log2_q_limit:.1}"); } let prime_items = build_prime_items_for_second(); + let by_bits = group_by_bits(&prime_items, true); - // Exclude primes already used by the first set. - let first_set_primes: HashSet = first + let first_set_primes: std::collections::HashSet = first .selected_primes .iter() .map(|p| p.hex.clone()) .collect(); - // Buckets sorted ASCENDING within each bit-length (smallest prime first), so - // taking the first valid `num_primes` minimises prime size. Only primes that - // are NTT-friendly for this ring dimension (p ≡ 1 mod 2d) are eligible: at - // d == RING_DIM every entry qualifies, but a larger d (from bfv_search) - // excludes some 62-bit primes that only satisfy the smaller modulus. - let mut by_bits: BTreeMap> = BTreeMap::new(); - for p in &prime_items { - if !is_ntt_friendly(&p.value, d) { - continue; - } - by_bits.entry(p.bitlen).or_default().push(p.clone()); - } - for v in by_bits.values_mut() { - v.sort_by(|a, b| a.value.cmp(&b.value)); - } - - // Show available primes per bit-length (gap rule applied, first-set excluded). - if verbose { + if config.verbose { for bb in SECOND_MIN_PRIME_BITS..=SECOND_MAX_PRIME_BITS { if let Some(bucket) = by_bits.get(&bb) { - let available: Vec<&PrimeItem> = bucket + let available: Vec<_> = bucket .iter() - .filter(|p| p.value > min_qi_second && !first_set_primes.contains(&p.hex)) + .filter(|p| !first_set_primes.contains(&p.hex) && p.value > min_qi_second) .collect(); if !available.is_empty() { let min_log2 = available.first().map(|p| p.log2).unwrap_or(0.0); let max_log2 = available.last().map(|p| p.log2).unwrap_or(0.0); println!( - " {}-bit bucket: {} primes with qi > 2k, log2 range [{:.2}, {:.2}]", - bb, - available.len(), - min_log2, - max_log2 + " {bb}-bit bucket: {} primes with qi > 2k, log2 range [{min_log2:.2}, {max_log2:.2}]", + available.len() ); } } } } - // Fewest primes first, then smallest prime bit-size. for num_primes in SECOND_TARGET_NUM_PRIMES..=SECOND_MAX_NUM_PRIMES { - if verbose { + if config.verbose { println!("\n === Trying {num_primes} primes ==="); } @@ -615,260 +493,112 @@ pub fn bfv_search_second_param( None => continue, }; - // Valid primes: satisfy the gap rule and not used by the first set. - let valid: Vec = bucket + let valid_primes: Vec<&PrimeItem> = bucket .iter() .filter(|pi| pi.value > min_qi_second && !first_set_primes.contains(&pi.hex)) - .cloned() .collect(); - if valid.len() < num_primes { - if verbose { + if valid_primes.len() < num_primes { + if config.verbose { println!( - " {} × {}-bit: only {} valid primes with large gap (need {})", - num_primes, - bb, - valid.len(), - num_primes + " {num_primes} × {bb}-bit: only {} valid primes with large gap (need {num_primes})", + valid_primes.len() ); } continue; } - // Slide a window of `num_primes` over the ascending valid primes, - // starting from the smallest (to minimise prime size). If the - // smallest window fails the correctness/margin check, larger primes - // in the same bucket give a larger Δ and may still pass with the - // same CRT count, so keep trying before abandoning the bucket. - for start in 0..=(valid.len() - num_primes) { - let sel: Vec = valid[start..start + num_primes].to_vec(); - let q = product(sel.iter().map(|pi| pi.value.clone())); - let q_bits = log2_big(&q); - let min_selected = sel.iter().map(|p| &p.value).min().unwrap(); - let gap_bits = log2_big(&(min_selected - &max_qi_first)); - - if verbose { - println!( - " {} × {}-bit: log2(q) = {:.2}, min gap = 2^{:.1}", - num_primes, bb, q_bits, gap_bits - ); - } - - // Eq4 security upper bound: q grows monotonically with `start`, - // so once it exceeds the security limit no later window can pass. - if q_bits > log2_q_limit { - if verbose { - println!( - " log2(q)={:.2} > {:.1} security limit, abandoning bucket", - q_bits, log2_q_limit - ); - } - break; - } - - if let Some(res) = finalize_second_param(bfv_search_config, d, sel, k_second) { - if verbose { - println!( - "\n✓ Found second set: {} × {}-bit, log2(q)={:.2}, gap=2^{:.1}", - num_primes, bb, q_bits, gap_bits - ); - } - return Some(res); - } else if verbose { - println!(" ❌ Fails correctness check"); - } - } - } - } - - if verbose { - eprintln!("\nWARNING: No valid second parameter set found"); - } - None -} - -/// Refine second parameter set at a fixed degree d by decreasing q. -/// -/// Collects all passing candidates as q decreases, then selects the one with -/// the fewest primes (minimizing CRT overhead). -pub fn refine_second_param_at_d( - bfv_search_config: &BfvSearchConfig, - d: u64, - prime_items: &[PrimeItem], - log2_q_limit: f64, - k_plain: u128, -) -> Option { - // Start from largest q under cap at this d and decrease by 2 bits, collecting all passing - let initial_sel = select_max_q_under_cap(log2_q_limit, prime_items); - if initial_sel.is_empty() { - return None; - } - - let initial_q = product(initial_sel.iter().map(|pi| pi.value.clone())); - let mut current_bits = approx_bits_from_log2(log2_big(&initial_q)); - let mut all_passing: Vec = Vec::new(); - - // Try the initial selection - if let Some(res) = finalize_second_param(bfv_search_config, d, initial_sel.clone(), k_plain) { - all_passing.push(res); - } - - // Decrease by 2 bits at a time, continue even if some fail (don't stop at first failure) - while current_bits > 40 { - let target_bits = current_bits.saturating_sub(2); - if let Some(res) = - construct_qi_second_param(bfv_search_config, d, prime_items, target_bits, k_plain) - { - all_passing.push(res); - } - // Continue decreasing regardless of whether this target passed or failed - current_bits = target_bits; - } + let sel: Vec = valid_primes + .iter() + .take(num_primes) + .map(|pi| (*pi).clone()) + .collect(); - // Pick the one with fewest qi's among all passing at this d - if all_passing.is_empty() { - return None; - } - all_passing.sort_by(|a, b| { - a.selected_primes.len().cmp(&b.selected_primes.len()).then( - log2_big(&a.q_bfv) - .partial_cmp(&log2_big(&b.q_bfv)) - .unwrap_or(std::cmp::Ordering::Equal), - ) - }); - Some(all_passing.into_iter().next().unwrap()) -} + let q = product(sel.iter().map(|pi| pi.value.clone())); + let q_bits = log2_big(&q); -/// Construct CRT prime selection for second parameter set targeting specific bit size. -/// -/// Similar to `construct_qi_for_target_bits` but uses 62-bit primes and validates -/// that all qi are more than one bit larger than k_plain. -pub fn construct_qi_second_param( - bfv_search_config: &BfvSearchConfig, - d: u64, - prime_items: &[PrimeItem], - target_bits: u64, - k_plain: u128, -) -> Option { - let mut by_bits_small: BTreeMap> = BTreeMap::new(); - let mut by_bits_large: BTreeMap> = BTreeMap::new(); - for p in prime_items.iter() { - by_bits_small.entry(p.bitlen).or_default().push(p.clone()); - by_bits_large.entry(p.bitlen).or_default().push(p.clone()); - } - for v in by_bits_small.values_mut() { - v.sort_by(|a, b| a.value.cmp(&b.value)); - } - for v in by_bits_large.values_mut() { - v.sort_by(|a, b| b.value.cmp(&a.value)); - } + let min_selected = sel.iter().map(|p| &p.value).min().unwrap(); + let gap = min_selected - &max_qi_first; + let gap_bits = log2_big(&gap); - let target_f = target_bits as f64; - let s = target_bits.div_ceil(62).max(2) as usize; - let r_float = target_f / (s as f64); - let floor_r = r_float.floor().clamp(40.0, 62.0) as u8; - let ceil_r = r_float.ceil().clamp(40.0, 62.0) as u8; - - let mut tried: Vec> = Vec::new(); - for k in 0..=s { - let take_ceil = k; - let take_floor = s - k; - let mut sel: Vec = Vec::new(); - if take_floor > 0 { - if let Some(b) = by_bits_small.get(&floor_r) { - if b.len() < take_floor { - continue; - } - sel.extend(b.iter().take(take_floor).cloned()); - } else { - continue; + if config.verbose { + println!( + " {num_primes} × {bb}-bit: log2(q) = {q_bits:.2}, min gap = 2^{gap_bits:.1}" + ); } - } - if take_ceil > 0 { - if let Some(b) = by_bits_small.get(&ceil_r) { - if b.len() < take_ceil { - continue; + + if let Some(res) = finalize_second_param(config, d, sel, k_second, config.verbose) { + if config.verbose { + println!( + "\n✓ Found second set: {num_primes} × {bb}-bit, log2(q)={q_bits:.2}, gap=2^{gap_bits:.1}" + ); } - sel.extend(b.iter().take(take_ceil).cloned()); - } else { - continue; + return Some(res); + } else if config.verbose { + println!(" ❌ Fails correctness check"); } } - if sel.len() == s { - tried.push(sel); - } - } - if let Some(b) = by_bits_large.get(&floor_r) { - if b.len() >= s { - tried.push(b.iter().take(s).cloned().collect()); - } - } - if let Some(b) = by_bits_large.get(&ceil_r) { - if b.len() >= s { - tried.push(b.iter().take(s).cloned().collect()); - } } - // Prefer the smallest qualifying primes (minimise prime size), matching the - // old behaviour of taking the smallest valid primes in the smallest bucket. - let mut best: Option<(f64, Vec)> = None; - for sel in tried { - let q = product(sel.iter().map(|pi| pi.value.clone())); - let qbits = log2_big(&q); - if let Some((best_qbits, _)) = &best { - if qbits < *best_qbits { - best = Some((qbits, sel)); - } - } else { - best = Some((qbits, sel)); - } - } - if let Some((_, sel)) = best { - return finalize_second_param(bfv_search_config, d, sel.clone(), k_plain); - } + eprintln!("\nWARNING: No valid second parameter set found"); + eprintln!(" Consider: first set used primes with max = {max_qi_bits:.2} bits"); + eprintln!( + " Second set needs primes > 2*{} but max available is 62 bits", + k_second + ); None } -/// Validate second parameter set with simplified noise bounds. -/// -/// For the second set, uses B_Enc = B (simpler bound) and checks 2*B_C < Δ. -/// Also validates that all qi are more than one bit larger than k_plain. +/// Finalize and verify the second parameter set with simplified noise bounds. pub fn finalize_second_param( - bfv_search_config: &BfvSearchConfig, + config: &BfvSearchConfig, d: u64, chosen: Vec, k_plain: u128, + verbose: bool, ) -> Option { - // fhe.rs centered RNS requires qi > 2*k to avoid sign-flip errors in the - // centered representation scaler (the "large gap" rule). - let k_big = BigUint::from(k_plain); - let min_qi_threshold = &k_big << 1; // 2 * k + if has_duplicate_primes(&chosen) { + return None; + } + let k_second_big = BigUint::from(k_plain); + + // Centered-RNS gap rule: every second-set prime must exceed 2·k. + let min_qi_threshold = &k_second_big << 1; for pi in &chosen { if pi.value <= min_qi_threshold { + if verbose { + println!(" qi {} <= 2k (rejected)", pi.hex); + } return None; } } let q_bfv = product(chosen.iter().map(|pi| pi.value.clone())); - let rkq_big = &q_bfv % &k_big; - let rkq: u128 = rkq_big.to_u128().unwrap_or(0); - let delta = &q_bfv / &k_big; + let rkq: u128 = (&q_bfv % &k_second_big).to_u128().unwrap_or(0); + let delta = &q_bfv / &k_second_big; - // For second set: B_Enc = B (simpler), B_fresh = B_Enc + d*B*B_chi + d*B*B_chi - let benc = BigUint::from(bfv_search_config.b); - let term_d_bbchi = BigUint::from(d) - * BigUint::from(bfv_search_config.b) - * BigUint::from(bfv_search_config.b_chi); - let b_fresh = &benc + &term_d_bbchi + &term_d_bbchi; - let b_c = b_fresh.clone(); // B_C = B_fresh + let benc = BigUint::from(config.b); + let term_d_bb_chi = BigUint::from(d) * BigUint::from(config.b) * BigUint::from(config.b_chi); + let b_fresh = &benc + &term_d_bb_chi + &term_d_bb_chi; + let b_c = b_fresh.clone(); - let lhs = &b_c << 1; // 2*B_C + // Correctness: 2·B_C < Δ. + let lhs = &b_c << 1; let lhs_log2 = log2_big(&lhs); let rhs_log2 = log2_big(&delta); let margin = rhs_log2 - lhs_log2; - if lhs >= delta || margin < bfv_search_config.min_margin { + let ok = lhs < delta && margin >= config.min_margin; + + if verbose { + println!( + " Detailed: log2(2·B_C)={lhs_log2:.2}, log2(Δ)={rhs_log2:.2} => {}", + if ok { "PASS" } else { "FAIL" } + ); + } + + if !ok { return None; } @@ -881,8 +611,11 @@ pub fn finalize_second_param( delta, benc_min: benc, b_fresh, - b_c, - b_sm_min: BigUint::zero(), // not used in second set + b_c: b_c.clone(), + b_c_final: b_c, + b_sm_min: BigUint::zero(), + b_relin: BigUint::zero(), + mult_depth: 0, lhs_log2, rhs_log2, }) @@ -891,20 +624,18 @@ pub fn finalize_second_param( #[cfg(test)] mod tests { use super::*; - use crate::search::prime::build_prime_items; - use crate::search::prime::build_prime_items_for_second; - use num_bigint::BigUint; use num_traits::One; fn create_test_config() -> BfvSearchConfig { BfvSearchConfig { - n: 10, - z: 1000, + n: 20, + z: 3, k: 1000, - lambda: 80, + lambda: 38, + mult_depth: 3, b: 20, b_chi: 1, - min_margin: 1.0, + min_margin: 2.0, verbose: false, } } @@ -925,7 +656,10 @@ mod tests { benc_min: BigUint::one(), b_fresh: BigUint::one(), b_c: BigUint::one(), + b_c_final: BigUint::one(), b_sm_min: BigUint::one(), + b_relin: BigUint::one(), + mult_depth: 0, lhs_log2: 0.0, rhs_log2: 0.0, }; @@ -941,117 +675,45 @@ mod tests { fn test_bfv_search_invalid_z_zero() { let mut config = create_test_config(); config.z = 0; - - let result = bfv_search(&config); - assert!(result.is_err()); + assert!(bfv_search(&config).is_err()); } #[test] fn test_bfv_search_invalid_z_too_large() { let mut config = create_test_config(); config.z = K_MAX + 1; - - let result = bfv_search(&config); - assert!(result.is_err()); - } - - #[test] - fn test_finalize_bfv_candidate_with_valid_primes() { - let config = create_test_config(); - let primes = build_prime_items(); - assert!(!primes.is_empty()); - - let test_primes = primes.iter().take(2).cloned().collect::>(); - let d = 512; - - let result = finalize_bfv_candidate(&config, d, test_primes.clone()); - - if let Some(res) = result { - assert_eq!(res.d, d); - assert_eq!(res.selected_primes.len(), test_primes.len()); - assert_eq!(res.k_plain_eff, config.z.max(config.k)); - } + assert!(bfv_search(&config).is_err()); } #[test] - fn test_finalize_bfv_candidate_empty_primes() { + fn test_bfv_search_mult_depth_3_feasible() { let config = create_test_config(); - let empty_primes = vec![]; - let d = 512; - - let result = finalize_bfv_candidate(&config, d, empty_primes); - assert!(result.is_none()); + let res = bfv_search(&config).expect("search succeeds for n=20 m=3 mult_depth=3 λ=38"); + assert_eq!(res.d, 16384); + assert_eq!(res.mult_depth, 3); + assert_eq!(res.selected_primes.len(), 5); } #[test] - fn test_finalize_second_param_qi_validation() { + fn test_finalize_second_param_qi_gap() { let config = create_test_config(); let primes = build_prime_items_for_second(); assert!(!primes.is_empty()); - // Test invalid case: primes too small for k_plain - let small_primes = primes + let k_plain = 1u128 << 50; // 2^50, requires primes > 2^51 + let d = 16384; + let small = primes .iter() - .filter(|p| p.bitlen <= 40) + .filter(|p| p.bitlen == 50) .take(2) .cloned() .collect::>(); - - if !small_primes.is_empty() { - let k_plain = 1u128 << 50; // 2^50, requires primes > 2^51 - let d = 512; - let result = finalize_second_param(&config, d, small_primes, k_plain); - // Primes with bitlen <= 40 are < 2^40 < 2^51, so should be rejected - assert!(result.is_none()); - } - - // Test valid case: primes large enough for k_plain - let large_primes = primes - .iter() - .filter(|p| p.bitlen > 50) // Large primes that can satisfy various k_plain values - .take(2) - .cloned() - .collect::>(); - - if !large_primes.is_empty() { - let k_plain = 1u128 << 30; // 2^30, requires primes > 2^31 - let d = 512; - let result = finalize_second_param(&config, d, large_primes.clone(), k_plain); - assert!(result.is_some()); - let res = result.unwrap(); - - // Validate returned properties - assert_eq!(res.d, d); - assert_eq!(res.k_plain_eff, k_plain); - assert_eq!(res.selected_primes.len(), large_primes.len()); - // Compare primes by their values since PrimeItem doesn't implement PartialEq - for (returned, expected) in res.selected_primes.iter().zip(large_primes.iter()) { - assert_eq!(returned.value, expected.value); - } - - // Validate q_bfv is product of selected primes - let expected_q = product(res.selected_primes.iter().map(|p| p.value.clone())); - assert_eq!(res.q_bfv, expected_q); - - // Validate delta = q_bfv / k_plain - let expected_delta = &res.q_bfv / &BigUint::from(k_plain); - assert_eq!(res.delta, expected_delta); - } - } - - #[test] - fn test_construct_qi_for_target_bits() { - let config = create_test_config(); - let primes = build_prime_items(); - assert!(!primes.is_empty()); - - let d = 512; - let target_bits = 100; - - let result = construct_qi_for_target_bits(&config, d, &primes, target_bits); - if let Some(res) = result { - assert_eq!(res.d, d); - assert!(!res.selected_primes.is_empty()); + if !small.is_empty() { + let expected = small + .iter() + .all(|p| p.value > (BigUint::from(k_plain) << 1)); + let res = finalize_second_param(&config, d, small, k_plain, false); + assert_eq!(res.is_some(), expected); } } } diff --git a/crates/fhe-params/src/search/constants.rs b/crates/fhe-params/src/search/constants.rs index 9ad62a44fb..3bb0e48e8a 100644 --- a/crates/fhe-params/src/search/constants.rs +++ b/crates/fhe-params/src/search/constants.rs @@ -4,161 +4,15 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -/// NTT-friendly primes by bit-length (40..63), 6 per size +/// NTT-friendly primes by bit-length (49..62), the working pool for the search. +/// +/// Every entry is a proven prime satisfying `p ≡ 1 (mod 32768)`, i.e. +/// `p ≡ 1 (mod 2·N)` with ring dimension `N = 16384` (the fixed ring dimension of +/// the first parameter set). Valid primes end in `...0001` or `...8001` in hex; +/// posts ending `...4001`/`...c001` satisfy `mod 16384` only and are excluded. +/// Buckets below 49 bits are deliberately absent: an earlier auto-generated pool +/// contained composite entries, so the search only consumes bit-lengths 49..62. pub const NTT_PRIMES_BY_BITS: &[(u8, &[&str])] = &[ - ( - 40u8, - &[ - "0x0000008000034001", - "0x00000080004a0001", - "0x0000008000fa0001", - "0x0000008001ae0001", - "0x0000008001b20001", - "0x0000008001ee0001", - "0x0000008001f60001", - "0x0000008002228001", - "0x0000008002438001", - "0x00000080028a8001", - "0x00000080029c0001", - "0x000000800320c001", - ], - ), - ( - 41u8, - &[ - "0x00000100003e0001", - "0x0000010000960001", - "0x0000010000b60001", - "0x0000010000ce0001", - "0x0000010000de0001", - "0x00000100010a0001", - "0x0000010001128001", - "0x0000010001680001", - "0x00000100019b0001", - "0x0000010002238001", - "0x0000010002520001", - "0x000001000266c001", - ], - ), - ( - 42u8, - &[ - "0x0000020000560001", - "0x0000020000820001", - "0x0000020000920001", - "0x0000020000aa0001", - "0x0000020001360001", - "0x00000200015a0001", - "0x00000200017c0001", - "0x0000020001e74001", - "0x000002000227c001", - "0x0000020002a68001", - "0x0000020002c54001", - "0x00000200031ac001", - ], - ), - ( - 43u8, - &[ - "0x0000040000560001", - "0x00000400007a0001", - "0x00000400008a0001", - "0x0000040000fe0001", - "0x0000040001760001", - "0x00000400017a0001", - "0x00000400019bc001", - "0x0000040001b60001", - "0x0000040001e24001", - "0x000004000236c001", - "0x0000040002a8c001", - "0x0000040003038001", - ], - ), - ( - 44u8, - &[ - "0x00000800009a0001", - "0x0000080000ee0001", - "0x0000080001060001", - "0x0000080001160001", - "0x00000800012e0001", - "0x0000080001420001", - "0x000008000173c001", - "0x0000080001a6c001", - "0x0000080001c40001", - "0x00000800020ec001", - "0x000008000236c001", - "0x000008000265c001", - ], - ), - ( - 45u8, - &[ - "0x0000100000020001", - "0x00001000001a0001", - "0x00001000003e0001", - "0x00001000006e0001", - "0x0000100000ba0001", - "0x0000100000ce0001", - "0x0000100000eac001", - "0x000010000122c001", - "0x0000100001560001", - "0x0000100001860001", - "0x0000100001a58001", - "0x0000100001f10001", - ], - ), - ( - 46u8, - &[ - "0x00002000000a0001", - "0x00002000000e0001", - "0x0000200000620001", - "0x00002000006a0001", - "0x0000200000860001", - "0x0000200000a60001", - "0x0000200000c80001", - "0x0000200000f14001", - "0x0000200001328001", - "0x00002000018ac001", - "0x0000200001ab4001", - "0x0000200001c94001", - ], - ), - ( - 47u8, - &[ - "0x0000400000060001", - "0x0000400000420001", - "0x0000400000660001", - "0x0000400000920001", - "0x00004000009e0001", - "0x0000400000b60001", - "0x0000400000d58001", - "0x0000400000f5c001", - "0x0000400001290001", - "0x000040000164c001", - "0x0000400001938001", - "0x0000400001c4c001", - ], - ), - ( - 48u8, - &[ - "0x0000800000020001", - "0x0000800000520001", - "0x0000800000aa0001", - "0x0000800001360001", - "0x0000800001420001", - "0x0000800002060001", - "0x000080000214c001", - "0x00008000023f8001", - "0x0000800002624001", - "0x0000800002af8001", - "0x0000800002d70001", - "0x000080000307c001", - ], - ), ( 49u8, &[ @@ -346,130 +200,57 @@ pub const NTT_PRIMES_BY_BITS: &[(u8, &[&str])] = &[ "0x0400000000c00001", ], ), - ( - 60u8, - &[ - "0x0800000000004001", - "0x0800000000044001", - "0x0800000000124001", - "0x080000000019c001", - "0x080000000020c001", - "0x0800000000244001", - "0x08000000002d4001", - "0x08000000003dc001", - "0x0800000000404001", - "0x0800000000514001", - "0x080000000061c001", - "0x0800000000634001", - "0x08000000006c4001", - "0x080000000082c001", - "0x080000000083c001", - "0x0800000000854001", - "0x080000000092c001", - "0x08000000009bc001", - "0x0800000000a7c001", - "0x0800000000bcc001", - "0x0800000000c94001", - "0x0800000000cbc001", - "0x0800000000d54001", - "0x0800000000db4001", - ], - ), ( 61u8, &[ - "0x1000000000024001", - "0x1000000000054001", - "0x100000000005c001", - "0x10000000000a4001", - "0x100000000014c001", - "0x10000000002dc001", - "0x1000000000344001", - "0x100000000035c001", - "0x1000000000414001", - "0x10000000004bc001", - "0x10000000005cc001", - "0x10000000006ec001", - "0x1000000000794001", - "0x10000000007bc001", - "0x100000000090c001", - "0x100000000096c001", - "0x1000000000a14001", - "0x1000000000aec001", - "0x1000000000c2c001", - "0x1000000000c6c001", - "0x1000000000ccc001", - "0x1000000000d74001", - "0x1000000000dac001", - "0x10000000010dc001", + // Valid negacyclic primes near top of 61-bit range (q ≡ 1 mod 32768). + "0x1fffffffffe10001", // log2 ≈ 60.9999, ends 0001 + "0x1fffffffffe00001", // log2 ≈ 60.9999, ends 0001 + "0x1fffffffffdd0001", // log2 ≈ 60.9999, ends 0001 + "0x1fffffffffd08001", // log2 ≈ 60.9998, ends 8001 ], ), ( 62u8, &[ - // Lower range (log2 ≈ 61.0) - "0x2000000000104001", - "0x200000000013c001", - "0x20000000001f4001", - "0x20000000002e4001", - "0x2000000000454001", - "0x20000000004c4001", - "0x2000000000524001", - "0x200000000052c001", - "0x200000000071c001", - "0x200000000080c001", - "0x200000000089c001", - "0x20000000008b4001", - // Mid range (log2 ≈ 61.2-61.65) - verified NTT-friendly primes - "0x24c2230d75cdc001", // log2 = 61.20 - "0x260dfc1463740001", // log2 = 61.25 - "0x276588f7ff08c001", // log2 = 61.30 - "0x28c9335e63610001", // log2 = 61.35 - "0x2a3968a772a88001", // log2 = 61.40 - "0x2bb69a0e78f64001", // log2 = 61.45 - "0x2d413cccfe794001", // log2 = 61.50 - "0x2ed9ca3ed4188001", // log2 = 61.55 - "0x3080c00765628001", // log2 = 61.60 - "0x3236a0385b67c001", // log2 = 61.65 - // Upper range (log2 ≈ 61.7-62.0) - for second set - "0x3460000000000001", - "0x3630000000000001", - "0x37f0000000000001", - "0x3810000000000001", - "0x3820000000000001", - "0x3960000000000001", - "0x39ae166b9acc8001", // log2 = 61.85 - "0x3a00000000000001", - "0x3a90000000000001", - "0x3ae0000000000001", - "0x3ae45abe677d4001", // log2 = 61.88 - "0x3bb6d0022f594001", // log2 = 61.90 - "0x3c8c355f344d0001", // log2 = 61.92 - "0x3d6495552e9c0001", // log2 = 61.94 - "0x3e10000000000001", - "0x3e3ffa895b7d4001", // log2 = 61.96 - "0x3ea0000000000001", - "0x3f18000000000001", - "0x3f1e6fc702dc8001", // log2 = 61.98 - // Near-top range (log2 ≈ 61.9999) - generated for second parameter set - "0x3fffffffffff0001", - "0x3ffffffffffe8001", - "0x3ffffffffff1c001", - "0x3fffffffffeec001", - "0x3fffffffffe80001", - "0x3fffffffffd9c001", - "0x3fffffffffd78001", - "0x3fffffffffd2c001", + // Mid range — entries ending 0001 / 8001 only. + "0x260dfc1463740001", // log2 = 61.25, ends 0001 + "0x28c9335e63610001", // log2 = 61.35, ends 0001 + "0x2a3968a772a88001", // log2 = 61.40, ends 8001 + "0x2ed9ca3ed4188001", // log2 = 61.55, ends 8001 + "0x3080c00765628001", // log2 = 61.60, ends 8001 + "0x3460000000000001", // ends 0001 + "0x3630000000000001", // ends 0001 + "0x37f0000000000001", // ends 0001 + "0x3810000000000001", // ends 0001 + "0x3820000000000001", // ends 0001 + "0x3960000000000001", // ends 0001 + "0x39ae166b9acc8001", // log2 = 61.85, ends 8001 + "0x3a00000000000001", // ends 0001 + "0x3a90000000000001", // ends 0001 + "0x3ae0000000000001", // ends 0001 + "0x3c8c355f344d0001", // log2 = 61.92, ends 0001 + "0x3d6495552e9c0001", // log2 = 61.94, ends 0001 + "0x3e10000000000001", // ends 0001 + "0x3ea0000000000001", // ends 0001 + "0x3f18000000000001", // ends 0001 + "0x3f1e6fc702dc8001", // log2 = 61.98, ends 8001 + "0x3fffffffffff0001", // ends 0001 + "0x3ffffffffffe8001", // ends 8001 + "0x3fffffffffe80001", // ends 0001 + "0x3fffffffffd78001", // ends 8001 ], ), ]; -/// Starting polynomial degree (power of 2) for parameter search -pub const D_POW2_START: u64 = 256; -/// Maximum polynomial degree (power of 2) to search up to -pub const D_POW2_MAX: u64 = 32768; -/// Maximum number of votes/plaintext additions (k_plain_eff) -pub const K_MAX: u128 = 1u128 << 25; // 33,554,432 +/// Fixed ring dimension for the first parameter set. +pub const RING_DIM: u64 = 16384; +/// Target number of CRT primes for the first parameter set. +pub const TARGET_NUM_PRIMES: usize = 5; +/// Maximum polynomial degree (power of 2) supported. +pub const D_POW2_MAX: u64 = 16384; +/// Maximum number of multiplications (total circuit depth) supported. +pub const K_MAX: u128 = 1_000_000; // 1M multiplications #[cfg(test)] mod tests { @@ -477,8 +258,8 @@ mod tests { use std::collections::HashSet; /// NTT compatibility modulus: primes must satisfy p ≡ 1 (mod 2*RING_DIM), - /// i.e. p % 16384 == 1 for the 8192-degree ring used by the search. - const NTT_MODULUS: u64 = 16384; + /// i.e. p % 32768 == 1 for the 16384-degree ring used by the search. + const NTT_MODULUS: u64 = 32768; /// Deterministic Miller-Rabin primality test, exact for all u64. fn is_prime(n: u64) -> bool { @@ -539,7 +320,7 @@ mod tests { assert_eq!( v % NTT_MODULUS, 1, - "{hex} is not NTT-compatible (p % 16384 != 1)" + "{hex} is not NTT-compatible (p % 32768 != 1)" ); assert_eq!( v.checked_ilog2().unwrap() + 1, diff --git a/crates/fhe-params/src/search/prime.rs b/crates/fhe-params/src/search/prime.rs index 9d117fc7bd..91197f1604 100644 --- a/crates/fhe-params/src/search/prime.rs +++ b/crates/fhe-params/src/search/prime.rs @@ -5,7 +5,6 @@ // or FITNESS FOR A PARTICULAR PURPOSE. use num_bigint::BigUint; -use num_traits::One; use std::collections::BTreeMap; use crate::search::constants::NTT_PRIMES_BY_BITS; @@ -24,15 +23,28 @@ pub struct PrimeItem { pub hex: String, } -/// Filter function type for excluding specific bit lengths -type BitFilter = fn(u8) -> bool; +/// Build the prime pool for the first parameter set (49–62 bits). +/// +/// The ring dimension is fixed at 16384, so every table entry already satisfies +/// `p ≡ 1 (mod 32768)`; the search only needs the 49–62-bit working pool. +pub fn build_prime_items() -> Vec { + build_in_range(49, 62) +} + +/// Build the prime pool for the second parameter set (50–62 bits). +/// +/// The second set needs `qi > 1.25 × max_qi_first`, so the 50-bit floor matches +/// `first`'s minimum prime size and avoids the marginal 49-bit primes. +pub fn build_prime_items_for_second() -> Vec { + build_in_range(50, 62) +} -/// Build a flat list of primes with precomputed log2 and hex strings. -/// Excludes primes whose bit length matches the filter predicate. -fn build_prime_items_with_filter(filter: BitFilter) -> Vec { +/// Build a flat list of primes with bit-length in `[lo, hi]`, precomputing +/// log2 and hex strings. +fn build_in_range(lo: u8, hi: u8) -> Vec { let mut vec = Vec::new(); for (bits, arr) in NTT_PRIMES_BY_BITS.iter() { - if filter(*bits) { + if *bits < lo || *bits > hi { continue; } for &phex in arr.iter() { @@ -48,58 +60,32 @@ fn build_prime_items_with_filter(filter: BitFilter) -> Vec { vec } -/// Build the prime pool for the first parameter set. -/// Restricted to 50..=60 bit primes: the floor of 50 bits avoids the <0.2-bit -/// correctness margin of 49-bit primes for worst-case inputs, and 61/62/63-bit -/// primes are reserved for the second set (centered-RNS gap requirement). -pub fn build_prime_items() -> Vec { - build_prime_items_with_filter(|bits| bits < 50 || bits == 61 || bits == 62 || bits == 63) -} - -/// Build prime items for second parameter set (includes 62-bit primes, excludes 61 and 63-bit) -pub fn build_prime_items_for_second() -> Vec { - build_prime_items_with_filter(|bits| bits == 63 || bits == 61) -} - -/// Check whether `p` is NTT-friendly for ring dimension `d`, i.e. `p ≡ 1 (mod 2d)`. -/// -/// All primes in `NTT_PRIMES_BY_BITS` satisfy this for the base ring dimension -/// (2*8192 = 16384), but not every prime remains NTT-friendly for the larger -/// dimensions `bfv_search` may step up to (16384, 32768), so candidates must be -/// re-filtered against the actual `d` before selection. -pub fn is_ntt_friendly(p: &BigUint, d: u64) -> bool { - p % BigUint::from(2u64 * d) == BigUint::one() -} - -/// Greedily select the maximum q under a log2 cap by taking largest primes first. -/// -/// Iterates through bit lengths from largest to smallest (60 down to 40), -/// adding primes as long as the cumulative log2(q) stays under the limit. -pub fn select_max_q_under_cap(limit_log2: f64, all: &[PrimeItem]) -> Vec { +/// Group primes by bit-length, sorting each bucket ascending or descending. +pub fn group_by_bits(primes: &[PrimeItem], ascending: bool) -> BTreeMap> { let mut by_bits: BTreeMap> = BTreeMap::new(); - for p in all { + for p in primes { by_bits.entry(p.bitlen).or_default().push(p.clone()); } for v in by_bits.values_mut() { - v.sort_by(|a, b| b.value.cmp(&a.value)); + if ascending { + v.sort_by(|a, b| a.value.cmp(&b.value)); + } else { + v.sort_by(|a, b| b.value.cmp(&a.value)); + } } + by_bits +} - let mut sel: Vec = Vec::new(); - let mut qlog = 0.0f64; - - for bb in (40u8..=60u8).rev() { - if let Some(bucket) = by_bits.get_mut(&bb) { - for pi in bucket.iter() { - let new_qlog = qlog + pi.log2; - if new_qlog <= limit_log2 + 1e-12 { - sel.push(pi.clone()); - qlog = new_qlog; - } +/// Whether any two primes in the selection share the same value. +pub fn has_duplicate_primes(sel: &[PrimeItem]) -> bool { + for i in 0..sel.len() { + for j in (i + 1)..sel.len() { + if sel[i].value == sel[j].value { + return true; } } } - - sel + false } #[cfg(test)] @@ -112,14 +98,12 @@ mod tests { let items = build_prime_items(); assert!(!items.is_empty()); - // Verify no 61, 62, or 63-bit primes are included + // First-set pool covers 49..=62 bits. for item in &items { - assert_ne!(item.bitlen, 61); - assert_ne!(item.bitlen, 62); - assert_ne!(item.bitlen, 63); + assert!((49..=62).contains(&item.bitlen)); } - // Verify items have correct structure + // Verify items have correct structure. for item in &items { assert_eq!(parse_hex_big(&item.hex), item.value); assert!(item.log2 > 0.0); @@ -131,103 +115,15 @@ mod tests { let items = build_prime_items_for_second(); assert!(!items.is_empty()); - // Verify no 61 or 63-bit primes are included, but 62-bit should be included - assert!(items.iter().any(|item| item.bitlen == 62)); + // Second-set pool covers 50..=62 bits. for item in &items { - assert_ne!(item.bitlen, 61); - assert_ne!(item.bitlen, 63); + assert!((50..=62).contains(&item.bitlen)); } - // Verify items have correct structure + // Verify items have correct structure. for item in &items { assert_eq!(parse_hex_big(&item.hex), item.value); assert!(item.log2 > 0.0); } } - - #[test] - fn test_is_ntt_friendly() { - let items = build_prime_items(); - - // Base ring dimension: every first-set prime is NTT-friendly (table-wide invariant). - for item in &items { - assert!( - is_ntt_friendly(&item.value, 8192), - "{} fails NTT check for d=8192", - item.hex - ); - } - - // 60-bit primes are only NTT-friendly for the base dimension; larger d - // (which bfv_search may step up to) excludes them. - let sixty_bit: Vec<&PrimeItem> = items.iter().filter(|p| p.bitlen == 60).collect(); - assert!(!sixty_bit.is_empty()); - for item in &sixty_bit { - assert!( - !is_ntt_friendly(&item.value, 16384), - "{} unexpectedly NTT-friendly for d=16384", - item.hex - ); - assert!( - !is_ntt_friendly(&item.value, 32768), - "{} unexpectedly NTT-friendly for d=32768", - item.hex - ); - } - - // 50..=59-bit primes remain NTT-friendly for every dimension bfv_search may return. - for item in items.iter().filter(|p| p.bitlen < 60) { - for &d in &[8192u64, 16384, 32768] { - assert!( - is_ntt_friendly(&item.value, d), - "{} fails NTT check for d={}", - item.hex, - d - ); - } - } - } - - #[test] - fn test_select_max_q_under_cap() { - let all = build_prime_items(); - assert!(!all.is_empty()); - - // Test with a reasonable cap - let limit_log2 = 100.0; - let selected = select_max_q_under_cap(limit_log2, &all); - - // Verify selected items are under the cap - let mut total_log2 = 0.0; - for item in &selected { - total_log2 += item.log2; - } - assert!(total_log2 <= limit_log2 + 1e-12); - - // Verify selected items are from the input - for sel_item in &selected { - assert!(all.iter().any(|item| item.hex == sel_item.hex)); - } - } - - #[test] - fn test_select_max_q_under_cap_small_limit() { - let all = build_prime_items(); - let limit_log2 = 50.0; - let selected = select_max_q_under_cap(limit_log2, &all); - - // With a small limit, we should get fewer items - let mut total_log2 = 0.0; - for item in &selected { - total_log2 += item.log2; - } - assert!(total_log2 <= limit_log2 + 1e-12); - } - - #[test] - fn test_select_max_q_under_cap_empty_input() { - let empty: Vec = vec![]; - let selected = select_max_q_under_cap(100.0, &empty); - assert!(selected.is_empty()); - } } diff --git a/crates/zk-helpers/src/bin/generate_parity_matrices.rs b/crates/zk-helpers/src/bin/generate_parity_matrices.rs index b9659277f2..15e5ed4d95 100644 --- a/crates/zk-helpers/src/bin/generate_parity_matrices.rs +++ b/crates/zk-helpers/src/bin/generate_parity_matrices.rs @@ -79,6 +79,8 @@ fn file_for(root: &Path, committee: &str, preset: BfvPreset) -> PathBuf { // DKG-only variants don't need their own file. BfvPreset::InsecureDkg512 => "insecure", BfvPreset::SecureDkg8192 => "secure", + BfvPreset::SecureThreshold16384 => "secure-16384", + BfvPreset::SecureDkg16384 => "secure-16384", }; root.join(committee).join(format!("parity_{suffix}.nr")) } From abc4ab4fbca7640eca6c86569259cdf0a43368b9 Mon Sep 17 00:00:00 2001 From: 0xjei Date: Wed, 2 Sep 2026 18:16:16 +0200 Subject: [PATCH 4/9] feat: preset-aware Noir config routing + batch circuit-config generator (Step 2A) - Add BfvPreset::config_dir() so codegen/zk-cli route secure-8192 and secure-16384 to distinct config modules instead of both collapsing onto configs::secure. - zk_cli --preset now accepts exact preset names (e.g. SECURE_THRESHOLD_16384) in addition to the two-tier insecure|secure / lambda form. - Extract the circuit-path -> zk_cli arg mapping into a shared zk_cli_helpers.sh sourced by generate_prover_toml.sh and the new batch generator. - Add scripts/generate-circuit-configs.sh: deterministic zk_cli sweep for every (preset x committee) x circuit into dist/circuit-codegen, failure-tolerant with manifest.txt + failures.txt (--strict to abort). - Fix stale SecureThreshold16384 doc comment (depth 3 now feasible). --- .../scripts/generate_prover_toml.sh | 59 +----- circuits/benchmarks/scripts/zk_cli_helpers.sh | 74 ++++++++ crates/fhe-params/src/presets.rs | 18 +- crates/zk-helpers/src/bin/zk_cli.rs | 11 +- .../circuits/dkg/share_computation/codegen.rs | 2 +- scripts/generate-circuit-configs.sh | 174 ++++++++++++++++++ 6 files changed, 274 insertions(+), 64 deletions(-) create mode 100755 circuits/benchmarks/scripts/zk_cli_helpers.sh create mode 100755 scripts/generate-circuit-configs.sh diff --git a/circuits/benchmarks/scripts/generate_prover_toml.sh b/circuits/benchmarks/scripts/generate_prover_toml.sh index 3ace7bea4b..c79b0a6f95 100755 --- a/circuits/benchmarks/scripts/generate_prover_toml.sh +++ b/circuits/benchmarks/scripts/generate_prover_toml.sh @@ -50,63 +50,8 @@ OUTPUT_DIR="${REPO_ROOT}/circuits/bin/${CIRCUIT_PATH}" # Map circuit path to zk_cli --circuit and optional --inputs # DKG circuits that need --inputs: share-computation, share-encryption, share-decryption # config has no witness inputs (verifies constants only), so skip zk_cli -get_zk_args() { - local path="$1" - case "$path" in - config) - echo "_no_zk_cli" - return - ;; - dkg/pk) - echo "pk" - return - ;; - dkg/sk_share_computation) - echo "share-computation secret-key" - return - ;; - dkg/e_sm_share_computation) - echo "share-computation smudging-noise" - return - ;; - dkg/share_encryption) - echo "share-encryption secret-key" - return - ;; - dkg/share_decryption) - echo "share-decryption secret-key" - return - ;; - threshold/user_data_encryption_ct0) - echo "user-data-encryption" - return - ;; - threshold/user_data_encryption_ct1) - echo "user-data-encryption" - return - ;; - threshold/pk_generation) - echo "pk-generation" - return - ;; - threshold/pk_aggregation) - echo "pk-aggregation" - return - ;; - threshold/share_decryption) - echo "threshold-share-decryption" - return - ;; - threshold/decrypted_shares_aggregation) - echo "decrypted-shares-aggregation" - return - ;; - *) - echo "Error: unknown circuit path: $path" >&2 - exit 1 - ;; - esac -} +# shellcheck source=zk_cli_helpers.sh +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/zk_cli_helpers.sh" ZK_ARGS=($(get_zk_args "$CIRCUIT_PATH")) ZK_CIRCUIT="${ZK_ARGS[0]}" diff --git a/circuits/benchmarks/scripts/zk_cli_helpers.sh b/circuits/benchmarks/scripts/zk_cli_helpers.sh new file mode 100755 index 0000000000..177068da9c --- /dev/null +++ b/circuits/benchmarks/scripts/zk_cli_helpers.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-3.0-only +# +# This file is provided WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. + +# Shared circuit-path -> zk_cli argument mapping. +# +# Consumed by `generate_prover_toml.sh` (single circuit) and +# `scripts/generate-circuit-configs.sh` (batch over all presets/committees) so the +# mapping never drifts between the two. +# +# Sourced, not executed directly. Define `CIRCUIT_PATH` (e.g. "dkg/pk") before +# calling `get_zk_args()`, which prints `" [zk_cli_inputs]"` — or +# `"_no_zk_cli"` for circuits without witness inputs (the `config` sanity circuit). + +get_zk_args() { + local path="$1" + case "$path" in + config) + echo "_no_zk_cli" + return + ;; + dkg/pk) + echo "pk" + return + ;; + dkg/sk_share_computation) + echo "share-computation secret-key" + return + ;; + dkg/e_sm_share_computation) + echo "share-computation smudging-noise" + return + ;; + dkg/share_encryption) + echo "share-encryption secret-key" + return + ;; + dkg/share_decryption) + echo "share-decryption secret-key" + return + ;; + threshold/user_data_encryption_ct0) + echo "user-data-encryption" + return + ;; + threshold/user_data_encryption_ct1) + echo "user-data-encryption" + return + ;; + threshold/pk_generation) + echo "pk-generation" + return + ;; + threshold/pk_aggregation) + echo "pk-aggregation" + return + ;; + threshold/share_decryption) + echo "threshold-share-decryption" + return + ;; + threshold/decrypted_shares_aggregation) + echo "decrypted-shares-aggregation" + return + ;; + *) + echo "Error: unknown circuit path: $path" >&2 + return 1 + ;; + esac +} \ No newline at end of file diff --git a/crates/fhe-params/src/presets.rs b/crates/fhe-params/src/presets.rs index 04e45785b0..ea09769ed0 100644 --- a/crates/fhe-params/src/presets.rs +++ b/crates/fhe-params/src/presets.rs @@ -73,9 +73,9 @@ pub enum BfvPreset { /// Secure threshold BFV parameters (degree 16384) - PRODUCTION READY /// /// Used for threshold encryption (GRECO) and threshold decryption operations with - /// multiplicative depth 2 (l-BFV support; depth 3 exceeds the runtime correctness - /// budget for these constants). These parameters define the threshold public key - /// that data providers use to encrypt inputs. + /// multiplicative depth up to 3 (l-BFV support; the regenerated constants satisfy + /// the runtime `2*(B_C + n*B_sm) < Delta` correctness budget at depth 3). These + /// parameters define the threshold public key that data providers use to encrypt inputs. SecureThreshold16384, /// Secure DKG parameters (degree 16384) - PRODUCTION READY /// @@ -518,6 +518,18 @@ impl BfvPreset { format!("{}-{}", meta.security.as_config_str(), meta.degree) } + /// Returns the Noir config module name for this preset, e.g. `"insecure-512"`, + /// `"secure-8192"`, `"secure-16384"`. Codegen/zk-cli routing must use + /// this (not [`SecurityTier::as_config_str`]) so that `secure-8192` and + /// `secure-16384` resolve to distinct `configs::{module}` rather than both + /// collapsing onto `configs::secure`. + /// + /// Identical to [`BfvPreset::artifacts_dir`]; the two names are kept in sync + /// because artifacts and Noir configs are organized the same way. + pub fn config_dir(&self) -> String { + self.artifacts_dir() + } + /// Returns the per-committee artifact directory: `"{preset}/{committee}"`. /// /// Use this at runtime so each committee size resolves to its own compiled artifacts diff --git a/crates/zk-helpers/src/bin/zk_cli.rs b/crates/zk-helpers/src/bin/zk_cli.rs index 22c3ee63b1..542c710f1f 100644 --- a/crates/zk-helpers/src/bin/zk_cli.rs +++ b/crates/zk-helpers/src/bin/zk_cli.rs @@ -103,7 +103,7 @@ fn print_generation_info( println!(" Circuit: {}", circuit); println!( " Preset: {} (degree {}, {} moduli)", - meta.security.as_config_str(), + preset.config_dir(), meta.degree, meta.num_moduli ); @@ -172,7 +172,8 @@ struct Cli { /// Circuit name to generate artifacts for (e.g. `pk`, `share-computation`). #[arg(long, required_unless_present = "list_circuits")] circuit: Option, - /// Preset: "insecure"|"secure" or λ (2|80). Drives both threshold and DKG params. + /// Preset: exact name ("SECURE_THRESHOLD_16384", ...) or "insecure"|"secure" or λ (2|38|80). + /// Drives both threshold and DKG params. #[arg(long, required_unless_present = "list_circuits")] preset: Option, /// Select the witness family when sample generation depends on it. @@ -229,7 +230,11 @@ fn main() -> Result<()> { // Unwrap required arguments (clap ensures they're present when list_circuits is false). let circuit = args.circuit.unwrap(); - let preset = BfvPreset::from_security_config_name(&args.preset.unwrap())?; + let preset_name = args.preset.unwrap(); + // Accept either an exact preset name (e.g. "SECURE_THRESHOLD_16384") to disambiguate + // among the two secure tiers, or the backward-compatible "insecure"|"secure" / λ form. + let preset = BfvPreset::from_name(&preset_name) + .or_else(|_| BfvPreset::from_security_config_name(&preset_name))?; std::fs::create_dir_all(&args.output) .with_context(|| format!("failed to create output dir {}", args.output.display()))?; diff --git a/crates/zk-helpers/src/circuits/dkg/share_computation/codegen.rs b/crates/zk-helpers/src/circuits/dkg/share_computation/codegen.rs index 1f5f31da5a..927e17479e 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_computation/codegen.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_computation/codegen.rs @@ -85,7 +85,7 @@ pub fn generate_configs_with_chunk_size( ))); } let chunk_count = degree / chunk_size; - let config_name = preset.metadata().security.as_config_str(); + let config_name = preset.config_dir(); let parity_matrix_str = parity_matrix_constant_string(&threshold_params, n_parties, threshold)?; let prefix = ::PREFIX; let configs = format!( diff --git a/scripts/generate-circuit-configs.sh b/scripts/generate-circuit-configs.sh new file mode 100755 index 0000000000..991d86bd9b --- /dev/null +++ b/scripts/generate-circuit-configs.sh @@ -0,0 +1,174 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: LGPL-3.0-only +# +# This file is provided WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. + +# Batch-driven deterministic zk_cli codegen for every (preset x committee) x circuit. +# +# Produces per-circuit `configs.nr` + `Prover.toml` under: +# dist/circuit-codegen//// +# for all three BFV presets (insecure-512, secure-8192, secure-16384) and all +# committees (minimum, micro, small). +# +# This is a convenience batch wrapper: it drives the same per-circuit `zk_cli codegen` +# path as `circuits/benchmarks/scripts/generate_prover_toml.sh`, but for the full +# matrix at once and including configs (not just Prover.toml), so operators do not +# need to repeat zk_cli runs manually. +# +# Augments — does not replace — `zk_cli`. `zk_cli` remains the on-demand single-circuit +# path; this script is the deterministic matrix sweep. +# +# Usage: +# ./scripts/generate-circuit-configs.sh [--preset insecure-512|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$REPO_ROOT" + +# shellcheck source=circuits/benchmarks/scripts/zk_cli_helpers.sh +ZK_CLI_HELPERS="$(cd "$(dirname "${BASH_SOURCE[0]}")/../circuits/benchmarks/scripts" && pwd)/zk_cli_helpers.sh" +source "$ZK_CLI_HELPERS" + +ALL_PRESETS=("insecure-512" "secure-8192" "secure-16384") +ALL_COMMITTEES=("minimum" "micro" "small") +DEFAULT_OUTPUT="$REPO_ROOT/dist/circuit-codegen" + +# Canonical circuit list. Mirrors `circuits/benchmarks/config.json`; entries are either +# a plain path string (`"dkg/pk"`) or a `{name, modes}` object (`config`). +CONFIG_JSON="$REPO_ROOT/circuits/benchmarks/config.json" +mapfile -t ALL_CIRCUITS < <(jq -r '.circuits[] | if type == "object" then .name else . end' "$CONFIG_JSON") + +SELECT_PRESETS=() +SELECT_COMMITTEES=() +SELECT_CIRCUITS=() +OUTPUT="$DEFAULT_OUTPUT" + +while [[ $# -gt 0 ]]; do + case "$1" in + --preset) + if [[ "$2" == "all" ]]; then + SELECT_PRESETS=("${ALL_PRESETS[@]}") + else + SELECT_PRESETS+=("$2") + fi + shift 2 + ;; + --committee) + if [[ "$2" == "all" ]]; then + SELECT_COMMITTEES=("${ALL_COMMITTEES[@]}") + else + SELECT_COMMITTEES+=("$2") + fi + shift 2 + ;; + --circuits) + IFS=',' read -r -a SELECT_CIRCUITS <<< "$2" + shift 2 + ;; + --output) + OUTPUT="$2" + shift 2 + ;; + --strict) + # Abort on the first codegen failure. Without it, infeasible (preset, committee) + # combinations (e.g. a smudging bound violating the correctness budget) are + # recorded in `failures.txt` and the sweep continues. + STRICT=1 + shift + ;; + -h|--help) + echo "Usage: $0 [--preset insecure-512|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] [--strict]" + exit 0 + ;; + *) + echo "Unknown option: $1" >&2 + exit 1 + ;; + esac +done + +# Defaults when the flags were not given: use everything. +[[ ${#SELECT_PRESETS[@]} -eq 0 ]] && SELECT_PRESETS=("${ALL_PRESETS[@]}") +[[ ${#SELECT_COMMITTEES[@]} -eq 0 ]] && SELECT_COMMITTEES=("${ALL_COMMITTEES[@]}") +[[ ${#SELECT_CIRCUITS[@]} -eq 0 ]] && SELECT_CIRCUITS=("${ALL_CIRCUITS[@]}") + +# map circuit path -> exact zk_cli preset name (BfvPreset::name, e.g. SECURE_THRESHOLD_16384) +preset_to_zk_name() { + case "$1" in + insecure-512) echo "INSECURE_THRESHOLD_512" ;; + secure-8192) echo "SECURE_THRESHOLD_8192" ;; + secure-16384) echo "SECURE_THRESHOLD_16384" ;; + *) echo "Error: unknown preset $1" >&2; return 1 ;; + esac +} + +echo "🔮 Generating circuit configs: presets=[${SELECT_PRESETS[*]}] committees=[${SELECT_COMMITTEES[*]}]" +echo " circuits=$(( ${#SELECT_CIRCUITS[@]} )) output=$OUTPUT" + +mkdir -p "$OUTPUT" + +STRICT="${STRICT:-0}" +declare -a MANIFEST +declare -a FAILURES + +for preset in "${SELECT_PRESETS[@]}"; do + zk_preset="$(preset_to_zk_name "$preset")" + for committee in "${SELECT_COMMITTEES[@]}"; do + for circuit_path in "${SELECT_CIRCUITS[@]}"; do + out_dir="$OUTPUT/$preset/$committee/$circuit_path" + mkdir -p "$out_dir" + printf -v man "%s\t%s\t%s" "$preset" "$committee" "$circuit_path" + MANIFEST+=("$man") + + zk_args="$(get_zk_args "$circuit_path" || true)" + zk_circuit="${zk_args%% *}" + if [[ "$zk_args" == *" "* ]]; then + zk_inputs="${zk_args#* }" + else + zk_inputs="" + fi + + if [[ "$zk_circuit" == "_no_zk_cli" ]]; then + # `config` circuit has no witness inputs; emit an empty Prover.toml so nargo runs. + touch "$out_dir/Prover.toml" + echo " . $preset/$committee/$circuit_path (no zk_cli)" + continue + fi + + cmd=(cargo run -q -p e3-zk-helpers --bin zk_cli -- + --circuit "$zk_circuit" + --preset "$zk_preset" + --committee "$committee" + --output "$out_dir" + --toml) + if [[ -n "$zk_inputs" ]]; then + cmd+=(--inputs "$zk_inputs") + fi + + echo " → $preset/$committee/$circuit_path (zk_cli --circuit $zk_circuit --preset $zk_preset --committee $committee)" + if "${cmd[@]}"; then + : # success + else + printf -v fail "%s\t%s\t%s\t(zk_cli %s %s failed)" "$preset" "$committee" "$circuit_path" "$zk_circuit" "$zk_inputs" + FAILURES+=("$fail") + if [[ "$STRICT" == "1" ]]; then + echo " ✗ $preset/$committee/$circuit_path failed (strict mode) — aborting" >&2 + exit 1 + fi + echo " ✗ $preset/$committee/$circuit_path failed (recorded; continue)" >&2 + fi + done + done +done + +printf '%s\n' "${MANIFEST[@]}" > "$OUTPUT/manifest.txt" +if [[ ${#FAILURES[@]} -gt 0 ]]; then + printf '%s\n' "${FAILURES[@]}" > "$OUTPUT/failures.txt" + echo "⚠ ${#FAILURES[@]} infeasible/invalid combination(s); see $OUTPUT/failures.txt" +else + rm -f "$OUTPUT/failures.txt" +fi +echo "✔ Wrote $(wc -l < "$OUTPUT/manifest.txt") entries + manifest to $OUTPUT" \ No newline at end of file From e5ad0f0052a3545fe689ade5389efa772363b267 Mon Sep 17 00:00:00 2001 From: 0xjei Date: Thu, 3 Sep 2026 15:56:55 +0200 Subject: [PATCH 5/9] feat: add secure-16384 BFV preset --- .github/workflows/ci.yml | 14 +- Cargo.lock | 48 +- agent/CONTEXT.md | 18 +- agent/INVARIANTS.md | 20 +- agent/RULES.md | 3 +- .../flow-trace/03_E3_REQUEST_AND_COMMITTEE.md | 2 +- agent/flow-trace/04_DKG_AND_COMPUTATION.md | 16 +- agent/prompts/switch-committee.md | 5 +- circuits/benchmarks/README.md | 22 +- .../benchmark_run_meta.json | 2 +- .../crisp_verify_gas.json | 2 +- .../integration_summary.json | 2 +- .../results_insecure_agg_micro/report.md | 2 +- .../benchmark_run_meta.json | 2 +- .../integration_summary.json | 2 +- .../results_insecure_minimum/report.md | 2 +- .../scripts/benchmark_output_dir.sh | 7 +- .../scripts/check_circuit_preset_artifacts.sh | 8 +- .../scripts/ensure_circuit_preset_built.sh | 8 +- .../scripts/extract_crisp_verify_gas.sh | 10 +- .../scripts/generate_prover_toml.sh | 10 +- .../scripts/replay_folded_verify_gas.sh | 2 +- circuits/benchmarks/scripts/run_benchmarks.sh | 51 +- circuits/bin/config/README.md | 4 +- circuits/bin/config/src/main.nr | 109 +- circuits/lib/src/README.md | 4 +- circuits/lib/src/configs/committee/active.nr | 8 +- .../lib/src/configs/committee/micro/mod.nr | 3 +- .../committee/micro/parity_insecure.nr | 2 +- .../configs/committee/micro/parity_secure.nr | 38 - .../committee/micro/parity_secure_16384.nr | 52 + .../committee/micro/parity_secure_8192.nr | 38 + .../src/configs/committee/micro/smudging.nr | 11 +- .../lib/src/configs/committee/minimum/mod.nr | 3 +- .../committee/minimum/parity_insecure.nr | 2 +- .../committee/minimum/parity_secure_16384.nr | 22 + ...parity_secure.nr => parity_secure_8192.nr} | 8 +- .../src/configs/committee/minimum/smudging.nr | 11 +- .../lib/src/configs/committee/small/mod.nr | 3 +- .../committee/small/parity_insecure.nr | 2 +- .../committee/small/parity_secure_16384.nr | 1127 + ...parity_secure.nr => parity_secure_8192.nr} | 302 +- .../src/configs/committee/small/smudging.nr | 11 +- circuits/lib/src/configs/default/mod.nr | 2 +- circuits/lib/src/configs/insecure/dkg.nr | 9 +- .../lib/src/configs/insecure/threshold.nr | 20 +- circuits/lib/src/configs/mod.nr | 3 +- circuits/lib/src/configs/secure_16384/dkg.nr | 116 + .../configs/{secure => secure_16384}/mod.nr | 0 .../lib/src/configs/secure_16384/threshold.nr | 82113 ++++++++++++++++ .../configs/{secure => secure_8192}/dkg.nr | 53 +- circuits/lib/src/configs/secure_8192/mod.nr | 8 + .../{secure => secure_8192}/threshold.nr | 49245 ++++----- crates/evm-helpers/src/contracts.rs | 2 +- crates/evm/src/interfold/events.rs | 2 +- crates/fhe-params/src/bin/search_params.rs | 2 +- crates/fhe-params/src/builder.rs | 2 +- crates/fhe-params/src/constants.rs | 30 +- crates/fhe-params/src/presets.rs | 48 +- crates/fhe-params/src/search/bfv.rs | 4 +- crates/tests/tests/integration.rs | 2 +- crates/wasm/src/lib.rs | 4 +- crates/zk-helpers/README.md | 2 +- .../src/bin/generate_config_modules.rs | 653 + .../src/bin/generate_parity_matrices.rs | 37 +- crates/zk-helpers/src/bin/zk_cli.rs | 9 +- .../circuits/dkg/share_computation/codegen.rs | 2 +- .../dkg/share_encryption/computation.rs | 21 +- .../threshold/pk_generation/codegen.rs | 5 +- .../user_data_encryption/computation.rs | 20 +- crates/zk-helpers/src/utils.rs | 18 +- crates/zk-prover/src/backend/download.rs | 36 +- crates/zk-prover/src/prover.rs | 2 +- crates/zk-prover/tests/backend_tests.rs | 2 +- crates/zk-prover/tests/common/helpers.rs | 2 +- .../tests/fold_accumulators_e2e_tests.rs | 6 +- docs/pages/internals/dkg.mdx | 6 +- docs/pages/noir-circuits.mdx | 6 +- docs/pages/sdk.mdx | 2 +- docs/pages/tutorials/deploy-to-testnet.mdx | 2 +- examples/CRISP/Cargo.lock | 275 +- examples/CRISP/RELEASING.md | 18 +- examples/CRISP/Readme.md | 2 +- examples/CRISP/circuits/bin/crisp/src/main.nr | 4 +- .../circuits/bin/crisp_onchain/src/main.nr | 4 +- examples/CRISP/circuits/bin/fold/src/main.nr | 4 +- .../circuits/bin/fold_onchain/src/main.nr | 4 +- examples/CRISP/circuits/lib/src/utils.nr | 8 +- examples/CRISP/client/src/utils/circuits.ts | 4 +- examples/CRISP/client/vite.config.ts | 2 +- examples/CRISP/crates/zk-inputs/src/lib.rs | 4 +- examples/CRISP/crisp.dev.env.example | 4 +- .../CRISP/docs/PROOF_AGGREGATION_AND_ZK.md | 10 +- .../verifiers/CRISPOnchainVerifier.sol | 6 +- .../contracts/verifiers/CRISPVerifier.sol | 6 +- .../tests/crisp.contracts.test.ts | 4 +- .../tests/input-tree-e2e.test.ts | 4 +- .../tests/onchain-census.test.ts | 4 +- examples/CRISP/packages/crisp-sdk/README.md | 4 +- .../CRISP/packages/crisp-sdk/package.json | 18 +- .../CRISP/packages/crisp-sdk/src/circuits.ts | 8 +- .../presets/{insecure-512.ts => insecure.ts} | 14 +- ...unavailable.ts => insecure.unavailable.ts} | 6 +- .../crisp-sdk/tests/client-circuits.test.ts | 10 +- .../packages/crisp-sdk/tests/encoding.test.ts | 2 +- .../packages/crisp-sdk/tests/vote.test.ts | 2 +- .../CRISP/packages/crisp-sdk/tsup.config.js | 2 +- .../program/tests/onchain_root_agreement.rs | 2 +- examples/CRISP/scripts/build-presets.mjs | 8 +- examples/CRISP/scripts/check-presets.mjs | 8 +- .../CRISP/scripts/check-staged-preset.mjs | 2 +- examples/CRISP/scripts/circuit-sources.mjs | 2 +- examples/CRISP/scripts/lib/dev_config.sh | 6 +- examples/CRISP/scripts/publish.ts | 12 +- .../CRISP/scripts/stage-preset-artifacts.mjs | 2 +- examples/CRISP/server/src/config.rs | 2 +- .../contracts/lib/ActiveCryptoConfig.sol | 6 +- .../micro/DecryptionAggregatorVerifier.sol | 0 .../micro/DkgAggregatorVerifier.sol | 0 .../small/DecryptionAggregatorVerifier.sol | 0 .../small/DkgAggregatorVerifier.sol | 0 .../scripts/benchmarkGasFromRaw.ts | 6 +- .../scripts/protocol/constants.ts | 16 +- .../scripts/protocol/deployContracts.ts | 2 +- packages/interfold-contracts/scripts/utils.ts | 14 +- .../interfold-contracts/tasks/interfold.ts | 2 +- .../test/fixtures/constants.ts | 2 +- packages/interfold-sdk/README.md | 2 +- .../interfold-sdk/scripts/compile-circuits.sh | 2 +- packages/interfold-sdk/src/crypto/types.ts | 3 +- packages/interfold-sdk/src/utils.ts | 2 +- packages/interfold-sdk/tests/sdk.test.ts | 8 +- scripts/README.md | 45 +- scripts/build-circuits.ts | 40 +- scripts/check-committee.sh | 24 +- scripts/circuit-artifacts.test.ts | 2 +- scripts/circuit-constants.ts | 10 +- scripts/generate-circuit-configs.sh | 12 +- scripts/generate-verifiers.ts | 14 +- templates/default/scripts/lib/dev_config.sh | 6 +- tests/integration/lib/prebuild.sh | 6 +- 141 files changed, 109713 insertions(+), 25502 deletions(-) delete mode 100644 circuits/lib/src/configs/committee/micro/parity_secure.nr create mode 100644 circuits/lib/src/configs/committee/micro/parity_secure_16384.nr create mode 100644 circuits/lib/src/configs/committee/micro/parity_secure_8192.nr create mode 100644 circuits/lib/src/configs/committee/minimum/parity_secure_16384.nr rename circuits/lib/src/configs/committee/minimum/{parity_secure.nr => parity_secure_8192.nr} (71%) create mode 100644 circuits/lib/src/configs/committee/small/parity_secure_16384.nr rename circuits/lib/src/configs/committee/small/{parity_secure.nr => parity_secure_8192.nr} (63%) create mode 100644 circuits/lib/src/configs/secure_16384/dkg.nr rename circuits/lib/src/configs/{secure => secure_16384}/mod.nr (100%) create mode 100644 circuits/lib/src/configs/secure_16384/threshold.nr rename circuits/lib/src/configs/{secure => secure_8192}/dkg.nr (66%) create mode 100644 circuits/lib/src/configs/secure_8192/mod.nr rename circuits/lib/src/configs/{secure => secure_8192}/threshold.nr (63%) create mode 100644 crates/zk-helpers/src/bin/generate_config_modules.rs rename examples/CRISP/packages/crisp-sdk/src/presets/{insecure-512.ts => insecure.ts} (73%) rename examples/CRISP/packages/crisp-sdk/src/presets/{insecure-512.unavailable.ts => insecure.unavailable.ts} (63%) rename packages/interfold-contracts/contracts/verifiers/bfv/honk/{insecure-512 => insecure}/micro/DecryptionAggregatorVerifier.sol (100%) rename packages/interfold-contracts/contracts/verifiers/bfv/honk/{insecure-512 => insecure}/micro/DkgAggregatorVerifier.sol (100%) rename packages/interfold-contracts/contracts/verifiers/bfv/honk/{insecure-512 => insecure}/small/DecryptionAggregatorVerifier.sol (100%) rename packages/interfold-contracts/contracts/verifiers/bfv/honk/{insecure-512 => insecure}/small/DkgAggregatorVerifier.sol (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 970c01bd04..b003c21ec2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -268,8 +268,8 @@ jobs: - name: Stage source-aligned circuit fixtures run: | chmod +x .ci-noir/bin/bb - mkdir -p dist/circuits/insecure-512 - cp -R .ci-noir/circuits/insecure-512/minimum dist/circuits/insecure-512/ + mkdir -p dist/circuits/insecure + cp -R .ci-noir/circuits/insecure/minimum dist/circuits/insecure/ - name: Run Integration Tests env: @@ -949,7 +949,7 @@ jobs: chmod +x /usr/local/bin/bb - name: Build interfold circuits - run: pnpm build:circuits --preset insecure-512 --committee minimum --skip-if-built + run: pnpm build:circuits --preset insecure --committee minimum --skip-if-built - name: Install and verify candidate circuits working-directory: ./examples/CRISP @@ -1072,12 +1072,12 @@ jobs: --check \ --no-compile done <<'EOF' - insecure-512 micro - insecure-512 small + insecure micro + insecure small secure-8192 minimum secure-8192 micro secure-8192 small - insecure-512 minimum + insecure minimum EOF # Asserted before the upload, so a step that consumes or clears a build output fails in the @@ -1449,7 +1449,7 @@ jobs: chmod +x /usr/local/bin/bb - name: Build interfold circuits - run: pnpm build:circuits --preset insecure-512 --committee minimum --skip-if-built + run: pnpm build:circuits --preset insecure --committee minimum --skip-if-built - name: Install and verify candidate circuits working-directory: ./templates/default diff --git a/Cargo.lock b/Cargo.lock index 9bf136d6b1..60f61d7688 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -924,7 +924,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_json", "serde_with", @@ -1234,7 +1234,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -1245,7 +1245,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -3082,7 +3082,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ab67060fc6b8ef687992d439ca0fa36e7ed17e9a0b16b25b601e8757df720de" dependencies = [ "data-encoding", - "syn 2.0.117", + "syn 1.0.109", ] [[package]] @@ -3267,7 +3267,7 @@ dependencies = [ "libc", "option-ext", "redox_users 0.5.2", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -4520,7 +4520,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4628,8 +4628,8 @@ dependencies = [ [[package]] name = "fhe" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#525bc84c4fc0dc2089053c4c9297c6445189fd9e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" dependencies = [ "bincode", "doc-comment", @@ -4654,8 +4654,8 @@ dependencies = [ [[package]] name = "fhe-math" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#525bc84c4fc0dc2089053c4c9297c6445189fd9e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" dependencies = [ "ethnum", "fhe-traits", @@ -4678,16 +4678,16 @@ dependencies = [ [[package]] name = "fhe-traits" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#525bc84c4fc0dc2089053c4c9297c6445189fd9e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" dependencies = [ "rand 0.9.4", ] [[package]] name = "fhe-util" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#525bc84c4fc0dc2089053c4c9297c6445189fd9e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" dependencies = [ "num-bigint-dig", "num-traits", @@ -5883,7 +5883,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -7118,7 +7118,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -7478,7 +7478,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] @@ -7687,7 +7687,7 @@ checksum = "9cd31dcfdbbd7431a807ef4df6edd6473228e94d5c805e8cf671227a21bad068" dependencies = [ "anyhow", "clap", - "itertools 0.15.0", + "itertools 0.13.0", "proc-macro2", "quote", "rand 0.8.5", @@ -8088,7 +8088,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", - "itertools 0.14.0", + "itertools 0.13.0", "log", "multimap", "petgraph", @@ -8107,7 +8107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.13.0", "proc-macro2", "quote", "syn 2.0.117", @@ -8120,7 +8120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.13.0", "proc-macro2", "quote", "syn 2.0.117", @@ -8820,7 +8820,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -9760,7 +9760,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -10673,7 +10673,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] diff --git a/agent/CONTEXT.md b/agent/CONTEXT.md index ebd5d3baed..dc641776f6 100644 --- a/agent/CONTEXT.md +++ b/agent/CONTEXT.md @@ -26,7 +26,7 @@ output — every step backed by ZK proofs verified on-chain. | Committee | Ciphernodes serving an E3. Sizes `(N, T, H)`: `minimum` (3,1,2), `micro` (9,4,5), `small` (19,9,10) | | DKG | Distributed key generation — joint threshold public key, no party holds the full secret | | BFV / TrBFV | Brakerski–Fan–Vercauteren FHE scheme / its threshold (publicly verifiable) variant | -| Preset | BFV parameter set: `insecure-512` (dev/CI default) or `secure-8192` | +| Preset | BFV parameter set: `insecure` (dev/CI default), `secure-8192`, or `secure-16384` | | C0–C7 | ZK circuit IDs across the DKG/decryption pipeline (map below) | | Sortition | Random committee selection (`crates/sortition`) | | Slashing | Fault attribution, accusation quorum, commitment consistency (`crates/slashing`) | @@ -76,8 +76,10 @@ The protocol release can carry more than one circuit artifact set. Current deplo matrix: - Ethereum mainnet supports `secure-8192/minimum`, `secure-8192/micro`, and `secure-8192/small`. -- Sepolia and local chains support `insecure-512` and `secure-8192` with `minimum`, `micro`, and +- Sepolia and local chains support `insecure` and `secure-8192` with `minimum`, `micro`, and `small` committees. +- `secure-16384` is available for circuit generation but is not enabled in the current chain + deployment matrix. `ActiveCryptoConfig.sol` selects the parameter sets and committee shapes supported by `block.chainid`. Deployment tooling mirrors that matrix with `bfvConfigsForChain(chainId)` and reads @@ -123,9 +125,11 @@ opentelemetry/tracing. - **Threshold** (`circuits/bin/threshold/`): C1 `pk_generation` · C5 `pk_aggregation` · P3 `user_data_encryption_ct0/ct1` (+ wrapper) · C6 `share_decryption` · C7 `decrypted_shares_aggregation` -- **Recursive aggregation** (`circuits/bin/recursive_aggregation/`): fold kernels (`c2ab_chunk_fold`, - `c3_fold`, `c6_fold`, `node_fold`, `nodes_fold`, …) and the top-level `dkg_aggregator` / - `decryption_aggregator`, which produce the on-chain Honk verifiers. The canonical committed root - matches `(insecure-512, minimum)`; other generated pairs live under `honk///`. +- **Recursive aggregation** (`circuits/bin/recursive_aggregation/`): fold kernels + (`c2ab_chunk_fold`, `c3_fold`, `c6_fold`, `node_fold`, `nodes_fold`, …) and the top-level + `dkg_aggregator` / `decryption_aggregator`, which produce the on-chain Honk verifiers. The + canonical committed root matches `(insecure, minimum)`; other generated pairs live under + `honk///`. - `config` circuit validates preset constants (CRT moduli, bounds, parity matrices). Parity matrices - are generated by the Rust `generate_parity_matrices` binary — never hand-edit. + for `insecure`, `secure-8192`, and `secure-16384` are generated by the Rust + `generate_parity_matrices` binary — never hand-edit. diff --git a/agent/INVARIANTS.md b/agent/INVARIANTS.md index d380077e2e..526ef63835 100644 --- a/agent/INVARIANTS.md +++ b/agent/INVARIANTS.md @@ -192,7 +192,7 @@ design citation alone does not establish current runtime behavior. must preserve the complete `uint256`. — `Interfold.initialize`; `flow-trace/03` - A request can select only the parameter set and committee shape in `ActiveCryptoConfig.sol`. Mainnet supports `secure-8192` with `minimum`, `micro`, and `small` committees. Sepolia and local - chains support `insecure-512` and `secure-8192` with `minimum`, `micro`, and `small` committees. + chains support `insecure` and `secure-8192` with `minimum`, `micro`, and `small` committees. Governance cannot enable a different parameter hash, `[H, N]`, or verifier threshold without rebuilding the circuits and contracts for that pair. The request supplies the expected configuration ID, which binds the scheme, parameter hash, and circuit version; committee size is @@ -340,12 +340,12 @@ design citation alone does not establish current runtime behavior. - Committee `(N, T, H)` and each complete BFV parameter tuple must stay synchronized. The tuple is defined for deployment in `packages/interfold-contracts/scripts/protocol/constants.ts`, for ciphernodes in `crates/fhe-params/src/constants.rs`, and for circuits in - `circuits/lib/src/configs/{insecure,secure}/threshold.nr`. Committee values also appear in - `circuits/lib/src/configs/committee/active.nr`, `packages/interfold-contracts/scripts/utils.ts`, - `crates/zk-helpers/src/ciphernodes_committee.rs`, and - `packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol`. The generated Solidity and - TypeScript values bind the BFV parameter-set hashes and configuration IDs. The gate verifies the - tuple, the circuit error bound, and every runtime configuration-ID copy. The local + `circuits/lib/src/configs/{insecure,secure_8192,secure_16384}/threshold.nr`. Committee values also + appear in `circuits/lib/src/configs/committee/active.nr`, + `packages/interfold-contracts/scripts/utils.ts`, `crates/zk-helpers/src/ciphernodes_committee.rs`, + and `packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol`. The generated Solidity + and TypeScript values bind the BFV parameter-set hashes and configuration IDs. The gate verifies + the tuple, the circuit error bound, and every runtime configuration-ID copy. The local `circuits/bin/.active-preset.json` cache may differ from the production chain pair. Drift means a deployment can register parameters that ciphernodes or circuits do not implement. Regenerate configuration constants with `pnpm build:circuits sync-config --preset --committee `; @@ -355,8 +355,8 @@ design citation alone does not establish current runtime behavior. and `CiphernodesCommitteeSize::values()`. — `scripts/circuit-constants.ts` - Wrapper Solidity verifiers (`BfvPkVerifier`, `BfvDecryptionVerifier`) have an `(H, T)`-specific public-input layout and must be redeployed on committee change. -- Parity matrices (`parity_{insecure,secure}.nr`) are derived artifacts regenerated from preset - `QIS` + committee `(N, T)`; hand-edits are caught by regenerate-and-diff. +- Parity matrices (`parity_{insecure,secure_8192,secure_16384}.nr`) are derived artifacts + regenerated from preset `QIS` + committee `(N, T)`; hand-edits are caught by regenerate-and-diff. ### Noir / Barretenberg compatibility @@ -375,7 +375,7 @@ design citation alone does not establish current runtime behavior. release workflow rejects a different value because the ciphernode resolves both the GitHub release and `circuits-{version}.tar.gz` from this field. - A circuit release archive that supports current deployments must include every - `insecure-512/{minimum,micro,small}` and `secure-8192/{minimum,micro,small}` pair. Each pair has a + `insecure/{minimum,micro,small}` and `secure-8192/{minimum,micro,small}` pair. Each pair has a build stamp with the exact preset, committee, and source hash. `checksums.json` and `SHA256SUMS` must cover the archive contents. Nodes select the artifact directory from the E3's on-chain parameter set and committee size. diff --git a/agent/RULES.md b/agent/RULES.md index 968cf813f7..b7c2122545 100644 --- a/agent/RULES.md +++ b/agent/RULES.md @@ -71,7 +71,8 @@ For Rust work, read both `agent/ARCHITECTURE.md` (contribution rules) and Two orthogonal axes pick what gets compiled into `circuits/bin/`: -- **Preset** (`--preset insecure-512` [default] | `secure-8192`): the BFV parameter set. +- **Preset** (`--preset insecure` [default] | `secure-8192` | `secure-16384`): the BFV parameter + set. - **Committee** (`--committee minimum` [default] | `micro` | `small`): `(N, T, H)` for the secret-sharing committee. Mirrors `e3_zk_helpers::CiphernodesCommitteeSize`. diff --git a/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md b/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md index cf489bb6c4..9179544267 100644 --- a/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md +++ b/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md @@ -75,7 +75,7 @@ Requester calls: Interfold.request({ │ ├─ Validate the requested crypto configuration against the chain matrix. │ │ The caller selects (paramSet, committeeSize); the target chain must support that pair. │ │ Mainnet supports secure-8192 with minimum, micro, and small committees. -│ │ Sepolia and local chains support insecure-512 and secure-8192 with all committee sizes. +│ │ Sepolia and local chains support insecure and secure-8192 with all committee sizes. │ │ A different parameter hash, committee shape, or verifier H/T is rejected. │ │ CI derives and compares the full BFV tuple across deployment code, Rust, and Noir. │ ├─ inputWindow[0] >= block.timestamp (start in future) diff --git a/agent/flow-trace/04_DKG_AND_COMPUTATION.md b/agent/flow-trace/04_DKG_AND_COMPUTATION.md index 1adbd5a6f5..f3137fdfca 100644 --- a/agent/flow-trace/04_DKG_AND_COMPUTATION.md +++ b/agent/flow-trace/04_DKG_AND_COMPUTATION.md @@ -309,16 +309,16 @@ ProofRequestActor receives ThresholdSharePending ``` **C2 proofs:** For each C2a/C2b request, the prover builds chunk proofs and a type-bound terminal -proof for `sk_share_computation_chunk` / `esm_share_computation_chunk`. That terminal `Proof` is what -`PendingThresholdProofs` stores and what gets ECDSA-signed for gossip +proof for `sk_share_computation_chunk` / `esm_share_computation_chunk`. That terminal `Proof` is +what `PendingThresholdProofs` stores and what gets ECDSA-signed for gossip (`ProofType::C2aSkShareComputation` / `C2bESmShareComputation`). The old generic `recursive_aggregation/wrapper/*` circuits and two-proof `recursive_aggregation/fold` were removed; -aggregation is done by ad-hoc Noir bins under -`circuits/bin/recursive_aggregation/` (e.g. `c2ab_chunk_fold`, `c3ab_fold`, `c6_fold`, `node_fold`, -`nodes_fold`, `dkg_aggregator`, `decryption_aggregator` — `nodes_fold` chains `H` `node_fold` proofs -for `dkg_aggregator`; `decryption_aggregator` folds C6 via non-ZK `c6_fold` then checks C7 with ZK). -The per-circuit `wrapper/` Noir step was removed; aggregator response structs no longer carry a -`wrapped_proof` field — the inner recursive proof itself is what flows between stages. +aggregation is done by ad-hoc Noir bins under `circuits/bin/recursive_aggregation/` (e.g. +`c2ab_chunk_fold`, `c3ab_fold`, `c6_fold`, `node_fold`, `nodes_fold`, `dkg_aggregator`, +`decryption_aggregator` — `nodes_fold` chains `H` `node_fold` proofs for `dkg_aggregator`; +`decryption_aggregator` folds C6 via non-ZK `c6_fold` then checks C7 with ZK). The per-circuit +`wrapper/` Noir step was removed; aggregator response structs no longer carry a `wrapped_proof` +field — the inner recursive proof itself is what flows between stages. The chunked C2 path keeps the same signed proof multiplicity. For each C2a/C2b request, Rust generates one type-bound recursive proof per chunk. The default chunk size is 512 coefficients. The diff --git a/agent/prompts/switch-committee.md b/agent/prompts/switch-committee.md index 386afaa7aa..4e25a8ee26 100644 --- a/agent/prompts/switch-committee.md +++ b/agent/prompts/switch-committee.md @@ -4,7 +4,8 @@ Tool-neutral body for the switch-committee command/skill. Tool adapters point he to change the procedure. Input: a committee name `minimum` | `micro` | `small`, optionally -`--preset insecure-512 | secure-8192`. Supported pairs live in `scripts/circuit-constants.ts`. +`--preset insecure | secure-8192 | secure-16384`. Supported pairs live in +`scripts/circuit-constants.ts`. Rules — read `agent/INVARIANTS.md` §Committee config sync first: @@ -17,7 +18,7 @@ Rules — read `agent/INVARIANTS.md` §Committee config sync first: 3. Verify with `pnpm check:committee` and report its output. 4. Remind the user of the operational consequences: wrapper Solidity verifiers (`BfvPkVerifier`, `BfvDecryptionVerifier`) have an `(H, T)`-specific public-input layout and must be redeployed; - committed verifiers exist only for `(insecure-512, minimum)`; `crates/zk-helpers` + committed verifiers exist only for `(insecure, minimum)`; `crates/zk-helpers` `CiphernodesCommitteeSize` must agree (check:committee covers this). 5. If artifacts are needed without a local rebuild, `pnpm store:circuits pull` fetches the cached ones from the `circuit-artifacts` branch. diff --git a/circuits/benchmarks/README.md b/circuits/benchmarks/README.md index 17cdf3894a..b73d7d9353 100644 --- a/circuits/benchmarks/README.md +++ b/circuits/benchmarks/README.md @@ -44,30 +44,34 @@ test, gas-extraction script, and report will all pick it up automatically. # 1. Pick the committee. This regenerates committee/active.nr, default/mod.nr, # and patches BFV_DKG_H / BFV_THRESHOLD_T in utils.ts atomically. It also writes # the committee into circuits/bin/.active-preset.json. -pnpm build:circuits --preset insecure-512 --committee micro +pnpm build:circuits --preset insecure --committee micro # 2. (Optional) Verify the four files agree. pnpm check:committee # → ✓ check:committee: micro (H=5, T=4) consistent across active.nr, utils.ts, .active-preset.json # 3. Run the benchmark (--committee must match step 1; test_trbfv_actor reads circuits/bin/.active-preset.json). -./circuits/benchmarks/run_benchmarks.sh --mode insecure --committee micro +./circuits/benchmarks/run_benchmarks.sh --preset insecure --committee micro # 4. To go back to minimum, run step 1 again with --committee minimum. -pnpm build:circuits --preset insecure-512 --committee minimum +pnpm build:circuits --preset insecure --committee minimum ``` **All `(preset, committee)` pairs are supported.** The parity matrices in -`circuits/lib/src/configs/committee//parity_{insecure,secure}.nr` are auto-generated by the -`generate_parity_matrices` Rust binary, invoked from `scripts/build-circuits.ts` whenever the -committee changes. The values are deterministic functions of the committee's `(N, T)` and the -preset's threshold `QIS`, so any pair compiles and proves correctly. +`circuits/lib/src/configs/committee//parity_{insecure,secure_8192,secure_16384}.nr` are +auto-generated by the `generate_parity_matrices` Rust binary, invoked from +`scripts/build-circuits.ts` whenever the committee changes. The values are deterministic functions +of the committee's `(N, T)` and the preset's threshold `QIS`, so any pair compiles and proves +correctly. **Skipping the build step:** `pnpm check:committee` runs in the pre-push hook and fails the push if `active.nr`, `utils.ts`, `.active-preset.json`, or any committed `parity_*.nr` disagree with what `build:circuits --committee ` would produce. Always use `pnpm build:circuits --committee` to switch; manual edits to those files will trip the check. +Use `--preset secure-16384` to benchmark the third circuit preset. Secure presets use the `secure` +benchmark mode internally, but each preset has its own generated artifacts and output directory. + ### Proof aggregation and folding (integration) The gas / integration stage always runs `cargo test -p e3-tests test_trbfv_actor` with the @@ -224,10 +228,10 @@ you ran insecure benchmarks after a secure build), the build script **hydrates** compile once per preset until circuit sources change. Then `pnpm generate:verifiers --check --no-compile --preset ` verifies that `dist/circuits//` is built and `circuits/bin/.active-preset.json` matches the benchmark mode -(`insecure-512` for `--mode insecure`, `secure-8192` for `--mode secure`). For **insecure** runs it +(`insecure` for `--mode insecure`, `secure-8192` for `--mode secure`). For **insecure** runs it also diffs the committed Honk Solidity verifiers (`DkgAggregatorVerifier.sol`, `DecryptionAggregatorVerifier.sol`) against the current insecure VKs. For **secure** runs it skips -that `.sol` diff (committed verifiers stay pinned to `insecure-512` for production deploy); gas +that `.sol` diff (committed verifiers stay pinned to `insecure` for production deploy); gas replay deploys fresh aggregator verifiers from `circuits/bin` at runtime. If you see preset mismatch or insecure drift errors, follow the fix recipe printed by the script. diff --git a/circuits/benchmarks/results_insecure_agg_micro/benchmark_run_meta.json b/circuits/benchmarks/results_insecure_agg_micro/benchmark_run_meta.json index cbe70d92cb..c5532c2fa7 100644 --- a/circuits/benchmarks/results_insecure_agg_micro/benchmark_run_meta.json +++ b/circuits/benchmarks/results_insecure_agg_micro/benchmark_run_meta.json @@ -1,6 +1,6 @@ { "benchmark_mode": "insecure", - "bfv_preset_subdir": "insecure-512", + "bfv_preset_subdir": "insecure", "committee": "micro", "proof_aggregation": true, "multithread_jobs": 13, diff --git a/circuits/benchmarks/results_insecure_agg_micro/crisp_verify_gas.json b/circuits/benchmarks/results_insecure_agg_micro/crisp_verify_gas.json index acd94b141f..a3de7fef9f 100644 --- a/circuits/benchmarks/results_insecure_agg_micro/crisp_verify_gas.json +++ b/circuits/benchmarks/results_insecure_agg_micro/crisp_verify_gas.json @@ -31,7 +31,7 @@ "integration_test": "test_trbfv_actor", "benchmark_config": { "mode": "insecure", - "bfv_preset_subdir": "insecure-512", + "bfv_preset_subdir": "insecure", "bfv_preset": "InsecureThreshold512", "lambda": 2, "proof_aggregation_enabled": true, diff --git a/circuits/benchmarks/results_insecure_agg_micro/integration_summary.json b/circuits/benchmarks/results_insecure_agg_micro/integration_summary.json index 2ded58496b..62a59b7283 100644 --- a/circuits/benchmarks/results_insecure_agg_micro/integration_summary.json +++ b/circuits/benchmarks/results_insecure_agg_micro/integration_summary.json @@ -2,7 +2,7 @@ "integration_test": "test_trbfv_actor", "benchmark_config": { "mode": "insecure", - "bfv_preset_subdir": "insecure-512", + "bfv_preset_subdir": "insecure", "bfv_preset": "InsecureThreshold512", "lambda": 2, "proof_aggregation_enabled": true, diff --git a/circuits/benchmarks/results_insecure_agg_micro/report.md b/circuits/benchmarks/results_insecure_agg_micro/report.md index 5a0553ebaa..03a0e26b79 100644 --- a/circuits/benchmarks/results_insecure_agg_micro/report.md +++ b/circuits/benchmarks/results_insecure_agg_micro/report.md @@ -16,7 +16,7 @@ Settings for this benchmark run (integration test + Nargo circuit benches on the | Setting | Value | | ----------------------------------------------------- | -------------------------------------------- | | Benchmark mode | `insecure` | -| BFV preset (artifacts) | `insecure-512` | +| BFV preset (artifacts) | `insecure` | | BFV preset (enum) | `InsecureThreshold512` | | λ (smudging / error) | 2 | | Nodes spawned (builder) | 20 | diff --git a/circuits/benchmarks/results_insecure_minimum/benchmark_run_meta.json b/circuits/benchmarks/results_insecure_minimum/benchmark_run_meta.json index c517849e4a..894c5888a9 100644 --- a/circuits/benchmarks/results_insecure_minimum/benchmark_run_meta.json +++ b/circuits/benchmarks/results_insecure_minimum/benchmark_run_meta.json @@ -1,6 +1,6 @@ { "benchmark_mode": "insecure", - "bfv_preset_subdir": "insecure-512", + "bfv_preset_subdir": "insecure", "committee": "minimum", "proof_aggregation": true, "multithread_jobs": 13, diff --git a/circuits/benchmarks/results_insecure_minimum/integration_summary.json b/circuits/benchmarks/results_insecure_minimum/integration_summary.json index 53094ae431..02109601c7 100644 --- a/circuits/benchmarks/results_insecure_minimum/integration_summary.json +++ b/circuits/benchmarks/results_insecure_minimum/integration_summary.json @@ -2,7 +2,7 @@ "integration_test": "test_trbfv_actor", "benchmark_config": { "mode": "insecure", - "bfv_preset_subdir": "insecure-512", + "bfv_preset_subdir": "insecure", "bfv_preset": "InsecureThreshold512", "lambda": 2, "proof_aggregation_enabled": true, diff --git a/circuits/benchmarks/results_insecure_minimum/report.md b/circuits/benchmarks/results_insecure_minimum/report.md index e019e5b384..b21b933c8f 100644 --- a/circuits/benchmarks/results_insecure_minimum/report.md +++ b/circuits/benchmarks/results_insecure_minimum/report.md @@ -16,7 +16,7 @@ Settings for this benchmark run (integration test + Nargo circuit benches on the | Setting | Value | | ----------------------------------------------------- | -------------------------------------------- | | Benchmark mode | `insecure` | -| BFV preset (artifacts) | `insecure-512` | +| BFV preset (artifacts) | `insecure` | | BFV preset (enum) | `InsecureThreshold512` | | λ (smudging / error) | 2 | | Nodes spawned (builder) | 7 | diff --git a/circuits/benchmarks/scripts/benchmark_output_dir.sh b/circuits/benchmarks/scripts/benchmark_output_dir.sh index 76add49e46..63039fb793 100644 --- a/circuits/benchmarks/scripts/benchmark_output_dir.sh +++ b/circuits/benchmarks/scripts/benchmark_output_dir.sh @@ -9,6 +9,7 @@ # results_insecure_minimum # results_insecure_micro # results_secure_small +# results_secure-16384_small # # Proof aggregation is always enabled in the benchmark harness. Committee sizes are # minimum, micro, or small. @@ -18,7 +19,11 @@ benchmark_results_dir_basename() { local mode="$1" local committee="${2:-minimum}" local base="${BENCHMARK_OUTPUT_DIR_BASE:-results}" - echo "${base}_${mode}_${committee}" + local preset_suffix="" + if [ "${BENCHMARK_PRESET:-}" = "secure-16384" ]; then + preset_suffix="-16384" + fi + echo "${base}_${mode}${preset_suffix}_${committee}" } # Full path under BENCHMARKS_DIR (set by caller). diff --git a/circuits/benchmarks/scripts/check_circuit_preset_artifacts.sh b/circuits/benchmarks/scripts/check_circuit_preset_artifacts.sh index 35278e61e4..ba9ef82f8b 100755 --- a/circuits/benchmarks/scripts/check_circuit_preset_artifacts.sh +++ b/circuits/benchmarks/scripts/check_circuit_preset_artifacts.sh @@ -2,17 +2,17 @@ # Verify dist + circuits/bin artifacts exist for a benchmark preset. # Exit 0 if ready, 1 if not (prints missing paths on stderr). # -# Usage: ./check_circuit_preset_artifacts.sh [--committee minimum|micro|small] +# Usage: ./check_circuit_preset_artifacts.sh [--committee minimum|micro|small] set -e PRESET="${1:-}" if [ -z "$PRESET" ]; then - echo "Usage: $0 [--committee minimum|micro|small]" >&2 + echo "Usage: $0 [--committee minimum|micro|small]" >&2 exit 1 fi -if [ "$PRESET" != "insecure-512" ] && [ "$PRESET" != "secure-8192" ]; then - echo "Error: preset must be insecure-512 or secure-8192" >&2 +if [ "$PRESET" != "insecure" ] && [ "$PRESET" != "secure-8192" ] && [ "$PRESET" != "secure-16384" ]; then + echo "Error: preset must be insecure, secure-8192, or secure-16384" >&2 exit 1 fi diff --git a/circuits/benchmarks/scripts/ensure_circuit_preset_built.sh b/circuits/benchmarks/scripts/ensure_circuit_preset_built.sh index 0ec4dbdf79..b1d2ec90a2 100755 --- a/circuits/benchmarks/scripts/ensure_circuit_preset_built.sh +++ b/circuits/benchmarks/scripts/ensure_circuit_preset_built.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Ensure Noir circuit artifacts exist for a benchmark preset (insecure-512 | secure-8192). +# Ensure Noir circuit artifacts exist for a benchmark preset (insecure | secure-8192 | secure-16384). # # Usage (from repo root): # ./circuits/benchmarks/scripts/ensure_circuit_preset_built.sh [--committee minimum|micro|small] [--force-build] [--verbose] @@ -15,7 +15,7 @@ FORCE_BUILD=false VERBOSE=false usage() { - echo "Usage: $0 [--committee minimum|micro|small] [--force-build] [--verbose]" + echo "Usage: $0 [--committee minimum|micro|small] [--force-build] [--verbose]" } require_arg_value() { @@ -73,8 +73,8 @@ if [ -z "$PRESET" ]; then usage exit 1 fi -if [ "$PRESET" != "insecure-512" ] && [ "$PRESET" != "secure-8192" ]; then - echo "Error: preset must be insecure-512 or secure-8192" +if [ "$PRESET" != "insecure" ] && [ "$PRESET" != "secure-8192" ] && [ "$PRESET" != "secure-16384" ]; then + echo "Error: preset must be insecure, secure-8192, or secure-16384" exit 1 fi diff --git a/circuits/benchmarks/scripts/extract_crisp_verify_gas.sh b/circuits/benchmarks/scripts/extract_crisp_verify_gas.sh index ec0b753bb6..e5cfd5c540 100755 --- a/circuits/benchmarks/scripts/extract_crisp_verify_gas.sh +++ b/circuits/benchmarks/scripts/extract_crisp_verify_gas.sh @@ -110,10 +110,14 @@ RAW_DIR="${OUTPUT_DIR}/raw" # Ensure recursive/noir VK variants exist for integration-based folded-proof export. # This populates target artifacts required by `test_trbfv_actor`. -if [ "$MODE" = "secure" ]; then +if [ "${BENCHMARK_PRESET:-}" = "secure-16384" ]; then + PRESET_NAME="secure-16384" +elif [ "${BENCHMARK_PRESET:-}" = "secure-8192" ]; then + PRESET_NAME="secure-8192" +elif [ "$MODE" = "secure" ]; then PRESET_NAME="secure-8192" else - PRESET_NAME="insecure-512" + PRESET_NAME="insecure" fi require_preset_artifacts() { @@ -137,7 +141,7 @@ else echo " [gas] Build artifacts ready." # Align circuits/bin with PRESET_NAME, then verify preset artifacts. - # insecure: also diff committed Honk .sol (pinned to insecure-512). + # insecure: also diff committed Honk .sol (pinned to insecure). # secure: committed .sol stay insecure-only; gas replay deploys fresh verifiers from bin. echo " [gas] Verifying circuit preset '${PRESET_NAME}' (dist stamp + circuits/bin)..." if [ "$VERBOSE" = true ]; then diff --git a/circuits/benchmarks/scripts/generate_prover_toml.sh b/circuits/benchmarks/scripts/generate_prover_toml.sh index c79b0a6f95..71a2663b4a 100755 --- a/circuits/benchmarks/scripts/generate_prover_toml.sh +++ b/circuits/benchmarks/scripts/generate_prover_toml.sh @@ -3,7 +3,7 @@ # generate_prover_toml.sh - Generates Prover.toml (and configs.nr) for a circuit via zk_cli # Usage: ./generate_prover_toml.sh # circuit_path: e.g. "dkg/pk" or "threshold/share_decryption" -# mode: "insecure" or "secure" +# mode: "insecure" or "secure"; set BENCHMARK_PRESET for the exact BFV preset # repo_root: absolute path to repository root (where Cargo.toml and circuits/ live) set -e @@ -25,8 +25,12 @@ if [ "$MODE" != "insecure" ] && [ "$MODE" != "secure" ]; then exit 1 fi -PRESET="insecure" -[ "$MODE" = "secure" ] && PRESET="secure" +PRESET="INSECURE_THRESHOLD_512" +if [ "${BENCHMARK_PRESET:-}" = "secure-8192" ]; then + PRESET="SECURE_THRESHOLD_8192" +elif [ "${BENCHMARK_PRESET:-}" = "secure-16384" ]; then + PRESET="SECURE_THRESHOLD_16384" +fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck source=load_default_committee.sh diff --git a/circuits/benchmarks/scripts/replay_folded_verify_gas.sh b/circuits/benchmarks/scripts/replay_folded_verify_gas.sh index 84c9f9cab2..b70da4d266 100755 --- a/circuits/benchmarks/scripts/replay_folded_verify_gas.sh +++ b/circuits/benchmarks/scripts/replay_folded_verify_gas.sh @@ -113,7 +113,7 @@ echo " [replay-gas] Running Hardhat benchmarkGasFromRaw.ts (folded proofs)..." BENCHMARK_RAW_DIR="$RAW_DIR" \ BENCHMARK_GAS_OUTPUT="$TMP_GAS_PARTIAL" \ BENCHMARK_FOLDED_JSON="$TMP_FOLDED" \ - BENCHMARK_PRESET="${BUILD_PRESET:-insecure-512}" \ + BENCHMARK_PRESET="${BUILD_PRESET:-insecure}" \ pnpm hardhat run scripts/benchmarkGasFromRaw.ts --network hardhat ) diff --git a/circuits/benchmarks/scripts/run_benchmarks.sh b/circuits/benchmarks/scripts/run_benchmarks.sh index 59f4e53062..2d527f0e1b 100755 --- a/circuits/benchmarks/scripts/run_benchmarks.sh +++ b/circuits/benchmarks/scripts/run_benchmarks.sh @@ -2,6 +2,7 @@ # run_benchmarks.sh - Main orchestration script for benchmarking circuits # Usage: ./run_benchmarks.sh [--config ] [--mode insecure|secure] +# [--preset insecure|secure-8192|secure-16384] # [--committee minimum|micro|small] [--circuit ] # [--skip-compile] [--bench-compile] [--clean] [--verbose] # [--multithread-jobs N] @@ -15,6 +16,7 @@ source "${SCRIPT_DIR}/benchmark_output_dir.sh" CONFIG_FILE="${BENCHMARKS_DIR}/config.json" CLEAN_ARTIFACTS=false MODE_OVERRIDE="" +PRESET_OVERRIDE="" COMMITTEE_OVERRIDE="" SKIP_COMPILE=false BENCH_COMPILE=false @@ -39,6 +41,17 @@ while [[ $# -gt 0 ]]; do fi shift 2 ;; + --preset) + PRESET_OVERRIDE="$2" + case "$PRESET_OVERRIDE" in + insecure|secure-8192|secure-16384) ;; + *) + echo "Error: --preset must be insecure|secure-8192|secure-16384" + exit 1 + ;; + esac + shift 2 + ;; --committee) COMMITTEE_OVERRIDE="$2" case "$COMMITTEE_OVERRIDE" in @@ -76,7 +89,7 @@ while [[ $# -gt 0 ]]; do ;; *) echo "Unknown option: $1" - echo "Usage: $0 [--config ] [--mode insecure|secure] [--committee minimum|micro|small] [--circuit ] [--skip-compile] [--bench-compile] [--clean] [--verbose] [--multithread-jobs N]" + echo "Usage: $0 [--config ] [--mode insecure|secure] [--preset insecure|secure-8192|secure-16384] [--committee minimum|micro|small] [--circuit ] [--skip-compile] [--bench-compile] [--clean] [--verbose] [--multithread-jobs N]" exit 1 ;; esac @@ -130,6 +143,23 @@ if [ "$MODE" != "insecure" ] && [ "$MODE" != "secure" ]; then exit 1 fi +if [ -n "$PRESET_OVERRIDE" ]; then + if [ "$PRESET_OVERRIDE" = "insecure" ]; then + MODE="insecure" + else + MODE="secure" + fi +fi + +if [ -n "$PRESET_OVERRIDE" ]; then + PRESET_NAME="$PRESET_OVERRIDE" +elif [ "$MODE" = "secure" ]; then + PRESET_NAME="secure-8192" +else + PRESET_NAME="insecure" +fi +export BENCHMARK_PRESET="$PRESET_NAME" + # Monorepo root (benchmarks live in circuits/benchmarks, so go up two levels) REPO_ROOT="$(cd "${BENCHMARKS_DIR}/../.." && pwd)" # Circuits live under circuits/bin (bin_dir is relative to benchmarks dir, e.g. ../bin) @@ -167,18 +197,22 @@ BENCHMARK_OUTPUT_DIR_BASE="$OUTPUT_DIR_BASE" OUTPUT_DIR="$(benchmark_results_dir_basename "$MODE" "$OUTPUT_COMMITTEE")" mkdir -p "${BENCHMARKS_DIR}/${OUTPUT_DIR}/raw" -# For secure mode, patch lib to use secure configs (restored at end) +# For secure mode, patch lib to use the selected secure config (restored at end) DEFAULT_MOD_NR="${REPO_ROOT}/circuits/lib/src/configs/default/mod.nr" DEFAULT_MOD_BACKUP="" if [ "$MODE" = "secure" ] && [ -f "$DEFAULT_MOD_NR" ]; then DEFAULT_MOD_BACKUP="${DEFAULT_MOD_NR}.benchmark_backup" cp "$DEFAULT_MOD_NR" "$DEFAULT_MOD_BACKUP" + CONFIG_MODULE="secure_8192" + if [ "$PRESET_NAME" = "secure-16384" ]; then + CONFIG_MODULE="secure_16384" + fi if sed --version 2>/dev/null | grep -q GNU; then - sed -i 's|super::insecure::|super::secure::|g' "$DEFAULT_MOD_NR" + sed -i "s|super::insecure::|super::${CONFIG_MODULE}::|g" "$DEFAULT_MOD_NR" else - sed -i '' 's|super::insecure::|super::secure::|g' "$DEFAULT_MOD_NR" + sed -i '' "s|super::insecure::|super::${CONFIG_MODULE}::|g" "$DEFAULT_MOD_NR" fi - echo " Patched lib configs to secure (will restore)" + echo " Patched lib configs to ${CONFIG_MODULE} (will restore)" fi # Store git info @@ -218,11 +252,6 @@ echo "" # Preflight build for selected preset so raw benches and integration stages # use consistent, freshly-generated circuit artifacts. if [ "$SKIP_COMPILE" = false ]; then - if [ "$MODE" = "secure" ]; then - PRESET_NAME="secure-8192" - else - PRESET_NAME="insecure-512" - fi ENSURE_ARGS=("$PRESET_NAME" --committee "$OUTPUT_COMMITTEE") if [ "$VERBOSE" = true ]; then ENSURE_ARGS+=(--verbose) @@ -346,7 +375,7 @@ MT_JOBS_JSON="${BENCHMARK_MULTITHREAD_JOBS:-1}" load_committee_by_name "$OUTPUT_COMMITTEE" "$REPO_ROOT" jq -n \ --arg mode "$MODE" \ - --arg preset "$([ "$MODE" = "secure" ] && echo "secure-8192" || echo "insecure-512")" \ + --arg preset "$PRESET_NAME" \ --arg committee "$OUTPUT_COMMITTEE" \ --argjson proof_agg true \ --argjson multithread_jobs "$MT_JOBS_JSON" \ diff --git a/circuits/bin/config/README.md b/circuits/bin/config/README.md index f84ec18629..ca42fadc1b 100644 --- a/circuits/bin/config/README.md +++ b/circuits/bin/config/README.md @@ -1,10 +1,10 @@ # `config` -Pre-deployment circuit: checks **secure** DKG + threshold config constants (CRT, bounds, +Pre-deployment circuit: checks the active DKG and threshold config constants (CRT, bounds, Reed–Solomon parity matrices, cross-file consistency). | | | | ---------- | -------------------------------------------------------------- | -| **Source** | [`src/main.nr`](src/main.nr) (uses `lib/src/configs/secure/`) | +| **Source** | [`src/main.nr`](src/main.nr) (uses `lib/src/configs/default/`) | | **Index** | [Circuit package index](../../README.md#circuit-package-index) | | **Docs** | [Noir Circuits](../../../docs/pages/noir-circuits.mdx) | diff --git a/circuits/bin/config/src/main.nr b/circuits/bin/config/src/main.nr index 214bd0bd1e..5921c6135c 100644 --- a/circuits/bin/config/src/main.nr +++ b/circuits/bin/config/src/main.nr @@ -19,18 +19,20 @@ /// - BFV and Threshold BFV parameter sets are mutually consistent use lib::configs::default::{N_PARTIES, T}; -use lib::configs::secure::dkg::{ - L as DKG_L, L_THRESHOLD, N as DKG_N, PARITY_MATRIX, PLAINTEXT_MODULUS as DKG_PLAINTEXT_MODULUS, - Q_MOD_T as DKG_Q_MOD_T, Q_MOD_T_CENTERED as DKG_Q_MOD_T_CENTERED, QIS as DKG_QIS, QIS_THRESHOLD, +use lib::configs::default::dkg::{ + DKG_ERROR_BOUND, L as DKG_L, L_THRESHOLD, N as DKG_N, PARITY_MATRIX, + PLAINTEXT_MODULUS as DKG_PLAINTEXT_MODULUS, Q_MOD_T as DKG_Q_MOD_T, + Q_MOD_T_CENTERED as DKG_Q_MOD_T_CENTERED, QIS as DKG_QIS, QIS_THRESHOLD, SHARE_ENCRYPTION_E0_BOUND, SHARE_ENCRYPTION_E1_BOUND, SHARE_ENCRYPTION_K0IS, SHARE_ENCRYPTION_MSG_BOUND, SHARE_ENCRYPTION_P1_BOUNDS, SHARE_ENCRYPTION_P2_BOUNDS, SHARE_ENCRYPTION_PK_BOUNDS, SHARE_ENCRYPTION_R1_LOW_BOUNDS, SHARE_ENCRYPTION_R1_UP_BOUNDS, SHARE_ENCRYPTION_R2_BOUNDS, SHARE_ENCRYPTION_U_BOUND, }; -use lib::configs::secure::threshold::{ +use lib::configs::default::threshold::{ // Structural parameters - N as THRESHOLD_N, L as THRESHOLD_L, PARAMS_SEARCH_Z as N_CIPHERTEXTS, + N as THRESHOLD_N, L as THRESHOLD_L, PARAMS_MULT_DEPTH, PARAMS_TWO_POW_LAMBDA_PLUS_ONE, + PARAMS_SEARCH_Z as N_CIPHERTEXTS, // Moduli QIS as THRESHOLD_QIS, // Derived values @@ -38,7 +40,7 @@ use lib::configs::secure::threshold::{ Q_MOD_T_CENTERED as THRESHOLD_Q_MOD_T_CENTERED, Q_INVERSE_MOD_T as THRESHOLD_Q_INVERSE_MOD_T, // pk_generation bounds PK_GENERATION_EEK_BOUND, PK_GENERATION_SK_BOUND, PK_GENERATION_E_SM_BOUND, - PK_GENERATION_R1_BOUNDS, PK_GENERATION_R2_BOUNDS, PK_GENERATION_B_ENC, + PK_GENERATION_R1_BOUNDS, PK_GENERATION_R2_BOUNDS, PARAMS_SMUDGING_B_ENC, // share_decryption bounds THRESHOLD_SHARE_DECRYPTION_R1_BOUNDS, THRESHOLD_SHARE_DECRYPTION_R2_BOUNDS, // user_data_encryption bounds @@ -201,20 +203,15 @@ fn verify_dkg_bounds() { // u_bound = 1 (ternary) assert(SHARE_ENCRYPTION_U_BOUND == 1, "SHARE_ENCRYPTION_U_BOUND should be 1 for ternary"); - // e0_bound = 20 - assert(SHARE_ENCRYPTION_E0_BOUND == 20, "SHARE_ENCRYPTION_E0_BOUND should be 20"); - - // e1_bound = 20 - assert(SHARE_ENCRYPTION_E1_BOUND == 20, "SHARE_ENCRYPTION_E1_BOUND should be 20"); + // e0_bound and e1_bound use the DKG error sampler support. + assert(SHARE_ENCRYPTION_E0_BOUND == DKG_ERROR_BOUND, "SHARE_ENCRYPTION_E0_BOUND mismatch"); + assert(SHARE_ENCRYPTION_E1_BOUND == DKG_ERROR_BOUND, "SHARE_ENCRYPTION_E1_BOUND mismatch"); // msg_bound = t - 1 assert(SHARE_ENCRYPTION_MSG_BOUND as u128 == t - 1, "SHARE_ENCRYPTION_MSG_BOUND mismatch"); - // ptxt bounds for r1 calculation - let ptxt_up_bound: u128 = (t - 1) / 2; - - // Check if t is even or odd for ptxt_low calculation - let t_is_even: bool = (t % 2) == 0; + // Plaintext coefficients are encoded in [0, t). + let ptxt_up_bound: u128 = t - 1; for i in 0..DKG_L { let qi: u128 = DKG_QIS[i] as u128; @@ -263,12 +260,8 @@ fn verify_dkg_bounds() { "SHARE_ENCRYPTION_R1_UP_BOUNDS mismatch", ); - // r1_low_bounds[i] depends on whether t is even or odd - let expected_r1_low: u128 = if t_is_even { - ((ptxt_up_bound + 1) * k0i + ((n * u_bound + 2) * qi_bound + e0_bound_i)) / qi - } else { - expected_r1_up - }; + // r1_low_bounds[i] uses the lower plaintext bound of zero. + let expected_r1_low: u128 = ((n * u_bound + 2) * qi_bound + e0_bound_i) / qi; assert( SHARE_ENCRYPTION_R1_LOW_BOUNDS[i] as u128 == expected_r1_low, "SHARE_ENCRYPTION_R1_LOW_BOUNDS mismatch", @@ -376,10 +369,8 @@ fn verify_pk_generation_bounds() { /// /// The smudging noise bound is critical for threshold decryption security. /// It's computed as: e_sm_bound = 2^lambda * N_CIPHERTEXTS * (b_fresh + Q_MOD_T) -/// where b_fresh = N * e_norm + b_enc + N * b_e * sk_norm and lambda = 50. -/// -/// The 2^50 factor provides 50 bits of statistical security, ensuring that -/// decryption shares don't leak secret key information. +/// where b_fresh = N * e_norm + b_enc + N * b_e * sk_norm. The bound includes the +/// configured statistical security level and multiplicative-depth noise recursion. fn verify_e_sm_bound() { let n: Field = THRESHOLD_N as Field; let committee_n: Field = N_PARTIES as Field; @@ -389,16 +380,37 @@ fn verify_e_sm_bound() { let num_ciphertexts: Field = N_CIPHERTEXTS as Field; // b_fresh = N * e_norm + b_enc + N * b_e * sk_norm - let b_fresh = n * e_norm + PK_GENERATION_B_ENC + n * b_e * sk_norm; + let b_fresh = n * e_norm + PARAMS_SMUDGING_B_ENC + n * b_e * sk_norm; // b_c = N_CIPHERTEXTS * (b_fresh + Q_MOD_T) - let b_c = num_ciphertexts * (b_fresh + THRESHOLD_Q_MOD_T); + let b_c_additive = num_ciphertexts * (b_fresh + THRESHOLD_Q_MOD_T); - // 2^50 - let two_pow_50: Field = 0x4000000000000; + // Prop. 20 multiplicative-depth recursion. + let b_c = if PARAMS_MULT_DEPTH == 0 { + b_c_additive + } else { + let l: Field = THRESHOLD_L as Field; + let mut b_g: Field = THRESHOLD_QIS[0]; + for i in 1..THRESHOLD_L { + if (THRESHOLD_QIS[i] as u128) > (b_g as u128) { + b_g = THRESHOLD_QIS[i]; + } + } + let k: Field = THRESHOLD_PLAINTEXT_MODULUS; + let n_sk: Field = committee_n; + let aggregate_b_e = committee_n * b_e; + let b_relin = n * l * n_sk * b_g * aggregate_b_e + + 2 * n * n * l * l * n_sk * n_sk * b_g * aggregate_b_e; + let coeff = 2 * k * n * n * n_sk; + let mut b = b_c_additive; + for _ in 0..PARAMS_MULT_DEPTH { + b = coeff * b + b_relin; + } + b + }; - // e_sm_bound = 2^50 * b_c - let expected_e_sm_bound = two_pow_50 * b_c; + // e_sm_bound = 2^(lambda + 1) * degree * b_c. + let expected_e_sm_bound = PARAMS_TWO_POW_LAMBDA_PLUS_ONE * n * b_c; assert(expected_e_sm_bound == PK_GENERATION_E_SM_BOUND, "PK_GENERATION_E_SM_BOUND mismatch"); } @@ -444,36 +456,29 @@ fn verify_user_data_encryption_bounds() { // u_bound = 1 (ternary) assert(USER_DATA_ENCRYPTION_U_BOUND == 1, "USER_DATA_ENCRYPTION_U_BOUND should be 1"); - // e1_bound = 20 (variance * 2) + // e1_bound = 20 (threshold error variance * 2) assert(USER_DATA_ENCRYPTION_E1_BOUND == 20, "USER_DATA_ENCRYPTION_E1_BOUND should be 20"); - // e0_bound = sqrt(3 * error1_variance) = PK_GENERATION_B_ENC (same parameter set) + // e0_bound follows the configured threshold error sampler. assert( - USER_DATA_ENCRYPTION_E0_BOUND == PK_GENERATION_B_ENC, - "USER_DATA_ENCRYPTION_E0_BOUND should equal PK_GENERATION_B_ENC", + (USER_DATA_ENCRYPTION_E0_BOUND as u128) > 0, + "USER_DATA_ENCRYPTION_E0_BOUND must be positive", ); - // k1_up_bound = (t - 1) / 2 = 49 - let expected_k1_up: u128 = (t - 1) / 2; + // k1 bounds use the plaintext interval [0, t). + let expected_k1_low: u128 = 0; + let expected_k1_up: u128 = t - 1; assert( USER_DATA_ENCRYPTION_K1_UP_BOUND as u128 == expected_k1_up, "USER_DATA_ENCRYPTION_K1_UP_BOUND mismatch", ); - - // k1_low_bound = (t - 1) / 2 + 1 = 50 (for even t) - let t_is_even: bool = (t % 2) == 0; - let expected_k1_low: u128 = if t_is_even { - expected_k1_up + 1 - } else { - expected_k1_up - }; assert( USER_DATA_ENCRYPTION_K1_LOW_BOUND as u128 == expected_k1_low, "USER_DATA_ENCRYPTION_K1_LOW_BOUND mismatch", ); - // ptxt_up_bound for r1 calculations - let ptxt_up_bound: u128 = (t - 1) / 2; + // Plaintext coefficients are encoded in [0, t). + let ptxt_up_bound: u128 = t - 1; for i in 0..THRESHOLD_L { let qi: u128 = THRESHOLD_QIS[i] as u128; @@ -523,12 +528,8 @@ fn verify_user_data_encryption_bounds() { "USER_DATA_ENCRYPTION_R1_UP_BOUNDS mismatch", ); - // r1_low_bounds[i] for even t - let expected_r1_low: u128 = if t_is_even { - ((ptxt_up_bound + 1) * k0i + ((n * u_bound + 2) * qi_bound + e0_bound_i)) / qi - } else { - expected_r1_up - }; + // r1_low_bounds[i] uses the lower plaintext bound of zero. + let expected_r1_low: u128 = ((n * u_bound + 2) * qi_bound + e0_bound_i) / qi; assert( USER_DATA_ENCRYPTION_R1_LOW_BOUNDS[i] as u128 == expected_r1_low, "USER_DATA_ENCRYPTION_R1_LOW_BOUNDS mismatch", diff --git a/circuits/lib/src/README.md b/circuits/lib/src/README.md index 3aaffeede5..6ad46ef9d8 100644 --- a/circuits/lib/src/README.md +++ b/circuits/lib/src/README.md @@ -51,8 +51,8 @@ flowchart LR ## configs -Switch presets in `configs/default/mod.nr` (`pub use super::secure::dkg` / `threshold`). Each preset -defines `N`, `L`, `QIS`, bounds, `PARITY_MATRIX`, per-circuit `Configs`, and +Switch presets in `configs/default/mod.nr` (`pub use super::secure_8192::dkg` / `threshold`). Each +preset defines `N`, `L`, `QIS`, bounds, `PARITY_MATRIX`, per-circuit `Configs`, and `MAX_MSG_NON_ZERO_COEFFS` (C7 plaintext sparsity). ## Related documentation diff --git a/circuits/lib/src/configs/committee/active.nr b/circuits/lib/src/configs/committee/active.nr index 76b1132c3d..fc9d6f9d27 100644 --- a/circuits/lib/src/configs/committee/active.nr +++ b/circuits/lib/src/configs/committee/active.nr @@ -23,9 +23,11 @@ pub global T: u32 = crate::configs::committee::minimum::T; pub global H: u32 = crate::configs::committee::minimum::H; /// Parity matrices for the secret-sharing scheme, sized for the active committee. -/// `configs::{insecure,secure}::dkg` re-exports the relevant one as `PARITY_MATRIX`. +/// `configs::{insecure,secure_8192,secure_16384}::dkg` re-exports the relevant one as `PARITY_MATRIX`. pub use crate::configs::committee::minimum::parity_insecure::PARITY_MATRIX as PARITY_MATRIX_INSECURE; -pub use crate::configs::committee::minimum::parity_secure::PARITY_MATRIX as PARITY_MATRIX_SECURE; +pub use crate::configs::committee::minimum::parity_secure_16384::PARITY_MATRIX as PARITY_MATRIX_SECURE_16384; +pub use crate::configs::committee::minimum::parity_secure_8192::PARITY_MATRIX as PARITY_MATRIX_SECURE_8192; pub use crate::configs::committee::minimum::smudging::{ - INSECURE_E_SM_BIT, INSECURE_E_SM_BOUND, SECURE_E_SM_BIT, SECURE_E_SM_BOUND, + INSECURE_E_SM_BIT, INSECURE_E_SM_BOUND, SECURE_16384_E_SM_BIT, SECURE_16384_E_SM_BOUND, + SECURE_8192_E_SM_BIT, SECURE_8192_E_SM_BOUND, }; diff --git a/circuits/lib/src/configs/committee/micro/mod.nr b/circuits/lib/src/configs/committee/micro/mod.nr index d24d684739..4387c22364 100644 --- a/circuits/lib/src/configs/committee/micro/mod.nr +++ b/circuits/lib/src/configs/committee/micro/mod.nr @@ -15,5 +15,6 @@ pub global T: u32 = 4; pub global H: u32 = 5; pub mod parity_insecure; -pub mod parity_secure; +pub mod parity_secure_8192; +pub mod parity_secure_16384; pub mod smudging; diff --git a/circuits/lib/src/configs/committee/micro/parity_insecure.nr b/circuits/lib/src/configs/committee/micro/parity_insecure.nr index 1bc267facd..d5362d49ba 100644 --- a/circuits/lib/src/configs/committee/micro/parity_insecure.nr +++ b/circuits/lib/src/configs/committee/micro/parity_insecure.nr @@ -8,7 +8,7 @@ // Regenerate with `pnpm build:circuits --committee micro`. // // Reed-Solomon parity matrix for the micro committee under the -// insecure-512 (L_THRESHOLD=2) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. +// insecure (L_THRESHOLD=2) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. use crate::configs::committee::micro::{N_PARTIES, T}; pub use crate::configs::insecure::threshold::L as L_THRESHOLD; diff --git a/circuits/lib/src/configs/committee/micro/parity_secure.nr b/circuits/lib/src/configs/committee/micro/parity_secure.nr deleted file mode 100644 index f56b077036..0000000000 --- a/circuits/lib/src/configs/committee/micro/parity_secure.nr +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-License-Identifier: LGPL-3.0-only -// -// This file is provided WITHOUT ANY WARRANTY; -// without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. -// -// AUTO-GENERATED by `generate_parity_matrices`. DO NOT EDIT BY HAND. -// Regenerate with `pnpm build:circuits --committee micro`. -// -// Reed-Solomon parity matrix for the micro committee under the -// secure-8192 (L_THRESHOLD=3) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. - -use crate::configs::committee::micro::{N_PARTIES, T}; -pub use crate::configs::secure::threshold::L as L_THRESHOLD; - -pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] = [ - [ - [144115188098531328, 5, 144115188098531319, 10, 144115188098531324, 1, 0, 0, 0, 0], - [144115188098531324, 24, 144115188098531284, 40, 144115188098531314, 0, 1, 0, 0, 0], - [144115188098531314, 70, 144115188098531203, 105, 144115188098531294, 0, 0, 1, 0, 0], - [144115188098531294, 160, 144115188098531049, 224, 144115188098531259, 0, 0, 0, 1, 0], - [144115188098531259, 315, 144115188098530789, 420, 144115188098531203, 0, 0, 0, 0, 1], - ], - [ - [144115188097220608, 5, 144115188097220599, 10, 144115188097220604, 1, 0, 0, 0, 0], - [144115188097220604, 24, 144115188097220564, 40, 144115188097220594, 0, 1, 0, 0, 0], - [144115188097220594, 70, 144115188097220483, 105, 144115188097220574, 0, 0, 1, 0, 0], - [144115188097220574, 160, 144115188097220329, 224, 144115188097220539, 0, 0, 0, 1, 0], - [144115188097220539, 315, 144115188097220069, 420, 144115188097220483, 0, 0, 0, 0, 1], - ], - [ - [144115188094795776, 5, 144115188094795767, 10, 144115188094795772, 1, 0, 0, 0, 0], - [144115188094795772, 24, 144115188094795732, 40, 144115188094795762, 0, 1, 0, 0, 0], - [144115188094795762, 70, 144115188094795651, 105, 144115188094795742, 0, 0, 1, 0, 0], - [144115188094795742, 160, 144115188094795497, 224, 144115188094795707, 0, 0, 0, 1, 0], - [144115188094795707, 315, 144115188094795237, 420, 144115188094795651, 0, 0, 0, 0, 1], - ], -]; diff --git a/circuits/lib/src/configs/committee/micro/parity_secure_16384.nr b/circuits/lib/src/configs/committee/micro/parity_secure_16384.nr new file mode 100644 index 0000000000..bf5f3dbf52 --- /dev/null +++ b/circuits/lib/src/configs/committee/micro/parity_secure_16384.nr @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +// +// AUTO-GENERATED by `generate_parity_matrices`. DO NOT EDIT BY HAND. +// Regenerate with `pnpm build:circuits --committee micro`. +// +// Reed-Solomon parity matrix for the micro committee under the +// secure-16384 (L_THRESHOLD=5) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. + +use crate::configs::committee::micro::{N_PARTIES, T}; +pub use crate::configs::secure_16384::threshold::L as L_THRESHOLD; + +pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] = [ + [ + [1125899917262848, 5, 1125899917262839, 10, 1125899917262844, 1, 0, 0, 0, 0], + [1125899917262844, 24, 1125899917262804, 40, 1125899917262834, 0, 1, 0, 0, 0], + [1125899917262834, 70, 1125899917262723, 105, 1125899917262814, 0, 0, 1, 0, 0], + [1125899917262814, 160, 1125899917262569, 224, 1125899917262779, 0, 0, 0, 1, 0], + [1125899917262779, 315, 1125899917262309, 420, 1125899917262723, 0, 0, 0, 0, 1], + ], + [ + [1125899915886592, 5, 1125899915886583, 10, 1125899915886588, 1, 0, 0, 0, 0], + [1125899915886588, 24, 1125899915886548, 40, 1125899915886578, 0, 1, 0, 0, 0], + [1125899915886578, 70, 1125899915886467, 105, 1125899915886558, 0, 0, 1, 0, 0], + [1125899915886558, 160, 1125899915886313, 224, 1125899915886523, 0, 0, 0, 1, 0], + [1125899915886523, 315, 1125899915886053, 420, 1125899915886467, 0, 0, 0, 0, 1], + ], + [ + [1125899915231232, 5, 1125899915231223, 10, 1125899915231228, 1, 0, 0, 0, 0], + [1125899915231228, 24, 1125899915231188, 40, 1125899915231218, 0, 1, 0, 0, 0], + [1125899915231218, 70, 1125899915231107, 105, 1125899915231198, 0, 0, 1, 0, 0], + [1125899915231198, 160, 1125899915230953, 224, 1125899915231163, 0, 0, 0, 1, 0], + [1125899915231163, 315, 1125899915230693, 420, 1125899915231107, 0, 0, 0, 0, 1], + ], + [ + [1125899915100160, 5, 1125899915100151, 10, 1125899915100156, 1, 0, 0, 0, 0], + [1125899915100156, 24, 1125899915100116, 40, 1125899915100146, 0, 1, 0, 0, 0], + [1125899915100146, 70, 1125899915100035, 105, 1125899915100126, 0, 0, 1, 0, 0], + [1125899915100126, 160, 1125899915099881, 224, 1125899915100091, 0, 0, 0, 1, 0], + [1125899915100091, 315, 1125899915099621, 420, 1125899915100035, 0, 0, 0, 0, 1], + ], + [ + [1125899914510336, 5, 1125899914510327, 10, 1125899914510332, 1, 0, 0, 0, 0], + [1125899914510332, 24, 1125899914510292, 40, 1125899914510322, 0, 1, 0, 0, 0], + [1125899914510322, 70, 1125899914510211, 105, 1125899914510302, 0, 0, 1, 0, 0], + [1125899914510302, 160, 1125899914510057, 224, 1125899914510267, 0, 0, 0, 1, 0], + [1125899914510267, 315, 1125899914509797, 420, 1125899914510211, 0, 0, 0, 0, 1], + ], +]; diff --git a/circuits/lib/src/configs/committee/micro/parity_secure_8192.nr b/circuits/lib/src/configs/committee/micro/parity_secure_8192.nr new file mode 100644 index 0000000000..f59ce0be21 --- /dev/null +++ b/circuits/lib/src/configs/committee/micro/parity_secure_8192.nr @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +// +// AUTO-GENERATED by `generate_parity_matrices`. DO NOT EDIT BY HAND. +// Regenerate with `pnpm build:circuits --committee micro`. +// +// Reed-Solomon parity matrix for the micro committee under the +// secure-8192 (L_THRESHOLD=3) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. + +use crate::configs::committee::micro::{N_PARTIES, T}; +pub use crate::configs::secure_8192::threshold::L as L_THRESHOLD; + +pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] = [ + [ + [288230376164294656, 5, 288230376164294647, 10, 288230376164294652, 1, 0, 0, 0, 0], + [288230376164294652, 24, 288230376164294612, 40, 288230376164294642, 0, 1, 0, 0, 0], + [288230376164294642, 70, 288230376164294531, 105, 288230376164294622, 0, 0, 1, 0, 0], + [288230376164294622, 160, 288230376164294377, 224, 288230376164294587, 0, 0, 0, 1, 0], + [288230376164294587, 315, 288230376164294117, 420, 288230376164294531, 0, 0, 0, 0, 1], + ], + [ + [288230376162459648, 5, 288230376162459639, 10, 288230376162459644, 1, 0, 0, 0, 0], + [288230376162459644, 24, 288230376162459604, 40, 288230376162459634, 0, 1, 0, 0, 0], + [288230376162459634, 70, 288230376162459523, 105, 288230376162459614, 0, 0, 1, 0, 0], + [288230376162459614, 160, 288230376162459369, 224, 288230376162459579, 0, 0, 0, 1, 0], + [288230376162459579, 315, 288230376162459109, 420, 288230376162459523, 0, 0, 0, 0, 1], + ], + [ + [288230376161738752, 5, 288230376161738743, 10, 288230376161738748, 1, 0, 0, 0, 0], + [288230376161738748, 24, 288230376161738708, 40, 288230376161738738, 0, 1, 0, 0, 0], + [288230376161738738, 70, 288230376161738627, 105, 288230376161738718, 0, 0, 1, 0, 0], + [288230376161738718, 160, 288230376161738473, 224, 288230376161738683, 0, 0, 0, 1, 0], + [288230376161738683, 315, 288230376161738213, 420, 288230376161738627, 0, 0, 0, 0, 1], + ], +]; diff --git a/circuits/lib/src/configs/committee/micro/smudging.nr b/circuits/lib/src/configs/committee/micro/smudging.nr index 2fd32f4fd7..c532ba9f4f 100644 --- a/circuits/lib/src/configs/committee/micro/smudging.nr +++ b/circuits/lib/src/configs/committee/micro/smudging.nr @@ -9,7 +9,10 @@ // // C1 and C2b must use the same smudging-noise width as Rust witness generation. -pub global INSECURE_E_SM_BIT: u32 = 30; -pub global INSECURE_E_SM_BOUND: Field = 755367936; -pub global SECURE_E_SM_BIT: u32 = 143; -pub global SECURE_E_SM_BOUND: Field = 8307674973655727997247334808482217984000000; +pub global INSECURE_E_SM_BIT: u32 = 40; +pub global INSECURE_E_SM_BOUND: Field = 773509349376; +pub global SECURE_8192_E_SM_BIT: u32 = 147; +pub global SECURE_8192_E_SM_BOUND: Field = 132922799578493843586011798490434240512000000; +pub global SECURE_16384_E_SM_BIT: u32 = 230; +pub global SECURE_16384_E_SM_BOUND: Field = + 1032283115311840011272733863948125535704007881987290933670380463718400; diff --git a/circuits/lib/src/configs/committee/minimum/mod.nr b/circuits/lib/src/configs/committee/minimum/mod.nr index 8fc1a31bd8..c95d709d9a 100644 --- a/circuits/lib/src/configs/committee/minimum/mod.nr +++ b/circuits/lib/src/configs/committee/minimum/mod.nr @@ -15,5 +15,6 @@ pub global T: u32 = 1; pub global H: u32 = 2; pub mod parity_insecure; -pub mod parity_secure; +pub mod parity_secure_8192; +pub mod parity_secure_16384; pub mod smudging; diff --git a/circuits/lib/src/configs/committee/minimum/parity_insecure.nr b/circuits/lib/src/configs/committee/minimum/parity_insecure.nr index cc9a37c1cc..d8d345e243 100644 --- a/circuits/lib/src/configs/committee/minimum/parity_insecure.nr +++ b/circuits/lib/src/configs/committee/minimum/parity_insecure.nr @@ -8,7 +8,7 @@ // Regenerate with `pnpm build:circuits --committee minimum`. // // Reed-Solomon parity matrix for the minimum committee under the -// insecure-512 (L_THRESHOLD=2) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. +// insecure (L_THRESHOLD=2) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. use crate::configs::committee::minimum::{N_PARTIES, T}; pub use crate::configs::insecure::threshold::L as L_THRESHOLD; diff --git a/circuits/lib/src/configs/committee/minimum/parity_secure_16384.nr b/circuits/lib/src/configs/committee/minimum/parity_secure_16384.nr new file mode 100644 index 0000000000..dc1ce9af97 --- /dev/null +++ b/circuits/lib/src/configs/committee/minimum/parity_secure_16384.nr @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +// +// AUTO-GENERATED by `generate_parity_matrices`. DO NOT EDIT BY HAND. +// Regenerate with `pnpm build:circuits --committee minimum`. +// +// Reed-Solomon parity matrix for the minimum committee under the +// secure-16384 (L_THRESHOLD=5) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. + +use crate::configs::committee::minimum::{N_PARTIES, T}; +pub use crate::configs::secure_16384::threshold::L as L_THRESHOLD; + +pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] = [ + [[1, 1125899917262847, 1, 0], [2, 1125899917262846, 0, 1]], + [[1, 1125899915886591, 1, 0], [2, 1125899915886590, 0, 1]], + [[1, 1125899915231231, 1, 0], [2, 1125899915231230, 0, 1]], + [[1, 1125899915100159, 1, 0], [2, 1125899915100158, 0, 1]], + [[1, 1125899914510335, 1, 0], [2, 1125899914510334, 0, 1]], +]; diff --git a/circuits/lib/src/configs/committee/minimum/parity_secure.nr b/circuits/lib/src/configs/committee/minimum/parity_secure_8192.nr similarity index 71% rename from circuits/lib/src/configs/committee/minimum/parity_secure.nr rename to circuits/lib/src/configs/committee/minimum/parity_secure_8192.nr index eac09cd608..d7792229a1 100644 --- a/circuits/lib/src/configs/committee/minimum/parity_secure.nr +++ b/circuits/lib/src/configs/committee/minimum/parity_secure_8192.nr @@ -11,10 +11,10 @@ // secure-8192 (L_THRESHOLD=3) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. use crate::configs::committee::minimum::{N_PARTIES, T}; -pub use crate::configs::secure::threshold::L as L_THRESHOLD; +pub use crate::configs::secure_8192::threshold::L as L_THRESHOLD; pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] = [ - [[1, 144115188098531327, 1, 0], [2, 144115188098531326, 0, 1]], - [[1, 144115188097220607, 1, 0], [2, 144115188097220606, 0, 1]], - [[1, 144115188094795775, 1, 0], [2, 144115188094795774, 0, 1]], + [[1, 288230376164294655, 1, 0], [2, 288230376164294654, 0, 1]], + [[1, 288230376162459647, 1, 0], [2, 288230376162459646, 0, 1]], + [[1, 288230376161738751, 1, 0], [2, 288230376161738750, 0, 1]], ]; diff --git a/circuits/lib/src/configs/committee/minimum/smudging.nr b/circuits/lib/src/configs/committee/minimum/smudging.nr index c50d1d9b8a..5133c8558e 100644 --- a/circuits/lib/src/configs/committee/minimum/smudging.nr +++ b/circuits/lib/src/configs/committee/minimum/smudging.nr @@ -9,7 +9,10 @@ // // C1 and C2b must use the same smudging-noise width as Rust witness generation. -pub global INSECURE_E_SM_BIT: u32 = 28; -pub global INSECURE_E_SM_BOUND: Field = 252051456; -pub global SECURE_E_SM_BIT: u32 = 143; -pub global SECURE_E_SM_BOUND: Field = 8307674973655725783638045963336024064000000; +pub global INSECURE_E_SM_BIT: u32 = 38; +pub global INSECURE_E_SM_BOUND: Field = 258113273856; +pub global SECURE_8192_E_SM_BIT: u32 = 147; +pub global SECURE_8192_E_SM_BOUND: Field = 132922799578492710218055909775582953472000000; +pub global SECURE_16384_E_SM_BIT: u32 = 224; +pub global SECURE_16384_E_SM_BOUND: Field = + 26316016473840584416218823110719392033971825690485754764222634393600; diff --git a/circuits/lib/src/configs/committee/small/mod.nr b/circuits/lib/src/configs/committee/small/mod.nr index 9a0a9c9181..6a3b5be571 100644 --- a/circuits/lib/src/configs/committee/small/mod.nr +++ b/circuits/lib/src/configs/committee/small/mod.nr @@ -12,5 +12,6 @@ pub global T: u32 = 9; pub global H: u32 = 10; pub mod parity_insecure; -pub mod parity_secure; +pub mod parity_secure_8192; +pub mod parity_secure_16384; pub mod smudging; diff --git a/circuits/lib/src/configs/committee/small/parity_insecure.nr b/circuits/lib/src/configs/committee/small/parity_insecure.nr index 6815d4f3ac..827d31a42d 100644 --- a/circuits/lib/src/configs/committee/small/parity_insecure.nr +++ b/circuits/lib/src/configs/committee/small/parity_insecure.nr @@ -8,7 +8,7 @@ // Regenerate with `pnpm build:circuits --committee small`. // // Reed-Solomon parity matrix for the small committee under the -// insecure-512 (L_THRESHOLD=2) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. +// insecure (L_THRESHOLD=2) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. use crate::configs::committee::small::{N_PARTIES, T}; pub use crate::configs::insecure::threshold::L as L_THRESHOLD; diff --git a/circuits/lib/src/configs/committee/small/parity_secure_16384.nr b/circuits/lib/src/configs/committee/small/parity_secure_16384.nr new file mode 100644 index 0000000000..74ca5417c3 --- /dev/null +++ b/circuits/lib/src/configs/committee/small/parity_secure_16384.nr @@ -0,0 +1,1127 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +// +// AUTO-GENERATED by `generate_parity_matrices`. DO NOT EDIT BY HAND. +// Regenerate with `pnpm build:circuits --committee small`. +// +// Reed-Solomon parity matrix for the small committee under the +// secure-16384 (L_THRESHOLD=5) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. + +use crate::configs::committee::small::{N_PARTIES, T}; +pub use crate::configs::secure_16384::threshold::L as L_THRESHOLD; + +pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] = [ + [ + [ + 1, + 1125899917262839, + 45, + 1125899917262729, + 210, + 1125899917262597, + 210, + 1125899917262729, + 45, + 1125899917262839, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 10, + 1125899917262750, + 440, + 1125899917261694, + 1980, + 1125899917260539, + 1848, + 1125899917261859, + 330, + 1125899917262794, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 55, + 1125899917262309, + 2376, + 1125899917256689, + 10395, + 1125899917250969, + 9240, + 1125899917258097, + 1485, + 1125899917262629, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 220, + 1125899917260704, + 9360, + 1125899917238825, + 40040, + 1125899917217804, + 34320, + 1125899917245689, + 5148, + 1125899917262134, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 715, + 1125899917255919, + 30030, + 1125899917186409, + 126126, + 1125899917122709, + 105105, + 1125899917211369, + 15015, + 1125899917260847, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + [ + 2002, + 1125899917243544, + 83160, + 1125899917052639, + 343980, + 1125899916884471, + 280280, + 1125899917127714, + 38610, + 1125899917257844, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + [ + 5005, + 1125899917214801, + 205920, + 1125899916745409, + 840840, + 1125899916345569, + 672672, + 1125899916942529, + 90090, + 1125899917251409, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + [ + 11440, + 1125899917153454, + 466752, + 1125899916095969, + 1884960, + 1125899915220809, + 1485120, + 1125899916562721, + 194480, + 1125899917238539, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + [ + 24310, + 1125899917031189, + 984555, + 1125899914812401, + 3938220, + 1125899913021689, + 3063060, + 1125899915830769, + 393822, + 1125899917214229, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + [ + 48620, + 1125899916800959, + 1956240, + 1125899912413004, + 7759752, + 1125899908948829, + 5969040, + 1125899914491509, + 755820, + 1125899917170471, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + ], + ], + [ + [ + 1, + 1125899915886583, + 45, + 1125899915886473, + 210, + 1125899915886341, + 210, + 1125899915886473, + 45, + 1125899915886583, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 10, + 1125899915886494, + 440, + 1125899915885438, + 1980, + 1125899915884283, + 1848, + 1125899915885603, + 330, + 1125899915886538, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 55, + 1125899915886053, + 2376, + 1125899915880433, + 10395, + 1125899915874713, + 9240, + 1125899915881841, + 1485, + 1125899915886373, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 220, + 1125899915884448, + 9360, + 1125899915862569, + 40040, + 1125899915841548, + 34320, + 1125899915869433, + 5148, + 1125899915885878, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 715, + 1125899915879663, + 30030, + 1125899915810153, + 126126, + 1125899915746453, + 105105, + 1125899915835113, + 15015, + 1125899915884591, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + [ + 2002, + 1125899915867288, + 83160, + 1125899915676383, + 343980, + 1125899915508215, + 280280, + 1125899915751458, + 38610, + 1125899915881588, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + [ + 5005, + 1125899915838545, + 205920, + 1125899915369153, + 840840, + 1125899914969313, + 672672, + 1125899915566273, + 90090, + 1125899915875153, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + [ + 11440, + 1125899915777198, + 466752, + 1125899914719713, + 1884960, + 1125899913844553, + 1485120, + 1125899915186465, + 194480, + 1125899915862283, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + [ + 24310, + 1125899915654933, + 984555, + 1125899913436145, + 3938220, + 1125899911645433, + 3063060, + 1125899914454513, + 393822, + 1125899915837973, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + [ + 48620, + 1125899915424703, + 1956240, + 1125899911036748, + 7759752, + 1125899907572573, + 5969040, + 1125899913115253, + 755820, + 1125899915794215, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + ], + ], + [ + [ + 1, + 1125899915231223, + 45, + 1125899915231113, + 210, + 1125899915230981, + 210, + 1125899915231113, + 45, + 1125899915231223, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 10, + 1125899915231134, + 440, + 1125899915230078, + 1980, + 1125899915228923, + 1848, + 1125899915230243, + 330, + 1125899915231178, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 55, + 1125899915230693, + 2376, + 1125899915225073, + 10395, + 1125899915219353, + 9240, + 1125899915226481, + 1485, + 1125899915231013, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 220, + 1125899915229088, + 9360, + 1125899915207209, + 40040, + 1125899915186188, + 34320, + 1125899915214073, + 5148, + 1125899915230518, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 715, + 1125899915224303, + 30030, + 1125899915154793, + 126126, + 1125899915091093, + 105105, + 1125899915179753, + 15015, + 1125899915229231, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + [ + 2002, + 1125899915211928, + 83160, + 1125899915021023, + 343980, + 1125899914852855, + 280280, + 1125899915096098, + 38610, + 1125899915226228, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + [ + 5005, + 1125899915183185, + 205920, + 1125899914713793, + 840840, + 1125899914313953, + 672672, + 1125899914910913, + 90090, + 1125899915219793, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + [ + 11440, + 1125899915121838, + 466752, + 1125899914064353, + 1884960, + 1125899913189193, + 1485120, + 1125899914531105, + 194480, + 1125899915206923, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + [ + 24310, + 1125899914999573, + 984555, + 1125899912780785, + 3938220, + 1125899910990073, + 3063060, + 1125899913799153, + 393822, + 1125899915182613, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + [ + 48620, + 1125899914769343, + 1956240, + 1125899910381388, + 7759752, + 1125899906917213, + 5969040, + 1125899912459893, + 755820, + 1125899915138855, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + ], + ], + [ + [ + 1, + 1125899915100151, + 45, + 1125899915100041, + 210, + 1125899915099909, + 210, + 1125899915100041, + 45, + 1125899915100151, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 10, + 1125899915100062, + 440, + 1125899915099006, + 1980, + 1125899915097851, + 1848, + 1125899915099171, + 330, + 1125899915100106, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 55, + 1125899915099621, + 2376, + 1125899915094001, + 10395, + 1125899915088281, + 9240, + 1125899915095409, + 1485, + 1125899915099941, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 220, + 1125899915098016, + 9360, + 1125899915076137, + 40040, + 1125899915055116, + 34320, + 1125899915083001, + 5148, + 1125899915099446, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 715, + 1125899915093231, + 30030, + 1125899915023721, + 126126, + 1125899914960021, + 105105, + 1125899915048681, + 15015, + 1125899915098159, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + [ + 2002, + 1125899915080856, + 83160, + 1125899914889951, + 343980, + 1125899914721783, + 280280, + 1125899914965026, + 38610, + 1125899915095156, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + [ + 5005, + 1125899915052113, + 205920, + 1125899914582721, + 840840, + 1125899914182881, + 672672, + 1125899914779841, + 90090, + 1125899915088721, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + [ + 11440, + 1125899914990766, + 466752, + 1125899913933281, + 1884960, + 1125899913058121, + 1485120, + 1125899914400033, + 194480, + 1125899915075851, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + [ + 24310, + 1125899914868501, + 984555, + 1125899912649713, + 3938220, + 1125899910859001, + 3063060, + 1125899913668081, + 393822, + 1125899915051541, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + [ + 48620, + 1125899914638271, + 1956240, + 1125899910250316, + 7759752, + 1125899906786141, + 5969040, + 1125899912328821, + 755820, + 1125899915007783, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + ], + ], + [ + [ + 1, + 1125899914510327, + 45, + 1125899914510217, + 210, + 1125899914510085, + 210, + 1125899914510217, + 45, + 1125899914510327, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 10, + 1125899914510238, + 440, + 1125899914509182, + 1980, + 1125899914508027, + 1848, + 1125899914509347, + 330, + 1125899914510282, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 55, + 1125899914509797, + 2376, + 1125899914504177, + 10395, + 1125899914498457, + 9240, + 1125899914505585, + 1485, + 1125899914510117, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 220, + 1125899914508192, + 9360, + 1125899914486313, + 40040, + 1125899914465292, + 34320, + 1125899914493177, + 5148, + 1125899914509622, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + ], + [ + 715, + 1125899914503407, + 30030, + 1125899914433897, + 126126, + 1125899914370197, + 105105, + 1125899914458857, + 15015, + 1125899914508335, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + ], + [ + 2002, + 1125899914491032, + 83160, + 1125899914300127, + 343980, + 1125899914131959, + 280280, + 1125899914375202, + 38610, + 1125899914505332, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + ], + [ + 5005, + 1125899914462289, + 205920, + 1125899913992897, + 840840, + 1125899913593057, + 672672, + 1125899914190017, + 90090, + 1125899914498897, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + ], + [ + 11440, + 1125899914400942, + 466752, + 1125899913343457, + 1884960, + 1125899912468297, + 1485120, + 1125899913810209, + 194480, + 1125899914486027, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + ], + [ + 24310, + 1125899914278677, + 984555, + 1125899912059889, + 3938220, + 1125899910269177, + 3063060, + 1125899913078257, + 393822, + 1125899914461717, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + ], + [ + 48620, + 1125899914048447, + 1956240, + 1125899909660492, + 7759752, + 1125899906196317, + 5969040, + 1125899911738997, + 755820, + 1125899914417959, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + ], + ], +]; diff --git a/circuits/lib/src/configs/committee/small/parity_secure.nr b/circuits/lib/src/configs/committee/small/parity_secure_8192.nr similarity index 63% rename from circuits/lib/src/configs/committee/small/parity_secure.nr rename to circuits/lib/src/configs/committee/small/parity_secure_8192.nr index 837a356c2d..de57e0b62f 100644 --- a/circuits/lib/src/configs/committee/small/parity_secure.nr +++ b/circuits/lib/src/configs/committee/small/parity_secure_8192.nr @@ -11,21 +11,21 @@ // secure-8192 (L_THRESHOLD=3) preset. Dimensions: [L_THRESHOLD][N_PARTIES - T][N_PARTIES + 1]. use crate::configs::committee::small::{N_PARTIES, T}; -pub use crate::configs::secure::threshold::L as L_THRESHOLD; +pub use crate::configs::secure_8192::threshold::L as L_THRESHOLD; pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] = [ [ [ 1, - 144115188098531319, + 288230376164294647, 45, - 144115188098531209, + 288230376164294537, 210, - 144115188098531077, + 288230376164294405, 210, - 144115188098531209, + 288230376164294537, 45, - 144115188098531319, + 288230376164294647, 1, 0, 0, @@ -39,15 +39,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 10, - 144115188098531230, + 288230376164294558, 440, - 144115188098530174, + 288230376164293502, 1980, - 144115188098529019, + 288230376164292347, 1848, - 144115188098530339, + 288230376164293667, 330, - 144115188098531274, + 288230376164294602, 0, 1, 0, @@ -61,15 +61,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 55, - 144115188098530789, + 288230376164294117, 2376, - 144115188098525169, + 288230376164288497, 10395, - 144115188098519449, + 288230376164282777, 9240, - 144115188098526577, + 288230376164289905, 1485, - 144115188098531109, + 288230376164294437, 0, 0, 1, @@ -83,15 +83,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 220, - 144115188098529184, + 288230376164292512, 9360, - 144115188098507305, + 288230376164270633, 40040, - 144115188098486284, + 288230376164249612, 34320, - 144115188098514169, + 288230376164277497, 5148, - 144115188098530614, + 288230376164293942, 0, 0, 0, @@ -105,15 +105,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 715, - 144115188098524399, + 288230376164287727, 30030, - 144115188098454889, + 288230376164218217, 126126, - 144115188098391189, + 288230376164154517, 105105, - 144115188098479849, + 288230376164243177, 15015, - 144115188098529327, + 288230376164292655, 0, 0, 0, @@ -127,15 +127,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 2002, - 144115188098512024, + 288230376164275352, 83160, - 144115188098321119, + 288230376164084447, 343980, - 144115188098152951, + 288230376163916279, 280280, - 144115188098396194, + 288230376164159522, 38610, - 144115188098526324, + 288230376164289652, 0, 0, 0, @@ -149,15 +149,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 5005, - 144115188098483281, + 288230376164246609, 205920, - 144115188098013889, + 288230376163777217, 840840, - 144115188097614049, + 288230376163377377, 672672, - 144115188098211009, + 288230376163974337, 90090, - 144115188098519889, + 288230376164283217, 0, 0, 0, @@ -171,15 +171,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 11440, - 144115188098421934, + 288230376164185262, 466752, - 144115188097364449, + 288230376163127777, 1884960, - 144115188096489289, + 288230376162252617, 1485120, - 144115188097831201, + 288230376163594529, 194480, - 144115188098507019, + 288230376164270347, 0, 0, 0, @@ -193,15 +193,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 24310, - 144115188098299669, + 288230376164062997, 984555, - 144115188096080881, + 288230376161844209, 3938220, - 144115188094290169, + 288230376160053497, 3063060, - 144115188097099249, + 288230376162862577, 393822, - 144115188098482709, + 288230376164246037, 0, 0, 0, @@ -215,15 +215,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 48620, - 144115188098069439, + 288230376163832767, 1956240, - 144115188093681484, + 288230376159444812, 7759752, - 144115188090217309, + 288230376155980637, 5969040, - 144115188095759989, + 288230376161523317, 755820, - 144115188098438951, + 288230376164202279, 0, 0, 0, @@ -239,15 +239,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] [ [ 1, - 144115188097220599, + 288230376162459639, 45, - 144115188097220489, + 288230376162459529, 210, - 144115188097220357, + 288230376162459397, 210, - 144115188097220489, + 288230376162459529, 45, - 144115188097220599, + 288230376162459639, 1, 0, 0, @@ -261,15 +261,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 10, - 144115188097220510, + 288230376162459550, 440, - 144115188097219454, + 288230376162458494, 1980, - 144115188097218299, + 288230376162457339, 1848, - 144115188097219619, + 288230376162458659, 330, - 144115188097220554, + 288230376162459594, 0, 1, 0, @@ -283,15 +283,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 55, - 144115188097220069, + 288230376162459109, 2376, - 144115188097214449, + 288230376162453489, 10395, - 144115188097208729, + 288230376162447769, 9240, - 144115188097215857, + 288230376162454897, 1485, - 144115188097220389, + 288230376162459429, 0, 0, 1, @@ -305,15 +305,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 220, - 144115188097218464, + 288230376162457504, 9360, - 144115188097196585, + 288230376162435625, 40040, - 144115188097175564, + 288230376162414604, 34320, - 144115188097203449, + 288230376162442489, 5148, - 144115188097219894, + 288230376162458934, 0, 0, 0, @@ -327,15 +327,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 715, - 144115188097213679, + 288230376162452719, 30030, - 144115188097144169, + 288230376162383209, 126126, - 144115188097080469, + 288230376162319509, 105105, - 144115188097169129, + 288230376162408169, 15015, - 144115188097218607, + 288230376162457647, 0, 0, 0, @@ -349,15 +349,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 2002, - 144115188097201304, + 288230376162440344, 83160, - 144115188097010399, + 288230376162249439, 343980, - 144115188096842231, + 288230376162081271, 280280, - 144115188097085474, + 288230376162324514, 38610, - 144115188097215604, + 288230376162454644, 0, 0, 0, @@ -371,15 +371,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 5005, - 144115188097172561, + 288230376162411601, 205920, - 144115188096703169, + 288230376161942209, 840840, - 144115188096303329, + 288230376161542369, 672672, - 144115188096900289, + 288230376162139329, 90090, - 144115188097209169, + 288230376162448209, 0, 0, 0, @@ -393,15 +393,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 11440, - 144115188097111214, + 288230376162350254, 466752, - 144115188096053729, + 288230376161292769, 1884960, - 144115188095178569, + 288230376160417609, 1485120, - 144115188096520481, + 288230376161759521, 194480, - 144115188097196299, + 288230376162435339, 0, 0, 0, @@ -415,15 +415,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 24310, - 144115188096988949, + 288230376162227989, 984555, - 144115188094770161, + 288230376160009201, 3938220, - 144115188092979449, + 288230376158218489, 3063060, - 144115188095788529, + 288230376161027569, 393822, - 144115188097171989, + 288230376162411029, 0, 0, 0, @@ -437,15 +437,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 48620, - 144115188096758719, + 288230376161997759, 1956240, - 144115188092370764, + 288230376157609804, 7759752, - 144115188088906589, + 288230376154145629, 5969040, - 144115188094449269, + 288230376159688309, 755820, - 144115188097128231, + 288230376162367271, 0, 0, 0, @@ -461,15 +461,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] [ [ 1, - 144115188094795767, + 288230376161738743, 45, - 144115188094795657, + 288230376161738633, 210, - 144115188094795525, + 288230376161738501, 210, - 144115188094795657, + 288230376161738633, 45, - 144115188094795767, + 288230376161738743, 1, 0, 0, @@ -483,15 +483,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 10, - 144115188094795678, + 288230376161738654, 440, - 144115188094794622, + 288230376161737598, 1980, - 144115188094793467, + 288230376161736443, 1848, - 144115188094794787, + 288230376161737763, 330, - 144115188094795722, + 288230376161738698, 0, 1, 0, @@ -505,15 +505,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 55, - 144115188094795237, + 288230376161738213, 2376, - 144115188094789617, + 288230376161732593, 10395, - 144115188094783897, + 288230376161726873, 9240, - 144115188094791025, + 288230376161734001, 1485, - 144115188094795557, + 288230376161738533, 0, 0, 1, @@ -527,15 +527,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 220, - 144115188094793632, + 288230376161736608, 9360, - 144115188094771753, + 288230376161714729, 40040, - 144115188094750732, + 288230376161693708, 34320, - 144115188094778617, + 288230376161721593, 5148, - 144115188094795062, + 288230376161738038, 0, 0, 0, @@ -549,15 +549,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 715, - 144115188094788847, + 288230376161731823, 30030, - 144115188094719337, + 288230376161662313, 126126, - 144115188094655637, + 288230376161598613, 105105, - 144115188094744297, + 288230376161687273, 15015, - 144115188094793775, + 288230376161736751, 0, 0, 0, @@ -571,15 +571,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 2002, - 144115188094776472, + 288230376161719448, 83160, - 144115188094585567, + 288230376161528543, 343980, - 144115188094417399, + 288230376161360375, 280280, - 144115188094660642, + 288230376161603618, 38610, - 144115188094790772, + 288230376161733748, 0, 0, 0, @@ -593,15 +593,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 5005, - 144115188094747729, + 288230376161690705, 205920, - 144115188094278337, + 288230376161221313, 840840, - 144115188093878497, + 288230376160821473, 672672, - 144115188094475457, + 288230376161418433, 90090, - 144115188094784337, + 288230376161727313, 0, 0, 0, @@ -615,15 +615,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 11440, - 144115188094686382, + 288230376161629358, 466752, - 144115188093628897, + 288230376160571873, 1884960, - 144115188092753737, + 288230376159696713, 1485120, - 144115188094095649, + 288230376161038625, 194480, - 144115188094771467, + 288230376161714443, 0, 0, 0, @@ -637,15 +637,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 24310, - 144115188094564117, + 288230376161507093, 984555, - 144115188092345329, + 288230376159288305, 3938220, - 144115188090554617, + 288230376157497593, 3063060, - 144115188093363697, + 288230376160306673, 393822, - 144115188094747157, + 288230376161690133, 0, 0, 0, @@ -659,15 +659,15 @@ pub global PARITY_MATRIX: [[[Field; N_PARTIES + 1]; N_PARTIES - T]; L_THRESHOLD] ], [ 48620, - 144115188094333887, + 288230376161276863, 1956240, - 144115188089945932, + 288230376156888908, 7759752, - 144115188086481757, + 288230376153424733, 5969040, - 144115188092024437, + 288230376158967413, 755820, - 144115188094703399, + 288230376161646375, 0, 0, 0, diff --git a/circuits/lib/src/configs/committee/small/smudging.nr b/circuits/lib/src/configs/committee/small/smudging.nr index d5fccca90c..f4eb93ab04 100644 --- a/circuits/lib/src/configs/committee/small/smudging.nr +++ b/circuits/lib/src/configs/committee/small/smudging.nr @@ -9,7 +9,10 @@ // // C1 and C2b must use the same smudging-noise width as Rust witness generation. -pub global INSECURE_E_SM_BIT: u32 = 31; -pub global INSECURE_E_SM_BOUND: Field = 1594228736; -pub global SECURE_E_SM_BIT: u32 = 143; -pub global SECURE_E_SM_BOUND: Field = 8307674973655731686596149550392541184000000; +pub global INSECURE_E_SM_BIT: u32 = 41; +pub global INSECURE_E_SM_BOUND: Field = 1632502808576; +pub global SECURE_8192_E_SM_BIT: u32 = 147; +pub global SECURE_8192_E_SM_BOUND: Field = 132922799578495732532604946348519718912000000; +pub global SECURE_16384_E_SM_BIT: u32 = 234; +pub global SECURE_16384_E_SM_BOUND: Field = + 21485279873005361617838049333217628226284372418617583826443530823270400; diff --git a/circuits/lib/src/configs/default/mod.nr b/circuits/lib/src/configs/default/mod.nr index 76bfde2334..625e2764d4 100644 --- a/circuits/lib/src/configs/default/mod.nr +++ b/circuits/lib/src/configs/default/mod.nr @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. // -// Auto-generated by build-circuits.ts for preset: insecure-512 +// Auto-generated by build-circuits.ts for preset: insecure // Committee size (N_PARTIES / T / H) is routed through `committee::active`, // which `build-circuits.ts` regenerates atomically with this file. diff --git a/circuits/lib/src/configs/insecure/dkg.nr b/circuits/lib/src/configs/insecure/dkg.nr index e2b8dc2725..47bfb61391 100644 --- a/circuits/lib/src/configs/insecure/dkg.nr +++ b/circuits/lib/src/configs/insecure/dkg.nr @@ -18,8 +18,9 @@ pub global QIS: [Field; L] = [2251799813554177]; pub global PLAINTEXT_MODULUS: Field = 68719403009; pub global Q_MOD_T: Field = 2415755265; pub global Q_MOD_T_CENTERED: Field = 2415755265; +pub global DKG_ERROR_BOUND: Field = 6; -// Parity matrix is sized for the active committee and the insecure-512 threshold QIS; +// Parity matrix is sized for the active committee and the insecure threshold QIS; // see `committee/{name}/parity_insecure.nr`. Re-exported via `committee::active`. pub use crate::configs::committee::active::PARITY_MATRIX_INSECURE as PARITY_MATRIX; @@ -70,7 +71,7 @@ pub global SHARE_ENCRYPTION_BIT_U: u32 = 1; pub global SHARE_ENCRYPTION_BIT_E0: u32 = 3; pub global SHARE_ENCRYPTION_BIT_E1: u32 = 3; pub global SHARE_ENCRYPTION_BIT_MSG: u32 = 36; -pub global SHARE_ENCRYPTION_BIT_R1: u32 = 35; +pub global SHARE_ENCRYPTION_BIT_R1: u32 = 36; pub global SHARE_ENCRYPTION_BIT_R2: u32 = 50; pub global SHARE_ENCRYPTION_BIT_P1: u32 = 9; pub global SHARE_ENCRYPTION_BIT_P2: u32 = 50; @@ -80,8 +81,8 @@ pub global SHARE_ENCRYPTION_PK_BOUNDS: [Field; L] = [1125899906777088]; pub global SHARE_ENCRYPTION_E0_BOUND: Field = 6; pub global SHARE_ENCRYPTION_E1_BOUND: Field = 6; pub global SHARE_ENCRYPTION_U_BOUND: Field = 1; -pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [19605059183]; -pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [19605059183]; +pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [256]; +pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [39210118110]; pub global SHARE_ENCRYPTION_R2_BOUNDS: [Field; L] = [1125899906777088]; pub global SHARE_ENCRYPTION_P1_BOUNDS: [Field; L] = [256]; pub global SHARE_ENCRYPTION_P2_BOUNDS: [Field; L] = [1125899906777088]; diff --git a/circuits/lib/src/configs/insecure/threshold.nr b/circuits/lib/src/configs/insecure/threshold.nr index 35c9f846bf..f42c1febfe 100644 --- a/circuits/lib/src/configs/insecure/threshold.nr +++ b/circuits/lib/src/configs/insecure/threshold.nr @@ -24,6 +24,11 @@ pub global PLAINTEXT_MODULUS: Field = 100; pub global Q_MOD_T: Field = 93; pub global Q_MOD_T_CENTERED: Field = -7; pub global Q_INVERSE_MOD_T: Field = 57; +pub global PARAMS_SEARCH_Z: Field = 1024; +pub global PARAMS_LAMBDA: u32 = 2; +pub global PARAMS_TWO_POW_LAMBDA_PLUS_ONE: Field = 8; +pub global PARAMS_MULT_DEPTH: u32 = 0; +pub global PARAMS_SMUDGING_B_ENC: Field = 6; pub global CRP: [Polynomial; L] = [ Polynomial::new([ @@ -1105,21 +1110,21 @@ pub global USER_DATA_ENCRYPTION_BIT_CT: u32 = 35; pub global USER_DATA_ENCRYPTION_BIT_U: u32 = 1; pub global USER_DATA_ENCRYPTION_BIT_E0: u32 = 5; pub global USER_DATA_ENCRYPTION_BIT_E1: u32 = 5; -pub global USER_DATA_ENCRYPTION_BIT_K: u32 = 6; +pub global USER_DATA_ENCRYPTION_BIT_K: u32 = 7; pub global USER_DATA_ENCRYPTION_BIT_R1: u32 = 9; pub global USER_DATA_ENCRYPTION_BIT_R2: u32 = 35; pub global USER_DATA_ENCRYPTION_BIT_P1: u32 = 9; pub global USER_DATA_ENCRYPTION_BIT_P2: u32 = 35; pub global USER_DATA_ENCRYPTION_K0IS: [Field; L] = [61160268678, 8933500027]; -pub global USER_DATA_ENCRYPTION_PK_BOUNDS: [Field; L] = [68719403008, 68719230976]; +pub global USER_DATA_ENCRYPTION_PK_BOUNDS: [Field; L] = [34359701504, 34359615488]; pub global USER_DATA_ENCRYPTION_E0_BOUND: Field = 20; pub global USER_DATA_ENCRYPTION_E1_BOUND: Field = 20; pub global USER_DATA_ENCRYPTION_U_BOUND: Field = 1; -pub global USER_DATA_ENCRYPTION_K1_LOW_BOUND: Field = 50; -pub global USER_DATA_ENCRYPTION_K1_UP_BOUND: Field = 49; -pub global USER_DATA_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [301, 263]; -pub global USER_DATA_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [300, 263]; +pub global USER_DATA_ENCRYPTION_K1_LOW_BOUND: Field = 0; +pub global USER_DATA_ENCRYPTION_K1_UP_BOUND: Field = 99; +pub global USER_DATA_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [256, 256]; +pub global USER_DATA_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [345, 269]; pub global USER_DATA_ENCRYPTION_R2_BOUNDS: [Field; L] = [34359701504, 34359615488]; pub global USER_DATA_ENCRYPTION_P1_BOUNDS: [Field; L] = [256, 256]; pub global USER_DATA_ENCRYPTION_P2_BOUNDS: [Field; L] = [34359701504, 34359615488]; @@ -1146,7 +1151,7 @@ pub global USER_DATA_ENCRYPTION_CT0_CONFIGS: UserDataEncryptionCt0Configs ------------------------------------- user_data_encryption_ct1 (CIRCUIT B - CT1 ENCRYPTION) ------------------------------------- -***--------------------------------*/ +************************************/ pub global USER_DATA_ENCRYPTION_CT1_CONFIGS: UserDataEncryptionCt1Configs = UserDataEncryptionCt1Configs::new( QIS, @@ -1184,6 +1189,7 @@ pub global THRESHOLD_SHARE_DECRYPTION_CONFIGS: ShareDecryptionConfigs = Share decrypted_shares_aggregation (CIRCUIT 7) ------------------------------------- ************************************/ + pub global DECRYPTED_SHARES_AGGREGATION_BIT_NOISE: u32 = 65; pub global DECRYPTED_SHARES_AGGREGATION_BIT_D_NATIVE: u32 = 36; diff --git a/circuits/lib/src/configs/mod.nr b/circuits/lib/src/configs/mod.nr index 46f0ff1d5e..617d5d98c5 100644 --- a/circuits/lib/src/configs/mod.nr +++ b/circuits/lib/src/configs/mod.nr @@ -7,4 +7,5 @@ pub mod default; pub mod committee; pub mod insecure; -pub mod secure; +pub mod secure_8192; +pub mod secure_16384; diff --git a/circuits/lib/src/configs/secure_16384/dkg.nr b/circuits/lib/src/configs/secure_16384/dkg.nr new file mode 100644 index 0000000000..813f6bb83f --- /dev/null +++ b/circuits/lib/src/configs/secure_16384/dkg.nr @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +pub use crate::configs::secure_16384::threshold::{ + L as L_THRESHOLD, PK_GENERATION_BIT_E_SM as SHARE_COMPUTATION_E_SM_BIT_SECRET, + QIS as QIS_THRESHOLD, THRESHOLD_SHARE_DECRYPTION_BIT_SK as SHARE_DECRYPTION_BIT_AGG, +}; +use crate::core::dkg::share_computation::Configs as ShareComputationConfigs; +use crate::core::dkg::share_encryption::Configs as ShareEncryptionConfigs; + +// Global configs for DKG secure_16384 preset +pub global N: u32 = 16384; +pub global L: u32 = 2; +pub global QIS: [Field; L] = [4503599627763713, 4503599628353537]; +pub global PLAINTEXT_MODULUS: Field = 1125899917262849; +pub global Q_MOD_T: Field = 554420383907848; +pub global Q_MOD_T_CENTERED: Field = 554420383907848; +pub global DKG_ERROR_BOUND: Field = 20; + +// Parity matrix is sized for the active committee and the secure-16384 threshold QIS; +// see `committee/{name}/parity_secure_16384.nr`. Re-exported via `committee::active`. +pub use crate::configs::committee::active::PARITY_MATRIX_SECURE_16384 as PARITY_MATRIX; + +/************************************ +------------------------------------- +pk (CIRCUIT 0) +------------------------------------- +************************************/ + +// pk - bit parameters +pub global PK_BIT_PK: u32 = 52; + +/************************************ +------------------------------------- +share_computation_sk (CIRCUIT 2a) +------------------------------------- +************************************/ + +pub global SHARE_COMPUTATION_BIT_SHARE: u32 = 51; +pub global SHARE_COMPUTATION_SK_BIT_SECRET: u32 = 1; +pub global SHARE_COMPUTATION_CHUNK_SIZE: u32 = 512; +pub global SHARE_COMPUTATION_N_CHUNKS: u32 = 32; +pub global SHARE_COMPUTATION_CHUNKS_PER_BATCH: u32 = 4; +pub global SHARE_COMPUTATION_N_BATCHES: u32 = 8; + +pub global SHARE_COMPUTATION_SK_CONFIGS: ShareComputationConfigs = + ShareComputationConfigs::new(QIS_THRESHOLD); + +/************************************ +------------------------------------- +share_computation_e_sm (CIRCUIT 2b) +------------------------------------- +************************************/ + +pub global SHARE_COMPUTATION_E_SM_CONFIGS: ShareComputationConfigs = + ShareComputationConfigs::new(QIS_THRESHOLD); + +/************************************ +------------------------------------- +share_encryption_sk (CIRCUIT 3a) +share_encryption_e_sm (CIRCUIT 3b) +------------------------------------- +************************************/ + +pub global SHARE_ENCRYPTION_BIT_PK: u32 = 52; +pub global SHARE_ENCRYPTION_BIT_CT: u32 = 52; +pub global SHARE_ENCRYPTION_BIT_U: u32 = 1; +pub global SHARE_ENCRYPTION_BIT_E0: u32 = 5; +pub global SHARE_ENCRYPTION_BIT_E1: u32 = 5; +pub global SHARE_ENCRYPTION_BIT_MSG: u32 = 51; +pub global SHARE_ENCRYPTION_BIT_R1: u32 = 50; +pub global SHARE_ENCRYPTION_BIT_R2: u32 = 52; +pub global SHARE_ENCRYPTION_BIT_P1: u32 = 14; +pub global SHARE_ENCRYPTION_BIT_P2: u32 = 52; + +pub global SHARE_ENCRYPTION_K0IS: [Field; L] = [503495679943923, 3594134491487581]; +pub global SHARE_ENCRYPTION_PK_BOUNDS: [Field; L] = [2251799813881856, 2251799814176768]; +pub global SHARE_ENCRYPTION_E0_BOUND: Field = 20; +pub global SHARE_ENCRYPTION_E1_BOUND: Field = 20; +pub global SHARE_ENCRYPTION_U_BOUND: Field = 1; +pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [8192, 8192]; +pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [125873921148148, 898533630999902]; +pub global SHARE_ENCRYPTION_R2_BOUNDS: [Field; L] = [2251799813881856, 2251799814176768]; +pub global SHARE_ENCRYPTION_P1_BOUNDS: [Field; L] = [8192, 8192]; +pub global SHARE_ENCRYPTION_P2_BOUNDS: [Field; L] = [2251799813881856, 2251799814176768]; +pub global SHARE_ENCRYPTION_MSG_BOUND: Field = 1125899917262848; + +pub global SHARE_ENCRYPTION_CONFIGS: ShareEncryptionConfigs = ShareEncryptionConfigs::new( + PLAINTEXT_MODULUS, + Q_MOD_T, + QIS, + SHARE_ENCRYPTION_K0IS, + SHARE_ENCRYPTION_PK_BOUNDS, + SHARE_ENCRYPTION_E0_BOUND, + SHARE_ENCRYPTION_E1_BOUND, + SHARE_ENCRYPTION_U_BOUND, + SHARE_ENCRYPTION_R1_LOW_BOUNDS, + SHARE_ENCRYPTION_R1_UP_BOUNDS, + SHARE_ENCRYPTION_R2_BOUNDS, + SHARE_ENCRYPTION_P1_BOUNDS, + SHARE_ENCRYPTION_P2_BOUNDS, + SHARE_ENCRYPTION_MSG_BOUND, +); + +/************************************ +------------------------------------- +share_decryption_sk (CIRCUIT 4a - BFV DECRYPTION SK) +share_decryption_e_sm (CIRCUIT 4b - BFV DECRYPTION E_SM) +------------------------------------- +************************************/ + +pub global SHARE_DECRYPTION_BIT_MSG: u32 = 51; +// SHARE_DECRYPTION_BIT_AGG: see `pub use` of `THRESHOLD_SHARE_DECRYPTION_BIT_SK` (C6 `BIT_SK`). diff --git a/circuits/lib/src/configs/secure/mod.nr b/circuits/lib/src/configs/secure_16384/mod.nr similarity index 100% rename from circuits/lib/src/configs/secure/mod.nr rename to circuits/lib/src/configs/secure_16384/mod.nr diff --git a/circuits/lib/src/configs/secure_16384/threshold.nr b/circuits/lib/src/configs/secure_16384/threshold.nr new file mode 100644 index 0000000000..fcae746f5b --- /dev/null +++ b/circuits/lib/src/configs/secure_16384/threshold.nr @@ -0,0 +1,82113 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +use crate::core::threshold::decrypted_shares_aggregation::Configs as DecryptedSharesAggregationConfigs; +use crate::core::threshold::pk_aggregation::Configs as PkAggregationConfigs; +use crate::core::threshold::pk_generation::Configs as PkGenerationConfigs; +use crate::core::threshold::share_decryption::Configs as ShareDecryptionConfigs; +use crate::core::threshold::user_data_encryption_ct0::Configs as UserDataEncryptionCt0Configs; +use crate::core::threshold::user_data_encryption_ct1::Configs as UserDataEncryptionCt1Configs; +use crate::math::polynomial::Polynomial; + +pub use crate::configs::committee::active::{ + SECURE_16384_E_SM_BIT as PK_GENERATION_BIT_E_SM, + SECURE_16384_E_SM_BOUND as PK_GENERATION_E_SM_BOUND, +}; + +// Global configs for threshold secure_16384 preset +pub global N: u32 = 16384; +pub global L: u32 = 5; +pub global QIS: [Field; L] = + [1125899917262849, 1125899915886593, 1125899915231233, 1125899915100161, 1125899914510337]; +pub global PLAINTEXT_MODULUS: Field = 1000; +pub global Q_MOD_T: Field = 617; +pub global Q_MOD_T_CENTERED: Field = -383; +pub global Q_INVERSE_MOD_T: Field = 953; +pub global PARAMS_SEARCH_Z: Field = 3; +pub global PARAMS_LAMBDA: u32 = 31; +pub global PARAMS_TWO_POW_LAMBDA_PLUS_ONE: Field = 4294967296; +pub global PARAMS_MULT_DEPTH: u32 = 3; +pub global PARAMS_SMUDGING_B_ENC: Field = 28147497671065599; + +pub global CRP: [Polynomial; L] = [ + Polynomial::new([ + 560765681351166, + 294719969725776, + 21888242871839275222246405745257275088548364400416034343698203680794526708392, + 509029549582747, + 21888242871839275222246405745257275088548364400416034343698204179858623514592, + 21888242871839275222246405745257275088548364400416034343698203920953314626941, + 261108338373435, + 21888242871839275222246405745257275088548364400416034343698203718382692909454, + 21888242871839275222246405745257275088548364400416034343698203689684866942153, + 17135358212575, + 542825156133776, + 21888242871839275222246405745257275088548364400416034343698203708904201865284, + 485174603761866, + 21888242871839275222246405745257275088548364400416034343698203734157168962827, + 21888242871839275222246405745257275088548364400416034343698203678079933774193, + 21888242871839275222246405745257275088548364400416034343698204155531324372693, + 228922314280422, + 519145842008099, + 21888242871839275222246405745257275088548364400416034343698204058347913929895, + 21888242871839275222246405745257275088548364400416034343698203843796236373341, + 21888242871839275222246405745257275088548364400416034343698203817679405336208, + 21888242871839275222246405745257275088548364400416034343698203644689806816785, + 111702323171868, + 21888242871839275222246405745257275088548364400416034343698204107365263595418, + 21888242871839275222246405745257275088548364400416034343698204182341856763080, + 87842848313246, + 546668571122512, + 516936570403657, + 21888242871839275222246405745257275088548364400416034343698203858788761757763, + 239856335592080, + 379154937834946, + 21888242871839275222246405745257275088548364400416034343698204102951893130410, + 21888242871839275222246405745257275088548364400416034343698203779544595302036, + 142469312750030, + 21888242871839275222246405745257275088548364400416034343698203789667609775941, + 21888242871839275222246405745257275088548364400416034343698203775050733459300, + 21888242871839275222246405745257275088548364400416034343698203748767282689308, + 537719220339791, + 21888242871839275222246405745257275088548364400416034343698204048527730563314, + 404405261237974, + 21888242871839275222246405745257275088548364400416034343698203862373665659245, + 472453427665477, + 21888242871839275222246405745257275088548364400416034343698203753472918382583, + 383078498662646, + 283914251543948, + 230274138481370, + 145279669002971, + 21888242871839275222246405745257275088548364400416034343698204164992554485181, + 21888242871839275222246405745257275088548364400416034343698204092833050775889, + 114281425743940, + 236048516377768, + 21888242871839275222246405745257275088548364400416034343698203646593201673457, + 110526516798297, + 81165575553593, + 539859102948037, + 12600521132017, + 21888242871839275222246405745257275088548364400416034343698203986195123637661, + 21888242871839275222246405745257275088548364400416034343698203775100634381247, + 21888242871839275222246405745257275088548364400416034343698204104860919740886, + 291854131298776, + 21888242871839275222246405745257275088548364400416034343698203927619966655587, + 21888242871839275222246405745257275088548364400416034343698203628247897409805, + 384804395430993, + 354124733790214, + 340250309450955, + 223526281029824, + 21888242871839275222246405745257275088548364400416034343698204118110566716266, + 399138547842898, + 21888242871839275222246405745257275088548364400416034343698203862560572396240, + 21888242871839275222246405745257275088548364400416034343698203776928071022751, + 300405212839273, + 21888242871839275222246405745257275088548364400416034343698203988266305794527, + 21888242871839275222246405745257275088548364400416034343698203789747495355751, + 309313639555475, + 21888242871839275222246405745257275088548364400416034343698203948744621250890, + 21888242871839275222246405745257275088548364400416034343698204017777915803153, + 375807458231352, + 227972336372416, + 232435138761073, + 21888242871839275222246405745257275088548364400416034343698203948584467477457, + 21888242871839275222246405745257275088548364400416034343698204007659187849114, + 217004712258494, + 21888242871839275222246405745257275088548364400416034343698203630931999359821, + 505564349887966, + 448324584441536, + 21888242871839275222246405745257275088548364400416034343698203734033952624788, + 236746363802780, + 21888242871839275222246405745257275088548364400416034343698204063648846691680, + 413152958355561, + 323263824572009, + 21888242871839275222246405745257275088548364400416034343698203804908493664809, + 21888242871839275222246405745257275088548364400416034343698203816182298140634, + 431459297280340, + 82743466019120, + 550869393586784, + 185492357738591, + 21888242871839275222246405745257275088548364400416034343698203944053959001963, + 21888242871839275222246405745257275088548364400416034343698204102113744950759, + 358852941389979, + 21888242871839275222246405745257275088548364400416034343698203739098064270630, + 21888242871839275222246405745257275088548364400416034343698203659039726812881, + 21888242871839275222246405745257275088548364400416034343698203628549165923030, + 21888242871839275222246405745257275088548364400416034343698203760104615440986, + 21888242871839275222246405745257275088548364400416034343698203881007546418763, + 552454678900855, + 383098887989847, + 21888242871839275222246405745257275088548364400416034343698204031722484283695, + 21888242871839275222246405745257275088548364400416034343698204066418497611859, + 21888242871839275222246405745257275088548364400416034343698203651258181018484, + 204518207755277, + 24077604533419, + 219156024683674, + 21888242871839275222246405745257275088548364400416034343698203903954230650343, + 21888242871839275222246405745257275088548364400416034343698203752283205441278, + 337242507723851, + 21888242871839275222246405745257275088548364400416034343698203814512409230084, + 21888242871839275222246405745257275088548364400416034343698204152427749943676, + 21888242871839275222246405745257275088548364400416034343698203939401849418294, + 272612368945099, + 21888242871839275222246405745257275088548364400416034343698203666577528010290, + 131554160216743, + 21888242871839275222246405745257275088548364400416034343698203905111956651472, + 502566507894327, + 21888242871839275222246405745257275088548364400416034343698204165708250572067, + 21888242871839275222246405745257275088548364400416034343698203894067652030535, + 451654871748832, + 319400868356048, + 424669583243255, + 21888242871839275222246405745257275088548364400416034343698204110877567178626, + 209780484259843, + 391588008413228, + 21888242871839275222246405745257275088548364400416034343698204031163759025327, + 21888242871839275222246405745257275088548364400416034343698204012152460788068, + 100851987387947, + 21888242871839275222246405745257275088548364400416034343698204004413261864010, + 317073145659795, + 21888242871839275222246405745257275088548364400416034343698203936872276374497, + 270131684074895, + 21888242871839275222246405745257275088548364400416034343698203857858969577872, + 21888242871839275222246405745257275088548364400416034343698204133345910582370, + 21888242871839275222246405745257275088548364400416034343698203971093746130880, + 21888242871839275222246405745257275088548364400416034343698203744077125235267, + 232247847273363, + 362199127114048, + 21888242871839275222246405745257275088548364400416034343698204004876428987767, + 21888242871839275222246405745257275088548364400416034343698203889000632238610, + 386261002896149, + 299832842578792, + 21888242871839275222246405745257275088548364400416034343698203814306816279296, + 21888242871839275222246405745257275088548364400416034343698204184684732489734, + 21888242871839275222246405745257275088548364400416034343698204156945786244023, + 21888242871839275222246405745257275088548364400416034343698203759507538827688, + 106227764416501, + 21888242871839275222246405745257275088548364400416034343698203886126880966922, + 21888242871839275222246405745257275088548364400416034343698204113486097462686, + 125895098323943, + 78529028674570, + 21888242871839275222246405745257275088548364400416034343698203629143223773334, + 21888242871839275222246405745257275088548364400416034343698203900969077403836, + 534284991487455, + 21888242871839275222246405745257275088548364400416034343698203797427440549538, + 26302254108408, + 21888242871839275222246405745257275088548364400416034343698203665211890512912, + 21888242871839275222246405745257275088548364400416034343698203709307578647296, + 118734100624787, + 402434138489232, + 21888242871839275222246405745257275088548364400416034343698203666532881566552, + 65465493684826, + 435225813794947, + 21888242871839275222246405745257275088548364400416034343698203888300902491695, + 21888242871839275222246405745257275088548364400416034343698204012886288260438, + 21888242871839275222246405745257275088548364400416034343698203711712232136032, + 380697261085192, + 165590104091169, + 21888242871839275222246405745257275088548364400416034343698203701732584469391, + 7836715887430, + 21888242871839275222246405745257275088548364400416034343698203906950572756667, + 21888242871839275222246405745257275088548364400416034343698204114416114689542, + 21888242871839275222246405745257275088548364400416034343698203834698055036549, + 21888242871839275222246405745257275088548364400416034343698204057989397318065, + 21888242871839275222246405745257275088548364400416034343698203778813468142948, + 21888242871839275222246405745257275088548364400416034343698203888438667755393, + 532799527130101, + 21888242871839275222246405745257275088548364400416034343698203897511578530758, + 21888242871839275222246405745257275088548364400416034343698204041234718227164, + 21888242871839275222246405745257275088548364400416034343698203853763505370827, + 157565807651589, + 308106565922689, + 21888242871839275222246405745257275088548364400416034343698203830237847757807, + 21888242871839275222246405745257275088548364400416034343698203864712096962162, + 423755390756713, + 522406000445585, + 21888242871839275222246405745257275088548364400416034343698203993120387549392, + 21888242871839275222246405745257275088548364400416034343698203989048655450783, + 455335548757620, + 543858628470362, + 21888242871839275222246405745257275088548364400416034343698204024860511367074, + 157412792093133, + 102489040449906, + 21888242871839275222246405745257275088548364400416034343698203771269649087629, + 60416358583667, + 21888242871839275222246405745257275088548364400416034343698203883328609896729, + 16347136949138, + 12226650120602, + 560857947100292, + 21888242871839275222246405745257275088548364400416034343698203731016910662923, + 536256762113588, + 21888242871839275222246405745257275088548364400416034343698204050076903981378, + 21888242871839275222246405745257275088548364400416034343698203847771091508078, + 21888242871839275222246405745257275088548364400416034343698203788441880661418, + 307220743439476, + 532386343964011, + 80825643533415, + 266878909009395, + 35827644231323, + 21888242871839275222246405745257275088548364400416034343698204012154614173500, + 342096561525060, + 28734500707592, + 218389828446808, + 21888242871839275222246405745257275088548364400416034343698203883781343973595, + 19872177220032, + 389406569966999, + 215677551325196, + 301990972858, + 436097702277771, + 21888242871839275222246405745257275088548364400416034343698204070601211497198, + 76148364628447, + 3084299591044, + 381292278524060, + 21888242871839275222246405745257275088548364400416034343698204078070024807474, + 118281353094973, + 96116485943907, + 21888242871839275222246405745257275088548364400416034343698203675649748045753, + 327067310101273, + 452762700661829, + 417572680141994, + 352115096801594, + 58260078043494, + 21888242871839275222246405745257275088548364400416034343698203760023282929963, + 21888242871839275222246405745257275088548364400416034343698203813613063607033, + 21888242871839275222246405745257275088548364400416034343698203871438215815937, + 21888242871839275222246405745257275088548364400416034343698203893009404856953, + 394876397387367, + 21888242871839275222246405745257275088548364400416034343698203684960380736868, + 322629393108840, + 21888242871839275222246405745257275088548364400416034343698204048773743006715, + 5870842051294, + 59934087434424, + 21888242871839275222246405745257275088548364400416034343698203908457829004940, + 21888242871839275222246405745257275088548364400416034343698203797723715267776, + 21888242871839275222246405745257275088548364400416034343698203653561851904058, + 284813246416257, + 331508688713388, + 21888242871839275222246405745257275088548364400416034343698204013361198185448, + 20030911969235, + 21888242871839275222246405745257275088548364400416034343698203763088720657367, + 21888242871839275222246405745257275088548364400416034343698203687884480699592, + 127286885155094, + 21888242871839275222246405745257275088548364400416034343698203808722433857714, + 21888242871839275222246405745257275088548364400416034343698203781259237334400, + 21888242871839275222246405745257275088548364400416034343698203972077225617198, + 117297244119638, + 21888242871839275222246405745257275088548364400416034343698204144491866032327, + 349586649454802, + 287196591135102, + 482254631096722, + 290922272833249, + 467315969602705, + 21888242871839275222246405745257275088548364400416034343698203846272409432210, + 340444009816599, + 21888242871839275222246405745257275088548364400416034343698203637005438531922, + 345423412477256, + 293557170284895, + 21888242871839275222246405745257275088548364400416034343698203973256531665596, + 21888242871839275222246405745257275088548364400416034343698204006081137952103, + 21888242871839275222246405745257275088548364400416034343698203690923774300638, + 21888242871839275222246405745257275088548364400416034343698203867339041373934, + 21888242871839275222246405745257275088548364400416034343698203735321360078859, + 148037949506021, + 420133573033091, + 21888242871839275222246405745257275088548364400416034343698203796435785826305, + 21888242871839275222246405745257275088548364400416034343698204000962897782545, + 160851890179890, + 202777513196546, + 21888242871839275222246405745257275088548364400416034343698203907726979976081, + 177739809344596, + 21888242871839275222246405745257275088548364400416034343698203909087066969208, + 432263177272812, + 21888242871839275222246405745257275088548364400416034343698204087300479641010, + 21888242871839275222246405745257275088548364400416034343698204036240947760202, + 419272784439259, + 21888242871839275222246405745257275088548364400416034343698203773703640105936, + 21888242871839275222246405745257275088548364400416034343698203635215884225002, + 414738512464024, + 21888242871839275222246405745257275088548364400416034343698203976037064806771, + 21888242871839275222246405745257275088548364400416034343698203910363741985292, + 21888242871839275222246405745257275088548364400416034343698203964037821518526, + 274789903369971, + 430720552836010, + 21888242871839275222246405745257275088548364400416034343698204089231570360082, + 254869544480164, + 34985957877672, + 527954229902598, + 21888242871839275222246405745257275088548364400416034343698204111972708441597, + 21888242871839275222246405745257275088548364400416034343698203916868614811698, + 404118986144025, + 518965432069951, + 21888242871839275222246405745257275088548364400416034343698203749097078047562, + 346471459511718, + 21888242871839275222246405745257275088548364400416034343698204006246677435174, + 297682227086903, + 21888242871839275222246405745257275088548364400416034343698204079551307518832, + 21888242871839275222246405745257275088548364400416034343698204068925645130920, + 544696595315343, + 475275844104773, + 46497218405292, + 274912614883433, + 138972900183516, + 100549924297861, + 352195415980541, + 21888242871839275222246405745257275088548364400416034343698203914089099724573, + 21888242871839275222246405745257275088548364400416034343698203694191210869683, + 67515102510338, + 524488129947181, + 264123627115207, + 21888242871839275222246405745257275088548364400416034343698204140634471477758, + 21888242871839275222246405745257275088548364400416034343698203994287464383999, + 192891761352695, + 537992566969004, + 363371611735099, + 21888242871839275222246405745257275088548364400416034343698204148554446662284, + 453125037297436, + 402840700808259, + 172041633627473, + 21888242871839275222246405745257275088548364400416034343698203834787712445140, + 21888242871839275222246405745257275088548364400416034343698203631938307838787, + 195134711427471, + 304573246407054, + 389360084064869, + 14651931247035, + 74620899307575, + 59434446054104, + 21888242871839275222246405745257275088548364400416034343698203869561014114067, + 417530071154387, + 59207374940791, + 333644419723609, + 54378976450127, + 65543615610768, + 21888242871839275222246405745257275088548364400416034343698203875321240138719, + 190507117751687, + 526634874103425, + 21888242871839275222246405745257275088548364400416034343698204081391278487199, + 208165891028005, + 245746788287778, + 21888242871839275222246405745257275088548364400416034343698204163087112419025, + 21888242871839275222246405745257275088548364400416034343698204178331370678839, + 21888242871839275222246405745257275088548364400416034343698203641013830950030, + 332624957037913, + 219627042834211, + 21888242871839275222246405745257275088548364400416034343698203763631485828723, + 23351148307147, + 21888242871839275222246405745257275088548364400416034343698203663319182684419, + 21888242871839275222246405745257275088548364400416034343698204127104378421475, + 21888242871839275222246405745257275088548364400416034343698204168310995039565, + 49089992848551, + 87332014004845, + 545500621224442, + 115998035668740, + 21888242871839275222246405745257275088548364400416034343698204036458942808413, + 21888242871839275222246405745257275088548364400416034343698203744132732303207, + 21888242871839275222246405745257275088548364400416034343698203901262206936940, + 21888242871839275222246405745257275088548364400416034343698203713207924702917, + 21888242871839275222246405745257275088548364400416034343698204000561740111651, + 379867689846878, + 21888242871839275222246405745257275088548364400416034343698204178631004274764, + 21888242871839275222246405745257275088548364400416034343698204180897004140104, + 21888242871839275222246405745257275088548364400416034343698204098121179830874, + 21888242871839275222246405745257275088548364400416034343698204029093901697465, + 505312803582003, + 21888242871839275222246405745257275088548364400416034343698203785408574840060, + 21888242871839275222246405745257275088548364400416034343698203716272956815550, + 21888242871839275222246405745257275088548364400416034343698203858390913995811, + 21888242871839275222246405745257275088548364400416034343698203736945647426481, + 383992514067861, + 492349421410030, + 362724091029385, + 257500922678703, + 21888242871839275222246405745257275088548364400416034343698203721542710750216, + 81675191364479, + 21888242871839275222246405745257275088548364400416034343698203892178711965026, + 314335317587634, + 7805133779250, + 295822156211917, + 21888242871839275222246405745257275088548364400416034343698204157584147886839, + 21888242871839275222246405745257275088548364400416034343698203910337571034432, + 21888242871839275222246405745257275088548364400416034343698204004564214713929, + 413557721148023, + 368671728197277, + 21888242871839275222246405745257275088548364400416034343698204052790973512052, + 21888242871839275222246405745257275088548364400416034343698203927141679211301, + 21888242871839275222246405745257275088548364400416034343698203636836737370515, + 21888242871839275222246405745257275088548364400416034343698203679135208914202, + 196385748230165, + 21888242871839275222246405745257275088548364400416034343698203966128195134575, + 383954936920782, + 21888242871839275222246405745257275088548364400416034343698204117130872799643, + 528442988782979, + 548286915806156, + 21888242871839275222246405745257275088548364400416034343698204167937641334302, + 254918537023189, + 21888242871839275222246405745257275088548364400416034343698204086089970332285, + 276169038318809, + 357624351778583, + 402076096793823, + 21888242871839275222246405745257275088548364400416034343698203949111824573056, + 169210881040517, + 21888242871839275222246405745257275088548364400416034343698203777854781217525, + 21888242871839275222246405745257275088548364400416034343698203979728179250293, + 26141944537469, + 21888242871839275222246405745257275088548364400416034343698203753836605244214, + 21888242871839275222246405745257275088548364400416034343698203794457511078100, + 111648339326122, + 413952214025779, + 21888242871839275222246405745257275088548364400416034343698203681763652791070, + 85787957602632, + 21888242871839275222246405745257275088548364400416034343698204003126785129227, + 562732175735281, + 315379430935450, + 525745948597406, + 476095389025921, + 21888242871839275222246405745257275088548364400416034343698203670968971646990, + 21888242871839275222246405745257275088548364400416034343698203792918810272133, + 90533140398394, + 21888242871839275222246405745257275088548364400416034343698204062689075465085, + 21888242871839275222246405745257275088548364400416034343698204033544628734399, + 21888242871839275222246405745257275088548364400416034343698203942234761189768, + 403213816098383, + 366497694979258, + 21888242871839275222246405745257275088548364400416034343698204129712843545577, + 515112373536821, + 21888242871839275222246405745257275088548364400416034343698203882720172120397, + 426672271558213, + 21888242871839275222246405745257275088548364400416034343698203638996238468128, + 266135167121401, + 368144137599459, + 335607486629907, + 64238083439099, + 21888242871839275222246405745257275088548364400416034343698204070844222692631, + 21888242871839275222246405745257275088548364400416034343698203695018174329228, + 277613239751944, + 554298782782777, + 21888242871839275222246405745257275088548364400416034343698204020249124105358, + 286056093566183, + 433188269396751, + 531789257993375, + 499107657589007, + 21888242871839275222246405745257275088548364400416034343698204051073729819730, + 392590018650090, + 21888242871839275222246405745257275088548364400416034343698203879117324854991, + 21888242871839275222246405745257275088548364400416034343698203992400514674385, + 337656479394030, + 70365390035249, + 34976382718689, + 107614205492760, + 500378323817054, + 21888242871839275222246405745257275088548364400416034343698204126869252621940, + 21888242871839275222246405745257275088548364400416034343698204054044263041482, + 102782491572548, + 279442738187368, + 21888242871839275222246405745257275088548364400416034343698203940969540506331, + 144541123492843, + 21888242871839275222246405745257275088548364400416034343698203818163962011958, + 21888242871839275222246405745257275088548364400416034343698204074121929360364, + 21888242871839275222246405745257275088548364400416034343698203909910046376406, + 21888242871839275222246405745257275088548364400416034343698203697150647931064, + 227632938767733, + 264180046057503, + 21888242871839275222246405745257275088548364400416034343698203662598019154450, + 286766816311769, + 448833495017048, + 349493728799441, + 431737705746876, + 253944942484538, + 21888242871839275222246405745257275088548364400416034343698204114538129868640, + 21888242871839275222246405745257275088548364400416034343698203669705141613644, + 341003669117073, + 21888242871839275222246405745257275088548364400416034343698203985713445895244, + 431272162767902, + 107331317473564, + 81002094516964, + 111081089311026, + 21888242871839275222246405745257275088548364400416034343698203723438011232497, + 128429157247206, + 21888242871839275222246405745257275088548364400416034343698203645274387254189, + 21888242871839275222246405745257275088548364400416034343698203722499884980024, + 21888242871839275222246405745257275088548364400416034343698204030322724090307, + 21888242871839275222246405745257275088548364400416034343698203915296052378533, + 422369102719761, + 21888242871839275222246405745257275088548364400416034343698203721288894703453, + 21888242871839275222246405745257275088548364400416034343698204054966264858233, + 21888242871839275222246405745257275088548364400416034343698203825911170417743, + 21888242871839275222246405745257275088548364400416034343698203894763682155081, + 129015726523909, + 21888242871839275222246405745257275088548364400416034343698203827474784627532, + 87661267344978, + 140020672893864, + 29216216266718, + 44544294599949, + 345534661705434, + 294632377643138, + 21888242871839275222246405745257275088548364400416034343698203646809120402619, + 124638605847751, + 36685410523678, + 478534502927240, + 337997750966077, + 21888242871839275222246405745257275088548364400416034343698204016036078303728, + 21888242871839275222246405745257275088548364400416034343698204117907120572515, + 21888242871839275222246405745257275088548364400416034343698203930759902542162, + 94534647819791, + 448987119712575, + 21888242871839275222246405745257275088548364400416034343698204131845597006620, + 21888242871839275222246405745257275088548364400416034343698203959344537571140, + 277261287831237, + 21888242871839275222246405745257275088548364400416034343698203856548472910037, + 478075285466929, + 106383408159407, + 21888242871839275222246405745257275088548364400416034343698204168165284912455, + 371283564419261, + 402764803852756, + 21888242871839275222246405745257275088548364400416034343698204022701030026927, + 21888242871839275222246405745257275088548364400416034343698204097964021703371, + 157023964316438, + 21888242871839275222246405745257275088548364400416034343698203711136527740459, + 21888242871839275222246405745257275088548364400416034343698203835067157086080, + 21888242871839275222246405745257275088548364400416034343698203853494112246624, + 21888242871839275222246405745257275088548364400416034343698204096864917199249, + 21888242871839275222246405745257275088548364400416034343698204016607262925510, + 39571763586753, + 562540698992585, + 21888242871839275222246405745257275088548364400416034343698204127340546405404, + 434092805518137, + 526919007762065, + 107439204696359, + 239343316246653, + 21888242871839275222246405745257275088548364400416034343698203913412097709489, + 21888242871839275222246405745257275088548364400416034343698203684980479936618, + 436953076580658, + 21888242871839275222246405745257275088548364400416034343698203789151654999235, + 21888242871839275222246405745257275088548364400416034343698203726658062897019, + 247061368963598, + 27129091766667, + 21888242871839275222246405745257275088548364400416034343698203818787851587623, + 21888242871839275222246405745257275088548364400416034343698203999156134880384, + 21888242871839275222246405745257275088548364400416034343698204145725160514023, + 313422992264213, + 175737836858020, + 439067798823163, + 21888242871839275222246405745257275088548364400416034343698203764818776473988, + 387422664854273, + 21888242871839275222246405745257275088548364400416034343698203675152327093801, + 21888242871839275222246405745257275088548364400416034343698203830081042228830, + 21888242871839275222246405745257275088548364400416034343698204027936035390501, + 21888242871839275222246405745257275088548364400416034343698203975749547689400, + 21888242871839275222246405745257275088548364400416034343698204106944996595290, + 159976227394560, + 545056448266701, + 21888242871839275222246405745257275088548364400416034343698204021865846751774, + 175310381065612, + 236444159175916, + 21888242871839275222246405745257275088548364400416034343698203811323890659827, + 478266605297274, + 21888242871839275222246405745257275088548364400416034343698203791238646638017, + 21888242871839275222246405745257275088548364400416034343698204132294705557620, + 21888242871839275222246405745257275088548364400416034343698203722166066196075, + 304277910405687, + 101589357568487, + 21888242871839275222246405745257275088548364400416034343698204047870838822299, + 289862274392613, + 21888242871839275222246405745257275088548364400416034343698203927717386296718, + 401743695955424, + 21888242871839275222246405745257275088548364400416034343698203633308551909951, + 21888242871839275222246405745257275088548364400416034343698203863185255570656, + 21888242871839275222246405745257275088548364400416034343698203728566277547424, + 21888242871839275222246405745257275088548364400416034343698204120873173026017, + 145207727317033, + 21888242871839275222246405745257275088548364400416034343698204115338831486510, + 21888242871839275222246405745257275088548364400416034343698203703757267413230, + 21888242871839275222246405745257275088548364400416034343698203704377585348816, + 21888242871839275222246405745257275088548364400416034343698203961001467888565, + 425192060336991, + 419809963419900, + 311389311147551, + 203892656886785, + 20447813163353, + 21888242871839275222246405745257275088548364400416034343698204184000180657226, + 286808772452525, + 21888242871839275222246405745257275088548364400416034343698203715173482896481, + 21888242871839275222246405745257275088548364400416034343698204056307968326626, + 21888242871839275222246405745257275088548364400416034343698204070992913823960, + 21888242871839275222246405745257275088548364400416034343698204163223305600450, + 324089635793521, + 21888242871839275222246405745257275088548364400416034343698204094042902179078, + 503830971228046, + 21888242871839275222246405745257275088548364400416034343698203854533742655403, + 21888242871839275222246405745257275088548364400416034343698203725618257899134, + 9809910982404, + 21888242871839275222246405745257275088548364400416034343698203832971728797110, + 21888242871839275222246405745257275088548364400416034343698204031974952071466, + 227895524967757, + 21888242871839275222246405745257275088548364400416034343698204117332250872690, + 21888242871839275222246405745257275088548364400416034343698203641795955776324, + 558506959702567, + 131379580885723, + 21888242871839275222246405745257275088548364400416034343698204019924870753541, + 21888242871839275222246405745257275088548364400416034343698203625885715043314, + 21888242871839275222246405745257275088548364400416034343698203971346404598217, + 379642422973982, + 519227945321637, + 21888242871839275222246405745257275088548364400416034343698203937526685111349, + 21888242871839275222246405745257275088548364400416034343698203821423468719446, + 21888242871839275222246405745257275088548364400416034343698203695255765248560, + 21888242871839275222246405745257275088548364400416034343698203941230425163511, + 21888242871839275222246405745257275088548364400416034343698204112430819872259, + 21888242871839275222246405745257275088548364400416034343698203654964888968190, + 21888242871839275222246405745257275088548364400416034343698203910541743099108, + 21888242871839275222246405745257275088548364400416034343698204053607825756507, + 327724677013887, + 21888242871839275222246405745257275088548364400416034343698203643906829406123, + 375502388929166, + 21888242871839275222246405745257275088548364400416034343698203911188286159297, + 21888242871839275222246405745257275088548364400416034343698203890793046553452, + 21888242871839275222246405745257275088548364400416034343698203916858196567580, + 507010807894305, + 21888242871839275222246405745257275088548364400416034343698204146707066951847, + 553470655888275, + 306238285280896, + 135168635826514, + 355634613469219, + 454953477613906, + 21888242871839275222246405745257275088548364400416034343698203822381988073214, + 160865063125069, + 174149532817449, + 21888242871839275222246405745257275088548364400416034343698203945632129548034, + 250561792541103, + 546396677860403, + 278731730274232, + 21888242871839275222246405745257275088548364400416034343698204082799283660667, + 21888242871839275222246405745257275088548364400416034343698203808275508501859, + 462641282513168, + 7348353414861, + 176707507564996, + 21888242871839275222246405745257275088548364400416034343698204089232394848946, + 21888242871839275222246405745257275088548364400416034343698204061582608109578, + 388414045375807, + 126916199884094, + 292434053264154, + 21888242871839275222246405745257275088548364400416034343698204056337020971060, + 371065951926742, + 21888242871839275222246405745257275088548364400416034343698203697362002024228, + 21888242871839275222246405745257275088548364400416034343698203834263070943081, + 361649406836707, + 21888242871839275222246405745257275088548364400416034343698203710420756358031, + 118229386853211, + 21888242871839275222246405745257275088548364400416034343698203664219723239481, + 21888242871839275222246405745257275088548364400416034343698204024843477750619, + 68411613149901, + 21888242871839275222246405745257275088548364400416034343698203968237264250359, + 181734942589312, + 21888242871839275222246405745257275088548364400416034343698204171149137203627, + 502715458337259, + 348310550903230, + 21888242871839275222246405745257275088548364400416034343698203800670898578431, + 243645869159418, + 21888242871839275222246405745257275088548364400416034343698203773071480737707, + 21888242871839275222246405745257275088548364400416034343698203639114570767969, + 21888242871839275222246405745257275088548364400416034343698203742468601221202, + 21888242871839275222246405745257275088548364400416034343698203731913296168163, + 139255878964680, + 24522194155124, + 21888242871839275222246405745257275088548364400416034343698204133191783628473, + 21888242871839275222246405745257275088548364400416034343698203826988902370605, + 21888242871839275222246405745257275088548364400416034343698203693464379880548, + 21888242871839275222246405745257275088548364400416034343698203993612145970295, + 76580871786892, + 21888242871839275222246405745257275088548364400416034343698203704495242370511, + 154860642247228, + 21888242871839275222246405745257275088548364400416034343698203947323652601386, + 292531359550856, + 335736251493351, + 12416995750351, + 21888242871839275222246405745257275088548364400416034343698203795536206267385, + 21888242871839275222246405745257275088548364400416034343698204116441043209850, + 21888242871839275222246405745257275088548364400416034343698204031684663474022, + 21888242871839275222246405745257275088548364400416034343698204139733363036144, + 21888242871839275222246405745257275088548364400416034343698203673741707832730, + 506093633693347, + 149231062963200, + 21888242871839275222246405745257275088548364400416034343698203947880422227571, + 21888242871839275222246405745257275088548364400416034343698203627673370514044, + 189039186942033, + 185526517611750, + 15204010744920, + 245423196734267, + 22284787737950, + 442224374422807, + 484014586113984, + 21888242871839275222246405745257275088548364400416034343698203882015028211903, + 21888242871839275222246405745257275088548364400416034343698203636767915641465, + 21888242871839275222246405745257275088548364400416034343698203858026215488026, + 21888242871839275222246405745257275088548364400416034343698203870570680517686, + 546195344365988, + 21888242871839275222246405745257275088548364400416034343698204014912584292137, + 474759706744006, + 337955137411721, + 21888242871839275222246405745257275088548364400416034343698203849907727892115, + 21888242871839275222246405745257275088548364400416034343698203755232597136943, + 120255430816590, + 208205202674383, + 21888242871839275222246405745257275088548364400416034343698203687676865648719, + 21888242871839275222246405745257275088548364400416034343698204164018203090120, + 21888242871839275222246405745257275088548364400416034343698203671304183182061, + 21888242871839275222246405745257275088548364400416034343698204054719152024579, + 132861074582395, + 143899572467991, + 21888242871839275222246405745257275088548364400416034343698203837248363561375, + 507172183237568, + 122666560773532, + 21888242871839275222246405745257275088548364400416034343698203707363533189534, + 21888242871839275222246405745257275088548364400416034343698203665924998000075, + 21888242871839275222246405745257275088548364400416034343698203988614825877159, + 21888242871839275222246405745257275088548364400416034343698204019757174873001, + 160576301519588, + 374380120641602, + 21888242871839275222246405745257275088548364400416034343698203768552874572736, + 21888242871839275222246405745257275088548364400416034343698203661784125460278, + 21888242871839275222246405745257275088548364400416034343698203915894235688026, + 329878009205274, + 21888242871839275222246405745257275088548364400416034343698203904237595774876, + 21888242871839275222246405745257275088548364400416034343698203662933375120418, + 16755691226409, + 21888242871839275222246405745257275088548364400416034343698203629617038336394, + 242216854075557, + 21888242871839275222246405745257275088548364400416034343698203845028197621574, + 492253670351197, + 21888242871839275222246405745257275088548364400416034343698204033264523636633, + 21888242871839275222246405745257275088548364400416034343698204020032667191582, + 307104317515254, + 21888242871839275222246405745257275088548364400416034343698204168570760636075, + 21888242871839275222246405745257275088548364400416034343698203713778037845257, + 21888242871839275222246405745257275088548364400416034343698203716994223351628, + 146616596828159, + 21888242871839275222246405745257275088548364400416034343698203814850898612638, + 363867518034541, + 93016630874203, + 21888242871839275222246405745257275088548364400416034343698203929525078909660, + 178642903416064, + 21888242871839275222246405745257275088548364400416034343698203683437215529674, + 21888242871839275222246405745257275088548364400416034343698204170438914739281, + 21888242871839275222246405745257275088548364400416034343698203631528332777551, + 21888242871839275222246405745257275088548364400416034343698203665637712782908, + 525993832420208, + 21888242871839275222246405745257275088548364400416034343698204127097226389761, + 95908456358430, + 295539931560371, + 21888242871839275222246405745257275088548364400416034343698204133040663474209, + 157685791752113, + 551971656791427, + 21888242871839275222246405745257275088548364400416034343698204020462077650649, + 21888242871839275222246405745257275088548364400416034343698203921279227592784, + 142997993318061, + 111530135637678, + 472950845469466, + 557305317292691, + 21888242871839275222246405745257275088548364400416034343698203845834858447925, + 21888242871839275222246405745257275088548364400416034343698204004907082135974, + 338912885114979, + 21888242871839275222246405745257275088548364400416034343698203835150687333008, + 21888242871839275222246405745257275088548364400416034343698203683396011153508, + 370747015477666, + 21888242871839275222246405745257275088548364400416034343698203971632887546877, + 21888242871839275222246405745257275088548364400416034343698203903699769528422, + 415400680880363, + 21888242871839275222246405745257275088548364400416034343698203818492204349444, + 21888242871839275222246405745257275088548364400416034343698204163718317156549, + 21888242871839275222246405745257275088548364400416034343698204029622473410692, + 149747842157489, + 109309616979233, + 21888242871839275222246405745257275088548364400416034343698204110448931553063, + 93073745568916, + 95890765094084, + 109780932110966, + 559424641669529, + 298336225303002, + 480191445177058, + 21888242871839275222246405745257275088548364400416034343698203779749363721412, + 534107011404699, + 21888242871839275222246405745257275088548364400416034343698204043292385436205, + 21888242871839275222246405745257275088548364400416034343698204118923954064671, + 21888242871839275222246405745257275088548364400416034343698203835260661604689, + 257448764360510, + 21888242871839275222246405745257275088548364400416034343698204135779100760441, + 94111669526150, + 272109414450625, + 21888242871839275222246405745257275088548364400416034343698203938741253588487, + 63594441301840, + 192513595797052, + 21888242871839275222246405745257275088548364400416034343698203946131480005117, + 21888242871839275222246405745257275088548364400416034343698203632027571241677, + 471510011883466, + 84534005521747, + 109101480119425, + 484079572426150, + 454845105056225, + 509664312364175, + 479116490513712, + 21888242871839275222246405745257275088548364400416034343698203764503353096018, + 106346360631837, + 238605588125525, + 482268644188655, + 251671096629589, + 105613565050869, + 139940271445133, + 21888242871839275222246405745257275088548364400416034343698203845203340636228, + 21888242871839275222246405745257275088548364400416034343698203997736083296640, + 21888242871839275222246405745257275088548364400416034343698204049866379963609, + 226913859117973, + 21888242871839275222246405745257275088548364400416034343698203761233020930153, + 21888242871839275222246405745257275088548364400416034343698203798708476543195, + 21888242871839275222246405745257275088548364400416034343698204183040811512943, + 131255878628077, + 302211971211922, + 389169381313610, + 21888242871839275222246405745257275088548364400416034343698203757450120122248, + 180006539198284, + 474062713610986, + 21888242871839275222246405745257275088548364400416034343698204009996644606640, + 92524942495070, + 21888242871839275222246405745257275088548364400416034343698203981246495387929, + 551676826425868, + 21888242871839275222246405745257275088548364400416034343698203731645168064163, + 21888242871839275222246405745257275088548364400416034343698203706695154378692, + 21888242871839275222246405745257275088548364400416034343698203968951129101717, + 21888242871839275222246405745257275088548364400416034343698203796152058172826, + 21888242871839275222246405745257275088548364400416034343698203901071138208133, + 21888242871839275222246405745257275088548364400416034343698204090963617788004, + 220672697195430, + 21888242871839275222246405745257275088548364400416034343698203820889300429429, + 91639436137729, + 21888242871839275222246405745257275088548364400416034343698203748988714800435, + 21888242871839275222246405745257275088548364400416034343698204109864252008233, + 312957197227186, + 376865853732436, + 21888242871839275222246405745257275088548364400416034343698203841832284384206, + 21888242871839275222246405745257275088548364400416034343698203762866510419216, + 523871355702487, + 126050232102447, + 114583545851318, + 134758755554556, + 21888242871839275222246405745257275088548364400416034343698203994820044186232, + 21888242871839275222246405745257275088548364400416034343698203809863505593878, + 21888242871839275222246405745257275088548364400416034343698203980678783097287, + 21888242871839275222246405745257275088548364400416034343698203935375123594753, + 452237143288397, + 172429792555687, + 26870084346635, + 147850912013755, + 462345909902687, + 83402105547553, + 21888242871839275222246405745257275088548364400416034343698204082938994316313, + 21888242871839275222246405745257275088548364400416034343698203808023154593996, + 340353261933739, + 1692272432902, + 424705705316410, + 37931417718367, + 21888242871839275222246405745257275088548364400416034343698203778230587847224, + 186182159195155, + 21888242871839275222246405745257275088548364400416034343698204113175959517957, + 21888242871839275222246405745257275088548364400416034343698204054722113353168, + 87376642743533, + 372648167591891, + 21888242871839275222246405745257275088548364400416034343698203930415155152490, + 21888242871839275222246405745257275088548364400416034343698203909598119417120, + 21888242871839275222246405745257275088548364400416034343698203851408473638068, + 21888242871839275222246405745257275088548364400416034343698203820740579909640, + 126958080481412, + 21888242871839275222246405745257275088548364400416034343698204070134185248779, + 360267706074366, + 21888242871839275222246405745257275088548364400416034343698204123662795000069, + 21888242871839275222246405745257275088548364400416034343698204004001602097444, + 205687916687865, + 21888242871839275222246405745257275088548364400416034343698203642916125651777, + 21888242871839275222246405745257275088548364400416034343698203992468506426543, + 311873239510559, + 21888242871839275222246405745257275088548364400416034343698203728869829593980, + 21888242871839275222246405745257275088548364400416034343698203731209798084211, + 62223089084681, + 354159942828337, + 109385177970583, + 343651529985361, + 18233731055759, + 21888242871839275222246405745257275088548364400416034343698203876905020901958, + 21888242871839275222246405745257275088548364400416034343698203953786922455642, + 21888242871839275222246405745257275088548364400416034343698204120630059580535, + 16733546018014, + 21888242871839275222246405745257275088548364400416034343698204110602024926888, + 275150060349788, + 21888242871839275222246405745257275088548364400416034343698203823342563852159, + 370874702529480, + 21888242871839275222246405745257275088548364400416034343698203765598657676399, + 51683488870740, + 21888242871839275222246405745257275088548364400416034343698204063800759029654, + 20849301958655, + 52808765316963, + 117996502287385, + 21888242871839275222246405745257275088548364400416034343698203686685328538854, + 381235908749869, + 100789056837730, + 374435862457381, + 406788532855608, + 21888242871839275222246405745257275088548364400416034343698203817074313543281, + 468317354274786, + 288183416793460, + 21888242871839275222246405745257275088548364400416034343698203809677838458448, + 257697906497888, + 198489464069443, + 413161715598521, + 21888242871839275222246405745257275088548364400416034343698204033640175248636, + 81253607854276, + 13486452912193, + 76297325064817, + 21888242871839275222246405745257275088548364400416034343698203759844425203960, + 21888242871839275222246405745257275088548364400416034343698204161473342527485, + 180685467838596, + 21888242871839275222246405745257275088548364400416034343698203823861066758751, + 21888242871839275222246405745257275088548364400416034343698204102747360140558, + 21888242871839275222246405745257275088548364400416034343698203976899513186891, + 360956454596389, + 21888242871839275222246405745257275088548364400416034343698203891292533130472, + 315415742815694, + 21888242871839275222246405745257275088548364400416034343698203920277815326359, + 387780825620388, + 458216718927323, + 496207151506095, + 21888242871839275222246405745257275088548364400416034343698203787935067884118, + 480156059872361, + 60470314389666, + 21888242871839275222246405745257275088548364400416034343698203982721793753748, + 467027812539095, + 21888242871839275222246405745257275088548364400416034343698204153083420455860, + 21888242871839275222246405745257275088548364400416034343698203723317206414307, + 21888242871839275222246405745257275088548364400416034343698203826830388993964, + 280552233534341, + 106634798726037, + 21888242871839275222246405745257275088548364400416034343698204185584016711384, + 21888242871839275222246405745257275088548364400416034343698203682720116770532, + 479997237763145, + 21888242871839275222246405745257275088548364400416034343698203768152572306361, + 21888242871839275222246405745257275088548364400416034343698204061550409191071, + 253683817416096, + 21888242871839275222246405745257275088548364400416034343698204107897401404812, + 412579888946597, + 263530725905260, + 44052456019042, + 450709525493849, + 9529914795353, + 21888242871839275222246405745257275088548364400416034343698203882337002639520, + 21888242871839275222246405745257275088548364400416034343698203764100201194268, + 21888242871839275222246405745257275088548364400416034343698203954205382679863, + 21888242871839275222246405745257275088548364400416034343698204072884403287025, + 21888242871839275222246405745257275088548364400416034343698203997814139122685, + 21888242871839275222246405745257275088548364400416034343698203899154901943662, + 21888242871839275222246405745257275088548364400416034343698203915434275073918, + 21888242871839275222246405745257275088548364400416034343698204016050353181337, + 21888242871839275222246405745257275088548364400416034343698204089523725438637, + 21888242871839275222246405745257275088548364400416034343698203843654614999495, + 21888242871839275222246405745257275088548364400416034343698204036106196051103, + 514439098428591, + 134860651151995, + 21888242871839275222246405745257275088548364400416034343698203804399406967583, + 96233163342248, + 487374380938922, + 389343718308379, + 21888242871839275222246405745257275088548364400416034343698203924298456783193, + 21888242871839275222246405745257275088548364400416034343698203754892278042469, + 21888242871839275222246405745257275088548364400416034343698203883927226208333, + 515225864646980, + 21888242871839275222246405745257275088548364400416034343698203883939885166659, + 362965770359727, + 137354758749457, + 485781377847011, + 215781764428461, + 21888242871839275222246405745257275088548364400416034343698203836528727340741, + 21888242871839275222246405745257275088548364400416034343698203962002154015583, + 21888242871839275222246405745257275088548364400416034343698203682490347858870, + 137956685868470, + 21888242871839275222246405745257275088548364400416034343698203665556134531676, + 21888242871839275222246405745257275088548364400416034343698203961842867718581, + 459723542982477, + 493718169225494, + 21888242871839275222246405745257275088548364400416034343698203691941832000193, + 21888242871839275222246405745257275088548364400416034343698203846724233762091, + 21888242871839275222246405745257275088548364400416034343698203686020435925126, + 440148598712085, + 193459697128153, + 21888242871839275222246405745257275088548364400416034343698204177961981589954, + 493270419375322, + 486734494888460, + 21888242871839275222246405745257275088548364400416034343698203940031510581127, + 200257826904618, + 21888242871839275222246405745257275088548364400416034343698203918152595189166, + 21888242871839275222246405745257275088548364400416034343698203908007673864964, + 6290319615953, + 21888242871839275222246405745257275088548364400416034343698203706320951693471, + 549627704274737, + 21888242871839275222246405745257275088548364400416034343698204180528270136391, + 556366632033882, + 21888242871839275222246405745257275088548364400416034343698204111468218206411, + 335055016722274, + 21888242871839275222246405745257275088548364400416034343698203719654435839238, + 21888242871839275222246405745257275088548364400416034343698203791165767005278, + 116930771056798, + 21888242871839275222246405745257275088548364400416034343698204050072133446372, + 21888242871839275222246405745257275088548364400416034343698203987808446744483, + 483801050697442, + 489741620656742, + 115837481098990, + 521932274593329, + 117991291353724, + 21888242871839275222246405745257275088548364400416034343698203946147588383591, + 21888242871839275222246405745257275088548364400416034343698203911919039680099, + 70369232483768, + 385148423823136, + 21888242871839275222246405745257275088548364400416034343698204091647034440528, + 21888242871839275222246405745257275088548364400416034343698203834358987842642, + 21888242871839275222246405745257275088548364400416034343698203692579671862046, + 21888242871839275222246405745257275088548364400416034343698203917021968108483, + 423289307077326, + 21888242871839275222246405745257275088548364400416034343698203908495877759375, + 298533066649789, + 221276657110079, + 21888242871839275222246405745257275088548364400416034343698203961321621424021, + 21888242871839275222246405745257275088548364400416034343698204072274840794432, + 449559312810917, + 21888242871839275222246405745257275088548364400416034343698203661547393063930, + 21888242871839275222246405745257275088548364400416034343698203781594982265931, + 21888242871839275222246405745257275088548364400416034343698203771223489550111, + 213677567025119, + 225555338736525, + 21888242871839275222246405745257275088548364400416034343698204042684877620837, + 70552559828446, + 523993143347219, + 21888242871839275222246405745257275088548364400416034343698203764988215825895, + 60088629146565, + 21888242871839275222246405745257275088548364400416034343698203693611367281684, + 290286162004042, + 162983154163769, + 21888242871839275222246405745257275088548364400416034343698204107142774754641, + 21888242871839275222246405745257275088548364400416034343698204053681452685925, + 21888242871839275222246405745257275088548364400416034343698204152265813357072, + 469756071757448, + 216767341740626, + 21888242871839275222246405745257275088548364400416034343698204033747061989833, + 368503779252854, + 21888242871839275222246405745257275088548364400416034343698203834739084676204, + 253978522967542, + 21888242871839275222246405745257275088548364400416034343698204018116304914385, + 206986086306300, + 21888242871839275222246405745257275088548364400416034343698203965835743458961, + 434229184971156, + 526153112537378, + 21888242871839275222246405745257275088548364400416034343698203770065000965004, + 21888242871839275222246405745257275088548364400416034343698203779168236576857, + 21888242871839275222246405745257275088548364400416034343698203903081773800153, + 142771354907334, + 21888242871839275222246405745257275088548364400416034343698203653599217805194, + 450952248433613, + 361933065903526, + 335146210349581, + 458727680860956, + 21888242871839275222246405745257275088548364400416034343698203631945597563306, + 543078065300149, + 21888242871839275222246405745257275088548364400416034343698203960421714773881, + 255967491927922, + 542052916528851, + 21888242871839275222246405745257275088548364400416034343698204110502955039556, + 21888242871839275222246405745257275088548364400416034343698203945128296856192, + 389202357800175, + 21888242871839275222246405745257275088548364400416034343698204144603151201253, + 21888242871839275222246405745257275088548364400416034343698204118477892101226, + 23137160502372, + 92630757383572, + 351866327601245, + 21888242871839275222246405745257275088548364400416034343698203821224303506213, + 246645919350786, + 21888242871839275222246405745257275088548364400416034343698203917708044501319, + 21888242871839275222246405745257275088548364400416034343698203926308912357239, + 21888242871839275222246405745257275088548364400416034343698204183733377640635, + 424209812308050, + 21888242871839275222246405745257275088548364400416034343698204129919758545884, + 498357316450232, + 513746600663620, + 362148242517308, + 21888242871839275222246405745257275088548364400416034343698203875256816335096, + 310202250122435, + 21888242871839275222246405745257275088548364400416034343698203722637447666430, + 542410876536973, + 364911176548210, + 368612447149510, + 21888242871839275222246405745257275088548364400416034343698203894940892594199, + 21888242871839275222246405745257275088548364400416034343698204063650725924705, + 205421840449603, + 438254998331790, + 252184557773324, + 229757427318153, + 21888242871839275222246405745257275088548364400416034343698203954827737772309, + 192904258870927, + 21888242871839275222246405745257275088548364400416034343698203716010659366027, + 276682214846718, + 28192302280073, + 21888242871839275222246405745257275088548364400416034343698204033192974902623, + 21888242871839275222246405745257275088548364400416034343698203749198306814525, + 173720772948890, + 202898491852953, + 21888242871839275222246405745257275088548364400416034343698203774463074960860, + 391436641845301, + 21888242871839275222246405745257275088548364400416034343698203900812141581119, + 196432628643840, + 21888242871839275222246405745257275088548364400416034343698204140952272028535, + 21888242871839275222246405745257275088548364400416034343698203773182448740906, + 419454150415116, + 21888242871839275222246405745257275088548364400416034343698203743338563765013, + 420521734766062, + 21888242871839275222246405745257275088548364400416034343698203888763115285770, + 21888242871839275222246405745257275088548364400416034343698204144069598724613, + 230864370031124, + 546215228835836, + 21888242871839275222246405745257275088548364400416034343698204069098197476881, + 21888242871839275222246405745257275088548364400416034343698204085749162083415, + 85746366144362, + 21888242871839275222246405745257275088548364400416034343698203810063920405287, + 21888242871839275222246405745257275088548364400416034343698204131696507595736, + 372737568222520, + 198208719863332, + 21888242871839275222246405745257275088548364400416034343698203999642899610870, + 21888242871839275222246405745257275088548364400416034343698203808758374472941, + 21888242871839275222246405745257275088548364400416034343698203752832276125773, + 21888242871839275222246405745257275088548364400416034343698204131798877667006, + 21888242871839275222246405745257275088548364400416034343698204184645924619072, + 21888242871839275222246405745257275088548364400416034343698204049399123833938, + 21888242871839275222246405745257275088548364400416034343698203735186334532908, + 390113467589578, + 21888242871839275222246405745257275088548364400416034343698204047735093480316, + 515822115090533, + 21888242871839275222246405745257275088548364400416034343698203878619502630015, + 21888242871839275222246405745257275088548364400416034343698204056927529057871, + 21888242871839275222246405745257275088548364400416034343698203670618571990118, + 250051339277122, + 21888242871839275222246405745257275088548364400416034343698204011037023314587, + 21888242871839275222246405745257275088548364400416034343698203939951071729729, + 229383376095170, + 21888242871839275222246405745257275088548364400416034343698204136318381242729, + 21888242871839275222246405745257275088548364400416034343698203795154877972079, + 206787879422092, + 21888242871839275222246405745257275088548364400416034343698203813977008735039, + 403917212002380, + 214937240140396, + 21888242871839275222246405745257275088548364400416034343698203641159559765515, + 21888242871839275222246405745257275088548364400416034343698203826939410528785, + 321400942303281, + 21888242871839275222246405745257275088548364400416034343698203976618742528967, + 21888242871839275222246405745257275088548364400416034343698203726215838269332, + 21888242871839275222246405745257275088548364400416034343698203847192218574643, + 21888242871839275222246405745257275088548364400416034343698204017791042860778, + 21888242871839275222246405745257275088548364400416034343698203793845653706518, + 213548327677853, + 369776831891022, + 21888242871839275222246405745257275088548364400416034343698203925469173645770, + 87335792584124, + 105556086617052, + 21888242871839275222246405745257275088548364400416034343698203883742196750651, + 147284685718878, + 21888242871839275222246405745257275088548364400416034343698203983251249255112, + 23402970890307, + 67184209373261, + 21888242871839275222246405745257275088548364400416034343698203825717957626364, + 21888242871839275222246405745257275088548364400416034343698204047354722069188, + 21888242871839275222246405745257275088548364400416034343698203956849799015980, + 101153783867596, + 21888242871839275222246405745257275088548364400416034343698203961115651015774, + 21888242871839275222246405745257275088548364400416034343698203735168178937441, + 21888242871839275222246405745257275088548364400416034343698203735823316486964, + 21888242871839275222246405745257275088548364400416034343698203907631550171464, + 21888242871839275222246405745257275088548364400416034343698203697103531075976, + 21888242871839275222246405745257275088548364400416034343698203900486482947246, + 21888242871839275222246405745257275088548364400416034343698204023219720643048, + 517120419759280, + 21888242871839275222246405745257275088548364400416034343698204134536322839765, + 21888242871839275222246405745257275088548364400416034343698204157090040804571, + 523443303699406, + 129704314797392, + 305072693315440, + 21888242871839275222246405745257275088548364400416034343698203941144651422195, + 21888242871839275222246405745257275088548364400416034343698203639609870793569, + 481407308634921, + 21888242871839275222246405745257275088548364400416034343698203867339096934264, + 28019135089556, + 346888548092867, + 88381948639750, + 343601108525489, + 154004700006288, + 21888242871839275222246405745257275088548364400416034343698204160658408849522, + 21888242871839275222246405745257275088548364400416034343698204050320383930522, + 483354114885500, + 285127828389331, + 19935904038232, + 467506568608741, + 21888242871839275222246405745257275088548364400416034343698203894334091795185, + 21888242871839275222246405745257275088548364400416034343698203759236474049717, + 21888242871839275222246405745257275088548364400416034343698203889070809839696, + 468478123611819, + 53963579507884, + 21888242871839275222246405745257275088548364400416034343698203669833153755735, + 150884430472687, + 242847342363253, + 265849927425131, + 21888242871839275222246405745257275088548364400416034343698203992436599777831, + 21888242871839275222246405745257275088548364400416034343698203897553681140785, + 21888242871839275222246405745257275088548364400416034343698203822450208797861, + 112877357383429, + 285980069914505, + 3977514337946, + 396117563370940, + 58212355772067, + 35022454637241, + 21888242871839275222246405745257275088548364400416034343698203635257315167454, + 370060787432285, + 21888242871839275222246405745257275088548364400416034343698203698092174320046, + 21888242871839275222246405745257275088548364400416034343698203877376971133899, + 267234570913175, + 540965772271954, + 21888242871839275222246405745257275088548364400416034343698203674472423773999, + 306502552465670, + 21888242871839275222246405745257275088548364400416034343698203636025776780774, + 320930794423683, + 21888242871839275222246405745257275088548364400416034343698203802148169527500, + 156742808803754, + 21888242871839275222246405745257275088548364400416034343698204165631454891425, + 21888242871839275222246405745257275088548364400416034343698204118349665608254, + 371867972191904, + 160956061064117, + 346725500724750, + 21888242871839275222246405745257275088548364400416034343698203717535923821272, + 21888242871839275222246405745257275088548364400416034343698203749633344731289, + 559360843009303, + 21888242871839275222246405745257275088548364400416034343698204001079924000157, + 21888242871839275222246405745257275088548364400416034343698204008561460985427, + 21888242871839275222246405745257275088548364400416034343698203946550490371993, + 304901992577214, + 21888242871839275222246405745257275088548364400416034343698203878422448665376, + 410968330609968, + 203934887653279, + 21888242871839275222246405745257275088548364400416034343698204104073757260186, + 382459580902484, + 180826383462341, + 21888242871839275222246405745257275088548364400416034343698203903965426490086, + 21888242871839275222246405745257275088548364400416034343698203971842418915991, + 21888242871839275222246405745257275088548364400416034343698203796020298118602, + 207219144263975, + 21888242871839275222246405745257275088548364400416034343698204047399444490977, + 383852088190156, + 331101908871251, + 26034852383553, + 21888242871839275222246405745257275088548364400416034343698203689842269035998, + 311119577218982, + 546955960696709, + 21888242871839275222246405745257275088548364400416034343698203636532978326842, + 401996706515610, + 21888242871839275222246405745257275088548364400416034343698204045491590909711, + 369708469615700, + 56252698166533, + 21888242871839275222246405745257275088548364400416034343698203755940624948249, + 378594685840940, + 132596636398196, + 21888242871839275222246405745257275088548364400416034343698203857586787729305, + 65387382474507, + 544578824789933, + 21888242871839275222246405745257275088548364400416034343698203911095630870054, + 21888242871839275222246405745257275088548364400416034343698204174831364229063, + 21888242871839275222246405745257275088548364400416034343698203896826170810867, + 516039117599948, + 230911900124397, + 332214854814195, + 21888242871839275222246405745257275088548364400416034343698204029413599621108, + 285079027133226, + 263118416512947, + 69748990160619, + 21888242871839275222246405745257275088548364400416034343698204142908374133336, + 21888242871839275222246405745257275088548364400416034343698203878345373423735, + 21888242871839275222246405745257275088548364400416034343698203883189620219273, + 108988278721252, + 556621831301565, + 21888242871839275222246405745257275088548364400416034343698203968497322240378, + 21888242871839275222246405745257275088548364400416034343698203987270639273383, + 38078131010401, + 324407243174650, + 21888242871839275222246405745257275088548364400416034343698203723144052588894, + 21888242871839275222246405745257275088548364400416034343698204060017478691007, + 256373824683796, + 21888242871839275222246405745257275088548364400416034343698204127186471792797, + 179768755216428, + 21888242871839275222246405745257275088548364400416034343698203702808966705568, + 21888242871839275222246405745257275088548364400416034343698204129664175578293, + 331544845236316, + 21888242871839275222246405745257275088548364400416034343698203706255799111362, + 99932474921428, + 21888242871839275222246405745257275088548364400416034343698204104089314403794, + 377891410396017, + 21888242871839275222246405745257275088548364400416034343698203807555789151880, + 506783747952871, + 21888242871839275222246405745257275088548364400416034343698203689370103712197, + 116619627169338, + 21888242871839275222246405745257275088548364400416034343698203909199205034864, + 21888242871839275222246405745257275088548364400416034343698203923841555866726, + 250372338938806, + 21888242871839275222246405745257275088548364400416034343698204102137971958490, + 21888242871839275222246405745257275088548364400416034343698203805140439390600, + 144433761061869, + 448315561643107, + 21888242871839275222246405745257275088548364400416034343698203781353092168049, + 21888242871839275222246405745257275088548364400416034343698203743404098322217, + 21888242871839275222246405745257275088548364400416034343698203701110914093339, + 276073567034783, + 195786993790399, + 60865187087722, + 21888242871839275222246405745257275088548364400416034343698203959182220372852, + 21888242871839275222246405745257275088548364400416034343698204045971538076395, + 21888242871839275222246405745257275088548364400416034343698204109827634867180, + 542709582850020, + 66644417720419, + 21888242871839275222246405745257275088548364400416034343698204027541304271845, + 92578604232327, + 33097266009837, + 21888242871839275222246405745257275088548364400416034343698203694423538037799, + 21888242871839275222246405745257275088548364400416034343698203813930280012641, + 21888242871839275222246405745257275088548364400416034343698203978213453070686, + 21888242871839275222246405745257275088548364400416034343698203851032514257888, + 21888242871839275222246405745257275088548364400416034343698203726926416266408, + 23794740611366, + 66117640838412, + 509351206633010, + 21888242871839275222246405745257275088548364400416034343698203656408947273630, + 21888242871839275222246405745257275088548364400416034343698203782245718196224, + 132070510728279, + 21888242871839275222246405745257275088548364400416034343698204184987886695155, + 21888242871839275222246405745257275088548364400416034343698204140734274479824, + 358348113764064, + 401162256732691, + 21888242871839275222246405745257275088548364400416034343698204059963754360327, + 62370909061563, + 441676122980603, + 21888242871839275222246405745257275088548364400416034343698203706466521822992, + 21888242871839275222246405745257275088548364400416034343698203698743759509258, + 435666823728714, + 21888242871839275222246405745257275088548364400416034343698204031271288970490, + 498424637575324, + 532243424070718, + 21888242871839275222246405745257275088548364400416034343698203658274143857737, + 21888242871839275222246405745257275088548364400416034343698203783105080529143, + 21888242871839275222246405745257275088548364400416034343698203908299386248208, + 21888242871839275222246405745257275088548364400416034343698203703981682357746, + 215420757621987, + 48597088381673, + 21888242871839275222246405745257275088548364400416034343698203818565637314646, + 292252584559196, + 81458570264898, + 528561948011537, + 221801479372154, + 106326316362279, + 129888863174362, + 22478869097974, + 21888242871839275222246405745257275088548364400416034343698203913991022854862, + 21888242871839275222246405745257275088548364400416034343698204105124018319796, + 228123119843054, + 479827511596588, + 21888242871839275222246405745257275088548364400416034343698204084700441445635, + 393751798185576, + 21888242871839275222246405745257275088548364400416034343698203979423773582858, + 21888242871839275222246405745257275088548364400416034343698203820363105487654, + 494109868890326, + 398796414567239, + 21888242871839275222246405745257275088548364400416034343698203820157467980833, + 390524784684865, + 14521915259799, + 61258102099682, + 179694011744984, + 21888242871839275222246405745257275088548364400416034343698203637582000470552, + 21888242871839275222246405745257275088548364400416034343698203899221292869361, + 21888242871839275222246405745257275088548364400416034343698203795378165328019, + 229880300549789, + 119194273434701, + 21888242871839275222246405745257275088548364400416034343698203839811284477137, + 21888242871839275222246405745257275088548364400416034343698204090679666409456, + 21888242871839275222246405745257275088548364400416034343698204123398685145723, + 505097590301294, + 493090130554186, + 21888242871839275222246405745257275088548364400416034343698204085165972215092, + 21888242871839275222246405745257275088548364400416034343698203659827968248870, + 21888242871839275222246405745257275088548364400416034343698203821080432326824, + 21888242871839275222246405745257275088548364400416034343698203974458426252729, + 364099301922753, + 257606054403470, + 21888242871839275222246405745257275088548364400416034343698204004165586425485, + 21888242871839275222246405745257275088548364400416034343698203823028028436739, + 21888242871839275222246405745257275088548364400416034343698203731672494055715, + 21888242871839275222246405745257275088548364400416034343698203625989416893564, + 21888242871839275222246405745257275088548364400416034343698204146427428216386, + 138343935783600, + 386787413901313, + 543436596217462, + 21888242871839275222246405745257275088548364400416034343698204155978704831953, + 348620950053905, + 21888242871839275222246405745257275088548364400416034343698203841138978509668, + 21888242871839275222246405745257275088548364400416034343698203833627904312012, + 21888242871839275222246405745257275088548364400416034343698204081181470866798, + 21888242871839275222246405745257275088548364400416034343698203757382443629109, + 21888242871839275222246405745257275088548364400416034343698204082149898776121, + 47280528964711, + 188619324460081, + 21888242871839275222246405745257275088548364400416034343698203701726860052855, + 21888242871839275222246405745257275088548364400416034343698203623816903276928, + 21888242871839275222246405745257275088548364400416034343698204024881072544731, + 21888242871839275222246405745257275088548364400416034343698203927901467629758, + 21888242871839275222246405745257275088548364400416034343698204182221630970701, + 21888242871839275222246405745257275088548364400416034343698203807291118849861, + 532256526259947, + 21888242871839275222246405745257275088548364400416034343698203840564155948062, + 21888242871839275222246405745257275088548364400416034343698204025058428966145, + 21888242871839275222246405745257275088548364400416034343698203906208987301600, + 21888242871839275222246405745257275088548364400416034343698203775080909490485, + 21888242871839275222246405745257275088548364400416034343698204151541717746508, + 315552830086440, + 210578413279902, + 21888242871839275222246405745257275088548364400416034343698204092063062762588, + 146956662645449, + 21888242871839275222246405745257275088548364400416034343698204031186711420661, + 531953247961796, + 502126177358757, + 21888242871839275222246405745257275088548364400416034343698204117163525719747, + 21888242871839275222246405745257275088548364400416034343698203795850424356123, + 21888242871839275222246405745257275088548364400416034343698204177921868384157, + 21888242871839275222246405745257275088548364400416034343698203992086141056406, + 21888242871839275222246405745257275088548364400416034343698203772035573974200, + 21888242871839275222246405745257275088548364400416034343698203984443177553788, + 21888242871839275222246405745257275088548364400416034343698204166782562969594, + 21888242871839275222246405745257275088548364400416034343698203948707541053509, + 455143508962901, + 21888242871839275222246405745257275088548364400416034343698203775913811519925, + 45519420143018, + 491857951528816, + 196635993460086, + 21888242871839275222246405745257275088548364400416034343698203640129265386108, + 324607371628033, + 21888242871839275222246405745257275088548364400416034343698203749094312534895, + 526756480489534, + 42718370801029, + 21888242871839275222246405745257275088548364400416034343698204005008445803899, + 92971195801939, + 21888242871839275222246405745257275088548364400416034343698203817100180766613, + 21888242871839275222246405745257275088548364400416034343698204041457896374555, + 21888242871839275222246405745257275088548364400416034343698203793177088985332, + 21888242871839275222246405745257275088548364400416034343698204096555002651436, + 268855480806238, + 20043957127603, + 264445085768229, + 21888242871839275222246405745257275088548364400416034343698204023718787684206, + 21888242871839275222246405745257275088548364400416034343698203908719059513120, + 213084360233434, + 103667167505509, + 508041368788643, + 212015876157438, + 202571457847814, + 21888242871839275222246405745257275088548364400416034343698203980466101710856, + 116734336243323, + 134517495442576, + 285678317740222, + 21888242871839275222246405745257275088548364400416034343698204151023750285331, + 21888242871839275222246405745257275088548364400416034343698204032972282967434, + 371063511866260, + 21888242871839275222246405745257275088548364400416034343698204072219909250650, + 72205734315262, + 80007654686042, + 21888242871839275222246405745257275088548364400416034343698203717771850424578, + 21888242871839275222246405745257275088548364400416034343698203727097397772142, + 21888242871839275222246405745257275088548364400416034343698203651785904146020, + 146339561400870, + 21888242871839275222246405745257275088548364400416034343698203834369639545717, + 21888242871839275222246405745257275088548364400416034343698203700911239544893, + 21888242871839275222246405745257275088548364400416034343698203740021206920784, + 21888242871839275222246405745257275088548364400416034343698203648521915081158, + 401774143892833, + 21888242871839275222246405745257275088548364400416034343698203865322643900584, + 53066471498635, + 427184694708997, + 467200184225193, + 313241721312376, + 21888242871839275222246405745257275088548364400416034343698203969259206962147, + 21888242871839275222246405745257275088548364400416034343698203855909300605132, + 207881452802712, + 21888242871839275222246405745257275088548364400416034343698203624966093577721, + 151015136978384, + 206398873955509, + 21888242871839275222246405745257275088548364400416034343698203706343611667281, + 21888242871839275222246405745257275088548364400416034343698204040396887438029, + 534291701588489, + 515762004632290, + 395439140567010, + 21888242871839275222246405745257275088548364400416034343698203775957090196951, + 543936136233958, + 252419964997408, + 474556039447072, + 21888242871839275222246405745257275088548364400416034343698203662709467117964, + 21888242871839275222246405745257275088548364400416034343698204048882604920363, + 347720252241526, + 391909372439767, + 21888242871839275222246405745257275088548364400416034343698204054867548378229, + 21888242871839275222246405745257275088548364400416034343698204019157275030719, + 21888242871839275222246405745257275088548364400416034343698203851483788326863, + 21888242871839275222246405745257275088548364400416034343698204017906756064765, + 21888242871839275222246405745257275088548364400416034343698203802700545168922, + 367331559879206, + 21888242871839275222246405745257275088548364400416034343698204155920881953217, + 425869551265198, + 21888242871839275222246405745257275088548364400416034343698203736419391549231, + 21888242871839275222246405745257275088548364400416034343698203827191906695954, + 484497157560128, + 21888242871839275222246405745257275088548364400416034343698203769079392539488, + 188832672271663, + 21888242871839275222246405745257275088548364400416034343698204180971277887010, + 21888242871839275222246405745257275088548364400416034343698203781178968157939, + 230795961509831, + 21888242871839275222246405745257275088548364400416034343698204038672624865139, + 484532754287855, + 21888242871839275222246405745257275088548364400416034343698203861850460421677, + 21888242871839275222246405745257275088548364400416034343698204019420288631850, + 21888242871839275222246405745257275088548364400416034343698203972298553889018, + 21888242871839275222246405745257275088548364400416034343698203716853260576223, + 21888242871839275222246405745257275088548364400416034343698203773431261728114, + 308471849102160, + 21888242871839275222246405745257275088548364400416034343698204098805311395286, + 311499965296722, + 21888242871839275222246405745257275088548364400416034343698203967064441683371, + 411540302550332, + 21888242871839275222246405745257275088548364400416034343698203629048765090685, + 21888242871839275222246405745257275088548364400416034343698204107915660322324, + 21888242871839275222246405745257275088548364400416034343698203937350498611758, + 21888242871839275222246405745257275088548364400416034343698203961274941067447, + 21888242871839275222246405745257275088548364400416034343698203770339162717521, + 21888242871839275222246405745257275088548364400416034343698203798994018240167, + 21888242871839275222246405745257275088548364400416034343698203873500761213781, + 21888242871839275222246405745257275088548364400416034343698203953112484767531, + 21888242871839275222246405745257275088548364400416034343698203705817939168108, + 21888242871839275222246405745257275088548364400416034343698204130053504676110, + 118313069622584, + 21888242871839275222246405745257275088548364400416034343698203917510742278853, + 425934685215720, + 21888242871839275222246405745257275088548364400416034343698204165264686961032, + 42977749494904, + 21888242871839275222246405745257275088548364400416034343698204113581495458964, + 21888242871839275222246405745257275088548364400416034343698203768452325962231, + 21888242871839275222246405745257275088548364400416034343698203864078212690392, + 106611060864801, + 21888242871839275222246405745257275088548364400416034343698203803802302819951, + 21888242871839275222246405745257275088548364400416034343698203856191498626373, + 28856130488325, + 21888242871839275222246405745257275088548364400416034343698204048276878198616, + 422586852618447, + 2615216789339, + 361800611775039, + 21888242871839275222246405745257275088548364400416034343698203910185046273309, + 21888242871839275222246405745257275088548364400416034343698204098955251136404, + 21888242871839275222246405745257275088548364400416034343698203795938801881877, + 163323606245349, + 21888242871839275222246405745257275088548364400416034343698204167051247834121, + 357991443466506, + 21888242871839275222246405745257275088548364400416034343698203957905839688735, + 251299951526214, + 347903804851774, + 16495826076389, + 161571443010403, + 151224651476405, + 208041182202085, + 21888242871839275222246405745257275088548364400416034343698203692851319441966, + 381508405518711, + 21888242871839275222246405745257275088548364400416034343698203827171344133528, + 21888242871839275222246405745257275088548364400416034343698203626351806419830, + 21888242871839275222246405745257275088548364400416034343698203850392972617594, + 292187468901119, + 21888242871839275222246405745257275088548364400416034343698204059180885936747, + 21888242871839275222246405745257275088548364400416034343698204036840200432111, + 21888242871839275222246405745257275088548364400416034343698203691951471580643, + 336289813473484, + 330484875207912, + 21888242871839275222246405745257275088548364400416034343698203921585973045562, + 400278121918638, + 21888242871839275222246405745257275088548364400416034343698204109040621032457, + 21888242871839275222246405745257275088548364400416034343698203813777667510763, + 168727942408245, + 124358029186077, + 387758372587791, + 283398412005531, + 403065183958974, + 21888242871839275222246405745257275088548364400416034343698203887829354315643, + 21888242871839275222246405745257275088548364400416034343698203943857555066767, + 21888242871839275222246405745257275088548364400416034343698203833721573417173, + 471765227364051, + 327076879278230, + 21888242871839275222246405745257275088548364400416034343698204009383445307564, + 16566226078377, + 21888242871839275222246405745257275088548364400416034343698204012194390879620, + 301221447466393, + 21888242871839275222246405745257275088548364400416034343698203766679187993354, + 21888242871839275222246405745257275088548364400416034343698203984736860070714, + 21888242871839275222246405745257275088548364400416034343698204164055512843105, + 21888242871839275222246405745257275088548364400416034343698204149906773909043, + 21888242871839275222246405745257275088548364400416034343698203797453058827185, + 426098861214710, + 21888242871839275222246405745257275088548364400416034343698203749775759049439, + 21888242871839275222246405745257275088548364400416034343698204103130921739743, + 21888242871839275222246405745257275088548364400416034343698204178440496951075, + 21888242871839275222246405745257275088548364400416034343698204173079904263546, + 273337765319972, + 451984574449628, + 21888242871839275222246405745257275088548364400416034343698203741350697513235, + 21888242871839275222246405745257275088548364400416034343698204138215258176190, + 21888242871839275222246405745257275088548364400416034343698203740545634863943, + 309944626706121, + 21888242871839275222246405745257275088548364400416034343698203992827318490618, + 391504607835033, + 21888242871839275222246405745257275088548364400416034343698204120020903564320, + 524073842411984, + 204839735051314, + 310983888282098, + 114353716054836, + 21888242871839275222246405745257275088548364400416034343698204117067697366029, + 21888242871839275222246405745257275088548364400416034343698203680025004886614, + 21888242871839275222246405745257275088548364400416034343698203799994242863692, + 51756577147686, + 265477553654995, + 245731871835461, + 21888242871839275222246405745257275088548364400416034343698203901124960187783, + 19960388400787, + 68309442301211, + 21888242871839275222246405745257275088548364400416034343698203827102326374165, + 21888242871839275222246405745257275088548364400416034343698203884131417044020, + 21888242871839275222246405745257275088548364400416034343698203807966681136241, + 133721922826545, + 21888242871839275222246405745257275088548364400416034343698203902147178164293, + 199396096887001, + 124811618782615, + 21888242871839275222246405745257275088548364400416034343698203688452828271600, + 21888242871839275222246405745257275088548364400416034343698203699596872642590, + 21888242871839275222246405745257275088548364400416034343698204035919625694817, + 118087889999395, + 43448325579362, + 382394445989465, + 21888242871839275222246405745257275088548364400416034343698203885119835362936, + 21888242871839275222246405745257275088548364400416034343698203968273614837534, + 302934647441723, + 415521278986264, + 96093107264777, + 21888242871839275222246405745257275088548364400416034343698203791274453498941, + 21888242871839275222246405745257275088548364400416034343698204045943872170302, + 21888242871839275222246405745257275088548364400416034343698204084124643629898, + 21888242871839275222246405745257275088548364400416034343698204113367855946761, + 21888242871839275222246405745257275088548364400416034343698203886066360189190, + 493444498355475, + 76075369057038, + 170781916872632, + 21888242871839275222246405745257275088548364400416034343698204010124170271697, + 465257265273102, + 21888242871839275222246405745257275088548364400416034343698204152434060011821, + 21888242871839275222246405745257275088548364400416034343698203830293296345375, + 21888242871839275222246405745257275088548364400416034343698203630255948002224, + 21888242871839275222246405745257275088548364400416034343698203926157688386811, + 21888242871839275222246405745257275088548364400416034343698203859241240413016, + 21888242871839275222246405745257275088548364400416034343698203792528060291175, + 292539867766614, + 158224800921682, + 21888242871839275222246405745257275088548364400416034343698203851467662748899, + 239539624200481, + 21888242871839275222246405745257275088548364400416034343698203808154648060695, + 149979372419667, + 21888242871839275222246405745257275088548364400416034343698203808501689155495, + 21888242871839275222246405745257275088548364400416034343698203823895255395446, + 21888242871839275222246405745257275088548364400416034343698204052533200555597, + 21888242871839275222246405745257275088548364400416034343698203979224121951985, + 21888242871839275222246405745257275088548364400416034343698203635403421328428, + 21888242871839275222246405745257275088548364400416034343698204051254160738932, + 451866886793324, + 21888242871839275222246405745257275088548364400416034343698203735639352801453, + 475805510900698, + 501853465045122, + 21888242871839275222246405745257275088548364400416034343698203691574586050154, + 21888242871839275222246405745257275088548364400416034343698203858612417509404, + 71849788694337, + 21888242871839275222246405745257275088548364400416034343698203928433649616118, + 184945755908899, + 312885524361542, + 21888242871839275222246405745257275088548364400416034343698203814382652426340, + 194139332107956, + 315972484894211, + 21888242871839275222246405745257275088548364400416034343698203921985221608746, + 376634122233895, + 21888242871839275222246405745257275088548364400416034343698203887490811967069, + 195406543669755, + 503773971782761, + 428317765704588, + 21888242871839275222246405745257275088548364400416034343698204101869591176641, + 21888242871839275222246405745257275088548364400416034343698203671538983292622, + 503718260013038, + 21888242871839275222246405745257275088548364400416034343698203908143215449360, + 21888242871839275222246405745257275088548364400416034343698203739708527343872, + 494694063883535, + 21888242871839275222246405745257275088548364400416034343698203704042765420801, + 150514723405268, + 21888242871839275222246405745257275088548364400416034343698204021831876499543, + 46658745617590, + 21888242871839275222246405745257275088548364400416034343698203809819178292902, + 253026042097073, + 384985617998052, + 483233987715670, + 404750212299588, + 21888242871839275222246405745257275088548364400416034343698203934267785816037, + 559901259420164, + 21888242871839275222246405745257275088548364400416034343698203836685408292464, + 21888242871839275222246405745257275088548364400416034343698203803181846507432, + 348840196305910, + 21888242871839275222246405745257275088548364400416034343698203691764473416558, + 169637300837045, + 21888242871839275222246405745257275088548364400416034343698203648432016187848, + 478352354290186, + 21888242871839275222246405745257275088548364400416034343698203690980188739471, + 559613493397418, + 205556999658179, + 21888242871839275222246405745257275088548364400416034343698204124804175270527, + 166228090865622, + 181112093520232, + 344387962787568, + 21888242871839275222246405745257275088548364400416034343698203628044358306732, + 87184213126184, + 28471844185158, + 320402641606629, + 21713438268141, + 342775943553372, + 21888242871839275222246405745257275088548364400416034343698203705361092896208, + 367990795167311, + 340229920585625, + 21888242871839275222246405745257275088548364400416034343698203770841459019456, + 21888242871839275222246405745257275088548364400416034343698203997155994943700, + 21888242871839275222246405745257275088548364400416034343698204134670918971186, + 21888242871839275222246405745257275088548364400416034343698203913049065790359, + 285417840567989, + 21888242871839275222246405745257275088548364400416034343698203943985493600625, + 21888242871839275222246405745257275088548364400416034343698203969686095503185, + 200338003557857, + 21888242871839275222246405745257275088548364400416034343698203719218165033134, + 371752966691132, + 21888242871839275222246405745257275088548364400416034343698203655594413939655, + 21888242871839275222246405745257275088548364400416034343698203975525725254382, + 21888242871839275222246405745257275088548364400416034343698204126029936702673, + 340013040291137, + 341353624143362, + 231856065902830, + 560078958761919, + 205189192887646, + 190194371172687, + 264145668789630, + 21888242871839275222246405745257275088548364400416034343698203955042016335398, + 21888242871839275222246405745257275088548364400416034343698203847065893794578, + 278108507577857, + 533528909933631, + 223031388546764, + 21888242871839275222246405745257275088548364400416034343698203782709747725661, + 352021024329239, + 523873129018058, + 21888242871839275222246405745257275088548364400416034343698204043401814677274, + 479275401066157, + 21888242871839275222246405745257275088548364400416034343698203723343092796029, + 180031301236193, + 409720638655857, + 21888242871839275222246405745257275088548364400416034343698203897915967303181, + 517372832794926, + 131465232334953, + 21888242871839275222246405745257275088548364400416034343698203831963502734671, + 21888242871839275222246405745257275088548364400416034343698204074399357745009, + 252126292678793, + 423963896733399, + 21888242871839275222246405745257275088548364400416034343698203763025070545993, + 486749441640127, + 21888242871839275222246405745257275088548364400416034343698203993615081396785, + 21888242871839275222246405745257275088548364400416034343698203977205953019069, + 168838664335199, + 188322608183749, + 21888242871839275222246405745257275088548364400416034343698203666950746249877, + 401546940392755, + 21888242871839275222246405745257275088548364400416034343698203665091310115851, + 21888242871839275222246405745257275088548364400416034343698203965690653946447, + 21888242871839275222246405745257275088548364400416034343698203705963714584183, + 21888242871839275222246405745257275088548364400416034343698203751167090819787, + 21888242871839275222246405745257275088548364400416034343698204043785680960324, + 535926418966026, + 21888242871839275222246405745257275088548364400416034343698204016983073278348, + 21888242871839275222246405745257275088548364400416034343698204088347397790940, + 21888242871839275222246405745257275088548364400416034343698203871955228220378, + 558147790057014, + 451166000260617, + 277944233212509, + 382021047646771, + 21888242871839275222246405745257275088548364400416034343698203902368894054026, + 501556613464872, + 166895717928040, + 213651183447547, + 21888242871839275222246405745257275088548364400416034343698203920241014795223, + 223030229670040, + 68792433815718, + 122901161060258, + 21888242871839275222246405745257275088548364400416034343698203669741793327379, + 21888242871839275222246405745257275088548364400416034343698203922705349672056, + 389059086492716, + 515290772091069, + 322174483232939, + 196067791316699, + 21888242871839275222246405745257275088548364400416034343698204133961992093858, + 21888242871839275222246405745257275088548364400416034343698204070248926017708, + 172928498951264, + 498770562399500, + 21888242871839275222246405745257275088548364400416034343698203636007648702233, + 21888242871839275222246405745257275088548364400416034343698204115131596169901, + 167817112020696, + 21888242871839275222246405745257275088548364400416034343698203881145677350829, + 21888242871839275222246405745257275088548364400416034343698203846695061769196, + 21888242871839275222246405745257275088548364400416034343698203798841586973663, + 541645926634899, + 21888242871839275222246405745257275088548364400416034343698203751426755290079, + 295567634527813, + 21888242871839275222246405745257275088548364400416034343698203693850134187908, + 399123784623517, + 21888242871839275222246405745257275088548364400416034343698203894002378893310, + 21888242871839275222246405745257275088548364400416034343698203971874973559100, + 301675206383567, + 21888242871839275222246405745257275088548364400416034343698203746861615635045, + 21888242871839275222246405745257275088548364400416034343698203669458557855027, + 21888242871839275222246405745257275088548364400416034343698203749372200236414, + 379594620632056, + 21888242871839275222246405745257275088548364400416034343698203978290391452315, + 21888242871839275222246405745257275088548364400416034343698203633595559657404, + 21888242871839275222246405745257275088548364400416034343698204179572252270572, + 21888242871839275222246405745257275088548364400416034343698203889362717361488, + 505000315033651, + 21888242871839275222246405745257275088548364400416034343698203722278087819755, + 371202627240024, + 21888242871839275222246405745257275088548364400416034343698203885303911819824, + 354094051975844, + 33329408609717, + 21888242871839275222246405745257275088548364400416034343698203908966888055322, + 279942948670036, + 21888242871839275222246405745257275088548364400416034343698203704228314263976, + 268623569285662, + 338943426373657, + 280951870797278, + 285408910264074, + 32310287997707, + 221376489071452, + 21888242871839275222246405745257275088548364400416034343698203981141148613593, + 444442592109274, + 21888242871839275222246405745257275088548364400416034343698203904756565687915, + 446578444635012, + 21888242871839275222246405745257275088548364400416034343698203716652839596663, + 179224273273735, + 21888242871839275222246405745257275088548364400416034343698204113784418299855, + 21888242871839275222246405745257275088548364400416034343698203911117109082768, + 21888242871839275222246405745257275088548364400416034343698203778441636664858, + 12269707755836, + 414944238906954, + 491860143921072, + 277955364757732, + 21888242871839275222246405745257275088548364400416034343698203762045219785338, + 9781825299871, + 21888242871839275222246405745257275088548364400416034343698204030020751530644, + 21888242871839275222246405745257275088548364400416034343698203902544000435321, + 21888242871839275222246405745257275088548364400416034343698204153441943758937, + 50586914489237, + 21888242871839275222246405745257275088548364400416034343698204019603709939763, + 21888242871839275222246405745257275088548364400416034343698204135552460997561, + 262892250411242, + 21888242871839275222246405745257275088548364400416034343698203994683201740603, + 82737224267389, + 423333097687402, + 21888242871839275222246405745257275088548364400416034343698203693834683815609, + 21888242871839275222246405745257275088548364400416034343698203697577909343856, + 21888242871839275222246405745257275088548364400416034343698203653476027694980, + 21888242871839275222246405745257275088548364400416034343698203686113700694392, + 339657059766044, + 21888242871839275222246405745257275088548364400416034343698203661481976982022, + 367681713270892, + 21888242871839275222246405745257275088548364400416034343698203644297857904996, + 21888242871839275222246405745257275088548364400416034343698204103081841989384, + 216307591171413, + 147442966912974, + 243197679323613, + 422030037478659, + 21888242871839275222246405745257275088548364400416034343698203717945260904844, + 545341490437687, + 21888242871839275222246405745257275088548364400416034343698203979124723989618, + 21888242871839275222246405745257275088548364400416034343698203857340614154993, + 555193345506329, + 113073901770710, + 21888242871839275222246405745257275088548364400416034343698203780610797105257, + 253398413263634, + 545133240666832, + 285505474700967, + 21888242871839275222246405745257275088548364400416034343698203767407292572998, + 117066196251429, + 21888242871839275222246405745257275088548364400416034343698204120298762332558, + 517209392783076, + 21888242871839275222246405745257275088548364400416034343698203687668499004773, + 464108984750950, + 21888242871839275222246405745257275088548364400416034343698203753262443909813, + 21888242871839275222246405745257275088548364400416034343698203634021806916654, + 21888242871839275222246405745257275088548364400416034343698204070136608146836, + 336666759806327, + 140757014954656, + 354676614974164, + 21888242871839275222246405745257275088548364400416034343698203663924574474930, + 21888242871839275222246405745257275088548364400416034343698204050265774733967, + 21888242871839275222246405745257275088548364400416034343698204034117656717151, + 21888242871839275222246405745257275088548364400416034343698203659083552205398, + 296914361099297, + 381832983800176, + 21888242871839275222246405745257275088548364400416034343698204124416785577484, + 21888242871839275222246405745257275088548364400416034343698203998724114083899, + 291704541512677, + 351261422396882, + 126586175180655, + 197323676443812, + 21888242871839275222246405745257275088548364400416034343698203771454379547460, + 480344667651708, + 249053552979482, + 21888242871839275222246405745257275088548364400416034343698203654725746281962, + 250543972645960, + 21888242871839275222246405745257275088548364400416034343698204053184694690036, + 106064314649416, + 340397804510957, + 21888242871839275222246405745257275088548364400416034343698203828789953417679, + 444740092595431, + 21888242871839275222246405745257275088548364400416034343698203940099285782255, + 153116639448359, + 21888242871839275222246405745257275088548364400416034343698204018457872767832, + 21888242871839275222246405745257275088548364400416034343698203891768022717598, + 21888242871839275222246405745257275088548364400416034343698203626271799038762, + 21888242871839275222246405745257275088548364400416034343698203986774656361188, + 21888242871839275222246405745257275088548364400416034343698203625457256705081, + 21888242871839275222246405745257275088548364400416034343698203752166827390742, + 508672308468041, + 21888242871839275222246405745257275088548364400416034343698203710610652396559, + 21888242871839275222246405745257275088548364400416034343698203819677212439498, + 244954917149199, + 60505272463186, + 21888242871839275222246405745257275088548364400416034343698203931427307750555, + 21888242871839275222246405745257275088548364400416034343698203853946713712991, + 130810650973042, + 282130321249661, + 283542119232546, + 21888242871839275222246405745257275088548364400416034343698203989036973439917, + 21888242871839275222246405745257275088548364400416034343698203741897603204078, + 117349789310866, + 152273422134992, + 21888242871839275222246405745257275088548364400416034343698204047480293620275, + 267274813499897, + 126508560951243, + 21888242871839275222246405745257275088548364400416034343698204146049283508639, + 21888242871839275222246405745257275088548364400416034343698203686956464906536, + 363426757551565, + 21888242871839275222246405745257275088548364400416034343698204104811269391931, + 502495919960655, + 21888242871839275222246405745257275088548364400416034343698203923154302727927, + 21888242871839275222246405745257275088548364400416034343698203663549597794764, + 21888242871839275222246405745257275088548364400416034343698204070486653484534, + 58295435071969, + 21888242871839275222246405745257275088548364400416034343698203848910432264174, + 93613379176168, + 21888242871839275222246405745257275088548364400416034343698203825645866939023, + 517714543909154, + 21888242871839275222246405745257275088548364400416034343698203987084333782173, + 21888242871839275222246405745257275088548364400416034343698203982879273675509, + 140578736622588, + 279919994582064, + 140134810197867, + 522252249798495, + 21888242871839275222246405745257275088548364400416034343698204090450730703204, + 529992339760970, + 21888242871839275222246405745257275088548364400416034343698203986075462959638, + 21888242871839275222246405745257275088548364400416034343698203907044977523400, + 472197251770232, + 72983106245344, + 544889644913078, + 322066716883774, + 21888242871839275222246405745257275088548364400416034343698203669330875923134, + 102486458783616, + 429226282609426, + 21888242871839275222246405745257275088548364400416034343698203625202899066510, + 444753538648675, + 21888242871839275222246405745257275088548364400416034343698203973440399905502, + 21888242871839275222246405745257275088548364400416034343698203657509698558510, + 21888242871839275222246405745257275088548364400416034343698203715048745837962, + 306249940113565, + 21888242871839275222246405745257275088548364400416034343698204142841068492487, + 21888242871839275222246405745257275088548364400416034343698203719010674541262, + 21888242871839275222246405745257275088548364400416034343698204052999368745919, + 21888242871839275222246405745257275088548364400416034343698203937359498276535, + 21888242871839275222246405745257275088548364400416034343698203952760365898802, + 491177415524154, + 21888242871839275222246405745257275088548364400416034343698203878934213556845, + 21888242871839275222246405745257275088548364400416034343698203779407073449023, + 21888242871839275222246405745257275088548364400416034343698204125690180323164, + 309413013047808, + 21888242871839275222246405745257275088548364400416034343698203681314128030354, + 35330892042415, + 213421220730885, + 21888242871839275222246405745257275088548364400416034343698204112850039865477, + 21888242871839275222246405745257275088548364400416034343698203781221836219471, + 500316475201831, + 387185654432523, + 21888242871839275222246405745257275088548364400416034343698203641382043564272, + 21888242871839275222246405745257275088548364400416034343698203817194939689712, + 21888242871839275222246405745257275088548364400416034343698204055628546715126, + 21888242871839275222246405745257275088548364400416034343698203632551058439188, + 493604840560412, + 442748664348130, + 21888242871839275222246405745257275088548364400416034343698203627089216520513, + 21888242871839275222246405745257275088548364400416034343698204135958639361594, + 362361975396944, + 21888242871839275222246405745257275088548364400416034343698204068805255963469, + 422413482904826, + 356760777375659, + 540873587429700, + 300082749174212, + 21888242871839275222246405745257275088548364400416034343698203817243764711664, + 21888242871839275222246405745257275088548364400416034343698204000557067826404, + 21888242871839275222246405745257275088548364400416034343698203666841555910701, + 113638377807748, + 21888242871839275222246405745257275088548364400416034343698203802942379610572, + 348787104220543, + 211928263795004, + 21888242871839275222246405745257275088548364400416034343698203714715449525884, + 76426964791622, + 464495712988473, + 243698441915469, + 21888242871839275222246405745257275088548364400416034343698203928815408665940, + 21888242871839275222246405745257275088548364400416034343698204061305653549109, + 21888242871839275222246405745257275088548364400416034343698203942900529557688, + 21888242871839275222246405745257275088548364400416034343698203915291063147233, + 509964383939254, + 70259705210937, + 21888242871839275222246405745257275088548364400416034343698204114646647098752, + 21888242871839275222246405745257275088548364400416034343698204001196563802248, + 21888242871839275222246405745257275088548364400416034343698203786920284294890, + 21888242871839275222246405745257275088548364400416034343698203789057270814130, + 313676195858816, + 21888242871839275222246405745257275088548364400416034343698203816446675953864, + 21888242871839275222246405745257275088548364400416034343698203774098496697493, + 21888242871839275222246405745257275088548364400416034343698203872689048731808, + 21888242871839275222246405745257275088548364400416034343698203841144057596982, + 115493249976309, + 21888242871839275222246405745257275088548364400416034343698203632503705060730, + 58193134387566, + 21888242871839275222246405745257275088548364400416034343698204074424117643752, + 511277967235989, + 476457573723997, + 21888242871839275222246405745257275088548364400416034343698204139380906359483, + 80526513974504, + 263094146466803, + 21888242871839275222246405745257275088548364400416034343698203736389660744259, + 21863058512165, + 21888242871839275222246405745257275088548364400416034343698204083312048976261, + 30450551055457, + 21888242871839275222246405745257275088548364400416034343698203743741191260457, + 448339468260317, + 202455890502066, + 397434737471870, + 275906452423478, + 445108189922524, + 21888242871839275222246405745257275088548364400416034343698204141278118680337, + 21888242871839275222246405745257275088548364400416034343698203712100845669881, + 21888242871839275222246405745257275088548364400416034343698204086377144371879, + 314759001915507, + 21888242871839275222246405745257275088548364400416034343698204122521730772663, + 146426737206209, + 21888242871839275222246405745257275088548364400416034343698203945873980723734, + 21888242871839275222246405745257275088548364400416034343698203915102616556139, + 21888242871839275222246405745257275088548364400416034343698203973383281778611, + 21888242871839275222246405745257275088548364400416034343698203848799752710798, + 464784373023597, + 514525635327677, + 102336499813792, + 21888242871839275222246405745257275088548364400416034343698203906182815333621, + 21888242871839275222246405745257275088548364400416034343698204172705326663524, + 21888242871839275222246405745257275088548364400416034343698203933623735756417, + 21888242871839275222246405745257275088548364400416034343698204164223869321346, + 21888242871839275222246405745257275088548364400416034343698204045952801719527, + 21888242871839275222246405745257275088548364400416034343698204081762980354823, + 21888242871839275222246405745257275088548364400416034343698203628179376958124, + 125030839504729, + 21888242871839275222246405745257275088548364400416034343698203776232350250562, + 21888242871839275222246405745257275088548364400416034343698204130944445555693, + 21888242871839275222246405745257275088548364400416034343698203658251539621217, + 328294347486602, + 213051771744154, + 21888242871839275222246405745257275088548364400416034343698203799693435034041, + 21888242871839275222246405745257275088548364400416034343698203642872527957575, + 21888242871839275222246405745257275088548364400416034343698203841384127891263, + 400072047427887, + 21888242871839275222246405745257275088548364400416034343698203967890074301575, + 102329497051451, + 21888242871839275222246405745257275088548364400416034343698204107897756727992, + 21888242871839275222246405745257275088548364400416034343698203651232191386215, + 21888242871839275222246405745257275088548364400416034343698203636415291961121, + 275145552823948, + 117010689690771, + 21888242871839275222246405745257275088548364400416034343698203629017018594201, + 431485018238056, + 222875076692817, + 88336442387155, + 66458586736318, + 99661667173957, + 21888242871839275222246405745257275088548364400416034343698204172126592921719, + 21888242871839275222246405745257275088548364400416034343698204163730844441523, + 21888242871839275222246405745257275088548364400416034343698203894880439841206, + 523103758957948, + 21888242871839275222246405745257275088548364400416034343698203838785120800369, + 13321577095597, + 21888242871839275222246405745257275088548364400416034343698204134295871641224, + 215744619533311, + 410336448376225, + 143022012632352, + 159061321384209, + 21888242871839275222246405745257275088548364400416034343698203861127861755815, + 276056633972398, + 288250734348892, + 21888242871839275222246405745257275088548364400416034343698204008159087693298, + 548053159087413, + 21888242871839275222246405745257275088548364400416034343698203986732297728238, + 332654246456782, + 21888242871839275222246405745257275088548364400416034343698203818742983901268, + 544337369700177, + 389811602905385, + 21888242871839275222246405745257275088548364400416034343698203958679030172991, + 21888242871839275222246405745257275088548364400416034343698204095759843040871, + 294124682793299, + 21888242871839275222246405745257275088548364400416034343698204184761519490616, + 406470615191768, + 21888242871839275222246405745257275088548364400416034343698204015388663631342, + 21888242871839275222246405745257275088548364400416034343698204085358617526329, + 487213698454643, + 459927653442161, + 21888242871839275222246405745257275088548364400416034343698203647809278171340, + 365543023176042, + 404547419214209, + 21888242871839275222246405745257275088548364400416034343698203727062088901929, + 21888242871839275222246405745257275088548364400416034343698203930856244799448, + 21888242871839275222246405745257275088548364400416034343698203663993920433156, + 21888242871839275222246405745257275088548364400416034343698204103183511693123, + 296419974897685, + 86116224427896, + 342671877716026, + 49653161666854, + 21888242871839275222246405745257275088548364400416034343698203802518998014954, + 21888242871839275222246405745257275088548364400416034343698203735275924873752, + 21888242871839275222246405745257275088548364400416034343698203684495305561875, + 21888242871839275222246405745257275088548364400416034343698203792665973244754, + 21888242871839275222246405745257275088548364400416034343698203826205270019658, + 21888242871839275222246405745257275088548364400416034343698204031130537720820, + 76764315108547, + 21888242871839275222246405745257275088548364400416034343698203744201202197000, + 139077381633523, + 202576672396649, + 21888242871839275222246405745257275088548364400416034343698203877496076759673, + 70243678816150, + 449803884222388, + 25625639898772, + 421619599979980, + 204627498601485, + 247214238178623, + 21888242871839275222246405745257275088548364400416034343698203752173856978139, + 463415446436921, + 21888242871839275222246405745257275088548364400416034343698204056409235865515, + 21888242871839275222246405745257275088548364400416034343698203658484325852684, + 21888242871839275222246405745257275088548364400416034343698203868234932729013, + 21888242871839275222246405745257275088548364400416034343698203867424134138919, + 176834018430268, + 21888242871839275222246405745257275088548364400416034343698204137239248534839, + 383655184362284, + 121575431668923, + 149137549991018, + 406322711752356, + 452227489606419, + 21888242871839275222246405745257275088548364400416034343698203740914711871437, + 273645757301169, + 419780882877992, + 21888242871839275222246405745257275088548364400416034343698203956849731571792, + 21888242871839275222246405745257275088548364400416034343698204064695603583478, + 448307585252002, + 160228291682996, + 21888242871839275222246405745257275088548364400416034343698203687321657218797, + 23924329505973, + 275172503481556, + 21888242871839275222246405745257275088548364400416034343698203767813995754262, + 21888242871839275222246405745257275088548364400416034343698203901744719151912, + 21888242871839275222246405745257275088548364400416034343698203635473079536206, + 339677639321891, + 410652087951904, + 97312758982906, + 99266119218134, + 21888242871839275222246405745257275088548364400416034343698203942858832694422, + 21888242871839275222246405745257275088548364400416034343698204064574327555664, + 21888242871839275222246405745257275088548364400416034343698203886786364928828, + 21888242871839275222246405745257275088548364400416034343698203871735190989333, + 101841315683477, + 21888242871839275222246405745257275088548364400416034343698204011130246219626, + 511949561823412, + 21888242871839275222246405745257275088548364400416034343698203660212560919923, + 287495216411067, + 21888242871839275222246405745257275088548364400416034343698203883212736379135, + 223328892548998, + 21888242871839275222246405745257275088548364400416034343698204036987588176725, + 155976768559876, + 21888242871839275222246405745257275088548364400416034343698204081960973089096, + 21888242871839275222246405745257275088548364400416034343698204050216161660839, + 21888242871839275222246405745257275088548364400416034343698204009973507538835, + 21888242871839275222246405745257275088548364400416034343698203880728391364600, + 492589054208900, + 341172758230886, + 21888242871839275222246405745257275088548364400416034343698204119781858294479, + 21888242871839275222246405745257275088548364400416034343698203860493456514433, + 21888242871839275222246405745257275088548364400416034343698203852867928843088, + 21888242871839275222246405745257275088548364400416034343698204082333299984827, + 21888242871839275222246405745257275088548364400416034343698204038236112799332, + 21888242871839275222246405745257275088548364400416034343698203852250028262863, + 21888242871839275222246405745257275088548364400416034343698203798949800973855, + 268742659471037, + 59518838078371, + 21888242871839275222246405745257275088548364400416034343698203955848668970811, + 21888242871839275222246405745257275088548364400416034343698204005315328935840, + 479052988481138, + 21888242871839275222246405745257275088548364400416034343698204068371578086737, + 376169040920816, + 21888242871839275222246405745257275088548364400416034343698203692077336562851, + 375817425343464, + 114344175668499, + 21888242871839275222246405745257275088548364400416034343698203907286521057913, + 422376820057198, + 15455900304356, + 21888242871839275222246405745257275088548364400416034343698203674975418650094, + 21888242871839275222246405745257275088548364400416034343698203673032650787155, + 21888242871839275222246405745257275088548364400416034343698203933909100220785, + 384619633844402, + 21888242871839275222246405745257275088548364400416034343698203876685423885806, + 21888242871839275222246405745257275088548364400416034343698204054929852750738, + 21888242871839275222246405745257275088548364400416034343698203923208441250755, + 387219716873167, + 142680340102658, + 21888242871839275222246405745257275088548364400416034343698204097641730975929, + 539299218665145, + 256788671999884, + 21888242871839275222246405745257275088548364400416034343698203954439736294809, + 21888242871839275222246405745257275088548364400416034343698203829289090716110, + 501950774496370, + 508906975253678, + 329164491056008, + 531675128203726, + 21888242871839275222246405745257275088548364400416034343698203678628894644543, + 21888242871839275222246405745257275088548364400416034343698204046181120333227, + 337865432636341, + 21888242871839275222246405745257275088548364400416034343698203766887492018739, + 21888242871839275222246405745257275088548364400416034343698203926522434643078, + 428988407847704, + 21888242871839275222246405745257275088548364400416034343698203733845556104406, + 289766584035505, + 397045163413831, + 442443957185932, + 21888242871839275222246405745257275088548364400416034343698203907997343685659, + 485615499028158, + 21888242871839275222246405745257275088548364400416034343698203644018340097771, + 174884369253576, + 285871314324201, + 21888242871839275222246405745257275088548364400416034343698204157974786311164, + 21888242871839275222246405745257275088548364400416034343698203818939724580424, + 21888242871839275222246405745257275088548364400416034343698203998760338826042, + 21888242871839275222246405745257275088548364400416034343698204155019989541232, + 21888242871839275222246405745257275088548364400416034343698204066979068898548, + 21888242871839275222246405745257275088548364400416034343698204005158786515890, + 21888242871839275222246405745257275088548364400416034343698204126235116128848, + 21888242871839275222246405745257275088548364400416034343698203994117037229089, + 21888242871839275222246405745257275088548364400416034343698203898268006722205, + 376436743387509, + 66054897734461, + 19929051025224, + 21888242871839275222246405745257275088548364400416034343698204058115558521614, + 21888242871839275222246405745257275088548364400416034343698203817424175898315, + 154265922162751, + 21888242871839275222246405745257275088548364400416034343698203773137401696040, + 411546615861722, + 85058134914661, + 21888242871839275222246405745257275088548364400416034343698204101216174331502, + 21888242871839275222246405745257275088548364400416034343698204183152949561545, + 21888242871839275222246405745257275088548364400416034343698203649288221746296, + 272995556005780, + 21888242871839275222246405745257275088548364400416034343698204088112150768002, + 21888242871839275222246405745257275088548364400416034343698203914152999317025, + 21888242871839275222246405745257275088548364400416034343698203979471830847904, + 21888242871839275222246405745257275088548364400416034343698204183868599100149, + 451733238395428, + 359817338037906, + 21888242871839275222246405745257275088548364400416034343698204032238048222592, + 135260266685299, + 497213621792370, + 21888242871839275222246405745257275088548364400416034343698203907343133172699, + 426105849210740, + 21888242871839275222246405745257275088548364400416034343698203703641248254227, + 21888242871839275222246405745257275088548364400416034343698204052769586167152, + 529704985469197, + 21888242871839275222246405745257275088548364400416034343698203914753108938457, + 21888242871839275222246405745257275088548364400416034343698203871080879446623, + 21888242871839275222246405745257275088548364400416034343698203753555116742895, + 21888242871839275222246405745257275088548364400416034343698203701852421917290, + 21888242871839275222246405745257275088548364400416034343698203787896021257713, + 222714253918319, + 16531615147410, + 373952501535693, + 161359397050556, + 190769793301586, + 429768027405358, + 21888242871839275222246405745257275088548364400416034343698203983892550320521, + 21888242871839275222246405745257275088548364400416034343698203747212755213764, + 136600692597381, + 471489888058418, + 21888242871839275222246405745257275088548364400416034343698203890340126929617, + 415988269083183, + 135328688870222, + 21888242871839275222246405745257275088548364400416034343698204061269530536196, + 21888242871839275222246405745257275088548364400416034343698203830394246699198, + 250910670019821, + 284653314535226, + 511914836124814, + 548458468944400, + 214313214163745, + 21888242871839275222246405745257275088548364400416034343698203701627423475434, + 411153225695651, + 21888242871839275222246405745257275088548364400416034343698203678367099437348, + 21888242871839275222246405745257275088548364400416034343698203882753860523137, + 21888242871839275222246405745257275088548364400416034343698204058050795881531, + 21888242871839275222246405745257275088548364400416034343698203914145737099564, + 228637412037316, + 182271836917561, + 143024510992710, + 21888242871839275222246405745257275088548364400416034343698203994301739797187, + 21888242871839275222246405745257275088548364400416034343698204139287496769333, + 134777412707721, + 211914758009619, + 244875365573402, + 21888242871839275222246405745257275088548364400416034343698203949958116517084, + 21888242871839275222246405745257275088548364400416034343698203821992126848602, + 71968916873655, + 21888242871839275222246405745257275088548364400416034343698204129284811866943, + 382830173386239, + 315855903238649, + 21888242871839275222246405745257275088548364400416034343698203710449384515121, + 21888242871839275222246405745257275088548364400416034343698203880078809606439, + 21888242871839275222246405745257275088548364400416034343698204144156729586187, + 178738812016413, + 93326257590340, + 21888242871839275222246405745257275088548364400416034343698203806162200997283, + 37693792137742, + 21888242871839275222246405745257275088548364400416034343698203843582223315187, + 45693862809874, + 21888242871839275222246405745257275088548364400416034343698203756052157911214, + 117817033734848, + 21888242871839275222246405745257275088548364400416034343698204145613466956737, + 71916266393364, + 21888242871839275222246405745257275088548364400416034343698203768527048624337, + 243509673975440, + 21888242871839275222246405745257275088548364400416034343698204074193551647366, + 511385625801334, + 102874951041423, + 21888242871839275222246405745257275088548364400416034343698203663941027258583, + 21888242871839275222246405745257275088548364400416034343698203676814861716253, + 21888242871839275222246405745257275088548364400416034343698203748123006671825, + 21888242871839275222246405745257275088548364400416034343698203980041698086740, + 320349536648687, + 434770259064353, + 496565114852299, + 21888242871839275222246405745257275088548364400416034343698203715082687846081, + 21888242871839275222246405745257275088548364400416034343698203650788627317607, + 175921242934239, + 442430422203602, + 21888242871839275222246405745257275088548364400416034343698203668574816233881, + 21888242871839275222246405745257275088548364400416034343698203668337371568267, + 21888242871839275222246405745257275088548364400416034343698204148814554324765, + 21888242871839275222246405745257275088548364400416034343698204058634674075248, + 23466478011187, + 21888242871839275222246405745257275088548364400416034343698204096203025265211, + 21888242871839275222246405745257275088548364400416034343698203743580530777487, + 21888242871839275222246405745257275088548364400416034343698204168060505377456, + 480840185679751, + 526606999624385, + 203249384594566, + 21888242871839275222246405745257275088548364400416034343698203940822312642464, + 21888242871839275222246405745257275088548364400416034343698203713990617236055, + 455044689934727, + 257786497828565, + 21888242871839275222246405745257275088548364400416034343698204091208462409958, + 21888242871839275222246405745257275088548364400416034343698204055714834679394, + 121153897255667, + 21888242871839275222246405745257275088548364400416034343698204173481362633902, + 21888242871839275222246405745257275088548364400416034343698203704708439370290, + 220968091356433, + 453088497391628, + 491054108899192, + 111165853029527, + 122227914671204, + 443183627607822, + 238703831403283, + 284314592348549, + 21888242871839275222246405745257275088548364400416034343698203925151312778136, + 21888242871839275222246405745257275088548364400416034343698203991855962774951, + 21888242871839275222246405745257275088548364400416034343698204066250164005964, + 21888242871839275222246405745257275088548364400416034343698204010796674638322, + 381702580643512, + 382833232215817, + 397033135452107, + 21888242871839275222246405745257275088548364400416034343698203628541423007381, + 21888242871839275222246405745257275088548364400416034343698204153279704765382, + 331848718215857, + 123969570037847, + 356150751009894, + 21888242871839275222246405745257275088548364400416034343698203910358009885760, + 384256954209992, + 21888242871839275222246405745257275088548364400416034343698204107479402108922, + 277015282365055, + 325840199924552, + 431884875774560, + 21888242871839275222246405745257275088548364400416034343698203826571158765501, + 212045129283458, + 324215238740131, + 21888242871839275222246405745257275088548364400416034343698203685247005623675, + 151211019561215, + 21888242871839275222246405745257275088548364400416034343698203710241512040296, + 120140802448409, + 361576036906600, + 21888242871839275222246405745257275088548364400416034343698203887611687382548, + 21888242871839275222246405745257275088548364400416034343698203871270139243574, + 21888242871839275222246405745257275088548364400416034343698203961427532671941, + 404812734923450, + 21888242871839275222246405745257275088548364400416034343698204086451840249943, + 21888242871839275222246405745257275088548364400416034343698204132515915043581, + 21888242871839275222246405745257275088548364400416034343698203833597218827662, + 202105254718253, + 21888242871839275222246405745257275088548364400416034343698203856383457728607, + 21888242871839275222246405745257275088548364400416034343698203740150461915916, + 21888242871839275222246405745257275088548364400416034343698203863825295264591, + 21888242871839275222246405745257275088548364400416034343698203873020776966460, + 465769023672405, + 21888242871839275222246405745257275088548364400416034343698203818887167491292, + 21888242871839275222246405745257275088548364400416034343698204119788880604551, + 21888242871839275222246405745257275088548364400416034343698204100870272538763, + 149420385456014, + 550070006531955, + 21888242871839275222246405745257275088548364400416034343698203894691121091336, + 61292719596994, + 349420976793782, + 523907952154879, + 21888242871839275222246405745257275088548364400416034343698203714844406816435, + 309312773082284, + 133839463823551, + 21888242871839275222246405745257275088548364400416034343698204061605867656399, + 21888242871839275222246405745257275088548364400416034343698203693374517897129, + 21888242871839275222246405745257275088548364400416034343698203747319570622170, + 21888242871839275222246405745257275088548364400416034343698203773073991552887, + 21888242871839275222246405745257275088548364400416034343698204152330644711734, + 21888242871839275222246405745257275088548364400416034343698203720752865162636, + 21888242871839275222246405745257275088548364400416034343698203795947050684268, + 21888242871839275222246405745257275088548364400416034343698203838951514170485, + 480573808955877, + 21888242871839275222246405745257275088548364400416034343698203808044842378021, + 265616232147897, + 497503228770405, + 52471741848519, + 515448992617407, + 410434804665502, + 21888242871839275222246405745257275088548364400416034343698203874463025959542, + 475208449759860, + 21888242871839275222246405745257275088548364400416034343698203764168304386923, + 517682295421068, + 21888242871839275222246405745257275088548364400416034343698203973194560589448, + 21888242871839275222246405745257275088548364400416034343698203769803948874015, + 21888242871839275222246405745257275088548364400416034343698203740744527765849, + 21888242871839275222246405745257275088548364400416034343698203750627777071453, + 21888242871839275222246405745257275088548364400416034343698204066008901289942, + 137292112331493, + 21888242871839275222246405745257275088548364400416034343698204076239550560138, + 21888242871839275222246405745257275088548364400416034343698204181329160672559, + 69914778402691, + 21888242871839275222246405745257275088548364400416034343698203874044372583940, + 21888242871839275222246405745257275088548364400416034343698203786226729401097, + 448728509152325, + 21888242871839275222246405745257275088548364400416034343698204010607837904475, + 21888242871839275222246405745257275088548364400416034343698203767812944832547, + 21888242871839275222246405745257275088548364400416034343698204099378554801761, + 21888242871839275222246405745257275088548364400416034343698203657642925045695, + 21888242871839275222246405745257275088548364400416034343698203761288847139962, + 433013414185680, + 479553099855019, + 21888242871839275222246405745257275088548364400416034343698204069573468093630, + 174413095715941, + 550478614288350, + 302091778836892, + 21888242871839275222246405745257275088548364400416034343698203948582302560627, + 21888242871839275222246405745257275088548364400416034343698203970402290508651, + 21888242871839275222246405745257275088548364400416034343698204044776635614977, + 21888242871839275222246405745257275088548364400416034343698204035288448994466, + 21888242871839275222246405745257275088548364400416034343698204132625860664875, + 192858429509556, + 466895147901181, + 190609738283115, + 9142577538311, + 468746285739409, + 21888242871839275222246405745257275088548364400416034343698203766514268535044, + 21888242871839275222246405745257275088548364400416034343698203628634983264064, + 21888242871839275222246405745257275088548364400416034343698203681924608767229, + 21888242871839275222246405745257275088548364400416034343698203816102445550804, + 21888242871839275222246405745257275088548364400416034343698203928881677254108, + 21888242871839275222246405745257275088548364400416034343698203985684840546078, + 21888242871839275222246405745257275088548364400416034343698204068744034319898, + 21888242871839275222246405745257275088548364400416034343698203771458287106897, + 466395058556509, + 292740933775094, + 21888242871839275222246405745257275088548364400416034343698204065208555957320, + 21888242871839275222246405745257275088548364400416034343698203936012792977856, + 496593372255850, + 540398559433285, + 21888242871839275222246405745257275088548364400416034343698203817992357211166, + 21888242871839275222246405745257275088548364400416034343698204064143338486167, + 202383397510233, + 210113235116801, + 192054096756344, + 45160168170692, + 298651262457267, + 198139202021017, + 21888242871839275222246405745257275088548364400416034343698203795230641838722, + 192752169235372, + 21888242871839275222246405745257275088548364400416034343698203665409095445600, + 21888242871839275222246405745257275088548364400416034343698203824759762785123, + 521288011505152, + 21888242871839275222246405745257275088548364400416034343698204124634798215688, + 337964832759426, + 21888242871839275222246405745257275088548364400416034343698203985435238365923, + 11634123630105, + 401791775476175, + 269056743323297, + 21888242871839275222246405745257275088548364400416034343698203634072924273584, + 184716917705211, + 21888242871839275222246405745257275088548364400416034343698203849699988494545, + 21888242871839275222246405745257275088548364400416034343698204018287988430743, + 21888242871839275222246405745257275088548364400416034343698203910453856668414, + 281395085866066, + 21888242871839275222246405745257275088548364400416034343698203676330572101059, + 21888242871839275222246405745257275088548364400416034343698204081224748213239, + 180460500248948, + 337213792631759, + 21888242871839275222246405745257275088548364400416034343698203948483125975258, + 68361945613130, + 21888242871839275222246405745257275088548364400416034343698203941192537847191, + 528314701972119, + 21888242871839275222246405745257275088548364400416034343698204156324098288823, + 21888242871839275222246405745257275088548364400416034343698203832657635496732, + 345523618501151, + 21888242871839275222246405745257275088548364400416034343698204138061078590177, + 62786418180993, + 341536938774769, + 21888242871839275222246405745257275088548364400416034343698203845457155818073, + 21888242871839275222246405745257275088548364400416034343698203869259205217751, + 21888242871839275222246405745257275088548364400416034343698203866267616237974, + 547127060301873, + 21888242871839275222246405745257275088548364400416034343698203805290751624720, + 185472905147194, + 21888242871839275222246405745257275088548364400416034343698204065883998400505, + 396860359078164, + 21888242871839275222246405745257275088548364400416034343698203766280874525211, + 21888242871839275222246405745257275088548364400416034343698203978045036048372, + 552944208076412, + 21888242871839275222246405745257275088548364400416034343698203961444254603543, + 21888242871839275222246405745257275088548364400416034343698203818819870960369, + 21888242871839275222246405745257275088548364400416034343698203816406403162425, + 21888242871839275222246405745257275088548364400416034343698203809589707559772, + 21888242871839275222246405745257275088548364400416034343698203706709415288632, + 30353387752953, + 38128681566937, + 21888242871839275222246405745257275088548364400416034343698203697440691141977, + 21888242871839275222246405745257275088548364400416034343698204070301517062163, + 510885509812387, + 21888242871839275222246405745257275088548364400416034343698204131072144879265, + 493769859264485, + 544238216313633, + 21888242871839275222246405745257275088548364400416034343698203789224882554925, + 21888242871839275222246405745257275088548364400416034343698203900483427676619, + 21888242871839275222246405745257275088548364400416034343698203945055267440559, + 136058809960573, + 21888242871839275222246405745257275088548364400416034343698204092935805919386, + 296688191560732, + 21888242871839275222246405745257275088548364400416034343698203888230369976618, + 21888242871839275222246405745257275088548364400416034343698203739950150262694, + 21888242871839275222246405745257275088548364400416034343698203795375317562919, + 559988746972626, + 321127117836924, + 482060500395770, + 150015977360320, + 21888242871839275222246405745257275088548364400416034343698204122146819589155, + 216672675725147, + 21888242871839275222246405745257275088548364400416034343698203907129978742519, + 21888242871839275222246405745257275088548364400416034343698203629640060094345, + 21888242871839275222246405745257275088548364400416034343698204012406677040699, + 21888242871839275222246405745257275088548364400416034343698203747511996573004, + 21888242871839275222246405745257275088548364400416034343698203683239290701299, + 359948824732791, + 206960632620379, + 21888242871839275222246405745257275088548364400416034343698204069005487089473, + 338926269393778, + 299903725223258, + 21888242871839275222246405745257275088548364400416034343698203676039495444468, + 292498865423191, + 21888242871839275222246405745257275088548364400416034343698203963238453410035, + 21888242871839275222246405745257275088548364400416034343698204090921616835755, + 21888242871839275222246405745257275088548364400416034343698204012604151536059, + 21888242871839275222246405745257275088548364400416034343698203800005744354618, + 296769611562925, + 486909918334689, + 21888242871839275222246405745257275088548364400416034343698204089115828280101, + 248271106445141, + 21888242871839275222246405745257275088548364400416034343698204082233789334176, + 21888242871839275222246405745257275088548364400416034343698203664396479198915, + 21888242871839275222246405745257275088548364400416034343698204099336655756171, + 21888242871839275222246405745257275088548364400416034343698203825856135596265, + 429025656983069, + 435235095158808, + 180665917295679, + 110758857837872, + 107611762019071, + 21888242871839275222246405745257275088548364400416034343698203751264151426332, + 21888242871839275222246405745257275088548364400416034343698203706084340240091, + 86937011898227, + 21888242871839275222246405745257275088548364400416034343698203788972221375929, + 21888242871839275222246405745257275088548364400416034343698203957173748176035, + 221224604817372, + 400569709777190, + 21888242871839275222246405745257275088548364400416034343698203850455291741200, + 21888242871839275222246405745257275088548364400416034343698203913462230574207, + 207370535138684, + 21888242871839275222246405745257275088548364400416034343698203855909878104960, + 107283218243465, + 21888242871839275222246405745257275088548364400416034343698203679255905653387, + 21888242871839275222246405745257275088548364400416034343698203849596982915132, + 502861856327808, + 389268847662133, + 21888242871839275222246405745257275088548364400416034343698204109509401380347, + 21888242871839275222246405745257275088548364400416034343698203688223508992542, + 27587183157944, + 253611001888754, + 21888242871839275222246405745257275088548364400416034343698203911550471419610, + 21888242871839275222246405745257275088548364400416034343698203819912901968794, + 21888242871839275222246405745257275088548364400416034343698204171519398978117, + 21888242871839275222246405745257275088548364400416034343698204031522664638575, + 21888242871839275222246405745257275088548364400416034343698203980206089447332, + 506285245654066, + 482094000904148, + 21888242871839275222246405745257275088548364400416034343698204133749061899639, + 214803006806215, + 241054651219786, + 21888242871839275222246405745257275088548364400416034343698203866135309389040, + 21888242871839275222246405745257275088548364400416034343698204031638549308850, + 530778362646098, + 334579063684680, + 322031093127351, + 528547470751076, + 475623096557297, + 21888242871839275222246405745257275088548364400416034343698203796025638849587, + 90999236178955, + 186750424590171, + 430761419269432, + 441563072643633, + 362142750615344, + 158097720182799, + 21888242871839275222246405745257275088548364400416034343698203629780369507725, + 505931424294016, + 324279135093288, + 367210210275339, + 21888242871839275222246405745257275088548364400416034343698203672576163954761, + 21888242871839275222246405745257275088548364400416034343698203793140835929353, + 21888242871839275222246405745257275088548364400416034343698203815497977802571, + 451630211084041, + 21888242871839275222246405745257275088548364400416034343698204106607457616041, + 516451722210012, + 242606770300215, + 416128666765079, + 21888242871839275222246405745257275088548364400416034343698203798093628191381, + 77798906127087, + 189687968531090, + 21888242871839275222246405745257275088548364400416034343698203719523193279628, + 248366832794706, + 21888242871839275222246405745257275088548364400416034343698203756939121393368, + 21888242871839275222246405745257275088548364400416034343698204073832516892496, + 342754625395472, + 121749963323222, + 106572644384573, + 242238243920224, + 21888242871839275222246405745257275088548364400416034343698204163416427107441, + 293065657618104, + 164052557013001, + 21888242871839275222246405745257275088548364400416034343698204065010329472355, + 21888242871839275222246405745257275088548364400416034343698203931562802053656, + 454844455068300, + 21888242871839275222246405745257275088548364400416034343698203740652359794095, + 21888242871839275222246405745257275088548364400416034343698203838114948570142, + 21888242871839275222246405745257275088548364400416034343698203733849886087885, + 96038417351354, + 21888242871839275222246405745257275088548364400416034343698203969183040985558, + 305189100499085, + 190397662901532, + 21888242871839275222246405745257275088548364400416034343698204081976645598969, + 21888242871839275222246405745257275088548364400416034343698204074471513336281, + 389433535731492, + 536456258768206, + 291045995288296, + 477283487577708, + 21888242871839275222246405745257275088548364400416034343698203761935820727418, + 21888242871839275222246405745257275088548364400416034343698203625464486642879, + 21888242871839275222246405745257275088548364400416034343698204064890485136080, + 161415819644711, + 324147211589732, + 526002199384834, + 21888242871839275222246405745257275088548364400416034343698203832747305546721, + 21888242871839275222246405745257275088548364400416034343698204021456824288848, + 21888242871839275222246405745257275088548364400416034343698203638671761601009, + 136269525136596, + 21888242871839275222246405745257275088548364400416034343698203713341397973025, + 21888242871839275222246405745257275088548364400416034343698203899216718655503, + 21888242871839275222246405745257275088548364400416034343698203956247460721586, + 408777150132387, + 21888242871839275222246405745257275088548364400416034343698204034222912188577, + 57968390182814, + 21888242871839275222246405745257275088548364400416034343698203770199180101687, + 225866138514524, + 21888242871839275222246405745257275088548364400416034343698204082779642881645, + 324426354301111, + 400570672276239, + 21888242871839275222246405745257275088548364400416034343698204022533167710180, + 155553111616235, + 40240921009007, + 120955228049043, + 195412527439585, + 376267517953794, + 21888242871839275222246405745257275088548364400416034343698204060471272408154, + 417311836001076, + 21888242871839275222246405745257275088548364400416034343698203713051896462749, + 320268739434428, + 463845526890018, + 21888242871839275222246405745257275088548364400416034343698204039155832642699, + 21888242871839275222246405745257275088548364400416034343698203956531273129800, + 442944189813326, + 529530838834430, + 476696871760343, + 326148029743137, + 21888242871839275222246405745257275088548364400416034343698203661874517264578, + 21888242871839275222246405745257275088548364400416034343698204053218847260601, + 231585741574597, + 21888242871839275222246405745257275088548364400416034343698204039731592403823, + 229173332620562, + 73703021970810, + 21888242871839275222246405745257275088548364400416034343698203760390448536661, + 21888242871839275222246405745257275088548364400416034343698204170955790044458, + 21888242871839275222246405745257275088548364400416034343698204129811977853766, + 21888242871839275222246405745257275088548364400416034343698203938848102915788, + 21888242871839275222246405745257275088548364400416034343698203988881788188427, + 435583350272368, + 474743455709360, + 21888242871839275222246405745257275088548364400416034343698204128502561810565, + 74524217241853, + 21888242871839275222246405745257275088548364400416034343698203799992996200568, + 387032314555220, + 189265752845372, + 21888242871839275222246405745257275088548364400416034343698203714222603440585, + 21888242871839275222246405745257275088548364400416034343698203912869880775211, + 21888242871839275222246405745257275088548364400416034343698204049820194101441, + 21888242871839275222246405745257275088548364400416034343698203769479255421516, + 198143555061103, + 21888242871839275222246405745257275088548364400416034343698204149416340226770, + 21888242871839275222246405745257275088548364400416034343698204088055596990419, + 63644794885225, + 21888242871839275222246405745257275088548364400416034343698204030092194428066, + 21888242871839275222246405745257275088548364400416034343698204007043844604365, + 398838914431557, + 190939716755794, + 21888242871839275222246405745257275088548364400416034343698204112933575345629, + 416761924191048, + 387284585898977, + 21888242871839275222246405745257275088548364400416034343698203721324489756427, + 218343408323204, + 549254941550152, + 473868782541249, + 353151527668627, + 380195351335764, + 21888242871839275222246405745257275088548364400416034343698203723034293316017, + 21888242871839275222246405745257275088548364400416034343698203948765291341912, + 380993450361001, + 536103831957396, + 21888242871839275222246405745257275088548364400416034343698204064208154376703, + 454189769547457, + 482943077150663, + 537298981134588, + 21888242871839275222246405745257275088548364400416034343698203810744983787239, + 145147561158470, + 21888242871839275222246405745257275088548364400416034343698204090044160053270, + 137168504637628, + 21888242871839275222246405745257275088548364400416034343698203840792948154035, + 21888242871839275222246405745257275088548364400416034343698204068994819016684, + 19384887066187, + 21888242871839275222246405745257275088548364400416034343698204186377333352371, + 227344735802755, + 21888242871839275222246405745257275088548364400416034343698204062224362435410, + 353078288296604, + 398729506466928, + 226068412593966, + 21888242871839275222246405745257275088548364400416034343698204006806062510804, + 21888242871839275222246405745257275088548364400416034343698203812375858894053, + 34404149628500, + 21888242871839275222246405745257275088548364400416034343698204120571336998385, + 372121087139169, + 21888242871839275222246405745257275088548364400416034343698204046294105368444, + 161631273486054, + 21888242871839275222246405745257275088548364400416034343698203829163987734913, + 21888242871839275222246405745257275088548364400416034343698203850014213938721, + 116742039542002, + 96897032796055, + 43832953983973, + 21888242871839275222246405745257275088548364400416034343698204086463697417436, + 289433813050623, + 21888242871839275222246405745257275088548364400416034343698203874649581837180, + 21888242871839275222246405745257275088548364400416034343698204046504914583051, + 21888242871839275222246405745257275088548364400416034343698203751242965684835, + 218645566547680, + 21888242871839275222246405745257275088548364400416034343698204177442213967106, + 21888242871839275222246405745257275088548364400416034343698203715786827207041, + 21888242871839275222246405745257275088548364400416034343698204070132290598058, + 214351420256800, + 21888242871839275222246405745257275088548364400416034343698203962657636763218, + 534717968504445, + 21888242871839275222246405745257275088548364400416034343698204120808178887780, + 21888242871839275222246405745257275088548364400416034343698203672980256024735, + 21888242871839275222246405745257275088548364400416034343698203819150924042867, + 21888242871839275222246405745257275088548364400416034343698204051307381394309, + 5200034730467, + 21888242871839275222246405745257275088548364400416034343698203936899421125704, + 21888242871839275222246405745257275088548364400416034343698204121845298639446, + 21888242871839275222246405745257275088548364400416034343698204116120218104387, + 21888242871839275222246405745257275088548364400416034343698203906300105277798, + 21888242871839275222246405745257275088548364400416034343698203873503892130553, + 21888242871839275222246405745257275088548364400416034343698204178205588785321, + 21888242871839275222246405745257275088548364400416034343698204012753624360118, + 510970180862189, + 21888242871839275222246405745257275088548364400416034343698203823980154197230, + 52833804586777, + 21888242871839275222246405745257275088548364400416034343698203825379000486247, + 21888242871839275222246405745257275088548364400416034343698204157417973522373, + 67450824665378, + 271255191497773, + 21888242871839275222246405745257275088548364400416034343698203783279076004193, + 222170214386272, + 213154595215213, + 21888242871839275222246405745257275088548364400416034343698203873611696546281, + 106257821530345, + 21888242871839275222246405745257275088548364400416034343698203915148981750216, + 21888242871839275222246405745257275088548364400416034343698203804452071401989, + 124569495634112, + 226243217094725, + 543223167865366, + 496804606274725, + 330046172483893, + 21888242871839275222246405745257275088548364400416034343698203810347792039661, + 241420767516868, + 61269366857836, + 21888242871839275222246405745257275088548364400416034343698203952639350286350, + 21888242871839275222246405745257275088548364400416034343698203802036191968347, + 17640450676869, + 21888242871839275222246405745257275088548364400416034343698204150492881930242, + 9051528444262, + 21888242871839275222246405745257275088548364400416034343698203775523259973490, + 505911594290675, + 224652334515338, + 163770529341528, + 171771302843511, + 21888242871839275222246405745257275088548364400416034343698203762949215847321, + 454857252009196, + 500056916756153, + 236921288773129, + 27919946978549, + 21888242871839275222246405745257275088548364400416034343698204066828263926277, + 21888242871839275222246405745257275088548364400416034343698204052143938185243, + 115028661836539, + 21888242871839275222246405745257275088548364400416034343698204034490055507768, + 535899634588634, + 21888242871839275222246405745257275088548364400416034343698204025556550736261, + 383291831456863, + 21888242871839275222246405745257275088548364400416034343698203914823195986389, + 21888242871839275222246405745257275088548364400416034343698204146402250144878, + 528766691225024, + 21888242871839275222246405745257275088548364400416034343698204091361122833296, + 379219774918264, + 439694906149113, + 432568926075809, + 21888242871839275222246405745257275088548364400416034343698203972287319736076, + 21888242871839275222246405745257275088548364400416034343698203687263235416274, + 21888242871839275222246405745257275088548364400416034343698203846933189241989, + 21888242871839275222246405745257275088548364400416034343698203964140037041311, + 493624370702334, + 21888242871839275222246405745257275088548364400416034343698203754972678089433, + 21888242871839275222246405745257275088548364400416034343698203839460296789924, + 21888242871839275222246405745257275088548364400416034343698204008487917216546, + 76853724653020, + 21888242871839275222246405745257275088548364400416034343698203736631770872607, + 254975104872596, + 273446094271631, + 307744637157069, + 145882466580002, + 510703761040008, + 21888242871839275222246405745257275088548364400416034343698203994099343370037, + 21888242871839275222246405745257275088548364400416034343698203889847536184302, + 241036562311868, + 21888242871839275222246405745257275088548364400416034343698203923463413306421, + 21888242871839275222246405745257275088548364400416034343698204174996337705428, + 21888242871839275222246405745257275088548364400416034343698203767657548009781, + 21888242871839275222246405745257275088548364400416034343698204117914292850411, + 91515255716708, + 21888242871839275222246405745257275088548364400416034343698203845534131263272, + 243532825058907, + 21888242871839275222246405745257275088548364400416034343698204172557605247275, + 562788960064067, + 21888242871839275222246405745257275088548364400416034343698204044719841454459, + 21888242871839275222246405745257275088548364400416034343698203880112090774116, + 21888242871839275222246405745257275088548364400416034343698203772219123360666, + 21888242871839275222246405745257275088548364400416034343698204141201984700890, + 21888242871839275222246405745257275088548364400416034343698203873082200094078, + 128048729285424, + 21888242871839275222246405745257275088548364400416034343698203633300011815403, + 21888242871839275222246405745257275088548364400416034343698204036355379417261, + 499449449692871, + 223468059341725, + 111713781548178, + 21888242871839275222246405745257275088548364400416034343698203716158854512418, + 128380765144072, + 21888242871839275222246405745257275088548364400416034343698203629993927858213, + 353463664185673, + 402131402549166, + 390671314642155, + 21888242871839275222246405745257275088548364400416034343698204025147830191757, + 241581152964909, + 21888242871839275222246405745257275088548364400416034343698203895811205176065, + 21888242871839275222246405745257275088548364400416034343698203635705187010082, + 79101961801879, + 21888242871839275222246405745257275088548364400416034343698203958178330384677, + 202383797845809, + 26519338295858, + 22853224265216, + 21888242871839275222246405745257275088548364400416034343698204026349995721505, + 313528683065135, + 21888242871839275222246405745257275088548364400416034343698203772243867824146, + 208332026728329, + 455894851427395, + 157747113385777, + 511466148844784, + 21888242871839275222246405745257275088548364400416034343698204004936795618884, + 73292448876399, + 46551742946341, + 21888242871839275222246405745257275088548364400416034343698203669336677090568, + 21888242871839275222246405745257275088548364400416034343698203897822525662423, + 29079030691219, + 503452432776871, + 21888242871839275222246405745257275088548364400416034343698203818031742052299, + 21888242871839275222246405745257275088548364400416034343698203655650558276629, + 21888242871839275222246405745257275088548364400416034343698203913803990333995, + 21888242871839275222246405745257275088548364400416034343698203800756101181225, + 389153515043832, + 21888242871839275222246405745257275088548364400416034343698203908987256280222, + 21888242871839275222246405745257275088548364400416034343698204138660191675923, + 21888242871839275222246405745257275088548364400416034343698203924257021679847, + 21888242871839275222246405745257275088548364400416034343698203952200354094189, + 21888242871839275222246405745257275088548364400416034343698203739265955144848, + 21888242871839275222246405745257275088548364400416034343698204035848136429383, + 21888242871839275222246405745257275088548364400416034343698203650783018507439, + 21888242871839275222246405745257275088548364400416034343698203743801204035897, + 21888242871839275222246405745257275088548364400416034343698203961227052983895, + 244925399982744, + 57085647731257, + 421333727175895, + 21888242871839275222246405745257275088548364400416034343698204144933357476055, + 476310886028258, + 21888242871839275222246405745257275088548364400416034343698204009454608163508, + 21888242871839275222246405745257275088548364400416034343698203909970521113155, + 229325454847958, + 15393062982803, + 381632990769763, + 21888242871839275222246405745257275088548364400416034343698204030551662566253, + 445467871040738, + 407641390602678, + 352252782176204, + 21888242871839275222246405745257275088548364400416034343698203960238195384214, + 21888242871839275222246405745257275088548364400416034343698203676001599504206, + 196895252963746, + 21888242871839275222246405745257275088548364400416034343698203756811465795157, + 227336903276217, + 21888242871839275222246405745257275088548364400416034343698203977165310968198, + 21888242871839275222246405745257275088548364400416034343698204091465674739828, + 21888242871839275222246405745257275088548364400416034343698204146622772517570, + 21888242871839275222246405745257275088548364400416034343698203886579310797444, + 21888242871839275222246405745257275088548364400416034343698204133663887812390, + 317921402714731, + 21888242871839275222246405745257275088548364400416034343698203904971714238602, + 21888242871839275222246405745257275088548364400416034343698203632758245264167, + 143001375639435, + 21888242871839275222246405745257275088548364400416034343698203867778773693253, + 21888242871839275222246405745257275088548364400416034343698204128142025254048, + 378014384248502, + 21888242871839275222246405745257275088548364400416034343698204064302377236989, + 21888242871839275222246405745257275088548364400416034343698204156143216154812, + 21888242871839275222246405745257275088548364400416034343698204113624001027619, + 21888242871839275222246405745257275088548364400416034343698203743022760757103, + 21888242871839275222246405745257275088548364400416034343698204005378600642958, + 562282275280811, + 182733385703820, + 129827424794173, + 289170390776761, + 74563075594258, + 449542983950890, + 21888242871839275222246405745257275088548364400416034343698203885518834886546, + 21888242871839275222246405745257275088548364400416034343698204062487800522423, + 196330296082414, + 239377111328432, + 21888242871839275222246405745257275088548364400416034343698204122025289793076, + 21888242871839275222246405745257275088548364400416034343698203902615064601617, + 273743033185046, + 21888242871839275222246405745257275088548364400416034343698203860484184043670, + 21888242871839275222246405745257275088548364400416034343698203763891410991063, + 534902826087727, + 39067251717049, + 21888242871839275222246405745257275088548364400416034343698204007422174655735, + 217127427953755, + 453793355037479, + 320111922244535, + 170157348189370, + 241638213816120, + 12559517141825, + 453418068942228, + 21888242871839275222246405745257275088548364400416034343698204180280647057507, + 21888242871839275222246405745257275088548364400416034343698203692615348499064, + 293269153001793, + 21888242871839275222246405745257275088548364400416034343698204139766776379722, + 310367027993597, + 170869067803654, + 21888242871839275222246405745257275088548364400416034343698204183569073365345, + 554272672589521, + 21888242871839275222246405745257275088548364400416034343698204056142921979438, + 21888242871839275222246405745257275088548364400416034343698203688749596272448, + 21888242871839275222246405745257275088548364400416034343698203957150571619852, + 21888242871839275222246405745257275088548364400416034343698203910523386143726, + 21888242871839275222246405745257275088548364400416034343698203680053040637978, + 21888242871839275222246405745257275088548364400416034343698203914295426683605, + 21888242871839275222246405745257275088548364400416034343698204033666471580718, + 532821576594747, + 271917930783397, + 82884784624409, + 21888242871839275222246405745257275088548364400416034343698203911548117127120, + 500461584481226, + 391547214126079, + 234109528621036, + 489338424119049, + 29521784443420, + 21888242871839275222246405745257275088548364400416034343698204030205088068859, + 21888242871839275222246405745257275088548364400416034343698204156426901798732, + 343830413617542, + 21888242871839275222246405745257275088548364400416034343698204062379028794051, + 21888242871839275222246405745257275088548364400416034343698204128287348296535, + 21888242871839275222246405745257275088548364400416034343698203738594043281827, + 96275029308833, + 274649383549933, + 325619064956575, + 20445147126840, + 21888242871839275222246405745257275088548364400416034343698203801834093066309, + 21888242871839275222246405745257275088548364400416034343698204012288687153728, + 21888242871839275222246405745257275088548364400416034343698203825357693291581, + 203264742502713, + 21888242871839275222246405745257275088548364400416034343698203902484113772112, + 21888242871839275222246405745257275088548364400416034343698203661658182207572, + 359704900976730, + 518477040415865, + 21888242871839275222246405745257275088548364400416034343698203666320934526714, + 531842106679559, + 21888242871839275222246405745257275088548364400416034343698203801146124314852, + 21888242871839275222246405745257275088548364400416034343698203971237498854334, + 184093969565702, + 21888242871839275222246405745257275088548364400416034343698203750620595880214, + 388831065222608, + 364232215627376, + 438994417567614, + 21888242871839275222246405745257275088548364400416034343698203918292844230211, + 21888242871839275222246405745257275088548364400416034343698203670164925860616, + 21888242871839275222246405745257275088548364400416034343698203912417271411603, + 21888242871839275222246405745257275088548364400416034343698204093910115699299, + 21888242871839275222246405745257275088548364400416034343698204172191258514389, + 550174462899979, + 21888242871839275222246405745257275088548364400416034343698203670515371571810, + 382853317233253, + 519579173409134, + 21888242871839275222246405745257275088548364400416034343698203916042836962291, + 21888242871839275222246405745257275088548364400416034343698203753918160424343, + 21888242871839275222246405745257275088548364400416034343698203674059611391904, + 21888242871839275222246405745257275088548364400416034343698204118436795297014, + 21888242871839275222246405745257275088548364400416034343698203767798266188323, + 21888242871839275222246405745257275088548364400416034343698203696635422696114, + 21888242871839275222246405745257275088548364400416034343698203815514976952863, + 21888242871839275222246405745257275088548364400416034343698203956728432290217, + 207758450840171, + 21888242871839275222246405745257275088548364400416034343698203685657984223223, + 21888242871839275222246405745257275088548364400416034343698203930916496687463, + 21888242871839275222246405745257275088548364400416034343698203851248765066923, + 447292249510104, + 286348644137284, + 389963880271187, + 232609947999791, + 21888242871839275222246405745257275088548364400416034343698203815145824965826, + 314583346428841, + 21888242871839275222246405745257275088548364400416034343698203689785608553345, + 21888242871839275222246405745257275088548364400416034343698203788550931693941, + 21888242871839275222246405745257275088548364400416034343698203630970832910231, + 341197968850100, + 30928668556977, + 21888242871839275222246405745257275088548364400416034343698203678402682548517, + 21888242871839275222246405745257275088548364400416034343698204045722304819692, + 21888242871839275222246405745257275088548364400416034343698203631302264490356, + 13840791519488, + 21888242871839275222246405745257275088548364400416034343698203991935756737828, + 21888242871839275222246405745257275088548364400416034343698203830773111638334, + 21888242871839275222246405745257275088548364400416034343698203978223315376231, + 21888242871839275222246405745257275088548364400416034343698204063338504609563, + 224043588745912, + 21888242871839275222246405745257275088548364400416034343698203660759047345419, + 21888242871839275222246405745257275088548364400416034343698203806284128562517, + 471890734383044, + 21888242871839275222246405745257275088548364400416034343698203794414297989674, + 11056427856444, + 246500067585527, + 227416138159972, + 530798556062641, + 61848826052471, + 21888242871839275222246405745257275088548364400416034343698204032030137192183, + 21888242871839275222246405745257275088548364400416034343698204143045079742722, + 21888242871839275222246405745257275088548364400416034343698203919253269164725, + 21888242871839275222246405745257275088548364400416034343698203862433818175453, + 318739614322748, + 52864780710740, + 21888242871839275222246405745257275088548364400416034343698203840588923267728, + 27795117278990, + 301292163602449, + 21888242871839275222246405745257275088548364400416034343698203737903340980676, + 21888242871839275222246405745257275088548364400416034343698204186273345448418, + 21888242871839275222246405745257275088548364400416034343698203651134354402258, + 450773923329905, + 258286562161377, + 546890469199156, + 21888242871839275222246405745257275088548364400416034343698203863755925107512, + 300418722155666, + 21888242871839275222246405745257275088548364400416034343698203701465228495440, + 381015330816113, + 262101488393893, + 553659952131035, + 508923264120334, + 21888242871839275222246405745257275088548364400416034343698203811621727130695, + 21888242871839275222246405745257275088548364400416034343698204023443241340982, + 147130040549371, + 99525128515560, + 21888242871839275222246405745257275088548364400416034343698203875885657668735, + 728947210876, + 21888242871839275222246405745257275088548364400416034343698203875284378818665, + 21888242871839275222246405745257275088548364400416034343698203628307717379209, + 21888242871839275222246405745257275088548364400416034343698203714343859760956, + 555650777288960, + 21888242871839275222246405745257275088548364400416034343698203917163691939715, + 408240867966022, + 170983191917405, + 21888242871839275222246405745257275088548364400416034343698203941213289134188, + 21888242871839275222246405745257275088548364400416034343698204180913858666491, + 28567515556459, + 153138276003175, + 21888242871839275222246405745257275088548364400416034343698204133474940299209, + 21888242871839275222246405745257275088548364400416034343698203797997332071435, + 21888242871839275222246405745257275088548364400416034343698203902070592542825, + 189330495767999, + 203481462157429, + 21888242871839275222246405745257275088548364400416034343698203991914643433201, + 21888242871839275222246405745257275088548364400416034343698203785537097935916, + 21888242871839275222246405745257275088548364400416034343698203745730481746811, + 21888242871839275222246405745257275088548364400416034343698203877115292452351, + 483766130440449, + 21888242871839275222246405745257275088548364400416034343698204003304389067092, + 512791255974464, + 529643444099017, + 21888242871839275222246405745257275088548364400416034343698203627700372591342, + 437812531885580, + 21888242871839275222246405745257275088548364400416034343698204059652538139129, + 21888242871839275222246405745257275088548364400416034343698203795457139754526, + 103261035141017, + 21888242871839275222246405745257275088548364400416034343698204132728650106826, + 489861314051086, + 219433835370835, + 213086334004025, + 146808935664291, + 502026638478410, + 161475137412266, + 21888242871839275222246405745257275088548364400416034343698203819223700639529, + 231905110270257, + 21888242871839275222246405745257275088548364400416034343698203701107029738503, + 539626183101988, + 258633466541823, + 101083549704320, + 514037417915698, + 237691963574267, + 268774732404394, + 21888242871839275222246405745257275088548364400416034343698204169804185984227, + 480581966557639, + 21888242871839275222246405745257275088548364400416034343698204059148319501469, + 315935144775353, + 315882274168631, + 21888242871839275222246405745257275088548364400416034343698203773668251305907, + 21888242871839275222246405745257275088548364400416034343698204031442740706006, + 21888242871839275222246405745257275088548364400416034343698203640348741480731, + 28540272261922, + 21888242871839275222246405745257275088548364400416034343698203714744201526094, + 532916533159534, + 397035082070484, + 559165494520546, + 21888242871839275222246405745257275088548364400416034343698203738078122461942, + 257321306443517, + 21888242871839275222246405745257275088548364400416034343698203787519513515936, + 21888242871839275222246405745257275088548364400416034343698203772953826206518, + 545953868761411, + 81576890214653, + 21888242871839275222246405745257275088548364400416034343698203999551708890388, + 21888242871839275222246405745257275088548364400416034343698203963267605179938, + 247625817871278, + 370255956718043, + 21888242871839275222246405745257275088548364400416034343698203937723425108728, + 383161671831471, + 21888242871839275222246405745257275088548364400416034343698203861659454575759, + 21888242871839275222246405745257275088548364400416034343698204071527310687495, + 486576623877922, + 498987205873141, + 451679926876694, + 21888242871839275222246405745257275088548364400416034343698203804547379632166, + 21888242871839275222246405745257275088548364400416034343698204108333545506187, + 21888242871839275222246405745257275088548364400416034343698204024024047890250, + 70336850468089, + 21888242871839275222246405745257275088548364400416034343698203913051131646586, + 21888242871839275222246405745257275088548364400416034343698204078430797342704, + 21888242871839275222246405745257275088548364400416034343698203999178540136823, + 21888242871839275222246405745257275088548364400416034343698203669957809134081, + 21888242871839275222246405745257275088548364400416034343698203705110521477142, + 21888242871839275222246405745257275088548364400416034343698203741506830024457, + 21888242871839275222246405745257275088548364400416034343698203878330588065539, + 21888242871839275222246405745257275088548364400416034343698203818875086225457, + 70479352219668, + 21888242871839275222246405745257275088548364400416034343698203679507261888561, + 317998132281995, + 425478585374237, + 21888242871839275222246405745257275088548364400416034343698203866244155290890, + 468963711803339, + 21888242871839275222246405745257275088548364400416034343698204049968716077763, + 217705294903922, + 395201945076590, + 414944706992619, + 290950118506747, + 550619900810863, + 21888242871839275222246405745257275088548364400416034343698203785170133434224, + 21888242871839275222246405745257275088548364400416034343698204119853282579054, + 275520665349293, + 21888242871839275222246405745257275088548364400416034343698203946586625985945, + 21888242871839275222246405745257275088548364400416034343698204141318614425653, + 21888242871839275222246405745257275088548364400416034343698203672908576998107, + 177609259644333, + 156455503116026, + 21888242871839275222246405745257275088548364400416034343698203847956426785616, + 21888242871839275222246405745257275088548364400416034343698203942133645045218, + 351863917278276, + 339886181021229, + 159921964910095, + 417223799172882, + 21888242871839275222246405745257275088548364400416034343698203969689693140611, + 143597530705167, + 208085114264856, + 339728668205481, + 361941733342871, + 225193215112250, + 21888242871839275222246405745257275088548364400416034343698204008864592051437, + 21888242871839275222246405745257275088548364400416034343698203741962729581665, + 43579902871582, + 21888242871839275222246405745257275088548364400416034343698203717326037149578, + 337418989652028, + 21888242871839275222246405745257275088548364400416034343698204028820994379738, + 21888242871839275222246405745257275088548364400416034343698204109155471437260, + 21888242871839275222246405745257275088548364400416034343698204142174122385608, + 21888242871839275222246405745257275088548364400416034343698203943848673228461, + 21888242871839275222246405745257275088548364400416034343698203687981048064214, + 172461757280201, + 91993096658894, + 21888242871839275222246405745257275088548364400416034343698203689423817146698, + 197168244688044, + 57953515587527, + 21888242871839275222246405745257275088548364400416034343698203852421255141143, + 58906192049604, + 21888242871839275222246405745257275088548364400416034343698204107274275730089, + 21888242871839275222246405745257275088548364400416034343698203781703234842506, + 21888242871839275222246405745257275088548364400416034343698203630944194369521, + 21888242871839275222246405745257275088548364400416034343698204149879656471268, + 21888242871839275222246405745257275088548364400416034343698204063369001536793, + 544103626649135, + 241585337075556, + 377540799734201, + 21888242871839275222246405745257275088548364400416034343698203754096940709489, + 21888242871839275222246405745257275088548364400416034343698203642872155005966, + 108341430150035, + 21888242871839275222246405745257275088548364400416034343698203692737767653345, + 471840984675818, + 70328063122041, + 266289931554489, + 318503085871965, + 21888242871839275222246405745257275088548364400416034343698203628873357568292, + 359339711887203, + 21888242871839275222246405745257275088548364400416034343698204045870779186749, + 38718195364091, + 21888242871839275222246405745257275088548364400416034343698203877928118718221, + 21888242871839275222246405745257275088548364400416034343698204021935067785411, + 21888242871839275222246405745257275088548364400416034343698203924224531143367, + 21888242871839275222246405745257275088548364400416034343698203996863135917379, + 244641629598976, + 21888242871839275222246405745257275088548364400416034343698203983365893232620, + 328311358476404, + 21888242871839275222246405745257275088548364400416034343698204158131858508345, + 21888242871839275222246405745257275088548364400416034343698204094847066887679, + 21888242871839275222246405745257275088548364400416034343698204020604671080126, + 229563527720864, + 366119928617622, + 21888242871839275222246405745257275088548364400416034343698203721637967060989, + 202999934669623, + 149226878180141, + 177586304287280, + 141347088107711, + 21888242871839275222246405745257275088548364400416034343698203790189418091361, + 112598423997267, + 21888242871839275222246405745257275088548364400416034343698203859053486294437, + 21888242871839275222246405745257275088548364400416034343698203930165146192719, + 21888242871839275222246405745257275088548364400416034343698203982917015421481, + 529011723494730, + 249848330127690, + 21888242871839275222246405745257275088548364400416034343698204115576295765193, + 430431103320887, + 325010649958348, + 89635065083266, + 317891477772881, + 21888242871839275222246405745257275088548364400416034343698203828492993775883, + 232829888212521, + 21888242871839275222246405745257275088548364400416034343698203634201080824784, + 439520610618918, + 220527293272393, + 21888242871839275222246405745257275088548364400416034343698204041196768357572, + 21888242871839275222246405745257275088548364400416034343698203758856594001731, + 344189571220910, + 21888242871839275222246405745257275088548364400416034343698203915825899399555, + 223993494178093, + 84022522678540, + 62709137518433, + 21888242871839275222246405745257275088548364400416034343698203638800968314154, + 326898464034740, + 21888242871839275222246405745257275088548364400416034343698203865066359506033, + 21888242871839275222246405745257275088548364400416034343698204150943678017394, + 464063487780186, + 21888242871839275222246405745257275088548364400416034343698203817335889621368, + 21888242871839275222246405745257275088548364400416034343698203647398084710058, + 515653870287844, + 75339632318013, + 219249917312312, + 181424501651934, + 21888242871839275222246405745257275088548364400416034343698203916441148859408, + 21888242871839275222246405745257275088548364400416034343698203756628238859958, + 368561328849026, + 21888242871839275222246405745257275088548364400416034343698203886267938202478, + 21888242871839275222246405745257275088548364400416034343698203630400540888451, + 255980209622877, + 21888242871839275222246405745257275088548364400416034343698203728758275061319, + 21888242871839275222246405745257275088548364400416034343698204141881511808672, + 21888242871839275222246405745257275088548364400416034343698203627296422360451, + 21888242871839275222246405745257275088548364400416034343698204096279303535764, + 21888242871839275222246405745257275088548364400416034343698204168760417813542, + 21888242871839275222246405745257275088548364400416034343698203630297772516194, + 66026183182900, + 279286084429961, + 21888242871839275222246405745257275088548364400416034343698204142451494742743, + 21888242871839275222246405745257275088548364400416034343698203766986623707027, + 383223739232717, + 21888242871839275222246405745257275088548364400416034343698203896782894980846, + 451118476130308, + 327112643972057, + 21888242871839275222246405745257275088548364400416034343698203986501250855427, + 370577730659262, + 366899249075571, + 21888242871839275222246405745257275088548364400416034343698203708557034150699, + 21888242871839275222246405745257275088548364400416034343698203724618120185139, + 69106353668032, + 471744507820986, + 440183263468073, + 21888242871839275222246405745257275088548364400416034343698204129638910351681, + 408242209120540, + 47083205085610, + 187765552911352, + 21888242871839275222246405745257275088548364400416034343698203863707585379711, + 21888242871839275222246405745257275088548364400416034343698203723510999116058, + 21888242871839275222246405745257275088548364400416034343698203743599762107771, + 21888242871839275222246405745257275088548364400416034343698203949495728973955, + 1458640515287, + 524157059438062, + 21888242871839275222246405745257275088548364400416034343698203872514815928985, + 367004195784260, + 203455128899996, + 244477278901601, + 292844121403010, + 111915584628223, + 223323252914573, + 21888242871839275222246405745257275088548364400416034343698204037488762129771, + 548103640188046, + 21888242871839275222246405745257275088548364400416034343698204140525087616127, + 336245908691215, + 21888242871839275222246405745257275088548364400416034343698203914082436585598, + 21888242871839275222246405745257275088548364400416034343698204025122356184421, + 245472480791506, + 21888242871839275222246405745257275088548364400416034343698204185611400737307, + 21888242871839275222246405745257275088548364400416034343698203711708068571679, + 268533146997948, + 21888242871839275222246405745257275088548364400416034343698203668509936661253, + 4879703436819, + 21888242871839275222246405745257275088548364400416034343698203647849832309472, + 553440023956435, + 483385655457514, + 21888242871839275222246405745257275088548364400416034343698204168038838497247, + 21888242871839275222246405745257275088548364400416034343698204167137171448429, + 21888242871839275222246405745257275088548364400416034343698204086370109312371, + 21888242871839275222246405745257275088548364400416034343698203889123530719269, + 21888242871839275222246405745257275088548364400416034343698203923198024472780, + 21888242871839275222246405745257275088548364400416034343698203914144545705432, + 225478087718064, + 143159795016490, + 21888242871839275222246405745257275088548364400416034343698203723930107990510, + 21888242871839275222246405745257275088548364400416034343698203900763350894288, + 393341631019231, + 46082346440928, + 128431316893536, + 263973592254243, + 21888242871839275222246405745257275088548364400416034343698203987656813596670, + 21888242871839275222246405745257275088548364400416034343698203835736453166532, + 21888242871839275222246405745257275088548364400416034343698203638925609051305, + 21888242871839275222246405745257275088548364400416034343698203916374652346965, + 112483691609884, + 21888242871839275222246405745257275088548364400416034343698204026309441974045, + 352153815915348, + 21888242871839275222246405745257275088548364400416034343698204133326537668672, + 21888242871839275222246405745257275088548364400416034343698204059088657972397, + 21888242871839275222246405745257275088548364400416034343698203761506300311937, + 21888242871839275222246405745257275088548364400416034343698204166502457213547, + 21888242871839275222246405745257275088548364400416034343698203955918983743242, + 21888242871839275222246405745257275088548364400416034343698203636932892889986, + 474104737169184, + 7506142952122, + 53181187505693, + 107874422618926, + 132555612117102, + 506529418204539, + 21888242871839275222246405745257275088548364400416034343698203692704658925094, + 58389158787427, + 21888242871839275222246405745257275088548364400416034343698204138700447546184, + 101414407373822, + 303328939631377, + 21888242871839275222246405745257275088548364400416034343698203775586551364570, + 21888242871839275222246405745257275088548364400416034343698203796681983586688, + 21888242871839275222246405745257275088548364400416034343698204004115442583112, + 21888242871839275222246405745257275088548364400416034343698203820069343162428, + 21888242871839275222246405745257275088548364400416034343698203836551053674998, + 21888242871839275222246405745257275088548364400416034343698204025933746877545, + 512623401611356, + 21888242871839275222246405745257275088548364400416034343698203813036187934418, + 228463414604620, + 92014402965239, + 216460280541777, + 170354726563877, + 181622637664364, + 21888242871839275222246405745257275088548364400416034343698203641157535887811, + 16131834637737, + 55723711294580, + 21888242871839275222246405745257275088548364400416034343698203903847953073808, + 138152927635780, + 355092160620118, + 202403396281113, + 21888242871839275222246405745257275088548364400416034343698204074314389086040, + 21888242871839275222246405745257275088548364400416034343698203783152087165898, + 21888242871839275222246405745257275088548364400416034343698204075761553004523, + 310066247069486, + 71505050118241, + 86329481952713, + 196859759722369, + 21888242871839275222246405745257275088548364400416034343698204039277770573868, + 21888242871839275222246405745257275088548364400416034343698203751638546848230, + 21888242871839275222246405745257275088548364400416034343698203894771081208627, + 21888242871839275222246405745257275088548364400416034343698204080717232869944, + 21888242871839275222246405745257275088548364400416034343698203689891900450464, + 176694360727241, + 21888242871839275222246405745257275088548364400416034343698203801637295169217, + 371411783169669, + 363115817282986, + 54195411526986, + 8646947490706, + 412876102303240, + 225822166091307, + 21888242871839275222246405745257275088548364400416034343698204102774768954665, + 21888242871839275222246405745257275088548364400416034343698204164326016250036, + 21888242871839275222246405745257275088548364400416034343698203947975180463751, + 292574242185737, + 133801732504050, + 21888242871839275222246405745257275088548364400416034343698203688997292658130, + 21888242871839275222246405745257275088548364400416034343698204028541465504800, + 308879348449041, + 21888242871839275222246405745257275088548364400416034343698203970579679511714, + 21888242871839275222246405745257275088548364400416034343698204042755857135209, + 273170312957236, + 21888242871839275222246405745257275088548364400416034343698204014275676051729, + 21888242871839275222246405745257275088548364400416034343698203989476845839432, + 38709718245531, + 21888242871839275222246405745257275088548364400416034343698203743959503743041, + 21888242871839275222246405745257275088548364400416034343698203895091769826440, + 21888242871839275222246405745257275088548364400416034343698204029884899029556, + 533915182373030, + 21888242871839275222246405745257275088548364400416034343698204090734513305516, + 81987754215045, + 21888242871839275222246405745257275088548364400416034343698203999034965594930, + 21888242871839275222246405745257275088548364400416034343698203832991395381835, + 342836991217413, + 21888242871839275222246405745257275088548364400416034343698204083016900539805, + 296401868088846, + 21888242871839275222246405745257275088548364400416034343698204148755239845663, + 64076339547364, + 530697529312375, + 21888242871839275222246405745257275088548364400416034343698204063462506418527, + 21888242871839275222246405745257275088548364400416034343698203679497359471740, + 21888242871839275222246405745257275088548364400416034343698203719759574540149, + 21888242871839275222246405745257275088548364400416034343698203781103032764993, + 49330585606174, + 21888242871839275222246405745257275088548364400416034343698204028335329375388, + 21888242871839275222246405745257275088548364400416034343698204038070592603567, + 21888242871839275222246405745257275088548364400416034343698203826458834226035, + 21888242871839275222246405745257275088548364400416034343698203720766568282111, + 78722490925644, + 400570392392938, + 21888242871839275222246405745257275088548364400416034343698204036106279281765, + 21888242871839275222246405745257275088548364400416034343698203890333601351925, + 21888242871839275222246405745257275088548364400416034343698203724471397891662, + 178630824811805, + 21888242871839275222246405745257275088548364400416034343698203751193622406163, + 416435043105074, + 21888242871839275222246405745257275088548364400416034343698203705288273809501, + 21888242871839275222246405745257275088548364400416034343698203740712981211698, + 21888242871839275222246405745257275088548364400416034343698204017075508913708, + 480938785409124, + 21888242871839275222246405745257275088548364400416034343698203674521251204556, + 21888242871839275222246405745257275088548364400416034343698203791095795160997, + 21888242871839275222246405745257275088548364400416034343698203955305195912686, + 472582872535152, + 418725589797550, + 385321483364005, + 21888242871839275222246405745257275088548364400416034343698203895233517394916, + 21888242871839275222246405745257275088548364400416034343698203785710266701556, + 21888242871839275222246405745257275088548364400416034343698203700277795089618, + 109317390537935, + 21888242871839275222246405745257275088548364400416034343698203792569217041669, + 93877970851548, + 21888242871839275222246405745257275088548364400416034343698203899534369885536, + 386916624215682, + 21888242871839275222246405745257275088548364400416034343698204167824095870953, + 21888242871839275222246405745257275088548364400416034343698203939144961526598, + 61942319900412, + 21888242871839275222246405745257275088548364400416034343698203958685433328686, + 142427636162021, + 21888242871839275222246405745257275088548364400416034343698204153317938291932, + 236396125533902, + 21888242871839275222246405745257275088548364400416034343698204029603047931798, + 21888242871839275222246405745257275088548364400416034343698204119260811382101, + 21888242871839275222246405745257275088548364400416034343698203736381648275807, + 21888242871839275222246405745257275088548364400416034343698203674836274059128, + 21888242871839275222246405745257275088548364400416034343698204082451485453143, + 264001201400433, + 457482379209148, + 221560994145948, + 21888242871839275222246405745257275088548364400416034343698203957711803334455, + 238637317545868, + 412510998965931, + 169777744865177, + 21888242871839275222246405745257275088548364400416034343698203788786945423422, + 21888242871839275222246405745257275088548364400416034343698203940054636423033, + 21888242871839275222246405745257275088548364400416034343698203849501101852884, + 21888242871839275222246405745257275088548364400416034343698203980035592553485, + 177169494686346, + 414164067355153, + 21888242871839275222246405745257275088548364400416034343698203793592566882280, + 469348015483460, + 142716220390507, + 21888242871839275222246405745257275088548364400416034343698204079424004372202, + 21888242871839275222246405745257275088548364400416034343698204110071356384300, + 212376096960161, + 15031116618513, + 21888242871839275222246405745257275088548364400416034343698203839422912508804, + 21888242871839275222246405745257275088548364400416034343698204111511379322186, + 361318968278283, + 80889110045986, + 134947699800668, + 303493796953259, + 21888242871839275222246405745257275088548364400416034343698203741575010804503, + 249357420401858, + 21888242871839275222246405745257275088548364400416034343698204005680277581071, + 21888242871839275222246405745257275088548364400416034343698203958460592327085, + 258741720448539, + 554781315153798, + 21888242871839275222246405745257275088548364400416034343698203985008286976563, + 21888242871839275222246405745257275088548364400416034343698203786156264037879, + 323559932516229, + 336624470911647, + 21888242871839275222246405745257275088548364400416034343698203727850975895507, + 141286485945662, + 21888242871839275222246405745257275088548364400416034343698203900102684294306, + 21888242871839275222246405745257275088548364400416034343698203759959822571850, + 560133908657059, + 21888242871839275222246405745257275088548364400416034343698203648960164581355, + 21888242871839275222246405745257275088548364400416034343698204165425334888539, + 289593194714656, + 21888242871839275222246405745257275088548364400416034343698203642560569477607, + 388615302000034, + 344454535928361, + 21888242871839275222246405745257275088548364400416034343698204170344023318630, + 21888242871839275222246405745257275088548364400416034343698203751376324541098, + 21888242871839275222246405745257275088548364400416034343698203732799866994875, + 121063839379579, + 459296919650635, + 257995578847889, + 21888242871839275222246405745257275088548364400416034343698203814757134466369, + 21888242871839275222246405745257275088548364400416034343698203895767070264775, + 21888242871839275222246405745257275088548364400416034343698204074859866662388, + 561816465316356, + 18179167228174, + 21888242871839275222246405745257275088548364400416034343698203695530873223793, + 162165580066852, + 141448505384211, + 193433938849109, + 114346191434344, + 363594703925596, + 21888242871839275222246405745257275088548364400416034343698204083309055833153, + 21888242871839275222246405745257275088548364400416034343698203636309879094624, + 27164653742049, + 404085417433330, + 21888242871839275222246405745257275088548364400416034343698203652495022215956, + 225482369401943, + 140587064329845, + 21888242871839275222246405745257275088548364400416034343698203764917050547669, + 90874409975620, + 371751919567826, + 21888242871839275222246405745257275088548364400416034343698204018250852898053, + 322766762510179, + 505012724254353, + 156552818909473, + 497235907269359, + 425523155563173, + 21888242871839275222246405745257275088548364400416034343698203671637803218408, + 558298076703980, + 218345216269954, + 21888242871839275222246405745257275088548364400416034343698203878670633074427, + 21888242871839275222246405745257275088548364400416034343698203631426119290131, + 21888242871839275222246405745257275088548364400416034343698203884521726136259, + 21888242871839275222246405745257275088548364400416034343698204048847739609026, + 255848270235353, + 479097164131249, + 276639435347693, + 239603666574859, + 543990659002422, + 76614817749233, + 129116664394073, + 21888242871839275222246405745257275088548364400416034343698204000390368636929, + 21888242871839275222246405745257275088548364400416034343698203989917943934389, + 21888242871839275222246405745257275088548364400416034343698203695041661968409, + 21888242871839275222246405745257275088548364400416034343698203753568243153906, + 21888242871839275222246405745257275088548364400416034343698204002430486862476, + 95253089498711, + 21888242871839275222246405745257275088548364400416034343698204136470481881807, + 300836321303756, + 21888242871839275222246405745257275088548364400416034343698203642405475459363, + 21888242871839275222246405745257275088548364400416034343698203819235651779905, + 21888242871839275222246405745257275088548364400416034343698204067568082772652, + 21888242871839275222246405745257275088548364400416034343698203984027019714850, + 21888242871839275222246405745257275088548364400416034343698204106255391406912, + 21888242871839275222246405745257275088548364400416034343698203766956823839516, + 413226218732592, + 414279689068374, + 193551071765366, + 21888242871839275222246405745257275088548364400416034343698203989075492771623, + 220116227749012, + 21888242871839275222246405745257275088548364400416034343698203788172413403922, + 76292396001684, + 522337527237042, + 21888242871839275222246405745257275088548364400416034343698204082054727180404, + 21888242871839275222246405745257275088548364400416034343698203673336306820986, + 27888982009156, + 470341264163747, + 517498205975175, + 21888242871839275222246405745257275088548364400416034343698203872304784878512, + 21888242871839275222246405745257275088548364400416034343698203989217252408503, + 21888242871839275222246405745257275088548364400416034343698203946082650350999, + 21888242871839275222246405745257275088548364400416034343698204039600051029590, + 105186501796502, + 539491868406091, + 384414918428449, + 21888242871839275222246405745257275088548364400416034343698204097551085375277, + 21888242871839275222246405745257275088548364400416034343698203788641950175834, + 21888242871839275222246405745257275088548364400416034343698204135560610269804, + 149469848493194, + 99295293511467, + 21888242871839275222246405745257275088548364400416034343698203853117792701609, + 473850588233566, + 436651441275933, + 21888242871839275222246405745257275088548364400416034343698203925034601800455, + 21888242871839275222246405745257275088548364400416034343698203882195727011891, + 21888242871839275222246405745257275088548364400416034343698203700884039337925, + 409014499429265, + 382778598101151, + 299931990111149, + 21888242871839275222246405745257275088548364400416034343698203755284541071036, + 257388771477677, + 21888242871839275222246405745257275088548364400416034343698203898793807039555, + 21888242871839275222246405745257275088548364400416034343698203938567410835820, + 274829218113264, + 21888242871839275222246405745257275088548364400416034343698203946376107249836, + 21888242871839275222246405745257275088548364400416034343698203788420984317319, + 21888242871839275222246405745257275088548364400416034343698203986087636600758, + 21888242871839275222246405745257275088548364400416034343698203728464290370114, + 21888242871839275222246405745257275088548364400416034343698204026503136675498, + 21888242871839275222246405745257275088548364400416034343698203730489400284124, + 21888242871839275222246405745257275088548364400416034343698203969575456788500, + 249149873241022, + 447206413815301, + 21888242871839275222246405745257275088548364400416034343698203727135141981783, + 559850233368072, + 29045584265657, + 402421913655932, + 21888242871839275222246405745257275088548364400416034343698203670040395004374, + 351655556516016, + 150178112595863, + 282305990319034, + 21888242871839275222246405745257275088548364400416034343698203949750888783525, + 21888242871839275222246405745257275088548364400416034343698203795938193352683, + 273931958986599, + 21888242871839275222246405745257275088548364400416034343698204001577819434702, + 429602942623914, + 495976502493480, + 445078622075779, + 270942694996516, + 21888242871839275222246405745257275088548364400416034343698204123378956473423, + 372145428257749, + 18229856507423, + 67005469622484, + 21888242871839275222246405745257275088548364400416034343698203884671281122451, + 21888242871839275222246405745257275088548364400416034343698203972859734004759, + 208120206423152, + 241798919700196, + 554852598280274, + 21888242871839275222246405745257275088548364400416034343698203729012146642339, + 275445564830304, + 105620238997992, + 42918700012116, + 83457058816843, + 21888242871839275222246405745257275088548364400416034343698203909931604676557, + 21888242871839275222246405745257275088548364400416034343698203899832286449289, + 114405246921881, + 58451070498840, + 287193256687351, + 21888242871839275222246405745257275088548364400416034343698203815203979300386, + 21888242871839275222246405745257275088548364400416034343698204165825858766325, + 225770567343386, + 21888242871839275222246405745257275088548364400416034343698204155979160214219, + 410000827138960, + 21888242871839275222246405745257275088548364400416034343698203624048391814995, + 21888242871839275222246405745257275088548364400416034343698204003881983597645, + 21888242871839275222246405745257275088548364400416034343698204045142033672522, + 126113168572826, + 404265122385825, + 488238407528387, + 21888242871839275222246405745257275088548364400416034343698204023446235416269, + 21888242871839275222246405745257275088548364400416034343698203828201976357695, + 551231498222517, + 507740565719975, + 92138314737633, + 21888242871839275222246405745257275088548364400416034343698203976897592446762, + 21888242871839275222246405745257275088548364400416034343698204128817210285687, + 480993584268256, + 21888242871839275222246405745257275088548364400416034343698203831297193033172, + 153539668016867, + 209070504243497, + 21888242871839275222246405745257275088548364400416034343698203713285651521657, + 276231103580555, + 424595661414727, + 450605190514962, + 21888242871839275222246405745257275088548364400416034343698203654697083729736, + 21888242871839275222246405745257275088548364400416034343698204022919680171601, + 417872710439002, + 561807500034529, + 21888242871839275222246405745257275088548364400416034343698203857507682458612, + 461488401633871, + 21888242871839275222246405745257275088548364400416034343698203984464534505878, + 490961562412867, + 173159881932268, + 63289323718232, + 21888242871839275222246405745257275088548364400416034343698203714095518715410, + 246348882040987, + 21888242871839275222246405745257275088548364400416034343698203723732979739278, + 21888242871839275222246405745257275088548364400416034343698203953736672781773, + 21888242871839275222246405745257275088548364400416034343698204049389158125693, + 242635026132968, + 152188150284111, + 419105798955929, + 21888242871839275222246405745257275088548364400416034343698203994114212264109, + 21888242871839275222246405745257275088548364400416034343698203909697983715043, + 163407649807131, + 21888242871839275222246405745257275088548364400416034343698203854276391556463, + 21888242871839275222246405745257275088548364400416034343698203667141436973499, + 21888242871839275222246405745257275088548364400416034343698204136227565641482, + 100478543142319, + 51323534763214, + 21888242871839275222246405745257275088548364400416034343698203655913215987313, + 458918272348678, + 21888242871839275222246405745257275088548364400416034343698203824789009149143, + 90180033406292, + 21888242871839275222246405745257275088548364400416034343698203954924527311672, + 218267338689950, + 21888242871839275222246405745257275088548364400416034343698203982941679306876, + 356770685654684, + 21888242871839275222246405745257275088548364400416034343698203854425319528719, + 269802231581508, + 21888242871839275222246405745257275088548364400416034343698203652633060242573, + 21888242871839275222246405745257275088548364400416034343698204104750899512147, + 21888242871839275222246405745257275088548364400416034343698203988557895994083, + 21888242871839275222246405745257275088548364400416034343698203743978073895369, + 21888242871839275222246405745257275088548364400416034343698203959803121750380, + 21888242871839275222246405745257275088548364400416034343698204136520151768644, + 124787440673534, + 21888242871839275222246405745257275088548364400416034343698203659931621794268, + 12505431942354, + 320193927012257, + 21888242871839275222246405745257275088548364400416034343698204102319893384891, + 21888242871839275222246405745257275088548364400416034343698204046257503773801, + 495428217337342, + 115241897723723, + 20583997504, + 21888242871839275222246405745257275088548364400416034343698203882215815320332, + 21888242871839275222246405745257275088548364400416034343698204133321063148097, + 21888242871839275222246405745257275088548364400416034343698203775131352473247, + 83004017706790, + 47866793510483, + 96202388153880, + 21888242871839275222246405745257275088548364400416034343698204149923826316364, + 471096683713008, + 174495236543779, + 431251855004421, + 534319504284332, + 21888242871839275222246405745257275088548364400416034343698204141850560769984, + 21888242871839275222246405745257275088548364400416034343698203790982764905196, + 331427880145974, + 21888242871839275222246405745257275088548364400416034343698204096543870951220, + 21888242871839275222246405745257275088548364400416034343698203729058814358344, + 228326176620275, + 21888242871839275222246405745257275088548364400416034343698204159305095334259, + 21888242871839275222246405745257275088548364400416034343698204131739863432657, + 21888242871839275222246405745257275088548364400416034343698203919005636126447, + 21888242871839275222246405745257275088548364400416034343698203908983493914628, + 21888242871839275222246405745257275088548364400416034343698204103471414748075, + 557554207697895, + 21888242871839275222246405745257275088548364400416034343698204085020529684498, + 354542229812099, + 452485053596386, + 21888242871839275222246405745257275088548364400416034343698203817368422765079, + 21888242871839275222246405745257275088548364400416034343698203861666251436896, + 21888242871839275222246405745257275088548364400416034343698204133497728416645, + 370259140140057, + 21888242871839275222246405745257275088548364400416034343698203786903403484340, + 21888242871839275222246405745257275088548364400416034343698203885960854954624, + 21888242871839275222246405745257275088548364400416034343698204131759314662699, + 21888242871839275222246405745257275088548364400416034343698203648765492076240, + 21888242871839275222246405745257275088548364400416034343698203969141383944532, + 21888242871839275222246405745257275088548364400416034343698203888225272827956, + 21888242871839275222246405745257275088548364400416034343698203845264024273614, + 21888242871839275222246405745257275088548364400416034343698203857024589961301, + 21888242871839275222246405745257275088548364400416034343698204175728450040978, + 21888242871839275222246405745257275088548364400416034343698203883317830960929, + 157040508829412, + 294708479311996, + 171795421080369, + 513733999981647, + 21888242871839275222246405745257275088548364400416034343698204140193764225636, + 21888242871839275222246405745257275088548364400416034343698203975607605606389, + 237571774527555, + 21888242871839275222246405745257275088548364400416034343698203749415785830346, + 526130223559026, + 93742698348592, + 184212366309708, + 112853448999973, + 129192338329816, + 55295099154516, + 21888242871839275222246405745257275088548364400416034343698204080396661879641, + 21888242871839275222246405745257275088548364400416034343698204161459649714642, + 21888242871839275222246405745257275088548364400416034343698203753084673724528, + 21888242871839275222246405745257275088548364400416034343698203640369202847676, + 423381742210840, + 133432902872245, + 21888242871839275222246405745257275088548364400416034343698204105443506481695, + 21888242871839275222246405745257275088548364400416034343698204004695483541731, + 69227556669520, + 351471156837660, + 21888242871839275222246405745257275088548364400416034343698203942291607964662, + 219475217956842, + 21888242871839275222246405745257275088548364400416034343698203769670835209047, + 412683952131711, + 21888242871839275222246405745257275088548364400416034343698203732762975110963, + 21888242871839275222246405745257275088548364400416034343698203689952404494039, + 21888242871839275222246405745257275088548364400416034343698203684367242131649, + 322498565335422, + 258418341211474, + 240038693077030, + 558875342763083, + 21888242871839275222246405745257275088548364400416034343698203635323979544800, + 534330052823185, + 306100738172546, + 246477209267473, + 210552919210520, + 21888242871839275222246405745257275088548364400416034343698203908916950418353, + 432739426443624, + 21888242871839275222246405745257275088548364400416034343698204074537378933596, + 21888242871839275222246405745257275088548364400416034343698203823811490044294, + 21888242871839275222246405745257275088548364400416034343698204149895892686870, + 21888242871839275222246405745257275088548364400416034343698203842393418340743, + 21888242871839275222246405745257275088548364400416034343698204029207544003368, + 21888242871839275222246405745257275088548364400416034343698203687057792315997, + 136982910130789, + 21888242871839275222246405745257275088548364400416034343698204020569514477944, + 159957132722168, + 537268873262114, + 238803391615527, + 21888242871839275222246405745257275088548364400416034343698203729600179555583, + 21888242871839275222246405745257275088548364400416034343698204149187154231830, + 352875548753971, + 188505324978899, + 21888242871839275222246405745257275088548364400416034343698203909933952373319, + 503885775040410, + 157560741865389, + 537107868719513, + 21888242871839275222246405745257275088548364400416034343698203809410786376212, + 250219089239375, + 97792092142298, + 21888242871839275222246405745257275088548364400416034343698203941180899704738, + 208930587663589, + 188324625154733, + 520098247517444, + 21888242871839275222246405745257275088548364400416034343698204063087377902208, + 21888242871839275222246405745257275088548364400416034343698203704065427559946, + 404223985001609, + 2128330232898, + 376320558440350, + 21888242871839275222246405745257275088548364400416034343698203868966619678007, + 21888242871839275222246405745257275088548364400416034343698203850505042240909, + 21888242871839275222246405745257275088548364400416034343698203638243392619520, + 21888242871839275222246405745257275088548364400416034343698203661159827225192, + 485874182851319, + 509934293823183, + 21888242871839275222246405745257275088548364400416034343698203844725058526334, + 21888242871839275222246405745257275088548364400416034343698203689078123639792, + 21888242871839275222246405745257275088548364400416034343698203987928343512735, + 21888242871839275222246405745257275088548364400416034343698203864946081097284, + 370955472617976, + 474618855677192, + 21888242871839275222246405745257275088548364400416034343698203858496543550999, + 21888242871839275222246405745257275088548364400416034343698204052193136641968, + 21888242871839275222246405745257275088548364400416034343698204139351911970081, + 21888242871839275222246405745257275088548364400416034343698203801326476831834, + 102091533231294, + 21888242871839275222246405745257275088548364400416034343698204052517908234954, + 21888242871839275222246405745257275088548364400416034343698203797070122909327, + 115549491700023, + 338907186773596, + 21888242871839275222246405745257275088548364400416034343698203689972844357679, + 360708588094269, + 21888242871839275222246405745257275088548364400416034343698203706470245853161, + 21888242871839275222246405745257275088548364400416034343698203681168470394404, + 21888242871839275222246405745257275088548364400416034343698204136482974516646, + 74704255157584, + 545084526646358, + 21888242871839275222246405745257275088548364400416034343698203753443179733508, + 21888242871839275222246405745257275088548364400416034343698203790322816633506, + 385998198081332, + 348320834905361, + 92695168079345, + 21888242871839275222246405745257275088548364400416034343698203738016194912434, + 21888242871839275222246405745257275088548364400416034343698203886799992047735, + 21888242871839275222246405745257275088548364400416034343698204018047131062062, + 29518023002811, + 316175396635465, + 21888242871839275222246405745257275088548364400416034343698204060323281534348, + 127398662811010, + 533391269869817, + 21888242871839275222246405745257275088548364400416034343698203836230557256953, + 348487647954257, + 21888242871839275222246405745257275088548364400416034343698204177084711974474, + 21888242871839275222246405745257275088548364400416034343698204155251149964433, + 345577072764318, + 284969893220222, + 19644008944179, + 405650841967448, + 21888242871839275222246405745257275088548364400416034343698203739367720101051, + 21888242871839275222246405745257275088548364400416034343698203850537911976136, + 21888242871839275222246405745257275088548364400416034343698203733509590634479, + 521004776910844, + 286973801302156, + 21888242871839275222246405745257275088548364400416034343698203631049583803745, + 21888242871839275222246405745257275088548364400416034343698204110541570875222, + 21888242871839275222246405745257275088548364400416034343698203722819927673376, + 21888242871839275222246405745257275088548364400416034343698203873495651286730, + 21888242871839275222246405745257275088548364400416034343698204039027242477178, + 21888242871839275222246405745257275088548364400416034343698204158227082892054, + 531321110589875, + 470543591938445, + 21888242871839275222246405745257275088548364400416034343698203981051624277458, + 21888242871839275222246405745257275088548364400416034343698204089616585163825, + 401926133112055, + 384367039611312, + 21888242871839275222246405745257275088548364400416034343698203670894329738697, + 67383417473658, + 418187191694794, + 497028102909148, + 21888242871839275222246405745257275088548364400416034343698203745822680600946, + 484722668992039, + 11247245932576, + 218663420732297, + 81659034219082, + 21888242871839275222246405745257275088548364400416034343698203754804225701853, + 145410806288266, + 181838278180534, + 444482592902210, + 21888242871839275222246405745257275088548364400416034343698204104123391944747, + 235445119447264, + 425563332362126, + 21888242871839275222246405745257275088548364400416034343698204031609821019278, + 21888242871839275222246405745257275088548364400416034343698203706953681020324, + 390503731022577, + 26053780573960, + 21888242871839275222246405745257275088548364400416034343698203655424086901069, + 21888242871839275222246405745257275088548364400416034343698203731854393571749, + 54109078983591, + 408742282448109, + 213484763657576, + 477470392473681, + 21888242871839275222246405745257275088548364400416034343698204035781106952743, + 536403795266584, + 21888242871839275222246405745257275088548364400416034343698203863059873156802, + 479793065604998, + 104190714181504, + 21888242871839275222246405745257275088548364400416034343698204024820567486950, + 21888242871839275222246405745257275088548364400416034343698203766130658704107, + 415462782758011, + 21888242871839275222246405745257275088548364400416034343698203962956303052143, + 21888242871839275222246405745257275088548364400416034343698203807694631449219, + 120440970555974, + 21888242871839275222246405745257275088548364400416034343698203770632741042605, + 183286729172924, + 263841271880431, + 21888242871839275222246405745257275088548364400416034343698203894043589879549, + 359674321518003, + 515215576834174, + 390876274370928, + 21888242871839275222246405745257275088548364400416034343698203791178794513530, + 21888242871839275222246405745257275088548364400416034343698203899570184592390, + 521948730042646, + 304157151119690, + 21888242871839275222246405745257275088548364400416034343698204166494911883618, + 21888242871839275222246405745257275088548364400416034343698203669310817378069, + 460489194260778, + 504110550568553, + 548661376072766, + 21888242871839275222246405745257275088548364400416034343698204054536374892373, + 452529140999775, + 174948851348576, + 21888242871839275222246405745257275088548364400416034343698203716355807262904, + 503245475066861, + 21888242871839275222246405745257275088548364400416034343698204183408306472919, + 259169865422225, + 46530096498007, + 21888242871839275222246405745257275088548364400416034343698203856969227943442, + 120076045470761, + 21888242871839275222246405745257275088548364400416034343698203860868881093380, + 177757994240106, + 21888242871839275222246405745257275088548364400416034343698203832700508847004, + 21888242871839275222246405745257275088548364400416034343698204162349110514748, + 21888242871839275222246405745257275088548364400416034343698203680463774989477, + 282307632907673, + 374925271810584, + 21888242871839275222246405745257275088548364400416034343698204182937891054782, + 62796499553836, + 110040315694260, + 21888242871839275222246405745257275088548364400416034343698203994990582773263, + 21888242871839275222246405745257275088548364400416034343698203791179000776766, + 89571744311222, + 61484464976996, + 21888242871839275222246405745257275088548364400416034343698204012649809504240, + 21888242871839275222246405745257275088548364400416034343698203765403876497973, + 209863608154873, + 123459146611787, + 77793532056513, + 433317225114416, + 21888242871839275222246405745257275088548364400416034343698203682975057531419, + 86383878131151, + 354249549566730, + 358469417815973, + 477606397786478, + 21888242871839275222246405745257275088548364400416034343698203637260131316576, + 261136192163864, + 21888242871839275222246405745257275088548364400416034343698203990880657807784, + 380640570932710, + 479238044218009, + 21888242871839275222246405745257275088548364400416034343698203789351209971551, + 9748600535834, + 459793835264523, + 21888242871839275222246405745257275088548364400416034343698203818595108772955, + 230282136587450, + 21888242871839275222246405745257275088548364400416034343698203865296258828865, + 21888242871839275222246405745257275088548364400416034343698203932416753717400, + 21888242871839275222246405745257275088548364400416034343698203766823179603749, + 345685623876009, + 21888242871839275222246405745257275088548364400416034343698204153185005456522, + 405007204863037, + 501361790928985, + 21888242871839275222246405745257275088548364400416034343698204071098424209344, + 21888242871839275222246405745257275088548364400416034343698203659764676531273, + 383454087732475, + 21888242871839275222246405745257275088548364400416034343698203768703711791766, + 21888242871839275222246405745257275088548364400416034343698203849149842019965, + 21888242871839275222246405745257275088548364400416034343698204158887185581442, + 21888242871839275222246405745257275088548364400416034343698203673385840471807, + 57428024571135, + 21888242871839275222246405745257275088548364400416034343698204105127206189891, + 21888242871839275222246405745257275088548364400416034343698203722869988316941, + 21888242871839275222246405745257275088548364400416034343698204012238538758437, + 279745419040425, + 410309572814100, + 160288715629912, + 21888242871839275222246405745257275088548364400416034343698203891013015177540, + 21888242871839275222246405745257275088548364400416034343698204071988725554895, + 43650245656681, + 21888242871839275222246405745257275088548364400416034343698204125747897259807, + 198959965175846, + 83203865787589, + 147427393094458, + 104162689951018, + 21888242871839275222246405745257275088548364400416034343698203970002038042759, + 355252415151548, + 90946091260663, + 329178279719340, + 21888242871839275222246405745257275088548364400416034343698203777911230207742, + 21888242871839275222246405745257275088548364400416034343698203854403178070709, + 21888242871839275222246405745257275088548364400416034343698203698157752958244, + 492640194436246, + 21888242871839275222246405745257275088548364400416034343698203719685100664127, + 21888242871839275222246405745257275088548364400416034343698203845372107849549, + 21888242871839275222246405745257275088548364400416034343698203920838599433153, + 21888242871839275222246405745257275088548364400416034343698203941244547770804, + 30646313026689, + 85323135555921, + 21888242871839275222246405745257275088548364400416034343698203848529930398088, + 21888242871839275222246405745257275088548364400416034343698203866748091870447, + 77709579412669, + 330700291349648, + 215860499566368, + 21888242871839275222246405745257275088548364400416034343698203662363019945297, + 458567240168420, + 368829748102820, + 21888242871839275222246405745257275088548364400416034343698203789045260793969, + 21888242871839275222246405745257275088548364400416034343698204125224659101834, + 111496655111672, + 397099232726385, + 359987733513196, + 105326483183378, + 21888242871839275222246405745257275088548364400416034343698203998178601056586, + 319806859801859, + 21888242871839275222246405745257275088548364400416034343698203999798494838857, + 143282976060083, + 21888242871839275222246405745257275088548364400416034343698203807058696042455, + 213071990786060, + 21888242871839275222246405745257275088548364400416034343698203638271531110823, + 21888242871839275222246405745257275088548364400416034343698204084045566736085, + 21888242871839275222246405745257275088548364400416034343698204112314273966056, + 553782737524990, + 21888242871839275222246405745257275088548364400416034343698203971702469393111, + 369270386894523, + 21888242871839275222246405745257275088548364400416034343698204013919377318166, + 21888242871839275222246405745257275088548364400416034343698203642046463005673, + 227662125076220, + 21888242871839275222246405745257275088548364400416034343698203794511580171695, + 74054754656645, + 317414975747105, + 21888242871839275222246405745257275088548364400416034343698204119973662788263, + 14039071300228, + 437405508239217, + 68563533958349, + 413323063881506, + 21888242871839275222246405745257275088548364400416034343698204100659988592184, + 21888242871839275222246405745257275088548364400416034343698203637953552922632, + 21888242871839275222246405745257275088548364400416034343698203819889862607709, + 21888242871839275222246405745257275088548364400416034343698203662011887417268, + 21888242871839275222246405745257275088548364400416034343698204057000595149460, + 106301017969750, + 528460839062713, + 116889820279866, + 185483991640185, + 437417357140720, + 21888242871839275222246405745257275088548364400416034343698204165544804239864, + 21888242871839275222246405745257275088548364400416034343698203673113448426439, + 21888242871839275222246405745257275088548364400416034343698203933259736507864, + 309844419031566, + 21888242871839275222246405745257275088548364400416034343698203817079523651244, + 288843585204604, + 21888242871839275222246405745257275088548364400416034343698203844604070650017, + 21888242871839275222246405745257275088548364400416034343698203658922440983345, + 236873842259202, + 21888242871839275222246405745257275088548364400416034343698203942977494108566, + 286696987634806, + 346873541982273, + 344546891935880, + 21888242871839275222246405745257275088548364400416034343698203658286470408276, + 187159132313174, + 58477690936607, + 234531304348172, + 21888242871839275222246405745257275088548364400416034343698203640709302810114, + 391580468342651, + 56207926826220, + 1094955960651, + 45872558678417, + 550703128291522, + 21888242871839275222246405745257275088548364400416034343698203828440250622658, + 21888242871839275222246405745257275088548364400416034343698203798705855554409, + 153290803347898, + 471592091286089, + 334838519398976, + 350115903655992, + 180611580219322, + 199572373620528, + 21888242871839275222246405745257275088548364400416034343698204158933507778327, + 285798528147425, + 21888242871839275222246405745257275088548364400416034343698204153588087776750, + 41386566723208, + 144620533550666, + 524398823849379, + 301180296590492, + 21888242871839275222246405745257275088548364400416034343698204068148961230599, + 21888242871839275222246405745257275088548364400416034343698203947521667058621, + 90589760475172, + 337849638100470, + 362402893279210, + 21888242871839275222246405745257275088548364400416034343698203935767769662214, + 21888242871839275222246405745257275088548364400416034343698203896541830514262, + 21888242871839275222246405745257275088548364400416034343698204039086147477627, + 21888242871839275222246405745257275088548364400416034343698203955958057574139, + 423681061539262, + 21888242871839275222246405745257275088548364400416034343698203638984474675529, + 80040305663412, + 179054201934735, + 21888242871839275222246405745257275088548364400416034343698203972517061942225, + 21888242871839275222246405745257275088548364400416034343698204175913153389378, + 21888242871839275222246405745257275088548364400416034343698203633192573859662, + 21888242871839275222246405745257275088548364400416034343698204182863450526549, + 21888242871839275222246405745257275088548364400416034343698203863537098668366, + 191407331626348, + 434476378884452, + 234017279518038, + 21888242871839275222246405745257275088548364400416034343698203996198025467310, + 400060431109076, + 21888242871839275222246405745257275088548364400416034343698203809950909869876, + 21888242871839275222246405745257275088548364400416034343698203777972693935377, + 300631416054930, + 21888242871839275222246405745257275088548364400416034343698203808583008891041, + 21888242871839275222246405745257275088548364400416034343698204071957587567587, + 21888242871839275222246405745257275088548364400416034343698204140624204016002, + 131152281430285, + 21888242871839275222246405745257275088548364400416034343698203935733204775614, + 21888242871839275222246405745257275088548364400416034343698204085074648899751, + 190387519322260, + 21888242871839275222246405745257275088548364400416034343698203748507935471348, + 21888242871839275222246405745257275088548364400416034343698204001318043302152, + 21888242871839275222246405745257275088548364400416034343698203966178253085543, + 162678310617738, + 21888242871839275222246405745257275088548364400416034343698203725175161495627, + 21888242871839275222246405745257275088548364400416034343698203864238489072814, + 21888242871839275222246405745257275088548364400416034343698203814655347601296, + 214661503867101, + 341777566154906, + 21888242871839275222246405745257275088548364400416034343698204020549289036616, + 237687313354021, + 21888242871839275222246405745257275088548364400416034343698204088180086567732, + 195373872713429, + 21888242871839275222246405745257275088548364400416034343698204078880455700350, + 510016285894723, + 21888242871839275222246405745257275088548364400416034343698204040941062522141, + 173716193368422, + 21888242871839275222246405745257275088548364400416034343698204053779534237866, + 21888242871839275222246405745257275088548364400416034343698203832360044991258, + 21888242871839275222246405745257275088548364400416034343698203685702755065044, + 21888242871839275222246405745257275088548364400416034343698204067355455725910, + 21888242871839275222246405745257275088548364400416034343698204026774069647179, + 21888242871839275222246405745257275088548364400416034343698203798616563161749, + 103975229878325, + 348816939722472, + 501891840235489, + 21888242871839275222246405745257275088548364400416034343698203918970487155087, + 420276571747407, + 21888242871839275222246405745257275088548364400416034343698203670715327806674, + 445832794873449, + 293429673031728, + 36224615493887, + 21888242871839275222246405745257275088548364400416034343698204163802757925802, + 18779692961483, + 68086040290049, + 117720591047832, + 21888242871839275222246405745257275088548364400416034343698204045023912242402, + 315015429676521, + 21888242871839275222246405745257275088548364400416034343698204092849738397530, + 155820555796511, + 21888242871839275222246405745257275088548364400416034343698203906001296871253, + 21888242871839275222246405745257275088548364400416034343698203749164393976150, + 21888242871839275222246405745257275088548364400416034343698203979088667730386, + 391902774074942, + 21888242871839275222246405745257275088548364400416034343698203995725381861362, + 21888242871839275222246405745257275088548364400416034343698203717663084846742, + 21888242871839275222246405745257275088548364400416034343698203802207974788348, + 21888242871839275222246405745257275088548364400416034343698203883670829467688, + 186399472096518, + 21888242871839275222246405745257275088548364400416034343698204054726225824215, + 348464946028885, + 21888242871839275222246405745257275088548364400416034343698203893812339390144, + 21888242871839275222246405745257275088548364400416034343698203996820319687277, + 21888242871839275222246405745257275088548364400416034343698204104796233856774, + 21888242871839275222246405745257275088548364400416034343698203697349312238367, + 280370354307365, + 74647053216802, + 98148532294665, + 518876437207219, + 240376088852554, + 20712417761582, + 221809165509708, + 21888242871839275222246405745257275088548364400416034343698203989757732606884, + 342771309408359, + 21888242871839275222246405745257275088548364400416034343698203819454275819789, + 466054873776150, + 21888242871839275222246405745257275088548364400416034343698204032030510681359, + 21888242871839275222246405745257275088548364400416034343698203945282750519041, + 92217921571088, + 96638256423836, + 21888242871839275222246405745257275088548364400416034343698204121383813963551, + 21888242871839275222246405745257275088548364400416034343698203772365975643063, + 21888242871839275222246405745257275088548364400416034343698204017691301760712, + 216560286774807, + 21888242871839275222246405745257275088548364400416034343698203996983051710581, + 21888242871839275222246405745257275088548364400416034343698204079385092888602, + 21888242871839275222246405745257275088548364400416034343698203812149108869779, + 498464174531268, + 43715522196671, + 21888242871839275222246405745257275088548364400416034343698203918181999960427, + 21888242871839275222246405745257275088548364400416034343698203677382063269412, + 334251548966816, + 21888242871839275222246405745257275088548364400416034343698203787646990833943, + 21888242871839275222246405745257275088548364400416034343698203759302105430868, + 21888242871839275222246405745257275088548364400416034343698203825378609386551, + 526719488016064, + 21888242871839275222246405745257275088548364400416034343698203940149225542573, + 438979976618056, + 21888242871839275222246405745257275088548364400416034343698203852125572915946, + 21888242871839275222246405745257275088548364400416034343698204165650095932883, + 21888242871839275222246405745257275088548364400416034343698203692840673203698, + 230986140998729, + 260352014619207, + 292441965777338, + 21888242871839275222246405745257275088548364400416034343698203909099835341375, + 21888242871839275222246405745257275088548364400416034343698204129051154435900, + 21888242871839275222246405745257275088548364400416034343698203738654264027442, + 118909280277334, + 530937201736821, + 21888242871839275222246405745257275088548364400416034343698203972403156351321, + 468884140334744, + 82729029586033, + 484270507444919, + 21888242871839275222246405745257275088548364400416034343698203686752801507201, + 21888242871839275222246405745257275088548364400416034343698203903123057945383, + 190593035430925, + 429397986405727, + 212527334832008, + 21888242871839275222246405745257275088548364400416034343698203827760816550085, + 21888242871839275222246405745257275088548364400416034343698203861801842183292, + 21888242871839275222246405745257275088548364400416034343698203677236362514892, + 325976133413909, + 541066744917207, + 21888242871839275222246405745257275088548364400416034343698204163130136277767, + 21888242871839275222246405745257275088548364400416034343698204119301051936636, + 21888242871839275222246405745257275088548364400416034343698203764280845659920, + 356922163923698, + 21888242871839275222246405745257275088548364400416034343698204154837843459500, + 228115337049102, + 21888242871839275222246405745257275088548364400416034343698203661951097469330, + 369086144056769, + 21888242871839275222246405745257275088548364400416034343698203716724023200904, + 21888242871839275222246405745257275088548364400416034343698203950920743517449, + 239423795689031, + 98047299987112, + 21888242871839275222246405745257275088548364400416034343698204082720484868904, + 21888242871839275222246405745257275088548364400416034343698203885888096563315, + 275056156786979, + 511740226988319, + 21888242871839275222246405745257275088548364400416034343698204008460292774086, + 21888242871839275222246405745257275088548364400416034343698203667271288189210, + 43944447362576, + 268662431454825, + 21888242871839275222246405745257275088548364400416034343698203979766738533711, + 25682673892888, + 21888242871839275222246405745257275088548364400416034343698203626573555046828, + 21888242871839275222246405745257275088548364400416034343698204020543786471553, + 21888242871839275222246405745257275088548364400416034343698203834344868492930, + 225159283349168, + 521324282510460, + 21888242871839275222246405745257275088548364400416034343698203971161026708676, + 64023033083474, + 395589097686377, + 464410255845041, + 122908062023004, + 167916414347378, + 354184736450973, + 505989511319129, + 21888242871839275222246405745257275088548364400416034343698203809135898168789, + 233883691864075, + 21888242871839275222246405745257275088548364400416034343698203983103990534526, + 21888242871839275222246405745257275088548364400416034343698203938380874403795, + 21888242871839275222246405745257275088548364400416034343698203682747301822563, + 254337098374041, + 153026051746090, + 21888242871839275222246405745257275088548364400416034343698203882222439363418, + 538129641119741, + 333887175189755, + 299779299064021, + 370597237922769, + 21888242871839275222246405745257275088548364400416034343698204181050335688990, + 21888242871839275222246405745257275088548364400416034343698204169464631369239, + 204311654781124, + 293295873805821, + 209977821130867, + 228836016309600, + 21888242871839275222246405745257275088548364400416034343698203924679337934640, + 540206533649575, + 30683093320811, + 21888242871839275222246405745257275088548364400416034343698203739774269892171, + 21888242871839275222246405745257275088548364400416034343698203802416743282537, + 21888242871839275222246405745257275088548364400416034343698203912217565349013, + 21888242871839275222246405745257275088548364400416034343698203648593912234515, + 190635836003156, + 290439480068695, + 210286440988737, + 21888242871839275222246405745257275088548364400416034343698203824534531850532, + 21888242871839275222246405745257275088548364400416034343698203931678588947618, + 21888242871839275222246405745257275088548364400416034343698203693212641731872, + 424032800561662, + 21888242871839275222246405745257275088548364400416034343698203947907118530945, + 21888242871839275222246405745257275088548364400416034343698203693716463930301, + 197344489861786, + 21888242871839275222246405745257275088548364400416034343698203915736568266956, + 307570303138194, + 201838117943415, + 21888242871839275222246405745257275088548364400416034343698203668795677989132, + 287049312683931, + 520696447935561, + 21888242871839275222246405745257275088548364400416034343698204026991432211921, + 21888242871839275222246405745257275088548364400416034343698203653540347904775, + 547291165599521, + 545226558635508, + 293580715334027, + 21888242871839275222246405745257275088548364400416034343698203626010371357140, + 21888242871839275222246405745257275088548364400416034343698204072372496922265, + 95539996927831, + 533238524614727, + 21888242871839275222246405745257275088548364400416034343698203858095365876499, + 21888242871839275222246405745257275088548364400416034343698204045470100582626, + 21888242871839275222246405745257275088548364400416034343698204098598813193111, + 21888242871839275222246405745257275088548364400416034343698204008985391898449, + 544509604882593, + 21888242871839275222246405745257275088548364400416034343698203982865191747821, + 448458038139353, + 21888242871839275222246405745257275088548364400416034343698203718415035825226, + 21888242871839275222246405745257275088548364400416034343698203814584830091929, + 1373278388084, + 21888242871839275222246405745257275088548364400416034343698203658993512376528, + 21888242871839275222246405745257275088548364400416034343698203885878294416163, + 21888242871839275222246405745257275088548364400416034343698203963494444074525, + 239892730059260, + 21888242871839275222246405745257275088548364400416034343698203950054403907010, + 21888242871839275222246405745257275088548364400416034343698203963263616676055, + 21888242871839275222246405745257275088548364400416034343698203871991700302546, + 21888242871839275222246405745257275088548364400416034343698203799720209619098, + 21888242871839275222246405745257275088548364400416034343698203803468638087901, + 21888242871839275222246405745257275088548364400416034343698204057567241707778, + 278986075164471, + 21888242871839275222246405745257275088548364400416034343698204040432621960304, + 21888242871839275222246405745257275088548364400416034343698203779566520369106, + 21888242871839275222246405745257275088548364400416034343698204049402819029812, + 112457898386141, + 328957150908867, + 21888242871839275222246405745257275088548364400416034343698204180877500352843, + 412717213112069, + 162530973325009, + 364560705427973, + 210796115989910, + 238102441054211, + 21888242871839275222246405745257275088548364400416034343698203744368717518437, + 199633461024244, + 103213291119834, + 437615717446534, + 21888242871839275222246405745257275088548364400416034343698203886689177832647, + 241115321017166, + 298859124095582, + 21888242871839275222246405745257275088548364400416034343698203770430099804040, + 21888242871839275222246405745257275088548364400416034343698203980745211983160, + 451036619914083, + 21888242871839275222246405745257275088548364400416034343698204060304579103505, + 527973012880483, + 431979923928293, + 21888242871839275222246405745257275088548364400416034343698203847472316838898, + 96928159800845, + 486395341522888, + 137972833541774, + 343163276647828, + 21888242871839275222246405745257275088548364400416034343698203978866119412174, + 355822400095416, + 21888242871839275222246405745257275088548364400416034343698204007189706558116, + 243358555582544, + 21888242871839275222246405745257275088548364400416034343698203653112319270347, + 21888242871839275222246405745257275088548364400416034343698203882696574131062, + 21888242871839275222246405745257275088548364400416034343698203955303344909264, + 21888242871839275222246405745257275088548364400416034343698204169456226426176, + 323011392018116, + 21888242871839275222246405745257275088548364400416034343698204014167849700205, + 21888242871839275222246405745257275088548364400416034343698203638714026263357, + 21888242871839275222246405745257275088548364400416034343698203860521706114774, + 21888242871839275222246405745257275088548364400416034343698203688635295880900, + 21888242871839275222246405745257275088548364400416034343698203790812153300823, + 21888242871839275222246405745257275088548364400416034343698203991287010547375, + 21888242871839275222246405745257275088548364400416034343698203638265149617948, + 21888242871839275222246405745257275088548364400416034343698204003560757043067, + 113563269277394, + 21888242871839275222246405745257275088548364400416034343698204101536418972291, + 144561826299860, + 21888242871839275222246405745257275088548364400416034343698203756800946184910, + 247620936594044, + 21888242871839275222246405745257275088548364400416034343698203801538704546956, + 494474474210944, + 21888242871839275222246405745257275088548364400416034343698203887301312897763, + 144094646509246, + 21888242871839275222246405745257275088548364400416034343698204015927334672730, + 21888242871839275222246405745257275088548364400416034343698204128055261261314, + 21888242871839275222246405745257275088548364400416034343698204042344428187535, + 392017122253017, + 21888242871839275222246405745257275088548364400416034343698204030896838272566, + 21888242871839275222246405745257275088548364400416034343698203800940004622699, + 150775499802458, + 405424698192493, + 295226845737077, + 21888242871839275222246405745257275088548364400416034343698203625265484301603, + 21888242871839275222246405745257275088548364400416034343698204043290917919467, + 21888242871839275222246405745257275088548364400416034343698204174991526719863, + 21888242871839275222246405745257275088548364400416034343698203771112636016998, + 21888242871839275222246405745257275088548364400416034343698203645395196948020, + 121906184965585, + 21888242871839275222246405745257275088548364400416034343698204029884792488410, + 170140128810815, + 21888242871839275222246405745257275088548364400416034343698203972417172725839, + 556531424765682, + 21888242871839275222246405745257275088548364400416034343698204112472259999698, + 455951915072603, + 18505073874215, + 21888242871839275222246405745257275088548364400416034343698203832057739258492, + 49758131731564, + 21888242871839275222246405745257275088548364400416034343698203865052056031947, + 396208553937923, + 497371795907484, + 21888242871839275222246405745257275088548364400416034343698204165480468233052, + 21888242871839275222246405745257275088548364400416034343698204084314232843510, + 21888242871839275222246405745257275088548364400416034343698203919005276698041, + 420713626471138, + 21888242871839275222246405745257275088548364400416034343698204085117728392967, + 21888242871839275222246405745257275088548364400416034343698203981036999347621, + 424034453442816, + 21888242871839275222246405745257275088548364400416034343698203911975409999006, + 477897279104039, + 21888242871839275222246405745257275088548364400416034343698203675126536749352, + 538073512387925, + 21888242871839275222246405745257275088548364400416034343698204022193706933713, + 429998240190301, + 21888242871839275222246405745257275088548364400416034343698203853238454679755, + 107165572815252, + 21888242871839275222246405745257275088548364400416034343698203709513083264044, + 21888242871839275222246405745257275088548364400416034343698204183373202161617, + 21888242871839275222246405745257275088548364400416034343698203830951664905843, + 377158739478314, + 115967718776622, + 21888242871839275222246405745257275088548364400416034343698204091057980705147, + 462671176729501, + 21888242871839275222246405745257275088548364400416034343698203908478909755769, + 21888242871839275222246405745257275088548364400416034343698203842083055950487, + 21888242871839275222246405745257275088548364400416034343698203840853061396565, + 21888242871839275222246405745257275088548364400416034343698203979334194943190, + 21888242871839275222246405745257275088548364400416034343698203873533460342715, + 21888242871839275222246405745257275088548364400416034343698203776257537488702, + 120270924338169, + 309453710994192, + 414954109980258, + 312211679799953, + 21888242871839275222246405745257275088548364400416034343698203776457860706761, + 21888242871839275222246405745257275088548364400416034343698203873586414163206, + 126540085383947, + 153545794492897, + 21888242871839275222246405745257275088548364400416034343698203823047137778050, + 452286797563618, + 431539225885911, + 228664265432675, + 21888242871839275222246405745257275088548364400416034343698203671535665388222, + 296276662151522, + 21888242871839275222246405745257275088548364400416034343698203681341413251282, + 95950935642818, + 330962305360641, + 21888242871839275222246405745257275088548364400416034343698204162072993345577, + 21888242871839275222246405745257275088548364400416034343698203798958792459878, + 48887539121680, + 223271965613174, + 375928169472970, + 21888242871839275222246405745257275088548364400416034343698204086641419262566, + 21888242871839275222246405745257275088548364400416034343698204008957991146443, + 21888242871839275222246405745257275088548364400416034343698203634655350045917, + 302867705366280, + 21888242871839275222246405745257275088548364400416034343698203894619734921072, + 462542040244277, + 21888242871839275222246405745257275088548364400416034343698203936867598924200, + 153835755668064, + 21888242871839275222246405745257275088548364400416034343698204128991701667388, + 244863055143407, + 21888242871839275222246405745257275088548364400416034343698203890151284857055, + 320847078423212, + 21888242871839275222246405745257275088548364400416034343698204184790242428608, + 534396555917753, + 21888242871839275222246405745257275088548364400416034343698203996475251665347, + 529964216046849, + 21888242871839275222246405745257275088548364400416034343698203912087943000813, + 311640409706944, + 21888242871839275222246405745257275088548364400416034343698204111581988840969, + 21888242871839275222246405745257275088548364400416034343698203814505390059936, + 21888242871839275222246405745257275088548364400416034343698203970649138931741, + 352671957344323, + 498294494614805, + 21888242871839275222246405745257275088548364400416034343698204000458107506313, + 81045352175786, + 21888242871839275222246405745257275088548364400416034343698204181532580033339, + 21888242871839275222246405745257275088548364400416034343698203685865140813614, + 21888242871839275222246405745257275088548364400416034343698203809716567558030, + 389167930110690, + 272742348519086, + 225889651509433, + 337327439564305, + 113331701453465, + 21888242871839275222246405745257275088548364400416034343698204053504128281204, + 21888242871839275222246405745257275088548364400416034343698203913879995732583, + 21888242871839275222246405745257275088548364400416034343698203839824698534465, + 21888242871839275222246405745257275088548364400416034343698203712532294938186, + 21888242871839275222246405745257275088548364400416034343698204049182232721782, + 346025977812119, + 21888242871839275222246405745257275088548364400416034343698203721228732685535, + 102024764027769, + 21888242871839275222246405745257275088548364400416034343698204070894028500668, + 21888242871839275222246405745257275088548364400416034343698203857864386338944, + 21888242871839275222246405745257275088548364400416034343698204104078409929167, + 119588920854371, + 21888242871839275222246405745257275088548364400416034343698203900769213100056, + 227993931568239, + 38825422981407, + 21888242871839275222246405745257275088548364400416034343698204039080006181515, + 21888242871839275222246405745257275088548364400416034343698203877448207766144, + 21888242871839275222246405745257275088548364400416034343698203733936159849530, + 85030300815555, + 21888242871839275222246405745257275088548364400416034343698203723609056270501, + 21888242871839275222246405745257275088548364400416034343698203717570544660110, + 21888242871839275222246405745257275088548364400416034343698203992969041150149, + 21888242871839275222246405745257275088548364400416034343698203629559193530868, + 21888242871839275222246405745257275088548364400416034343698203987639453833173, + 165277487404830, + 21888242871839275222246405745257275088548364400416034343698203731064471425307, + 243642645588720, + 21888242871839275222246405745257275088548364400416034343698203896138543983009, + 21888242871839275222246405745257275088548364400416034343698203825553488049332, + 21888242871839275222246405745257275088548364400416034343698203753867964625956, + 21888242871839275222246405745257275088548364400416034343698204136394641209631, + 21888242871839275222246405745257275088548364400416034343698203652539437497476, + 21888242871839275222246405745257275088548364400416034343698203634289785090719, + 89780960237490, + 463552732957228, + 463170696902642, + 21888242871839275222246405745257275088548364400416034343698203853972437394530, + 388177503174007, + 550864379388176, + 21888242871839275222246405745257275088548364400416034343698204045231080538593, + 21888242871839275222246405745257275088548364400416034343698204011099600670080, + 21888242871839275222246405745257275088548364400416034343698203640793776251350, + 21888242871839275222246405745257275088548364400416034343698203955283264777246, + 21888242871839275222246405745257275088548364400416034343698203751398742129613, + 493647006075731, + 21888242871839275222246405745257275088548364400416034343698204036401731070477, + 104224322012131, + 226235633625591, + 21888242871839275222246405745257275088548364400416034343698203911006495623179, + 26105440947472, + 380916444588256, + 21888242871839275222246405745257275088548364400416034343698203727219415372619, + 269495653339359, + 112500749276702, + 21888242871839275222246405745257275088548364400416034343698204112535370642206, + 168322638913689, + 466811617692956, + 21888242871839275222246405745257275088548364400416034343698203760998511779985, + 21888242871839275222246405745257275088548364400416034343698204154188437651367, + 21888242871839275222246405745257275088548364400416034343698203898464141005479, + 6076982805132, + 119576496194227, + 21888242871839275222246405745257275088548364400416034343698203857630769119932, + 158536410224688, + 21888242871839275222246405745257275088548364400416034343698203723153488048589, + 21888242871839275222246405745257275088548364400416034343698203762788740621728, + 21888242871839275222246405745257275088548364400416034343698203756140029994936, + 21888242871839275222246405745257275088548364400416034343698204184740918329583, + 145847136749823, + 303205569500307, + 28063058168416, + 268564929020284, + 311333197259350, + 99532479160439, + 21888242871839275222246405745257275088548364400416034343698203832614247205466, + 21888242871839275222246405745257275088548364400416034343698204123610435996533, + 21888242871839275222246405745257275088548364400416034343698204179326067012010, + 21888242871839275222246405745257275088548364400416034343698203894711119748259, + 151178202017852, + 21888242871839275222246405745257275088548364400416034343698203791414083851101, + 332815345389527, + 21888242871839275222246405745257275088548364400416034343698203795988096021061, + 281217507885948, + 21888242871839275222246405745257275088548364400416034343698203921069668044997, + 75241093867590, + 21888242871839275222246405745257275088548364400416034343698203947521577533348, + 134943050809522, + 21888242871839275222246405745257275088548364400416034343698204135451783400173, + 21888242871839275222246405745257275088548364400416034343698204126964627846873, + 160119427116114, + 21888242871839275222246405745257275088548364400416034343698203927777958842382, + 21888242871839275222246405745257275088548364400416034343698203707573294245417, + 168832560365282, + 482567354955073, + 21888242871839275222246405745257275088548364400416034343698203676077063006073, + 21888242871839275222246405745257275088548364400416034343698203709422688918492, + 21888242871839275222246405745257275088548364400416034343698204061077280342570, + 21888242871839275222246405745257275088548364400416034343698204104521543857588, + 21888242871839275222246405745257275088548364400416034343698203713991169411309, + 21888242871839275222246405745257275088548364400416034343698203777339438938264, + 372101804176780, + 21888242871839275222246405745257275088548364400416034343698204181995839290883, + 62445775069943, + 21888242871839275222246405745257275088548364400416034343698203905758149396011, + 132575040795529, + 33715484904987, + 21888242871839275222246405745257275088548364400416034343698203844648098331273, + 541943688208253, + 21888242871839275222246405745257275088548364400416034343698203924151392420881, + 21888242871839275222246405745257275088548364400416034343698204167335085199770, + 21888242871839275222246405745257275088548364400416034343698203992905461985992, + 364038149467891, + 21888242871839275222246405745257275088548364400416034343698204004414859747785, + 21888242871839275222246405745257275088548364400416034343698203981018068220992, + 21888242871839275222246405745257275088548364400416034343698203673461837172344, + 21888242871839275222246405745257275088548364400416034343698203661966026663064, + 543608746748102, + 21888242871839275222246405745257275088548364400416034343698203882977564655792, + 497524834631305, + 250945246779512, + 21888242871839275222246405745257275088548364400416034343698204075048097826137, + 21888242871839275222246405745257275088548364400416034343698203722788558395171, + 21888242871839275222246405745257275088548364400416034343698203738168103097119, + 71601517158221, + 358598992500193, + 101088238937539, + 21888242871839275222246405745257275088548364400416034343698203909636203067353, + 21888242871839275222246405745257275088548364400416034343698204108308622793700, + 21888242871839275222246405745257275088548364400416034343698204058522005052581, + 21888242871839275222246405745257275088548364400416034343698203873637156653369, + 21888242871839275222246405745257275088548364400416034343698203817391690292064, + 88369209918428, + 486607108782016, + 21888242871839275222246405745257275088548364400416034343698203878978030906513, + 162416873477374, + 21888242871839275222246405745257275088548364400416034343698203974073035464939, + 358493542477587, + 21888242871839275222246405745257275088548364400416034343698204019204265208762, + 21888242871839275222246405745257275088548364400416034343698203788204721219454, + 56208386063161, + 461422172824776, + 21888242871839275222246405745257275088548364400416034343698203937730416582348, + 200501204094940, + 257479353948474, + 21888242871839275222246405745257275088548364400416034343698203752277389245958, + 96295577317339, + 21888242871839275222246405745257275088548364400416034343698203955248243044954, + 323573293750641, + 398774456238352, + 148791703083731, + 314484004875424, + 21888242871839275222246405745257275088548364400416034343698203662406374229101, + 500393654662781, + 21888242871839275222246405745257275088548364400416034343698204008425544891717, + 21888242871839275222246405745257275088548364400416034343698203753126194325046, + 279849483674676, + 21888242871839275222246405745257275088548364400416034343698204011545361609715, + 21888242871839275222246405745257275088548364400416034343698203654722668191317, + 161337539242814, + 21888242871839275222246405745257275088548364400416034343698204161115775354792, + 205830316229815, + 21888242871839275222246405745257275088548364400416034343698203928473292525474, + 21888242871839275222246405745257275088548364400416034343698203674128942705407, + 527380172911035, + 330510586194753, + 21888242871839275222246405745257275088548364400416034343698203829791148803531, + 21888242871839275222246405745257275088548364400416034343698203709024431577927, + 21888242871839275222246405745257275088548364400416034343698204087365087446876, + 21888242871839275222246405745257275088548364400416034343698203762888719133898, + 21888242871839275222246405745257275088548364400416034343698203683855046259387, + 546310347024346, + 156349950823482, + 21888242871839275222246405745257275088548364400416034343698203975481790380920, + 21888242871839275222246405745257275088548364400416034343698203724394746725960, + 339543660465255, + 241319216900054, + 21888242871839275222246405745257275088548364400416034343698204089474383316329, + 21888242871839275222246405745257275088548364400416034343698203869139350002107, + 496440284809372, + 21888242871839275222246405745257275088548364400416034343698203807405557841604, + 28232612451521, + 21888242871839275222246405745257275088548364400416034343698204151262746917864, + 21888242871839275222246405745257275088548364400416034343698203732428975632719, + 21888242871839275222246405745257275088548364400416034343698204023400149910562, + 21888242871839275222246405745257275088548364400416034343698204013899645381612, + 21888242871839275222246405745257275088548364400416034343698203833709850242177, + 21888242871839275222246405745257275088548364400416034343698203838964502746058, + 21888242871839275222246405745257275088548364400416034343698203903518805306792, + 21888242871839275222246405745257275088548364400416034343698204085469509649800, + 21888242871839275222246405745257275088548364400416034343698203702367982943575, + 21888242871839275222246405745257275088548364400416034343698203814238228013707, + 21888242871839275222246405745257275088548364400416034343698204115365175535902, + 21888242871839275222246405745257275088548364400416034343698203859652047109661, + 21888242871839275222246405745257275088548364400416034343698203904861729263259, + 21888242871839275222246405745257275088548364400416034343698203793815204445430, + 171213302451789, + 21888242871839275222246405745257275088548364400416034343698203983668628508160, + 536997345118250, + 21888242871839275222246405745257275088548364400416034343698203804045164059479, + 21888242871839275222246405745257275088548364400416034343698203766232870958794, + 21888242871839275222246405745257275088548364400416034343698203788743829702988, + 21888242871839275222246405745257275088548364400416034343698203794155063719593, + 406521863853745, + 194598066647873, + 171975738657103, + 95534719414251, + 262226687489448, + 489650844578968, + 364631703184504, + 366612072117304, + 484500483797546, + 495328369886340, + 262863548785622, + 52633600834763, + 227776829237618, + 21888242871839275222246405745257275088548364400416034343698203793699234540753, + 467277855024791, + 21888242871839275222246405745257275088548364400416034343698203840187974145188, + 21888242871839275222246405745257275088548364400416034343698204026800496608509, + 153352094902062, + 65146120767830, + 247388768314235, + 21888242871839275222246405745257275088548364400416034343698204176131018659168, + 21888242871839275222246405745257275088548364400416034343698204039637572861274, + 359687137340945, + 452778759050100, + 21888242871839275222246405745257275088548364400416034343698203930409971202858, + 21888242871839275222246405745257275088548364400416034343698203792433524523254, + 21888242871839275222246405745257275088548364400416034343698203646862976414092, + 386048865109865, + 449386023354873, + 21888242871839275222246405745257275088548364400416034343698203730113086476612, + 21888242871839275222246405745257275088548364400416034343698204152740003717361, + 313902670890435, + 21888242871839275222246405745257275088548364400416034343698203899415777026875, + 21888242871839275222246405745257275088548364400416034343698203859808183886965, + 334192401569896, + 21888242871839275222246405745257275088548364400416034343698203941362478741032, + 21888242871839275222246405745257275088548364400416034343698203717380845373762, + 322015993205599, + 205166066079537, + 335147666132035, + 21888242871839275222246405745257275088548364400416034343698203927359977133970, + 21888242871839275222246405745257275088548364400416034343698204068791298916777, + 64033940538079, + 547666730019192, + 21888242871839275222246405745257275088548364400416034343698203684012672327978, + 21888242871839275222246405745257275088548364400416034343698203960484603159540, + 192941378063756, + 477396580054966, + 138039668497907, + 314626002599607, + 21888242871839275222246405745257275088548364400416034343698203814002074071192, + 253068868931478, + 21888242871839275222246405745257275088548364400416034343698204066708075455692, + 19102041289950, + 21888242871839275222246405745257275088548364400416034343698203962485812531994, + 404371168544784, + 21888242871839275222246405745257275088548364400416034343698204091790602931301, + 21888242871839275222246405745257275088548364400416034343698204036246859643224, + 21888242871839275222246405745257275088548364400416034343698204184243721419721, + 21888242871839275222246405745257275088548364400416034343698204025832821224545, + 299291753109682, + 193561348831006, + 21888242871839275222246405745257275088548364400416034343698203723727284674750, + 21888242871839275222246405745257275088548364400416034343698203653346501025779, + 292301854019420, + 302181456920041, + 21888242871839275222246405745257275088548364400416034343698204131021514437339, + 69175256098005, + 338621650896467, + 21888242871839275222246405745257275088548364400416034343698204175895132502430, + 21888242871839275222246405745257275088548364400416034343698203722662184098341, + 134788311334010, + 21888242871839275222246405745257275088548364400416034343698203829083906770608, + 21888242871839275222246405745257275088548364400416034343698204072715251701370, + 21888242871839275222246405745257275088548364400416034343698203734084025730288, + 223545017519945, + 396032564151546, + 21888242871839275222246405745257275088548364400416034343698203882392440703992, + 50352091850664, + 420335111189084, + 21888242871839275222246405745257275088548364400416034343698203666082148431592, + 561660720493534, + 443692817027995, + 21888242871839275222246405745257275088548364400416034343698204027808436786533, + 21888242871839275222246405745257275088548364400416034343698203864533339385934, + 413803632709833, + 202090588386600, + 21888242871839275222246405745257275088548364400416034343698203710521361655235, + 21888242871839275222246405745257275088548364400416034343698203963252733589955, + 177820460509543, + 323669121983529, + 21888242871839275222246405745257275088548364400416034343698203881739519801055, + 476814506152797, + 126396841227995, + 297735877612833, + 532039563140656, + 21888242871839275222246405745257275088548364400416034343698203872750603001249, + 321085641254337, + 21888242871839275222246405745257275088548364400416034343698203887391821163158, + 21888242871839275222246405745257275088548364400416034343698204181358027887008, + 185462718053312, + 21888242871839275222246405745257275088548364400416034343698204099750686990908, + 21888242871839275222246405745257275088548364400416034343698204171906535458706, + 21888242871839275222246405745257275088548364400416034343698203937535856695142, + 342586768954862, + 106655182483858, + 4564213287573, + 123339969058461, + 361687898839508, + 21888242871839275222246405745257275088548364400416034343698203623910862459997, + 21888242871839275222246405745257275088548364400416034343698203809913199498890, + 515050483389159, + 21888242871839275222246405745257275088548364400416034343698204092243095033810, + 21888242871839275222246405745257275088548364400416034343698204164442525552426, + 299882425151246, + 298530101757044, + 166998197803808, + 21888242871839275222246405745257275088548364400416034343698204097958180128071, + 21888242871839275222246405745257275088548364400416034343698203713207583873038, + 407777736056426, + 40311880620692, + 365623168143131, + 298550186551196, + 493035439142777, + 184592985857211, + 245161069272798, + 21888242871839275222246405745257275088548364400416034343698204129052186039396, + 21888242871839275222246405745257275088548364400416034343698203634494957351335, + 539453370249702, + 71116843598040, + 131340344163148, + 172171629434958, + 285101686314138, + 21888242871839275222246405745257275088548364400416034343698203646825179318307, + 21888242871839275222246405745257275088548364400416034343698203798673276049832, + 21888242871839275222246405745257275088548364400416034343698204165735615569900, + 159961048496349, + 20332774424272, + 21888242871839275222246405745257275088548364400416034343698204156165179592155, + 21888242871839275222246405745257275088548364400416034343698203662234152327736, + 21888242871839275222246405745257275088548364400416034343698203969270942428301, + 96623570029293, + 106916734378181, + 50561703564393, + 21888242871839275222246405745257275088548364400416034343698203876852646818856, + 214728096099870, + 21888242871839275222246405745257275088548364400416034343698204025375053810719, + 113315353586925, + 141412009868136, + 21888242871839275222246405745257275088548364400416034343698204044091954933252, + 21888242871839275222246405745257275088548364400416034343698204071008538021320, + 21888242871839275222246405745257275088548364400416034343698203752551250891649, + 21888242871839275222246405745257275088548364400416034343698203956482985882784, + 21888242871839275222246405745257275088548364400416034343698204038367740065975, + 513553769387530, + 418379679270561, + 150084928161772, + 21888242871839275222246405745257275088548364400416034343698203778178080641081, + 21888242871839275222246405745257275088548364400416034343698204179779895676125, + 427081906578638, + 21888242871839275222246405745257275088548364400416034343698203944736100298681, + 21888242871839275222246405745257275088548364400416034343698204092090966144847, + 434404841997944, + 380553527657504, + 408760667133575, + 43936642234135, + 237800104735462, + 222398888404279, + 21888242871839275222246405745257275088548364400416034343698203629484696836266, + 283905834901534, + 21888242871839275222246405745257275088548364400416034343698204158618101556881, + 268363455962931, + 21888242871839275222246405745257275088548364400416034343698204172507732530700, + 209455150267444, + 21888242871839275222246405745257275088548364400416034343698203638489583726896, + 21888242871839275222246405745257275088548364400416034343698203707938643988422, + 21888242871839275222246405745257275088548364400416034343698203639521085069145, + 201168703008035, + 21888242871839275222246405745257275088548364400416034343698204032866636846009, + 544158413975764, + 21888242871839275222246405745257275088548364400416034343698203985352858685899, + 283785544424181, + 21888242871839275222246405745257275088548364400416034343698203717788587798610, + 205812122898931, + 21888242871839275222246405745257275088548364400416034343698203631549474529440, + 416567879161322, + 21888242871839275222246405745257275088548364400416034343698203996340015748776, + 492549269348519, + 21888242871839275222246405745257275088548364400416034343698203958500028457187, + 479468907316032, + 458601617186656, + 6890064297174, + 483317946803517, + 21888242871839275222246405745257275088548364400416034343698203995593358983875, + 304196869872947, + 334259462386998, + 21888242871839275222246405745257275088548364400416034343698204143974550028066, + 21888242871839275222246405745257275088548364400416034343698204123947821208290, + 227034109997486, + 501013718749995, + 42083005411412, + 91580102534517, + 21888242871839275222246405745257275088548364400416034343698203833834386220243, + 182445696001110, + 21888242871839275222246405745257275088548364400416034343698204166679006895925, + 279777162034943, + 21888242871839275222246405745257275088548364400416034343698203788946942153931, + 21888242871839275222246405745257275088548364400416034343698203827418127241572, + 21888242871839275222246405745257275088548364400416034343698203655016274831203, + 291435390781616, + 21888242871839275222246405745257275088548364400416034343698203705486552179085, + 6054236760315, + 21888242871839275222246405745257275088548364400416034343698203874884058619333, + 410401666738962, + 178667648012225, + 178270440710294, + 21888242871839275222246405745257275088548364400416034343698203766469276976658, + 21888242871839275222246405745257275088548364400416034343698203833147660327245, + 21888242871839275222246405745257275088548364400416034343698204032771524152039, + 21888242871839275222246405745257275088548364400416034343698203867886695676072, + 21888242871839275222246405745257275088548364400416034343698204007541145499349, + 443896815492944, + 337412323562438, + 189609874026985, + 21888242871839275222246405745257275088548364400416034343698203625146739016760, + 122994062504426, + 198728728964360, + 399540676651374, + 66810316937014, + 21888242871839275222246405745257275088548364400416034343698203748160066728782, + 21888242871839275222246405745257275088548364400416034343698204133047119373948, + 21888242871839275222246405745257275088548364400416034343698204004987229625444, + 326429613648527, + 283167919475808, + 285773866507651, + 325849731189172, + 21888242871839275222246405745257275088548364400416034343698203824710138833057, + 513119849888237, + 284326364480770, + 236156207326987, + 418712751214007, + 542563127151903, + 21888242871839275222246405745257275088548364400416034343698204035954174642454, + 21888242871839275222246405745257275088548364400416034343698203793614068249524, + 260498619566187, + 427623345850872, + 21888242871839275222246405745257275088548364400416034343698203793570601070218, + 495545267476771, + 21888242871839275222246405745257275088548364400416034343698203961908508691273, + 109859462334867, + 67479097137558, + 166173628306244, + 21888242871839275222246405745257275088548364400416034343698204089465388117593, + 21888242871839275222246405745257275088548364400416034343698203782287613344285, + 415476517781000, + 69405798775319, + 172007450572001, + 21888242871839275222246405745257275088548364400416034343698204161553844369107, + 21888242871839275222246405745257275088548364400416034343698203801700146390265, + 192347304403579, + 235633846607376, + 21888242871839275222246405745257275088548364400416034343698203684741634346358, + 379821528025410, + 21888242871839275222246405745257275088548364400416034343698204012899434315013, + 21888242871839275222246405745257275088548364400416034343698203902646852695069, + 302644012009773, + 299154559388245, + 406296473045962, + 75403909995985, + 262852125176437, + 281381750956655, + 265624966382480, + 21888242871839275222246405745257275088548364400416034343698203640773219279325, + 297508595396919, + 21888242871839275222246405745257275088548364400416034343698203798274106244351, + 374869273004439, + 21888242871839275222246405745257275088548364400416034343698203797997428249056, + 21888242871839275222246405745257275088548364400416034343698204114261969142808, + 225284846342945, + 52786264627918, + 21888242871839275222246405745257275088548364400416034343698203862652216572137, + 517768492571626, + 21888242871839275222246405745257275088548364400416034343698204016945980315976, + 560926592595446, + 21888242871839275222246405745257275088548364400416034343698204138171284026178, + 21888242871839275222246405745257275088548364400416034343698204098486319714315, + 21888242871839275222246405745257275088548364400416034343698203808284515069671, + 535490134435604, + 304822956363613, + 21888242871839275222246405745257275088548364400416034343698203934906858003757, + 21888242871839275222246405745257275088548364400416034343698204046951995375159, + 21888242871839275222246405745257275088548364400416034343698203687644484823622, + 177004753450889, + 248758422465778, + 21888242871839275222246405745257275088548364400416034343698204135481674267874, + 199486344140079, + 21888242871839275222246405745257275088548364400416034343698204029769145314142, + 392199342504969, + 21888242871839275222246405745257275088548364400416034343698204025010271416404, + 21888242871839275222246405745257275088548364400416034343698204106341401475239, + 21888242871839275222246405745257275088548364400416034343698204145513591870181, + 441287901345657, + 21888242871839275222246405745257275088548364400416034343698203966335005463404, + 90628216466537, + 21888242871839275222246405745257275088548364400416034343698204101245603942204, + 371778558279445, + 21888242871839275222246405745257275088548364400416034343698204045224643912787, + 21888242871839275222246405745257275088548364400416034343698204053817678892131, + 125118453422131, + 271403105492747, + 302611206072013, + 21888242871839275222246405745257275088548364400416034343698203704450031032411, + 172750964797840, + 21888242871839275222246405745257275088548364400416034343698203726434573966046, + 21888242871839275222246405745257275088548364400416034343698204059006706191291, + 300888136321733, + 353367258529489, + 21888242871839275222246405745257275088548364400416034343698204062981673443084, + 136747240158244, + 21888242871839275222246405745257275088548364400416034343698203936406256924280, + 21888242871839275222246405745257275088548364400416034343698204139093764102256, + 21888242871839275222246405745257275088548364400416034343698204117203691372404, + 507917526356762, + 379904930706865, + 21888242871839275222246405745257275088548364400416034343698203873606477652066, + 21888242871839275222246405745257275088548364400416034343698204027333722162260, + 560901798769804, + 21888242871839275222246405745257275088548364400416034343698203782263009742711, + 21888242871839275222246405745257275088548364400416034343698203911023852085145, + 74497799339956, + 494303177083686, + 328474572820569, + 258395306409123, + 356405736262096, + 21888242871839275222246405745257275088548364400416034343698203936155251160187, + 21888242871839275222246405745257275088548364400416034343698203838068683946480, + 21888242871839275222246405745257275088548364400416034343698203628012993086919, + 45576043419687, + 21888242871839275222246405745257275088548364400416034343698203758921696000886, + 21888242871839275222246405745257275088548364400416034343698203837054422843605, + 210466392762829, + 541811299334167, + 21888242871839275222246405745257275088548364400416034343698203712778634322567, + 432101531083832, + 269715020974708, + 21888242871839275222246405745257275088548364400416034343698204053964203973068, + 21888242871839275222246405745257275088548364400416034343698203718263154830275, + 21888242871839275222246405745257275088548364400416034343698204056059243217276, + 335547394514171, + 21888242871839275222246405745257275088548364400416034343698203772103476468924, + 354401397412290, + 36691510155536, + 150070422590211, + 17006515878697, + 421334304246299, + 21888242871839275222246405745257275088548364400416034343698204170905164607653, + 50874864044836, + 362053604463427, + 354292994510544, + 416994945953290, + 21888242871839275222246405745257275088548364400416034343698203993571683475357, + 21888242871839275222246405745257275088548364400416034343698204068150457853390, + 21888242871839275222246405745257275088548364400416034343698203968500889218517, + 21888242871839275222246405745257275088548364400416034343698203912132298324388, + 340836740207947, + 301746556227700, + 21888242871839275222246405745257275088548364400416034343698204095299019089684, + 287609802333041, + 21888242871839275222246405745257275088548364400416034343698203669571382800272, + 283065935475497, + 21888242871839275222246405745257275088548364400416034343698203942427945523011, + 21888242871839275222246405745257275088548364400416034343698203814575441461638, + 29500491921972, + 21888242871839275222246405745257275088548364400416034343698203956417402778393, + 21888242871839275222246405745257275088548364400416034343698203844188630031600, + 21888242871839275222246405745257275088548364400416034343698204107679152514336, + 73648361273150, + 228275306381994, + 319091033738401, + 21888242871839275222246405745257275088548364400416034343698203948045433969137, + 399203881831724, + 290133176605201, + 213391458783496, + 219883149061087, + 486397228314415, + 178287777276535, + 21888242871839275222246405745257275088548364400416034343698203881423096778775, + 38920350198770, + 21888242871839275222246405745257275088548364400416034343698204102164662420014, + 498738545598787, + 21888242871839275222246405745257275088548364400416034343698203968666258826642, + 21888242871839275222246405745257275088548364400416034343698203946169715827309, + 360690620278279, + 389595896332447, + 43481304911261, + 21888242871839275222246405745257275088548364400416034343698203843536091116124, + 21888242871839275222246405745257275088548364400416034343698203880487869852111, + 21888242871839275222246405745257275088548364400416034343698203725099729258244, + 21888242871839275222246405745257275088548364400416034343698203686625865284632, + 21888242871839275222246405745257275088548364400416034343698203709672309432160, + 21843839169725, + 21888242871839275222246405745257275088548364400416034343698203909444873333656, + 21888242871839275222246405745257275088548364400416034343698203677911606918725, + 21888242871839275222246405745257275088548364400416034343698204128955080800574, + 525976203770754, + 21888242871839275222246405745257275088548364400416034343698203627249325346630, + 21888242871839275222246405745257275088548364400416034343698203914262517108230, + 262829287813187, + 21888242871839275222246405745257275088548364400416034343698204080591679161700, + 484512632647801, + 389056558400758, + 21888242871839275222246405745257275088548364400416034343698203815169213415409, + 225784708069491, + 21888242871839275222246405745257275088548364400416034343698203771194495488435, + 21888242871839275222246405745257275088548364400416034343698204010849902015632, + 473236568506192, + 21888242871839275222246405745257275088548364400416034343698203791864953395182, + 368991777307285, + 21888242871839275222246405745257275088548364400416034343698203811886661200871, + 21888242871839275222246405745257275088548364400416034343698203982432908809971, + 21888242871839275222246405745257275088548364400416034343698204172620782288775, + 21888242871839275222246405745257275088548364400416034343698204029541716632450, + 21888242871839275222246405745257275088548364400416034343698203702581054946118, + 302807263224154, + 21888242871839275222246405745257275088548364400416034343698203835524480700413, + 231059741040893, + 21888242871839275222246405745257275088548364400416034343698203907935000686091, + 75652229516552, + 409433365515640, + 21888242871839275222246405745257275088548364400416034343698203773374394832482, + 21888242871839275222246405745257275088548364400416034343698204019467831168118, + 96083798454049, + 21888242871839275222246405745257275088548364400416034343698204126188823927522, + 457835965729384, + 21888242871839275222246405745257275088548364400416034343698204088103200414700, + 294323356573667, + 21888242871839275222246405745257275088548364400416034343698204052457707013096, + 21888242871839275222246405745257275088548364400416034343698203796408360054832, + 124421458557929, + 21888242871839275222246405745257275088548364400416034343698204154169850551035, + 21888242871839275222246405745257275088548364400416034343698204059096617912918, + 244894626978402, + 389830208352603, + 21888242871839275222246405745257275088548364400416034343698204157326826694920, + 439186197711516, + 162281508523828, + 21888242871839275222246405745257275088548364400416034343698204004033769488321, + 272007453578357, + 21888242871839275222246405745257275088548364400416034343698203964462408202710, + 545121895831450, + 430255541035923, + 254675055015624, + 239183824718659, + 289862317499312, + 86142855245438, + 21888242871839275222246405745257275088548364400416034343698203670063417524627, + 257407774316424, + 543733355417192, + 515427428982800, + 21888242871839275222246405745257275088548364400416034343698203699626054984792, + 388988285460683, + 21888242871839275222246405745257275088548364400416034343698203919647290001140, + 21888242871839275222246405745257275088548364400416034343698204149720719436847, + 174162904870803, + 448088770300855, + 21888242871839275222246405745257275088548364400416034343698203900507768537864, + 21888242871839275222246405745257275088548364400416034343698203962427517899120, + 21888242871839275222246405745257275088548364400416034343698204171650974831227, + 21888242871839275222246405745257275088548364400416034343698203722292445526695, + 325863559300695, + 487796860689754, + 252332682871623, + 21888242871839275222246405745257275088548364400416034343698204007653877060674, + 188917967088990, + 97262915380999, + 124717507430088, + 234451997536548, + 21888242871839275222246405745257275088548364400416034343698204033677758221114, + 290637719238048, + 21888242871839275222246405745257275088548364400416034343698203858030314043395, + 21888242871839275222246405745257275088548364400416034343698203789590315464144, + 21888242871839275222246405745257275088548364400416034343698204051487966256736, + 21888242871839275222246405745257275088548364400416034343698204117656274294025, + 390515584936412, + 197456723917275, + 21888242871839275222246405745257275088548364400416034343698203845989163357506, + 445947886003383, + 21888242871839275222246405745257275088548364400416034343698203862130486716797, + 21888242871839275222246405745257275088548364400416034343698203904182373244551, + 21888242871839275222246405745257275088548364400416034343698203998630823055434, + 546218623103934, + 34259928491490, + 406633983977270, + 205728509307177, + 21888242871839275222246405745257275088548364400416034343698203798946117509333, + 21888242871839275222246405745257275088548364400416034343698203836071543855251, + 389398827640747, + 21888242871839275222246405745257275088548364400416034343698203921043003154876, + 475913696944256, + 21888242871839275222246405745257275088548364400416034343698203974587187191932, + 21888242871839275222246405745257275088548364400416034343698203892079028694141, + 21888242871839275222246405745257275088548364400416034343698203728639390847035, + 21888242871839275222246405745257275088548364400416034343698203783952009849595, + 434521415553541, + 175767772665461, + 60084600665705, + 113885309971129, + 147629652026717, + 521604192828180, + 454313814985591, + 21888242871839275222246405745257275088548364400416034343698204165712831176045, + 21888242871839275222246405745257275088548364400416034343698204009583329943017, + 49697450646941, + 245860995399241, + 497045514725132, + 21888242871839275222246405745257275088548364400416034343698204097305417764650, + 21888242871839275222246405745257275088548364400416034343698203982628911210300, + 425761524442396, + 21888242871839275222246405745257275088548364400416034343698204036893250967870, + 21888242871839275222246405745257275088548364400416034343698203627134874573050, + 21888242871839275222246405745257275088548364400416034343698203935336168653368, + 357361068507360, + 21888242871839275222246405745257275088548364400416034343698203927334642017371, + 37968642264466, + 21888242871839275222246405745257275088548364400416034343698203836122683135288, + 400889151200060, + 275881075859374, + 483667255213072, + 45500245199464, + 21888242871839275222246405745257275088548364400416034343698203791942931390184, + 21888242871839275222246405745257275088548364400416034343698203660078871992993, + 21888242871839275222246405745257275088548364400416034343698203967853899989787, + 21888242871839275222246405745257275088548364400416034343698203873080900186766, + 21888242871839275222246405745257275088548364400416034343698204073694506502817, + 354556612305470, + 21888242871839275222246405745257275088548364400416034343698203919310132035503, + 55580261625888, + 21888242871839275222246405745257275088548364400416034343698203787956087300272, + 38513118684348, + 90938800454375, + 410165563166168, + 21888242871839275222246405745257275088548364400416034343698203653406317963741, + 554393271851721, + 403227149190678, + 21888242871839275222246405745257275088548364400416034343698203755465870404960, + 21888242871839275222246405745257275088548364400416034343698203655395490338385, + 243683660032165, + 21888242871839275222246405745257275088548364400416034343698203821671533066777, + 21888242871839275222246405745257275088548364400416034343698204122475182837006, + 211000409452608, + 280352709364823, + 21888242871839275222246405745257275088548364400416034343698203639004980367198, + 520363084586578, + 21888242871839275222246405745257275088548364400416034343698203947754433681594, + 21888242871839275222246405745257275088548364400416034343698203694929847972209, + 22972606869692, + 21888242871839275222246405745257275088548364400416034343698204011972174500019, + 194284940609524, + 267761191512126, + 515900308622685, + 21888242871839275222246405745257275088548364400416034343698203765935414477061, + 326808896731434, + 498184851420820, + 21888242871839275222246405745257275088548364400416034343698203769630347638973, + 187281614421437, + 21888242871839275222246405745257275088548364400416034343698203900240219567134, + 21888242871839275222246405745257275088548364400416034343698203855870028696452, + 332413333136071, + 108846154898257, + 21888242871839275222246405745257275088548364400416034343698204015311874658848, + 488627463808619, + 21888242871839275222246405745257275088548364400416034343698203833374681933327, + 67383520871341, + 21888242871839275222246405745257275088548364400416034343698204107530115422118, + 21888242871839275222246405745257275088548364400416034343698204068399111281048, + 21888242871839275222246405745257275088548364400416034343698204044296127608554, + 21888242871839275222246405745257275088548364400416034343698203805855399787176, + 325212719271201, + 496641729718365, + 269288276793069, + 21888242871839275222246405745257275088548364400416034343698203732048106281376, + 213257105066979, + 21888242871839275222246405745257275088548364400416034343698203705979938223213, + 168909628363463, + 293892705222394, + 23034894622478, + 21888242871839275222246405745257275088548364400416034343698204151125275455388, + 21888242871839275222246405745257275088548364400416034343698203798192733245663, + 148888842759891, + 21888242871839275222246405745257275088548364400416034343698203657751993779074, + 21888242871839275222246405745257275088548364400416034343698204151664618918821, + 133779321885677, + 244926239492852, + 21888242871839275222246405745257275088548364400416034343698203712650031003523, + 21888242871839275222246405745257275088548364400416034343698204124456273816334, + 10780505955491, + 21888242871839275222246405745257275088548364400416034343698203786007258757176, + 339411155373460, + 21888242871839275222246405745257275088548364400416034343698203781537443012706, + 530762308494789, + 21888242871839275222246405745257275088548364400416034343698203997680910057439, + 21888242871839275222246405745257275088548364400416034343698203650649174903050, + 430796664442753, + 487062239010744, + 21888242871839275222246405745257275088548364400416034343698203669890986278144, + 21888242871839275222246405745257275088548364400416034343698203650072537696189, + 21888242871839275222246405745257275088548364400416034343698204124137146539494, + 21888242871839275222246405745257275088548364400416034343698204063393884684697, + 21888242871839275222246405745257275088548364400416034343698204042134157948383, + 21888242871839275222246405745257275088548364400416034343698203732937467974386, + 154227470330257, + 529618259127506, + 21888242871839275222246405745257275088548364400416034343698203777143008920150, + 222529572093184, + 202723859675815, + 21888242871839275222246405745257275088548364400416034343698203987939856731192, + 21888242871839275222246405745257275088548364400416034343698204112167819475229, + 335249529489763, + 179461276093840, + 21888242871839275222246405745257275088548364400416034343698203748113889811447, + 16804802555454, + 21888242871839275222246405745257275088548364400416034343698203676172723788280, + 83830969024206, + 139939064939310, + 21888242871839275222246405745257275088548364400416034343698203744431490224808, + 238458124004795, + 107331173770267, + 21888242871839275222246405745257275088548364400416034343698203839908588638976, + 21888242871839275222246405745257275088548364400416034343698203945384037947062, + 220379582239574, + 300687280946202, + 21888242871839275222246405745257275088548364400416034343698204148878915542505, + 250406367427177, + 21888242871839275222246405745257275088548364400416034343698204093972839897352, + 21888242871839275222246405745257275088548364400416034343698204120778461485993, + 316421980005591, + 399423256898638, + 21888242871839275222246405745257275088548364400416034343698204002174286748291, + 21888242871839275222246405745257275088548364400416034343698203628284300855206, + 21888242871839275222246405745257275088548364400416034343698203893110859545128, + 21888242871839275222246405745257275088548364400416034343698204165293780256863, + 21888242871839275222246405745257275088548364400416034343698203685805407845821, + 525355235908333, + 338620231871341, + 21888242871839275222246405745257275088548364400416034343698203924997239813405, + 92372018640785, + 21888242871839275222246405745257275088548364400416034343698203642852626010145, + 21888242871839275222246405745257275088548364400416034343698203879304438197491, + 21888242871839275222246405745257275088548364400416034343698203789156899039617, + 21888242871839275222246405745257275088548364400416034343698204069075015742642, + 21888242871839275222246405745257275088548364400416034343698203954039174331493, + 21888242871839275222246405745257275088548364400416034343698203950276173285637, + 470524338953969, + 21888242871839275222246405745257275088548364400416034343698204172921936857929, + 21888242871839275222246405745257275088548364400416034343698203834423730078175, + 21888242871839275222246405745257275088548364400416034343698203692143390247198, + 21888242871839275222246405745257275088548364400416034343698204110023374910573, + 21888242871839275222246405745257275088548364400416034343698204184731357019661, + 21888242871839275222246405745257275088548364400416034343698203632637717901220, + 316719006780664, + 21888242871839275222246405745257275088548364400416034343698203952260319949738, + 21888242871839275222246405745257275088548364400416034343698203983434568840134, + 63236520273239, + 21888242871839275222246405745257275088548364400416034343698203724594770063605, + 21888242871839275222246405745257275088548364400416034343698203723077849315377, + 21888242871839275222246405745257275088548364400416034343698203915027483344170, + 558426546554394, + 34663230675502, + 21888242871839275222246405745257275088548364400416034343698203688173688169214, + 21888242871839275222246405745257275088548364400416034343698203632397773659813, + 21888242871839275222246405745257275088548364400416034343698203786562336560476, + 21888242871839275222246405745257275088548364400416034343698203847181929892206, + 21888242871839275222246405745257275088548364400416034343698203679452622048974, + 21888242871839275222246405745257275088548364400416034343698203918069946861958, + 21888242871839275222246405745257275088548364400416034343698203855697935909269, + 96116735378895, + 21888242871839275222246405745257275088548364400416034343698203949494904305047, + 165435724309255, + 21888242871839275222246405745257275088548364400416034343698203912102257472146, + 472030862510216, + 21888242871839275222246405745257275088548364400416034343698203695463373084657, + 21888242871839275222246405745257275088548364400416034343698204159802586583080, + 260454060009281, + 282484990475823, + 21888242871839275222246405745257275088548364400416034343698203683509098618684, + 21888242871839275222246405745257275088548364400416034343698203834093199376650, + 21888242871839275222246405745257275088548364400416034343698204017715931248127, + 392657882260407, + 360188769384064, + 57801013152650, + 414919229373768, + 21888242871839275222246405745257275088548364400416034343698203971561749295849, + 377067675187639, + 21888242871839275222246405745257275088548364400416034343698204013730161327422, + 403558137471173, + 21888242871839275222246405745257275088548364400416034343698203977981854115262, + 21888242871839275222246405745257275088548364400416034343698204120028863479812, + 21888242871839275222246405745257275088548364400416034343698204091531334770922, + 8280602448770, + 4288271915653, + 21888242871839275222246405745257275088548364400416034343698203683076260075768, + 250405875405214, + 213460369178053, + 21888242871839275222246405745257275088548364400416034343698203948379159021676, + 390658769028764, + 277850031341697, + 33056643452862, + 459136755685339, + 21888242871839275222246405745257275088548364400416034343698203835922020745710, + 21888242871839275222246405745257275088548364400416034343698203649074129065563, + 21888242871839275222246405745257275088548364400416034343698203817237159653590, + 232854557652463, + 237997742023867, + 145788561016235, + 21888242871839275222246405745257275088548364400416034343698203978511245148097, + 469593679435277, + 21888242871839275222246405745257275088548364400416034343698203947711199897056, + 21888242871839275222246405745257275088548364400416034343698203958742094392387, + 295503809710935, + 25532003373331, + 21888242871839275222246405745257275088548364400416034343698204091456255224860, + 21888242871839275222246405745257275088548364400416034343698204080603945140719, + 21888242871839275222246405745257275088548364400416034343698203743028762028537, + 155748431366732, + 20869202046030, + 331287301790888, + 21888242871839275222246405745257275088548364400416034343698203895674471258403, + 21888242871839275222246405745257275088548364400416034343698203797174641502075, + 21888242871839275222246405745257275088548364400416034343698203988505869138602, + 31974755813261, + 21888242871839275222246405745257275088548364400416034343698203725793799551404, + 21888242871839275222246405745257275088548364400416034343698204182117399844288, + 275991661248467, + 21888242871839275222246405745257275088548364400416034343698204003212221675848, + 548559569809265, + 21888242871839275222246405745257275088548364400416034343698203684033495213263, + 195133408397323, + 21888242871839275222246405745257275088548364400416034343698203629224335470171, + 21888242871839275222246405745257275088548364400416034343698204180313698888262, + 252849470278498, + 21888242871839275222246405745257275088548364400416034343698204062549734234246, + 27501602440919, + 21888242871839275222246405745257275088548364400416034343698203701631579831286, + 300348383652910, + 21888242871839275222246405745257275088548364400416034343698204172903343338214, + 21888242871839275222246405745257275088548364400416034343698203665985549643515, + 21888242871839275222246405745257275088548364400416034343698204029679798576619, + 57826145379432, + 222293930307828, + 21888242871839275222246405745257275088548364400416034343698204061473134182743, + 237196010333802, + 332919649111616, + 142111784122578, + 545441345747754, + 368871181571106, + 422610939969109, + 356576628275204, + 21888242871839275222246405745257275088548364400416034343698203878141545487954, + 402767700145084, + 21888242871839275222246405745257275088548364400416034343698204050631989069816, + 68143795087085, + 309113159250282, + 437514503012563, + 177076954958493, + 139635233502015, + 21888242871839275222246405745257275088548364400416034343698203882897713109321, + 21888242871839275222246405745257275088548364400416034343698204059204596136343, + 21888242871839275222246405745257275088548364400416034343698203674043431978274, + 387848030735604, + 21888242871839275222246405745257275088548364400416034343698204006961665828801, + 21888242871839275222246405745257275088548364400416034343698203827505988990821, + 217822034932017, + 21888242871839275222246405745257275088548364400416034343698203760231273608414, + 21888242871839275222246405745257275088548364400416034343698204134513047524885, + 21888242871839275222246405745257275088548364400416034343698203846987063002320, + 449436045833077, + 21888242871839275222246405745257275088548364400416034343698204151677226958214, + 550258520966052, + 21888242871839275222246405745257275088548364400416034343698204164994194429732, + 21888242871839275222246405745257275088548364400416034343698204005694136508850, + 93787215181462, + 21888242871839275222246405745257275088548364400416034343698203988332721646941, + 21888242871839275222246405745257275088548364400416034343698203773921837723689, + 260842004691463, + 21888242871839275222246405745257275088548364400416034343698203883656495996719, + 21888242871839275222246405745257275088548364400416034343698203843790382302682, + 21888242871839275222246405745257275088548364400416034343698203965012812574072, + 21888242871839275222246405745257275088548364400416034343698203792510542644297, + 21888242871839275222246405745257275088548364400416034343698204165924890779962, + 21888242871839275222246405745257275088548364400416034343698203714791687886372, + 21888242871839275222246405745257275088548364400416034343698203959350420962879, + 18276022271291, + 21888242871839275222246405745257275088548364400416034343698203902196429975835, + 17906889203596, + 473067559211448, + 21888242871839275222246405745257275088548364400416034343698204093991143003776, + 21888242871839275222246405745257275088548364400416034343698204104312095763326, + 348516849505958, + 21888242871839275222246405745257275088548364400416034343698203817579108673451, + 21888242871839275222246405745257275088548364400416034343698203780600056431130, + 293182540879136, + 21888242871839275222246405745257275088548364400416034343698203648655455914548, + 182632175385433, + 329546226320482, + 188520458813991, + 513578523706787, + 456196116069817, + 465328561524564, + 21888242871839275222246405745257275088548364400416034343698203941397320226212, + 546717439757771, + 21888242871839275222246405745257275088548364400416034343698203968939169530663, + 21888242871839275222246405745257275088548364400416034343698203795564298615068, + 21888242871839275222246405745257275088548364400416034343698203838760530152995, + 21888242871839275222246405745257275088548364400416034343698204075554335131541, + 113442380228005, + 21888242871839275222246405745257275088548364400416034343698203820986567488973, + 21888242871839275222246405745257275088548364400416034343698203981118526592791, + 21888242871839275222246405745257275088548364400416034343698203806075830511447, + 21888242871839275222246405745257275088548364400416034343698204110482943823998, + 21888242871839275222246405745257275088548364400416034343698203920146925742228, + 526970591443888, + 21888242871839275222246405745257275088548364400416034343698204138544972775779, + 30715786187076, + 221097859592201, + 305541995965533, + 21888242871839275222246405745257275088548364400416034343698203975013963413567, + 526796077035898, + 21888242871839275222246405745257275088548364400416034343698203781002471749030, + 427326391344965, + 277466135174860, + 21888242871839275222246405745257275088548364400416034343698203936985451736910, + 142598383277480, + 21888242871839275222246405745257275088548364400416034343698203871154448285037, + 21888242871839275222246405745257275088548364400416034343698203881312414701545, + 21888242871839275222246405745257275088548364400416034343698204152062535098421, + 472444512315746, + 218241254495583, + 271888937277633, + 492441084731759, + 21888242871839275222246405745257275088548364400416034343698203896307944688521, + 517793493926360, + 161955163034864, + 21888242871839275222246405745257275088548364400416034343698203842139741417485, + 21888242871839275222246405745257275088548364400416034343698204145752695693590, + 21888242871839275222246405745257275088548364400416034343698204004316078352662, + 21888242871839275222246405745257275088548364400416034343698203909212256163694, + 52575947450616, + 21888242871839275222246405745257275088548364400416034343698203631617215531919, + 527952446343787, + 21888242871839275222246405745257275088548364400416034343698203721848925544171, + 21888242871839275222246405745257275088548364400416034343698203690877594166846, + 21888242871839275222246405745257275088548364400416034343698203822872909635039, + 100389472145128, + 21888242871839275222246405745257275088548364400416034343698203654118556995300, + 21888242871839275222246405745257275088548364400416034343698204119803156156009, + 428614631205937, + 21888242871839275222246405745257275088548364400416034343698203845786080460569, + 216721819136940, + 21888242871839275222246405745257275088548364400416034343698203770587618190730, + 21888242871839275222246405745257275088548364400416034343698204001669082350665, + 474953780552425, + 21888242871839275222246405745257275088548364400416034343698203972475574348705, + 173082887912852, + 535545555496775, + 21888242871839275222246405745257275088548364400416034343698204018226609012813, + 21888242871839275222246405745257275088548364400416034343698203893974048696607, + 21888242871839275222246405745257275088548364400416034343698203882607095807093, + 21888242871839275222246405745257275088548364400416034343698203718472801015743, + 32127891333068, + 220654639058393, + 163229279564617, + 170454613350359, + 21888242871839275222246405745257275088548364400416034343698204154431505930305, + 21888242871839275222246405745257275088548364400416034343698203957799683157024, + 21888242871839275222246405745257275088548364400416034343698203987686413915015, + 314748127167120, + 21888242871839275222246405745257275088548364400416034343698203705189358767671, + 21888242871839275222246405745257275088548364400416034343698204139574568402485, + 539164421839553, + 360690170099404, + 21888242871839275222246405745257275088548364400416034343698203638433450924377, + 8366666062597, + 21888242871839275222246405745257275088548364400416034343698203949548632852114, + 21888242871839275222246405745257275088548364400416034343698203885272950860324, + 21888242871839275222246405745257275088548364400416034343698204048064316259160, + 21888242871839275222246405745257275088548364400416034343698203887400477161867, + 176602472057709, + 41363800137093, + 516322774548513, + 160377799909399, + 144949515117873, + 21888242871839275222246405745257275088548364400416034343698204180949625448147, + 481965187348364, + 273466906736306, + 555003174989605, + 21888242871839275222246405745257275088548364400416034343698204141044418851426, + 21888242871839275222246405745257275088548364400416034343698204051177849653754, + 303122466113843, + 21888242871839275222246405745257275088548364400416034343698203851920429796015, + 450827022139003, + 232302579468787, + 344759057840232, + 127820925459201, + 21888242871839275222246405745257275088548364400416034343698204024985320760894, + 229332554836183, + 21888242871839275222246405745257275088548364400416034343698204052170350704760, + 193183670981613, + 87497346176997, + 21888242871839275222246405745257275088548364400416034343698203743776240263422, + 37918893647253, + 21888242871839275222246405745257275088548364400416034343698204175241164523446, + 303461176363628, + 21888242871839275222246405745257275088548364400416034343698204162897432840241, + 21888242871839275222246405745257275088548364400416034343698203923115634834261, + 21888242871839275222246405745257275088548364400416034343698203674510315644131, + 21888242871839275222246405745257275088548364400416034343698203696527226490465, + 348604842633619, + 71627615926605, + 21888242871839275222246405745257275088548364400416034343698203714038554797788, + 21888242871839275222246405745257275088548364400416034343698203925976557562863, + 311116972504376, + 552382712577992, + 21888242871839275222246405745257275088548364400416034343698203636279918678101, + 86488145049345, + 62501312485625, + 504108352858788, + 21888242871839275222246405745257275088548364400416034343698203762724407568160, + 282180777405074, + 21888242871839275222246405745257275088548364400416034343698204074646094261448, + 69821241428739, + 21888242871839275222246405745257275088548364400416034343698203650878960576338, + 21888242871839275222246405745257275088548364400416034343698203930549380059224, + 21888242871839275222246405745257275088548364400416034343698204101172537572371, + 409135808852813, + 401101866278449, + 21888242871839275222246405745257275088548364400416034343698203750529075123337, + 21888242871839275222246405745257275088548364400416034343698203688735716832766, + 21888242871839275222246405745257275088548364400416034343698203746124709372916, + 21888242871839275222246405745257275088548364400416034343698203684456576866559, + 21888242871839275222246405745257275088548364400416034343698203782529880569304, + 21888242871839275222246405745257275088548364400416034343698203883108028184417, + 21888242871839275222246405745257275088548364400416034343698203973264111013446, + 21888242871839275222246405745257275088548364400416034343698203991911530412747, + 21888242871839275222246405745257275088548364400416034343698203687000530461458, + 21888242871839275222246405745257275088548364400416034343698204010823136743061, + 21888242871839275222246405745257275088548364400416034343698203976811199489385, + 21888242871839275222246405745257275088548364400416034343698203858743311094964, + 21888242871839275222246405745257275088548364400416034343698203788371519307168, + 183799269364500, + 21888242871839275222246405745257275088548364400416034343698204110203670545522, + 260622322041453, + 21888242871839275222246405745257275088548364400416034343698203637136545713575, + 373263195219420, + 21888242871839275222246405745257275088548364400416034343698204102680060917901, + 21888242871839275222246405745257275088548364400416034343698203725405064455881, + 21888242871839275222246405745257275088548364400416034343698204168766588969358, + 357256232078601, + 458632302952785, + 400448766484992, + 21888242871839275222246405745257275088548364400416034343698203816936319462180, + 21888242871839275222246405745257275088548364400416034343698203856994902946301, + 241383636633062, + 526905947267297, + 387145979781744, + 21888242871839275222246405745257275088548364400416034343698203690115958908705, + 554296386785868, + 21888242871839275222246405745257275088548364400416034343698204040176001388004, + 128498987580106, + 247967626494447, + 21888242871839275222246405745257275088548364400416034343698203689119757524730, + 21888242871839275222246405745257275088548364400416034343698203909931971304576, + 162608883740469, + 148752434518161, + 21888242871839275222246405745257275088548364400416034343698204057760520668753, + 21888242871839275222246405745257275088548364400416034343698203968149247518959, + 479285934006378, + 143089381945883, + 303320355187571, + 21888242871839275222246405745257275088548364400416034343698204000886712907909, + 53219376542448, + 454511412030457, + 158406738808069, + 21888242871839275222246405745257275088548364400416034343698204000982376788709, + 199372245460781, + 21888242871839275222246405745257275088548364400416034343698203796377106344187, + 21888242871839275222246405745257275088548364400416034343698203723606637660281, + 468949278171289, + 21888242871839275222246405745257275088548364400416034343698203762317945556229, + 286728001545413, + 188861109131909, + 558903439417310, + 21888242871839275222246405745257275088548364400416034343698204139898906119605, + 21888242871839275222246405745257275088548364400416034343698203952765911353360, + 310330397084358, + 98276974729890, + 21888242871839275222246405745257275088548364400416034343698203890347830074002, + 546730497379101, + 21888242871839275222246405745257275088548364400416034343698203888472469188081, + 187163454925242, + 21888242871839275222246405745257275088548364400416034343698204013021936360908, + 368289525912918, + 21888242871839275222246405745257275088548364400416034343698203868097764416219, + 421029329769246, + 404294426612778, + 183190188662926, + 418668292971366, + 17007830734720, + 16542699940370, + 21888242871839275222246405745257275088548364400416034343698203663816675307591, + 514925091776646, + 233954454070770, + 1686438342651, + 21888242871839275222246405745257275088548364400416034343698203729259703813800, + 21888242871839275222246405745257275088548364400416034343698203854843776744057, + 411456993827641, + 21888242871839275222246405745257275088548364400416034343698204158922792793585, + 497052059710266, + 21888242871839275222246405745257275088548364400416034343698204102020134590488, + 21888242871839275222246405745257275088548364400416034343698203810553891610439, + 21888242871839275222246405745257275088548364400416034343698204163096065580545, + 170160161040422, + 226965009920467, + 21888242871839275222246405745257275088548364400416034343698204174926065237085, + 21888242871839275222246405745257275088548364400416034343698203935190392670191, + 21888242871839275222246405745257275088548364400416034343698203843479236685524, + 21888242871839275222246405745257275088548364400416034343698203648013788334081, + 21888242871839275222246405745257275088548364400416034343698203960566558494557, + 517777120684983, + 21888242871839275222246405745257275088548364400416034343698203859103310067034, + 21888242871839275222246405745257275088548364400416034343698204111081121467992, + 21888242871839275222246405745257275088548364400416034343698204179911355653011, + 201735571792960, + 21888242871839275222246405745257275088548364400416034343698204025001282096287, + 21888242871839275222246405745257275088548364400416034343698203724641377334335, + 492473119136627, + 21888242871839275222246405745257275088548364400416034343698203955992130710651, + 21888242871839275222246405745257275088548364400416034343698203924453315811084, + 21888242871839275222246405745257275088548364400416034343698204061857195366510, + 409722927125819, + 358148172780510, + 263560539281563, + 85869193862118, + 473465339889613, + 21888242871839275222246405745257275088548364400416034343698204002736568206699, + 68095175793457, + 21888242871839275222246405745257275088548364400416034343698203891130877080836, + 21888242871839275222246405745257275088548364400416034343698203990783492635322, + 252117172834545, + 21888242871839275222246405745257275088548364400416034343698203939103413950768, + 21888242871839275222246405745257275088548364400416034343698204115714925539605, + 273879835069707, + 492136184471085, + 21888242871839275222246405745257275088548364400416034343698203710470294625528, + 21888242871839275222246405745257275088548364400416034343698204099996075507297, + 21888242871839275222246405745257275088548364400416034343698203629923355375632, + 21888242871839275222246405745257275088548364400416034343698203819864951539651, + 422904530864687, + 471160494840792, + 21888242871839275222246405745257275088548364400416034343698203897862085555660, + 21888242871839275222246405745257275088548364400416034343698204169517892880921, + 182927980907003, + 547992087008957, + 549168740438982, + 21888242871839275222246405745257275088548364400416034343698204125161262666201, + 444377561459485, + 21888242871839275222246405745257275088548364400416034343698203953542491733793, + 316565770464958, + 282010500421580, + 236424363656398, + 21888242871839275222246405745257275088548364400416034343698203633460696251623, + 277122790523461, + 21888242871839275222246405745257275088548364400416034343698203787162621572044, + 128402127463976, + 21888242871839275222246405745257275088548364400416034343698204113510321913409, + 21888242871839275222246405745257275088548364400416034343698203988239976605893, + 204196819454705, + 480234928195431, + 21888242871839275222246405745257275088548364400416034343698203885688311842600, + 21888242871839275222246405745257275088548364400416034343698204065560739314241, + 73795872473183, + 471876788736919, + 354131153866056, + 21888242871839275222246405745257275088548364400416034343698203813435203717479, + 219332067989756, + 21888242871839275222246405745257275088548364400416034343698203642916416578022, + 374042441021680, + 21888242871839275222246405745257275088548364400416034343698204031260487072579, + 21888242871839275222246405745257275088548364400416034343698203897165604527786, + 21888242871839275222246405745257275088548364400416034343698203926331945232647, + 350975434038188, + 167502852599542, + 554355535008837, + 366489431765358, + 21888242871839275222246405745257275088548364400416034343698204000170293302072, + 178017986140313, + 21888242871839275222246405745257275088548364400416034343698203668151825168380, + 21888242871839275222246405745257275088548364400416034343698204087226142759601, + 251467009232637, + 303668695604792, + 299870731441991, + 21888242871839275222246405745257275088548364400416034343698203915717410093633, + 21888242871839275222246405745257275088548364400416034343698204027887787368328, + 42213237308842, + 21888242871839275222246405745257275088548364400416034343698203752054557007089, + 21888242871839275222246405745257275088548364400416034343698203629242135389222, + 21888242871839275222246405745257275088548364400416034343698203677752403977351, + 21888242871839275222246405745257275088548364400416034343698203922539828971663, + 154467092691794, + 409665760491599, + 21888242871839275222246405745257275088548364400416034343698203917375767464162, + 21888242871839275222246405745257275088548364400416034343698203692926117098428, + 21888242871839275222246405745257275088548364400416034343698203658690413940323, + 411673800904459, + 521744281515525, + 345283205222062, + 21888242871839275222246405745257275088548364400416034343698204136861394915946, + 21888242871839275222246405745257275088548364400416034343698204127537529952339, + 21888242871839275222246405745257275088548364400416034343698203873107328463832, + 21888242871839275222246405745257275088548364400416034343698203661338067053350, + 21888242871839275222246405745257275088548364400416034343698204001856207041441, + 21888242871839275222246405745257275088548364400416034343698204118207862257532, + 21888242871839275222246405745257275088548364400416034343698203785390243003581, + 21888242871839275222246405745257275088548364400416034343698203958768101283978, + 21888242871839275222246405745257275088548364400416034343698203760015040769601, + 99797477165416, + 21888242871839275222246405745257275088548364400416034343698203631020692421984, + 275232447300306, + 447128548867542, + 21888242871839275222246405745257275088548364400416034343698203726419388445120, + 21888242871839275222246405745257275088548364400416034343698204076105512479736, + 171727248804969, + 419260968291644, + 148535767341904, + 218091316997366, + 21888242871839275222246405745257275088548364400416034343698204139341909291849, + 21888242871839275222246405745257275088548364400416034343698203857632178298466, + 21888242871839275222246405745257275088548364400416034343698203892032784196563, + 21888242871839275222246405745257275088548364400416034343698203678774009642110, + 34867103745911, + 438292693017962, + 325304588638240, + 21888242871839275222246405745257275088548364400416034343698204091236551437983, + 177136736871332, + 21888242871839275222246405745257275088548364400416034343698204011183276410479, + 21888242871839275222246405745257275088548364400416034343698204053014706499846, + 184572028359477, + 520999309661728, + 21888242871839275222246405745257275088548364400416034343698203802762852946466, + 21888242871839275222246405745257275088548364400416034343698203833562311033130, + 21888242871839275222246405745257275088548364400416034343698204158393641176921, + 547642412282747, + 292618882948355, + 267277726393296, + 244365098888276, + 21888242871839275222246405745257275088548364400416034343698203965855837080397, + 545946795494235, + 147789061232970, + 21888242871839275222246405745257275088548364400416034343698203965126922071964, + 213904290198894, + 178231050318416, + 411904901981421, + 21888242871839275222246405745257275088548364400416034343698203964288858261395, + 453735970291337, + 21888242871839275222246405745257275088548364400416034343698204146726699627634, + 21888242871839275222246405745257275088548364400416034343698203924550407198556, + 385078507009372, + 164310107075852, + 562251200852333, + 21888242871839275222246405745257275088548364400416034343698203882272613827253, + 42195650148249, + 238406121435027, + 21888242871839275222246405745257275088548364400416034343698203718581402212844, + 519631312229227, + 513926806328003, + 21888242871839275222246405745257275088548364400416034343698203970447033038477, + 21888242871839275222246405745257275088548364400416034343698204184178457313393, + 21888242871839275222246405745257275088548364400416034343698204038420099107767, + 144678863838, + 21888242871839275222246405745257275088548364400416034343698203666005749942387, + 328882432864622, + 83947775824878, + 344007568128227, + 21888242871839275222246405745257275088548364400416034343698204098749683001189, + 396153274907073, + 158205288594957, + 331806049003251, + 21888242871839275222246405745257275088548364400416034343698203916976895740519, + 21888242871839275222246405745257275088548364400416034343698203897214868183981, + 21888242871839275222246405745257275088548364400416034343698203714747907463941, + 524056700505634, + 21888242871839275222246405745257275088548364400416034343698204114698556645611, + 518830563098088, + 21888242871839275222246405745257275088548364400416034343698203697095384273313, + 500603194484389, + 70133533990095, + 21888242871839275222246405745257275088548364400416034343698204036225087250530, + 21888242871839275222246405745257275088548364400416034343698203670731079938570, + 21888242871839275222246405745257275088548364400416034343698204120109335244499, + 157328797713296, + 21888242871839275222246405745257275088548364400416034343698204033635424611001, + 21888242871839275222246405745257275088548364400416034343698204141149989419731, + 21888242871839275222246405745257275088548364400416034343698204001197469437083, + 202047378487449, + 21888242871839275222246405745257275088548364400416034343698203711598971632517, + 476007937854813, + 510708984228851, + 21888242871839275222246405745257275088548364400416034343698203730701140519673, + 217014428725271, + 493300866069321, + 14873579770208, + 127827612986176, + 157393863319517, + 21888242871839275222246405745257275088548364400416034343698203929684876115177, + 21888242871839275222246405745257275088548364400416034343698203970316171110128, + 258535013152463, + 78244712260133, + 21888242871839275222246405745257275088548364400416034343698203774085278940192, + 92556082093922, + 21888242871839275222246405745257275088548364400416034343698203949933282091467, + 492242219920316, + 21888242871839275222246405745257275088548364400416034343698203772890259438073, + 26091023847189, + 386722814301490, + 36348230651242, + 21888242871839275222246405745257275088548364400416034343698203821804018319265, + 2121747529994, + 21888242871839275222246405745257275088548364400416034343698203647354860703627, + 21888242871839275222246405745257275088548364400416034343698203953890294594947, + 333980926977420, + 21888242871839275222246405745257275088548364400416034343698203971764349549136, + 21888242871839275222246405745257275088548364400416034343698203769960495597460, + 25308239000869, + 21499733225904, + 353045999304867, + 52664036886086, + 59612131799272, + 166695307405068, + 21888242871839275222246405745257275088548364400416034343698204178596896727124, + 552749212617753, + 136534220416938, + 49074342476682, + 21888242871839275222246405745257275088548364400416034343698204173550248017970, + 21888242871839275222246405745257275088548364400416034343698203891490366942609, + 21888242871839275222246405745257275088548364400416034343698203820251923916874, + 21888242871839275222246405745257275088548364400416034343698203859590734172786, + 498578768557314, + 21888242871839275222246405745257275088548364400416034343698204141330413951144, + 403798679133006, + 30542381011875, + 556132675308668, + 216106050253731, + 506040749824193, + 21888242871839275222246405745257275088548364400416034343698203835315377378971, + 133392924427875, + 21888242871839275222246405745257275088548364400416034343698203631116375226788, + 81169894520967, + 472548906160033, + 21888242871839275222246405745257275088548364400416034343698203689212588806768, + 21888242871839275222246405745257275088548364400416034343698203943575073715087, + 417653222191606, + 416701414105919, + 21888242871839275222246405745257275088548364400416034343698204160359536719777, + 381571380161678, + 248433157555012, + 167933051888848, + 58481539851873, + 235980911728593, + 21888242871839275222246405745257275088548364400416034343698203904257996696184, + 482888054789353, + 21888242871839275222246405745257275088548364400416034343698203909685691603846, + 329714798648871, + 21888242871839275222246405745257275088548364400416034343698204095731013247127, + 483308104407175, + 59892698030407, + 21888242871839275222246405745257275088548364400416034343698203630458105257061, + 522011733706113, + 21888242871839275222246405745257275088548364400416034343698204075692770775043, + 291643081196570, + 221559688656601, + 330277273463020, + 21888242871839275222246405745257275088548364400416034343698203627900418947591, + 4296563681035, + 358992118414688, + 21888242871839275222246405745257275088548364400416034343698203960389351233510, + 507399178412722, + 252243952039792, + 170826125871459, + 364887770554555, + 417020761262469, + 21888242871839275222246405745257275088548364400416034343698203668875134369924, + 204758477874340, + 503669031420548, + 21888242871839275222246405745257275088548364400416034343698204030446236450778, + 352636935719870, + 337240689807214, + 21888242871839275222246405745257275088548364400416034343698203896484959440991, + 515005929868076, + 21888242871839275222246405745257275088548364400416034343698203913595230109916, + 21888242871839275222246405745257275088548364400416034343698204140390286576805, + 59229470531997, + 21888242871839275222246405745257275088548364400416034343698204004272555281327, + 21888242871839275222246405745257275088548364400416034343698203824158478569678, + 21888242871839275222246405745257275088548364400416034343698204074820708979598, + 392986098326641, + 21888242871839275222246405745257275088548364400416034343698203895920649872058, + 21888242871839275222246405745257275088548364400416034343698203728664066102239, + 21888242871839275222246405745257275088548364400416034343698203972193913091267, + 163541135563335, + 66197143072317, + 225812427196083, + 48642438080982, + 21888242871839275222246405745257275088548364400416034343698204050473476840087, + 21888242871839275222246405745257275088548364400416034343698203779650851413754, + 37216452029278, + 344739052295238, + 119722970058018, + 388544070902394, + 21888242871839275222246405745257275088548364400416034343698204149345945908564, + 21888242871839275222246405745257275088548364400416034343698203785247131594305, + 491051408694745, + 21888242871839275222246405745257275088548364400416034343698204185280621059248, + 108829528153656, + 21888242871839275222246405745257275088548364400416034343698204027311723397601, + 41343261717104, + 21888242871839275222246405745257275088548364400416034343698204128004007155383, + 21888242871839275222246405745257275088548364400416034343698203754901110510608, + 21888242871839275222246405745257275088548364400416034343698203760133241416242, + 430505930738857, + 255649964245313, + 21888242871839275222246405745257275088548364400416034343698203926980126522266, + 21888242871839275222246405745257275088548364400416034343698203878368006174234, + 457881449942641, + 23792655387026, + 453769169280687, + 275344787077206, + 312454795959573, + 485988916939846, + 21888242871839275222246405745257275088548364400416034343698203882163929036208, + 134233751728569, + 21888242871839275222246405745257275088548364400416034343698204086442386963106, + 21888242871839275222246405745257275088548364400416034343698203635121389345143, + 21888242871839275222246405745257275088548364400416034343698204131102057747442, + 562820228049628, + 548330171756666, + 388323409511922, + 272265907722828, + 363561157749745, + 21888242871839275222246405745257275088548364400416034343698203677513768008136, + 64580382360176, + 21888242871839275222246405745257275088548364400416034343698203626781087048859, + 21888242871839275222246405745257275088548364400416034343698203890688316798435, + 21888242871839275222246405745257275088548364400416034343698203807230368391746, + 501921932339837, + 21888242871839275222246405745257275088548364400416034343698203671719141339969, + 21888242871839275222246405745257275088548364400416034343698203979232358061023, + 42643415336349, + 21888242871839275222246405745257275088548364400416034343698203808897240465318, + 29815898539240, + 5928152485560, + 21888242871839275222246405745257275088548364400416034343698203986361177873308, + 469177828843934, + 96772306365778, + 533756606656614, + 238923984599120, + 349296644670948, + 235361119973912, + 284620968952262, + 21888242871839275222246405745257275088548364400416034343698203674633126154578, + 427004751028665, + 21888242871839275222246405745257275088548364400416034343698204020922614648089, + 88195305389209, + 259697878472876, + 21888242871839275222246405745257275088548364400416034343698203957239483500388, + 21888242871839275222246405745257275088548364400416034343698203902446777414481, + 21888242871839275222246405745257275088548364400416034343698203916001170864702, + 55486417617529, + 465132907354774, + 21888242871839275222246405745257275088548364400416034343698203783145844517680, + 115566039595082, + 21888242871839275222246405745257275088548364400416034343698203806314987111765, + 527166332399603, + 148766576609527, + 21888242871839275222246405745257275088548364400416034343698203687627969684370, + 423443102350147, + 21888242871839275222246405745257275088548364400416034343698204147993117412137, + 21888242871839275222246405745257275088548364400416034343698203650727373785583, + 280104473666328, + 21888242871839275222246405745257275088548364400416034343698204087470055218298, + 39573442354451, + 21888242871839275222246405745257275088548364400416034343698203913709961204152, + 344737543205712, + 21888242871839275222246405745257275088548364400416034343698203842473752455886, + 21888242871839275222246405745257275088548364400416034343698203698534579678611, + 191707018187670, + 21888242871839275222246405745257275088548364400416034343698203970030899949112, + 354076656339541, + 311404462883973, + 21888242871839275222246405745257275088548364400416034343698204087385359980120, + 21888242871839275222246405745257275088548364400416034343698203838740259068223, + 534906088748633, + 21888242871839275222246405745257275088548364400416034343698204067557468725751, + 21888242871839275222246405745257275088548364400416034343698204142233541578054, + 21888242871839275222246405745257275088548364400416034343698204157592166864650, + 359355480579658, + 518208472956863, + 21888242871839275222246405745257275088548364400416034343698203901614158463037, + 269902575044912, + 21888242871839275222246405745257275088548364400416034343698203686862309342747, + 21888242871839275222246405745257275088548364400416034343698204111826865355152, + 21888242871839275222246405745257275088548364400416034343698203835717708540714, + 21888242871839275222246405745257275088548364400416034343698203650576849021265, + 21888242871839275222246405745257275088548364400416034343698203979122440267945, + 21888242871839275222246405745257275088548364400416034343698203952941575384517, + 21888242871839275222246405745257275088548364400416034343698204083248606103588, + 21888242871839275222246405745257275088548364400416034343698204039863325458814, + 36736861794655, + 507973435640607, + 332855306584564, + 249087313906982, + 341352242788842, + 21888242871839275222246405745257275088548364400416034343698204012295111134242, + 21888242871839275222246405745257275088548364400416034343698203625711516658053, + 21888242871839275222246405745257275088548364400416034343698203634373213972429, + 330347199637551, + 532818350495179, + 207360656096358, + 21888242871839275222246405745257275088548364400416034343698203978616977325615, + 21888242871839275222246405745257275088548364400416034343698204141164021724772, + 253807992943, + 497045673543472, + 494320129959521, + 485594938561658, + 142158209995785, + 496790566893860, + 21888242871839275222246405745257275088548364400416034343698203824961312820316, + 21888242871839275222246405745257275088548364400416034343698203757200962797672, + 21888242871839275222246405745257275088548364400416034343698203792141559540695, + 34110279975003, + 454819390054317, + 249253024550287, + 21888242871839275222246405745257275088548364400416034343698204065070261683240, + 158756311240503, + 21888242871839275222246405745257275088548364400416034343698203942715037619624, + 424364086919056, + 21888242871839275222246405745257275088548364400416034343698203896842614749168, + 389533680689876, + 21888242871839275222246405745257275088548364400416034343698203878998041801651, + 13737797766390, + 21888242871839275222246405745257275088548364400416034343698203756256403509758, + 149732945143696, + 463202726326708, + 45223337970376, + 97719103247580, + 352036026770816, + 21888242871839275222246405745257275088548364400416034343698203811901199353186, + 271806112811091, + 21888242871839275222246405745257275088548364400416034343698203838480263894443, + 21888242871839275222246405745257275088548364400416034343698203816895104774689, + 21888242871839275222246405745257275088548364400416034343698204051710538691206, + 270826388266879, + 21888242871839275222246405745257275088548364400416034343698203726973456810767, + 513901593205127, + 21888242871839275222246405745257275088548364400416034343698204100146960245956, + 208832283575570, + 443681312370107, + 527542844059826, + 170781153357504, + 147857272532451, + 371568895876029, + 261502311504060, + 297104926400248, + 39948747390935, + 21888242871839275222246405745257275088548364400416034343698204138231634272563, + 21888242871839275222246405745257275088548364400416034343698203877702696070864, + 21888242871839275222246405745257275088548364400416034343698203897802191885842, + 303814322186104, + 203938832903574, + 268247141842040, + 321975527674980, + 21888242871839275222246405745257275088548364400416034343698203660171812357968, + 383355705933619, + 21888242871839275222246405745257275088548364400416034343698204108723491108947, + 21888242871839275222246405745257275088548364400416034343698203702754604364178, + 422659660794480, + 245656519623104, + 534422860949640, + 322552835952632, + 88348424464823, + 248846746054262, + 14864397338131, + 21888242871839275222246405745257275088548364400416034343698204110538093291776, + 366288039728232, + 324218021948604, + 157525847996851, + 21888242871839275222246405745257275088548364400416034343698203733608147571644, + 21888242871839275222246405745257275088548364400416034343698203923263668006293, + 350673413742541, + 21888242871839275222246405745257275088548364400416034343698203876093036337849, + 489546579554984, + 458947214731609, + 284816366925408, + 1217874600549, + 283415864329038, + 21888242871839275222246405745257275088548364400416034343698203694460292600018, + 734402903576, + 21888242871839275222246405745257275088548364400416034343698203930273307513571, + 21888242871839275222246405745257275088548364400416034343698204126550587639285, + 105757193099114, + 384968381213382, + 234618647855520, + 21888242871839275222246405745257275088548364400416034343698204066631104898446, + 556637813998556, + 21888242871839275222246405745257275088548364400416034343698203812187660525156, + 21888242871839275222246405745257275088548364400416034343698203641855968622691, + 17778276879928, + 125456344713586, + 557070982871736, + 184172855566937, + 298386310179022, + 21888242871839275222246405745257275088548364400416034343698203982223128645549, + 21888242871839275222246405745257275088548364400416034343698203832899747886046, + 21888242871839275222246405745257275088548364400416034343698203666716734338002, + 21888242871839275222246405745257275088548364400416034343698204178335794298560, + 21888242871839275222246405745257275088548364400416034343698203682889507213602, + 231771342547993, + 21888242871839275222246405745257275088548364400416034343698203789019873354257, + 348767391033857, + 21888242871839275222246405745257275088548364400416034343698203686577722914732, + 21888242871839275222246405745257275088548364400416034343698204185221931741069, + 80229015591153, + 286482193129662, + 21888242871839275222246405745257275088548364400416034343698204054368634832060, + 20851212238960, + 288845575682035, + 21888242871839275222246405745257275088548364400416034343698203875389633029880, + 21888242871839275222246405745257275088548364400416034343698203955418598833464, + 21888242871839275222246405745257275088548364400416034343698204140893075291385, + 204697445273926, + 21888242871839275222246405745257275088548364400416034343698203842277400470620, + 133187177476470, + 21888242871839275222246405745257275088548364400416034343698203820495600751860, + 21888242871839275222246405745257275088548364400416034343698203748223261545949, + 21888242871839275222246405745257275088548364400416034343698204110096002775289, + 21888242871839275222246405745257275088548364400416034343698203787291577784589, + 136294644161034, + 391704045011090, + 21888242871839275222246405745257275088548364400416034343698203674190495307390, + 21888242871839275222246405745257275088548364400416034343698203924451941144057, + 21888242871839275222246405745257275088548364400416034343698203960646121655009, + 21888242871839275222246405745257275088548364400416034343698204001242637306443, + 301665495714486, + 21888242871839275222246405745257275088548364400416034343698203924686056228243, + 122553810207007, + 21888242871839275222246405745257275088548364400416034343698204130240940434826, + 73647769962247, + 334027821878522, + 21888242871839275222246405745257275088548364400416034343698204001810682637963, + 363990964225730, + 114616589707549, + 533369844735660, + 525246945567818, + 21888242871839275222246405745257275088548364400416034343698203695748910779670, + 315315434361288, + 471553144786151, + 129240458111908, + 428634067019104, + 177650630066490, + 21888242871839275222246405745257275088548364400416034343698203862478744582857, + 21888242871839275222246405745257275088548364400416034343698203780562823179112, + 21888242871839275222246405745257275088548364400416034343698203756337919479266, + 83584504581426, + 398157083829652, + 480411055246475, + 463125058830812, + 21888242871839275222246405745257275088548364400416034343698203917097272807607, + 80990222276661, + 21888242871839275222246405745257275088548364400416034343698203968640541065095, + 82155584713241, + 514118515994217, + 550737631544887, + 449448204298843, + 55557984040993, + 32569846371778, + 35131678839505, + 104654293280032, + 329416874958423, + 21888242871839275222246405745257275088548364400416034343698204069752002017694, + 10202520395356, + 21888242871839275222246405745257275088548364400416034343698204004758522985052, + 21888242871839275222246405745257275088548364400416034343698203921506372083294, + 21888242871839275222246405745257275088548364400416034343698204125933392027521, + 21888242871839275222246405745257275088548364400416034343698203730440226189907, + 21888242871839275222246405745257275088548364400416034343698203999494217515934, + 533340537304659, + 21888242871839275222246405745257275088548364400416034343698204095508493927389, + 457020669922883, + 21888242871839275222246405745257275088548364400416034343698203978846187953175, + 309788614210940, + 21888242871839275222246405745257275088548364400416034343698204096134557853800, + 152725139863287, + 350944313297433, + 21888242871839275222246405745257275088548364400416034343698203930273249844831, + 268223318730234, + 225540779090539, + 21888242871839275222246405745257275088548364400416034343698204120796960612640, + 21888242871839275222246405745257275088548364400416034343698203975313856903753, + 21888242871839275222246405745257275088548364400416034343698203722446590108720, + 21888242871839275222246405745257275088548364400416034343698203804728133510012, + 369611372955624, + 194646519995745, + 133314257235871, + 115477456272843, + 21888242871839275222246405745257275088548364400416034343698203927951871016906, + 404776034760860, + 21888242871839275222246405745257275088548364400416034343698204023630204426191, + 141895511061809, + 485785013325122, + 21888242871839275222246405745257275088548364400416034343698204168101441235432, + 21888242871839275222246405745257275088548364400416034343698203892116882389396, + 21888242871839275222246405745257275088548364400416034343698204068097457163956, + 525717874390609, + 453481667415828, + 270691651022227, + 21888242871839275222246405745257275088548364400416034343698203993278061087195, + 81202137551229, + 21888242871839275222246405745257275088548364400416034343698203736960193183571, + 169856660677515, + 21888242871839275222246405745257275088548364400416034343698204073772247611315, + 56665313833041, + 21888242871839275222246405745257275088548364400416034343698204114086663573377, + 21888242871839275222246405745257275088548364400416034343698203888450265493147, + 249373499964594, + 21888242871839275222246405745257275088548364400416034343698203876948545500245, + 520548499988377, + 336423495029625, + 283791233546476, + 254653438439659, + 21888242871839275222246405745257275088548364400416034343698204131047582752894, + 21888242871839275222246405745257275088548364400416034343698203673903140568052, + 187563630980077, + 417587159390214, + 21888242871839275222246405745257275088548364400416034343698204184567942319922, + 97936987512490, + 21888242871839275222246405745257275088548364400416034343698204062910229638275, + 413847763273494, + 21888242871839275222246405745257275088548364400416034343698203879956637714276, + 21888242871839275222246405745257275088548364400416034343698204156865725692326, + 305835992618156, + 418153028926334, + 504489482356271, + 100955535669225, + 21888242871839275222246405745257275088548364400416034343698203741744248942252, + 62297703189825, + 21888242871839275222246405745257275088548364400416034343698204017108626521145, + 30566708436372, + 21888242871839275222246405745257275088548364400416034343698203913015782771861, + 21888242871839275222246405745257275088548364400416034343698203852850434169865, + 366285959880280, + 21888242871839275222246405745257275088548364400416034343698204049161698388277, + 36827844822299, + 205278618968113, + 26225702939573, + 525132528156728, + 21888242871839275222246405745257275088548364400416034343698203901666837076050, + 362068356083514, + 21888242871839275222246405745257275088548364400416034343698203793159370451403, + 21888242871839275222246405745257275088548364400416034343698203704210897572204, + 285989559994707, + 310067504489272, + 21888242871839275222246405745257275088548364400416034343698203631800910932174, + 21888242871839275222246405745257275088548364400416034343698203964164133590888, + 207655222718068, + 380354948612502, + 10006286909032, + 92136009946895, + 418576203522107, + 511336029425724, + 399821432708234, + 212284517875060, + 125109506815491, + 123583491805942, + 427498372506906, + 21888242871839275222246405745257275088548364400416034343698204049184570518390, + 21888242871839275222246405745257275088548364400416034343698203944466647860123, + 21888242871839275222246405745257275088548364400416034343698203976493537455393, + 356872961831430, + 38831277232588, + 21888242871839275222246405745257275088548364400416034343698204059096847015701, + 21888242871839275222246405745257275088548364400416034343698204080885161908577, + 518846573677105, + 21888242871839275222246405745257275088548364400416034343698204180244438590162, + 21888242871839275222246405745257275088548364400416034343698204055426882658229, + 227557829735304, + 21888242871839275222246405745257275088548364400416034343698204036960162730284, + 22820035372299, + 21888242871839275222246405745257275088548364400416034343698203852821167367902, + 21888242871839275222246405745257275088548364400416034343698203724219351085842, + 491521961315376, + 21888242871839275222246405745257275088548364400416034343698203673161515145743, + 472454649098767, + 497667744349041, + 30879379672910, + 21888242871839275222246405745257275088548364400416034343698203847663959738742, + 21888242871839275222246405745257275088548364400416034343698203637446311225989, + 335332238184303, + 21888242871839275222246405745257275088548364400416034343698204094660135127554, + 450459082329217, + 475905973257119, + 21888242871839275222246405745257275088548364400416034343698204159398334421952, + 21888242871839275222246405745257275088548364400416034343698204004974661387588, + 512804021741241, + 539820277370147, + 549591005817537, + 487249823087087, + 21888242871839275222246405745257275088548364400416034343698203906678764193183, + 21888242871839275222246405745257275088548364400416034343698203942473165383675, + 336416865871791, + 21888242871839275222246405745257275088548364400416034343698204025724713764716, + 90760326591395, + 417585073857660, + 278814280959803, + 458458281347468, + 327608264790789, + 21888242871839275222246405745257275088548364400416034343698203715547497936475, + 21888242871839275222246405745257275088548364400416034343698203822413612980032, + 447387505248361, + 21888242871839275222246405745257275088548364400416034343698204127245301041073, + 21888242871839275222246405745257275088548364400416034343698203631512961378635, + 317706564361248, + 188920467222915, + 21888242871839275222246405745257275088548364400416034343698203952095847202852, + 35178038615641, + 21888242871839275222246405745257275088548364400416034343698203644519641858257, + 21888242871839275222246405745257275088548364400416034343698203652430716470253, + 243070272011165, + 297084269865573, + 21888242871839275222246405745257275088548364400416034343698204093580077902496, + 21888242871839275222246405745257275088548364400416034343698203777021474757250, + 21888242871839275222246405745257275088548364400416034343698204031267273296040, + 541898712244581, + 506725578568504, + 21888242871839275222246405745257275088548364400416034343698203785124746075008, + 21888242871839275222246405745257275088548364400416034343698204122560582801080, + 21888242871839275222246405745257275088548364400416034343698204065904339738945, + 24017709635758, + 21888242871839275222246405745257275088548364400416034343698204173381008280376, + 21888242871839275222246405745257275088548364400416034343698203758568518278787, + 391985901453280, + 298667900019624, + 66642054790979, + 21888242871839275222246405745257275088548364400416034343698203985278914993170, + 21888242871839275222246405745257275088548364400416034343698203816131426401325, + 117219623947098, + 21888242871839275222246405745257275088548364400416034343698203964743348151447, + 21888242871839275222246405745257275088548364400416034343698203893289940776442, + 326655395323591, + 21888242871839275222246405745257275088548364400416034343698203660068380726434, + 371708426872182, + 73807840609957, + 100738986677627, + 484982536767602, + 21888242871839275222246405745257275088548364400416034343698203798152451936596, + 449840019007359, + 514090040665282, + 343927649678934, + 21888242871839275222246405745257275088548364400416034343698203992481293253250, + 21888242871839275222246405745257275088548364400416034343698203822746722120750, + 21888242871839275222246405745257275088548364400416034343698204125204891532946, + 21888242871839275222246405745257275088548364400416034343698203642104121037872, + 21888242871839275222246405745257275088548364400416034343698204053075857564642, + 101294585340196, + 194730061482164, + 21888242871839275222246405745257275088548364400416034343698203944564624011895, + 350187251277851, + 178648510233374, + 420704174138132, + 21888242871839275222246405745257275088548364400416034343698203992320459742194, + 21888242871839275222246405745257275088548364400416034343698204019709128178882, + 512559007732079, + 44101129493166, + 487467665025239, + 219525541807411, + 167582323923763, + 21888242871839275222246405745257275088548364400416034343698204116340364122577, + 541559000142889, + 323375352778398, + 169774398209327, + 21888242871839275222246405745257275088548364400416034343698203704899308132132, + 21888242871839275222246405745257275088548364400416034343698203767207682924922, + 21888242871839275222246405745257275088548364400416034343698204102416233433930, + 21888242871839275222246405745257275088548364400416034343698203760848184687785, + 137306223782449, + 178663663700189, + 216589723378769, + 21888242871839275222246405745257275088548364400416034343698203965294706086744, + 21888242871839275222246405745257275088548364400416034343698204027280137235039, + 511019372193215, + 147856646120077, + 21888242871839275222246405745257275088548364400416034343698203809111711285344, + 21888242871839275222246405745257275088548364400416034343698203891035507177200, + 36646310303716, + 315084838844096, + 21888242871839275222246405745257275088548364400416034343698203856665558494127, + 21888242871839275222246405745257275088548364400416034343698203647118255477099, + 176070161369722, + 54551817542949, + 47490350721917, + 17175744806400, + 21888242871839275222246405745257275088548364400416034343698203860188916462117, + 21888242871839275222246405745257275088548364400416034343698204172630879806995, + 21888242871839275222246405745257275088548364400416034343698203739652648891394, + 382766374071097, + 293951554356841, + 129147314801830, + 21888242871839275222246405745257275088548364400416034343698204082206947553805, + 108693476733181, + 21888242871839275222246405745257275088548364400416034343698204121552721278782, + 21888242871839275222246405745257275088548364400416034343698203850195432568079, + 242983924381548, + 21888242871839275222246405745257275088548364400416034343698203972322825586362, + 120901986163710, + 413861382629563, + 350137029798855, + 332746981540091, + 21888242871839275222246405745257275088548364400416034343698203722559481152385, + 256435754363493, + 21888242871839275222246405745257275088548364400416034343698203883151224333477, + 56636950681648, + 21888242871839275222246405745257275088548364400416034343698203703096030679060, + 402180110391136, + 21888242871839275222246405745257275088548364400416034343698203675452730312058, + 21888242871839275222246405745257275088548364400416034343698204134708590102818, + 201019929779276, + 21888242871839275222246405745257275088548364400416034343698203928771989690255, + 127103537661766, + 21888242871839275222246405745257275088548364400416034343698203894500105793393, + 21888242871839275222246405745257275088548364400416034343698203863260524844586, + 21888242871839275222246405745257275088548364400416034343698204087424945577907, + 154844868457692, + 187777963308273, + 148399245334496, + 21888242871839275222246405745257275088548364400416034343698203658713228039353, + 21888242871839275222246405745257275088548364400416034343698203932418292934538, + 21888242871839275222246405745257275088548364400416034343698203754404992687495, + 332572824712610, + 21888242871839275222246405745257275088548364400416034343698203885004498871775, + 21888242871839275222246405745257275088548364400416034343698203898219029423676, + 312638135509475, + 21888242871839275222246405745257275088548364400416034343698203869475269663079, + 509853202564677, + 273769272251086, + 21888242871839275222246405745257275088548364400416034343698203934754267860515, + 21888242871839275222246405745257275088548364400416034343698203698970814017930, + 21888242871839275222246405745257275088548364400416034343698203949152466068321, + 21888242871839275222246405745257275088548364400416034343698204099173186705158, + 21888242871839275222246405745257275088548364400416034343698203802716088641777, + 100838078576423, + 21888242871839275222246405745257275088548364400416034343698204079130954080461, + 21888242871839275222246405745257275088548364400416034343698203934387259372784, + 394056161345820, + 21888242871839275222246405745257275088548364400416034343698203722851146410522, + 21888242871839275222246405745257275088548364400416034343698203894156808991820, + 280845853361163, + 253624035069370, + 21888242871839275222246405745257275088548364400416034343698203902068585922807, + 21888242871839275222246405745257275088548364400416034343698203670358830623671, + 289934505670384, + 21888242871839275222246405745257275088548364400416034343698203883985108823637, + 21888242871839275222246405745257275088548364400416034343698204066857555788262, + 472058605796328, + 21888242871839275222246405745257275088548364400416034343698203762788774750412, + 43765913115287, + 21888242871839275222246405745257275088548364400416034343698203822168179263499, + 21888242871839275222246405745257275088548364400416034343698203814525021498752, + 21888242871839275222246405745257275088548364400416034343698203915961111541385, + 459497934522952, + 495299762272136, + 333796603640082, + 524569611285320, + 21888242871839275222246405745257275088548364400416034343698203916947972869299, + 446463723027039, + 8105286928250, + 16038542562461, + 359501462515148, + 321397771570117, + 239275144803859, + 521168722577362, + 21888242871839275222246405745257275088548364400416034343698204103383567504617, + 21888242871839275222246405745257275088548364400416034343698204140315550479040, + 139368191596910, + 21888242871839275222246405745257275088548364400416034343698203658957728196841, + 77109529028971, + 207903756326222, + 288019006917983, + 21888242871839275222246405745257275088548364400416034343698203746407097132714, + 462523000862620, + 204328564653072, + 21888242871839275222246405745257275088548364400416034343698203715356149843789, + 177601158779031, + 21888242871839275222246405745257275088548364400416034343698204072206217931664, + 21888242871839275222246405745257275088548364400416034343698204142417102553692, + 21888242871839275222246405745257275088548364400416034343698203696201377838926, + 193098902033723, + 163126928610165, + 21888242871839275222246405745257275088548364400416034343698203836600425398669, + 21888242871839275222246405745257275088548364400416034343698204015807792700189, + 269876242306437, + 21888242871839275222246405745257275088548364400416034343698203758316302100267, + 332442762948950, + 285432409503333, + 21888242871839275222246405745257275088548364400416034343698203990323736040735, + 21888242871839275222246405745257275088548364400416034343698203708090409551046, + 21888242871839275222246405745257275088548364400416034343698204048275212834056, + 21888242871839275222246405745257275088548364400416034343698203802843697396188, + 21888242871839275222246405745257275088548364400416034343698203947680495004630, + 21888242871839275222246405745257275088548364400416034343698204024690428942811, + 129923302020924, + 64919871999712, + 6831639495016, + 21888242871839275222246405745257275088548364400416034343698204067421687215008, + 537038753280371, + 21888242871839275222246405745257275088548364400416034343698203996214997370666, + 552239454420271, + 21888242871839275222246405745257275088548364400416034343698203632055062342479, + 21888242871839275222246405745257275088548364400416034343698204031574859455250, + 21888242871839275222246405745257275088548364400416034343698204124915319082348, + 114247051139976, + 37536687497729, + 21888242871839275222246405745257275088548364400416034343698204094723833486361, + 21888242871839275222246405745257275088548364400416034343698203710123122376086, + 496107967105325, + 516588932947648, + 195929400716858, + 24910682135408, + 21888242871839275222246405745257275088548364400416034343698203982768247077881, + 21888242871839275222246405745257275088548364400416034343698204100020788777366, + 21888242871839275222246405745257275088548364400416034343698203867920302986153, + 21888242871839275222246405745257275088548364400416034343698203731075025992115, + 558426225760206, + 21888242871839275222246405745257275088548364400416034343698204165890930231972, + 95781422899525, + 547991140625924, + 36411693334173, + 446233072529449, + 244760812571031, + 21888242871839275222246405745257275088548364400416034343698203647105826164467, + 234812752562644, + 21888242871839275222246405745257275088548364400416034343698204074801587440487, + 21888242871839275222246405745257275088548364400416034343698203966559081914593, + 37574958924591, + 215751630425244, + 117526590817090, + 21888242871839275222246405745257275088548364400416034343698204049064227963892, + 21888242871839275222246405745257275088548364400416034343698203869513108281805, + 454811117257004, + 415573536579389, + 21888242871839275222246405745257275088548364400416034343698203989039798781525, + 21888242871839275222246405745257275088548364400416034343698203701860545020413, + 21888242871839275222246405745257275088548364400416034343698204139367677803286, + 521964620214766, + 21888242871839275222246405745257275088548364400416034343698203733747764643092, + 504341337250189, + 13892410195849, + 21888242871839275222246405745257275088548364400416034343698203937206048213732, + 10703394990080, + 21888242871839275222246405745257275088548364400416034343698203629526675339348, + 21888242871839275222246405745257275088548364400416034343698203865355269334822, + 21888242871839275222246405745257275088548364400416034343698203971157345311846, + 285495162664048, + 164449451482708, + 21888242871839275222246405745257275088548364400416034343698203632178832470720, + 507432767533665, + 243517690516319, + 21888242871839275222246405745257275088548364400416034343698204075407102880015, + 506058624845082, + 21888242871839275222246405745257275088548364400416034343698204086904679415614, + 463338970043819, + 107040775242961, + 21888242871839275222246405745257275088548364400416034343698203708031429513610, + 446476134007164, + 57066027766358, + 21888242871839275222246405745257275088548364400416034343698203690065740044116, + 489111787091403, + 145077703125333, + 21888242871839275222246405745257275088548364400416034343698203724175182248710, + 522607009838301, + 21888242871839275222246405745257275088548364400416034343698203633898612675763, + 21888242871839275222246405745257275088548364400416034343698203923638379665760, + 21888242871839275222246405745257275088548364400416034343698203717694285547575, + 21888242871839275222246405745257275088548364400416034343698204037809366967275, + 21888242871839275222246405745257275088548364400416034343698204004805774409769, + 351153642765462, + 536751416032058, + 21888242871839275222246405745257275088548364400416034343698203960362170689182, + 184021920788647, + 410330524242190, + 353078949870446, + 109377669914664, + 231468385923960, + 21888242871839275222246405745257275088548364400416034343698203736563069775663, + 21888242871839275222246405745257275088548364400416034343698204039021301739994, + 160876488072062, + 238370733546677, + 236546334971039, + 21888242871839275222246405745257275088548364400416034343698203734128444865680, + 98785841701092, + 21888242871839275222246405745257275088548364400416034343698204005166463618509, + 344468804157221, + 478691653265261, + 265947993355649, + 21888242871839275222246405745257275088548364400416034343698203736846314029007, + 394372018970378, + 309399803240919, + 552351235182773, + 21888242871839275222246405745257275088548364400416034343698203805364791934400, + 51229510560119, + 514044483623640, + 21888242871839275222246405745257275088548364400416034343698204110163156068075, + 3768023045691, + 221545231023976, + 21888242871839275222246405745257275088548364400416034343698203862433829812024, + 71564224953116, + 516151691120928, + 21888242871839275222246405745257275088548364400416034343698204077684097516107, + 294024353003523, + 468819870208817, + 21888242871839275222246405745257275088548364400416034343698204009244358240095, + 21888242871839275222246405745257275088548364400416034343698203902837227295444, + 377663508770050, + 21888242871839275222246405745257275088548364400416034343698203762186199830820, + 21888242871839275222246405745257275088548364400416034343698203805123287638131, + 99906820927659, + 260564370670528, + 420223769365191, + 187068580195866, + 21888242871839275222246405745257275088548364400416034343698204117290518100085, + 21888242871839275222246405745257275088548364400416034343698203911654352784885, + 301120376071861, + 32176441740935, + 21888242871839275222246405745257275088548364400416034343698204153861931794166, + 21888242871839275222246405745257275088548364400416034343698204023022859493943, + 382142584588402, + 169463006965396, + 219488604971299, + 21888242871839275222246405745257275088548364400416034343698203925778513130384, + 21888242871839275222246405745257275088548364400416034343698204005261099983658, + 21888242871839275222246405745257275088548364400416034343698204053011686835520, + 21888242871839275222246405745257275088548364400416034343698203719860602070472, + 21888242871839275222246405745257275088548364400416034343698203699286102776281, + 21888242871839275222246405745257275088548364400416034343698203869446705251666, + 21888242871839275222246405745257275088548364400416034343698204018834722794259, + 478480177340868, + 21888242871839275222246405745257275088548364400416034343698204042954256388810, + 21888242871839275222246405745257275088548364400416034343698203698326793958769, + 24008444788809, + 21888242871839275222246405745257275088548364400416034343698203631464651990415, + 114030287507417, + 21888242871839275222246405745257275088548364400416034343698203944721931482817, + 93493875463746, + 143867605545380, + 467233069139812, + 28150962899201, + 391821193005920, + 348863050498681, + 89284825639526, + 370836623441731, + 496009059646502, + 21888242871839275222246405745257275088548364400416034343698204010913605845491, + 352420742640369, + 131036101101574, + 21888242871839275222246405745257275088548364400416034343698203927278801319991, + 535261655420027, + 397435204681743, + 86509642909962, + 21888242871839275222246405745257275088548364400416034343698203898916224522774, + 562162316030076, + 21888242871839275222246405745257275088548364400416034343698204031692105360567, + 228596342362099, + 118320621018666, + 21888242871839275222246405745257275088548364400416034343698203705305694322925, + 285906163030360, + 555864320293736, + 252160666851444, + 21888242871839275222246405745257275088548364400416034343698203699430337317136, + 21888242871839275222246405745257275088548364400416034343698203977907061467065, + 21888242871839275222246405745257275088548364400416034343698203731091439847265, + 64805153110723, + 292934448196668, + 21888242871839275222246405745257275088548364400416034343698204079800179623843, + 111096869235768, + 21888242871839275222246405745257275088548364400416034343698204178165293464371, + 300851913327909, + 149020233229190, + 290974784845993, + 21888242871839275222246405745257275088548364400416034343698203643967258312463, + 320395980976479, + 520572130514661, + 349662071036428, + 21888242871839275222246405745257275088548364400416034343698203996653648951955, + 21888242871839275222246405745257275088548364400416034343698203802361487522762, + 213437691249874, + 21888242871839275222246405745257275088548364400416034343698203801698103574693, + 21888242871839275222246405745257275088548364400416034343698203903534144436126, + 415083885304141, + 21888242871839275222246405745257275088548364400416034343698204031082495270923, + 21888242871839275222246405745257275088548364400416034343698204029497235712927, + 21888242871839275222246405745257275088548364400416034343698203768749577524076, + 21888242871839275222246405745257275088548364400416034343698203762525466182185, + 418989166226878, + 539220358144136, + 270716397351057, + 220360129395715, + 21888242871839275222246405745257275088548364400416034343698204145185942316715, + 21888242871839275222246405745257275088548364400416034343698204168546339669334, + 21888242871839275222246405745257275088548364400416034343698203914749772989935, + 126713454422482, + 517047057369851, + 21888242871839275222246405745257275088548364400416034343698203703576078340735, + 195975047727412, + 274099005906085, + 21888242871839275222246405745257275088548364400416034343698203966374427255460, + 21888242871839275222246405745257275088548364400416034343698203821953528274662, + 21888242871839275222246405745257275088548364400416034343698203903195902155988, + 21888242871839275222246405745257275088548364400416034343698203674513624567290, + 372686236524339, + 59590860156170, + 518950920888323, + 3955087860232, + 293267775465384, + 21888242871839275222246405745257275088548364400416034343698204157957207267836, + 21888242871839275222246405745257275088548364400416034343698203820973211387497, + 21888242871839275222246405745257275088548364400416034343698203983422264799643, + 21888242871839275222246405745257275088548364400416034343698203923146536152812, + 21888242871839275222246405745257275088548364400416034343698204069203732827367, + 21888242871839275222246405745257275088548364400416034343698203671424109719241, + 21888242871839275222246405745257275088548364400416034343698204127509607669131, + 21888242871839275222246405745257275088548364400416034343698203988364328951074, + 21888242871839275222246405745257275088548364400416034343698203871130280351571, + 429150805448697, + 21888242871839275222246405745257275088548364400416034343698203889144806248322, + 21888242871839275222246405745257275088548364400416034343698204000146181191019, + 21888242871839275222246405745257275088548364400416034343698204086046255739829, + 314844806881230, + 21888242871839275222246405745257275088548364400416034343698203982669619099152, + 21888242871839275222246405745257275088548364400416034343698203892456489008561, + 21888242871839275222246405745257275088548364400416034343698204146151365569847, + 21888242871839275222246405745257275088548364400416034343698204141522425849120, + 116399821429050, + 332673468312490, + 21888242871839275222246405745257275088548364400416034343698203984642435424839, + 21888242871839275222246405745257275088548364400416034343698203747229757974602, + 127458068175493, + 255542332224578, + 21888242871839275222246405745257275088548364400416034343698204139087888624063, + 21888242871839275222246405745257275088548364400416034343698204013043572270448, + 347675213792611, + 21888242871839275222246405745257275088548364400416034343698203766483223449099, + 524098433664547, + 191102640855366, + 21888242871839275222246405745257275088548364400416034343698204100093444496543, + 21888242871839275222246405745257275088548364400416034343698203866973335180694, + 270086451807178, + 90795039925051, + 21888242871839275222246405745257275088548364400416034343698204154456895402444, + 21888242871839275222246405745257275088548364400416034343698203698862919506718, + 91084855350340, + 56298980762523, + 533170757509334, + 21888242871839275222246405745257275088548364400416034343698203771058675572995, + 440091862407916, + 384255430063920, + 21888242871839275222246405745257275088548364400416034343698204000131367159268, + 21888242871839275222246405745257275088548364400416034343698204006070782214723, + 21888242871839275222246405745257275088548364400416034343698203725120573730775, + 21888242871839275222246405745257275088548364400416034343698203639867702301596, + 21888242871839275222246405745257275088548364400416034343698204002492688331272, + 477787279816909, + 21888242871839275222246405745257275088548364400416034343698204015173847395983, + 21888242871839275222246405745257275088548364400416034343698203933201044878651, + 21888242871839275222246405745257275088548364400416034343698203908530023832142, + 21888242871839275222246405745257275088548364400416034343698204143698627668054, + 37813146918632, + 21888242871839275222246405745257275088548364400416034343698203672070342164356, + 29220994118254, + 21888242871839275222246405745257275088548364400416034343698203903238741950957, + 49435453565220, + 534774225967535, + 275555052686176, + 21888242871839275222246405745257275088548364400416034343698203736978077849311, + 21888242871839275222246405745257275088548364400416034343698203663514128971272, + 500881046903091, + 409431359124938, + 101250147942304, + 21888242871839275222246405745257275088548364400416034343698204065772139206127, + 205391074883853, + 4783410117857, + 21888242871839275222246405745257275088548364400416034343698203822428870531378, + 21888242871839275222246405745257275088548364400416034343698204026452698092226, + 378854366494341, + 457127914839096, + 21888242871839275222246405745257275088548364400416034343698203801904479748462, + 211803023686780, + 21888242871839275222246405745257275088548364400416034343698204021679866112555, + 514870437314742, + 21888242871839275222246405745257275088548364400416034343698204026983556325975, + 21888242871839275222246405745257275088548364400416034343698203977172148120181, + 543967318646499, + 289677093646953, + 483969622752773, + 403814910929036, + 69606124536999, + 21888242871839275222246405745257275088548364400416034343698204171949055511930, + 21888242871839275222246405745257275088548364400416034343698204086355196998257, + 21888242871839275222246405745257275088548364400416034343698203848409915515828, + 376059855074894, + 100852353285367, + 408738415317548, + 21888242871839275222246405745257275088548364400416034343698203648974579146348, + 21888242871839275222246405745257275088548364400416034343698204042379878387481, + 21888242871839275222246405745257275088548364400416034343698203679283732538260, + 21888242871839275222246405745257275088548364400416034343698203924923969164558, + 97184297115868, + 405874935921260, + 21888242871839275222246405745257275088548364400416034343698204095965144576049, + 21888242871839275222246405745257275088548364400416034343698203804547426962733, + 21888242871839275222246405745257275088548364400416034343698204175497038042167, + 2868044583349, + 203113248432900, + 21888242871839275222246405745257275088548364400416034343698204136242341161751, + 243894551584648, + 21888242871839275222246405745257275088548364400416034343698204045458299349103, + 21888242871839275222246405745257275088548364400416034343698204100171002549543, + 21888242871839275222246405745257275088548364400416034343698203947992423750352, + 361311808235066, + 21888242871839275222246405745257275088548364400416034343698203927139742018850, + 176502333714680, + 462065585320802, + 535211132770846, + 544266456594196, + 21888242871839275222246405745257275088548364400416034343698203881882735577997, + 21888242871839275222246405745257275088548364400416034343698204043706959648298, + 77748488194027, + 21888242871839275222246405745257275088548364400416034343698204045518653954543, + 40496068474550, + 295857832528069, + 82089252618900, + 21888242871839275222246405745257275088548364400416034343698203706561366673478, + 21888242871839275222246405745257275088548364400416034343698204063400341772162, + 21888242871839275222246405745257275088548364400416034343698204158344241706918, + 21888242871839275222246405745257275088548364400416034343698203655481127959327, + 21888242871839275222246405745257275088548364400416034343698203843322248536155, + 383480149409429, + 120014540319118, + 290703464542149, + 21888242871839275222246405745257275088548364400416034343698203875290911357917, + 21888242871839275222246405745257275088548364400416034343698204165034606585790, + 21888242871839275222246405745257275088548364400416034343698203827601614595433, + 21888242871839275222246405745257275088548364400416034343698204093399706981645, + 21888242871839275222246405745257275088548364400416034343698203754831869805220, + 521262832533656, + 397451837714887, + 156775119174100, + 21888242871839275222246405745257275088548364400416034343698203865155530903952, + 35258168825837, + 21888242871839275222246405745257275088548364400416034343698204086342724595542, + 21888242871839275222246405745257275088548364400416034343698204046544730095138, + 21888242871839275222246405745257275088548364400416034343698203947677209602306, + 91558313551888, + 23822485423623, + 21888242871839275222246405745257275088548364400416034343698204144508542169555, + 21888242871839275222246405745257275088548364400416034343698203943699560629972, + 21888242871839275222246405745257275088548364400416034343698203705648437601546, + 21888242871839275222246405745257275088548364400416034343698204045600808550196, + 21888242871839275222246405745257275088548364400416034343698203823445047945456, + 510183980912787, + 56546985271436, + 21888242871839275222246405745257275088548364400416034343698203871624097594088, + 422014540265301, + 21888242871839275222246405745257275088548364400416034343698203979180150595818, + 45958628170239, + 323058690347843, + 255657960363728, + 21888242871839275222246405745257275088548364400416034343698203715853221815711, + 21888242871839275222246405745257275088548364400416034343698203698148874460742, + 381172065143690, + 21888242871839275222246405745257275088548364400416034343698203641113577665568, + 21888242871839275222246405745257275088548364400416034343698203866239628495038, + 21888242871839275222246405745257275088548364400416034343698203654589966334379, + 479991381738019, + 21888242871839275222246405745257275088548364400416034343698203932264314445965, + 21888242871839275222246405745257275088548364400416034343698204144611987424484, + 21888242871839275222246405745257275088548364400416034343698203916146103925001, + 21888242871839275222246405745257275088548364400416034343698203968501432772845, + 142657305471950, + 21888242871839275222246405745257275088548364400416034343698203833335367354969, + 21888242871839275222246405745257275088548364400416034343698204094825099891448, + 21888242871839275222246405745257275088548364400416034343698203730950292394150, + 21888242871839275222246405745257275088548364400416034343698203671664829413133, + 393718611424898, + 21888242871839275222246405745257275088548364400416034343698203861724833468246, + 111902331193421, + 491409480133486, + 21888242871839275222246405745257275088548364400416034343698203803673477829666, + 21888242871839275222246405745257275088548364400416034343698203639989817666943, + 21888242871839275222246405745257275088548364400416034343698204010571886083426, + 333891832647153, + 342477231244893, + 128262507893314, + 21888242871839275222246405745257275088548364400416034343698203715570105900254, + 185379109577330, + 541730698861497, + 338147998566002, + 21888242871839275222246405745257275088548364400416034343698203733185499460655, + 21888242871839275222246405745257275088548364400416034343698203956889208512946, + 21888242871839275222246405745257275088548364400416034343698203707191646924460, + 244303358791118, + 21888242871839275222246405745257275088548364400416034343698203795427467351182, + 21888242871839275222246405745257275088548364400416034343698203674877675306937, + 21888242871839275222246405745257275088548364400416034343698203926937536828016, + 551185553381475, + 38420735830788, + 119003454305480, + 218833042398927, + 21888242871839275222246405745257275088548364400416034343698203991586347229784, + 21888242871839275222246405745257275088548364400416034343698203760017166305799, + 536130698598163, + 21888242871839275222246405745257275088548364400416034343698204060435844440087, + 9734329591359, + 21888242871839275222246405745257275088548364400416034343698203888765021579319, + 21888242871839275222246405745257275088548364400416034343698204121118299824958, + 11311808527358, + 21888242871839275222246405745257275088548364400416034343698203924356433767320, + 443150954343263, + 21888242871839275222246405745257275088548364400416034343698203833263966668800, + 21888242871839275222246405745257275088548364400416034343698203710773290707280, + 21888242871839275222246405745257275088548364400416034343698203833239690686421, + 148905585057471, + 21888242871839275222246405745257275088548364400416034343698203910834025254008, + 21888242871839275222246405745257275088548364400416034343698203996329739844490, + 21888242871839275222246405745257275088548364400416034343698204184188883269938, + 353399326304646, + 21888242871839275222246405745257275088548364400416034343698204062047390151570, + 21888242871839275222246405745257275088548364400416034343698203651901389407925, + 426977186249903, + 83851134855774, + 21888242871839275222246405745257275088548364400416034343698204142428127234312, + 21888242871839275222246405745257275088548364400416034343698204096918364916271, + 21888242871839275222246405745257275088548364400416034343698204120504383186437, + 215218865568837, + 21888242871839275222246405745257275088548364400416034343698204146679366515141, + 152238192503040, + 522681280347293, + 21888242871839275222246405745257275088548364400416034343698203939169314388735, + 15366681361931, + 20439433451735, + 21888242871839275222246405745257275088548364400416034343698204111771606728041, + 21888242871839275222246405745257275088548364400416034343698203752005492520114, + 61096109884213, + 21888242871839275222246405745257275088548364400416034343698204163046305363317, + 555817854321252, + 74511041808908, + 21888242871839275222246405745257275088548364400416034343698203876018536262206, + 21888242871839275222246405745257275088548364400416034343698203869812180422551, + 497858800838934, + 305210185963111, + 21888242871839275222246405745257275088548364400416034343698203934881319949935, + 99204234925454, + 335715351767515, + 480424783302659, + 21888242871839275222246405745257275088548364400416034343698203819115343646569, + 21888242871839275222246405745257275088548364400416034343698203797894322790257, + 137447304203653, + 476817356986396, + 193142521821710, + 21888242871839275222246405745257275088548364400416034343698203833329472895019, + 549099018227603, + 555910003977590, + 21888242871839275222246405745257275088548364400416034343698203956884749664569, + 21888242871839275222246405745257275088548364400416034343698203948788503710916, + 227303309587097, + 21888242871839275222246405745257275088548364400416034343698203793221563330560, + 468086540440269, + 9195857221529, + 21888242871839275222246405745257275088548364400416034343698203993882485334367, + 197062776431744, + 21888242871839275222246405745257275088548364400416034343698203684467906701106, + 198436823037094, + 21888242871839275222246405745257275088548364400416034343698203847813552955795, + 125236437170574, + 21888242871839275222246405745257275088548364400416034343698203783847716269311, + 67829771833899, + 21888242871839275222246405745257275088548364400416034343698203644126977912390, + 173317150944263, + 21888242871839275222246405745257275088548364400416034343698204088375461453825, + 259172745251286, + 21888242871839275222246405745257275088548364400416034343698203945785106868837, + 21888242871839275222246405745257275088548364400416034343698203829713540112398, + 21888242871839275222246405745257275088548364400416034343698203874892833119389, + 147133531171809, + 21888242871839275222246405745257275088548364400416034343698203855730673492325, + 213254460874400, + 101009498663100, + 253372326992581, + 172811015556870, + 145483961183978, + 482483519294438, + 21888242871839275222246405745257275088548364400416034343698203720108178249392, + 21888242871839275222246405745257275088548364400416034343698204116178563983502, + 214984151228155, + 21888242871839275222246405745257275088548364400416034343698203840713462778745, + 21888242871839275222246405745257275088548364400416034343698203767828428806398, + 21888242871839275222246405745257275088548364400416034343698203659843594492847, + 21888242871839275222246405745257275088548364400416034343698203644128535276843, + 253237021019250, + 492693915419539, + 21888242871839275222246405745257275088548364400416034343698203736268297024756, + 21888242871839275222246405745257275088548364400416034343698204028278572053671, + 21888242871839275222246405745257275088548364400416034343698203897758922140021, + 492226615993511, + 216879091850358, + 334801028376549, + 21888242871839275222246405745257275088548364400416034343698203994588234115433, + 21888242871839275222246405745257275088548364400416034343698203743194725580950, + 21888242871839275222246405745257275088548364400416034343698204177090490474377, + 339055886183567, + 21888242871839275222246405745257275088548364400416034343698203920396303405068, + 283775671377231, + 21888242871839275222246405745257275088548364400416034343698204141308890764927, + 414626242767696, + 21888242871839275222246405745257275088548364400416034343698203628547250988492, + 21888242871839275222246405745257275088548364400416034343698203645186385965662, + 21888242871839275222246405745257275088548364400416034343698203954849139996673, + 21888242871839275222246405745257275088548364400416034343698203983836858146326, + 547674729935029, + 552022050384454, + 271296753034973, + 21888242871839275222246405745257275088548364400416034343698203880836208789942, + 241882733044960, + 408263583426224, + 166522622815012, + 172421187066674, + 21888242871839275222246405745257275088548364400416034343698204083973190051780, + 265174068851561, + 404042167104945, + 12012020894979, + 21888242871839275222246405745257275088548364400416034343698203906033950089059, + 6361892930549, + 483631119855219, + 21888242871839275222246405745257275088548364400416034343698203636929716437734, + 21888242871839275222246405745257275088548364400416034343698203692959481498116, + 397263772075608, + 21888242871839275222246405745257275088548364400416034343698203791018868475911, + 21888242871839275222246405745257275088548364400416034343698203778538164108736, + 424213677378607, + 449834615305216, + 468547034664109, + 21888242871839275222246405745257275088548364400416034343698203891957978428317, + 409918800892427, + 21888242871839275222246405745257275088548364400416034343698204009387916680251, + 21888242871839275222246405745257275088548364400416034343698203859361954798103, + 21888242871839275222246405745257275088548364400416034343698204018199733777585, + 21888242871839275222246405745257275088548364400416034343698203917757619215335, + 21888242871839275222246405745257275088548364400416034343698203669913825387096, + 244840677297635, + 21888242871839275222246405745257275088548364400416034343698203962547181828049, + 352183752116954, + 67263438142759, + 21888242871839275222246405745257275088548364400416034343698203724335999799589, + 21888242871839275222246405745257275088548364400416034343698203720941194600816, + 360051169855359, + 294249843667342, + 255760549722615, + 21888242871839275222246405745257275088548364400416034343698204182080226030994, + 21888242871839275222246405745257275088548364400416034343698203923617993491620, + 300537038882722, + 384170147224600, + 21888242871839275222246405745257275088548364400416034343698203714616985551806, + 208965222680067, + 21888242871839275222246405745257275088548364400416034343698204012495100997269, + 414433288464274, + 21888242871839275222246405745257275088548364400416034343698203651527271871779, + 21888242871839275222246405745257275088548364400416034343698204036641942419415, + 21888242871839275222246405745257275088548364400416034343698203635101294429674, + 21888242871839275222246405745257275088548364400416034343698203985081253198034, + 21888242871839275222246405745257275088548364400416034343698203765139718178402, + 21888242871839275222246405745257275088548364400416034343698203655264754672947, + 173431487679307, + 21888242871839275222246405745257275088548364400416034343698203908747686351371, + 21888242871839275222246405745257275088548364400416034343698203844960738369429, + 274488457027722, + 21888242871839275222246405745257275088548364400416034343698204134297258779877, + 21888242871839275222246405745257275088548364400416034343698203906008696551006, + 21888242871839275222246405745257275088548364400416034343698203829782784031806, + 539657893510058, + 422234994437262, + 21888242871839275222246405745257275088548364400416034343698203752383029434346, + 242195910610598, + 21888242871839275222246405745257275088548364400416034343698203769878365293087, + 21888242871839275222246405745257275088548364400416034343698203847585925008563, + 21888242871839275222246405745257275088548364400416034343698203661634523634910, + 21888242871839275222246405745257275088548364400416034343698203716234692674281, + 21888242871839275222246405745257275088548364400416034343698203684569069173623, + 21888242871839275222246405745257275088548364400416034343698204095305138422259, + 45550366131919, + 21888242871839275222246405745257275088548364400416034343698203766041087407377, + 21888242871839275222246405745257275088548364400416034343698203997109139470128, + 21888242871839275222246405745257275088548364400416034343698203998551383063218, + 363505116312593, + 21888242871839275222246405745257275088548364400416034343698204034842364310492, + 118770407572796, + 152501554985319, + 417419962624272, + 58344678789585, + 21888242871839275222246405745257275088548364400416034343698204099128189655740, + 421859862840459, + 21888242871839275222246405745257275088548364400416034343698204114333325611549, + 21888242871839275222246405745257275088548364400416034343698203908860879857563, + 21888242871839275222246405745257275088548364400416034343698203939331888477838, + 340062779979558, + 21888242871839275222246405745257275088548364400416034343698203844458148045339, + 159574212981552, + 21888242871839275222246405745257275088548364400416034343698204085364764241123, + 21888242871839275222246405745257275088548364400416034343698203859839020910125, + 475369867759521, + 21888242871839275222246405745257275088548364400416034343698204016740154308501, + 21888242871839275222246405745257275088548364400416034343698204069589072872655, + 21888242871839275222246405745257275088548364400416034343698203671963582386874, + 21888242871839275222246405745257275088548364400416034343698203910036667981719, + 21888242871839275222246405745257275088548364400416034343698204090811383941164, + 504274812628916, + 319717857957995, + 161848608148598, + 21888242871839275222246405745257275088548364400416034343698203754038813546567, + 21888242871839275222246405745257275088548364400416034343698204180657444226012, + 129164176061677, + 560698879534604, + 21888242871839275222246405745257275088548364400416034343698203914013559162712, + 21888242871839275222246405745257275088548364400416034343698203879552320881492, + 456670657438154, + 21888242871839275222246405745257275088548364400416034343698203746829500914674, + 21888242871839275222246405745257275088548364400416034343698203783818301042192, + 21888242871839275222246405745257275088548364400416034343698203903888370154984, + 21888242871839275222246405745257275088548364400416034343698204054664568950671, + 21888242871839275222246405745257275088548364400416034343698203908126089979548, + 21888242871839275222246405745257275088548364400416034343698203645877275514366, + 298329303506162, + 35084110934227, + 276408532369490, + 275899222067403, + 21888242871839275222246405745257275088548364400416034343698203771056832002146, + 226456480794283, + 103287827242433, + 21888242871839275222246405745257275088548364400416034343698203738427386514353, + 207710795888534, + 263326966378075, + 81372754518986, + 21888242871839275222246405745257275088548364400416034343698203804628934737738, + 21888242871839275222246405745257275088548364400416034343698203828064195491296, + 21888242871839275222246405745257275088548364400416034343698203825429659585519, + 3492254208322, + 97382544067439, + 179845621546878, + 21888242871839275222246405745257275088548364400416034343698203837941195505194, + 344182209963463, + 393935253358805, + 264416001538155, + 21888242871839275222246405745257275088548364400416034343698203941338830744551, + 527272952909615, + 410606166092187, + 286499793195246, + 500777635643669, + 482955750444758, + 21888242871839275222246405745257275088548364400416034343698203943836630742715, + 12763838275668, + 400458853964401, + 21888242871839275222246405745257275088548364400416034343698203696661579536394, + 143574429928418, + 21888242871839275222246405745257275088548364400416034343698203885007641517291, + 541794747126641, + 21888242871839275222246405745257275088548364400416034343698203676756833880905, + 107608167018434, + 21888242871839275222246405745257275088548364400416034343698203782475773376105, + 137223360966730, + 404476961250175, + 21888242871839275222246405745257275088548364400416034343698203694265343108981, + 317366759938352, + 21888242871839275222246405745257275088548364400416034343698203962992197080062, + 21888242871839275222246405745257275088548364400416034343698204116188532221723, + 21888242871839275222246405745257275088548364400416034343698203739926825154978, + 21888242871839275222246405745257275088548364400416034343698203901165230725414, + 21888242871839275222246405745257275088548364400416034343698203958193527552279, + 196807979072315, + 88007914154389, + 268820360181310, + 555812772770483, + 532002384213999, + 422686714499765, + 225045996489752, + 386235417175535, + 330885313689865, + 452827822257643, + 11166644252077, + 21888242871839275222246405745257275088548364400416034343698203996084840037869, + 21888242871839275222246405745257275088548364400416034343698203640071371133687, + 21888242871839275222246405745257275088548364400416034343698203655561364511621, + 21888242871839275222246405745257275088548364400416034343698203908716965357478, + 95346999544212, + 21888242871839275222246405745257275088548364400416034343698203857972751704979, + 20621484561815, + 366723746081842, + 21888242871839275222246405745257275088548364400416034343698204099334511043330, + 21888242871839275222246405745257275088548364400416034343698204166243701127060, + 214309951927604, + 473027653468643, + 21888242871839275222246405745257275088548364400416034343698203623654611761369, + 162717388172008, + 21888242871839275222246405745257275088548364400416034343698203700967783563406, + 21888242871839275222246405745257275088548364400416034343698204153791585599987, + 319579467406948, + 21888242871839275222246405745257275088548364400416034343698203847812191135077, + 71919352476701, + 21888242871839275222246405745257275088548364400416034343698204183010613895850, + 432159610707092, + 176833900633360, + 21888242871839275222246405745257275088548364400416034343698204078315537111655, + 510864445718221, + 21888242871839275222246405745257275088548364400416034343698203754436862898091, + 21888242871839275222246405745257275088548364400416034343698204047820463667446, + 21888242871839275222246405745257275088548364400416034343698204028727988681731, + 32770961522652, + 21888242871839275222246405745257275088548364400416034343698203643483304022665, + 21888242871839275222246405745257275088548364400416034343698204166620006968842, + 149310871332157, + 518473925039391, + 358468473973676, + 190489405776149, + 218253011685523, + 275326728993912, + 21888242871839275222246405745257275088548364400416034343698203769870162014944, + 21888242871839275222246405745257275088548364400416034343698204171691887737792, + 21888242871839275222246405745257275088548364400416034343698204080472605162908, + 21888242871839275222246405745257275088548364400416034343698203667199885423165, + 21888242871839275222246405745257275088548364400416034343698203795149736154793, + 110979266900351, + 50564194447377, + 21888242871839275222246405745257275088548364400416034343698203941350440240483, + 21888242871839275222246405745257275088548364400416034343698203813215101173921, + 21888242871839275222246405745257275088548364400416034343698204126720801384301, + 4621343007623, + 21888242871839275222246405745257275088548364400416034343698203995105606678002, + 187268746581953, + 282973911042389, + 156719685551978, + 21888242871839275222246405745257275088548364400416034343698204124117516237043, + 343605242695762, + 21888242871839275222246405745257275088548364400416034343698203997946478608740, + 21888242871839275222246405745257275088548364400416034343698204103795378334045, + 287604845096374, + 21888242871839275222246405745257275088548364400416034343698204152866935199978, + 21888242871839275222246405745257275088548364400416034343698203644954191555020, + 21888242871839275222246405745257275088548364400416034343698204082731499553386, + 21888242871839275222246405745257275088548364400416034343698203687813044596123, + 72169885443378, + 21888242871839275222246405745257275088548364400416034343698204155023337140003, + 335633986491244, + 113303651819216, + 209817865093867, + 21888242871839275222246405745257275088548364400416034343698203840134628710148, + 134496234957754, + 442791646499881, + 298153121017159, + 21888242871839275222246405745257275088548364400416034343698203688203916325956, + 191224255418212, + 21888242871839275222246405745257275088548364400416034343698204056391986821874, + 243567092877133, + 21888242871839275222246405745257275088548364400416034343698203705338622237186, + 21888242871839275222246405745257275088548364400416034343698204032372574302508, + 372148491355812, + 21888242871839275222246405745257275088548364400416034343698204138532385136658, + 326215112658735, + 21888242871839275222246405745257275088548364400416034343698203923158158973082, + 260944141742544, + 184824210388834, + 272189249236824, + 164646700982777, + 21888242871839275222246405745257275088548364400416034343698203995081416927166, + 245426819068983, + 433413936371392, + 445848699303608, + 21888242871839275222246405745257275088548364400416034343698203919916164771916, + 38017584675565, + 21888242871839275222246405745257275088548364400416034343698203757623514203315, + 21888242871839275222246405745257275088548364400416034343698203686868713248528, + 21888242871839275222246405745257275088548364400416034343698204162642172371030, + 21888242871839275222246405745257275088548364400416034343698203776212791723121, + 21888242871839275222246405745257275088548364400416034343698203994345266799230, + 162603577499174, + 69316224337566, + 21888242871839275222246405745257275088548364400416034343698203714147143147484, + 326021842487701, + 324602625813377, + 21888242871839275222246405745257275088548364400416034343698204177645394305563, + 485932920130753, + 21888242871839275222246405745257275088548364400416034343698203661263377159476, + 21888242871839275222246405745257275088548364400416034343698204087742807267152, + 514933125592155, + 21888242871839275222246405745257275088548364400416034343698203740495052101401, + 185989878858323, + 158572123050017, + 363872510921392, + 216822618965009, + 21888242871839275222246405745257275088548364400416034343698203848192203945079, + 495644580595595, + 198429293885932, + 21888242871839275222246405745257275088548364400416034343698203682715140509959, + 21888242871839275222246405745257275088548364400416034343698203804344745964630, + 222355500169084, + 349620954907887, + 21888242871839275222246405745257275088548364400416034343698203861161072723852, + 21888242871839275222246405745257275088548364400416034343698203957161412091802, + 21888242871839275222246405745257275088548364400416034343698203995446293158419, + 562403169889474, + 21888242871839275222246405745257275088548364400416034343698203644206056903368, + 21888242871839275222246405745257275088548364400416034343698203646619185348453, + 21888242871839275222246405745257275088548364400416034343698204134909239257297, + 21888242871839275222246405745257275088548364400416034343698204139320980696594, + 136318786039935, + 21888242871839275222246405745257275088548364400416034343698203768249960027613, + 21888242871839275222246405745257275088548364400416034343698203703040495645008, + 435044004590501, + 311338732762105, + 541454100450641, + 64466485395993, + 404115137620390, + 21888242871839275222246405745257275088548364400416034343698204091170564843114, + 21888242871839275222246405745257275088548364400416034343698204004461165521511, + 21888242871839275222246405745257275088548364400416034343698203864431501126762, + 431043667632613, + 21888242871839275222246405745257275088548364400416034343698203878437218071586, + 453757247647990, + 25397011067446, + 21888242871839275222246405745257275088548364400416034343698203676626828973198, + 21888242871839275222246405745257275088548364400416034343698203640060237855200, + 21888242871839275222246405745257275088548364400416034343698204161633278475095, + 21888242871839275222246405745257275088548364400416034343698203917157347631216, + 21888242871839275222246405745257275088548364400416034343698203900335869461756, + 48873785284445, + 21888242871839275222246405745257275088548364400416034343698203843520362361852, + 21888242871839275222246405745257275088548364400416034343698203678667713013172, + 21888242871839275222246405745257275088548364400416034343698203948453250525532, + 21888242871839275222246405745257275088548364400416034343698204033122196012171, + 21888242871839275222246405745257275088548364400416034343698204070066069251372, + 84085616993298, + 21888242871839275222246405745257275088548364400416034343698203631971026126127, + 500566552573242, + 21888242871839275222246405745257275088548364400416034343698204131143141601242, + 215327850205534, + 473568338947048, + 383094272704902, + 21888242871839275222246405745257275088548364400416034343698204089141302824849, + 21888242871839275222246405745257275088548364400416034343698203798183498972000, + 332080344577519, + 245322361352369, + 26579288978403, + 409600128921339, + 21888242871839275222246405745257275088548364400416034343698203884912239979333, + 21888242871839275222246405745257275088548364400416034343698204115112809488334, + 21888242871839275222246405745257275088548364400416034343698204079756864145453, + 536309078433876, + 166180931138229, + 85699171867669, + 21888242871839275222246405745257275088548364400416034343698204143473091574254, + 21888242871839275222246405745257275088548364400416034343698204077722195469588, + 182914756166460, + 21888242871839275222246405745257275088548364400416034343698203825596388318871, + 21888242871839275222246405745257275088548364400416034343698203895392603217985, + 21888242871839275222246405745257275088548364400416034343698203680413486575854, + 406161782701578, + 475728543046230, + 384507104235423, + 309592689600977, + 21888242871839275222246405745257275088548364400416034343698203829394575752507, + 104844284481639, + 424805299667363, + 339952424246794, + 21888242871839275222246405745257275088548364400416034343698203737859904754305, + 21888242871839275222246405745257275088548364400416034343698204108912509725738, + 21888242871839275222246405745257275088548364400416034343698203647051913755797, + 21888242871839275222246405745257275088548364400416034343698203640267313860070, + 275732115614897, + 495338164034185, + 167081611856411, + 530126833820146, + 46328910530535, + 21888242871839275222246405745257275088548364400416034343698203977404937385208, + 414294212620541, + 21888242871839275222246405745257275088548364400416034343698203855774188552662, + 490067978830244, + 316960757751279, + 21888242871839275222246405745257275088548364400416034343698203740537696081781, + 21888242871839275222246405745257275088548364400416034343698203884024572678713, + 529317941511610, + 21888242871839275222246405745257275088548364400416034343698203940282640204322, + 89623795291438, + 80042070199428, + 342880851426946, + 344983666698936, + 21888242871839275222246405745257275088548364400416034343698203933670543884977, + 280129248167096, + 21888242871839275222246405745257275088548364400416034343698203892055239719229, + 21888242871839275222246405745257275088548364400416034343698204072066679437802, + 21888242871839275222246405745257275088548364400416034343698203923384462878590, + 21888242871839275222246405745257275088548364400416034343698203668664493215920, + 147491463565676, + 249763397720896, + 21888242871839275222246405745257275088548364400416034343698203651053836795439, + 21888242871839275222246405745257275088548364400416034343698204029629509773263, + 21888242871839275222246405745257275088548364400416034343698203737238746899197, + 21888242871839275222246405745257275088548364400416034343698204130856483351475, + 150263658847928, + 188124100551375, + 21888242871839275222246405745257275088548364400416034343698203971712181538319, + 528097809942361, + 21888242871839275222246405745257275088548364400416034343698203923934219699743, + 407450115271160, + 274619715662599, + 21888242871839275222246405745257275088548364400416034343698204100047262507703, + 147574510494722, + 21888242871839275222246405745257275088548364400416034343698203950901468635547, + 521445051694609, + 21888242871839275222246405745257275088548364400416034343698203636709576715849, + 531053185018106, + 21888242871839275222246405745257275088548364400416034343698203676512004195848, + 21888242871839275222246405745257275088548364400416034343698203926429349027807, + 186331806544347, + 415385569880080, + 94482563314552, + 257080288852749, + 89967711911832, + 21888242871839275222246405745257275088548364400416034343698203661581529640126, + 21888242871839275222246405745257275088548364400416034343698204090595297657173, + 21888242871839275222246405745257275088548364400416034343698203624632410802369, + 317508871789650, + 21888242871839275222246405745257275088548364400416034343698204171910730043682, + 117010518163464, + 230304393620694, + 21888242871839275222246405745257275088548364400416034343698204172119722569109, + 21888242871839275222246405745257275088548364400416034343698203827509222601622, + 21888242871839275222246405745257275088548364400416034343698203905498576954529, + 21888242871839275222246405745257275088548364400416034343698203846717979152387, + 21888242871839275222246405745257275088548364400416034343698204081637979595316, + 21888242871839275222246405745257275088548364400416034343698203898163864747766, + 509317070461407, + 538851094775978, + 21888242871839275222246405745257275088548364400416034343698203733516991530909, + 233559307882915, + 21888242871839275222246405745257275088548364400416034343698203626277234520630, + 458038413865950, + 21888242871839275222246405745257275088548364400416034343698203640221882855400, + 21888242871839275222246405745257275088548364400416034343698203713569514118465, + 267599852030868, + 234158394144153, + 21888242871839275222246405745257275088548364400416034343698204084453484377879, + 356092040142101, + 21888242871839275222246405745257275088548364400416034343698203662587354862655, + 21888242871839275222246405745257275088548364400416034343698203707586714118516, + 478290303664211, + 46771154140853, + 21888242871839275222246405745257275088548364400416034343698203870921890105713, + 21888242871839275222246405745257275088548364400416034343698203629135229893882, + 21888242871839275222246405745257275088548364400416034343698203981781178823501, + 417387922705148, + 449293645551752, + 21888242871839275222246405745257275088548364400416034343698203850323400556942, + 133065632511923, + 21888242871839275222246405745257275088548364400416034343698203916894246262842, + 21888242871839275222246405745257275088548364400416034343698204084629384995436, + 484831977335778, + 17562468919360, + 21888242871839275222246405745257275088548364400416034343698204103674242897143, + 21888242871839275222246405745257275088548364400416034343698204087181841205776, + 464901678663018, + 390669349108384, + 21888242871839275222246405745257275088548364400416034343698204013261322138419, + 21888242871839275222246405745257275088548364400416034343698204023301649667982, + 21888242871839275222246405745257275088548364400416034343698203852573752917824, + 21888242871839275222246405745257275088548364400416034343698203842610869318383, + 21888242871839275222246405745257275088548364400416034343698203818792884931404, + 215001970076965, + 316274819045996, + 21888242871839275222246405745257275088548364400416034343698204061806240888653, + 79410785504279, + 21888242871839275222246405745257275088548364400416034343698204159500893928966, + 21888242871839275222246405745257275088548364400416034343698203727773786927057, + 30717104630951, + 21888242871839275222246405745257275088548364400416034343698203927266538797783, + 387099553095144, + 21888242871839275222246405745257275088548364400416034343698204035583784087091, + 21888242871839275222246405745257275088548364400416034343698203627581177893267, + 279962109203553, + 21888242871839275222246405745257275088548364400416034343698203910803203581433, + 21888242871839275222246405745257275088548364400416034343698204163961288964601, + 516825250980159, + 21888242871839275222246405745257275088548364400416034343698203948292526083827, + 21888242871839275222246405745257275088548364400416034343698204067734559080461, + 521627548140958, + 21888242871839275222246405745257275088548364400416034343698203965793201287228, + 21888242871839275222246405745257275088548364400416034343698203710530317180087, + 240390347241518, + 21888242871839275222246405745257275088548364400416034343698203897358482810143, + 94742681485271, + 7970847597989, + 21888242871839275222246405745257275088548364400416034343698203720084637731038, + 455443545991820, + 21888242871839275222246405745257275088548364400416034343698203978314120710946, + 21888242871839275222246405745257275088548364400416034343698203958473357959214, + 512317765792298, + 21888242871839275222246405745257275088548364400416034343698203662680539106073, + 304156977404217, + 21888242871839275222246405745257275088548364400416034343698203901474224950506, + 493939429845314, + 341744461079714, + 159708569932188, + 152783420843520, + 21888242871839275222246405745257275088548364400416034343698204107913500233216, + 21888242871839275222246405745257275088548364400416034343698204060278265442600, + 21888242871839275222246405745257275088548364400416034343698203837960558843032, + 287185435181978, + 18460764587538, + 21888242871839275222246405745257275088548364400416034343698203910817737466378, + 75112167382143, + 558160398529041, + 485290343781585, + 21888242871839275222246405745257275088548364400416034343698203796088957256933, + 21888242871839275222246405745257275088548364400416034343698204165773333101318, + 545863134625169, + 242558995665014, + 21888242871839275222246405745257275088548364400416034343698203876777720622885, + 21888242871839275222246405745257275088548364400416034343698203659292447839489, + 506800509811887, + 21888242871839275222246405745257275088548364400416034343698204106181178003524, + 382799307309624, + 21888242871839275222246405745257275088548364400416034343698204112503505178050, + 55664171463654, + 21888242871839275222246405745257275088548364400416034343698204122379733885831, + 407060273548178, + 21888242871839275222246405745257275088548364400416034343698204077503101784219, + 320638771052761, + 236128147785176, + 183489346651962, + 341763795772023, + 347405207881249, + 21888242871839275222246405745257275088548364400416034343698203961891385096101, + 21888242871839275222246405745257275088548364400416034343698203900575973724206, + 466247760769648, + 21888242871839275222246405745257275088548364400416034343698204173668665079061, + 21888242871839275222246405745257275088548364400416034343698204153897976808040, + 89649937124777, + 21888242871839275222246405745257275088548364400416034343698203636563974354467, + 37872242340873, + 211277021552333, + 198720089548103, + 21888242871839275222246405745257275088548364400416034343698203733747961115484, + 21888242871839275222246405745257275088548364400416034343698203886281628637143, + 73630485502101, + 21888242871839275222246405745257275088548364400416034343698204044042489393175, + 21888242871839275222246405745257275088548364400416034343698203657384179786057, + 21888242871839275222246405745257275088548364400416034343698203686148394201048, + 21888242871839275222246405745257275088548364400416034343698203914633836839470, + 276180105960681, + 21888242871839275222246405745257275088548364400416034343698204043508486011616, + 21888242871839275222246405745257275088548364400416034343698204002815756293260, + 21888242871839275222246405745257275088548364400416034343698204149278469294816, + 21888242871839275222246405745257275088548364400416034343698204181607526792435, + 21888242871839275222246405745257275088548364400416034343698203866869256131890, + 21888242871839275222246405745257275088548364400416034343698204129125412953448, + 369267940320054, + 21888242871839275222246405745257275088548364400416034343698204021120139077181, + 72999156728691, + 21888242871839275222246405745257275088548364400416034343698203900706872613086, + 214822268402851, + 21888242871839275222246405745257275088548364400416034343698203687364811471958, + 21888242871839275222246405745257275088548364400416034343698204024204537860660, + 75280466295750, + 257961586801884, + 21888242871839275222246405745257275088548364400416034343698203825965132411000, + 391464249338654, + 21888242871839275222246405745257275088548364400416034343698204166765211430298, + 21888242871839275222246405745257275088548364400416034343698203914385727524792, + 21888242871839275222246405745257275088548364400416034343698204125923848329436, + 21888242871839275222246405745257275088548364400416034343698203764655109904618, + 499462939248893, + 309719534650604, + 13494631186679, + 21888242871839275222246405745257275088548364400416034343698203887384220919758, + 336855249176576, + 263485180999301, + 251529555553912, + 518707640220788, + 172760608278633, + 21888242871839275222246405745257275088548364400416034343698204008964092858082, + 21888242871839275222246405745257275088548364400416034343698203630690824777570, + 21888242871839275222246405745257275088548364400416034343698204031178763323670, + 21888242871839275222246405745257275088548364400416034343698203778888446115174, + 21888242871839275222246405745257275088548364400416034343698204186533914831818, + 310741561919489, + 499346672300876, + 21888242871839275222246405745257275088548364400416034343698204037098378498439, + 292740680659294, + 21888242871839275222246405745257275088548364400416034343698204084241727090220, + 21888242871839275222246405745257275088548364400416034343698203957424549137873, + 21888242871839275222246405745257275088548364400416034343698203907486556856598, + 21888242871839275222246405745257275088548364400416034343698204114766835900516, + 53712228763613, + 21888242871839275222246405745257275088548364400416034343698203895178212408079, + 21888242871839275222246405745257275088548364400416034343698203752270472131368, + 21888242871839275222246405745257275088548364400416034343698203955201825899581, + 28809050698359, + 21888242871839275222246405745257275088548364400416034343698203670172381173391, + 21888242871839275222246405745257275088548364400416034343698203733025840997968, + 142895229435141, + 167419233909628, + 21888242871839275222246405745257275088548364400416034343698203718489620333155, + 21888242871839275222246405745257275088548364400416034343698203905514701714495, + 21888242871839275222246405745257275088548364400416034343698203903934196775032, + 21888242871839275222246405745257275088548364400416034343698204157760267369357, + 21888242871839275222246405745257275088548364400416034343698203815337161816934, + 21888242871839275222246405745257275088548364400416034343698203854759271267748, + 21888242871839275222246405745257275088548364400416034343698203965091602916145, + 1213795698615, + 21888242871839275222246405745257275088548364400416034343698204184508758672292, + 15261749633597, + 21888242871839275222246405745257275088548364400416034343698203955296541049544, + 464252497637563, + 21888242871839275222246405745257275088548364400416034343698203696568172980572, + 21888242871839275222246405745257275088548364400416034343698203968798125977772, + 517441612494553, + 263038525368187, + 21888242871839275222246405745257275088548364400416034343698203808977115353803, + 21888242871839275222246405745257275088548364400416034343698203887054358073674, + 21888242871839275222246405745257275088548364400416034343698203984733431843542, + 21888242871839275222246405745257275088548364400416034343698203785714125681975, + 21888242871839275222246405745257275088548364400416034343698204136469027795971, + 21888242871839275222246405745257275088548364400416034343698204064763696780987, + 465872159371357, + 28443863594023, + 30530051744055, + 21888242871839275222246405745257275088548364400416034343698203678583853007720, + 500367437237955, + 413857097578028, + 21888242871839275222246405745257275088548364400416034343698203638661602235197, + 524504429383586, + 21888242871839275222246405745257275088548364400416034343698204075061716566184, + 21888242871839275222246405745257275088548364400416034343698204096635354613186, + 331427903908707, + 21888242871839275222246405745257275088548364400416034343698204003263266207715, + 21888242871839275222246405745257275088548364400416034343698203951129140575537, + 21888242871839275222246405745257275088548364400416034343698204034399394972947, + 474118350837954, + 21888242871839275222246405745257275088548364400416034343698203763672236589141, + 101669853139742, + 21888242871839275222246405745257275088548364400416034343698203876321062327526, + 21888242871839275222246405745257275088548364400416034343698204114241084652199, + 371745926260390, + 21888242871839275222246405745257275088548364400416034343698203744500190589243, + 528198255799552, + 306386682329354, + 21888242871839275222246405745257275088548364400416034343698203777337569128304, + 21888242871839275222246405745257275088548364400416034343698204056445671010252, + 21888242871839275222246405745257275088548364400416034343698204105739863038141, + 21888242871839275222246405745257275088548364400416034343698203660873862322416, + 21888242871839275222246405745257275088548364400416034343698203777621661573619, + 203547545483854, + 162935228049082, + 21888242871839275222246405745257275088548364400416034343698203870741365177659, + 21888242871839275222246405745257275088548364400416034343698203775843899325340, + 521853314314621, + 21888242871839275222246405745257275088548364400416034343698203678678307485755, + 21888242871839275222246405745257275088548364400416034343698203933346435365872, + 21888242871839275222246405745257275088548364400416034343698203659691159469687, + 21888242871839275222246405745257275088548364400416034343698203717999720960790, + 21888242871839275222246405745257275088548364400416034343698204012653015708912, + 21888242871839275222246405745257275088548364400416034343698203810541290218048, + 21888242871839275222246405745257275088548364400416034343698203970533731195154, + 21888242871839275222246405745257275088548364400416034343698204121354287910375, + 18865671074506, + 21888242871839275222246405745257275088548364400416034343698204155184193160096, + 21888242871839275222246405745257275088548364400416034343698203959869921343153, + 320000583418689, + 21888242871839275222246405745257275088548364400416034343698203963031127336796, + 21888242871839275222246405745257275088548364400416034343698204032845537066394, + 489074968098553, + 257939934874871, + 21888242871839275222246405745257275088548364400416034343698203728560525930087, + 128228356282107, + 407505540522900, + 91495660594239, + 321735880143840, + 21888242871839275222246405745257275088548364400416034343698203689472680482352, + 21888242871839275222246405745257275088548364400416034343698203690401279039954, + 514204951543159, + 21888242871839275222246405745257275088548364400416034343698203820190040379487, + 398707695992929, + 21888242871839275222246405745257275088548364400416034343698204125895957417948, + 298976090742902, + 21888242871839275222246405745257275088548364400416034343698203988503256952166, + 63883250147043, + 21888242871839275222246405745257275088548364400416034343698203705762697905474, + 19588612708243, + 540585127491002, + 21888242871839275222246405745257275088548364400416034343698203742943328152966, + 21888242871839275222246405745257275088548364400416034343698203651805435345062, + 435701946739786, + 21888242871839275222246405745257275088548364400416034343698204094231753599748, + 21888242871839275222246405745257275088548364400416034343698203739850331023169, + 21888242871839275222246405745257275088548364400416034343698204040015341349105, + 21888242871839275222246405745257275088548364400416034343698203670767976378118, + 21888242871839275222246405745257275088548364400416034343698204071357083447328, + 21888242871839275222246405745257275088548364400416034343698203787858983246293, + 374680674282065, + 21888242871839275222246405745257275088548364400416034343698204016381988106779, + 45606697566463, + 21888242871839275222246405745257275088548364400416034343698204171544638140941, + 55425995142670, + 21888242871839275222246405745257275088548364400416034343698204042061983585625, + 21888242871839275222246405745257275088548364400416034343698203733224598703569, + 21888242871839275222246405745257275088548364400416034343698203806618224777246, + 524665868442494, + 559846875823039, + 21888242871839275222246405745257275088548364400416034343698203644327019976456, + 21888242871839275222246405745257275088548364400416034343698204173718197038006, + 332530912801270, + 21888242871839275222246405745257275088548364400416034343698204083061384454571, + 21888242871839275222246405745257275088548364400416034343698204012322997891989, + 349143954021288, + 21888242871839275222246405745257275088548364400416034343698203924066144985251, + 21888242871839275222246405745257275088548364400416034343698203631418902675289, + 21888242871839275222246405745257275088548364400416034343698203709732159332987, + 21888242871839275222246405745257275088548364400416034343698203841790670081896, + 104591639047877, + 139528557080757, + 169782314883172, + 21888242871839275222246405745257275088548364400416034343698203640517908117043, + 21888242871839275222246405745257275088548364400416034343698203727569417655840, + 411872984535425, + 21888242871839275222246405745257275088548364400416034343698203972298319156001, + 21888242871839275222246405745257275088548364400416034343698204017135909262331, + 375630537853579, + 463984198686522, + 21888242871839275222246405745257275088548364400416034343698203987395639523439, + 21888242871839275222246405745257275088548364400416034343698203870924130364811, + 484311090214069, + 130330324225036, + 21888242871839275222246405745257275088548364400416034343698204147183160540276, + 8102476010269, + 21888242871839275222246405745257275088548364400416034343698204030998334988381, + 338578781537408, + 21888242871839275222246405745257275088548364400416034343698203961970273982007, + 510813431851407, + 21888242871839275222246405745257275088548364400416034343698203895250531524009, + 21888242871839275222246405745257275088548364400416034343698203875850164044758, + 199466482387170, + 416214211312736, + 21888242871839275222246405745257275088548364400416034343698204068899079878020, + 21888242871839275222246405745257275088548364400416034343698203639065890341488, + 111345840322318, + 444330277537873, + 21888242871839275222246405745257275088548364400416034343698203723113983809991, + 21888242871839275222246405745257275088548364400416034343698203851949254993586, + 154091235351322, + 21888242871839275222246405745257275088548364400416034343698204094900015859438, + 451746699515923, + 21888242871839275222246405745257275088548364400416034343698203672103426062732, + 425615279571011, + 21888242871839275222246405745257275088548364400416034343698204182260283343855, + 457271556439590, + 21888242871839275222246405745257275088548364400416034343698204022250272833951, + 339557518397964, + 21888242871839275222246405745257275088548364400416034343698203880994636724371, + 21888242871839275222246405745257275088548364400416034343698204016197778314572, + 374793669764702, + 21888242871839275222246405745257275088548364400416034343698203972905956585235, + 21888242871839275222246405745257275088548364400416034343698203783091101486796, + 179126968774514, + 21888242871839275222246405745257275088548364400416034343698203825258067470316, + 78117785211367, + 21888242871839275222246405745257275088548364400416034343698203910705618231851, + 21888242871839275222246405745257275088548364400416034343698203989802530991699, + 167800135044483, + 21888242871839275222246405745257275088548364400416034343698203888713873312297, + 126475997974810, + 144488661207977, + 21888242871839275222246405745257275088548364400416034343698203766651020346460, + 148112295713854, + 21888242871839275222246405745257275088548364400416034343698204009865933662184, + 465920633702686, + 33317599340839, + 554205127808843, + 21888242871839275222246405745257275088548364400416034343698203854351886572680, + 21888242871839275222246405745257275088548364400416034343698203914093491246374, + 21888242871839275222246405745257275088548364400416034343698203948037518723722, + 374540240804844, + 21888242871839275222246405745257275088548364400416034343698204142195526050647, + 21888242871839275222246405745257275088548364400416034343698204161983466379614, + 93330732219522, + 406856018747082, + 21888242871839275222246405745257275088548364400416034343698203777650838381943, + 21888242871839275222246405745257275088548364400416034343698203739215539964080, + 104835643239499, + 276770331345701, + 21888242871839275222246405745257275088548364400416034343698203701437712253946, + 21888242871839275222246405745257275088548364400416034343698203799267536415968, + 21888242871839275222246405745257275088548364400416034343698203928157914309838, + 34338585610378, + 36495960213559, + 21888242871839275222246405745257275088548364400416034343698204068400088061045, + 58967261403100, + 353141067644364, + 413006879659164, + 271428879131576, + 21888242871839275222246405745257275088548364400416034343698204043121906353277, + 233468718212341, + 91386615739326, + 217767025874059, + 21888242871839275222246405745257275088548364400416034343698204146219870246462, + 428472304762059, + 109866361963967, + 21888242871839275222246405745257275088548364400416034343698203959138622846672, + 21888242871839275222246405745257275088548364400416034343698204094235743221324, + 554973438843000, + 236048769204800, + 258998551801760, + 21888242871839275222246405745257275088548364400416034343698204133097076934832, + 222911411991583, + 306492287970831, + 144648540713611, + 21888242871839275222246405745257275088548364400416034343698203716788454791033, + 531640729927021, + 478287619566206, + 213126144102989, + 159086188228493, + 21888242871839275222246405745257275088548364400416034343698203890158350075676, + 53508900288866, + 21888242871839275222246405745257275088548364400416034343698203767084072953396, + 21888242871839275222246405745257275088548364400416034343698204064320532914943, + 21888242871839275222246405745257275088548364400416034343698204016972265944551, + 21888242871839275222246405745257275088548364400416034343698203989897235871967, + 383954517072681, + 256968090206943, + 21888242871839275222246405745257275088548364400416034343698204032503418780017, + 401842740291198, + 225362100426406, + 397972225165733, + 21888242871839275222246405745257275088548364400416034343698203728095328608577, + 21888242871839275222246405745257275088548364400416034343698203993784817584529, + 8996467848845, + 21888242871839275222246405745257275088548364400416034343698204054355649503804, + 450217038119641, + 21888242871839275222246405745257275088548364400416034343698204006289850850448, + 21888242871839275222246405745257275088548364400416034343698204018820711189774, + 21888242871839275222246405745257275088548364400416034343698203939733219635187, + 66351069613651, + 21888242871839275222246405745257275088548364400416034343698203927349982964365, + 46667187005776, + 25981321984125, + 21888242871839275222246405745257275088548364400416034343698204043883415413271, + 430828599157636, + 21888242871839275222246405745257275088548364400416034343698204184996465232718, + 458563964652426, + 29494235718908, + 21888242871839275222246405745257275088548364400416034343698203813307001025443, + 21888242871839275222246405745257275088548364400416034343698203958442215361797, + 21888242871839275222246405745257275088548364400416034343698204139280813287239, + 39597426461162, + 168148110121967, + 403216033708884, + 359218714093778, + 21888242871839275222246405745257275088548364400416034343698203999150940019697, + 21888242871839275222246405745257275088548364400416034343698204142367748310722, + 21888242871839275222246405745257275088548364400416034343698203904929507346155, + 21888242871839275222246405745257275088548364400416034343698204093745699661994, + 21888242871839275222246405745257275088548364400416034343698203964874917413630, + 539092353449891, + 21888242871839275222246405745257275088548364400416034343698203694717699048757, + 562612727682073, + 151812074114316, + 21888242871839275222246405745257275088548364400416034343698203715671479351270, + 485152664326835, + 392414729487152, + 223410553063694, + 194212838042502, + 21888242871839275222246405745257275088548364400416034343698203856786115632811, + 21888242871839275222246405745257275088548364400416034343698203732860755108140, + 21888242871839275222246405745257275088548364400416034343698204069246706727272, + 501819197019975, + 26959925023502, + 114435991963621, + 21888242871839275222246405745257275088548364400416034343698203871128711180478, + 21888242871839275222246405745257275088548364400416034343698204044677077037295, + 21888242871839275222246405745257275088548364400416034343698203897453002589084, + 437510439681456, + 21888242871839275222246405745257275088548364400416034343698203737544503562517, + 21888242871839275222246405745257275088548364400416034343698203870149734779246, + 21888242871839275222246405745257275088548364400416034343698203638779804619481, + 21888242871839275222246405745257275088548364400416034343698204015456484099962, + 21888242871839275222246405745257275088548364400416034343698203708792243905856, + 21888242871839275222246405745257275088548364400416034343698203761441760419086, + 21888242871839275222246405745257275088548364400416034343698203919895653364085, + 91087046105935, + 399968336839879, + 200489208349226, + 21888242871839275222246405745257275088548364400416034343698203682385653838288, + 21888242871839275222246405745257275088548364400416034343698204064828878465215, + 109591772813353, + 21888242871839275222246405745257275088548364400416034343698203894301804431810, + 83121620100332, + 21888242871839275222246405745257275088548364400416034343698203712694254293492, + 239742309625748, + 454371629042439, + 21888242871839275222246405745257275088548364400416034343698203722716997090841, + 50424620968055, + 21888242871839275222246405745257275088548364400416034343698204032053170948001, + 483479663077292, + 21888242871839275222246405745257275088548364400416034343698203958549788098002, + 21888242871839275222246405745257275088548364400416034343698204127175683257154, + 487368418594582, + 21888242871839275222246405745257275088548364400416034343698203952905383186573, + 21888242871839275222246405745257275088548364400416034343698204022005720544439, + 99592766886412, + 21888242871839275222246405745257275088548364400416034343698203790105193840712, + 376234200424720, + 485847736994117, + 385947791677887, + 21888242871839275222246405745257275088548364400416034343698204138386876806158, + 21888242871839275222246405745257275088548364400416034343698204177331864011780, + 21888242871839275222246405745257275088548364400416034343698204134893449250127, + 21888242871839275222246405745257275088548364400416034343698203627331223054839, + 21888242871839275222246405745257275088548364400416034343698204027543040172554, + 21888242871839275222246405745257275088548364400416034343698203823686803535668, + 21888242871839275222246405745257275088548364400416034343698203965925176010468, + 21888242871839275222246405745257275088548364400416034343698204021332623922888, + 21888242871839275222246405745257275088548364400416034343698204012761215069120, + 21888242871839275222246405745257275088548364400416034343698203961946607215782, + 310552483738347, + 21888242871839275222246405745257275088548364400416034343698203993013074868086, + 487613469571044, + 21888242871839275222246405745257275088548364400416034343698203973437165979052, + 268336959021457, + 21888242871839275222246405745257275088548364400416034343698203749054799727106, + 21888242871839275222246405745257275088548364400416034343698203862356104982011, + 48955301267675, + 21888242871839275222246405745257275088548364400416034343698203647190345867109, + 142827319948466, + 13091458172873, + 21888242871839275222246405745257275088548364400416034343698203945981635805926, + 21888242871839275222246405745257275088548364400416034343698203901748691465128, + 397252069620009, + 21888242871839275222246405745257275088548364400416034343698204013175756676426, + 490238081228866, + 21888242871839275222246405745257275088548364400416034343698204119130099947739, + 21888242871839275222246405745257275088548364400416034343698204089839336683268, + 21888242871839275222246405745257275088548364400416034343698203642746268296671, + 292249756437182, + 21888242871839275222246405745257275088548364400416034343698203941971337301481, + 236115355883535, + 77086249170854, + 21888242871839275222246405745257275088548364400416034343698203776561204986819, + 21888242871839275222246405745257275088548364400416034343698203824587381751969, + 21888242871839275222246405745257275088548364400416034343698203829466948706426, + 21888242871839275222246405745257275088548364400416034343698203763940666968868, + 243319464383839, + 347484255339696, + 21888242871839275222246405745257275088548364400416034343698203957351183675808, + 296713450756942, + 509854010414914, + 21888242871839275222246405745257275088548364400416034343698203925703410425148, + 21888242871839275222246405745257275088548364400416034343698204113014491639174, + 21888242871839275222246405745257275088548364400416034343698204038019110841182, + 148268936115854, + 281533500753828, + 219186719000663, + 55539863827567, + 449571653040537, + 21888242871839275222246405745257275088548364400416034343698203982796627650184, + 457725254754900, + 21888242871839275222246405745257275088548364400416034343698204184508264151924, + 21888242871839275222246405745257275088548364400416034343698203655235707422196, + 21888242871839275222246405745257275088548364400416034343698203865508070233232, + 554542670958386, + 21888242871839275222246405745257275088548364400416034343698204123818041276981, + 21888242871839275222246405745257275088548364400416034343698203938597429388602, + 21888242871839275222246405745257275088548364400416034343698204003610621265216, + 34664198923980, + 527138141178613, + 21888242871839275222246405745257275088548364400416034343698203944929419732005, + 21888242871839275222246405745257275088548364400416034343698203703179131033847, + 30484686450640, + 21888242871839275222246405745257275088548364400416034343698203760123584032917, + 355179014351600, + 21888242871839275222246405745257275088548364400416034343698203695781508888468, + 21888242871839275222246405745257275088548364400416034343698203757299345204610, + 336209977065084, + 435376131860555, + 21888242871839275222246405745257275088548364400416034343698204119677918676907, + 551390490828735, + 21888242871839275222246405745257275088548364400416034343698204068084083903513, + 21888242871839275222246405745257275088548364400416034343698203722844289232242, + 21888242871839275222246405745257275088548364400416034343698203901045804962201, + 402308947095152, + 21888242871839275222246405745257275088548364400416034343698204099112256516678, + 21888242871839275222246405745257275088548364400416034343698203691989413584272, + 21888242871839275222246405745257275088548364400416034343698203708062312611343, + 41642586959003, + 470260157665724, + 21888242871839275222246405745257275088548364400416034343698203933714486362416, + 21888242871839275222246405745257275088548364400416034343698204058511585880356, + 21888242871839275222246405745257275088548364400416034343698204137566903843753, + 148633284262342, + 463842996618828, + 21888242871839275222246405745257275088548364400416034343698204021335940218225, + 175885568644944, + 270943433883412, + 514174586052744, + 21888242871839275222246405745257275088548364400416034343698204038776040920850, + 366248441893092, + 522117777931743, + 317276049526163, + 440800862077205, + 21888242871839275222246405745257275088548364400416034343698204011755371687928, + 21888242871839275222246405745257275088548364400416034343698203666559232188801, + 21888242871839275222246405745257275088548364400416034343698203989497178445540, + 21888242871839275222246405745257275088548364400416034343698203903421558584311, + 452737978180483, + 57492142938444, + 21888242871839275222246405745257275088548364400416034343698204028200646584244, + 200447840118212, + 195688744483832, + 378671642275819, + 71945302667785, + 21888242871839275222246405745257275088548364400416034343698203818205375548078, + 21888242871839275222246405745257275088548364400416034343698204122870409104973, + 320005341260086, + 151239778572858, + 419459553300987, + 21888242871839275222246405745257275088548364400416034343698203710272197367568, + 21888242871839275222246405745257275088548364400416034343698203740008602496805, + 21888242871839275222246405745257275088548364400416034343698204140008286476057, + 49960786282779, + 21888242871839275222246405745257275088548364400416034343698203885963509307069, + 21888242871839275222246405745257275088548364400416034343698204126144157195452, + 373267268191627, + 21888242871839275222246405745257275088548364400416034343698203942822079032398, + 145770847842352, + 21888242871839275222246405745257275088548364400416034343698203986456721339914, + 314473932808839, + 530333867112786, + 21888242871839275222246405745257275088548364400416034343698203691310850914081, + 232086904386531, + 21888242871839275222246405745257275088548364400416034343698204150117440961462, + 21888242871839275222246405745257275088548364400416034343698203962183055008095, + 21888242871839275222246405745257275088548364400416034343698203875179390386613, + 117845638377017, + 21888242871839275222246405745257275088548364400416034343698203887758877645226, + 3109811263037, + 471033336309468, + 21888242871839275222246405745257275088548364400416034343698203882314409589238, + 21888242871839275222246405745257275088548364400416034343698203718526257341438, + 458761983034954, + 21888242871839275222246405745257275088548364400416034343698203686768199679193, + 21888242871839275222246405745257275088548364400416034343698204014228155320027, + 75734756824048, + 21888242871839275222246405745257275088548364400416034343698203900151427601451, + 21888242871839275222246405745257275088548364400416034343698203623807156324747, + 349910314091881, + 64049832925777, + 9265978423467, + 50708660170952, + 21888242871839275222246405745257275088548364400416034343698203691233636936269, + 539955904533491, + 309183107939190, + 14974057746215, + 546878616337954, + 487603002244812, + 24617945173311, + 21888242871839275222246405745257275088548364400416034343698203964627352176066, + 21888242871839275222246405745257275088548364400416034343698203847579341270093, + 21888242871839275222246405745257275088548364400416034343698204172553621319422, + 21888242871839275222246405745257275088548364400416034343698203948016222087326, + 21888242871839275222246405745257275088548364400416034343698204131847234434248, + 457581959124102, + 21888242871839275222246405745257275088548364400416034343698203711910164230141, + 394151184578513, + 516639816522201, + 452050963092532, + 425292420323372, + 214774697973419, + 428554945284358, + 21888242871839275222246405745257275088548364400416034343698203921153094143879, + 21888242871839275222246405745257275088548364400416034343698203713962089068722, + 21888242871839275222246405745257275088548364400416034343698203717643879855311, + 212720806018977, + 507131213934620, + 21888242871839275222246405745257275088548364400416034343698204083995580467926, + 560224682667954, + 21888242871839275222246405745257275088548364400416034343698203736165058631218, + 18155595109263, + 93079402409546, + 21888242871839275222246405745257275088548364400416034343698203652082824636335, + 21888242871839275222246405745257275088548364400416034343698203789699646478532, + 21888242871839275222246405745257275088548364400416034343698203913931543140124, + 21888242871839275222246405745257275088548364400416034343698204119659622493796, + 21888242871839275222246405745257275088548364400416034343698203747501710161048, + 153537846065515, + 231154188747947, + 84079406065622, + 206575515167280, + 21888242871839275222246405745257275088548364400416034343698203943079621366058, + 21888242871839275222246405745257275088548364400416034343698203752345929637103, + 21888242871839275222246405745257275088548364400416034343698203786555866019599, + 21888242871839275222246405745257275088548364400416034343698203835612821537070, + 1230259712650, + 505998416244850, + 21888242871839275222246405745257275088548364400416034343698203824031770583209, + 66271313214980, + 479358147126320, + 21888242871839275222246405745257275088548364400416034343698203861152687791484, + 21888242871839275222246405745257275088548364400416034343698203710759838352987, + 21888242871839275222246405745257275088548364400416034343698204044823334115284, + 21888242871839275222246405745257275088548364400416034343698204113947133465951, + 21888242871839275222246405745257275088548364400416034343698203966327214469139, + 21888242871839275222246405745257275088548364400416034343698204059927530763706, + 21888242871839275222246405745257275088548364400416034343698203665151249276870, + 21888242871839275222246405745257275088548364400416034343698203682322914820619, + 21888242871839275222246405745257275088548364400416034343698203644973937665738, + 21888242871839275222246405745257275088548364400416034343698203942992502439904, + 21888242871839275222246405745257275088548364400416034343698203702379831969216, + 21888242871839275222246405745257275088548364400416034343698203667953595039003, + 21888242871839275222246405745257275088548364400416034343698203958966847374168, + 545590850561525, + 99876971775589, + 21888242871839275222246405745257275088548364400416034343698203766112937607053, + 21888242871839275222246405745257275088548364400416034343698204034730757779199, + 21888242871839275222246405745257275088548364400416034343698204021650852421181, + 21888242871839275222246405745257275088548364400416034343698203883563619684055, + 491657255293813, + 373070458503717, + 21888242871839275222246405745257275088548364400416034343698203727143660685092, + 21888242871839275222246405745257275088548364400416034343698203998601964595724, + 386783576243739, + 292874758777149, + 388454987670016, + 21888242871839275222246405745257275088548364400416034343698203628413427314870, + 509212973282205, + 455456731736447, + 21888242871839275222246405745257275088548364400416034343698203828084881058903, + 21888242871839275222246405745257275088548364400416034343698204144255494064212, + 389093790542938, + 130493633562860, + 21888242871839275222246405745257275088548364400416034343698204053588323197874, + 21888242871839275222246405745257275088548364400416034343698204145483929420188, + 391996027971345, + 424602500734410, + 21888242871839275222246405745257275088548364400416034343698203827208229269330, + 21888242871839275222246405745257275088548364400416034343698203881230388932529, + 21888242871839275222246405745257275088548364400416034343698204143243344611379, + 427118000738486, + 266462862283379, + 21888242871839275222246405745257275088548364400416034343698203991847114024309, + 21888242871839275222246405745257275088548364400416034343698204061328186513771, + 21888242871839275222246405745257275088548364400416034343698203632808001156266, + 21888242871839275222246405745257275088548364400416034343698204122933041175893, + 21888242871839275222246405745257275088548364400416034343698203679183919613161, + 21888242871839275222246405745257275088548364400416034343698203945733726329711, + 34220489162974, + 21888242871839275222246405745257275088548364400416034343698203855028702360591, + 348329190018598, + 281011019968468, + 487622573273851, + 21888242871839275222246405745257275088548364400416034343698203676667023038310, + 301479075769114, + 21888242871839275222246405745257275088548364400416034343698203880573648059809, + 203977903262768, + 21888242871839275222246405745257275088548364400416034343698203871559049237287, + 511356809196813, + 319539998977878, + 21888242871839275222246405745257275088548364400416034343698203865336328777627, + 21888242871839275222246405745257275088548364400416034343698203634679166631044, + 404509331383806, + 21888242871839275222246405745257275088548364400416034343698203945723465514404, + 272941019399791, + 21888242871839275222246405745257275088548364400416034343698203776176432462628, + 21888242871839275222246405745257275088548364400416034343698203751510067943730, + 248826288294951, + 21888242871839275222246405745257275088548364400416034343698203892037474011242, + 21888242871839275222246405745257275088548364400416034343698204137632092300911, + 21888242871839275222246405745257275088548364400416034343698203696492986903682, + 76893281041085, + 21888242871839275222246405745257275088548364400416034343698204079385729486573, + 21888242871839275222246405745257275088548364400416034343698203720998693648348, + 21888242871839275222246405745257275088548364400416034343698204149639567773432, + 21888242871839275222246405745257275088548364400416034343698204009523835405045, + 21888242871839275222246405745257275088548364400416034343698203931611362482940, + 8637495653697, + 475225821814755, + 196105716088177, + 21888242871839275222246405745257275088548364400416034343698203955808746997898, + 257031618696335, + 21888242871839275222246405745257275088548364400416034343698203774922968320255, + 21888242871839275222246405745257275088548364400416034343698203873167816585684, + 21888242871839275222246405745257275088548364400416034343698203723632811473769, + 73712414338190, + 21888242871839275222246405745257275088548364400416034343698203818751782620378, + 194398369210346, + 21888242871839275222246405745257275088548364400416034343698203937861218545025, + 21888242871839275222246405745257275088548364400416034343698203971628635279955, + 531054844561744, + 174985622846964, + 114773952148590, + 355380664030035, + 245880783347691, + 21888242871839275222246405745257275088548364400416034343698203796859532389212, + 260940612038331, + 21888242871839275222246405745257275088548364400416034343698203626971841780041, + 21888242871839275222246405745257275088548364400416034343698203779420166064300, + 21888242871839275222246405745257275088548364400416034343698203767530329591251, + 493552941888956, + 219669632918933, + 117857651331036, + 21888242871839275222246405745257275088548364400416034343698204035717645102823, + 21888242871839275222246405745257275088548364400416034343698203793650652749597, + 21888242871839275222246405745257275088548364400416034343698204124918428182595, + 21888242871839275222246405745257275088548364400416034343698203847931485196261, + 21888242871839275222246405745257275088548364400416034343698204056179998895551, + 21888242871839275222246405745257275088548364400416034343698203688755077048713, + 21888242871839275222246405745257275088548364400416034343698203772868099408231, + 21888242871839275222246405745257275088548364400416034343698203645774564996158, + 21888242871839275222246405745257275088548364400416034343698203819049096296140, + 391657947277821, + 359521597253695, + 430000179996738, + 508973160616169, + 21888242871839275222246405745257275088548364400416034343698203644196631360320, + 21888242871839275222246405745257275088548364400416034343698203945260332096130, + 108583047121049, + 21888242871839275222246405745257275088548364400416034343698203656141651206997, + 278738733471389, + 101677173992747, + 323453431209039, + 53864886205483, + 42243505558356, + 551696390378089, + 21888242871839275222246405745257275088548364400416034343698204084685516297161, + 436847697657744, + 96284718275241, + 44262486845957, + 281846865447331, + 21888242871839275222246405745257275088548364400416034343698203691937520929907, + 21888242871839275222246405745257275088548364400416034343698203702882260449046, + 21888242871839275222246405745257275088548364400416034343698204104436526923253, + 532244965987845, + 141511387244804, + 330919151101120, + 135765639553195, + 21888242871839275222246405745257275088548364400416034343698203693900802694258, + 21888242871839275222246405745257275088548364400416034343698204001564769755190, + 21888242871839275222246405745257275088548364400416034343698203945565054118092, + 531166952452911, + 21888242871839275222246405745257275088548364400416034343698204033482267572791, + 151467592813880, + 172738245876806, + 21888242871839275222246405745257275088548364400416034343698203689730490793279, + 21888242871839275222246405745257275088548364400416034343698203661373853522856, + 21888242871839275222246405745257275088548364400416034343698203693036822068621, + 21888242871839275222246405745257275088548364400416034343698203626667729926948, + 21888242871839275222246405745257275088548364400416034343698204183825459676004, + 21888242871839275222246405745257275088548364400416034343698203893834807236611, + 134520360014976, + 311588653671352, + 486172566593095, + 107172621769717, + 21888242871839275222246405745257275088548364400416034343698203764776617232358, + 140873396947494, + 272699299686203, + 21888242871839275222246405745257275088548364400416034343698203844025668838353, + 424879129426724, + 21888242871839275222246405745257275088548364400416034343698203743276109973104, + 21888242871839275222246405745257275088548364400416034343698203707757786490969, + 21888242871839275222246405745257275088548364400416034343698203667667889597618, + 201101980914790, + 459243886351252, + 530280284939655, + 21888242871839275222246405745257275088548364400416034343698203861171537032571, + 154180715879222, + 510566454552923, + 21888242871839275222246405745257275088548364400416034343698203961131328865613, + 292031509476996, + 542925252836629, + 398461921741720, + 21888242871839275222246405745257275088548364400416034343698203801497926083754, + 351415903142881, + 389301851932931, + 139276382860969, + 21888242871839275222246405745257275088548364400416034343698204104793374511398, + 21888242871839275222246405745257275088548364400416034343698203723183282186608, + 440742610653174, + 21888242871839275222246405745257275088548364400416034343698203633609890095389, + 21888242871839275222246405745257275088548364400416034343698204106969641803883, + 21888242871839275222246405745257275088548364400416034343698203732455914695096, + 21888242871839275222246405745257275088548364400416034343698203800905934858396, + 44995462287148, + 301785125482391, + 357608852712322, + 166791925978046, + 21888242871839275222246405745257275088548364400416034343698204005525208360373, + 185285625809593, + 543150310969336, + 21888242871839275222246405745257275088548364400416034343698203670152963217425, + 173946878710027, + 354045058829466, + 21888242871839275222246405745257275088548364400416034343698203773805149633294, + 539540869357404, + 21888242871839275222246405745257275088548364400416034343698204010010364769435, + 60933175000226, + 21888242871839275222246405745257275088548364400416034343698203911389009580380, + 21888242871839275222246405745257275088548364400416034343698203937259565383398, + 335162322591034, + 21888242871839275222246405745257275088548364400416034343698203847801719835587, + 214291986676951, + 21888242871839275222246405745257275088548364400416034343698204138460166066980, + 21888242871839275222246405745257275088548364400416034343698203677152272906483, + 467100777682091, + 500256397794259, + 21888242871839275222246405745257275088548364400416034343698204082427194848663, + 441338905453723, + 21888242871839275222246405745257275088548364400416034343698203687519411410110, + 21888242871839275222246405745257275088548364400416034343698204020400336050997, + 21888242871839275222246405745257275088548364400416034343698203881182114194675, + 259494960816965, + 197478113384298, + 352442097104843, + 279039325958479, + 452321542443166, + 21888242871839275222246405745257275088548364400416034343698203713162456545149, + 252025230916764, + 21888242871839275222246405745257275088548364400416034343698203751492788462093, + 213653718611945, + 21888242871839275222246405745257275088548364400416034343698204084234066638126, + 21888242871839275222246405745257275088548364400416034343698204027030300638639, + 21888242871839275222246405745257275088548364400416034343698203941424738424094, + 21888242871839275222246405745257275088548364400416034343698203936967407006974, + 173950973225675, + 21888242871839275222246405745257275088548364400416034343698203819439308207419, + 21888242871839275222246405745257275088548364400416034343698203978126244033341, + 21888242871839275222246405745257275088548364400416034343698203760552800872707, + 21888242871839275222246405745257275088548364400416034343698203955419413176520, + 21888242871839275222246405745257275088548364400416034343698203960489372789640, + 21888242871839275222246405745257275088548364400416034343698203886572822278684, + 493092985555160, + 21888242871839275222246405745257275088548364400416034343698204149883377750837, + 430048390116849, + 21888242871839275222246405745257275088548364400416034343698203997037342690782, + 21888242871839275222246405745257275088548364400416034343698203679439853447298, + 546272144219774, + 50755479045765, + 21888242871839275222246405745257275088548364400416034343698204124871738157604, + 21888242871839275222246405745257275088548364400416034343698204169987623285329, + 495300878030881, + 188254842707434, + 21888242871839275222246405745257275088548364400416034343698203999197432828380, + 409276363939339, + 548424492543041, + 21888242871839275222246405745257275088548364400416034343698203981146444296282, + 240478711856847, + 21888242871839275222246405745257275088548364400416034343698203857222042739981, + 560552949611211, + 21888242871839275222246405745257275088548364400416034343698204021895188412654, + 40305670445014, + 451120380207999, + 412938991540871, + 21888242871839275222246405745257275088548364400416034343698203963827357452495, + 80041105729917, + 21888242871839275222246405745257275088548364400416034343698203777032550083342, + 291021495004230, + 21888242871839275222246405745257275088548364400416034343698203811525111457695, + 21888242871839275222246405745257275088548364400416034343698204183542376527514, + 143825345209664, + 21888242871839275222246405745257275088548364400416034343698204019220441575609, + 21888242871839275222246405745257275088548364400416034343698203838811799350190, + 21888242871839275222246405745257275088548364400416034343698204021962549873076, + 21888242871839275222246405745257275088548364400416034343698203765107325051161, + 21888242871839275222246405745257275088548364400416034343698203941424830602200, + 21888242871839275222246405745257275088548364400416034343698203860315506807684, + 326296483935802, + 21888242871839275222246405745257275088548364400416034343698204136129976261645, + 21888242871839275222246405745257275088548364400416034343698204027982473393856, + 263510697945740, + 21888242871839275222246405745257275088548364400416034343698203769892913800634, + 21888242871839275222246405745257275088548364400416034343698203921608543564702, + 21888242871839275222246405745257275088548364400416034343698203779737170229866, + 68467812946236, + 156097147845648, + 45861700191388, + 7324615128499, + 260829896300062, + 21888242871839275222246405745257275088548364400416034343698204093643893220760, + 21888242871839275222246405745257275088548364400416034343698203943150955900242, + 21888242871839275222246405745257275088548364400416034343698203952054099449619, + 217198246840210, + 114730483786887, + 21888242871839275222246405745257275088548364400416034343698203840251822153462, + 430601475966156, + 21888242871839275222246405745257275088548364400416034343698203804292375488448, + 21888242871839275222246405745257275088548364400416034343698203995157835540129, + 21888242871839275222246405745257275088548364400416034343698203926810406178996, + 21888242871839275222246405745257275088548364400416034343698203841006342238735, + 21888242871839275222246405745257275088548364400416034343698203874406119799397, + 21888242871839275222246405745257275088548364400416034343698204021586189620696, + 21888242871839275222246405745257275088548364400416034343698203742019028884534, + 21888242871839275222246405745257275088548364400416034343698203962636004604015, + 556796417803988, + 138433523002127, + 21888242871839275222246405745257275088548364400416034343698203666819056840749, + 540896253265077, + 21888242871839275222246405745257275088548364400416034343698203888306555392175, + 21888242871839275222246405745257275088548364400416034343698203708182862652375, + 179504752061882, + 515322077426048, + 21888242871839275222246405745257275088548364400416034343698203677734638144294, + 21888242871839275222246405745257275088548364400416034343698204005875606268946, + 491342426209625, + 527555343847720, + 142651679007134, + 21888242871839275222246405745257275088548364400416034343698204132359406790805, + 73656616244788, + 318937961175097, + 21888242871839275222246405745257275088548364400416034343698203632426943808462, + 551921348034808, + 21888242871839275222246405745257275088548364400416034343698204038419417165526, + 21888242871839275222246405745257275088548364400416034343698203797855742748768, + 98630650072188, + 247251118528483, + 21888242871839275222246405745257275088548364400416034343698203842545820127237, + 21888242871839275222246405745257275088548364400416034343698203831792934867298, + 120313246647341, + 153478397089567, + 21888242871839275222246405745257275088548364400416034343698203676130259144080, + 21888242871839275222246405745257275088548364400416034343698203934604867673502, + 43166045142912, + 21888242871839275222246405745257275088548364400416034343698204099004188180734, + 21888242871839275222246405745257275088548364400416034343698203809537693550026, + 21888242871839275222246405745257275088548364400416034343698204030737090051418, + 21888242871839275222246405745257275088548364400416034343698204080420345013099, + 21888242871839275222246405745257275088548364400416034343698203823970995748892, + 21888242871839275222246405745257275088548364400416034343698203892050429743332, + 275741269429515, + 21888242871839275222246405745257275088548364400416034343698203754211393027162, + 21888242871839275222246405745257275088548364400416034343698204132683658518639, + 21888242871839275222246405745257275088548364400416034343698203645851066363636, + 352459171843490, + 345936016318884, + 21888242871839275222246405745257275088548364400416034343698203637201325901103, + 21888242871839275222246405745257275088548364400416034343698203995272726517299, + 21888242871839275222246405745257275088548364400416034343698203805344056537515, + 21888242871839275222246405745257275088548364400416034343698204026493045029779, + 21888242871839275222246405745257275088548364400416034343698203854805614782043, + 21888242871839275222246405745257275088548364400416034343698204176534957520003, + 100035905684850, + 223238125439834, + 521842521387437, + 21888242871839275222246405745257275088548364400416034343698203863591695479300, + 299335974015817, + 479085118445614, + 21888242871839275222246405745257275088548364400416034343698203986166947016674, + 21888242871839275222246405745257275088548364400416034343698203749435280975590, + 21888242871839275222246405745257275088548364400416034343698203814904876352257, + 21888242871839275222246405745257275088548364400416034343698203689621227884621, + 21888242871839275222246405745257275088548364400416034343698203771720467771065, + 21888242871839275222246405745257275088548364400416034343698204004685267376945, + 21888242871839275222246405745257275088548364400416034343698204039997095956033, + 21888242871839275222246405745257275088548364400416034343698204029583449712619, + 21888242871839275222246405745257275088548364400416034343698203993303093899900, + 324039194518892, + 21888242871839275222246405745257275088548364400416034343698204036293267694177, + 503695327146551, + 21888242871839275222246405745257275088548364400416034343698203762214128225333, + 292980318436943, + 21888242871839275222246405745257275088548364400416034343698203816382661048301, + 231388704247034, + 391542440236606, + 21888242871839275222246405745257275088548364400416034343698204121862904432780, + 21888242871839275222246405745257275088548364400416034343698203722345131540338, + 21888242871839275222246405745257275088548364400416034343698203641130652375377, + 398138899611345, + 99475439661791, + 161099493274956, + 21888242871839275222246405745257275088548364400416034343698204164261882073701, + 21888242871839275222246405745257275088548364400416034343698203709354237306202, + 21888242871839275222246405745257275088548364400416034343698203919577408933020, + 543163299000737, + 447243975876962, + 21888242871839275222246405745257275088548364400416034343698203638580795094888, + 175298028002154, + 150869390132222, + 21888242871839275222246405745257275088548364400416034343698203709917336491741, + 310364375263221, + 21888242871839275222246405745257275088548364400416034343698203733118512875807, + 21888242871839275222246405745257275088548364400416034343698203656981458270673, + 455804104294658, + 35940809835118, + 242086951934643, + 21888242871839275222246405745257275088548364400416034343698203849404914677864, + 21888242871839275222246405745257275088548364400416034343698204008164790743880, + 21888242871839275222246405745257275088548364400416034343698203633539978347861, + 21888242871839275222246405745257275088548364400416034343698203750097172687221, + 404325629988325, + 21888242871839275222246405745257275088548364400416034343698203859138087290371, + 21888242871839275222246405745257275088548364400416034343698203685190245714895, + 376121628175877, + 518912420506503, + 87307644196545, + 21888242871839275222246405745257275088548364400416034343698203932751864827530, + 21888242871839275222246405745257275088548364400416034343698203841066779678805, + 496531650196337, + 21888242871839275222246405745257275088548364400416034343698204052713335884806, + 21888242871839275222246405745257275088548364400416034343698203987062647599473, + 21888242871839275222246405745257275088548364400416034343698204098478141431669, + 21888242871839275222246405745257275088548364400416034343698203855865222575467, + 23986473854779, + 135895073114759, + 21888242871839275222246405745257275088548364400416034343698204015680267316548, + 257650906471463, + 479690334856413, + 21888242871839275222246405745257275088548364400416034343698203712637751943545, + 21888242871839275222246405745257275088548364400416034343698203766544510128893, + 85449592110937, + 21888242871839275222246405745257275088548364400416034343698204107397968617677, + 21888242871839275222246405745257275088548364400416034343698203711526535579511, + 326711818126457, + 83624154307286, + 21888242871839275222246405745257275088548364400416034343698204147846645789456, + 72807885727055, + 232946533392108, + 61551452008042, + 21888242871839275222246405745257275088548364400416034343698204114190537624270, + 21888242871839275222246405745257275088548364400416034343698203846469951739032, + 253248610123469, + 21888242871839275222246405745257275088548364400416034343698203663556348195831, + 21888242871839275222246405745257275088548364400416034343698203845685658583916, + 31369872402490, + 21888242871839275222246405745257275088548364400416034343698203819099763154205, + 25329882929791, + 434616269025438, + 77069720392272, + 355477368342371, + 21888242871839275222246405745257275088548364400416034343698203826258493375704, + 392478846768295, + 21888242871839275222246405745257275088548364400416034343698204032926547879158, + 21888242871839275222246405745257275088548364400416034343698204052010671010196, + 21888242871839275222246405745257275088548364400416034343698203792257235390832, + 21888242871839275222246405745257275088548364400416034343698203898620665091356, + 21888242871839275222246405745257275088548364400416034343698204165173475115834, + 21888242871839275222246405745257275088548364400416034343698204008262276474932, + 21888242871839275222246405745257275088548364400416034343698204010127605769817, + 489124252704704, + 21888242871839275222246405745257275088548364400416034343698204118103215338997, + 21888242871839275222246405745257275088548364400416034343698204057145002011717, + 68006932723515, + 369340168766896, + 537294585602883, + 217756073591891, + 21888242871839275222246405745257275088548364400416034343698203828377284243525, + 140122194970248, + 463163377792313, + 116709129774565, + 256423405884765, + 21888242871839275222246405745257275088548364400416034343698203645653420041782, + 21888242871839275222246405745257275088548364400416034343698203919993653226701, + 21888242871839275222246405745257275088548364400416034343698204014089451086250, + 443432812201949, + 427659024508871, + 383332516084050, + 386256978502011, + 115168690505576, + 252611416666457, + 406424857947824, + 267954455255119, + 73936490436637, + 451390932009363, + 21888242871839275222246405745257275088548364400416034343698203904450582973631, + 21888242871839275222246405745257275088548364400416034343698204067120150306021, + 21888242871839275222246405745257275088548364400416034343698203821117179552151, + 278559054176740, + 21888242871839275222246405745257275088548364400416034343698203762347287271434, + 407106070790186, + 21888242871839275222246405745257275088548364400416034343698204087737150273853, + 171583977199125, + 21888242871839275222246405745257275088548364400416034343698203660455881525362, + 21888242871839275222246405745257275088548364400416034343698203768110584561998, + 21888242871839275222246405745257275088548364400416034343698203697829648496713, + 21888242871839275222246405745257275088548364400416034343698203902119857703199, + 21888242871839275222246405745257275088548364400416034343698203763104585145140, + 311711748572531, + 513644730852375, + 21888242871839275222246405745257275088548364400416034343698203838647286345680, + 15970903555884, + 146981057364806, + 261724518198794, + 38082453266576, + 170474754095308, + 450878768773440, + 21888242871839275222246405745257275088548364400416034343698203638901195953078, + 217763173009823, + 409632011632927, + 21888242871839275222246405745257275088548364400416034343698204184776822321523, + 21888242871839275222246405745257275088548364400416034343698203996223406189095, + 21888242871839275222246405745257275088548364400416034343698204180678211134376, + 21888242871839275222246405745257275088548364400416034343698203741116865979351, + 21888242871839275222246405745257275088548364400416034343698203875889983786466, + 7494378984533, + 87582011029690, + 21888242871839275222246405745257275088548364400416034343698203859488329239898, + 21888242871839275222246405745257275088548364400416034343698203787906848237457, + 262121633419339, + 450591083078416, + 336453013072460, + 250567910923439, + 21888242871839275222246405745257275088548364400416034343698204001791982276317, + 21888242871839275222246405745257275088548364400416034343698204076662780748822, + 491954161642270, + 459468859916700, + 248181574325686, + 2847112333941, + 21888242871839275222246405745257275088548364400416034343698204058788321194966, + 21888242871839275222246405745257275088548364400416034343698203651551627895306, + 334617721332682, + 216001408422141, + 55074142782553, + 351051082060650, + 21888242871839275222246405745257275088548364400416034343698204041530076949161, + 21888242871839275222246405745257275088548364400416034343698203698435262784752, + 21888242871839275222246405745257275088548364400416034343698204110532592454142, + 347342921401547, + 21888242871839275222246405745257275088548364400416034343698203932447818732786, + 21888242871839275222246405745257275088548364400416034343698203800579120870426, + 43812550454553, + 21888242871839275222246405745257275088548364400416034343698203852936534904678, + 21888242871839275222246405745257275088548364400416034343698204110409326088241, + 433131621092970, + 357813192575638, + 230680868545059, + 478262221388448, + 21888242871839275222246405745257275088548364400416034343698203977509375686314, + 318693157254652, + 135574894034882, + 173171068245430, + 484190259396341, + 21888242871839275222246405745257275088548364400416034343698203807492104482727, + 21888242871839275222246405745257275088548364400416034343698203672400935817374, + 3465734748269, + 21888242871839275222246405745257275088548364400416034343698204076271884341922, + 388218963759438, + 21888242871839275222246405745257275088548364400416034343698203818127554866068, + 107667133522915, + 213264132236968, + 493611209989618, + 21888242871839275222246405745257275088548364400416034343698204185720219360496, + 21888242871839275222246405745257275088548364400416034343698203663772801302931, + 21888242871839275222246405745257275088548364400416034343698203962034989372938, + 21888242871839275222246405745257275088548364400416034343698203706411677746062, + 21888242871839275222246405745257275088548364400416034343698204108574770195953, + 21888242871839275222246405745257275088548364400416034343698204119763958761814, + 546023164485278, + 21888242871839275222246405745257275088548364400416034343698204127813124027267, + 21888242871839275222246405745257275088548364400416034343698203860519489931830, + 1438988697620, + 21888242871839275222246405745257275088548364400416034343698204150331504848269, + 21888242871839275222246405745257275088548364400416034343698204050712506172136, + 359865404464544, + 21888242871839275222246405745257275088548364400416034343698203702078872477363, + 21888242871839275222246405745257275088548364400416034343698203788204099812174, + 13864918708717, + 21888242871839275222246405745257275088548364400416034343698203716219136133098, + 244727275620655, + 316179011970161, + 21888242871839275222246405745257275088548364400416034343698203650571556018450, + 21888242871839275222246405745257275088548364400416034343698204005282861276463, + 198094321655824, + 21888242871839275222246405745257275088548364400416034343698204179198970995053, + 21888242871839275222246405745257275088548364400416034343698204095764890277583, + 21888242871839275222246405745257275088548364400416034343698204052893137716467, + 381423167488760, + 554304128147620, + 21888242871839275222246405745257275088548364400416034343698204097639115961678, + 365032980935201, + 21888242871839275222246405745257275088548364400416034343698203689170286032573, + 21888242871839275222246405745257275088548364400416034343698204025343616387859, + 21888242871839275222246405745257275088548364400416034343698204111881653091399, + 21888242871839275222246405745257275088548364400416034343698203909363010533187, + 446763432307914, + 484793015702055, + 261390737781829, + 21888242871839275222246405745257275088548364400416034343698203936729576692598, + 134327076791742, + 21888242871839275222246405745257275088548364400416034343698203781912660916447, + 32677802426717, + 427560924891685, + 470075339026904, + 21888242871839275222246405745257275088548364400416034343698203750817140003511, + 514391183645681, + 21888242871839275222246405745257275088548364400416034343698204017120624104828, + 549204746003472, + 21888242871839275222246405745257275088548364400416034343698204139012160014539, + 536610274514599, + 380500334476899, + 309946741193697, + 196784121040046, + 486933489580864, + 480560517798165, + 21888242871839275222246405745257275088548364400416034343698203686939543417315, + 409580726190683, + 205697742174744, + 21888242871839275222246405745257275088548364400416034343698203877319959404715, + 21888242871839275222246405745257275088548364400416034343698204179250846323501, + 21888242871839275222246405745257275088548364400416034343698204026632107495455, + 387451829131068, + 177996657761143, + 21888242871839275222246405745257275088548364400416034343698204074879553410357, + 510192068203835, + 21888242871839275222246405745257275088548364400416034343698203827882740168733, + 21888242871839275222246405745257275088548364400416034343698204088484807245261, + 21888242871839275222246405745257275088548364400416034343698203653068712253082, + 21888242871839275222246405745257275088548364400416034343698203773821316947205, + 288710426616618, + 21888242871839275222246405745257275088548364400416034343698203895830520744126, + 21888242871839275222246405745257275088548364400416034343698203997483944524269, + 21888242871839275222246405745257275088548364400416034343698203740988904977976, + 21888242871839275222246405745257275088548364400416034343698203912468740535628, + 21888242871839275222246405745257275088548364400416034343698204112939718365026, + 114054500032876, + 21888242871839275222246405745257275088548364400416034343698204152548671452975, + 169286108541920, + 370388230069135, + 21888242871839275222246405745257275088548364400416034343698204163014789887737, + 278974112387117, + 21888242871839275222246405745257275088548364400416034343698203754649309801540, + 21888242871839275222246405745257275088548364400416034343698204024324812726766, + 541745287668823, + 357505518750170, + 21888242871839275222246405745257275088548364400416034343698203759509782203558, + 258417524472612, + 111750175880444, + 21888242871839275222246405745257275088548364400416034343698203677484683696368, + 21888242871839275222246405745257275088548364400416034343698204182612935849829, + 360188017662016, + 21888242871839275222246405745257275088548364400416034343698204074258924798699, + 21888242871839275222246405745257275088548364400416034343698204130154261084548, + 121799125554629, + 510312800421805, + 21888242871839275222246405745257275088548364400416034343698203668211366871970, + 413690125116871, + 88050446660317, + 339914861131481, + 69399611011958, + 516985075136135, + 289559372334199, + 539077333098830, + 270198202461060, + 473532898898165, + 184680509458568, + 275085545346683, + 21888242871839275222246405745257275088548364400416034343698203638516269449541, + 477735774194587, + 21888242871839275222246405745257275088548364400416034343698204128870926158784, + 21888242871839275222246405745257275088548364400416034343698203884097495348910, + 21888242871839275222246405745257275088548364400416034343698203818331007652114, + 21888242871839275222246405745257275088548364400416034343698203646201341420347, + 21888242871839275222246405745257275088548364400416034343698203734479659897630, + 21888242871839275222246405745257275088548364400416034343698203861446728092016, + 437507340818655, + 544635876070871, + 21888242871839275222246405745257275088548364400416034343698204005282006527584, + 9891946016225, + 21888242871839275222246405745257275088548364400416034343698204077461410658301, + 433005084877885, + 21888242871839275222246405745257275088548364400416034343698203709402693446394, + 21888242871839275222246405745257275088548364400416034343698204092681805418126, + 21888242871839275222246405745257275088548364400416034343698204152852790182843, + 539861009000101, + 21888242871839275222246405745257275088548364400416034343698203630937529539427, + 485843001963301, + 21888242871839275222246405745257275088548364400416034343698203834595640826994, + 93009118634996, + 21888242871839275222246405745257275088548364400416034343698203934629762708630, + 295619970018855, + 21888242871839275222246405745257275088548364400416034343698203833298338493259, + 21888242871839275222246405745257275088548364400416034343698203633165809873641, + 21888242871839275222246405745257275088548364400416034343698203852364245263252, + 21888242871839275222246405745257275088548364400416034343698203948764637358763, + 426422900750984, + 28064391573192, + 21888242871839275222246405745257275088548364400416034343698204100187752565939, + 403078606142126, + 21888242871839275222246405745257275088548364400416034343698204037858595225808, + 525856393094171, + 1557795488658, + 10356356945272, + 21888242871839275222246405745257275088548364400416034343698203731154469781449, + 21888242871839275222246405745257275088548364400416034343698203968299414224610, + 21888242871839275222246405745257275088548364400416034343698203824637172928836, + 166437165179819, + 21888242871839275222246405745257275088548364400416034343698204030472320840136, + 21888242871839275222246405745257275088548364400416034343698204167837729574062, + 21888242871839275222246405745257275088548364400416034343698204046174921725505, + 186724210834943, + 21888242871839275222246405745257275088548364400416034343698203950478481701302, + 21888242871839275222246405745257275088548364400416034343698203624103760087998, + 21888242871839275222246405745257275088548364400416034343698204010843602198706, + 511395257515004, + 394341456866685, + 21888242871839275222246405745257275088548364400416034343698203698043286898926, + 21888242871839275222246405745257275088548364400416034343698203805358089787573, + 177225821404887, + 21888242871839275222246405745257275088548364400416034343698203806969597426955, + 462308630330056, + 30581306124859, + 21888242871839275222246405745257275088548364400416034343698203755355735394138, + 237573378454745, + 21888242871839275222246405745257275088548364400416034343698203773891684082154, + 21888242871839275222246405745257275088548364400416034343698203816284805037614, + 234559006549552, + 21888242871839275222246405745257275088548364400416034343698203641568518559524, + 495745866291554, + 21888242871839275222246405745257275088548364400416034343698203836555346895342, + 459154300475699, + 21888242871839275222246405745257275088548364400416034343698203855887207088855, + 21888242871839275222246405745257275088548364400416034343698203815053387152848, + 21888242871839275222246405745257275088548364400416034343698203730479384180590, + 21888242871839275222246405745257275088548364400416034343698203682720079949466, + 326611836977358, + 324178539203815, + 223164016376457, + 21888242871839275222246405745257275088548364400416034343698203637100792662640, + 21888242871839275222246405745257275088548364400416034343698203766082368219430, + 21888242871839275222246405745257275088548364400416034343698203888074763176367, + 365033895317983, + 21888242871839275222246405745257275088548364400416034343698203995480743437538, + 21888242871839275222246405745257275088548364400416034343698204105944405552480, + 288531767479219, + 266423082346732, + 21888242871839275222246405745257275088548364400416034343698203939119177425221, + 458702611093331, + 241697931663795, + 285559406750459, + 416660458369071, + 21888242871839275222246405745257275088548364400416034343698204098739602685918, + 21888242871839275222246405745257275088548364400416034343698203818621409704803, + 21888242871839275222246405745257275088548364400416034343698203815649176952930, + 21888242871839275222246405745257275088548364400416034343698203633243380058672, + 45410757990214, + 32060272562058, + 518830249527752, + 21888242871839275222246405745257275088548364400416034343698204047710505167384, + 433321037913269, + 21888242871839275222246405745257275088548364400416034343698203876531477792746, + 15778509748377, + 21888242871839275222246405745257275088548364400416034343698204046702098494608, + 200125829228645, + 224334099821918, + 264632099015978, + 282597790806412, + 318069063354642, + 151205391392907, + 21888242871839275222246405745257275088548364400416034343698204085634840871155, + 417613548717468, + 21888242871839275222246405745257275088548364400416034343698204059202433265554, + 561527509454800, + 21888242871839275222246405745257275088548364400416034343698203738013068634104, + 423388576345160, + 21888242871839275222246405745257275088548364400416034343698203649994821293811, + 21888242871839275222246405745257275088548364400416034343698203911362649145091, + 219269673206436, + 21888242871839275222246405745257275088548364400416034343698203863211167627632, + 494037619856269, + 21888242871839275222246405745257275088548364400416034343698203768390855745866, + 21888242871839275222246405745257275088548364400416034343698203628122357266025, + 21888242871839275222246405745257275088548364400416034343698204141958630844966, + 21888242871839275222246405745257275088548364400416034343698203991978106537468, + 91174618313599, + 21888242871839275222246405745257275088548364400416034343698204063501131758411, + 480538538566223, + 21888242871839275222246405745257275088548364400416034343698203736663190552038, + 57615362432895, + 21888242871839275222246405745257275088548364400416034343698203951319115895762, + 162549658568717, + 408586755558849, + 437252884251545, + 21888242871839275222246405745257275088548364400416034343698203801841663211766, + 370578812934012, + 21888242871839275222246405745257275088548364400416034343698203911753163049265, + 21888242871839275222246405745257275088548364400416034343698203916752937540807, + 272940356855769, + 21888242871839275222246405745257275088548364400416034343698204164419526475034, + 21888242871839275222246405745257275088548364400416034343698204162018552151909, + 21888242871839275222246405745257275088548364400416034343698203683344436593368, + 374575725330051, + 21888242871839275222246405745257275088548364400416034343698203829984070340847, + 343525451252091, + 21888242871839275222246405745257275088548364400416034343698203785960312043954, + 21888242871839275222246405745257275088548364400416034343698203907401765144912, + 21888242871839275222246405745257275088548364400416034343698203711565812453301, + 21888242871839275222246405745257275088548364400416034343698203775218318323125, + 468329298661570, + 21888242871839275222246405745257275088548364400416034343698203674489202686814, + 458201931898127, + 21888242871839275222246405745257275088548364400416034343698204019227994045668, + 349311272181797, + 21888242871839275222246405745257275088548364400416034343698203712336998501858, + 21888242871839275222246405745257275088548364400416034343698204021291074546343, + 174706263043376, + 21888242871839275222246405745257275088548364400416034343698203643594982130822, + 21888242871839275222246405745257275088548364400416034343698204085461684274149, + 21888242871839275222246405745257275088548364400416034343698203863426172496022, + 205087676782264, + 467510056108499, + 538593049355907, + 351891558809047, + 461612390015417, + 21888242871839275222246405745257275088548364400416034343698203874455933433453, + 21888242871839275222246405745257275088548364400416034343698203642402936181093, + 155755158632904, + 21888242871839275222246405745257275088548364400416034343698203697097882997369, + 533919036455062, + 21888242871839275222246405745257275088548364400416034343698204165014166867229, + 400407795205695, + 542096683774622, + 480693153295216, + 21888242871839275222246405745257275088548364400416034343698203788257207138577, + 76022652329449, + 254537427434658, + 21888242871839275222246405745257275088548364400416034343698203984975026733198, + 21888242871839275222246405745257275088548364400416034343698203914139102238324, + 21888242871839275222246405745257275088548364400416034343698203749966397182855, + 21888242871839275222246405745257275088548364400416034343698203795447856728094, + 343977143741712, + 21888242871839275222246405745257275088548364400416034343698203932345003912336, + 201326931563125, + 244016941519871, + 21888242871839275222246405745257275088548364400416034343698204074125095193335, + 31565900072934, + 21888242871839275222246405745257275088548364400416034343698203908372849590277, + 249857712542376, + 35007851225895, + 21888242871839275222246405745257275088548364400416034343698203977852809773259, + 21888242871839275222246405745257275088548364400416034343698203759807273581931, + 481935268003451, + 21888242871839275222246405745257275088548364400416034343698204076118515094410, + 21888242871839275222246405745257275088548364400416034343698203950879127566042, + 21888242871839275222246405745257275088548364400416034343698203938424487612892, + 288462126913293, + 440012052297688, + 21888242871839275222246405745257275088548364400416034343698203747846020940885, + 526763313257852, + 21888242871839275222246405745257275088548364400416034343698203661640288171117, + 467948318102359, + 518393015552580, + 216160480399630, + 21888242871839275222246405745257275088548364400416034343698203956591029212099, + 21888242871839275222246405745257275088548364400416034343698203971726204501802, + 508259226920270, + 104280592039049, + 221387841923830, + 21888242871839275222246405745257275088548364400416034343698203719359387265475, + 255214539867881, + 271339273221053, + 188849429692093, + 120978663333832, + 21888242871839275222246405745257275088548364400416034343698203768261904810426, + 49523370921408, + 21888242871839275222246405745257275088548364400416034343698203882005402588570, + 21888242871839275222246405745257275088548364400416034343698203784749442957948, + 21888242871839275222246405745257275088548364400416034343698203886287813487019, + 21888242871839275222246405745257275088548364400416034343698203893443865433278, + 21888242871839275222246405745257275088548364400416034343698203993399762049799, + 21888242871839275222246405745257275088548364400416034343698203836066500280163, + 21888242871839275222246405745257275088548364400416034343698203759601546861121, + 83387511167274, + 419088363809674, + 21888242871839275222246405745257275088548364400416034343698203830606323679127, + 21888242871839275222246405745257275088548364400416034343698203751053868027283, + 21888242871839275222246405745257275088548364400416034343698203938943018438943, + 277260321043718, + 43374274018842, + 146869419369398, + 151847870952137, + 65252650598482, + 21888242871839275222246405745257275088548364400416034343698203908075893725443, + 198165258948048, + 31676923300984, + 2332235038397, + 21888242871839275222246405745257275088548364400416034343698203697745147430984, + 21888242871839275222246405745257275088548364400416034343698203868900564789834, + 57380998494008, + 21888242871839275222246405745257275088548364400416034343698203633092915625911, + 21888242871839275222246405745257275088548364400416034343698203781027540402024, + 381497132462025, + 21888242871839275222246405745257275088548364400416034343698203711449965037026, + 21888242871839275222246405745257275088548364400416034343698203782530462070129, + 302116834022791, + 49895626941556, + 670813066093, + 82619092968404, + 21888242871839275222246405745257275088548364400416034343698203787169984304956, + 43736217121072, + 21888242871839275222246405745257275088548364400416034343698204056747580672128, + 205809454756579, + 21888242871839275222246405745257275088548364400416034343698204175632658668200, + 21888242871839275222246405745257275088548364400416034343698203686242009197582, + 194805581847990, + 21888242871839275222246405745257275088548364400416034343698203985697390233614, + 137084477467232, + 21888242871839275222246405745257275088548364400416034343698203670347582541537, + 186048082211330, + 549927712946456, + 21888242871839275222246405745257275088548364400416034343698204158875020104739, + 341807791170705, + 500040263161357, + 560942280560496, + 21888242871839275222246405745257275088548364400416034343698203792528648368914, + 21888242871839275222246405745257275088548364400416034343698203947554756746975, + 21888242871839275222246405745257275088548364400416034343698203825387373015782, + 21888242871839275222246405745257275088548364400416034343698204057143144725985, + 475373776575694, + 313070960594750, + 21888242871839275222246405745257275088548364400416034343698203850071693494894, + 82902738777081, + 21888242871839275222246405745257275088548364400416034343698203807863709086469, + 352951436898793, + 122999118177241, + 21888242871839275222246405745257275088548364400416034343698203649981982359453, + 21888242871839275222246405745257275088548364400416034343698203970145545788252, + 21888242871839275222246405745257275088548364400416034343698204026633074352132, + 521912939555028, + 21888242871839275222246405745257275088548364400416034343698203794872965138689, + 21888242871839275222246405745257275088548364400416034343698203750108507312606, + 24185258020724, + 121505003439392, + 200419930083136, + 21888242871839275222246405745257275088548364400416034343698203908291398224211, + 291986347218488, + 124384781841116, + 426977398566046, + 21888242871839275222246405745257275088548364400416034343698203821329547366551, + 21888242871839275222246405745257275088548364400416034343698203848339891302009, + 21888242871839275222246405745257275088548364400416034343698203876738491746555, + 21888242871839275222246405745257275088548364400416034343698203897471935149633, + 21888242871839275222246405745257275088548364400416034343698204167315270796822, + 21888242871839275222246405745257275088548364400416034343698203631581588245951, + 21888242871839275222246405745257275088548364400416034343698204032965552183639, + 21888242871839275222246405745257275088548364400416034343698204069387950361641, + 421045023021901, + 474547152061710, + 173164566955328, + 21888242871839275222246405745257275088548364400416034343698204094272154511177, + 21888242871839275222246405745257275088548364400416034343698204121594371337983, + 99513465339692, + 21888242871839275222246405745257275088548364400416034343698203839559120463298, + 21888242871839275222246405745257275088548364400416034343698203663838023223569, + 21888242871839275222246405745257275088548364400416034343698203991946601462424, + 137876728896914, + 236503185152569, + 21888242871839275222246405745257275088548364400416034343698203964395602928941, + 21888242871839275222246405745257275088548364400416034343698203786371844608064, + 21888242871839275222246405745257275088548364400416034343698203934264760145346, + 535360383025864, + 21888242871839275222246405745257275088548364400416034343698203781245169296085, + 21888242871839275222246405745257275088548364400416034343698204079694286288463, + 21888242871839275222246405745257275088548364400416034343698203868834694630044, + 544678572353143, + 21888242871839275222246405745257275088548364400416034343698203752723886154935, + 138830717650660, + 433161026574758, + 195053335018536, + 251923088035532, + 21888242871839275222246405745257275088548364400416034343698203733538390211189, + 21888242871839275222246405745257275088548364400416034343698203941712027833371, + 367108992969370, + 243704076134853, + 67137815824780, + 21888242871839275222246405745257275088548364400416034343698203869333594184679, + 21888242871839275222246405745257275088548364400416034343698203881041958277423, + 21888242871839275222246405745257275088548364400416034343698204186320080202388, + 328618333614849, + 214457979509404, + 189542656223752, + 21888242871839275222246405745257275088548364400416034343698204126618938387300, + 21888242871839275222246405745257275088548364400416034343698203929884640582442, + 331763306076640, + 6642297652983, + 412259215146081, + 21888242871839275222246405745257275088548364400416034343698203729372043325326, + 416876831798421, + 21888242871839275222246405745257275088548364400416034343698203637362177382945, + 21888242871839275222246405745257275088548364400416034343698203898752975761057, + 291930052169173, + 308156768072250, + 21888242871839275222246405745257275088548364400416034343698203863440849168341, + 534024838189380, + 21888242871839275222246405745257275088548364400416034343698203829106734570805, + 206071225402462, + 470515382314711, + 21888242871839275222246405745257275088548364400416034343698203764079997098685, + 21888242871839275222246405745257275088548364400416034343698203728553799281937, + 21888242871839275222246405745257275088548364400416034343698203861558462373197, + 21888242871839275222246405745257275088548364400416034343698203865775163238464, + 561922564541955, + 21888242871839275222246405745257275088548364400416034343698203924803997242250, + 433931693924586, + 464092262518718, + 392601164029413, + 5455431241127, + 21888242871839275222246405745257275088548364400416034343698203945791096859288, + 470785347046459, + 21888242871839275222246405745257275088548364400416034343698203966269063940436, + 477434989949622, + 299039293793475, + 358279030665569, + 21888242871839275222246405745257275088548364400416034343698204070513311630658, + 501049572566787, + 21888242871839275222246405745257275088548364400416034343698203779087322435341, + 817127697902, + 21888242871839275222246405745257275088548364400416034343698204182577510200886, + 259551986606953, + 21888242871839275222246405745257275088548364400416034343698203684819897803587, + 21888242871839275222246405745257275088548364400416034343698203877915193935777, + 21888242871839275222246405745257275088548364400416034343698203685654061986723, + 90628638089135, + 21888242871839275222246405745257275088548364400416034343698203728066604406081, + 518242469510627, + 261089899630426, + 300024724606477, + 21888242871839275222246405745257275088548364400416034343698203677099056555096, + 221941716219634, + 362980724423505, + 21888242871839275222246405745257275088548364400416034343698204025645219336659, + 349629033352555, + 526293332949737, + 21888242871839275222246405745257275088548364400416034343698203936965768886974, + 410367677628570, + 21888242871839275222246405745257275088548364400416034343698203713946190567533, + 21888242871839275222246405745257275088548364400416034343698203945741913757300, + 511878416086123, + 297134244939395, + 21888242871839275222246405745257275088548364400416034343698203910358912631599, + 21888242871839275222246405745257275088548364400416034343698203671896966161977, + 21888242871839275222246405745257275088548364400416034343698203709438014173398, + 321322281959696, + 21888242871839275222246405745257275088548364400416034343698204001899616270435, + 21888242871839275222246405745257275088548364400416034343698203843694388329000, + 21888242871839275222246405745257275088548364400416034343698203748999454662723, + 278960368484114, + 21888242871839275222246405745257275088548364400416034343698203988283480263506, + 21888242871839275222246405745257275088548364400416034343698204123911954896573, + 250834465205392, + 21888242871839275222246405745257275088548364400416034343698204038160853278059, + 88065187875389, + 21888242871839275222246405745257275088548364400416034343698203633859937222309, + 83496108958686, + 21888242871839275222246405745257275088548364400416034343698204015711806160523, + 257211590210735, + 21888242871839275222246405745257275088548364400416034343698203855306115023657, + 21888242871839275222246405745257275088548364400416034343698203749529309306493, + 246301307968940, + 21888242871839275222246405745257275088548364400416034343698203943479623148341, + 21888242871839275222246405745257275088548364400416034343698203823093410190582, + 21888242871839275222246405745257275088548364400416034343698204026636329943864, + 396186546968396, + 138344341123558, + 313042043793220, + 21888242871839275222246405745257275088548364400416034343698204174346725782359, + 223303471497258, + 188860150538115, + 318269644924956, + 21888242871839275222246405745257275088548364400416034343698203879830028504941, + 21888242871839275222246405745257275088548364400416034343698203995581442745557, + 414882334569593, + 473256235945088, + 242716423422420, + 21888242871839275222246405745257275088548364400416034343698203641570198412254, + 21888242871839275222246405745257275088548364400416034343698203850446190335594, + 21888242871839275222246405745257275088548364400416034343698203698968551912847, + 21888242871839275222246405745257275088548364400416034343698203925242609152127, + 21888242871839275222246405745257275088548364400416034343698204126704887078933, + 21888242871839275222246405745257275088548364400416034343698204119245391773254, + 40653624947124, + 200151936496972, + 21888242871839275222246405745257275088548364400416034343698203948451092508692, + 291565418524164, + 47841755847318, + 1812436361008, + 59083133202338, + 21888242871839275222246405745257275088548364400416034343698203688411905737049, + 21888242871839275222246405745257275088548364400416034343698204120992010992454, + 413286819812212, + 21888242871839275222246405745257275088548364400416034343698204156975184864238, + 21888242871839275222246405745257275088548364400416034343698203924821196672386, + 506335238047024, + 21888242871839275222246405745257275088548364400416034343698203878604283119383, + 21888242871839275222246405745257275088548364400416034343698203824279248464545, + 21888242871839275222246405745257275088548364400416034343698204029368401352722, + 21888242871839275222246405745257275088548364400416034343698203868132562127273, + 21888242871839275222246405745257275088548364400416034343698203804299591678760, + 21888242871839275222246405745257275088548364400416034343698203992972297705712, + 236987879087148, + 21888242871839275222246405745257275088548364400416034343698203959112993515586, + 21888242871839275222246405745257275088548364400416034343698203630494607217583, + 459283724009222, + 506455703995731, + 488820259831170, + 460023426289772, + 21888242871839275222246405745257275088548364400416034343698204098899313063906, + 21888242871839275222246405745257275088548364400416034343698203672397013538054, + 21888242871839275222246405745257275088548364400416034343698203943028666494097, + 21888242871839275222246405745257275088548364400416034343698203807420795431843, + 21888242871839275222246405745257275088548364400416034343698203904594697482211, + 21888242871839275222246405745257275088548364400416034343698204064122432526661, + 56893176011707, + 21888242871839275222246405745257275088548364400416034343698203846871780793056, + 21888242871839275222246405745257275088548364400416034343698204163841287715311, + 21888242871839275222246405745257275088548364400416034343698204074128533681604, + 57755859294708, + 21888242871839275222246405745257275088548364400416034343698204007054111054917, + 21888242871839275222246405745257275088548364400416034343698203835723773560669, + 21888242871839275222246405745257275088548364400416034343698203875838091968350, + 21888242871839275222246405745257275088548364400416034343698203895434292436261, + 21888242871839275222246405745257275088548364400416034343698204134267634665955, + 114330866407710, + 21888242871839275222246405745257275088548364400416034343698203625740454896523, + 144092024533972, + 477628306935942, + 21888242871839275222246405745257275088548364400416034343698203733659964216665, + 337100033938089, + 21888242871839275222246405745257275088548364400416034343698204079117521318550, + 21888242871839275222246405745257275088548364400416034343698204065786307762635, + 182954246549585, + 52527620182047, + 126546470806122, + 233479558595758, + 173892524900229, + 97035279616856, + 21888242871839275222246405745257275088548364400416034343698203692324020374084, + 21888242871839275222246405745257275088548364400416034343698203698804673911531, + 21888242871839275222246405745257275088548364400416034343698203625559524019075, + 206804213328194, + 49726829148764, + 54223037369062, + 1276559250672, + 21888242871839275222246405745257275088548364400416034343698204150145409283297, + 21888242871839275222246405745257275088548364400416034343698203879880491212356, + 21888242871839275222246405745257275088548364400416034343698204080539805689256, + 547297264093518, + 429476106365749, + 391538840833815, + 281970333251092, + 392158508774565, + 21888242871839275222246405745257275088548364400416034343698203708075369654045, + 21888242871839275222246405745257275088548364400416034343698203973261706062902, + 21888242871839275222246405745257275088548364400416034343698203897527765715324, + 111086737740672, + 21888242871839275222246405745257275088548364400416034343698204103600269106363, + 177147314353794, + 21888242871839275222246405745257275088548364400416034343698203677806430154809, + 21888242871839275222246405745257275088548364400416034343698204031107993573213, + 458365064405658, + 21888242871839275222246405745257275088548364400416034343698203970093575172291, + 135674588975384, + 229563420408988, + 21888242871839275222246405745257275088548364400416034343698203916956910724062, + 357873389763478, + 21888242871839275222246405745257275088548364400416034343698203833006912878111, + 21888242871839275222246405745257275088548364400416034343698203657619361572305, + 492703053195032, + 21888242871839275222246405745257275088548364400416034343698204025792572737149, + 108008564579623, + 21888242871839275222246405745257275088548364400416034343698203982370677531473, + 538701923206951, + 379323639557630, + 21888242871839275222246405745257275088548364400416034343698203685865093130081, + 21888242871839275222246405745257275088548364400416034343698204062600650072228, + 21888242871839275222246405745257275088548364400416034343698203685111084919179, + 19901489017174, + 141513500364114, + 259899467222150, + 55627889942727, + 21888242871839275222246405745257275088548364400416034343698203835166609124161, + 256529481528304, + 108959670679977, + 21888242871839275222246405745257275088548364400416034343698203999567397102572, + 373618539264145, + 21888242871839275222246405745257275088548364400416034343698204085501567185298, + 148561274874939, + 151160414739168, + 21888242871839275222246405745257275088548364400416034343698203641155866515053, + 90645475174404, + 21888242871839275222246405745257275088548364400416034343698203822090723901291, + 21888242871839275222246405745257275088548364400416034343698204162003179940521, + 21888242871839275222246405745257275088548364400416034343698203638630539137306, + 21888242871839275222246405745257275088548364400416034343698203955202332031877, + 21888242871839275222246405745257275088548364400416034343698204104337176836633, + 427182966386078, + 135501681217659, + 21888242871839275222246405745257275088548364400416034343698204160228735908714, + 21888242871839275222246405745257275088548364400416034343698203862697558606719, + 21888242871839275222246405745257275088548364400416034343698203784138178742436, + 171398891709157, + 330333641677938, + 21888242871839275222246405745257275088548364400416034343698203984372662808897, + 21888242871839275222246405745257275088548364400416034343698204110578457375644, + 21888242871839275222246405745257275088548364400416034343698203631957257268567, + 498110819940522, + 87060370440956, + 293100072215201, + 21888242871839275222246405745257275088548364400416034343698203981401594776170, + 144154132533479, + 21888242871839275222246405745257275088548364400416034343698203666071007974506, + 21888242871839275222246405745257275088548364400416034343698204170316081728802, + 202433949497463, + 495954006179028, + 419396490349689, + 72382765856264, + 21888242871839275222246405745257275088548364400416034343698204082177509928088, + 21888242871839275222246405745257275088548364400416034343698203886290283645434, + 21888242871839275222246405745257275088548364400416034343698203834702722875829, + 21888242871839275222246405745257275088548364400416034343698203979059782408327, + 27898955742783, + 115227071504193, + 409650295168003, + 480007026277761, + 448532054352300, + 518095145767031, + 21888242871839275222246405745257275088548364400416034343698204164668472411142, + 38721282153121, + 21888242871839275222246405745257275088548364400416034343698203652845880010136, + 21888242871839275222246405745257275088548364400416034343698203916808997675208, + 273275684957368, + 21888242871839275222246405745257275088548364400416034343698203748787273913985, + 146940119675018, + 26023345676979, + 21888242871839275222246405745257275088548364400416034343698203900748895348371, + 308828441158515, + 21888242871839275222246405745257275088548364400416034343698203894358078197934, + 138149491221676, + 378948641277519, + 21888242871839275222246405745257275088548364400416034343698203955859330015277, + 21888242871839275222246405745257275088548364400416034343698203919001315354201, + 484925984852146, + 142900213980442, + 21888242871839275222246405745257275088548364400416034343698203795573061891661, + 21888242871839275222246405745257275088548364400416034343698203873123155414976, + 21888242871839275222246405745257275088548364400416034343698203945371005238350, + 21888242871839275222246405745257275088548364400416034343698204088689979062469, + 291872102261243, + 21888242871839275222246405745257275088548364400416034343698203930327922910828, + 554039290065306, + 21888242871839275222246405745257275088548364400416034343698203933894117054974, + 21888242871839275222246405745257275088548364400416034343698203767656109180112, + 21888242871839275222246405745257275088548364400416034343698203763625865347754, + 21888242871839275222246405745257275088548364400416034343698203837670261196907, + 425211701680166, + 21888242871839275222246405745257275088548364400416034343698204104064058062955, + 174558380606504, + 25890259970198, + 152669650482283, + 21888242871839275222246405745257275088548364400416034343698203628386760939591, + 86007921610401, + 21888242871839275222246405745257275088548364400416034343698203849847112830835, + 124960723019900, + 240570801810125, + 192906465362779, + 414270179392405, + 201523056363356, + 21888242871839275222246405745257275088548364400416034343698204002584636488113, + 21888242871839275222246405745257275088548364400416034343698203813179069237129, + 481325667229542, + 21888242871839275222246405745257275088548364400416034343698204170167558102076, + 497240020984343, + 21888242871839275222246405745257275088548364400416034343698204019794242523396, + 397541206654776, + 416502548859665, + 190161098889443, + 21888242871839275222246405745257275088548364400416034343698203807866436861780, + 21888242871839275222246405745257275088548364400416034343698203777282895906218, + 451769938808025, + 520461410950899, + 12255150375249, + 190121629240011, + 339735645219047, + 330130406126818, + 21888242871839275222246405745257275088548364400416034343698203704500501155123, + 393667536167199, + 21888242871839275222246405745257275088548364400416034343698203985566908497332, + 522551905278514, + 21888242871839275222246405745257275088548364400416034343698204140561966394249, + 425537675385812, + 21888242871839275222246405745257275088548364400416034343698203925529519090321, + 446419078267615, + 397672876855120, + 21888242871839275222246405745257275088548364400416034343698203680253723710277, + 239072505781217, + 355852405733312, + 360697098265983, + 21888242871839275222246405745257275088548364400416034343698203944536352889566, + 187705257064740, + 21888242871839275222246405745257275088548364400416034343698203653940699608748, + 21888242871839275222246405745257275088548364400416034343698204129334344228746, + 21888242871839275222246405745257275088548364400416034343698204065106954737193, + 559850648173512, + 172922685895721, + 21888242871839275222246405745257275088548364400416034343698203988018661265996, + 21888242871839275222246405745257275088548364400416034343698204121056774370251, + 197524301327672, + 21888242871839275222246405745257275088548364400416034343698204077249830794380, + 24936662646730, + 413743706064201, + 21888242871839275222246405745257275088548364400416034343698203836919891219895, + 21888242871839275222246405745257275088548364400416034343698204123637846161436, + 21888242871839275222246405745257275088548364400416034343698203891718175240005, + 458436160576133, + 21888242871839275222246405745257275088548364400416034343698203883110551080732, + 21888242871839275222246405745257275088548364400416034343698204155154817370215, + 21888242871839275222246405745257275088548364400416034343698203795562587688790, + 53169373573055, + 152095866503467, + 21888242871839275222246405745257275088548364400416034343698203976655721830115, + 79513782688131, + 118886621698590, + 347540761964929, + 235694768155815, + 21888242871839275222246405745257275088548364400416034343698203724280971036907, + 21888242871839275222246405745257275088548364400416034343698204159845727118897, + 64479051146568, + 328594271019312, + 335888203247580, + 89043260879262, + 65316436008789, + 21888242871839275222246405745257275088548364400416034343698204132309683886943, + 21888242871839275222246405745257275088548364400416034343698203899074028491750, + 366052797565259, + 51827359851951, + 254361071613493, + 21888242871839275222246405745257275088548364400416034343698203930331016300775, + 111771543752936, + 253372712346517, + 21888242871839275222246405745257275088548364400416034343698204163231224060849, + 21888242871839275222246405745257275088548364400416034343698204110811692031540, + 21888242871839275222246405745257275088548364400416034343698203964780068176442, + 247284379306230, + 21888242871839275222246405745257275088548364400416034343698203813590964337308, + 21888242871839275222246405745257275088548364400416034343698204008642581303606, + 21888242871839275222246405745257275088548364400416034343698203923280120827275, + 21888242871839275222246405745257275088548364400416034343698204154783475903532, + 21888242871839275222246405745257275088548364400416034343698204127279170166828, + 21888242871839275222246405745257275088548364400416034343698204062726708679885, + 448819188445179, + 21888242871839275222246405745257275088548364400416034343698204001466595771210, + 131248483269216, + 56796231362281, + 21888242871839275222246405745257275088548364400416034343698204076288398222582, + 45373193849962, + 21888242871839275222246405745257275088548364400416034343698203878076687996886, + 303032035453680, + 21888242871839275222246405745257275088548364400416034343698204142128666190335, + 205824104243423, + 506285234856884, + 21888242871839275222246405745257275088548364400416034343698204145132785164033, + 21888242871839275222246405745257275088548364400416034343698203840214299404679, + 21888242871839275222246405745257275088548364400416034343698203888455275630884, + 21888242871839275222246405745257275088548364400416034343698203833709895015368, + 21888242871839275222246405745257275088548364400416034343698203727334461748711, + 81988006278459, + 21888242871839275222246405745257275088548364400416034343698203654895167439947, + 21888242871839275222246405745257275088548364400416034343698203909278863367856, + 77734572875656, + 21888242871839275222246405745257275088548364400416034343698203999261807101121, + 123567261211416, + 21888242871839275222246405745257275088548364400416034343698203737356100788544, + 111767329288586, + 21888242871839275222246405745257275088548364400416034343698203627230448590484, + 21888242871839275222246405745257275088548364400416034343698204016019223465137, + 21888242871839275222246405745257275088548364400416034343698203746663657027308, + 21888242871839275222246405745257275088548364400416034343698203703388279314396, + 126335564203006, + 21888242871839275222246405745257275088548364400416034343698203713274503387308, + 21888242871839275222246405745257275088548364400416034343698203800500144062059, + 21888242871839275222246405745257275088548364400416034343698203636642038554040, + 242100195957108, + 59598193206241, + 21888242871839275222246405745257275088548364400416034343698203852299331097118, + 497381291142779, + 72457722196122, + 72378533841100, + 21888242871839275222246405745257275088548364400416034343698203793202016061046, + 21888242871839275222246405745257275088548364400416034343698203702434888360232, + 298753836131256, + 21888242871839275222246405745257275088548364400416034343698203644100268476377, + 90902941127437, + 21888242871839275222246405745257275088548364400416034343698204135222365063649, + 201563912194064, + 274088930531840, + 134412236173101, + 21888242871839275222246405745257275088548364400416034343698203873313847284998, + 538948090082153, + 21888242871839275222246405745257275088548364400416034343698203913571214860428, + 21888242871839275222246405745257275088548364400416034343698203841839387699137, + 21888242871839275222246405745257275088548364400416034343698203845028439928462, + 21888242871839275222246405745257275088548364400416034343698204062456722301829, + 186680523274333, + 88420239456168, + 141024701342265, + 192576745238129, + 21888242871839275222246405745257275088548364400416034343698203680368099287340, + 113196858585814, + 21888242871839275222246405745257275088548364400416034343698204107822791833055, + 542919429423723, + 55944173691706, + 15918359030680, + 21888242871839275222246405745257275088548364400416034343698204090722558219866, + 21888242871839275222246405745257275088548364400416034343698203763232289532488, + 21888242871839275222246405745257275088548364400416034343698203903922907101531, + 60979727396018, + 21888242871839275222246405745257275088548364400416034343698204184946678791721, + 122194920126420, + 206519779357295, + 21888242871839275222246405745257275088548364400416034343698203978605201221279, + 132479286826376, + 21888242871839275222246405745257275088548364400416034343698204129107485696858, + 311138282704727, + 466806035602214, + 271410242788296, + 194381089045138, + 21888242871839275222246405745257275088548364400416034343698204088743345775568, + 21888242871839275222246405745257275088548364400416034343698204119017163368784, + 410160851309991, + 21888242871839275222246405745257275088548364400416034343698204026818058989195, + 21888242871839275222246405745257275088548364400416034343698204071046546268890, + 21888242871839275222246405745257275088548364400416034343698203649063251577414, + 49514690178454, + 21888242871839275222246405745257275088548364400416034343698203778634303913814, + 274660396206646, + 297091958812837, + 21888242871839275222246405745257275088548364400416034343698203806853713200359, + 21888242871839275222246405745257275088548364400416034343698203978995818923329, + 412097961622732, + 220833776637881, + 176447399644218, + 21888242871839275222246405745257275088548364400416034343698204078335505293215, + 21888242871839275222246405745257275088548364400416034343698204169744764920370, + 310554204174172, + 21888242871839275222246405745257275088548364400416034343698204073337847597150, + 505359617496648, + 531855210042729, + 179222181795120, + 21888242871839275222246405745257275088548364400416034343698204124328411621068, + 21888242871839275222246405745257275088548364400416034343698204079062479294781, + 190411341330349, + 21888242871839275222246405745257275088548364400416034343698203783524315846605, + 21888242871839275222246405745257275088548364400416034343698203782734296422564, + 447389729772468, + 100974917244564, + 215355428367022, + 21888242871839275222246405745257275088548364400416034343698204018135195612908, + 21888242871839275222246405745257275088548364400416034343698203973661942411710, + 525253073699199, + 176430903975527, + 21888242871839275222246405745257275088548364400416034343698203818628023647559, + 21888242871839275222246405745257275088548364400416034343698203835921337965225, + 21888242871839275222246405745257275088548364400416034343698203664117844377767, + 21888242871839275222246405745257275088548364400416034343698203711278865871360, + 21888242871839275222246405745257275088548364400416034343698204046565178705578, + 21888242871839275222246405745257275088548364400416034343698203764919822839201, + 201554932978297, + 21888242871839275222246405745257275088548364400416034343698203923799283049436, + 21888242871839275222246405745257275088548364400416034343698203824327958495372, + 21888242871839275222246405745257275088548364400416034343698203679912256915179, + 378662391107159, + 21888242871839275222246405745257275088548364400416034343698203948073865639808, + 21888242871839275222246405745257275088548364400416034343698203845168720434919, + 259835331628333, + 405953587564213, + 21888242871839275222246405745257275088548364400416034343698204136316393287226, + 136227657698625, + 285878663883850, + 21888242871839275222246405745257275088548364400416034343698204101960632686686, + 21888242871839275222246405745257275088548364400416034343698203822551544406185, + 69192908606004, + 250704004539171, + 3921024724049, + 378859397678614, + 490884420438876, + 21888242871839275222246405745257275088548364400416034343698204128715302866509, + 21888242871839275222246405745257275088548364400416034343698203779542124664327, + 127145715257434, + 21888242871839275222246405745257275088548364400416034343698204134258990186720, + 230387101261204, + 21888242871839275222246405745257275088548364400416034343698203841841942015229, + 352075610931941, + 21888242871839275222246405745257275088548364400416034343698204125585946869861, + 187708097224285, + 101732535308427, + 21888242871839275222246405745257275088548364400416034343698203686554392334288, + 424391491946933, + 21888242871839275222246405745257275088548364400416034343698203829809341866073, + 72607340155699, + 21888242871839275222246405745257275088548364400416034343698203680068916718463, + 21888242871839275222246405745257275088548364400416034343698203667311983418219, + 429366426209504, + 216868399580296, + 553109656234173, + 21888242871839275222246405745257275088548364400416034343698203772280066020876, + 21888242871839275222246405745257275088548364400416034343698203712765963582444, + 21888242871839275222246405745257275088548364400416034343698203863454612979348, + 55000215436040, + 21888242871839275222246405745257275088548364400416034343698203716774654841705, + 21888242871839275222246405745257275088548364400416034343698203732234617249163, + 21888242871839275222246405745257275088548364400416034343698204059038004031972, + 150252068653405, + 21888242871839275222246405745257275088548364400416034343698204149569546578746, + 179436956367042, + 336715162551382, + 21888242871839275222246405745257275088548364400416034343698203674391158994253, + 301874773035460, + 282769114641995, + 378813236407867, + 21888242871839275222246405745257275088548364400416034343698203894255462927720, + 355441710320419, + 21888242871839275222246405745257275088548364400416034343698203673845519540475, + 21888242871839275222246405745257275088548364400416034343698203672800359936796, + 140234564463918, + 21888242871839275222246405745257275088548364400416034343698203999753030915736, + 268348011569, + 548885802675533, + 21888242871839275222246405745257275088548364400416034343698203728047440396061, + 21888242871839275222246405745257275088548364400416034343698203881665209640879, + 430088139613229, + 364252096887581, + 21888242871839275222246405745257275088548364400416034343698203851153483076029, + 517712727256113, + 21888242871839275222246405745257275088548364400416034343698203702349883711402, + 306571742591613, + 21888242871839275222246405745257275088548364400416034343698204061892052513484, + 21888242871839275222246405745257275088548364400416034343698203957020281516205, + 193489074792095, + 21888242871839275222246405745257275088548364400416034343698203807543295840251, + 88494271054708, + 412744167162982, + 258339345586643, + 241732573132310, + 21888242871839275222246405745257275088548364400416034343698204170453492879003, + 168442030290018, + 508968841441159, + 329415734817793, + 21888242871839275222246405745257275088548364400416034343698203923585367426772, + 477722686984912, + 21888242871839275222246405745257275088548364400416034343698204068899212116567, + 21888242871839275222246405745257275088548364400416034343698203849176994573072, + 21888242871839275222246405745257275088548364400416034343698204136254249421281, + 386414109411421, + 154203362606816, + 21888242871839275222246405745257275088548364400416034343698203935654633922317, + 346530474629003, + 550815610684627, + 356935621280381, + 499644775157568, + 300735401861460, + 21888242871839275222246405745257275088548364400416034343698203790903274871245, + 493721497278165, + 475847699982414, + 416002169700454, + 280100289813687, + 21888242871839275222246405745257275088548364400416034343698204124047758743020, + 21888242871839275222246405745257275088548364400416034343698203986808331701957, + 21888242871839275222246405745257275088548364400416034343698204046612810319142, + 423750780214798, + 21888242871839275222246405745257275088548364400416034343698204018976587026070, + 21888242871839275222246405745257275088548364400416034343698204074816496880717, + 21888242871839275222246405745257275088548364400416034343698204185114745857415, + 349487972699587, + 521356206395613, + 21888242871839275222246405745257275088548364400416034343698203930617430432853, + 353069570119407, + 257743655834148, + 383100618564133, + 404320889796237, + 21888242871839275222246405745257275088548364400416034343698203720780291108748, + 517802788002096, + 21888242871839275222246405745257275088548364400416034343698203821991675464971, + 127567016324968, + 21888242871839275222246405745257275088548364400416034343698203887989991499893, + 21888242871839275222246405745257275088548364400416034343698203823991611804432, + 360641696238456, + 418827910286575, + 21888242871839275222246405745257275088548364400416034343698204160587169220136, + 21888242871839275222246405745257275088548364400416034343698203939254703162574, + 105692038036501, + 63661037066956, + 21888242871839275222246405745257275088548364400416034343698204012750829216538, + 88624404333093, + 453356244717670, + 286508283575990, + 452769080600971, + 493395055352920, + 21888242871839275222246405745257275088548364400416034343698203988228616762021, + 403950871202989, + 214751483565041, + 21888242871839275222246405745257275088548364400416034343698203873489093038709, + 21888242871839275222246405745257275088548364400416034343698203626952584359780, + 21888242871839275222246405745257275088548364400416034343698203962094664285089, + 21888242871839275222246405745257275088548364400416034343698204150325628772788, + 21888242871839275222246405745257275088548364400416034343698203721225853471237, + 387445389885333, + 21888242871839275222246405745257275088548364400416034343698204101769642538648, + 21888242871839275222246405745257275088548364400416034343698203831779308592017, + 462443642863985, + 21888242871839275222246405745257275088548364400416034343698203755389544786481, + 21888242871839275222246405745257275088548364400416034343698203802936698963730, + 21888242871839275222246405745257275088548364400416034343698203769712123340871, + 304563973037192, + 3243679863611, + 170414671816538, + 471846009820745, + 524803331473449, + 417212518949786, + 21888242871839275222246405745257275088548364400416034343698204063080341732947, + 371736844058170, + 21888242871839275222246405745257275088548364400416034343698203892882775052813, + 203906841074560, + 487034760500868, + 21888242871839275222246405745257275088548364400416034343698204091544639282677, + 70548557802773, + 21888242871839275222246405745257275088548364400416034343698203664904547299176, + 21888242871839275222246405745257275088548364400416034343698203742687118048723, + 21888242871839275222246405745257275088548364400416034343698203764208370686106, + 21888242871839275222246405745257275088548364400416034343698203747745619062847, + 383930440702160, + 11724833526302, + 21888242871839275222246405745257275088548364400416034343698203729143793421453, + 21888242871839275222246405745257275088548364400416034343698203677640412183799, + 430717135676742, + 360577349840631, + 459182350747597, + 233211240747930, + 66844463706464, + 21888242871839275222246405745257275088548364400416034343698204076132308334738, + 21888242871839275222246405745257275088548364400416034343698204006172635472150, + 21888242871839275222246405745257275088548364400416034343698204130622344822533, + 21888242871839275222246405745257275088548364400416034343698203751806587321083, + 484263398143319, + 21888242871839275222246405745257275088548364400416034343698203735840152574685, + 508479980846650, + 141727364402484, + 299881167655932, + 531520048408014, + 13894574303999, + 226706700389928, + 158565771225368, + 21888242871839275222246405745257275088548364400416034343698203807268087150434, + 21888242871839275222246405745257275088548364400416034343698203675073843050106, + 298013590780711, + 74711133173992, + 508530740024383, + 21888242871839275222246405745257275088548364400416034343698203831367486921843, + 199793176992049, + 21888242871839275222246405745257275088548364400416034343698204041718434938917, + 21888242871839275222246405745257275088548364400416034343698204027156400486709, + 27872111602422, + 450457389865751, + 21888242871839275222246405745257275088548364400416034343698204110127511713943, + 97295186389878, + 276240573545494, + 21888242871839275222246405745257275088548364400416034343698203646543112554299, + 21888242871839275222246405745257275088548364400416034343698203873148694037945, + 127287301947355, + 21888242871839275222246405745257275088548364400416034343698203641932412015292, + 6683010994406, + 21888242871839275222246405745257275088548364400416034343698203944558990510720, + 190562171277529, + 142860941538707, + 21888242871839275222246405745257275088548364400416034343698204086295614546526, + 111273064795256, + 21888242871839275222246405745257275088548364400416034343698203946692740744477, + 21888242871839275222246405745257275088548364400416034343698203776848922417998, + 21888242871839275222246405745257275088548364400416034343698204084591067876072, + 264026820572811, + 21888242871839275222246405745257275088548364400416034343698204068951771612726, + 21888242871839275222246405745257275088548364400416034343698203629186685296697, + 284788405151136, + 21888242871839275222246405745257275088548364400416034343698203684686646659753, + 21888242871839275222246405745257275088548364400416034343698203721520940819244, + 21888242871839275222246405745257275088548364400416034343698203878068631423068, + 141293130873153, + 79715286913847, + 421505939474623, + 21888242871839275222246405745257275088548364400416034343698203646857949871272, + 21888242871839275222246405745257275088548364400416034343698203842816306007688, + 21888242871839275222246405745257275088548364400416034343698203670670042861839, + 287809341161731, + 57392359991892, + 21888242871839275222246405745257275088548364400416034343698203911663631354688, + 31750290699352, + 21888242871839275222246405745257275088548364400416034343698203871712839051049, + 467691981290018, + 179061636545307, + 21888242871839275222246405745257275088548364400416034343698203863135507732367, + 21888242871839275222246405745257275088548364400416034343698204056355482544657, + 178676919781258, + 21888242871839275222246405745257275088548364400416034343698203658648356308203, + 21888242871839275222246405745257275088548364400416034343698203666438900295911, + 128603092539189, + 21888242871839275222246405745257275088548364400416034343698204033668955290856, + 21888242871839275222246405745257275088548364400416034343698203955062906191388, + 547249138362109, + 21888242871839275222246405745257275088548364400416034343698204034225038416666, + 21888242871839275222246405745257275088548364400416034343698203731837369961542, + 21888242871839275222246405745257275088548364400416034343698203933192928414629, + 21888242871839275222246405745257275088548364400416034343698203814069640994614, + 436497604511279, + 51879381276809, + 333242342673505, + 170286448101106, + 28707335860042, + 21888242871839275222246405745257275088548364400416034343698204104326087087568, + 1827069035885, + 21888242871839275222246405745257275088548364400416034343698204125735801768849, + 306660628415270, + 21888242871839275222246405745257275088548364400416034343698203714200267093420, + 370591487094912, + 21888242871839275222246405745257275088548364400416034343698204023244567226895, + 21888242871839275222246405745257275088548364400416034343698203628619017571474, + 188153387484186, + 42920904094186, + 21888242871839275222246405745257275088548364400416034343698204050882408459516, + 328026912805444, + 486082800563540, + 21888242871839275222246405745257275088548364400416034343698204027496834968860, + 21888242871839275222246405745257275088548364400416034343698203754554071655835, + 41092806511025, + 139511524579182, + 457858400499061, + 21888242871839275222246405745257275088548364400416034343698203938754021821152, + 27588998851549, + 83557208984016, + 328140771522324, + 255324623147535, + 197063284843082, + 235656153169147, + 21888242871839275222246405745257275088548364400416034343698204051906660603719, + 167191080946872, + 13145850759908, + 27673730607439, + 247644196403906, + 2479725760063, + 21888242871839275222246405745257275088548364400416034343698204071232138245052, + 296732903829960, + 21888242871839275222246405745257275088548364400416034343698204070603633858219, + 266159465742517, + 21888242871839275222246405745257275088548364400416034343698204035479361239469, + 7391187135409, + 21888242871839275222246405745257275088548364400416034343698203811404043607492, + 52256760773051, + 50335392386292, + 56003326965943, + 88014373302301, + 21551569539254, + 21888242871839275222246405745257275088548364400416034343698204163483086101265, + 21888242871839275222246405745257275088548364400416034343698203786017500481423, + 318033800431395, + 21888242871839275222246405745257275088548364400416034343698203696262700933246, + 181846749389750, + 467089358357420, + 309171595160849, + 21888242871839275222246405745257275088548364400416034343698204083136784390968, + 542592049562154, + 21888242871839275222246405745257275088548364400416034343698203919943986512894, + 183248258250626, + 21888242871839275222246405745257275088548364400416034343698203957410989835753, + 21888242871839275222246405745257275088548364400416034343698204056758949286850, + 21888242871839275222246405745257275088548364400416034343698204038825489804410, + 186976616859451, + 21888242871839275222246405745257275088548364400416034343698203791545589537413, + 157226467002134, + 21888242871839275222246405745257275088548364400416034343698204093146427670259, + 91136236319371, + 436539310490009, + 21888242871839275222246405745257275088548364400416034343698203749064666754443, + 21888242871839275222246405745257275088548364400416034343698203643759110720839, + 21888242871839275222246405745257275088548364400416034343698203769050369617319, + 284876661719465, + 21888242871839275222246405745257275088548364400416034343698203702898621075018, + 21888242871839275222246405745257275088548364400416034343698203651179812893294, + 21888242871839275222246405745257275088548364400416034343698203713309213715518, + 22941820057487, + 420311413089258, + 168735604027527, + 21888242871839275222246405745257275088548364400416034343698204000682870051545, + 505036076245723, + 206903716078318, + 427014313716953, + 172211298146774, + 22685646326852, + 151724749609547, + 348140383228621, + 480340716504848, + 21888242871839275222246405745257275088548364400416034343698203860681391602682, + 356650418903159, + 21888242871839275222246405745257275088548364400416034343698203829836003621092, + 225529512502988, + 21888242871839275222246405745257275088548364400416034343698203909187172725335, + 151464527947877, + 21888242871839275222246405745257275088548364400416034343698203995950627676609, + 21888242871839275222246405745257275088548364400416034343698203913877290120357, + 219263553269818, + 21888242871839275222246405745257275088548364400416034343698203783736207814672, + 341187776597509, + 248856247686330, + 408183563124085, + 21888242871839275222246405745257275088548364400416034343698203627854813470019, + 21888242871839275222246405745257275088548364400416034343698203911507661757713, + 21888242871839275222246405745257275088548364400416034343698204000749765066303, + 420262926706190, + 198038391467192, + 378550521228916, + 21888242871839275222246405745257275088548364400416034343698204069401766249572, + 535921801925300, + 21888242871839275222246405745257275088548364400416034343698203640846733927018, + 21888242871839275222246405745257275088548364400416034343698203976967781886679, + 513740005368410, + 21888242871839275222246405745257275088548364400416034343698203975512366557006, + 21888242871839275222246405745257275088548364400416034343698203834371980967688, + 477383868625596, + 223783627888218, + 363354269888105, + 21888242871839275222246405745257275088548364400416034343698204025870849366869, + 116601214326311, + 110825907952750, + 21888242871839275222246405745257275088548364400416034343698204061245304873108, + 52548081775751, + 339427415883413, + 21888242871839275222246405745257275088548364400416034343698203870122785682178, + 21888242871839275222246405745257275088548364400416034343698204029498606025157, + 429687226172019, + 48595057730009, + 447800394533958, + 21888242871839275222246405745257275088548364400416034343698203708423245975109, + 71632679595583, + 113669252097989, + 21888242871839275222246405745257275088548364400416034343698203770617075690945, + 21888242871839275222246405745257275088548364400416034343698204062758816137902, + 21888242871839275222246405745257275088548364400416034343698203802773186394402, + 21888242871839275222246405745257275088548364400416034343698204184395710952589, + 321257951267124, + 445514150794633, + 481173588123721, + 326317179423795, + 21888242871839275222246405745257275088548364400416034343698203645715404477658, + 21888242871839275222246405745257275088548364400416034343698203741792189474501, + 21888242871839275222246405745257275088548364400416034343698203944212189113571, + 21888242871839275222246405745257275088548364400416034343698203727699194871687, + 21888242871839275222246405745257275088548364400416034343698203952329773225608, + 21888242871839275222246405745257275088548364400416034343698203882240151014545, + 21888242871839275222246405745257275088548364400416034343698204116118467825713, + 368078574241846, + 21888242871839275222246405745257275088548364400416034343698203721621763787059, + 21888242871839275222246405745257275088548364400416034343698203805146796120256, + 21888242871839275222246405745257275088548364400416034343698204155632092601061, + 21888242871839275222246405745257275088548364400416034343698203801307856115825, + 21888242871839275222246405745257275088548364400416034343698203955043064318329, + 122077005521560, + 341062397950605, + 416733036397771, + 549061354680006, + 420270052347676, + 21888242871839275222246405745257275088548364400416034343698203781322824004790, + 21888242871839275222246405745257275088548364400416034343698204141742802165493, + 21888242871839275222246405745257275088548364400416034343698203635249514462051, + 21888242871839275222246405745257275088548364400416034343698203912791358787093, + 21888242871839275222246405745257275088548364400416034343698204111230155502836, + 21888242871839275222246405745257275088548364400416034343698203913961119309730, + 79973272947882, + 21888242871839275222246405745257275088548364400416034343698204009078681907796, + 199283796967600, + 413121754005928, + 21888242871839275222246405745257275088548364400416034343698203845554095103760, + 342524657588134, + 21888242871839275222246405745257275088548364400416034343698203753601134094345, + 21888242871839275222246405745257275088548364400416034343698203674227378277243, + 21888242871839275222246405745257275088548364400416034343698204111622004242682, + 21888242871839275222246405745257275088548364400416034343698203637420233005616, + 21888242871839275222246405745257275088548364400416034343698203923334144715864, + 344028230722714, + 21888242871839275222246405745257275088548364400416034343698203949814361802375, + 21888242871839275222246405745257275088548364400416034343698204087996180034541, + 21888242871839275222246405745257275088548364400416034343698203870419234262498, + 21888242871839275222246405745257275088548364400416034343698203968524602625346, + 540158793459195, + 21888242871839275222246405745257275088548364400416034343698203663402161028290, + 392458558111758, + 263034667869360, + 40981580625797, + 179762746179423, + 21888242871839275222246405745257275088548364400416034343698203997879342762404, + 21888242871839275222246405745257275088548364400416034343698204150025445655837, + 21888242871839275222246405745257275088548364400416034343698204103839775219883, + 376829184745422, + 501508866874543, + 21888242871839275222246405745257275088548364400416034343698203725303064627029, + 349397046720658, + 125668553510659, + 21888242871839275222246405745257275088548364400416034343698204174460708593238, + 21888242871839275222246405745257275088548364400416034343698203750451570912681, + 21888242871839275222246405745257275088548364400416034343698204161285270840392, + 21888242871839275222246405745257275088548364400416034343698203974498117503390, + 21888242871839275222246405745257275088548364400416034343698203928615701952316, + 21888242871839275222246405745257275088548364400416034343698203793455076272562, + 21888242871839275222246405745257275088548364400416034343698204000800991618509, + 21888242871839275222246405745257275088548364400416034343698203657156459291606, + 21888242871839275222246405745257275088548364400416034343698204031256435913006, + 21888242871839275222246405745257275088548364400416034343698203649264661134500, + 21888242871839275222246405745257275088548364400416034343698203861339459279452, + 21888242871839275222246405745257275088548364400416034343698203796609287513766, + 280040214408089, + 516644294552064, + 21888242871839275222246405745257275088548364400416034343698203764709900290977, + 172636210702090, + 21888242871839275222246405745257275088548364400416034343698204037445179539432, + 1491650909396, + 339055232285578, + 21888242871839275222246405745257275088548364400416034343698203660959869601581, + 21888242871839275222246405745257275088548364400416034343698203721773781053044, + 218522989120016, + 338551546696251, + 488381446280788, + 21888242871839275222246405745257275088548364400416034343698203703114425193665, + 259073988489902, + 447625212636480, + 21888242871839275222246405745257275088548364400416034343698203729784454967207, + 21888242871839275222246405745257275088548364400416034343698204068518813633120, + 21888242871839275222246405745257275088548364400416034343698203908543242348466, + 21888242871839275222246405745257275088548364400416034343698203793880540015509, + 204547114284834, + 487649826303939, + 21888242871839275222246405745257275088548364400416034343698203947431053163967, + 21888242871839275222246405745257275088548364400416034343698203858778263724587, + 21888242871839275222246405745257275088548364400416034343698203728246473818883, + 427682992752182, + 274270206200221, + 252995664471268, + 21888242871839275222246405745257275088548364400416034343698203854089805643216, + 21888242871839275222246405745257275088548364400416034343698204058651127444110, + 487732651641908, + 21888242871839275222246405745257275088548364400416034343698203943644445739136, + 21888242871839275222246405745257275088548364400416034343698203700735104731859, + 513443541631700, + 351215737848639, + 296208312876034, + 158982989342247, + 21888242871839275222246405745257275088548364400416034343698203853888426334471, + 534880066821684, + 21888242871839275222246405745257275088548364400416034343698203709429609297761, + 21888242871839275222246405745257275088548364400416034343698203841441988849813, + 21888242871839275222246405745257275088548364400416034343698203685621883538195, + 21888242871839275222246405745257275088548364400416034343698203791111290382241, + 26655708736720, + 362558505902648, + 21888242871839275222246405745257275088548364400416034343698203658814784223948, + 21888242871839275222246405745257275088548364400416034343698204002403156820556, + 21888242871839275222246405745257275088548364400416034343698203653533497460223, + 21888242871839275222246405745257275088548364400416034343698203733615396088884, + 21888242871839275222246405745257275088548364400416034343698203879786163428646, + 321519937384442, + 21888242871839275222246405745257275088548364400416034343698203627977666438005, + 467430607832325, + 21888242871839275222246405745257275088548364400416034343698203842787622049444, + 489257033476650, + 294374864644667, + 251825753316081, + 287472797281584, + 259470963458747, + 429744239614121, + 21888242871839275222246405745257275088548364400416034343698203679295034391672, + 153696473809343, + 21888242871839275222246405745257275088548364400416034343698203994893445514994, + 21888242871839275222246405745257275088548364400416034343698204118052763289697, + 21888242871839275222246405745257275088548364400416034343698203924270811280908, + 373280859783914, + 21888242871839275222246405745257275088548364400416034343698203903409416661046, + 516896006358541, + 236682528219540, + 21888242871839275222246405745257275088548364400416034343698203671453893490411, + 226074606822969, + 266069942394076, + 21888242871839275222246405745257275088548364400416034343698203725086714265115, + 21888242871839275222246405745257275088548364400416034343698204091564156807434, + 257619663993074, + 21888242871839275222246405745257275088548364400416034343698203753599377970014, + 21888242871839275222246405745257275088548364400416034343698203701937342555632, + 79943475089363, + 369065723823619, + 192890728150551, + 100399006665196, + 21888242871839275222246405745257275088548364400416034343698203662428371536855, + 21888242871839275222246405745257275088548364400416034343698203718361397706573, + 21888242871839275222246405745257275088548364400416034343698203982710753364872, + 21888242871839275222246405745257275088548364400416034343698203810392551386139, + 36205500236915, + 110887253882627, + 388999152604801, + 66336553653196, + 509003856462219, + 179516275509685, + 301282014562950, + 451107452163483, + 21888242871839275222246405745257275088548364400416034343698203802746270308585, + 21888242871839275222246405745257275088548364400416034343698204052423401062332, + 21888242871839275222246405745257275088548364400416034343698203920221476703909, + 247329557482780, + 340369542261742, + 21888242871839275222246405745257275088548364400416034343698203951246917449353, + 327397001356912, + 537897817319968, + 21888242871839275222246405745257275088548364400416034343698203725404498045999, + 359044330193095, + 545422896730625, + 545944656523287, + 263058160335292, + 21888242871839275222246405745257275088548364400416034343698203665369079129621, + 155953751382644, + 21888242871839275222246405745257275088548364400416034343698203633181159107270, + 21888242871839275222246405745257275088548364400416034343698203935841463212263, + 478056103039388, + 21888242871839275222246405745257275088548364400416034343698203981219492340295, + 21888242871839275222246405745257275088548364400416034343698204101893442049819, + 21888242871839275222246405745257275088548364400416034343698203644217432316363, + 21888242871839275222246405745257275088548364400416034343698203743355394184136, + 9804096402041, + 540757368584221, + 61858113103626, + 21888242871839275222246405745257275088548364400416034343698204150147942387685, + 21888242871839275222246405745257275088548364400416034343698203922708841875133, + 93670743136936, + 21888242871839275222246405745257275088548364400416034343698203701018743414185, + 21888242871839275222246405745257275088548364400416034343698203644994836838225, + 21888242871839275222246405745257275088548364400416034343698203680130001918723, + 21888242871839275222246405745257275088548364400416034343698203951033133909991, + 21888242871839275222246405745257275088548364400416034343698204130485133649363, + 510049813228604, + 21888242871839275222246405745257275088548364400416034343698203711928585517996, + 21888242871839275222246405745257275088548364400416034343698204081491996907195, + 235468905794077, + 21888242871839275222246405745257275088548364400416034343698203850311089365517, + 113313500151167, + 91342564080566, + 21888242871839275222246405745257275088548364400416034343698204128045646954678, + 21888242871839275222246405745257275088548364400416034343698203826572413571696, + 21888242871839275222246405745257275088548364400416034343698203789896725557043, + 157055704297559, + 284596007086722, + 21888242871839275222246405745257275088548364400416034343698203797689325522022, + 237886602168971, + 396759990091140, + 21888242871839275222246405745257275088548364400416034343698204001821584179533, + 160387032498460, + 394069536997372, + 416923219010300, + 340051509756396, + 21888242871839275222246405745257275088548364400416034343698203838721146571307, + 21888242871839275222246405745257275088548364400416034343698203958784545804932, + 21888242871839275222246405745257275088548364400416034343698204078067532482108, + 259510743793100, + 21888242871839275222246405745257275088548364400416034343698203905119525245216, + 21888242871839275222246405745257275088548364400416034343698204145546258243747, + 21888242871839275222246405745257275088548364400416034343698203989255852604830, + 310125936029124, + 353248597121055, + 21888242871839275222246405745257275088548364400416034343698203627015414219330, + 21888242871839275222246405745257275088548364400416034343698204166072312038231, + 471985649100833, + 21888242871839275222246405745257275088548364400416034343698203732681908963622, + 21888242871839275222246405745257275088548364400416034343698203653481025879421, + 497151593943369, + 78993676299005, + 21888242871839275222246405745257275088548364400416034343698203696730013128216, + 21888242871839275222246405745257275088548364400416034343698203957925219192720, + 149692498988039, + 21888242871839275222246405745257275088548364400416034343698203864563712115241, + 21888242871839275222246405745257275088548364400416034343698203821104018663971, + 561978505089644, + 21888242871839275222246405745257275088548364400416034343698204004195901316538, + 327693000680579, + 71083650302466, + 343602709009269, + 514284296099103, + 21888242871839275222246405745257275088548364400416034343698204162527762797590, + 21888242871839275222246405745257275088548364400416034343698203888152808345315, + 153762162189470, + 21888242871839275222246405745257275088548364400416034343698203683000312237460, + 299325091909518, + 21888242871839275222246405745257275088548364400416034343698204109549697191594, + 21888242871839275222246405745257275088548364400416034343698203984743474710297, + 21888242871839275222246405745257275088548364400416034343698204099424022427675, + 431699570294471, + 21888242871839275222246405745257275088548364400416034343698203847705749033474, + 21888242871839275222246405745257275088548364400416034343698204123090372315107, + 21888242871839275222246405745257275088548364400416034343698203771550162466879, + 559608179633871, + 21888242871839275222246405745257275088548364400416034343698203749603636796104, + 21888242871839275222246405745257275088548364400416034343698203708911271198678, + 21888242871839275222246405745257275088548364400416034343698204138465283768736, + 70091493695077, + 21888242871839275222246405745257275088548364400416034343698203642725704463618, + 50887222253430, + 414674736676831, + 488867101802735, + 142581275985670, + 21888242871839275222246405745257275088548364400416034343698203788248494837553, + 21888242871839275222246405745257275088548364400416034343698204145735428243392, + 105090435720298, + 64292545608094, + 21888242871839275222246405745257275088548364400416034343698204093770332587586, + 21888242871839275222246405745257275088548364400416034343698203719765400046912, + 304674826560470, + 558938991124593, + 413143589991835, + 21888242871839275222246405745257275088548364400416034343698204108400786073808, + 21888242871839275222246405745257275088548364400416034343698203962859418124894, + 21888242871839275222246405745257275088548364400416034343698204130222540980950, + 21888242871839275222246405745257275088548364400416034343698203674012008717890, + 21888242871839275222246405745257275088548364400416034343698204054563697604588, + 239903628796539, + 433734434965066, + 509538984767331, + 452619736656284, + 9849220416622, + 280229983599626, + 428051296435524, + 329197756336603, + 21888242871839275222246405745257275088548364400416034343698204143997717732957, + 21888242871839275222246405745257275088548364400416034343698204040231444313905, + 415858539012993, + 21888242871839275222246405745257275088548364400416034343698203778853481787185, + 399010259993068, + 245182468092182, + 21888242871839275222246405745257275088548364400416034343698203996766997813515, + 435116847766702, + 470897853092298, + 222740875276247, + 21888242871839275222246405745257275088548364400416034343698203822531581693708, + 96149187647748, + 21888242871839275222246405745257275088548364400416034343698204176598250898199, + 21888242871839275222246405745257275088548364400416034343698204074930025407281, + 376468463302802, + 21888242871839275222246405745257275088548364400416034343698204168820843203007, + 21888242871839275222246405745257275088548364400416034343698203884447120157140, + 526212625584636, + 21888242871839275222246405745257275088548364400416034343698203805820315932005, + 21888242871839275222246405745257275088548364400416034343698204007104681868225, + 227670340677051, + 288538417626910, + 34576808491726, + 21888242871839275222246405745257275088548364400416034343698204142978971509924, + 21888242871839275222246405745257275088548364400416034343698204149901438563479, + 21888242871839275222246405745257275088548364400416034343698203952565333457343, + 555248767921053, + 180778176496023, + 455116235919025, + 21888242871839275222246405745257275088548364400416034343698203810466982736201, + 312611602138837, + 21888242871839275222246405745257275088548364400416034343698203770459326650049, + 21888242871839275222246405745257275088548364400416034343698203680737635674910, + 176178003324794, + 21888242871839275222246405745257275088548364400416034343698203861977021448730, + 21888242871839275222246405745257275088548364400416034343698203908098460090870, + 21888242871839275222246405745257275088548364400416034343698203759120119131333, + 33706664207093, + 546885799917721, + 21888242871839275222246405745257275088548364400416034343698203936726801456325, + 21888242871839275222246405745257275088548364400416034343698204002944221282480, + 21888242871839275222246405745257275088548364400416034343698203657004759438787, + 21888242871839275222246405745257275088548364400416034343698203975934016675251, + 21888242871839275222246405745257275088548364400416034343698203649012289140222, + 177306915542814, + 23259161605048, + 405015290278267, + 21888242871839275222246405745257275088548364400416034343698203811105049475517, + 535303656522978, + 21888242871839275222246405745257275088548364400416034343698204062177666660373, + 334933503589380, + 38885009158458, + 381729822710572, + 55371140808154, + 21888242871839275222246405745257275088548364400416034343698203795962256395916, + 21888242871839275222246405745257275088548364400416034343698203628447250938268, + 21888242871839275222246405745257275088548364400416034343698203692844352268864, + 21888242871839275222246405745257275088548364400416034343698204047827851521675, + 427447063694234, + 21888242871839275222246405745257275088548364400416034343698203868971271186140, + 21888242871839275222246405745257275088548364400416034343698204158809940558613, + 213527959048707, + 324414490239925, + 21888242871839275222246405745257275088548364400416034343698204185234993124227, + 21888242871839275222246405745257275088548364400416034343698203866599137243004, + 21888242871839275222246405745257275088548364400416034343698203806113092494557, + 280820359171274, + 21888242871839275222246405745257275088548364400416034343698203739430831643802, + 28832708306816, + 492153364665616, + 21888242871839275222246405745257275088548364400416034343698203638811324748315, + 328883433223196, + 21888242871839275222246405745257275088548364400416034343698204020745185717121, + 461139642577248, + 154275874249769, + 345586291316137, + 166095814565257, + 62337716506397, + 490333088998277, + 330840915830273, + 21888242871839275222246405745257275088548364400416034343698203800675915207579, + 21888242871839275222246405745257275088548364400416034343698203946136186843638, + 21888242871839275222246405745257275088548364400416034343698203658349124783362, + 21888242871839275222246405745257275088548364400416034343698203663573874411500, + 289873177810143, + 21888242871839275222246405745257275088548364400416034343698203935046182587326, + 21888242871839275222246405745257275088548364400416034343698203912325503146334, + 21888242871839275222246405745257275088548364400416034343698203763116777690468, + 21888242871839275222246405745257275088548364400416034343698203691845369091388, + 199121184208621, + 21888242871839275222246405745257275088548364400416034343698204045481549687522, + 512104678576390, + 21888242871839275222246405745257275088548364400416034343698203781909714405354, + 555847034854014, + 21888242871839275222246405745257275088548364400416034343698203910529994382723, + 21888242871839275222246405745257275088548364400416034343698204175750098097871, + 203430538825266, + 281191678093711, + 234425357894572, + 21888242871839275222246405745257275088548364400416034343698204025287752479887, + 22610660050324, + 21888242871839275222246405745257275088548364400416034343698203680316249735560, + 21888242871839275222246405745257275088548364400416034343698203962029560909820, + 23552230185203, + 21888242871839275222246405745257275088548364400416034343698204022280102428401, + 344707199822958, + 400433907718719, + 45585526252536, + 21888242871839275222246405745257275088548364400416034343698203853002239044119, + 21888242871839275222246405745257275088548364400416034343698204147662837820176, + 21888242871839275222246405745257275088548364400416034343698203726550009505252, + 339399238111223, + 183370676487392, + 21888242871839275222246405745257275088548364400416034343698204042622563824672, + 61703783104198, + 21888242871839275222246405745257275088548364400416034343698203973795671357023, + 21888242871839275222246405745257275088548364400416034343698204065472056327903, + 15336878652896, + 21888242871839275222246405745257275088548364400416034343698203797561850033117, + 189355874966157, + 21888242871839275222246405745257275088548364400416034343698203720184468754168, + 271006725139702, + 21888242871839275222246405745257275088548364400416034343698203848237062147419, + 21888242871839275222246405745257275088548364400416034343698204038331201912685, + 493327538493933, + 21888242871839275222246405745257275088548364400416034343698203933733811561073, + 21888242871839275222246405745257275088548364400416034343698204055358788346345, + 481089129596315, + 21888242871839275222246405745257275088548364400416034343698204054203395500321, + 21888242871839275222246405745257275088548364400416034343698203698423769427725, + 21888242871839275222246405745257275088548364400416034343698204110572902056753, + 21888242871839275222246405745257275088548364400416034343698203769059248991278, + 21888242871839275222246405745257275088548364400416034343698203997929190499667, + 524071536649243, + 21888242871839275222246405745257275088548364400416034343698203930222431743143, + 351894590380338, + 21888242871839275222246405745257275088548364400416034343698203668205252439042, + 3861361921394, + 141061682795225, + 21888242871839275222246405745257275088548364400416034343698204180953775451891, + 21888242871839275222246405745257275088548364400416034343698203727007542606864, + 105199855168349, + 548820367468455, + 21888242871839275222246405745257275088548364400416034343698204174792060516509, + 21888242871839275222246405745257275088548364400416034343698203770401862804914, + 21888242871839275222246405745257275088548364400416034343698203990784248821015, + 400564397291275, + 83013650009030, + 156217511680564, + 434857187198275, + 21888242871839275222246405745257275088548364400416034343698203846963588202728, + 21888242871839275222246405745257275088548364400416034343698203880127417651340, + 21888242871839275222246405745257275088548364400416034343698203951391940750111, + 21888242871839275222246405745257275088548364400416034343698203831549008600874, + 316216350342020, + 21888242871839275222246405745257275088548364400416034343698203729818181572615, + 21888242871839275222246405745257275088548364400416034343698204019524253846995, + 21888242871839275222246405745257275088548364400416034343698204080831799204283, + 21888242871839275222246405745257275088548364400416034343698203692606831885248, + 18061081355921, + 308273446445751, + 21888242871839275222246405745257275088548364400416034343698204174954216489898, + 21888242871839275222246405745257275088548364400416034343698203977632856133632, + 21888242871839275222246405745257275088548364400416034343698203660247914756035, + 21888242871839275222246405745257275088548364400416034343698203830572844522998, + 468996186583599, + 21888242871839275222246405745257275088548364400416034343698204186132504825275, + 397655366725346, + 329970185087461, + 21888242871839275222246405745257275088548364400416034343698203797717821293983, + 201115918482999, + 21888242871839275222246405745257275088548364400416034343698203917038916016405, + 542158234421977, + 21888242871839275222246405745257275088548364400416034343698204045000906933315, + 21888242871839275222246405745257275088548364400416034343698203656825589042670, + 544113391944349, + 21888242871839275222246405745257275088548364400416034343698204145434109000078, + 21888242871839275222246405745257275088548364400416034343698204086485761571625, + 190286023753117, + 428666549960965, + 21888242871839275222246405745257275088548364400416034343698203788909519319398, + 541505894999915, + 196337912887061, + 21888242871839275222246405745257275088548364400416034343698203710654363589620, + 454928090785033, + 389180287744587, + 417205666746718, + 21888242871839275222246405745257275088548364400416034343698203882404294890687, + 215640287886101, + 21888242871839275222246405745257275088548364400416034343698203940652049057493, + 282090210362411, + 526718871115586, + 21888242871839275222246405745257275088548364400416034343698204173911817270107, + 463015424098571, + 21888242871839275222246405745257275088548364400416034343698203809460202038240, + 21888242871839275222246405745257275088548364400416034343698203933257382151004, + 21888242871839275222246405745257275088548364400416034343698204181473789083993, + 456455797601714, + 21888242871839275222246405745257275088548364400416034343698203852575010552541, + 21888242871839275222246405745257275088548364400416034343698204135747887301482, + 21888242871839275222246405745257275088548364400416034343698203667680657150897, + 543698081999387, + 21888242871839275222246405745257275088548364400416034343698203644124603260237, + 21888242871839275222246405745257275088548364400416034343698203839959961560077, + 420451296881264, + 21888242871839275222246405745257275088548364400416034343698204177303191013418, + 46261996712620, + 132152624185855, + 21888242871839275222246405745257275088548364400416034343698203739585302800247, + 21888242871839275222246405745257275088548364400416034343698203960378290032984, + 21888242871839275222246405745257275088548364400416034343698203955234868290880, + 81519230869128, + 437669773679005, + 418305775161934, + 21888242871839275222246405745257275088548364400416034343698203794708823859317, + 71377863924624, + 21888242871839275222246405745257275088548364400416034343698203963352919621307, + 21888242871839275222246405745257275088548364400416034343698203641237035866067, + 21888242871839275222246405745257275088548364400416034343698203829577179875209, + 458816132345539, + 21888242871839275222246405745257275088548364400416034343698203990711434613328, + 21888242871839275222246405745257275088548364400416034343698204074746849980577, + 21888242871839275222246405745257275088548364400416034343698203899500635572166, + 21888242871839275222246405745257275088548364400416034343698203911552919447958, + 21888242871839275222246405745257275088548364400416034343698204022301268604493, + 21888242871839275222246405745257275088548364400416034343698203801259907570036, + 21888242871839275222246405745257275088548364400416034343698203672398466085907, + 196809837009505, + 21888242871839275222246405745257275088548364400416034343698204176026897241283, + 375291654913270, + 21888242871839275222246405745257275088548364400416034343698203928537755284193, + 56658125578059, + 211770451396365, + 21888242871839275222246405745257275088548364400416034343698203800251185768221, + 49523719738795, + 21888242871839275222246405745257275088548364400416034343698203671475420220107, + 21888242871839275222246405745257275088548364400416034343698203773520010109374, + 21888242871839275222246405745257275088548364400416034343698203822048613103623, + 460083805890172, + 21888242871839275222246405745257275088548364400416034343698203816183618555262, + 21888242871839275222246405745257275088548364400416034343698203711534230915273, + 515400639720634, + 291906765209598, + 263534643580892, + 21888242871839275222246405745257275088548364400416034343698203886886589497941, + 120398062813211, + 70085804879184, + 21888242871839275222246405745257275088548364400416034343698203995372643924646, + 21888242871839275222246405745257275088548364400416034343698203790533094455472, + 21888242871839275222246405745257275088548364400416034343698204038421792243434, + 21888242871839275222246405745257275088548364400416034343698203758986102002459, + 520933980205783, + 21888242871839275222246405745257275088548364400416034343698203850436122305582, + 517308224774680, + 21888242871839275222246405745257275088548364400416034343698203637028828730759, + 21888242871839275222246405745257275088548364400416034343698203666972317599975, + 21888242871839275222246405745257275088548364400416034343698203877363937899575, + 21888242871839275222246405745257275088548364400416034343698203750660949836777, + 49457914808019, + 21888242871839275222246405745257275088548364400416034343698203993279280771064, + 21888242871839275222246405745257275088548364400416034343698204139662033670529, + 535810807675982, + 21888242871839275222246405745257275088548364400416034343698203858688806196110, + 21888242871839275222246405745257275088548364400416034343698203636437838016594, + 21888242871839275222246405745257275088548364400416034343698204143335135276483, + 387019185115872, + 21888242871839275222246405745257275088548364400416034343698203750293261563516, + 78234528071436, + 311353087739754, + 21888242871839275222246405745257275088548364400416034343698203782302496472777, + 384187786204303, + 21888242871839275222246405745257275088548364400416034343698203983651375655513, + 234725070577424, + 492678861293431, + 21888242871839275222246405745257275088548364400416034343698204136244665147799, + 377686319100362, + 21888242871839275222246405745257275088548364400416034343698203850907973147139, + 316804671438887, + 306516959733361, + 21888242871839275222246405745257275088548364400416034343698204098047582551630, + 21888242871839275222246405745257275088548364400416034343698204005512996925704, + 21888242871839275222246405745257275088548364400416034343698204164526925779423, + 21888242871839275222246405745257275088548364400416034343698204058616598982996, + 348187085099513, + 21888242871839275222246405745257275088548364400416034343698203839788853834495, + 21888242871839275222246405745257275088548364400416034343698203758772707211983, + 21888242871839275222246405745257275088548364400416034343698204139527315558910, + 21888242871839275222246405745257275088548364400416034343698203734084670930569, + 416540045105610, + 21888242871839275222246405745257275088548364400416034343698204171985939786716, + 541061442032992, + 399655278144915, + 467119273872072, + 503103632560412, + 271763576860568, + 21888242871839275222246405745257275088548364400416034343698204154277546672512, + 73131680664176, + 21888242871839275222246405745257275088548364400416034343698203965491661392762, + 21888242871839275222246405745257275088548364400416034343698203738653697884767, + 38965963162187, + 21888242871839275222246405745257275088548364400416034343698203717468447596512, + 21888242871839275222246405745257275088548364400416034343698203634981987798413, + 21888242871839275222246405745257275088548364400416034343698203730517097378788, + 21888242871839275222246405745257275088548364400416034343698204007870776234015, + 21888242871839275222246405745257275088548364400416034343698203770849612001715, + 21888242871839275222246405745257275088548364400416034343698203633767602900698, + 21888242871839275222246405745257275088548364400416034343698203889278261116597, + 21888242871839275222246405745257275088548364400416034343698204109083011949116, + 477141209110606, + 21888242871839275222246405745257275088548364400416034343698203678525809661125, + 516486055443856, + 380348737920112, + 21888242871839275222246405745257275088548364400416034343698203902397404062017, + 21888242871839275222246405745257275088548364400416034343698203742218471874557, + 21888242871839275222246405745257275088548364400416034343698203698280745640021, + 21888242871839275222246405745257275088548364400416034343698203875457415824327, + 482562229093324, + 339740004936629, + 21888242871839275222246405745257275088548364400416034343698204095977744047959, + 21888242871839275222246405745257275088548364400416034343698203993378968719976, + 221943891669146, + 163346545944396, + 544224149406732, + 21888242871839275222246405745257275088548364400416034343698204081211054982316, + 21888242871839275222246405745257275088548364400416034343698203707966019444424, + 145842081633422, + 21888242871839275222246405745257275088548364400416034343698203651376213415386, + 475962166948503, + 459141607555307, + 431709557738415, + 39015541876823, + 259980185745815, + 141644091818578, + 21888242871839275222246405745257275088548364400416034343698204110182399195127, + 21888242871839275222246405745257275088548364400416034343698204090853025895878, + 483879720515464, + 21888242871839275222246405745257275088548364400416034343698204025173455917150, + 360404731597264, + 104005753457794, + 183173008718571, + 21888242871839275222246405745257275088548364400416034343698203756160682838840, + 21888242871839275222246405745257275088548364400416034343698203865038602319000, + 28472780816459, + 23919657961425, + 111466092749397, + 438076944387594, + 101191995913848, + 70036332189410, + 312255721525319, + 21888242871839275222246405745257275088548364400416034343698204032703558054229, + 21888242871839275222246405745257275088548364400416034343698203916410266084332, + 21888242871839275222246405745257275088548364400416034343698203874891311370195, + 21888242871839275222246405745257275088548364400416034343698203891080076021496, + 21888242871839275222246405745257275088548364400416034343698203835932203831324, + 21888242871839275222246405745257275088548364400416034343698203697693152658159, + 256615374414109, + 21888242871839275222246405745257275088548364400416034343698203820974761455923, + 21888242871839275222246405745257275088548364400416034343698204006663467685446, + 141719435136156, + 496119912659809, + 21888242871839275222246405745257275088548364400416034343698204039039409909655, + 21888242871839275222246405745257275088548364400416034343698203889341760260160, + 21888242871839275222246405745257275088548364400416034343698204104221867342363, + 21888242871839275222246405745257275088548364400416034343698203737952004937809, + 451841045944737, + 271050676322767, + 21888242871839275222246405745257275088548364400416034343698203644761967180620, + 473725314738211, + 189708625833249, + 396101160028606, + 21888242871839275222246405745257275088548364400416034343698203923823533183604, + 190367703867366, + 305584301971612, + 475386764184531, + 21888242871839275222246405745257275088548364400416034343698204045468485106424, + 158114717036884, + 259575173688838, + 21888242871839275222246405745257275088548364400416034343698204029409720307946, + 21888242871839275222246405745257275088548364400416034343698203801168517974734, + 43103584813698, + 113055344961024, + 551057339787623, + 21888242871839275222246405745257275088548364400416034343698204031484737399844, + 262911473130072, + 92354510819904, + 21888242871839275222246405745257275088548364400416034343698203746598044534272, + 21888242871839275222246405745257275088548364400416034343698204175427712594621, + 21888242871839275222246405745257275088548364400416034343698203938618044420316, + 467926483387352, + 160408198927014, + 21888242871839275222246405745257275088548364400416034343698204083122973715104, + 21888242871839275222246405745257275088548364400416034343698203837751770255925, + 222402876696, + 21888242871839275222246405745257275088548364400416034343698203771912678913299, + 21888242871839275222246405745257275088548364400416034343698204012771331284540, + 460250239654179, + 21888242871839275222246405745257275088548364400416034343698204066676911310735, + 192414216157243, + 21888242871839275222246405745257275088548364400416034343698204138851258788553, + 244521524874115, + 21888242871839275222246405745257275088548364400416034343698203914543160143988, + 21888242871839275222246405745257275088548364400416034343698204047851936894484, + 21888242871839275222246405745257275088548364400416034343698203830933706607008, + 179349001993991, + 21888242871839275222246405745257275088548364400416034343698204147530024324454, + 290693041281313, + 560830918792002, + 21888242871839275222246405745257275088548364400416034343698204148348473029183, + 21888242871839275222246405745257275088548364400416034343698204088031652320142, + 21888242871839275222246405745257275088548364400416034343698204121676011284592, + 21888242871839275222246405745257275088548364400416034343698204100913693371449, + 272931777244993, + 176015501861722, + 400736077380953, + 21888242871839275222246405745257275088548364400416034343698204016556920102168, + 21888242871839275222246405745257275088548364400416034343698203659593862528063, + 105932362265292, + 253999123255526, + 209012408675317, + 21888242871839275222246405745257275088548364400416034343698204079647365715741, + 398616633760573, + 21888242871839275222246405745257275088548364400416034343698203816340087834708, + 21888242871839275222246405745257275088548364400416034343698203824004318773386, + 324083269314715, + 150219919224470, + 21888242871839275222246405745257275088548364400416034343698203924994050023235, + 262704643839178, + 424353589055162, + 21888242871839275222246405745257275088548364400416034343698204080471160856762, + 21888242871839275222246405745257275088548364400416034343698203700067068868169, + 484092926615753, + 537606821392625, + 21888242871839275222246405745257275088548364400416034343698203738373775555694, + 21888242871839275222246405745257275088548364400416034343698204073757750402127, + 525346709503051, + 21888242871839275222246405745257275088548364400416034343698204149517031121613, + 381960669464719, + 272234454929323, + 339061799966650, + 21888242871839275222246405745257275088548364400416034343698203644932804086368, + 21888242871839275222246405745257275088548364400416034343698203981771704159589, + 21888242871839275222246405745257275088548364400416034343698203969037409483090, + 21888242871839275222246405745257275088548364400416034343698203960392130189006, + 21888242871839275222246405745257275088548364400416034343698204139744986835656, + 21888242871839275222246405745257275088548364400416034343698204099005877725928, + 21888242871839275222246405745257275088548364400416034343698203677231858152236, + 21888242871839275222246405745257275088548364400416034343698204123337935230481, + 138955648645741, + 21888242871839275222246405745257275088548364400416034343698203806630142614596, + 410225674788582, + 251345750246884, + 21888242871839275222246405745257275088548364400416034343698204127299572683280, + 21888242871839275222246405745257275088548364400416034343698203809120907221912, + 215256602457150, + 21888242871839275222246405745257275088548364400416034343698203998470500414609, + 21888242871839275222246405745257275088548364400416034343698204037940844897126, + 38958076217641, + 21888242871839275222246405745257275088548364400416034343698204037823225340320, + 505030628767853, + 87428976540604, + 172097720508692, + 560019103401935, + 21888242871839275222246405745257275088548364400416034343698204050659545925517, + 279019043795988, + 21888242871839275222246405745257275088548364400416034343698203888424099486221, + 21888242871839275222246405745257275088548364400416034343698204017633970349615, + 549831360251725, + 506434935029465, + 21888242871839275222246405745257275088548364400416034343698203681171303193524, + 207998722049735, + 21888242871839275222246405745257275088548364400416034343698203833412084187959, + 536586953159516, + 313088858106252, + 493190700515733, + 21888242871839275222246405745257275088548364400416034343698203638735370888281, + 343668251062490, + 21888242871839275222246405745257275088548364400416034343698204022283185820870, + 473103509959437, + 204250444054747, + 21888242871839275222246405745257275088548364400416034343698204145519278776826, + 453694941246047, + 21888242871839275222246405745257275088548364400416034343698203728668170561984, + 21888242871839275222246405745257275088548364400416034343698203928319891531025, + 436069572893873, + 21888242871839275222246405745257275088548364400416034343698203634493006722249, + 144332552490759, + 21888242871839275222246405745257275088548364400416034343698204044537711370982, + 419119899949767, + 21888242871839275222246405745257275088548364400416034343698204144587104893031, + 549189977219477, + 21888242871839275222246405745257275088548364400416034343698203703687771596420, + 21888242871839275222246405745257275088548364400416034343698203824856827165303, + 21888242871839275222246405745257275088548364400416034343698203686439912752244, + 21888242871839275222246405745257275088548364400416034343698203715243848462631, + 21888242871839275222246405745257275088548364400416034343698203829514321322807, + 21888242871839275222246405745257275088548364400416034343698203671610704055641, + 21888242871839275222246405745257275088548364400416034343698204144927319962365, + 21888242871839275222246405745257275088548364400416034343698204056532114485424, + 21888242871839275222246405745257275088548364400416034343698203970050785325026, + 26779744469476, + 21888242871839275222246405745257275088548364400416034343698203778149115490242, + 5572565528661, + 32938975751944, + 21888242871839275222246405745257275088548364400416034343698204077996416927448, + 21888242871839275222246405745257275088548364400416034343698203660081505336579, + 149330241656198, + 125695592668482, + 473241936549551, + 397776210000909, + 47488402165299, + 312609213905463, + 314254089566420, + 364075964300006, + 21888242871839275222246405745257275088548364400416034343698204023485384538165, + 252666824308236, + 21888242871839275222246405745257275088548364400416034343698203878231544114139, + 21888242871839275222246405745257275088548364400416034343698203907342367136598, + 21888242871839275222246405745257275088548364400416034343698203644629759345806, + 21888242871839275222246405745257275088548364400416034343698203708311377581007, + 558162143777534, + 308936468398191, + 6512216866222, + 21888242871839275222246405745257275088548364400416034343698204141934234713958, + 129490203394590, + 21888242871839275222246405745257275088548364400416034343698203648980474918238, + 462399032919327, + 21888242871839275222246405745257275088548364400416034343698203770651028262018, + 451277284988270, + 21888242871839275222246405745257275088548364400416034343698204009735923314963, + 438590179578042, + 21888242871839275222246405745257275088548364400416034343698203921933234756441, + 424532661590605, + 21888242871839275222246405745257275088548364400416034343698203768748897934776, + 497965064515710, + 399313701496034, + 21888242871839275222246405745257275088548364400416034343698204086011545861465, + 21888242871839275222246405745257275088548364400416034343698203874767349699760, + 513404519131636, + 21888242871839275222246405745257275088548364400416034343698203802155962002128, + 232091108297933, + 154423285707092, + 61957665436340, + 217928542734616, + 21888242871839275222246405745257275088548364400416034343698204116776854661694, + 21888242871839275222246405745257275088548364400416034343698203657327100703425, + 21888242871839275222246405745257275088548364400416034343698204031678572454239, + 205694832019971, + 21888242871839275222246405745257275088548364400416034343698204070590239777287, + 380946303132963, + 21888242871839275222246405745257275088548364400416034343698203686583948490212, + 21888242871839275222246405745257275088548364400416034343698204134763543074824, + 182193457706348, + 21888242871839275222246405745257275088548364400416034343698204010813005942502, + 21888242871839275222246405745257275088548364400416034343698203749467898618136, + 469604301681051, + 21888242871839275222246405745257275088548364400416034343698203989696222343247, + 46424156204176, + 487197570608603, + 199726223958759, + 528182000204794, + 280235355249274, + 434245482650595, + 21888242871839275222246405745257275088548364400416034343698203924445423267692, + 21888242871839275222246405745257275088548364400416034343698203912672649008052, + 21888242871839275222246405745257275088548364400416034343698203998793201477748, + 535267425961191, + 21888242871839275222246405745257275088548364400416034343698204109623858999542, + 21888242871839275222246405745257275088548364400416034343698203960181455212016, + 270067308200299, + 327914068579493, + 21888242871839275222246405745257275088548364400416034343698203941453983255286, + 21888242871839275222246405745257275088548364400416034343698203767904191718076, + 327586119767675, + 21888242871839275222246405745257275088548364400416034343698204049636763613673, + 443482649408084, + 194852083083961, + 554282275333592, + 21888242871839275222246405745257275088548364400416034343698204031929350832984, + 21888242871839275222246405745257275088548364400416034343698203840165280520859, + 21888242871839275222246405745257275088548364400416034343698203900906428220085, + 21888242871839275222246405745257275088548364400416034343698203945447432020819, + 100387050030156, + 445378864430572, + 21888242871839275222246405745257275088548364400416034343698203661098923156309, + 256146569641766, + 287120266006984, + 21888242871839275222246405745257275088548364400416034343698203799089866494515, + 388653596207329, + 21888242871839275222246405745257275088548364400416034343698203891141975811030, + 21888242871839275222246405745257275088548364400416034343698203809630146910864, + 78071008420011, + 169761589610274, + 248860029029376, + 21888242871839275222246405745257275088548364400416034343698203634361846038321, + 149298483407022, + 261683460311840, + 482485351603284, + 477320986155745, + 414414289402910, + 21888242871839275222246405745257275088548364400416034343698203916938030939764, + 1678592014670, + 21888242871839275222246405745257275088548364400416034343698203691493439162488, + 21888242871839275222246405745257275088548364400416034343698203710262620931943, + 328867440740215, + 21888242871839275222246405745257275088548364400416034343698203716616730214657, + 404731055955731, + 21888242871839275222246405745257275088548364400416034343698203665420729342089, + 408602507644066, + 21888242871839275222246405745257275088548364400416034343698204003188256495483, + 37567743677678, + 21888242871839275222246405745257275088548364400416034343698204149407596891956, + 21888242871839275222246405745257275088548364400416034343698203767977631881523, + 21888242871839275222246405745257275088548364400416034343698203762196397615826, + 7624669908725, + 446999686348247, + 21888242871839275222246405745257275088548364400416034343698203939341163554946, + 361142395884232, + 505691673822715, + 401143389045128, + 199639470400069, + 394471681296695, + 270568335587606, + 21888242871839275222246405745257275088548364400416034343698204047082571865470, + 21888242871839275222246405745257275088548364400416034343698203699790046771010, + 285043356675838, + 21888242871839275222246405745257275088548364400416034343698203973429853847461, + 439115052130310, + 21888242871839275222246405745257275088548364400416034343698204016448216991869, + 21888242871839275222246405745257275088548364400416034343698204160938219416287, + 538981994267463, + 21888242871839275222246405745257275088548364400416034343698203805990801117378, + 453095009154136, + 21888242871839275222246405745257275088548364400416034343698203943235068352117, + 445657098009563, + 23288738298027, + 152139977316035, + 21888242871839275222246405745257275088548364400416034343698203989243541591489, + 251713353287788, + 21888242871839275222246405745257275088548364400416034343698203932605755142906, + 294291766318913, + 28450447614083, + 436027970371571, + 21888242871839275222246405745257275088548364400416034343698203843441571710787, + 241818847593274, + 512661930088806, + 21888242871839275222246405745257275088548364400416034343698203674033057231633, + 481356500020439, + 95084118314723, + 21888242871839275222246405745257275088548364400416034343698203858981468711118, + 306783532999964, + 11335545416438, + 254991919165005, + 402655063173354, + 462019150292986, + 21888242871839275222246405745257275088548364400416034343698204009982955881641, + 497534864018361, + 21888242871839275222246405745257275088548364400416034343698204047462885871631, + 21888242871839275222246405745257275088548364400416034343698203777629885461006, + 66154688204267, + 525766405344425, + 145973661126760, + 527634956844615, + 191129225095461, + 446359665078973, + 188026557665562, + 21888242871839275222246405745257275088548364400416034343698203805416378298533, + 488677579805066, + 21888242871839275222246405745257275088548364400416034343698203769038858240394, + 21888242871839275222246405745257275088548364400416034343698203760137246778600, + 21888242871839275222246405745257275088548364400416034343698203947332532327716, + 21888242871839275222246405745257275088548364400416034343698203932353297316954, + 145756259897018, + 324898274995700, + 21888242871839275222246405745257275088548364400416034343698203632872668165343, + 128719621163077, + 79076993081946, + 21888242871839275222246405745257275088548364400416034343698204170979374596370, + 247236409380884, + 450116383808689, + 21888242871839275222246405745257275088548364400416034343698203892690518022556, + 58561266377770, + 21888242871839275222246405745257275088548364400416034343698203919827911795861, + 30732026772790, + 174515901417325, + 299089560008763, + 549940511615645, + 21888242871839275222246405745257275088548364400416034343698203903319672743993, + 421064714354761, + 434915351164341, + 21888242871839275222246405745257275088548364400416034343698204181463521029215, + 192335126534574, + 21888242871839275222246405745257275088548364400416034343698203982704161987011, + 21888242871839275222246405745257275088548364400416034343698203897043767727269, + 112236297255886, + 21888242871839275222246405745257275088548364400416034343698203819078284206399, + 230640180971824, + 408408846101421, + 248736040764679, + 526048456512149, + 21888242871839275222246405745257275088548364400416034343698203639725799360341, + 294395418548382, + 21888242871839275222246405745257275088548364400416034343698204090141059745457, + 21888242871839275222246405745257275088548364400416034343698203931110742438542, + 360857116928051, + 21888242871839275222246405745257275088548364400416034343698203857307529973631, + 220327564374414, + 21888242871839275222246405745257275088548364400416034343698204002267576260275, + 21888242871839275222246405745257275088548364400416034343698203723845596273372, + 256032714614676, + 101034833899926, + 21888242871839275222246405745257275088548364400416034343698203827998957847559, + 21888242871839275222246405745257275088548364400416034343698203935745813579425, + 21888242871839275222246405745257275088548364400416034343698203680992117034340, + 21888242871839275222246405745257275088548364400416034343698204022965545037019, + 209772916282393, + 21888242871839275222246405745257275088548364400416034343698204159019226708879, + 21888242871839275222246405745257275088548364400416034343698203635540021852666, + 21888242871839275222246405745257275088548364400416034343698203796452529968334, + 21888242871839275222246405745257275088548364400416034343698203777550857781856, + 21888242871839275222246405745257275088548364400416034343698204034438522337496, + 8527837363340, + 375900488979469, + 21888242871839275222246405745257275088548364400416034343698204007808660049977, + 21888242871839275222246405745257275088548364400416034343698203938630813287619, + 82605408753977, + 21888242871839275222246405745257275088548364400416034343698204014542754141026, + 386389274254548, + 366697076616984, + 21888242871839275222246405745257275088548364400416034343698204124445982296243, + 213801790850766, + 257929317765552, + 503837964563145, + 21888242871839275222246405745257275088548364400416034343698203855849367352342, + 190964141484831, + 21888242871839275222246405745257275088548364400416034343698203945474406546590, + 513327675640355, + 325275636051271, + 21888242871839275222246405745257275088548364400416034343698203694614066955872, + 21888242871839275222246405745257275088548364400416034343698204092034372347661, + 264710440771332, + 21888242871839275222246405745257275088548364400416034343698204118978965259934, + 21888242871839275222246405745257275088548364400416034343698204111012245839871, + 21888242871839275222246405745257275088548364400416034343698203723403784725695, + 21888242871839275222246405745257275088548364400416034343698204031981017432633, + 523275647678567, + 21888242871839275222246405745257275088548364400416034343698203840852625382235, + 21888242871839275222246405745257275088548364400416034343698204109223512470354, + 470205838847718, + 21888242871839275222246405745257275088548364400416034343698203968584223773652, + 21888242871839275222246405745257275088548364400416034343698203680384522131546, + 21888242871839275222246405745257275088548364400416034343698203826303093532060, + 21888242871839275222246405745257275088548364400416034343698203709702701062727, + 21888242871839275222246405745257275088548364400416034343698203852144681539610, + 21888242871839275222246405745257275088548364400416034343698203762251272627766, + 21888242871839275222246405745257275088548364400416034343698203995603684159692, + 265882863114308, + 21888242871839275222246405745257275088548364400416034343698204159972376572477, + 320096404004276, + 21888242871839275222246405745257275088548364400416034343698203624715018755227, + 311802271366875, + 21888242871839275222246405745257275088548364400416034343698203828307830812492, + 21888242871839275222246405745257275088548364400416034343698203780518057102928, + 21888242871839275222246405745257275088548364400416034343698204051921021751899, + 404961782359142, + 21888242871839275222246405745257275088548364400416034343698204171891723050510, + 21888242871839275222246405745257275088548364400416034343698204105550153047366, + 159295239047063, + 313830011979985, + 21888242871839275222246405745257275088548364400416034343698203654605813992782, + 321044588612308, + 21888242871839275222246405745257275088548364400416034343698203863209399298416, + 157802327844215, + 21888242871839275222246405745257275088548364400416034343698204182934916428580, + 21888242871839275222246405745257275088548364400416034343698203657907266393295, + 38023236290148, + 398910176792009, + 335782344155830, + 209851487153036, + 148355910560435, + 21888242871839275222246405745257275088548364400416034343698203797071553820381, + 417232616257154, + 21888242871839275222246405745257275088548364400416034343698204015380629728069, + 21888242871839275222246405745257275088548364400416034343698203801965142203378, + 21888242871839275222246405745257275088548364400416034343698203889332717024295, + 21888242871839275222246405745257275088548364400416034343698203636413763923827, + 479399385279575, + 19853146176597, + 21888242871839275222246405745257275088548364400416034343698203821080194403497, + 21888242871839275222246405745257275088548364400416034343698203943272286879649, + 21888242871839275222246405745257275088548364400416034343698204030616710041494, + 21888242871839275222246405745257275088548364400416034343698203643668078309527, + 21888242871839275222246405745257275088548364400416034343698204162682771980565, + 286782957941369, + 77955387954079, + 21888242871839275222246405745257275088548364400416034343698203977288119831510, + 46390577542857, + 21888242871839275222246405745257275088548364400416034343698203868525484977678, + 21888242871839275222246405745257275088548364400416034343698204057749384400086, + 21888242871839275222246405745257275088548364400416034343698203714987179409037, + 21888242871839275222246405745257275088548364400416034343698203888562421498803, + 80607307399120, + 69969927471723, + 21888242871839275222246405745257275088548364400416034343698203648902153163569, + 468656755999695, + 344772258482457, + 415514732130253, + 21888242871839275222246405745257275088548364400416034343698203735839446360142, + 21888242871839275222246405745257275088548364400416034343698204046338140048295, + 21888242871839275222246405745257275088548364400416034343698204004354600532756, + 24465672777677, + 215599910570867, + 21888242871839275222246405745257275088548364400416034343698204163261432073871, + 94731615984042, + 21888242871839275222246405745257275088548364400416034343698203883769936050771, + 97685220412651, + 21888242871839275222246405745257275088548364400416034343698203995140228656459, + 1064092422099, + 21888242871839275222246405745257275088548364400416034343698203735043563549608, + 330771490453614, + 160647406583354, + 21888242871839275222246405745257275088548364400416034343698203910067619036037, + 264499309418040, + 21888242871839275222246405745257275088548364400416034343698204114331439808215, + 21888242871839275222246405745257275088548364400416034343698203835150474973328, + 53070887793967, + 310739443895496, + 21888242871839275222246405745257275088548364400416034343698203652637350160552, + 431829346396602, + 21888242871839275222246405745257275088548364400416034343698203673705961976331, + 45793800621333, + 230451282540196, + 20484106798392, + 21888242871839275222246405745257275088548364400416034343698204102755007900086, + 293893003396253, + 21888242871839275222246405745257275088548364400416034343698203635813859397929, + 339137367900789, + 527462990661004, + 150142133870037, + 21888242871839275222246405745257275088548364400416034343698204092531857021366, + 21888242871839275222246405745257275088548364400416034343698203787225765992532, + 21888242871839275222246405745257275088548364400416034343698203870949660594752, + 21888242871839275222246405745257275088548364400416034343698203914995250226989, + 21888242871839275222246405745257275088548364400416034343698203894107351885437, + 555582747299862, + 384031696545285, + 30384292228883, + 445849545684841, + 21888242871839275222246405745257275088548364400416034343698203671391373603420, + 21888242871839275222246405745257275088548364400416034343698204028902459016189, + 540124324788160, + 189229259152564, + 21888242871839275222246405745257275088548364400416034343698203797910703721860, + 197707471172649, + 255180862935271, + 21888242871839275222246405745257275088548364400416034343698204059222076293851, + 396487828289863, + 357928492315800, + 390019024151743, + 21888242871839275222246405745257275088548364400416034343698203843908000259424, + 21888242871839275222246405745257275088548364400416034343698203943999588812597, + 448088579743770, + 21888242871839275222246405745257275088548364400416034343698203745031367797493, + 21888242871839275222246405745257275088548364400416034343698204025378455854984, + 21888242871839275222246405745257275088548364400416034343698203718730576532688, + 252367693796566, + 21888242871839275222246405745257275088548364400416034343698203942860008834610, + 21888242871839275222246405745257275088548364400416034343698204069849842297273, + 21888242871839275222246405745257275088548364400416034343698203987296483195565, + 21888242871839275222246405745257275088548364400416034343698203936973812390328, + 561184221895654, + 129122859376798, + 21888242871839275222246405745257275088548364400416034343698204180180632507183, + 21888242871839275222246405745257275088548364400416034343698203926744972868243, + 21888242871839275222246405745257275088548364400416034343698204150824637213222, + 451386215656622, + 21888242871839275222246405745257275088548364400416034343698203907919595604405, + 21888242871839275222246405745257275088548364400416034343698203637434618603073, + 221149451047107, + 557270125311923, + 21888242871839275222246405745257275088548364400416034343698203845922281558584, + 21888242871839275222246405745257275088548364400416034343698203878204078104444, + 196151706588494, + 21888242871839275222246405745257275088548364400416034343698204135250735202034, + 150233793391597, + 21888242871839275222246405745257275088548364400416034343698204094196029148275, + 269739523385443, + 214800414576933, + 21888242871839275222246405745257275088548364400416034343698203628802319983950, + 145357463719185, + 21888242871839275222246405745257275088548364400416034343698203880852211531389, + 535800432799316, + 21888242871839275222246405745257275088548364400416034343698203797588437041999, + 21888242871839275222246405745257275088548364400416034343698204069102360216964, + 289129797198738, + 21888242871839275222246405745257275088548364400416034343698203741260247833162, + 21888242871839275222246405745257275088548364400416034343698203708063289446798, + 21888242871839275222246405745257275088548364400416034343698204054748814093401, + 21888242871839275222246405745257275088548364400416034343698203711056048415114, + 21888242871839275222246405745257275088548364400416034343698203698783615790142, + 21888242871839275222246405745257275088548364400416034343698204063223617409067, + 21888242871839275222246405745257275088548364400416034343698203661944401595261, + 260388532346395, + 21888242871839275222246405745257275088548364400416034343698203806902443637128, + 16038546189697, + 105556608787198, + 21888242871839275222246405745257275088548364400416034343698204084015865105173, + 21888242871839275222246405745257275088548364400416034343698203675301228635143, + 78156745589966, + 337548609669426, + 545903830142699, + 540369291922216, + 277931583059430, + 207780511094264, + 21888242871839275222246405745257275088548364400416034343698203960463674813369, + 323692647558908, + 76156242135260, + 509351185333226, + 56874748423844, + 96582433563802, + 456998011669682, + 21888242871839275222246405745257275088548364400416034343698204023199004063159, + 150974506658701, + 293588854048192, + 51744372698107, + 21888242871839275222246405745257275088548364400416034343698203978340040218682, + 21888242871839275222246405745257275088548364400416034343698203829284709215770, + 561001241980794, + 510206432707605, + 73525136615915, + 403971259443202, + 349338885433625, + 431505792336240, + 21888242871839275222246405745257275088548364400416034343698203953612312276851, + 21888242871839275222246405745257275088548364400416034343698204146351787827739, + 359630568867397, + 21888242871839275222246405745257275088548364400416034343698204146621771670566, + 126939055375886, + 169859639746705, + 21888242871839275222246405745257275088548364400416034343698203697135315022066, + 21888242871839275222246405745257275088548364400416034343698203676155098236468, + 150732032379083, + 21888242871839275222246405745257275088548364400416034343698203947318465791043, + 142097768403760, + 472261199700545, + 21888242871839275222246405745257275088548364400416034343698204124619075139700, + 21888242871839275222246405745257275088548364400416034343698203739254521413147, + 255118223347713, + 21888242871839275222246405745257275088548364400416034343698203963098777479362, + 178225810795569, + 21888242871839275222246405745257275088548364400416034343698203659101923218945, + 95116998015269, + 21888242871839275222246405745257275088548364400416034343698203627182286842234, + 21888242871839275222246405745257275088548364400416034343698203979271947223494, + 21888242871839275222246405745257275088548364400416034343698203805733771270268, + 302361944708891, + 21888242871839275222246405745257275088548364400416034343698203734475629073268, + 21888242871839275222246405745257275088548364400416034343698203932335913694843, + 21888242871839275222246405745257275088548364400416034343698204080237047844953, + 21888242871839275222246405745257275088548364400416034343698203990671745938230, + 143453752674819, + 420730937516650, + 413615560855949, + 21888242871839275222246405745257275088548364400416034343698204107375903980830, + 21888242871839275222246405745257275088548364400416034343698204072646189210104, + 503908501834476, + 151121873006426, + 21888242871839275222246405745257275088548364400416034343698204092537453653440, + 21888242871839275222246405745257275088548364400416034343698203828177351012016, + 21888242871839275222246405745257275088548364400416034343698203936002935305714, + 21888242871839275222246405745257275088548364400416034343698204075407848162662, + 319739492401407, + 501294516732790, + 21888242871839275222246405745257275088548364400416034343698204083748044056393, + 21888242871839275222246405745257275088548364400416034343698203686441468352721, + 21888242871839275222246405745257275088548364400416034343698204115982131303848, + 435314937916133, + 21888242871839275222246405745257275088548364400416034343698203986830695148416, + 21888242871839275222246405745257275088548364400416034343698203783531511849518, + 45234286858766, + 21888242871839275222246405745257275088548364400416034343698203946822099851993, + 21888242871839275222246405745257275088548364400416034343698203722387733051767, + 21888242871839275222246405745257275088548364400416034343698203843513997445493, + 21888242871839275222246405745257275088548364400416034343698204183026451709148, + 21888242871839275222246405745257275088548364400416034343698204062512894508302, + 216575963389816, + 539513815617026, + 21888242871839275222246405745257275088548364400416034343698203731324839275682, + 21888242871839275222246405745257275088548364400416034343698204164274644480462, + 486830522109139, + 21888242871839275222246405745257275088548364400416034343698204046643263087843, + 21888242871839275222246405745257275088548364400416034343698204071910187367510, + 21888242871839275222246405745257275088548364400416034343698203720784777867012, + 156617000818762, + 21888242871839275222246405745257275088548364400416034343698204158403032396358, + 46000555951775, + 21888242871839275222246405745257275088548364400416034343698204175160291098492, + 87569921661298, + 489126833622960, + 21888242871839275222246405745257275088548364400416034343698204042128447545862, + 394403047495589, + 176299891527895, + 21888242871839275222246405745257275088548364400416034343698204054922244953345, + 182658581882590, + 514083313125106, + 242186431762015, + 21888242871839275222246405745257275088548364400416034343698203759255298906263, + 21888242871839275222246405745257275088548364400416034343698203831823709028385, + 21888242871839275222246405745257275088548364400416034343698203807942394960337, + 70115480518482, + 21888242871839275222246405745257275088548364400416034343698204070511646968818, + 21888242871839275222246405745257275088548364400416034343698203848514588999499, + 21888242871839275222246405745257275088548364400416034343698203686927607813264, + 21888242871839275222246405745257275088548364400416034343698203735519138117013, + 165299023370200, + 429685441836009, + 17413112309155, + 21888242871839275222246405745257275088548364400416034343698204146928751134439, + 147977874184776, + 261063290927111, + 211899227863832, + 452624706611463, + 423788071535237, + 21888242871839275222246405745257275088548364400416034343698204146960112292866, + 21888242871839275222246405745257275088548364400416034343698204029613160364313, + 21888242871839275222246405745257275088548364400416034343698203957544337055902, + 166867443712038, + 21888242871839275222246405745257275088548364400416034343698204129622185995306, + 421317228113863, + 190404028481995, + 21888242871839275222246405745257275088548364400416034343698203780614286221804, + 398391068490102, + 534900639151, + 181435076271804, + 21888242871839275222246405745257275088548364400416034343698203865695257452950, + 21888242871839275222246405745257275088548364400416034343698203979371881458349, + 141739408524507, + 21888242871839275222246405745257275088548364400416034343698203912107848315007, + 21888242871839275222246405745257275088548364400416034343698204180837940805381, + 21888242871839275222246405745257275088548364400416034343698203690439722950963, + 21888242871839275222246405745257275088548364400416034343698204036657331716329, + 160068237988833, + 21888242871839275222246405745257275088548364400416034343698203916538327566115, + 21888242871839275222246405745257275088548364400416034343698203892208199060885, + 440736791789737, + 21888242871839275222246405745257275088548364400416034343698204139523134534333, + 487906412264771, + 21888242871839275222246405745257275088548364400416034343698204132089696391615, + 376637838770324, + 21888242871839275222246405745257275088548364400416034343698203657179708394185, + 466853435251806, + 38318176956544, + 136096399147743, + 405449232246951, + 21888242871839275222246405745257275088548364400416034343698203903382036605431, + 468082404676640, + 21888242871839275222246405745257275088548364400416034343698203668280767547573, + 82503651425937, + 21888242871839275222246405745257275088548364400416034343698203849554292097041, + 278169438575025, + 21888242871839275222246405745257275088548364400416034343698204106304419381373, + 97035758561250, + 21888242871839275222246405745257275088548364400416034343698203775838744492471, + 67570266352157, + 311229453012875, + 21888242871839275222246405745257275088548364400416034343698203752355571742462, + 21888242871839275222246405745257275088548364400416034343698203678801771610776, + 21888242871839275222246405745257275088548364400416034343698203795266165562065, + 21888242871839275222246405745257275088548364400416034343698203925544956382965, + 481287048925926, + 21888242871839275222246405745257275088548364400416034343698203629296404647468, + 78377174429886, + 21888242871839275222246405745257275088548364400416034343698204032955191058335, + 301003463400133, + 513228568886384, + 22513474646076, + 413575436171252, + 298898383212458, + 21888242871839275222246405745257275088548364400416034343698203673372757408807, + 437834664882587, + 65855957958666, + 395049523264445, + 481397391994860, + 66021401476585, + 504154139301601, + 21888242871839275222246405745257275088548364400416034343698204049195893983602, + 8976004177022, + 463703730475698, + 73484087599836, + 21888242871839275222246405745257275088548364400416034343698203662149688380599, + 353630791405847, + 21888242871839275222246405745257275088548364400416034343698203843254092540700, + 100814659872865, + 260355436661909, + 21888242871839275222246405745257275088548364400416034343698204033970391064740, + 78422222436662, + 21888242871839275222246405745257275088548364400416034343698204055291474992621, + 554540478318585, + 192124516528154, + 21888242871839275222246405745257275088548364400416034343698203726707116577399, + 21888242871839275222246405745257275088548364400416034343698203673268659823010, + 308230697634941, + 317539617074381, + 343237672361334, + 162080383668874, + 83078301895263, + 21888242871839275222246405745257275088548364400416034343698203635083345428863, + 21888242871839275222246405745257275088548364400416034343698204130389763803095, + 21888242871839275222246405745257275088548364400416034343698203665423533632708, + 21888242871839275222246405745257275088548364400416034343698203952273326237500, + 21888242871839275222246405745257275088548364400416034343698203803921430719006, + 248716303251522, + 342937836102299, + 21888242871839275222246405745257275088548364400416034343698203997762840642634, + 488445026104904, + 484190546869221, + 21888242871839275222246405745257275088548364400416034343698203803849975299083, + 388821488066370, + 420712082739555, + 435342668089922, + 21888242871839275222246405745257275088548364400416034343698203975744144232753, + 107776867214607, + 21888242871839275222246405745257275088548364400416034343698203924638819672491, + 11422502185225, + 75803050342665, + 48095283130240, + 21888242871839275222246405745257275088548364400416034343698203978681350280622, + 135795128484391, + 21888242871839275222246405745257275088548364400416034343698203931215173710845, + 21888242871839275222246405745257275088548364400416034343698204166916414311882, + 407182491439656, + 21888242871839275222246405745257275088548364400416034343698203734153803771426, + 281737153269166, + 94945568529466, + 554714146645532, + 21888242871839275222246405745257275088548364400416034343698203950644208033714, + 179621346413481, + 21888242871839275222246405745257275088548364400416034343698203914261313735883, + 21888242871839275222246405745257275088548364400416034343698203669147681156945, + 21888242871839275222246405745257275088548364400416034343698204175440502841607, + 116390824007031, + 46471080292362, + 250329359521503, + 21888242871839275222246405745257275088548364400416034343698203684022064263708, + 382254750247616, + 401984592886016, + 21888242871839275222246405745257275088548364400416034343698203701930590599158, + 21888242871839275222246405745257275088548364400416034343698203701910396795679, + 21888242871839275222246405745257275088548364400416034343698203707158597825822, + 181541767185053, + 541557580885584, + 61157663663547, + 21888242871839275222246405745257275088548364400416034343698203935733163197182, + 21888242871839275222246405745257275088548364400416034343698204115903576623540, + 21888242871839275222246405745257275088548364400416034343698203834209223425586, + 21888242871839275222246405745257275088548364400416034343698203990250257087661, + 252066491001604, + 21888242871839275222246405745257275088548364400416034343698204057099110387680, + 525654044080286, + 21888242871839275222246405745257275088548364400416034343698204050084658737505, + 248875749587070, + 21888242871839275222246405745257275088548364400416034343698203819797377113005, + 21888242871839275222246405745257275088548364400416034343698203813758258276575, + 21888242871839275222246405745257275088548364400416034343698203944218839840871, + 266651141261869, + 21888242871839275222246405745257275088548364400416034343698204138879901379737, + 21888242871839275222246405745257275088548364400416034343698203802208957647108, + 340320020537709, + 99195539889405, + 21888242871839275222246405745257275088548364400416034343698204108463137055312, + 21888242871839275222246405745257275088548364400416034343698204176469887135093, + 128199192823948, + 226382905831434, + 21888242871839275222246405745257275088548364400416034343698203650928061829258, + 21888242871839275222246405745257275088548364400416034343698204137852536000508, + 445795225977224, + 21888242871839275222246405745257275088548364400416034343698204161574627914715, + 21888242871839275222246405745257275088548364400416034343698204108926259541109, + 21888242871839275222246405745257275088548364400416034343698203768907733335605, + 21888242871839275222246405745257275088548364400416034343698203865290750092569, + 409629147047201, + 22564815421209, + 110729798054065, + 21888242871839275222246405745257275088548364400416034343698203698556134268863, + 401486378531837, + 21888242871839275222246405745257275088548364400416034343698204166379246724977, + 208723597395025, + 21888242871839275222246405745257275088548364400416034343698203963639013610669, + 21888242871839275222246405745257275088548364400416034343698204178374917350745, + 21888242871839275222246405745257275088548364400416034343698204166543656183480, + 21888242871839275222246405745257275088548364400416034343698203694314557678440, + 21888242871839275222246405745257275088548364400416034343698203908577463425669, + 433364648178505, + 510951944302551, + 21888242871839275222246405745257275088548364400416034343698203739660000346194, + 489833111848063, + 421561201595347, + 199324201161659, + 21888242871839275222246405745257275088548364400416034343698203768621185624108, + 323109176777666, + 21888242871839275222246405745257275088548364400416034343698203686756596887304, + 404005468138926, + 277629130800971, + 21888242871839275222246405745257275088548364400416034343698203830024085218990, + 21888242871839275222246405745257275088548364400416034343698204058322890922917, + 21888242871839275222246405745257275088548364400416034343698203714538848853092, + 21888242871839275222246405745257275088548364400416034343698203875678803260365, + 190798462776072, + 21888242871839275222246405745257275088548364400416034343698204113555232028062, + 21888242871839275222246405745257275088548364400416034343698203681694527939435, + 21888242871839275222246405745257275088548364400416034343698203832368590436026, + 21888242871839275222246405745257275088548364400416034343698203932868711828022, + 21888242871839275222246405745257275088548364400416034343698203638430227717074, + 21888242871839275222246405745257275088548364400416034343698203986355103425869, + 88290417281610, + 21888242871839275222246405745257275088548364400416034343698203680458230344135, + 507801471838390, + 21888242871839275222246405745257275088548364400416034343698203930601819167340, + 498255053383448, + 166253980218567, + 21888242871839275222246405745257275088548364400416034343698203703831568028953, + 21888242871839275222246405745257275088548364400416034343698203749455351093850, + 386592828430155, + 550684754522741, + 21888242871839275222246405745257275088548364400416034343698204120890283464777, + 291644662636577, + 21888242871839275222246405745257275088548364400416034343698204081881297279920, + 21888242871839275222246405745257275088548364400416034343698203920204777820569, + 21888242871839275222246405745257275088548364400416034343698203637893513178768, + 21888242871839275222246405745257275088548364400416034343698204141002006496028, + 21888242871839275222246405745257275088548364400416034343698204006775090229062, + 270646046894238, + 21888242871839275222246405745257275088548364400416034343698204022535942935983, + 274292289069684, + 95027180481012, + 75540691346751, + 21888242871839275222246405745257275088548364400416034343698204032784501490743, + 21888242871839275222246405745257275088548364400416034343698204150276033966730, + 21888242871839275222246405745257275088548364400416034343698204012001839923548, + 21888242871839275222246405745257275088548364400416034343698204146539709222896, + 21888242871839275222246405745257275088548364400416034343698203682415704277408, + 21888242871839275222246405745257275088548364400416034343698203667852003783791, + 21888242871839275222246405745257275088548364400416034343698204185330164261758, + 124479221072587, + 322876767623695, + 49486680334099, + 274737875585993, + 21888242871839275222246405745257275088548364400416034343698203942449613535543, + 21888242871839275222246405745257275088548364400416034343698203697657171919752, + 156102667362112, + 21888242871839275222246405745257275088548364400416034343698204041651945920540, + 21888242871839275222246405745257275088548364400416034343698203648533942381742, + 45035395680863, + 21888242871839275222246405745257275088548364400416034343698203871269775735062, + 21888242871839275222246405745257275088548364400416034343698204130564197587639, + 21888242871839275222246405745257275088548364400416034343698204150213761219150, + 21888242871839275222246405745257275088548364400416034343698203752740263663051, + 39398431946952, + 18340431606930, + 21888242871839275222246405745257275088548364400416034343698203896422597873068, + 371217580591861, + 300141162759670, + 21888242871839275222246405745257275088548364400416034343698204119516440558526, + 21888242871839275222246405745257275088548364400416034343698204116446304370359, + 55611792794756, + 259981625293186, + 21888242871839275222246405745257275088548364400416034343698204048479214028578, + 471718209292067, + 21888242871839275222246405745257275088548364400416034343698204036653517221497, + 174891313213517, + 206378843967311, + 259924180583546, + 554335257158122, + 215120105405248, + 21888242871839275222246405745257275088548364400416034343698203775289580324403, + 21888242871839275222246405745257275088548364400416034343698204061444032930068, + 21888242871839275222246405745257275088548364400416034343698203883697001359137, + 21888242871839275222246405745257275088548364400416034343698204085324807767351, + 559923010127107, + 226417687937802, + 522407938055819, + 21888242871839275222246405745257275088548364400416034343698203891089223283251, + 21888242871839275222246405745257275088548364400416034343698203934676848594662, + 272120529448331, + 169864058469760, + 21888242871839275222246405745257275088548364400416034343698204008219118743658, + 217993053559797, + 118620106387036, + 411793377998462, + 320472665495594, + 21888242871839275222246405745257275088548364400416034343698203948387503366236, + 21888242871839275222246405745257275088548364400416034343698203847278439893332, + 186052919551899, + 21888242871839275222246405745257275088548364400416034343698203798650681318652, + 198813462155386, + 259102808020120, + 21888242871839275222246405745257275088548364400416034343698204057687925527790, + 21888242871839275222246405745257275088548364400416034343698203936840881307703, + 351838827428820, + 507142563836071, + 21888242871839275222246405745257275088548364400416034343698203689071678885834, + 21888242871839275222246405745257275088548364400416034343698203713374308832073, + 336825993288401, + 21888242871839275222246405745257275088548364400416034343698204077574849388299, + 41856819565155, + 21888242871839275222246405745257275088548364400416034343698204140734274391960, + 21888242871839275222246405745257275088548364400416034343698203925919441887752, + 287816396969681, + 21888242871839275222246405745257275088548364400416034343698203859550259359371, + 21888242871839275222246405745257275088548364400416034343698203637587400769840, + 428310323296841, + 21888242871839275222246405745257275088548364400416034343698203794223350454389, + 21888242871839275222246405745257275088548364400416034343698204102880658999095, + 21888242871839275222246405745257275088548364400416034343698203995572058363643, + 21888242871839275222246405745257275088548364400416034343698203707364484007895, + 21888242871839275222246405745257275088548364400416034343698204021379088343083, + 21888242871839275222246405745257275088548364400416034343698203787507832181998, + 21888242871839275222246405745257275088548364400416034343698204052071464532230, + 21888242871839275222246405745257275088548364400416034343698203953877905459777, + 197565580983887, + 265764119675178, + 424285287003765, + 21888242871839275222246405745257275088548364400416034343698203745422439881744, + 21888242871839275222246405745257275088548364400416034343698204016664719948072, + 389208075797715, + 401742997187237, + 481958470161993, + 21888242871839275222246405745257275088548364400416034343698203761249162652128, + 321910911885100, + 21888242871839275222246405745257275088548364400416034343698203709660210704340, + 39074931706264, + 21888242871839275222246405745257275088548364400416034343698203917646302808863, + 106672209857203, + 448217690094628, + 386449632412839, + 57125001186144, + 21888242871839275222246405745257275088548364400416034343698204060673996997116, + 21888242871839275222246405745257275088548364400416034343698203805783755598994, + 21888242871839275222246405745257275088548364400416034343698204185449849167422, + 21888242871839275222246405745257275088548364400416034343698203972422762575190, + 21888242871839275222246405745257275088548364400416034343698204035740294863143, + 21888242871839275222246405745257275088548364400416034343698204040973449576775, + 21888242871839275222246405745257275088548364400416034343698203786179196473568, + 21888242871839275222246405745257275088548364400416034343698204144800026689638, + 506743915209114, + 21888242871839275222246405745257275088548364400416034343698204087621183014019, + 21888242871839275222246405745257275088548364400416034343698203648150673208383, + 21888242871839275222246405745257275088548364400416034343698204059407629094114, + 90037173464368, + 519735277054943, + 21888242871839275222246405745257275088548364400416034343698203687488612944016, + 96678629197864, + 21888242871839275222246405745257275088548364400416034343698203707382958880724, + 195709838753081, + 443485242683108, + 21888242871839275222246405745257275088548364400416034343698203733641889123678, + 21888242871839275222246405745257275088548364400416034343698203737612093117954, + 74358659406280, + 21888242871839275222246405745257275088548364400416034343698203798296315919215, + 445620732951971, + 21888242871839275222246405745257275088548364400416034343698204011852106696532, + 484784900947105, + 21888242871839275222246405745257275088548364400416034343698203695968335865695, + 227974502244911, + 410547113406853, + 126952157222801, + 21888242871839275222246405745257275088548364400416034343698203854805283301684, + 408578650567783, + 21888242871839275222246405745257275088548364400416034343698204171037103006388, + 21888242871839275222246405745257275088548364400416034343698203709002108355660, + 21888242871839275222246405745257275088548364400416034343698203856191291874278, + 21888242871839275222246405745257275088548364400416034343698203681420335109722, + 544003614770734, + 316335938196069, + 21888242871839275222246405745257275088548364400416034343698203924216579560551, + 52466480355880, + 21888242871839275222246405745257275088548364400416034343698204014566401941176, + 21888242871839275222246405745257275088548364400416034343698203638632224539476, + 437447362634551, + 296473600303184, + 21888242871839275222246405745257275088548364400416034343698203647332487559689, + 163656064001482, + 305187696173178, + 323262326059746, + 422490099163567, + 186150683994975, + 21888242871839275222246405745257275088548364400416034343698204030276209721523, + 356354368454760, + 61618811808400, + 21888242871839275222246405745257275088548364400416034343698203763891939757207, + 530384762112762, + 21888242871839275222246405745257275088548364400416034343698203730058716175439, + 161907728710613, + 21888242871839275222246405745257275088548364400416034343698204125652210941818, + 21888242871839275222246405745257275088548364400416034343698203865831774342808, + 21888242871839275222246405745257275088548364400416034343698203719607956489604, + 319231527261258, + 374219445348297, + 167719605950003, + 21888242871839275222246405745257275088548364400416034343698203927546294766372, + 42340330621136, + 21888242871839275222246405745257275088548364400416034343698203792976970339866, + 92902662422460, + 275450409917554, + 21888242871839275222246405745257275088548364400416034343698204149733427686919, + 58277769314336, + 21888242871839275222246405745257275088548364400416034343698203648264529168294, + 21888242871839275222246405745257275088548364400416034343698203737065858822094, + 352478648074053, + 109064208216672, + 21888242871839275222246405745257275088548364400416034343698203969024566526509, + 267550718718427, + 489133144890529, + 21888242871839275222246405745257275088548364400416034343698203661234042364630, + 179334846783013, + 121498732677454, + 21888242871839275222246405745257275088548364400416034343698203645339069478903, + 88309225665539, + 21888242871839275222246405745257275088548364400416034343698203779952611078223, + 21888242871839275222246405745257275088548364400416034343698203688926404036132, + 21888242871839275222246405745257275088548364400416034343698204047281587748390, + 21888242871839275222246405745257275088548364400416034343698203775089488885280, + 21888242871839275222246405745257275088548364400416034343698204149876092631118, + 339776459366889, + 527739834981221, + 352991920789858, + 540589271845910, + 442857199746155, + 21888242871839275222246405745257275088548364400416034343698204038899560281282, + 9586329255309, + 17888191707180, + 266556940047732, + 3688942922845, + 21888242871839275222246405745257275088548364400416034343698203876026538495428, + 21888242871839275222246405745257275088548364400416034343698203736612166633389, + 333716358579636, + 70679875927507, + 394427101616616, + 21888242871839275222246405745257275088548364400416034343698203797464179246206, + 21888242871839275222246405745257275088548364400416034343698204109464208945276, + 21888242871839275222246405745257275088548364400416034343698204014119131057340, + 21888242871839275222246405745257275088548364400416034343698204116836548168671, + 381731617066853, + 21888242871839275222246405745257275088548364400416034343698204112307410775152, + 21888242871839275222246405745257275088548364400416034343698203633443391864778, + 326840886833645, + 547988419022281, + 21888242871839275222246405745257275088548364400416034343698204167140427701157, + 21888242871839275222246405745257275088548364400416034343698204166885174904919, + 452042633835818, + 21888242871839275222246405745257275088548364400416034343698203694748978914084, + 531216708806225, + 341741297654668, + 42760867133600, + 21888242871839275222246405745257275088548364400416034343698203776015701795223, + 21888242871839275222246405745257275088548364400416034343698204060549493418378, + 437390690650610, + 547690148507537, + 497796361727575, + 41600180965772, + 21888242871839275222246405745257275088548364400416034343698203629587178176223, + 282807406356651, + 21888242871839275222246405745257275088548364400416034343698204107086937924208, + 296875007052355, + 253855063495997, + 437833611415733, + 421763822952495, + 21888242871839275222246405745257275088548364400416034343698203866106711921676, + 21888242871839275222246405745257275088548364400416034343698204040458159164868, + 21888242871839275222246405745257275088548364400416034343698204056403225892067, + 483791324629893, + 317046622456566, + 292766578526028, + 21888242871839275222246405745257275088548364400416034343698204001328363854694, + 392654821598504, + 155428681340823, + 21888242871839275222246405745257275088548364400416034343698203690524173570354, + 21888242871839275222246405745257275088548364400416034343698204047443914900468, + 291196008375826, + 21888242871839275222246405745257275088548364400416034343698203905629961644089, + 314983166769294, + 510039770496031, + 351295899677332, + 439900408368470, + 21888242871839275222246405745257275088548364400416034343698203895725469778855, + 21888242871839275222246405745257275088548364400416034343698203888449264145909, + 21888242871839275222246405745257275088548364400416034343698203995976800674888, + 21888242871839275222246405745257275088548364400416034343698203877850703333007, + 21888242871839275222246405745257275088548364400416034343698204077507510866285, + 510608566348226, + 21888242871839275222246405745257275088548364400416034343698203961717922025741, + 21888242871839275222246405745257275088548364400416034343698203873179354339045, + 269943167921499, + 538588705374185, + 21888242871839275222246405745257275088548364400416034343698203681432405585770, + 302469988613832, + 349342305670958, + 21888242871839275222246405745257275088548364400416034343698204186029086422836, + 21888242871839275222246405745257275088548364400416034343698203942298357342658, + 21888242871839275222246405745257275088548364400416034343698203796487072260801, + 21888242871839275222246405745257275088548364400416034343698203764249762508965, + 21888242871839275222246405745257275088548364400416034343698204141483631691674, + 472315796363399, + 21888242871839275222246405745257275088548364400416034343698203979222456364186, + 21888242871839275222246405745257275088548364400416034343698204015296763081296, + 21888242871839275222246405745257275088548364400416034343698203935186164245037, + 21888242871839275222246405745257275088548364400416034343698204031649086284354, + 194905929474091, + 21888242871839275222246405745257275088548364400416034343698203868343858017402, + 21888242871839275222246405745257275088548364400416034343698203752941264534174, + 465917281671726, + 539568963154006, + 21888242871839275222246405745257275088548364400416034343698204087621937693513, + 21888242871839275222246405745257275088548364400416034343698204158302143877101, + 21888242871839275222246405745257275088548364400416034343698204042371343387449, + 98898164040077, + 21888242871839275222246405745257275088548364400416034343698203771105442133366, + 302601963731768, + 21888242871839275222246405745257275088548364400416034343698204077232451404059, + 222418755812332, + 114018360707007, + 453706466629275, + 21888242871839275222246405745257275088548364400416034343698203691068258270567, + 21888242871839275222246405745257275088548364400416034343698203770541454069837, + 21888242871839275222246405745257275088548364400416034343698203812412558273954, + 249842531387226, + 327702247511968, + 21888242871839275222246405745257275088548364400416034343698203812931682062303, + 281099435863875, + 35454970461590, + 21888242871839275222246405745257275088548364400416034343698203814140154218831, + 21888242871839275222246405745257275088548364400416034343698204071384358165557, + 154847235053490, + 21888242871839275222246405745257275088548364400416034343698204056817171256143, + 21888242871839275222246405745257275088548364400416034343698203655379552570453, + 21888242871839275222246405745257275088548364400416034343698203936714508692636, + 467141483840235, + 465941045446711, + 98256589833402, + 396580768422035, + 430401111905751, + 69844003471629, + 21888242871839275222246405745257275088548364400416034343698203899130657484166, + 21888242871839275222246405745257275088548364400416034343698204120117461716752, + 21888242871839275222246405745257275088548364400416034343698203830649953043419, + 173171894162470, + 21888242871839275222246405745257275088548364400416034343698204158852425717128, + 308018274942652, + 21888242871839275222246405745257275088548364400416034343698203994964406381392, + 44013163980932, + 21888242871839275222246405745257275088548364400416034343698203869485426348811, + 21888242871839275222246405745257275088548364400416034343698203849963530712761, + 21888242871839275222246405745257275088548364400416034343698203632353987864695, + 21888242871839275222246405745257275088548364400416034343698203750713761339606, + 158114549046944, + 505717184979457, + 355980285671879, + 441839093677442, + 21888242871839275222246405745257275088548364400416034343698204018227040478562, + 21888242871839275222246405745257275088548364400416034343698203859893449443272, + 21888242871839275222246405745257275088548364400416034343698203919818480050446, + 21888242871839275222246405745257275088548364400416034343698203932811986369870, + 21888242871839275222246405745257275088548364400416034343698204020543692065594, + 21888242871839275222246405745257275088548364400416034343698203866138934560324, + 421103001681643, + 317739125980973, + 21888242871839275222246405745257275088548364400416034343698203891959289432233, + 21888242871839275222246405745257275088548364400416034343698203788838684545885, + 227795656255775, + 185832669881323, + 21888242871839275222246405745257275088548364400416034343698203789438637792430, + 21888242871839275222246405745257275088548364400416034343698203988805826829546, + 416809764058332, + 561920811539873, + 134664784518597, + 139834035944156, + 14640390034010, + 21888242871839275222246405745257275088548364400416034343698203743330877057720, + 545469552371197, + 21888242871839275222246405745257275088548364400416034343698204157299461940901, + 363677881420831, + 21888242871839275222246405745257275088548364400416034343698204063529726630899, + 499178658492235, + 21888242871839275222246405745257275088548364400416034343698204083979900893418, + 21888242871839275222246405745257275088548364400416034343698203804438731953265, + 162245330556246, + 21888242871839275222246405745257275088548364400416034343698203707965168609033, + 21888242871839275222246405745257275088548364400416034343698203909767857273126, + 21888242871839275222246405745257275088548364400416034343698203649427384513178, + 84117371560317, + 21888242871839275222246405745257275088548364400416034343698203662714491807106, + 29817460861300, + 21888242871839275222246405745257275088548364400416034343698204063842684482225, + 179061820353279, + 202930427362016, + 194614146575994, + 21888242871839275222246405745257275088548364400416034343698204029357065275001, + 493834234734871, + 438231353697039, + 137034224959405, + 21888242871839275222246405745257275088548364400416034343698203701756161118381, + 146814921389150, + 548431079810396, + 502243758436572, + 21888242871839275222246405745257275088548364400416034343698203636844085661807, + 130467168039064, + 76762419349228, + 165883393638841, + 206408730976080, + 184323002305982, + 76889818253413, + 21888242871839275222246405745257275088548364400416034343698204109162441311484, + 342941670323414, + 102087715886457, + 21888242871839275222246405745257275088548364400416034343698204038433249325470, + 108257426740344, + 21888242871839275222246405745257275088548364400416034343698203764715050579709, + 203596311116568, + 85255190864881, + 342131535708201, + 75597632602427, + 171493967104611, + 117390025159618, + 21888242871839275222246405745257275088548364400416034343698204012696798958669, + 485495726600672, + 21888242871839275222246405745257275088548364400416034343698203744095488821659, + 21888242871839275222246405745257275088548364400416034343698204106304572594254, + 21888242871839275222246405745257275088548364400416034343698203906343902456989, + 21888242871839275222246405745257275088548364400416034343698203988409702212031, + 243842725081574, + 20698371739855, + 21888242871839275222246405745257275088548364400416034343698203838252039956227, + 21888242871839275222246405745257275088548364400416034343698204118149718507550, + 21888242871839275222246405745257275088548364400416034343698204180609853564449, + 21888242871839275222246405745257275088548364400416034343698203744252002743923, + 21888242871839275222246405745257275088548364400416034343698203887153900666636, + 21888242871839275222246405745257275088548364400416034343698203645527050237684, + 21888242871839275222246405745257275088548364400416034343698203635123705737992, + 507359162926275, + 21888242871839275222246405745257275088548364400416034343698203782838214142093, + 21888242871839275222246405745257275088548364400416034343698203645787907652332, + 21888242871839275222246405745257275088548364400416034343698203890834463449510, + 21888242871839275222246405745257275088548364400416034343698203789735535601441, + 545991304582478, + 24045748799617, + 21888242871839275222246405745257275088548364400416034343698203856811310835669, + 21888242871839275222246405745257275088548364400416034343698204058401637078231, + 35999116821208, + 21888242871839275222246405745257275088548364400416034343698203936233826216683, + 21888242871839275222246405745257275088548364400416034343698204061571658190387, + 126506233405101, + 21888242871839275222246405745257275088548364400416034343698203843421662484312, + 287757413434531, + 21888242871839275222246405745257275088548364400416034343698204124070577922591, + 21888242871839275222246405745257275088548364400416034343698203989466464187362, + 256383735604576, + 21888242871839275222246405745257275088548364400416034343698204149467665817352, + 21888242871839275222246405745257275088548364400416034343698203711211815411696, + 241242405108182, + 407562281705116, + 21888242871839275222246405745257275088548364400416034343698204185686047633263, + 125135537361015, + 291176357052865, + 21888242871839275222246405745257275088548364400416034343698203788100192796655, + 21888242871839275222246405745257275088548364400416034343698203744351562723713, + 281072006335012, + 347386055144764, + 29978130279793, + 76901588662727, + 21888242871839275222246405745257275088548364400416034343698203754804014535366, + 21888242871839275222246405745257275088548364400416034343698203857428206163195, + 21888242871839275222246405745257275088548364400416034343698204113566271037869, + 21888242871839275222246405745257275088548364400416034343698203854434822003992, + 21888242871839275222246405745257275088548364400416034343698203733182409229099, + 520152169854839, + 21888242871839275222246405745257275088548364400416034343698203912608605592630, + 515300523704039, + 18675397794117, + 94603163520158, + 21888242871839275222246405745257275088548364400416034343698204010691133047267, + 21888242871839275222246405745257275088548364400416034343698203897525531468643, + 472000161609824, + 462279224416614, + 237327961974791, + 21888242871839275222246405745257275088548364400416034343698203630399580420385, + 21888242871839275222246405745257275088548364400416034343698203893866877469825, + 274567776669460, + 35255743031597, + 21888242871839275222246405745257275088548364400416034343698203707933617547070, + 503476107808342, + 21888242871839275222246405745257275088548364400416034343698204113712240693971, + 21888242871839275222246405745257275088548364400416034343698203734774244925255, + 21888242871839275222246405745257275088548364400416034343698203931522998875758, + 21888242871839275222246405745257275088548364400416034343698203767030147703068, + 182124436025843, + 21888242871839275222246405745257275088548364400416034343698203744363026504707, + 183430655257602, + 21888242871839275222246405745257275088548364400416034343698204066859481270152, + 21888242871839275222246405745257275088548364400416034343698204051133904424199, + 530995271343742, + 21888242871839275222246405745257275088548364400416034343698203650413730042007, + 304090867766739, + 480681577479760, + 21888242871839275222246405745257275088548364400416034343698203904189889109228, + 206307985232579, + 21888242871839275222246405745257275088548364400416034343698203722097940689990, + 129044487354763, + 64455704042813, + 21888242871839275222246405745257275088548364400416034343698204067975506908486, + 369878507692448, + 21888242871839275222246405745257275088548364400416034343698203785437312788729, + 21888242871839275222246405745257275088548364400416034343698204108505600113345, + 21888242871839275222246405745257275088548364400416034343698203977335255280576, + 134642205484915, + 21888242871839275222246405745257275088548364400416034343698203934904480554266, + 21888242871839275222246405745257275088548364400416034343698203632890870444434, + 21888242871839275222246405745257275088548364400416034343698204107763056823389, + 136216327476407, + 57473607879254, + 185649549053665, + 22899352412957, + 64545459027614, + 21888242871839275222246405745257275088548364400416034343698203695554852208572, + 21888242871839275222246405745257275088548364400416034343698204118874778550641, + 509723216361383, + 21888242871839275222246405745257275088548364400416034343698203633311398962256, + 21888242871839275222246405745257275088548364400416034343698203969725124230215, + 278897200219980, + 21888242871839275222246405745257275088548364400416034343698203822841386267080, + 548433664273598, + 50462956939829, + 289265100947562, + 380220410505589, + 18393123203079, + 480936055788992, + 21888242871839275222246405745257275088548364400416034343698203938661776557757, + 247809623664025, + 21888242871839275222246405745257275088548364400416034343698203945803850723120, + 21888242871839275222246405745257275088548364400416034343698204002960236905596, + 21888242871839275222246405745257275088548364400416034343698204136726431761404, + 21888242871839275222246405745257275088548364400416034343698203711215620396308, + 21888242871839275222246405745257275088548364400416034343698204089650624011353, + 21888242871839275222246405745257275088548364400416034343698204177253067117735, + 154943241107905, + 57519296519894, + 179537780747069, + 21888242871839275222246405745257275088548364400416034343698204046437800839646, + 21888242871839275222246405745257275088548364400416034343698203716992579728305, + 21888242871839275222246405745257275088548364400416034343698203956635142771354, + 21888242871839275222246405745257275088548364400416034343698203677864411723773, + 96995999843818, + 21888242871839275222246405745257275088548364400416034343698204032402782160771, + 451101496475456, + 76805587970745, + 348861531859261, + 21888242871839275222246405745257275088548364400416034343698204055837170820268, + 275626335539310, + 236743221360953, + 21888242871839275222246405745257275088548364400416034343698203891736863947176, + 21888242871839275222246405745257275088548364400416034343698203714689276302308, + 380562997398271, + 21888242871839275222246405745257275088548364400416034343698203959238360440116, + 21888242871839275222246405745257275088548364400416034343698204042046930675005, + 21888242871839275222246405745257275088548364400416034343698204096674465124937, + 81361874975491, + 21888242871839275222246405745257275088548364400416034343698203740422099590700, + 21888242871839275222246405745257275088548364400416034343698203705681415151709, + 21888242871839275222246405745257275088548364400416034343698203673855546263609, + 21888242871839275222246405745257275088548364400416034343698203854507481308180, + 21888242871839275222246405745257275088548364400416034343698204058977398339704, + 21888242871839275222246405745257275088548364400416034343698204110538581135823, + 483695563956040, + 21888242871839275222246405745257275088548364400416034343698203849650667587052, + 21888242871839275222246405745257275088548364400416034343698203890822777379061, + 21888242871839275222246405745257275088548364400416034343698203892826742767067, + 21888242871839275222246405745257275088548364400416034343698204063935670111477, + 218437568897025, + 21888242871839275222246405745257275088548364400416034343698203779039096633033, + 484266735619847, + 21888242871839275222246405745257275088548364400416034343698204178481843202005, + 21888242871839275222246405745257275088548364400416034343698203626294427803849, + 39080178087473, + 21888242871839275222246405745257275088548364400416034343698204014160731902481, + 392883021230135, + 21888242871839275222246405745257275088548364400416034343698204056350764365487, + 212731076294469, + 422457422016777, + 445124848645954, + 450308554843183, + 143589723291842, + 485747096477471, + 21888242871839275222246405745257275088548364400416034343698203726064242619469, + 114026129395339, + 536567786420968, + 21888242871839275222246405745257275088548364400416034343698203706695389185916, + 21888242871839275222246405745257275088548364400416034343698203851499825963551, + 21888242871839275222246405745257275088548364400416034343698203753695886828649, + 37726471525697, + 21888242871839275222246405745257275088548364400416034343698203887362062491886, + 21888242871839275222246405745257275088548364400416034343698203638110399896984, + 409295538846319, + 21888242871839275222246405745257275088548364400416034343698203935560884066865, + 5374687616717, + 438246994006121, + 310580137169933, + 21888242871839275222246405745257275088548364400416034343698204069447562309275, + 390839542525458, + 21888242871839275222246405745257275088548364400416034343698204166565369958442, + 21888242871839275222246405745257275088548364400416034343698203859527020734133, + 143881919199320, + 28497595393881, + 378194826248983, + 21888242871839275222246405745257275088548364400416034343698203705311312810312, + 21888242871839275222246405745257275088548364400416034343698203836742500795973, + 21888242871839275222246405745257275088548364400416034343698203734153043003996, + 560536648312555, + 21888242871839275222246405745257275088548364400416034343698203978039104480787, + 393369650190509, + 433189519711861, + 21888242871839275222246405745257275088548364400416034343698204179820488934226, + 21888242871839275222246405745257275088548364400416034343698204036482297060613, + 21888242871839275222246405745257275088548364400416034343698204028016254410347, + 260594846469319, + 525890450676276, + 459214780402628, + 21888242871839275222246405745257275088548364400416034343698203932579663125481, + 21888242871839275222246405745257275088548364400416034343698203954660481046063, + 21888242871839275222246405745257275088548364400416034343698204126104227171339, + 21888242871839275222246405745257275088548364400416034343698203723438534922089, + 195541176115051, + 340795211090821, + 172763631790030, + 21888242871839275222246405745257275088548364400416034343698203922032838074163, + 106250947113739, + 21888242871839275222246405745257275088548364400416034343698203924391708617371, + 488261244173954, + 8822456162783, + 92701068299579, + 21888242871839275222246405745257275088548364400416034343698204119152490843687, + 21888242871839275222246405745257275088548364400416034343698203817919154480348, + 21888242871839275222246405745257275088548364400416034343698204051508376762516, + 531986998702883, + 224991427039888, + 21888242871839275222246405745257275088548364400416034343698204043555591950044, + 526497834315824, + 191030431724484, + 21888242871839275222246405745257275088548364400416034343698203884273617555502, + 21888242871839275222246405745257275088548364400416034343698203624141057760671, + 21888242871839275222246405745257275088548364400416034343698203968438027674419, + 21888242871839275222246405745257275088548364400416034343698204023881829346652, + 202183492477810, + 148488652530302, + 423792608105067, + 477845269897182, + 227556022415977, + 167911825721581, + 117066486267244, + 382131836672001, + 21888242871839275222246405745257275088548364400416034343698204156690219373059, + 346595439102682, + 247520166782983, + 390573542276144, + 387598200913280, + 64493563735801, + 21888242871839275222246405745257275088548364400416034343698204041777756382661, + 528301251684727, + 21888242871839275222246405745257275088548364400416034343698203908243707330479, + 133865172398383, + 161407213894285, + 365040976028859, + 21888242871839275222246405745257275088548364400416034343698204158495716748172, + 485009808253569, + 21888242871839275222246405745257275088548364400416034343698203898728083211331, + 186545454540618, + 21888242871839275222246405745257275088548364400416034343698204164209088245830, + 474344543432832, + 21888242871839275222246405745257275088548364400416034343698203729270359354443, + 495362114878299, + 295196576428596, + 21888242871839275222246405745257275088548364400416034343698203849152668795112, + 396574826466319, + 21888242871839275222246405745257275088548364400416034343698204010062724659439, + 21888242871839275222246405745257275088548364400416034343698203772228440113923, + 21888242871839275222246405745257275088548364400416034343698203808243697010937, + 365608447561553, + 21888242871839275222246405745257275088548364400416034343698203667056904065832, + 21888242871839275222246405745257275088548364400416034343698204123799604185689, + 169866968102661, + 81024409483180, + 263456541870867, + 440954150250321, + 21888242871839275222246405745257275088548364400416034343698204147126287632053, + 341923040618005, + 21888242871839275222246405745257275088548364400416034343698203957860686203688, + 514547251855084, + 539211976751860, + 103875971631879, + 21888242871839275222246405745257275088548364400416034343698204015625585573962, + 21888242871839275222246405745257275088548364400416034343698204079595350567195, + 21888242871839275222246405745257275088548364400416034343698203862907212615849, + 21888242871839275222246405745257275088548364400416034343698203687031275791671, + 420502262773900, + 454389646672947, + 485460305679520, + 21888242871839275222246405745257275088548364400416034343698203976083941510282, + 21888242871839275222246405745257275088548364400416034343698204127535967415218, + 21888242871839275222246405745257275088548364400416034343698203627232411923700, + 163365437011700, + 21888242871839275222246405745257275088548364400416034343698203854000687397255, + 91711009042627, + 21888242871839275222246405745257275088548364400416034343698203643398435422940, + 21888242871839275222246405745257275088548364400416034343698203890822317134466, + 455877920409113, + 74125337485163, + 423621763456176, + 100277602634712, + 539698833151539, + 93469158302865, + 21888242871839275222246405745257275088548364400416034343698203627050166722879, + 478662436126132, + 468943224580304, + 21888242871839275222246405745257275088548364400416034343698203731224680034070, + 21888242871839275222246405745257275088548364400416034343698203768685934214946, + 533893337276068, + 21888242871839275222246405745257275088548364400416034343698203794373964352487, + 62097073652218, + 251081721683453, + 21888242871839275222246405745257275088548364400416034343698203632434322125264, + 407851624366776, + 57067705260725, + 432748095487103, + 21888242871839275222246405745257275088548364400416034343698204072132062866703, + 460243324486697, + 213069907465280, + 21888242871839275222246405745257275088548364400416034343698203680817235100287, + 6248908539939, + 21888242871839275222246405745257275088548364400416034343698204160502387451381, + 317313472076156, + 95159540205353, + 21888242871839275222246405745257275088548364400416034343698204064343303891776, + 21888242871839275222246405745257275088548364400416034343698203939394697108963, + 21888242871839275222246405745257275088548364400416034343698204001674234264771, + 442714784614639, + 21888242871839275222246405745257275088548364400416034343698204006143575486466, + 21888242871839275222246405745257275088548364400416034343698204007653979027738, + 282277939642274, + 21888242871839275222246405745257275088548364400416034343698204181258512648247, + 433840520167112, + 207028448027855, + 21888242871839275222246405745257275088548364400416034343698204067121590277786, + 497265169996687, + 264319372106411, + 21888242871839275222246405745257275088548364400416034343698203768405833364457, + 160182916027950, + 255008272249296, + 288854604784133, + 21888242871839275222246405745257275088548364400416034343698204037523196060956, + 329556441666187, + 264840645489770, + 190055669194389, + 63292648009072, + 180088643101478, + 552857924438828, + 454288600369998, + 21888242871839275222246405745257275088548364400416034343698203772122078342202, + 156396430745332, + 21888242871839275222246405745257275088548364400416034343698204108789867495253, + 498188144042194, + 21888242871839275222246405745257275088548364400416034343698203711637734973639, + 21888242871839275222246405745257275088548364400416034343698203949835227995521, + 21888242871839275222246405745257275088548364400416034343698204182243668021459, + 329346152602138, + 500212706844042, + 162415117582750, + 21888242871839275222246405745257275088548364400416034343698203803692263234275, + 536388895924836, + 21888242871839275222246405745257275088548364400416034343698203771004455295574, + 387852232177890, + 318051745829687, + 554567104629209, + 316038270627569, + 301875870298129, + 21888242871839275222246405745257275088548364400416034343698203971217504972239, + 511431317934471, + 342918126652201, + 559293828291789, + 404633966822620, + 119526076683576, + 508864169975871, + 152512670497135, + 63084408880767, + 21888242871839275222246405745257275088548364400416034343698203749013540525117, + 529068919046470, + 21888242871839275222246405745257275088548364400416034343698204066456687987125, + 21888242871839275222246405745257275088548364400416034343698203809282708555793, + 21888242871839275222246405745257275088548364400416034343698203725223355484907, + 21888242871839275222246405745257275088548364400416034343698203962880176861674, + 92306505160899, + 21888242871839275222246405745257275088548364400416034343698203889152210628043, + 75239825972164, + 160026541545717, + 21888242871839275222246405745257275088548364400416034343698204167869869305765, + 154429203201876, + 34953864238149, + 21888242871839275222246405745257275088548364400416034343698204033308181973517, + 21888242871839275222246405745257275088548364400416034343698204077518834658355, + 21888242871839275222246405745257275088548364400416034343698203671207238936513, + 21888242871839275222246405745257275088548364400416034343698203643364977553996, + 158605417959481, + 150398145154497, + 21888242871839275222246405745257275088548364400416034343698203828470544719773, + 21888242871839275222246405745257275088548364400416034343698204034765757779052, + 21888242871839275222246405745257275088548364400416034343698203970565635713489, + 526104605744989, + 494636736100390, + 383913892822256, + 21888242871839275222246405745257275088548364400416034343698204007573159396659, + 21888242871839275222246405745257275088548364400416034343698204141111789619737, + 130038550901484, + 29714530993455, + 21888242871839275222246405745257275088548364400416034343698203884658064525073, + 21888242871839275222246405745257275088548364400416034343698203875892182049206, + 398222313818854, + 21888242871839275222246405745257275088548364400416034343698204065277501502930, + 58675757834264, + 21888242871839275222246405745257275088548364400416034343698203760172116378893, + 195706122862567, + 152267616991056, + 21888242871839275222246405745257275088548364400416034343698203990978961124071, + 21888242871839275222246405745257275088548364400416034343698204097199757561795, + 21888242871839275222246405745257275088548364400416034343698203982671435491927, + 21888242871839275222246405745257275088548364400416034343698203828132140104374, + 21888242871839275222246405745257275088548364400416034343698203881677263691662, + 434493034649129, + 458067246200144, + 21888242871839275222246405745257275088548364400416034343698203968135089964152, + 21888242871839275222246405745257275088548364400416034343698204026141930178383, + 190548401281447, + 297361002264016, + 506769779706576, + 21888242871839275222246405745257275088548364400416034343698203881268543267301, + 351667813252557, + 479521121337044, + 21888242871839275222246405745257275088548364400416034343698203796921534841225, + 21888242871839275222246405745257275088548364400416034343698203885077515882092, + 122994154811090, + 79353134435072, + 406599046625797, + 21888242871839275222246405745257275088548364400416034343698204006347140130914, + 167408854234224, + 469126550669546, + 104470765732532, + 655626172575, + 412935972710354, + 21888242871839275222246405745257275088548364400416034343698203715443401477526, + 122719954526788, + 71340076029317, + 21888242871839275222246405745257275088548364400416034343698203819638909727957, + 21888242871839275222246405745257275088548364400416034343698204022386252716888, + 150821445496848, + 21888242871839275222246405745257275088548364400416034343698203704804778694498, + 248574180865342, + 470706400714049, + 422159672652281, + 545854152088397, + 21888242871839275222246405745257275088548364400416034343698203930017888360311, + 21888242871839275222246405745257275088548364400416034343698203969118714835026, + 21888242871839275222246405745257275088548364400416034343698203886512673834067, + 21888242871839275222246405745257275088548364400416034343698203715682281562342, + 21888242871839275222246405745257275088548364400416034343698204043575497934850, + 521980643537319, + 21888242871839275222246405745257275088548364400416034343698203891275185499908, + 524475119161126, + 21888242871839275222246405745257275088548364400416034343698204069992428686646, + 21888242871839275222246405745257275088548364400416034343698204064447534206113, + 21888242871839275222246405745257275088548364400416034343698203723072820382364, + 425531369564506, + 173932877049110, + 189600702268386, + 46222784317269, + 21888242871839275222246405745257275088548364400416034343698203673678946217748, + 328188330899001, + 6800648192329, + 21888242871839275222246405745257275088548364400416034343698204080756503552311, + 21888242871839275222246405745257275088548364400416034343698204169892897610063, + 176319705010850, + 21888242871839275222246405745257275088548364400416034343698203851930368528068, + 83948668171634, + 333078960510482, + 21888242871839275222246405745257275088548364400416034343698204108980491686436, + 337264390922729, + 21888242871839275222246405745257275088548364400416034343698204013574429458652, + 21888242871839275222246405745257275088548364400416034343698204089269752581537, + 441357358819872, + 21888242871839275222246405745257275088548364400416034343698204043576003310388, + 74113319519703, + 21888242871839275222246405745257275088548364400416034343698203710318339633818, + 21888242871839275222246405745257275088548364400416034343698203851603819339282, + 251708657122729, + 550981718396288, + 21888242871839275222246405745257275088548364400416034343698203659178620109413, + 14527337004873, + 462612514832847, + 416348729126665, + 21888242871839275222246405745257275088548364400416034343698203657476737316356, + 231297469504236, + 259889535922028, + 478965589741595, + 21888242871839275222246405745257275088548364400416034343698204100105693946685, + 540217479860595, + 421780801782298, + 537729674818890, + 21888242871839275222246405745257275088548364400416034343698204088700574118476, + 21888242871839275222246405745257275088548364400416034343698203841235507305144, + 21888242871839275222246405745257275088548364400416034343698204128882040845358, + 449369718870351, + 417550931192422, + 188025028297831, + 21888242871839275222246405745257275088548364400416034343698203832471419372633, + 21888242871839275222246405745257275088548364400416034343698203880490411725410, + 21888242871839275222246405745257275088548364400416034343698203652574860884363, + 21888242871839275222246405745257275088548364400416034343698203653122555300960, + 21888242871839275222246405745257275088548364400416034343698203743934725589910, + 21888242871839275222246405745257275088548364400416034343698204046386598584061, + 457360497668847, + 156068614420047, + 21888242871839275222246405745257275088548364400416034343698204061896654170335, + 21888242871839275222246405745257275088548364400416034343698203641412970379663, + 44060705136171, + 234573738184721, + 344530686108725, + 299010111569060, + 21888242871839275222246405745257275088548364400416034343698203864351848479057, + 21888242871839275222246405745257275088548364400416034343698204026412504734578, + 21888242871839275222246405745257275088548364400416034343698204058331046013205, + 43719732770236, + 66510804555879, + 21888242871839275222246405745257275088548364400416034343698204073547574830251, + 21888242871839275222246405745257275088548364400416034343698204036816445176967, + 513518061420384, + 21888242871839275222246405745257275088548364400416034343698203976496218891369, + 21888242871839275222246405745257275088548364400416034343698204135892194851239, + 21394921853192, + 21888242871839275222246405745257275088548364400416034343698204046318871070362, + 204491080509816, + 21888242871839275222246405745257275088548364400416034343698204140185547002468, + 21888242871839275222246405745257275088548364400416034343698203833684796866828, + 181110244250597, + 21888242871839275222246405745257275088548364400416034343698204019698754641548, + 21888242871839275222246405745257275088548364400416034343698203859163670326592, + 21888242871839275222246405745257275088548364400416034343698203956348153184111, + 21888242871839275222246405745257275088548364400416034343698203747281757662502, + 382988146396388, + 21888242871839275222246405745257275088548364400416034343698203921337715713041, + 21888242871839275222246405745257275088548364400416034343698204026528747234748, + 549767316365931, + 316308731956157, + 21888242871839275222246405745257275088548364400416034343698203643173826569601, + 21888242871839275222246405745257275088548364400416034343698204040395066353052, + 473881386614619, + 105314892314067, + 300891141343479, + 21888242871839275222246405745257275088548364400416034343698203640910754028475, + 344549576633111, + 21888242871839275222246405745257275088548364400416034343698204121272152686997, + 2669284165780, + 389833723944809, + 430687969163629, + 268363379668109, + 21888242871839275222246405745257275088548364400416034343698204042778617749337, + 21888242871839275222246405745257275088548364400416034343698204182226335273724, + 433745822659446, + 1443148527994, + 271529567424646, + 21888242871839275222246405745257275088548364400416034343698203711665984576940, + 425004809206731, + 295126633021923, + 21888242871839275222246405745257275088548364400416034343698204018477275429053, + 158308670421938, + 21888242871839275222246405745257275088548364400416034343698204009197385856682, + 21888242871839275222246405745257275088548364400416034343698203874744573569715, + 21888242871839275222246405745257275088548364400416034343698203803431292987493, + 551094964553623, + 21888242871839275222246405745257275088548364400416034343698204017091067657509, + 514827270133931, + 21888242871839275222246405745257275088548364400416034343698204161087136848693, + 365160446282945, + 21888242871839275222246405745257275088548364400416034343698203721020664488482, + 21888242871839275222246405745257275088548364400416034343698203990050288676365, + 151074293920531, + 21888242871839275222246405745257275088548364400416034343698204073324576360399, + 21888242871839275222246405745257275088548364400416034343698204065485289447966, + 436477403111928, + 540164508777897, + 492129190884473, + 21888242871839275222246405745257275088548364400416034343698203888415677673183, + 21888242871839275222246405745257275088548364400416034343698203928563980136397, + 137135239161067, + 82727653209824, + 483056635130599, + 21888242871839275222246405745257275088548364400416034343698203923404725176324, + 165563061923251, + 21888242871839275222246405745257275088548364400416034343698203857489044249428, + 220745735150355, + 21888242871839275222246405745257275088548364400416034343698204129831270010447, + 21888242871839275222246405745257275088548364400416034343698204111780219310246, + 451772164044301, + 21888242871839275222246405745257275088548364400416034343698203679748000745228, + 21888242871839275222246405745257275088548364400416034343698203917993477456392, + 21888242871839275222246405745257275088548364400416034343698203799970248833292, + 21888242871839275222246405745257275088548364400416034343698203993229662568084, + 21888242871839275222246405745257275088548364400416034343698203656742293496884, + 496866735889761, + 56983257032473, + 264010977926774, + 341248569322275, + 21888242871839275222246405745257275088548364400416034343698204011912931811753, + 21888242871839275222246405745257275088548364400416034343698203785935258021598, + 48624331541745, + 21888242871839275222246405745257275088548364400416034343698204012022298654554, + 261949371349859, + 21888242871839275222246405745257275088548364400416034343698203953160104073890, + 470140952532210, + 562223787807570, + 335752035563092, + 57150884660899, + 21888242871839275222246405745257275088548364400416034343698203711406466534524, + 21888242871839275222246405745257275088548364400416034343698204109674924426151, + 21888242871839275222246405745257275088548364400416034343698204050754213343146, + 268846096386954, + 110280049558561, + 430435849426578, + 21888242871839275222246405745257275088548364400416034343698204046537392932753, + 21888242871839275222246405745257275088548364400416034343698203833265438741968, + 21888242871839275222246405745257275088548364400416034343698204124465574147336, + 21888242871839275222246405745257275088548364400416034343698203966449132549439, + 204793940800565, + 21888242871839275222246405745257275088548364400416034343698204019437652884870, + 21888242871839275222246405745257275088548364400416034343698203641320442393256, + 21888242871839275222246405745257275088548364400416034343698204120850260308826, + 158324047191381, + 21888242871839275222246405745257275088548364400416034343698203970060023031828, + 348455515767341, + 117221125118965, + 21888242871839275222246405745257275088548364400416034343698203889478951667633, + 558370295622165, + 182596381898988, + 21888242871839275222246405745257275088548364400416034343698204022771369343768, + 491913410345649, + 21888242871839275222246405745257275088548364400416034343698203683817218073233, + 21888242871839275222246405745257275088548364400416034343698204152152696917188, + 21888242871839275222246405745257275088548364400416034343698203964812823268619, + 21888242871839275222246405745257275088548364400416034343698204138492790300732, + 383438090640476, + 507688204285244, + 21888242871839275222246405745257275088548364400416034343698203975550811858852, + 266334656292700, + 21888242871839275222246405745257275088548364400416034343698203863879952098366, + 341799961212879, + 21888242871839275222246405745257275088548364400416034343698203746187102782171, + 21888242871839275222246405745257275088548364400416034343698204096180881774073, + 539145653061997, + 106887005947197, + 21888242871839275222246405745257275088548364400416034343698203797065712111905, + 128118206776874, + 94827891080572, + 301211286747352, + 21888242871839275222246405745257275088548364400416034343698203652090482408500, + 21888242871839275222246405745257275088548364400416034343698203985476348108038, + 267601716232687, + 130108637460152, + 21888242871839275222246405745257275088548364400416034343698204138279942638923, + 507008930054046, + 22900389573292, + 394425796113841, + 436028608027536, + 21888242871839275222246405745257275088548364400416034343698203976921612247240, + 21888242871839275222246405745257275088548364400416034343698203813698999295333, + 37268098570115, + 21888242871839275222246405745257275088548364400416034343698203659203660628074, + 127657774699855, + 21888242871839275222246405745257275088548364400416034343698203908805846906545, + 435458590433478, + 552571787851894, + 21888242871839275222246405745257275088548364400416034343698203844405534441503, + 475974491560322, + 21888242871839275222246405745257275088548364400416034343698203930416710334805, + 12581985073214, + 203095620377264, + 430815802190446, + 21888242871839275222246405745257275088548364400416034343698204017365639067826, + 21888242871839275222246405745257275088548364400416034343698203824455665110881, + 73351404174627, + 554524013821344, + 21888242871839275222246405745257275088548364400416034343698203900325397466454, + 72808526060916, + 463924650306082, + 21888242871839275222246405745257275088548364400416034343698203868640510915120, + 178856577139999, + 21888242871839275222246405745257275088548364400416034343698204064620235219426, + 21888242871839275222246405745257275088548364400416034343698203795515921422024, + 21888242871839275222246405745257275088548364400416034343698203900330683369792, + 394607522358707, + 21888242871839275222246405745257275088548364400416034343698204001065534409078, + 560703798761840, + 21888242871839275222246405745257275088548364400416034343698203761785560044228, + 240230282692491, + 21888242871839275222246405745257275088548364400416034343698203731867617506542, + 21888242871839275222246405745257275088548364400416034343698204037527943144719, + 21888242871839275222246405745257275088548364400416034343698203848127073731836, + 21732540153249, + 21888242871839275222246405745257275088548364400416034343698204147919553485455, + 186009072489683, + 21888242871839275222246405745257275088548364400416034343698204143301553403973, + 147649599696296, + 21888242871839275222246405745257275088548364400416034343698203955539009100693, + 21888242871839275222246405745257275088548364400416034343698204036320300714369, + 21888242871839275222246405745257275088548364400416034343698204023136897420213, + 21888242871839275222246405745257275088548364400416034343698203658812565468764, + 21888242871839275222246405745257275088548364400416034343698203882535831025434, + 21888242871839275222246405745257275088548364400416034343698204068448249128681, + 21888242871839275222246405745257275088548364400416034343698203818510090321688, + 544735902446464, + 304810232219914, + 21888242871839275222246405745257275088548364400416034343698203659389271383328, + 21888242871839275222246405745257275088548364400416034343698203861214447637964, + 355422762928358, + 430848782256806, + 21888242871839275222246405745257275088548364400416034343698203781377648054614, + 306239809721966, + 21888242871839275222246405745257275088548364400416034343698203764814827770235, + 471459715660935, + 21888242871839275222246405745257275088548364400416034343698203835124803356756, + 21888242871839275222246405745257275088548364400416034343698203958793214155471, + 21888242871839275222246405745257275088548364400416034343698203798513093117732, + 21888242871839275222246405745257275088548364400416034343698203863739593035236, + 359759274549311, + 21888242871839275222246405745257275088548364400416034343698203652163062446638, + 21888242871839275222246405745257275088548364400416034343698203655015769408249, + 104877490591720, + 21888242871839275222246405745257275088548364400416034343698203691979581178212, + 176934631692154, + 531673343253524, + 378371629173238, + 21888242871839275222246405745257275088548364400416034343698204031955463462394, + 21888242871839275222246405745257275088548364400416034343698204183739799008062, + 21888242871839275222246405745257275088548364400416034343698203982193191820806, + 21888242871839275222246405745257275088548364400416034343698204133276634499896, + 21888242871839275222246405745257275088548364400416034343698203784570028761428, + 21888242871839275222246405745257275088548364400416034343698203854722557312651, + 484965356015931, + 21888242871839275222246405745257275088548364400416034343698203959544535140077, + 21888242871839275222246405745257275088548364400416034343698203817566160864019, + 21888242871839275222246405745257275088548364400416034343698203824845345087431, + 21888242871839275222246405745257275088548364400416034343698203779445127683120, + 21888242871839275222246405745257275088548364400416034343698203679307138779595, + 285413306898320, + 21888242871839275222246405745257275088548364400416034343698203736685229758038, + 21888242871839275222246405745257275088548364400416034343698203983493366338109, + 21888242871839275222246405745257275088548364400416034343698203803761040261159, + 21888242871839275222246405745257275088548364400416034343698203891163147962411, + 21888242871839275222246405745257275088548364400416034343698204150591027092520, + 21888242871839275222246405745257275088548364400416034343698203888389717470328, + 62105846116303, + 21888242871839275222246405745257275088548364400416034343698203769986550663440, + 496484424746553, + 159788234027029, + 21888242871839275222246405745257275088548364400416034343698203693030699428825, + 445927067083171, + 352817468360483, + 21888242871839275222246405745257275088548364400416034343698203989436653437301, + 21888242871839275222246405745257275088548364400416034343698203891084600774379, + 79917394199129, + 21888242871839275222246405745257275088548364400416034343698203854905041827854, + 332571928841221, + 106550512167355, + 154479924281462, + 21888242871839275222246405745257275088548364400416034343698203901548461842724, + 88483991270206, + 309097072475677, + 21888242871839275222246405745257275088548364400416034343698203701380145896524, + 470535634224632, + 484264306072563, + 21888242871839275222246405745257275088548364400416034343698203802563576042028, + 21888242871839275222246405745257275088548364400416034343698203869835813038687, + 51050415732128, + 21888242871839275222246405745257275088548364400416034343698203960903832446634, + 497523262044484, + 287286882684642, + 532834939691562, + 21888242871839275222246405745257275088548364400416034343698203860091529095684, + 21888242871839275222246405745257275088548364400416034343698203651433282673877, + 21888242871839275222246405745257275088548364400416034343698203672891379940487, + 21888242871839275222246405745257275088548364400416034343698203928825212043278, + 239827126988932, + 539488637888910, + 21888242871839275222246405745257275088548364400416034343698203998814335238001, + 372430922910577, + 21888242871839275222246405745257275088548364400416034343698203941021892511796, + 299526670175303, + 164943082800876, + 138236151958638, + 262066573197160, + 92930372687507, + 21888242871839275222246405745257275088548364400416034343698203924692320417816, + 21888242871839275222246405745257275088548364400416034343698203858743197552922, + 21888242871839275222246405745257275088548364400416034343698204125187862408994, + 497770567352921, + 21888242871839275222246405745257275088548364400416034343698203919094662266118, + 365597050733290, + 21888242871839275222246405745257275088548364400416034343698204153700298442745, + 492679695952345, + 21888242871839275222246405745257275088548364400416034343698203854492861194893, + 533563616993361, + 21888242871839275222246405745257275088548364400416034343698204148161615782939, + 105264755081629, + 511688087849764, + 21888242871839275222246405745257275088548364400416034343698203827792115697549, + 304463681871570, + 21888242871839275222246405745257275088548364400416034343698204137247254016486, + 310059852450700, + 55712893999969, + 21888242871839275222246405745257275088548364400416034343698203927828217353073, + 21888242871839275222246405745257275088548364400416034343698203881202082344473, + 452303690735645, + 21888242871839275222246405745257275088548364400416034343698203647956417043355, + 406967045471614, + 205540447008486, + 21888242871839275222246405745257275088548364400416034343698203952720045554426, + 414234476104705, + 21888242871839275222246405745257275088548364400416034343698203981347677863556, + 21888242871839275222246405745257275088548364400416034343698203823448713860705, + 21888242871839275222246405745257275088548364400416034343698203657259170519327, + 21888242871839275222246405745257275088548364400416034343698203899103731116311, + 21888242871839275222246405745257275088548364400416034343698203649561272008054, + 11123674614025, + 387779425861544, + 21888242871839275222246405745257275088548364400416034343698204031251175881914, + 71659734853156, + 21888242871839275222246405745257275088548364400416034343698203972865658866122, + 271506875034886, + 21888242871839275222246405745257275088548364400416034343698203700430193469561, + 15797904934177, + 21888242871839275222246405745257275088548364400416034343698203896513843248879, + 21888242871839275222246405745257275088548364400416034343698203815346557844436, + 21888242871839275222246405745257275088548364400416034343698203692948404234247, + 21888242871839275222246405745257275088548364400416034343698203883207740364332, + 21888242871839275222246405745257275088548364400416034343698203898442444995430, + 241283976071156, + 47682386762074, + 514881312370371, + 84391705119239, + 221833941800768, + 21888242871839275222246405745257275088548364400416034343698203750303639545483, + 21888242871839275222246405745257275088548364400416034343698203653824205929917, + 21888242871839275222246405745257275088548364400416034343698204122453285511784, + 53578263747191, + 21888242871839275222246405745257275088548364400416034343698203851518973145662, + 21888242871839275222246405745257275088548364400416034343698203826029045320475, + 128883157369099, + 21888242871839275222246405745257275088548364400416034343698203985262778817941, + 512964477208950, + 21888242871839275222246405745257275088548364400416034343698203752321068949082, + 21888242871839275222246405745257275088548364400416034343698203740668633073343, + 21888242871839275222246405745257275088548364400416034343698203929948019742348, + 194457515590122, + 21888242871839275222246405745257275088548364400416034343698203918247417203645, + 21888242871839275222246405745257275088548364400416034343698203708043197585968, + 21888242871839275222246405745257275088548364400416034343698203698649436870175, + 474896188194569, + 462978573595314, + 230125514760899, + 325428241398889, + 313255900470543, + 504259676089217, + 506232566875492, + 363184908096552, + 21888242871839275222246405745257275088548364400416034343698203650768974176095, + 21888242871839275222246405745257275088548364400416034343698204153081233007281, + 21888242871839275222246405745257275088548364400416034343698203731415197237378, + 320580674578945, + 21888242871839275222246405745257275088548364400416034343698204005355957115450, + 21888242871839275222246405745257275088548364400416034343698203695081730122092, + 277460130951879, + 409003213648951, + 242681575186300, + 8645917352615, + 360938963367965, + 451281677570130, + 182230142982112, + 224511967074684, + 322258509121955, + 480343654561099, + 452130775591800, + 543036698655104, + 21888242871839275222246405745257275088548364400416034343698204091498952139317, + 21888242871839275222246405745257275088548364400416034343698204091178495860338, + 491018135144908, + 21888242871839275222246405745257275088548364400416034343698204041579972778236, + 21888242871839275222246405745257275088548364400416034343698203717486584293090, + 21888242871839275222246405745257275088548364400416034343698204019645110591144, + 21888242871839275222246405745257275088548364400416034343698203921425394765172, + 161283675804471, + 199364882243241, + 309461870135051, + 91419913782592, + 21888242871839275222246405745257275088548364400416034343698204101759749220802, + 21888242871839275222246405745257275088548364400416034343698204046780110011678, + 21888242871839275222246405745257275088548364400416034343698204119354251582174, + 21888242871839275222246405745257275088548364400416034343698204138753253081745, + 21888242871839275222246405745257275088548364400416034343698203948812620937808, + 204745729586221, + 556913463126224, + 21888242871839275222246405745257275088548364400416034343698203852116181780506, + 21888242871839275222246405745257275088548364400416034343698203773271301669319, + 223889383055886, + 4752398552714, + 21888242871839275222246405745257275088548364400416034343698203875598270776699, + 390272310059407, + 355171468582121, + 21888242871839275222246405745257275088548364400416034343698204058119108120827, + 109248098398601, + 463965975791016, + 21888242871839275222246405745257275088548364400416034343698203790151744112646, + 521486337754450, + 371385875604850, + 21888242871839275222246405745257275088548364400416034343698204055064562014673, + 536473810490236, + 257694744436783, + 258980555855636, + 234762958176291, + 21888242871839275222246405745257275088548364400416034343698203813861463660365, + 21888242871839275222246405745257275088548364400416034343698204074984927974701, + 21888242871839275222246405745257275088548364400416034343698204162585940994598, + 21888242871839275222246405745257275088548364400416034343698203840799722053967, + 21888242871839275222246405745257275088548364400416034343698203823034341039203, + 21888242871839275222246405745257275088548364400416034343698203686713027584509, + 170836632850381, + 21888242871839275222246405745257275088548364400416034343698203775491365955390, + 270930725461396, + 39422971882282, + 389807570435995, + 21888242871839275222246405745257275088548364400416034343698203910499926422539, + 186326410477678, + 56511402417994, + 21888242871839275222246405745257275088548364400416034343698203628768596293959, + 21888242871839275222246405745257275088548364400416034343698203790799631594322, + 265215940060822, + 21888242871839275222246405745257275088548364400416034343698204134726574625588, + 452501167301611, + 393010321974842, + 21888242871839275222246405745257275088548364400416034343698203874682318590027, + 21888242871839275222246405745257275088548364400416034343698203632426327556149, + 389569399510102, + 21888242871839275222246405745257275088548364400416034343698204051938715937560, + 21888242871839275222246405745257275088548364400416034343698204006916119177636, + 137120068062863, + 247004878111949, + 285045558929968, + 554201944989110, + 21888242871839275222246405745257275088548364400416034343698203860996034103285, + 21888242871839275222246405745257275088548364400416034343698203890015768251604, + 245926535867862, + 21888242871839275222246405745257275088548364400416034343698203942548440525830, + 21888242871839275222246405745257275088548364400416034343698204175740809900143, + 327789727405615, + 21888242871839275222246405745257275088548364400416034343698203811419133584606, + 21888242871839275222246405745257275088548364400416034343698203965774432506309, + 111619080024187, + 85799158568450, + 21888242871839275222246405745257275088548364400416034343698204046386451836047, + 21888242871839275222246405745257275088548364400416034343698203778482756116356, + 21888242871839275222246405745257275088548364400416034343698203741841275284626, + 473582356675011, + 165913254601352, + 448196087416839, + 21888242871839275222246405745257275088548364400416034343698203624104211515102, + 153942448612567, + 21888242871839275222246405745257275088548364400416034343698204145873556687697, + 417724953710395, + 357750044399260, + 21888242871839275222246405745257275088548364400416034343698203832598333461118, + 412834433766335, + 236471106315874, + 231035312539727, + 239763492233376, + 8552062905723, + 21888242871839275222246405745257275088548364400416034343698203821658820639125, + 224813009644784, + 335700927698409, + 21888242871839275222246405745257275088548364400416034343698203641712449000135, + 555141618947875, + 386973689428648, + 21888242871839275222246405745257275088548364400416034343698203846472582049288, + 276984088169882, + 37043570720554, + 21888242871839275222246405745257275088548364400416034343698203838377949821151, + 21888242871839275222246405745257275088548364400416034343698203643526594046401, + 189277194497105, + 213241635520228, + 21888242871839275222246405745257275088548364400416034343698204011599754420956, + 21888242871839275222246405745257275088548364400416034343698204180679703354643, + 21888242871839275222246405745257275088548364400416034343698204045718001668158, + 21888242871839275222246405745257275088548364400416034343698204169720062111266, + 561630533066531, + 528868498256532, + 21888242871839275222246405745257275088548364400416034343698203707832514537864, + 21888242871839275222246405745257275088548364400416034343698203886285527146670, + 21888242871839275222246405745257275088548364400416034343698204033194877241566, + 527014064750714, + 38247597216248, + 21888242871839275222246405745257275088548364400416034343698203707436921251986, + 21888242871839275222246405745257275088548364400416034343698203694740307173160, + 360664395369849, + 21888242871839275222246405745257275088548364400416034343698203987267511405223, + 21888242871839275222246405745257275088548364400416034343698204077503167311978, + 21888242871839275222246405745257275088548364400416034343698203761258819083461, + 377374467984022, + 21888242871839275222246405745257275088548364400416034343698203740704689300623, + 28741454303457, + 21888242871839275222246405745257275088548364400416034343698203896373884902808, + 182422006861834, + 21888242871839275222246405745257275088548364400416034343698203683326384824032, + 265783543749879, + 492497420025281, + 181979162863749, + 21888242871839275222246405745257275088548364400416034343698204059691089687609, + 21888242871839275222246405745257275088548364400416034343698204038418423767201, + 21888242871839275222246405745257275088548364400416034343698203648900200662909, + 21888242871839275222246405745257275088548364400416034343698203787133046788144, + 21888242871839275222246405745257275088548364400416034343698203880612576797213, + 553368557726534, + 21888242871839275222246405745257275088548364400416034343698203660552679132850, + 21888242871839275222246405745257275088548364400416034343698203705299276449926, + 21888242871839275222246405745257275088548364400416034343698203962797903102158, + 21888242871839275222246405745257275088548364400416034343698203810101954584014, + 21888242871839275222246405745257275088548364400416034343698203662407757448769, + 32917154879876, + 21888242871839275222246405745257275088548364400416034343698203934006884798124, + 21888242871839275222246405745257275088548364400416034343698203784691725418244, + 489363251282049, + 21888242871839275222246405745257275088548364400416034343698203726160826394624, + 21888242871839275222246405745257275088548364400416034343698203864191052971712, + 21888242871839275222246405745257275088548364400416034343698203930007863482878, + 21888242871839275222246405745257275088548364400416034343698204143414896865923, + 21888242871839275222246405745257275088548364400416034343698203726277946072755, + 21888242871839275222246405745257275088548364400416034343698203727449331876325, + 21888242871839275222246405745257275088548364400416034343698203663002190766518, + 21888242871839275222246405745257275088548364400416034343698204095155680255969, + 162737227927260, + 21888242871839275222246405745257275088548364400416034343698203630943749474529, + 528349914941985, + 21888242871839275222246405745257275088548364400416034343698204158327351025157, + 534106380462330, + 355743054428187, + 21888242871839275222246405745257275088548364400416034343698204134643890087057, + 21888242871839275222246405745257275088548364400416034343698203654847569088920, + 522288432549048, + 485959922625256, + 357344568723575, + 21703255433172, + 21888242871839275222246405745257275088548364400416034343698204147226944174687, + 21888242871839275222246405745257275088548364400416034343698203726946100536754, + 21888242871839275222246405745257275088548364400416034343698203688827009024658, + 21888242871839275222246405745257275088548364400416034343698203706149314083849, + 21888242871839275222246405745257275088548364400416034343698203931133165977806, + 21888242871839275222246405745257275088548364400416034343698203989036501379522, + 442169298538727, + 21888242871839275222246405745257275088548364400416034343698203838722707518889, + 238205786173060, + 21888242871839275222246405745257275088548364400416034343698203983720626341274, + 72836369403107, + 181157729967937, + 21888242871839275222246405745257275088548364400416034343698203717074479527006, + 21888242871839275222246405745257275088548364400416034343698204136032898723105, + 391642778631121, + 301179925814133, + 21888242871839275222246405745257275088548364400416034343698203984444417285726, + 235663334636133, + 21888242871839275222246405745257275088548364400416034343698203879811610040521, + 44401034009971, + 168822259583549, + 231090735453912, + 518468180961526, + 183752606929280, + 357573211852185, + 127380271874033, + 21888242871839275222246405745257275088548364400416034343698204080774521803150, + 115407332690522, + 21888242871839275222246405745257275088548364400416034343698203995253152240220, + 21888242871839275222246405745257275088548364400416034343698203832746141951700, + 182021611522732, + 544090494319822, + 242136642716889, + 21888242871839275222246405745257275088548364400416034343698203871227038761535, + 545913938720263, + 361396370019716, + 21888242871839275222246405745257275088548364400416034343698203787802109967193, + 21888242871839275222246405745257275088548364400416034343698204034845421703902, + 21888242871839275222246405745257275088548364400416034343698203738511444751525, + 21888242871839275222246405745257275088548364400416034343698204043232746370734, + 14141520330240, + 561896536760296, + 21888242871839275222246405745257275088548364400416034343698204128413898179080, + 21888242871839275222246405745257275088548364400416034343698203656927420474176, + 373269598235024, + 21888242871839275222246405745257275088548364400416034343698203850012731758105, + 487838097229405, + 335330425768705, + 21888242871839275222246405745257275088548364400416034343698203905398951830092, + 21888242871839275222246405745257275088548364400416034343698203825582053907277, + 21888242871839275222246405745257275088548364400416034343698204132960106897079, + 550474498289403, + 210922980687415, + 21888242871839275222246405745257275088548364400416034343698203856508570653314, + 183149140422580, + 21888242871839275222246405745257275088548364400416034343698203691365166750729, + 21888242871839275222246405745257275088548364400416034343698204077898120151579, + 21888242871839275222246405745257275088548364400416034343698203787311382974456, + 37213300849902, + 21888242871839275222246405745257275088548364400416034343698203814855239229171, + 246462049294450, + 33129699086620, + 21888242871839275222246405745257275088548364400416034343698203994699792092157, + 35975299695458, + 21888242871839275222246405745257275088548364400416034343698204128471720832329, + 497405690980668, + 323331049094935, + 419742494736576, + 21888242871839275222246405745257275088548364400416034343698203842771606114069, + 280580397243844, + 21888242871839275222246405745257275088548364400416034343698203959523004320098, + 53315254108381, + 21888242871839275222246405745257275088548364400416034343698203664048110509313, + 254216747356260, + 520705610737096, + 552339752235105, + 418833057085803, + 468784233443244, + 21888242871839275222246405745257275088548364400416034343698204186323133018495, + 21888242871839275222246405745257275088548364400416034343698203878290599304309, + 21888242871839275222246405745257275088548364400416034343698203917516610986862, + 551516792550649, + 474807155892408, + 238804634001505, + 21888242871839275222246405745257275088548364400416034343698203752989648609326, + 21888242871839275222246405745257275088548364400416034343698204073060642624374, + 21888242871839275222246405745257275088548364400416034343698204039340204269046, + 21888242871839275222246405745257275088548364400416034343698203897150712532158, + 436963317283908, + 79788415701465, + 495097580141546, + 21888242871839275222246405745257275088548364400416034343698203754353865727520, + 21888242871839275222246405745257275088548364400416034343698203832305181545735, + 21888242871839275222246405745257275088548364400416034343698204126247237112277, + 21888242871839275222246405745257275088548364400416034343698203915095669569640, + 21888242871839275222246405745257275088548364400416034343698203766553650557728, + 39112412792415, + 174982791950428, + 543600500795474, + 21888242871839275222246405745257275088548364400416034343698203813264022589499, + 42668687728653, + 21888242871839275222246405745257275088548364400416034343698203776749960754687, + 395341909493025, + 21888242871839275222246405745257275088548364400416034343698204133301114519982, + 390939567866583, + 169135448158730, + 21888242871839275222246405745257275088548364400416034343698203889527533594218, + 21888242871839275222246405745257275088548364400416034343698203784965873076593, + 323945971494333, + 512030664672780, + 368333980923, + 490559609622562, + 21888242871839275222246405745257275088548364400416034343698203786963571312219, + 268365206247561, + 21888242871839275222246405745257275088548364400416034343698204150975008267668, + 6907958980279, + 344508485496745, + 21888242871839275222246405745257275088548364400416034343698203717909843810658, + 21888242871839275222246405745257275088548364400416034343698203989268068256275, + 21888242871839275222246405745257275088548364400416034343698204158969663204264, + 513863986481929, + 379868247381003, + 421555261163043, + 21888242871839275222246405745257275088548364400416034343698204052261196086186, + 190588487883479, + 34021373960782, + 273255388515313, + 80524252964100, + 21888242871839275222246405745257275088548364400416034343698203913594149686239, + 340271802670065, + 529379480928232, + 174759000451042, + 21888242871839275222246405745257275088548364400416034343698203933237555912194, + 21888242871839275222246405745257275088548364400416034343698204141710115777724, + 21888242871839275222246405745257275088548364400416034343698203919241361352702, + 21888242871839275222246405745257275088548364400416034343698203792198585140103, + 21888242871839275222246405745257275088548364400416034343698203924756643944451, + 21888242871839275222246405745257275088548364400416034343698204076828826719072, + 21888242871839275222246405745257275088548364400416034343698204065586786580175, + 111471533652332, + 244641383572454, + 21888242871839275222246405745257275088548364400416034343698203921997853276195, + 466666965985445, + 20767859310028, + 342416884338791, + 536718900331517, + 21888242871839275222246405745257275088548364400416034343698203844331040076189, + 21888242871839275222246405745257275088548364400416034343698203640439247439110, + 21888242871839275222246405745257275088548364400416034343698204020230200833299, + 253074476873788, + 21888242871839275222246405745257275088548364400416034343698204146489536312335, + 357700662936973, + 381320827436378, + 122913563366153, + 21888242871839275222246405745257275088548364400416034343698204089486861546745, + 442182533439855, + 398835188457109, + 21888242871839275222246405745257275088548364400416034343698203940134260284733, + 312288241597748, + 21888242871839275222246405745257275088548364400416034343698204041546214779253, + 21888242871839275222246405745257275088548364400416034343698203661284639235915, + 431481986444737, + 266803961641197, + 305962461033426, + 318838725165696, + 21888242871839275222246405745257275088548364400416034343698203805625737216226, + 326603763738942, + 21888242871839275222246405745257275088548364400416034343698203648028032749578, + 21888242871839275222246405745257275088548364400416034343698203653859077675216, + 21888242871839275222246405745257275088548364400416034343698203729053401747051, + 96178195129380, + 21888242871839275222246405745257275088548364400416034343698204176256355221406, + 56136918874617, + 501048316801634, + 21888242871839275222246405745257275088548364400416034343698203768434312444336, + 21888242871839275222246405745257275088548364400416034343698203775188443730060, + 21888242871839275222246405745257275088548364400416034343698203803261188789396, + 138534453828338, + 204981651413667, + 307698468016769, + 479751622352755, + 21888242871839275222246405745257275088548364400416034343698204080987819720796, + 21888242871839275222246405745257275088548364400416034343698204110578828743485, + 21888242871839275222246405745257275088548364400416034343698204060799694738776, + 21888242871839275222246405745257275088548364400416034343698203949826935343210, + 258474976223159, + 21888242871839275222246405745257275088548364400416034343698203763185183176661, + 21888242871839275222246405745257275088548364400416034343698204020633951598455, + 329413695797627, + 21888242871839275222246405745257275088548364400416034343698204138088361245205, + 21888242871839275222246405745257275088548364400416034343698204063985180285040, + 168325202242669, + 21888242871839275222246405745257275088548364400416034343698203847672690585472, + 21888242871839275222246405745257275088548364400416034343698203839803731558650, + 221867191189571, + 21888242871839275222246405745257275088548364400416034343698204132837057615825, + 21888242871839275222246405745257275088548364400416034343698204185171688455337, + 21888242871839275222246405745257275088548364400416034343698204036341842612968, + 269900499849061, + 21888242871839275222246405745257275088548364400416034343698203997822038709563, + 345873159592079, + 21888242871839275222246405745257275088548364400416034343698203942352204853181, + 21888242871839275222246405745257275088548364400416034343698203853937552370100, + 525946002128840, + 446476345994562, + 133734316166695, + 21888242871839275222246405745257275088548364400416034343698203950829852101368, + 479209897724416, + 244568983715867, + 107289104807705, + 301025139387630, + 21888242871839275222246405745257275088548364400416034343698203729020064419310, + 21888242871839275222246405745257275088548364400416034343698204035353841512731, + 106775582722069, + 21888242871839275222246405745257275088548364400416034343698203968262342937672, + 203923131315537, + 21888242871839275222246405745257275088548364400416034343698203954651978856682, + 199078926203678, + 21888242871839275222246405745257275088548364400416034343698203783796289538600, + 294402822461234, + 500235269594497, + 21888242871839275222246405745257275088548364400416034343698203901222346424135, + 3631914544676, + 551954518168542, + 557375550577890, + 21888242871839275222246405745257275088548364400416034343698203647376870394564, + 416380138326898, + 21888242871839275222246405745257275088548364400416034343698204126248635808908, + 21888242871839275222246405745257275088548364400416034343698204072601052970721, + 21888242871839275222246405745257275088548364400416034343698203964132083871414, + 21888242871839275222246405745257275088548364400416034343698203994329945802977, + 9928342836581, + 21888242871839275222246405745257275088548364400416034343698203989322825943043, + 21888242871839275222246405745257275088548364400416034343698203789548753823956, + 74350461867359, + 403070213939816, + 21888242871839275222246405745257275088548364400416034343698203769575062177629, + 21888242871839275222246405745257275088548364400416034343698203740067782832766, + 113463766002912, + 21888242871839275222246405745257275088548364400416034343698204090440865009325, + 21888242871839275222246405745257275088548364400416034343698203996644925015122, + 21888242871839275222246405745257275088548364400416034343698204025436438647958, + 21888242871839275222246405745257275088548364400416034343698203953807889936529, + 21888242871839275222246405745257275088548364400416034343698203735438813398404, + 21888242871839275222246405745257275088548364400416034343698204169004275576012, + 438870026071966, + 13658623987396, + 381815362370436, + 178657580407946, + 21888242871839275222246405745257275088548364400416034343698203840134365742313, + 21888242871839275222246405745257275088548364400416034343698204184614847386498, + 21888242871839275222246405745257275088548364400416034343698203933786516390414, + 21888242871839275222246405745257275088548364400416034343698204148011730813090, + 21888242871839275222246405745257275088548364400416034343698203918132985100112, + 21888242871839275222246405745257275088548364400416034343698203798022285415144, + 498557223741480, + 335031203187499, + 386710329623856, + 21888242871839275222246405745257275088548364400416034343698203732857718742224, + 21888242871839275222246405745257275088548364400416034343698203764488740359688, + 21888242871839275222246405745257275088548364400416034343698203782999603552771, + 21888242871839275222246405745257275088548364400416034343698203947052123716848, + 28405903238864, + 484075817662300, + 528896874991669, + 31169331850906, + 210530465293150, + 538920886722474, + 21888242871839275222246405745257275088548364400416034343698203672792793921553, + 21888242871839275222246405745257275088548364400416034343698203975809067633238, + 181107650189918, + 112735632939750, + 432843363852801, + 21888242871839275222246405745257275088548364400416034343698204082045738609708, + 21888242871839275222246405745257275088548364400416034343698203821275849568506, + 21888242871839275222246405745257275088548364400416034343698203763590532603220, + 530989873793634, + 443692679643638, + 409801437497403, + 495882203704762, + 21888242871839275222246405745257275088548364400416034343698203820427322877074, + 21888242871839275222246405745257275088548364400416034343698203847235292782976, + 21888242871839275222246405745257275088548364400416034343698203719298544915165, + 21888242871839275222246405745257275088548364400416034343698203903576297837937, + 21888242871839275222246405745257275088548364400416034343698203824825757218526, + 187972685273163, + 21888242871839275222246405745257275088548364400416034343698204078219193166952, + 21888242871839275222246405745257275088548364400416034343698203666182927857472, + 448424045349764, + 507196173483704, + 21888242871839275222246405745257275088548364400416034343698204069956597084682, + 21888242871839275222246405745257275088548364400416034343698203910323234816511, + 234395673013402, + 21888242871839275222246405745257275088548364400416034343698203871984413292218, + 21888242871839275222246405745257275088548364400416034343698204026055570982880, + 331073951534635, + 333556962082931, + 21888242871839275222246405745257275088548364400416034343698203876986218165386, + 301134976392024, + 240261581664005, + 501150738626863, + 100543878455942, + 146971875484311, + 269013747411178, + 221729265422823, + 238938655439275, + 197152371828358, + 508596601692809, + 21888242871839275222246405745257275088548364400416034343698203829560880237395, + 21888242871839275222246405745257275088548364400416034343698203892594901726092, + 21888242871839275222246405745257275088548364400416034343698203792525237645279, + 309457032096912, + 472845527138569, + 308687760271451, + 21888242871839275222246405745257275088548364400416034343698203770889288774986, + 21888242871839275222246405745257275088548364400416034343698204107329643870578, + 21888242871839275222246405745257275088548364400416034343698204118842024613873, + 21888242871839275222246405745257275088548364400416034343698203653503789206885, + 21888242871839275222246405745257275088548364400416034343698204174906717213871, + 234673880454666, + 21888242871839275222246405745257275088548364400416034343698203787123874818561, + 361283946341672, + 178597530589338, + 21888242871839275222246405745257275088548364400416034343698204182905444970330, + 60930566997018, + 561949957566872, + 301479467414248, + 21888242871839275222246405745257275088548364400416034343698204026105529488230, + 305417611636371, + 526230956206572, + 21888242871839275222246405745257275088548364400416034343698203964484014533812, + 21888242871839275222246405745257275088548364400416034343698203946994284739967, + 293865635261582, + 284951771652529, + 273297728197826, + 21888242871839275222246405745257275088548364400416034343698203700020758110826, + 498858138571186, + 21888242871839275222246405745257275088548364400416034343698203939673814834074, + 21888242871839275222246405745257275088548364400416034343698204097792975819795, + 283090272658175, + 376514283433728, + 21888242871839275222246405745257275088548364400416034343698204036727016948543, + 21888242871839275222246405745257275088548364400416034343698204151459131226213, + 97477394291895, + 21888242871839275222246405745257275088548364400416034343698204026560452353054, + 398240449968026, + 21888242871839275222246405745257275088548364400416034343698203824271122995026, + 406451543971328, + 142796090888505, + 339504335630489, + 2462535681117, + 279526822292660, + 226429994123274, + 21888242871839275222246405745257275088548364400416034343698203788082081612588, + 539153298105518, + 21888242871839275222246405745257275088548364400416034343698203768477545419150, + 21888242871839275222246405745257275088548364400416034343698203946926676803551, + 21888242871839275222246405745257275088548364400416034343698203906947961195495, + 415496447129113, + 21888242871839275222246405745257275088548364400416034343698203819762764160199, + 21888242871839275222246405745257275088548364400416034343698203980455730421432, + 232252391576209, + 21888242871839275222246405745257275088548364400416034343698204103678108560001, + 21888242871839275222246405745257275088548364400416034343698203670936073511417, + 21888242871839275222246405745257275088548364400416034343698203689039345789069, + 21888242871839275222246405745257275088548364400416034343698203741933804971777, + 21888242871839275222246405745257275088548364400416034343698203670401220106704, + 21888242871839275222246405745257275088548364400416034343698204090905919458890, + 455819780470788, + 36970763948496, + 21888242871839275222246405745257275088548364400416034343698203900399673626637, + 21888242871839275222246405745257275088548364400416034343698203725788869239494, + 148499554657023, + 21888242871839275222246405745257275088548364400416034343698204043843524311832, + 111928098127755, + 431676914209807, + 21888242871839275222246405745257275088548364400416034343698204059790327212141, + 21888242871839275222246405745257275088548364400416034343698203818012601759911, + 21888242871839275222246405745257275088548364400416034343698203752922501465331, + 523647525197661, + 21888242871839275222246405745257275088548364400416034343698204051601030503240, + 21888242871839275222246405745257275088548364400416034343698203814257354668120, + 21888242871839275222246405745257275088548364400416034343698204112650254089553, + 21888242871839275222246405745257275088548364400416034343698203729696093045342, + 458983577761182, + 21888242871839275222246405745257275088548364400416034343698203805390113062736, + 21888242871839275222246405745257275088548364400416034343698203946531187698859, + 21888242871839275222246405745257275088548364400416034343698203816499522098706, + 21888242871839275222246405745257275088548364400416034343698203647102250871643, + 21888242871839275222246405745257275088548364400416034343698203812287050806613, + 21888242871839275222246405745257275088548364400416034343698203822416524290845, + 21888242871839275222246405745257275088548364400416034343698203975714710334206, + 21888242871839275222246405745257275088548364400416034343698204116754193430570, + 463749459943494, + 113134586945134, + 428679053878455, + 414479161181164, + 21888242871839275222246405745257275088548364400416034343698203662880605231733, + 370282179450511, + 21888242871839275222246405745257275088548364400416034343698204161561247956834, + 238740121812576, + 21888242871839275222246405745257275088548364400416034343698204140173794229119, + 21888242871839275222246405745257275088548364400416034343698203626608983182634, + 21888242871839275222246405745257275088548364400416034343698204121574519952421, + 21888242871839275222246405745257275088548364400416034343698204058146141443467, + 549476586938396, + 21888242871839275222246405745257275088548364400416034343698203965531507142620, + 21888242871839275222246405745257275088548364400416034343698203891673522051069, + 289593156971168, + 21888242871839275222246405745257275088548364400416034343698203930642732656661, + 539564708169059, + 407265338930882, + 21888242871839275222246405745257275088548364400416034343698203832093572195538, + 12515845399013, + 5214758308336, + 122115954397442, + 21888242871839275222246405745257275088548364400416034343698204030371606086200, + 205501869165691, + 501826690990574, + 358460754720472, + 212688743221983, + 27015459512524, + 546196047532514, + 21888242871839275222246405745257275088548364400416034343698204040847594782351, + 551821309709165, + 21888242871839275222246405745257275088548364400416034343698203644377975533871, + 5384181883678, + 162745564556195, + 21888242871839275222246405745257275088548364400416034343698204129076437928625, + 21888242871839275222246405745257275088548364400416034343698204114828106138931, + 100718985364881, + 288902709997008, + 468466913862241, + 155159009764978, + 21888242871839275222246405745257275088548364400416034343698203685884344526226, + 21888242871839275222246405745257275088548364400416034343698204115166399368559, + 21888242871839275222246405745257275088548364400416034343698203980777841941440, + 103218996289233, + 472036656461218, + 21888242871839275222246405745257275088548364400416034343698204157159516913087, + 21888242871839275222246405745257275088548364400416034343698203906260140117559, + 21888242871839275222246405745257275088548364400416034343698203753405516496677, + 21888242871839275222246405745257275088548364400416034343698203659913857122686, + 247020867687981, + 21888242871839275222246405745257275088548364400416034343698204029626920885491, + 21888242871839275222246405745257275088548364400416034343698204105294530022914, + 10637379997213, + 466715981180680, + 164447923988742, + 235843556888445, + 21888242871839275222246405745257275088548364400416034343698204065636024029296, + 21888242871839275222246405745257275088548364400416034343698204116726101406335, + 305556124786461, + 373732670717569, + 233644533554468, + 21888242871839275222246405745257275088548364400416034343698204043165697815493, + 156299001320224, + 489252629848419, + 428615577926005, + 21888242871839275222246405745257275088548364400416034343698203966300316120139, + 109585470727706, + 37023961657059, + 373488318298981, + 21888242871839275222246405745257275088548364400416034343698203938523946676723, + 21888242871839275222246405745257275088548364400416034343698204043537882244718, + 21888242871839275222246405745257275088548364400416034343698203935138470140641, + 233391468504903, + 342619881856745, + 384140195466170, + 21888242871839275222246405745257275088548364400416034343698203955397250876451, + 504632557759874, + 518192543070218, + 334847716190929, + 96171426633922, + 21888242871839275222246405745257275088548364400416034343698203912067963843309, + 21888242871839275222246405745257275088548364400416034343698203961718686964359, + 21888242871839275222246405745257275088548364400416034343698203852449909814286, + 176506577865590, + 21888242871839275222246405745257275088548364400416034343698204048825153469792, + 518651742274848, + 21888242871839275222246405745257275088548364400416034343698204000457078499917, + 224882746446167, + 159376416507694, + 21888242871839275222246405745257275088548364400416034343698203892746340019380, + 21888242871839275222246405745257275088548364400416034343698204123675252197261, + 307487624068978, + 25943483986855, + 308100286140832, + 21888242871839275222246405745257275088548364400416034343698203754824946330437, + 21888242871839275222246405745257275088548364400416034343698204154640589634516, + 46145392770470, + 543017105623727, + 543431804573470, + 322951169531169, + 21888242871839275222246405745257275088548364400416034343698203952687161771240, + 125997590915481, + 217388203238584, + 514491082055468, + 21888242871839275222246405745257275088548364400416034343698203763399349021987, + 430990156241800, + 114187961420860, + 259243345637081, + 21888242871839275222246405745257275088548364400416034343698203915404526671542, + 122964554737723, + 21888242871839275222246405745257275088548364400416034343698203774451079854676, + 402931928772736, + 21888242871839275222246405745257275088548364400416034343698203756836845714627, + 501889097308464, + 21888242871839275222246405745257275088548364400416034343698204149654793872925, + 499662978440027, + 157359177441363, + 21888242871839275222246405745257275088548364400416034343698203875038609602842, + 80957704330995, + 98601359069153, + 486593968950986, + 60237389877353, + 259985794045329, + 218024414194652, + 457584392549821, + 21888242871839275222246405745257275088548364400416034343698203870674478090915, + 53842843176321, + 238281846012044, + 21888242871839275222246405745257275088548364400416034343698203932167528035206, + 21888242871839275222246405745257275088548364400416034343698204052199366329763, + 21888242871839275222246405745257275088548364400416034343698203683116843986621, + 21888242871839275222246405745257275088548364400416034343698203781435982828977, + 21888242871839275222246405745257275088548364400416034343698203628781424539832, + 316857629495320, + 21888242871839275222246405745257275088548364400416034343698203877276195908284, + 21888242871839275222246405745257275088548364400416034343698203879086866836951, + 390877582766030, + 21888242871839275222246405745257275088548364400416034343698203909221755319113, + 21888242871839275222246405745257275088548364400416034343698203698229938410756, + 21888242871839275222246405745257275088548364400416034343698203902827267964876, + 21888242871839275222246405745257275088548364400416034343698203716269489486396, + 119367070860640, + 314584086344510, + 356787347393774, + 21888242871839275222246405745257275088548364400416034343698204074260459100100, + 21888242871839275222246405745257275088548364400416034343698203810224913002975, + 21888242871839275222246405745257275088548364400416034343698203680475442338439, + 21888242871839275222246405745257275088548364400416034343698203716310131743958, + 21888242871839275222246405745257275088548364400416034343698203820372201470055, + 21888242871839275222246405745257275088548364400416034343698204014892937543596, + 235361604862418, + 21888242871839275222246405745257275088548364400416034343698204130907021889610, + 21888242871839275222246405745257275088548364400416034343698204006268577222659, + 423896982319420, + 21888242871839275222246405745257275088548364400416034343698203898969265780336, + 98559050574973, + 21888242871839275222246405745257275088548364400416034343698203640640449647465, + 21888242871839275222246405745257275088548364400416034343698203783722667216063, + 440516419537632, + 21888242871839275222246405745257275088548364400416034343698203741194426312648, + 21888242871839275222246405745257275088548364400416034343698204066450038162321, + 448231867963441, + 360715564721725, + 191789019151470, + 266078088652696, + 21888242871839275222246405745257275088548364400416034343698204007181571128558, + 227605036238880, + 21888242871839275222246405745257275088548364400416034343698204018679725157570, + 366011470535180, + 21888242871839275222246405745257275088548364400416034343698203766886851015911, + 21888242871839275222246405745257275088548364400416034343698204128939093837644, + 21888242871839275222246405745257275088548364400416034343698203970360519729020, + 21888242871839275222246405745257275088548364400416034343698203799258415854764, + 21888242871839275222246405745257275088548364400416034343698203861556194833900, + 21888242871839275222246405745257275088548364400416034343698203624747424348812, + 524043050103187, + 276700657951824, + 43414746040447, + 504280183359620, + 21888242871839275222246405745257275088548364400416034343698204052028518992828, + 448532847932671, + 265543724176389, + 21888242871839275222246405745257275088548364400416034343698203793221629926541, + 21888242871839275222246405745257275088548364400416034343698203857746158016159, + 529034734915989, + 21888242871839275222246405745257275088548364400416034343698203906584836728698, + 21888242871839275222246405745257275088548364400416034343698203933701003813855, + 50372650285174, + 298991156501751, + 21888242871839275222246405745257275088548364400416034343698204044201208676886, + 21888242871839275222246405745257275088548364400416034343698203784663792032699, + 21888242871839275222246405745257275088548364400416034343698203862427027391853, + 21888242871839275222246405745257275088548364400416034343698204122076686560791, + 21888242871839275222246405745257275088548364400416034343698203705661108993630, + 21888242871839275222246405745257275088548364400416034343698204057563022038089, + 21888242871839275222246405745257275088548364400416034343698204033302044152372, + 121665109432354, + 393576609140487, + 420340416598325, + 21888242871839275222246405745257275088548364400416034343698203797119460908556, + 21888242871839275222246405745257275088548364400416034343698204076714904063323, + 21888242871839275222246405745257275088548364400416034343698203634642344918137, + 21888242871839275222246405745257275088548364400416034343698203949330898869119, + 21888242871839275222246405745257275088548364400416034343698203691222891449783, + 21888242871839275222246405745257275088548364400416034343698203795304574387298, + 44503761529580, + 21888242871839275222246405745257275088548364400416034343698203940898239050166, + 21888242871839275222246405745257275088548364400416034343698204003142800028099, + 21888242871839275222246405745257275088548364400416034343698203836527356861028, + 21888242871839275222246405745257275088548364400416034343698203770865535048274, + 21888242871839275222246405745257275088548364400416034343698203704467289486977, + 21888242871839275222246405745257275088548364400416034343698204161468435907077, + 21888242871839275222246405745257275088548364400416034343698204123319829240470, + 21888242871839275222246405745257275088548364400416034343698203892931208029981, + 21888242871839275222246405745257275088548364400416034343698204155524015841743, + 193772935222033, + 21888242871839275222246405745257275088548364400416034343698203686244851798444, + 21888242871839275222246405745257275088548364400416034343698204133056828757407, + 186427748574534, + 279983794062099, + 83184800758510, + 550744795718740, + 21888242871839275222246405745257275088548364400416034343698204162615696080693, + 21888242871839275222246405745257275088548364400416034343698203853744283226654, + 21888242871839275222246405745257275088548364400416034343698204001414005756815, + 483180344907591, + 463735081676106, + 21888242871839275222246405745257275088548364400416034343698204002109933816265, + 21888242871839275222246405745257275088548364400416034343698203975076740118752, + 21888242871839275222246405745257275088548364400416034343698203891666838892474, + 21888242871839275222246405745257275088548364400416034343698203880530390566000, + 370210438785287, + 102997890818332, + 411928446408537, + 474535014418688, + 309259131452084, + 68853399052993, + 296750917442153, + 21888242871839275222246405745257275088548364400416034343698203913607914397409, + 21888242871839275222246405745257275088548364400416034343698203848996363506233, + 452515852515706, + 21888242871839275222246405745257275088548364400416034343698204075143207059842, + 21888242871839275222246405745257275088548364400416034343698203875086701024436, + 21888242871839275222246405745257275088548364400416034343698204000793210132334, + 406308047356067, + 14461272991601, + 21888242871839275222246405745257275088548364400416034343698203695813132698881, + 293937826329714, + 437801478576052, + 21888242871839275222246405745257275088548364400416034343698203864816901008875, + 21888242871839275222246405745257275088548364400416034343698203795750264000953, + 21888242871839275222246405745257275088548364400416034343698203886193960395699, + 21888242871839275222246405745257275088548364400416034343698203679709648266111, + 482049510733318, + 21888242871839275222246405745257275088548364400416034343698203751846250697475, + 21888242871839275222246405745257275088548364400416034343698203737158267394483, + 352723845486713, + 536195311863301, + 81371033395940, + 543207651303154, + 216002192652661, + 323541606776479, + 8238003554523, + 185415759890602, + 21888242871839275222246405745257275088548364400416034343698203648075860480571, + 6358262820475, + 143900151131898, + 21888242871839275222246405745257275088548364400416034343698204008744002177999, + 21888242871839275222246405745257275088548364400416034343698203736224870821494, + 131576921753385, + 359393132284659, + 21888242871839275222246405745257275088548364400416034343698204009768694191388, + 21888242871839275222246405745257275088548364400416034343698203965878408204679, + 21888242871839275222246405745257275088548364400416034343698203658725096158947, + 512843249809277, + 433160330459972, + 20620238884144, + 21888242871839275222246405745257275088548364400416034343698203793215284688519, + 21888242871839275222246405745257275088548364400416034343698204167430321441015, + 21888242871839275222246405745257275088548364400416034343698203639092443181522, + 319548228393821, + 21888242871839275222246405745257275088548364400416034343698203633703548664742, + 458767729372877, + 21888242871839275222246405745257275088548364400416034343698204098202810871802, + 215176209222362, + 33533404966729, + 510996808361344, + 21888242871839275222246405745257275088548364400416034343698204013508738662449, + 274254253108261, + 21888242871839275222246405745257275088548364400416034343698203875544589138466, + 261610283272074, + 50169198163264, + 232899094186053, + 21888242871839275222246405745257275088548364400416034343698203663741869644523, + 21888242871839275222246405745257275088548364400416034343698203806728945299150, + 103958880488313, + 21888242871839275222246405745257275088548364400416034343698203750105183406118, + 418307371903772, + 21888242871839275222246405745257275088548364400416034343698204000011891094069, + 79060487786036, + 21888242871839275222246405745257275088548364400416034343698203860107123196638, + 465615008821396, + 561222491536370, + 21888242871839275222246405745257275088548364400416034343698204113900304198261, + 537740290068946, + 21888242871839275222246405745257275088548364400416034343698204062334727571259, + 429252559051350, + 21888242871839275222246405745257275088548364400416034343698203727450026545699, + 274012441516320, + 21888242871839275222246405745257275088548364400416034343698204026079290446076, + 21888242871839275222246405745257275088548364400416034343698204125080183914079, + 329383237221092, + 190923040633144, + 21888242871839275222246405745257275088548364400416034343698203762641171992193, + 434420032910828, + 24025888375962, + 21888242871839275222246405745257275088548364400416034343698203724799890465944, + 379188054548078, + 86334591531998, + 21888242871839275222246405745257275088548364400416034343698204097242388781004, + 385608298904399, + 21888242871839275222246405745257275088548364400416034343698204022325381040504, + 21888242871839275222246405745257275088548364400416034343698203786233282855517, + 21888242871839275222246405745257275088548364400416034343698203830936923029397, + 329879814739268, + 21888242871839275222246405745257275088548364400416034343698203910367834991821, + 21888242871839275222246405745257275088548364400416034343698203796851027208657, + 277269247168576, + 21888242871839275222246405745257275088548364400416034343698204136820680723056, + 21888242871839275222246405745257275088548364400416034343698203933030435198254, + 21888242871839275222246405745257275088548364400416034343698203628810504088168, + 21888242871839275222246405745257275088548364400416034343698203782714302102026, + 440837420385582, + 21888242871839275222246405745257275088548364400416034343698204153633373451878, + 528661367011600, + 353196212066074, + 445315861743963, + 472493233861323, + 21888242871839275222246405745257275088548364400416034343698203690967585446439, + 21888242871839275222246405745257275088548364400416034343698203683759056573449, + 21888242871839275222246405745257275088548364400416034343698204163406078623349, + 21888242871839275222246405745257275088548364400416034343698203881758709544172, + 21888242871839275222246405745257275088548364400416034343698203700316810887947, + 21888242871839275222246405745257275088548364400416034343698203629676176778710, + 544603512340398, + 21888242871839275222246405745257275088548364400416034343698203747733739758396, + 21888242871839275222246405745257275088548364400416034343698204151106226146239, + 47409073380042, + 561711759029557, + 69512664589670, + 203725444575510, + 21888242871839275222246405745257275088548364400416034343698203781599884646349, + 21888242871839275222246405745257275088548364400416034343698203981680033995104, + 21888242871839275222246405745257275088548364400416034343698203949181857124600, + 339651042184614, + 331219606621736, + 21888242871839275222246405745257275088548364400416034343698203881146634757907, + 21888242871839275222246405745257275088548364400416034343698203777745440383021, + 21888242871839275222246405745257275088548364400416034343698204104503848328799, + 372045723876204, + 74594828816706, + 450770162986109, + 264467122229305, + 276185710765657, + 195017817237429, + 21888242871839275222246405745257275088548364400416034343698204135460884164848, + 21888242871839275222246405745257275088548364400416034343698203836407479220674, + 21888242871839275222246405745257275088548364400416034343698204159774653619543, + 482099499294597, + 52795875352640, + 21888242871839275222246405745257275088548364400416034343698203660695013046607, + 335055635457834, + 413403014890768, + 232921006646024, + 21888242871839275222246405745257275088548364400416034343698204021599344635482, + 313850099902418, + 263716470918042, + 185184484297518, + 21888242871839275222246405745257275088548364400416034343698204168871638378945, + 21888242871839275222246405745257275088548364400416034343698203659962937077179, + 230897233841670, + 21888242871839275222246405745257275088548364400416034343698203768550473769034, + 21888242871839275222246405745257275088548364400416034343698203820875962080577, + 21888242871839275222246405745257275088548364400416034343698203849415387186269, + 540619265567380, + 518984307074813, + 21888242871839275222246405745257275088548364400416034343698204147412365353233, + 107669134390697, + 21888242871839275222246405745257275088548364400416034343698203901661402522795, + 21888242871839275222246405745257275088548364400416034343698204000210926399920, + 37002163377949, + 21888242871839275222246405745257275088548364400416034343698203924516927326470, + 523466245885420, + 360519441992953, + 93472412893837, + 309668390622148, + 34951803224924, + 21888242871839275222246405745257275088548364400416034343698203915913745629885, + 21888242871839275222246405745257275088548364400416034343698203839999998871798, + 41207002682239, + 21888242871839275222246405745257275088548364400416034343698204123460466310126, + 405725422438894, + 21888242871839275222246405745257275088548364400416034343698203741973733380530, + 86728559578202, + 124219971781966, + 21888242871839275222246405745257275088548364400416034343698204118898942421546, + 21888242871839275222246405745257275088548364400416034343698203967358230023314, + 21888242871839275222246405745257275088548364400416034343698204147214373590265, + 21888242871839275222246405745257275088548364400416034343698204142826085757430, + 100360245260817, + 21888242871839275222246405745257275088548364400416034343698204144153346271325, + 21888242871839275222246405745257275088548364400416034343698204094850448707220, + 203854600198632, + 357208337749174, + 21888242871839275222246405745257275088548364400416034343698203775423644771177, + 238742307452818, + 21888242871839275222246405745257275088548364400416034343698203649812386352587, + 199057290528328, + 315163156336834, + 88875161468389, + 93650839319671, + 144722707685963, + 324738316642342, + 21888242871839275222246405745257275088548364400416034343698204022670575003037, + 145615756781288, + 21888242871839275222246405745257275088548364400416034343698203992033425738838, + 21888242871839275222246405745257275088548364400416034343698203955789148799884, + 272999027104542, + 52191508944569, + 228602282548014, + 457661687219707, + 233127312748732, + 535417665848940, + 26180986698153, + 21888242871839275222246405745257275088548364400416034343698203624148605898391, + 21888242871839275222246405745257275088548364400416034343698204087469536304981, + 21888242871839275222246405745257275088548364400416034343698203976455782197108, + 548638635239059, + 68374151435617, + 21888242871839275222246405745257275088548364400416034343698204026839276791065, + 21888242871839275222246405745257275088548364400416034343698203626267317354126, + 248443094010999, + 21888242871839275222246405745257275088548364400416034343698203628457533880672, + 21888242871839275222246405745257275088548364400416034343698203868326374601105, + 360128694764330, + 153809391227821, + 270960689104683, + 57678666299043, + 21888242871839275222246405745257275088548364400416034343698203803479717254569, + 417930280791941, + 21888242871839275222246405745257275088548364400416034343698203947206002030780, + 93530957873399, + 21888242871839275222246405745257275088548364400416034343698203664192027776626, + 21888242871839275222246405745257275088548364400416034343698203662266912339245, + 21888242871839275222246405745257275088548364400416034343698204167075259658529, + 519336365410454, + 36484030725984, + 21888242871839275222246405745257275088548364400416034343698203795370135114756, + 188363378277358, + 21888242871839275222246405745257275088548364400416034343698203951423792647230, + 21888242871839275222246405745257275088548364400416034343698203915030833287899, + 233023667974266, + 21888242871839275222246405745257275088548364400416034343698204164807783254965, + 323853857867921, + 21888242871839275222246405745257275088548364400416034343698203747494459152377, + 21888242871839275222246405745257275088548364400416034343698203934173750901736, + 541282568763094, + 21888242871839275222246405745257275088548364400416034343698204097629787219330, + 21888242871839275222246405745257275088548364400416034343698204103411646140902, + 21888242871839275222246405745257275088548364400416034343698203724470470927694, + 492577589502440, + 21888242871839275222246405745257275088548364400416034343698203964213058787324, + 21888242871839275222246405745257275088548364400416034343698204050096989983441, + 121952030804295, + 283152693016868, + 184364700612649, + 21888242871839275222246405745257275088548364400416034343698203880471510148330, + 394972363919569, + 21888242871839275222246405745257275088548364400416034343698203831101215986546, + 137087872650278, + 486364463026253, + 21888242871839275222246405745257275088548364400416034343698203760718931214609, + 538759294053355, + 393825986031283, + 21888242871839275222246405745257275088548364400416034343698204017538719962094, + 21888242871839275222246405745257275088548364400416034343698204025999805861376, + 7713842566616, + 167472497133276, + 21888242871839275222246405745257275088548364400416034343698204062527841896721, + 21888242871839275222246405745257275088548364400416034343698203774953992828192, + 202518071828313, + 260430699838655, + 470031412896912, + 21888242871839275222246405745257275088548364400416034343698204027953372992102, + 21888242871839275222246405745257275088548364400416034343698203733733310974853, + 21888242871839275222246405745257275088548364400416034343698204166597338458324, + 21888242871839275222246405745257275088548364400416034343698204096537393923028, + 21888242871839275222246405745257275088548364400416034343698203909752365957202, + 21888242871839275222246405745257275088548364400416034343698204180285229652148, + 473594009550370, + 249610639520717, + 14666413768338, + 436944513178457, + 498485057064464, + 1559434122967, + 21888242871839275222246405745257275088548364400416034343698204175455054830127, + 21888242871839275222246405745257275088548364400416034343698203844389218653957, + 21888242871839275222246405745257275088548364400416034343698203718668466380847, + 9652632101812, + 21888242871839275222246405745257275088548364400416034343698204016599496283390, + 21888242871839275222246405745257275088548364400416034343698203882801402721451, + 21888242871839275222246405745257275088548364400416034343698203828765080110833, + 436757769283039, + 391159188510777, + 21888242871839275222246405745257275088548364400416034343698204037174921013374, + 21888242871839275222246405745257275088548364400416034343698204114824855555924, + 21888242871839275222246405745257275088548364400416034343698203933311744150623, + 361514478037083, + 387225861287574, + 399528124306502, + 402828816643424, + 21888242871839275222246405745257275088548364400416034343698204119586748607729, + 21888242871839275222246405745257275088548364400416034343698203634450323196232, + 22104852113156, + 21888242871839275222246405745257275088548364400416034343698204176098068204827, + 302340001989246, + 368281962915203, + 21888242871839275222246405745257275088548364400416034343698203808993288380793, + 402085241682306, + 21888242871839275222246405745257275088548364400416034343698203859570180491781, + 21888242871839275222246405745257275088548364400416034343698203888789500845072, + 522915839150104, + 497419224796658, + 475101430020082, + 508864639698776, + 53674659247904, + 21888242871839275222246405745257275088548364400416034343698204105432633958594, + 21888242871839275222246405745257275088548364400416034343698204145946267338365, + 21888242871839275222246405745257275088548364400416034343698203699890717867833, + 21888242871839275222246405745257275088548364400416034343698203636926425712390, + 305008265184006, + 21888242871839275222246405745257275088548364400416034343698203984241652535265, + 21888242871839275222246405745257275088548364400416034343698203663756568876998, + 84094789369768, + 21888242871839275222246405745257275088548364400416034343698203883053838152779, + 355068738705164, + 21888242871839275222246405745257275088548364400416034343698203705365057053351, + 290435241247783, + 166103100263641, + 21888242871839275222246405745257275088548364400416034343698203941591436247304, + 180333303275965, + 21888242871839275222246405745257275088548364400416034343698204072587948958045, + 21888242871839275222246405745257275088548364400416034343698204000644540702655, + 21888242871839275222246405745257275088548364400416034343698203912429884907072, + 21888242871839275222246405745257275088548364400416034343698203952573777158612, + 21888242871839275222246405745257275088548364400416034343698203856744192747046, + 422846104433309, + 116963427682780, + 21888242871839275222246405745257275088548364400416034343698203640661458246634, + 21888242871839275222246405745257275088548364400416034343698203931012684558109, + 486401246475940, + 509987014413623, + 227560012233566, + 55704149745059, + 35130577606109, + 21888242871839275222246405745257275088548364400416034343698203785088515529906, + 158072618596344, + 514756457252257, + 21888242871839275222246405745257275088548364400416034343698203923223044725613, + 21888242871839275222246405745257275088548364400416034343698203974945952716283, + 53547190048453, + 397332506315236, + 536767300308519, + 21888242871839275222246405745257275088548364400416034343698203909093779912634, + 281221359435396, + 227086741552598, + 500042061589004, + 529287648134025, + 370425919832104, + 21888242871839275222246405745257275088548364400416034343698204125796632591886, + 491071160934391, + 21888242871839275222246405745257275088548364400416034343698203819194459651669, + 21888242871839275222246405745257275088548364400416034343698203910496184155682, + 21888242871839275222246405745257275088548364400416034343698203965563448593509, + 21888242871839275222246405745257275088548364400416034343698203896657359809169, + 21888242871839275222246405745257275088548364400416034343698203735515763664023, + 318549711890742, + 509828191023434, + 21888242871839275222246405745257275088548364400416034343698203806936807698161, + 21888242871839275222246405745257275088548364400416034343698204104364203041332, + 555813761010492, + 21888242871839275222246405745257275088548364400416034343698203684935542605395, + 484432821987827, + 349502203280312, + 21888242871839275222246405745257275088548364400416034343698203976407259152974, + 301954771867680, + 21888242871839275222246405745257275088548364400416034343698204064728295331088, + 21888242871839275222246405745257275088548364400416034343698203889798769168298, + 358622242261428, + 154913626636959, + 21888242871839275222246405745257275088548364400416034343698204157096263396244, + 21888242871839275222246405745257275088548364400416034343698203900183135088107, + 124571859482342, + 21888242871839275222246405745257275088548364400416034343698203965542636697531, + 533870079460641, + 2242923302406, + 21888242871839275222246405745257275088548364400416034343698204099794468818801, + 21888242871839275222246405745257275088548364400416034343698203784788588459594, + 242682789665933, + 392813443781011, + 417123782505477, + 61006529589402, + 29502411368114, + 21888242871839275222246405745257275088548364400416034343698203902035778949385, + 21888242871839275222246405745257275088548364400416034343698203919959170621121, + 205420852514532, + 21888242871839275222246405745257275088548364400416034343698203712601782165358, + 325849776910268, + 279495989899587, + 21888242871839275222246405745257275088548364400416034343698203638234922422538, + 231350837199770, + 21888242871839275222246405745257275088548364400416034343698203722993013369507, + 317003337101793, + 547531102094870, + 14846492433953, + 21888242871839275222246405745257275088548364400416034343698203631430215657787, + 479103507974415, + 485685418145935, + 50391706644110, + 212788216302862, + 21888242871839275222246405745257275088548364400416034343698203836231673482664, + 21888242871839275222246405745257275088548364400416034343698203935369942537682, + 21888242871839275222246405745257275088548364400416034343698203629568685162684, + 514722143624411, + 21888242871839275222246405745257275088548364400416034343698203750748171291523, + 238313480208532, + 87774840732716, + 21888242871839275222246405745257275088548364400416034343698204164089731813660, + 21888242871839275222246405745257275088548364400416034343698203677498731984714, + 21888242871839275222246405745257275088548364400416034343698203924602387818942, + 181913047431806, + 537902806242209, + 146813622099793, + 21888242871839275222246405745257275088548364400416034343698203986063488351284, + 21888242871839275222246405745257275088548364400416034343698204049173585735758, + 202221924418886, + 21888242871839275222246405745257275088548364400416034343698204043577427885539, + 21888242871839275222246405745257275088548364400416034343698203847230084948449, + 21888242871839275222246405745257275088548364400416034343698204098083442268989, + 21888242871839275222246405745257275088548364400416034343698204064919632219622, + 21888242871839275222246405745257275088548364400416034343698203715609755569841, + 21888242871839275222246405745257275088548364400416034343698203684108247598841, + 21888242871839275222246405745257275088548364400416034343698203742385535754831, + 438957158429326, + 21888242871839275222246405745257275088548364400416034343698203781682829387941, + 324936760424899, + 90042730497671, + 96795464879132, + 298075167414529, + 21888242871839275222246405745257275088548364400416034343698204157902060525541, + 65284581414389, + 21888242871839275222246405745257275088548364400416034343698203689973322451973, + 21888242871839275222246405745257275088548364400416034343698203716847253353154, + 305862982369680, + 318499784810861, + 21888242871839275222246405745257275088548364400416034343698204025550557964014, + 20335880960786, + 21888242871839275222246405745257275088548364400416034343698203964512111421464, + 315136013601463, + 21888242871839275222246405745257275088548364400416034343698203770227770796121, + 21888242871839275222246405745257275088548364400416034343698204078995938188462, + 326116686751546, + 209863106647571, + 259365964303068, + 110084309556077, + 121469329938285, + 21888242871839275222246405745257275088548364400416034343698203927691360338716, + 477209015675456, + 21888242871839275222246405745257275088548364400416034343698204030566996179586, + 21888242871839275222246405745257275088548364400416034343698204018897890478557, + 34095257687648, + 21888242871839275222246405745257275088548364400416034343698203808227933573139, + 348004842967875, + 21888242871839275222246405745257275088548364400416034343698204009240486109654, + 185864190274687, + 21888242871839275222246405745257275088548364400416034343698204105470819942706, + 21888242871839275222246405745257275088548364400416034343698203637615577404567, + 436289220475366, + 21888242871839275222246405745257275088548364400416034343698203702290183602923, + 21888242871839275222246405745257275088548364400416034343698203745101219385426, + 209995078351192, + 21888242871839275222246405745257275088548364400416034343698204178199424060409, + 551286650596459, + 26018425546115, + 21888242871839275222246405745257275088548364400416034343698203678191577279609, + 21888242871839275222246405745257275088548364400416034343698203693713916901000, + 129604830701732, + 244912396814533, + 55928292076287, + 21888242871839275222246405745257275088548364400416034343698203924058907871503, + 21888242871839275222246405745257275088548364400416034343698204081282138956863, + 10705286297540, + 495542388586051, + 21888242871839275222246405745257275088548364400416034343698204153414363512966, + 479306640254748, + 21888242871839275222246405745257275088548364400416034343698203946738178116791, + 558340186353271, + 283888104973288, + 21888242871839275222246405745257275088548364400416034343698204047723194083293, + 342762761656979, + 48057240708387, + 176182379543524, + 21888242871839275222246405745257275088548364400416034343698203963248617630924, + 21888242871839275222246405745257275088548364400416034343698203853698032910719, + 21888242871839275222246405745257275088548364400416034343698204039616446020680, + 195262592860770, + 94333468436913, + 511316427996966, + 147653339704014, + 467102196396269, + 21888242871839275222246405745257275088548364400416034343698204083886946707980, + 21888242871839275222246405745257275088548364400416034343698203935103102684334, + 21888242871839275222246405745257275088548364400416034343698203760185403136638, + 21888242871839275222246405745257275088548364400416034343698203656199937439832, + 361803625633542, + 197383589941673, + 501459916736564, + 21888242871839275222246405745257275088548364400416034343698204018381183258820, + 240527840983553, + 211037118977211, + 21888242871839275222246405745257275088548364400416034343698204039556963945760, + 21888242871839275222246405745257275088548364400416034343698204168862810234564, + 170918525218855, + 21888242871839275222246405745257275088548364400416034343698204114296090952890, + 344707879362005, + 342403324574098, + 21888242871839275222246405745257275088548364400416034343698204128327996161208, + 21888242871839275222246405745257275088548364400416034343698203770284009279058, + 11312533955370, + 195416355037276, + 21888242871839275222246405745257275088548364400416034343698203898580785484862, + 21888242871839275222246405745257275088548364400416034343698203879629687737400, + 21888242871839275222246405745257275088548364400416034343698204143930496206469, + 21888242871839275222246405745257275088548364400416034343698203973818821085357, + 21888242871839275222246405745257275088548364400416034343698203652071019580525, + 403899755529150, + 307937415066604, + 21888242871839275222246405745257275088548364400416034343698204130086702594353, + 201759421132442, + 21888242871839275222246405745257275088548364400416034343698204179558523334512, + 21888242871839275222246405745257275088548364400416034343698204083194672340536, + 330412820248043, + 56175023683160, + 21888242871839275222246405745257275088548364400416034343698203868707020259273, + 344476243577863, + 21888242871839275222246405745257275088548364400416034343698203688498703232715, + 512919876238111, + 21888242871839275222246405745257275088548364400416034343698204076407848569964, + 511533435400707, + 21888242871839275222246405745257275088548364400416034343698203825877312081083, + 21888242871839275222246405745257275088548364400416034343698204050508644392526, + 21888242871839275222246405745257275088548364400416034343698204023248679135686, + 21888242871839275222246405745257275088548364400416034343698203735401244486984, + 195497772603680, + 511350336053412, + 21888242871839275222246405745257275088548364400416034343698203685665559170847, + 229442070700726, + 366227855041932, + 194468213986927, + 57348652963410, + 525168964114275, + 353188157586390, + 180654821446263, + 21888242871839275222246405745257275088548364400416034343698204146071679581398, + 471969387166773, + 21888242871839275222246405745257275088548364400416034343698203937153978817618, + 21888242871839275222246405745257275088548364400416034343698204027337625514832, + 21888242871839275222246405745257275088548364400416034343698203969661334852620, + 541922312334074, + 407263427922618, + 21888242871839275222246405745257275088548364400416034343698203678105183780898, + 339133992854985, + 326526068494597, + 21888242871839275222246405745257275088548364400416034343698203746415288512848, + 21888242871839275222246405745257275088548364400416034343698203752385339845495, + 217132795033298, + 348190550945072, + 199471424194641, + 560049641198489, + 56036155848060, + 249302983586973, + 21888242871839275222246405745257275088548364400416034343698203888366129224492, + 21888242871839275222246405745257275088548364400416034343698203894621139064395, + 21888242871839275222246405745257275088548364400416034343698204168710834927827, + 63356375809605, + 392007785470170, + 21888242871839275222246405745257275088548364400416034343698203764395606875903, + 336713369547516, + 21888242871839275222246405745257275088548364400416034343698203655195946215387, + 21888242871839275222246405745257275088548364400416034343698203780190824778008, + 21888242871839275222246405745257275088548364400416034343698204094615423897919, + 435184124782049, + 502186336086128, + 278994743172004, + 21888242871839275222246405745257275088548364400416034343698203889894769369333, + 21888242871839275222246405745257275088548364400416034343698204137436152849400, + 339170215516028, + 25626884431675, + 220966927314923, + 409473567474293, + 21888242871839275222246405745257275088548364400416034343698204098233245398572, + 21888242871839275222246405745257275088548364400416034343698203833181705536100, + 21888242871839275222246405745257275088548364400416034343698204001792151395491, + 178977602087151, + 537506684301112, + 21888242871839275222246405745257275088548364400416034343698203933186051808368, + 161027050238820, + 433235973966862, + 21888242871839275222246405745257275088548364400416034343698204005548078737995, + 494747551246785, + 99304386270182, + 519928521214302, + 21888242871839275222246405745257275088548364400416034343698203899126979158124, + 465657958366789, + 382274205584142, + 21888242871839275222246405745257275088548364400416034343698203757115241063833, + 21888242871839275222246405745257275088548364400416034343698203790047767063463, + 527505658838510, + 21888242871839275222246405745257275088548364400416034343698203728593447866121, + 295009661281803, + 21888242871839275222246405745257275088548364400416034343698203677775546584813, + 503159083296640, + 519138776322751, + 116289481018058, + 21888242871839275222246405745257275088548364400416034343698203943847458889657, + 21888242871839275222246405745257275088548364400416034343698204031443011482620, + 180885506000818, + 21888242871839275222246405745257275088548364400416034343698204057600044278355, + 224558121342280, + 291216341292884, + 21888242871839275222246405745257275088548364400416034343698203634334801872262, + 21888242871839275222246405745257275088548364400416034343698203819816836566055, + 385665608149799, + 145051674246550, + 21888242871839275222246405745257275088548364400416034343698203895258408870478, + 283689102301295, + 21888242871839275222246405745257275088548364400416034343698203811749701493001, + 21888242871839275222246405745257275088548364400416034343698203658394528165357, + 21888242871839275222246405745257275088548364400416034343698203802109820125060, + 21888242871839275222246405745257275088548364400416034343698203924615480019869, + 21888242871839275222246405745257275088548364400416034343698203926828706433741, + 21888242871839275222246405745257275088548364400416034343698203675995233136865, + 21888242871839275222246405745257275088548364400416034343698203851182921867114, + 21888242871839275222246405745257275088548364400416034343698204124426863668589, + 21888242871839275222246405745257275088548364400416034343698204148321006521857, + 21888242871839275222246405745257275088548364400416034343698203801081664847610, + 338325676137082, + 259377033065005, + 80819060977647, + 21888242871839275222246405745257275088548364400416034343698203869354895182023, + 21888242871839275222246405745257275088548364400416034343698203919081843823477, + 21888242871839275222246405745257275088548364400416034343698204116035382282302, + 21888242871839275222246405745257275088548364400416034343698203678630280568537, + 320054161872113, + 21888242871839275222246405745257275088548364400416034343698203858710172397808, + 18569864348656, + 21888242871839275222246405745257275088548364400416034343698204011311274650706, + 399034505832875, + 21888242871839275222246405745257275088548364400416034343698204135345860042022, + 473067899356277, + 21888242871839275222246405745257275088548364400416034343698203940419531111330, + 21888242871839275222246405745257275088548364400416034343698203684251241946270, + 21888242871839275222246405745257275088548364400416034343698204072145101421836, + 21888242871839275222246405745257275088548364400416034343698203964827608196758, + 21888242871839275222246405745257275088548364400416034343698204050308752589695, + 69265257453352, + 177692090403798, + 80782809466957, + 21888242871839275222246405745257275088548364400416034343698204119396540949322, + 21888242871839275222246405745257275088548364400416034343698203701615977786186, + 21888242871839275222246405745257275088548364400416034343698203779575045803688, + 21888242871839275222246405745257275088548364400416034343698204017891119849538, + 21888242871839275222246405745257275088548364400416034343698203841384213621692, + 21888242871839275222246405745257275088548364400416034343698204142536683214260, + 21888242871839275222246405745257275088548364400416034343698203825006387174919, + 21888242871839275222246405745257275088548364400416034343698203642886508356040, + 21888242871839275222246405745257275088548364400416034343698203804098617373498, + 21888242871839275222246405745257275088548364400416034343698204160852390725259, + 21888242871839275222246405745257275088548364400416034343698203851963264752663, + 462397090395990, + 399277124740181, + 517657770430553, + 21888242871839275222246405745257275088548364400416034343698203951282806579288, + 21888242871839275222246405745257275088548364400416034343698203646028113009785, + 506405780774404, + 494995600014810, + 382133392848879, + 470389505904693, + 232227918327138, + 21888242871839275222246405745257275088548364400416034343698203809737029939945, + 21888242871839275222246405745257275088548364400416034343698203734966335324726, + 106767302141442, + 21888242871839275222246405745257275088548364400416034343698203717037073683917, + 418210078553759, + 114781636736763, + 21888242871839275222246405745257275088548364400416034343698203906364750356710, + 21888242871839275222246405745257275088548364400416034343698203870241940562364, + 21888242871839275222246405745257275088548364400416034343698203828152561786802, + 21888242871839275222246405745257275088548364400416034343698204021157437753375, + 21888242871839275222246405745257275088548364400416034343698203857400636884433, + 343264568701806, + 109835866330490, + 21888242871839275222246405745257275088548364400416034343698204056305572564827, + 21888242871839275222246405745257275088548364400416034343698203936064028134804, + 48521571976848, + 21888242871839275222246405745257275088548364400416034343698204171880301143879, + 78585905478761, + 21888242871839275222246405745257275088548364400416034343698204060457624770453, + 557276309507256, + 140058069436195, + 301401894391695, + 21888242871839275222246405745257275088548364400416034343698203635576497900053, + 21888242871839275222246405745257275088548364400416034343698203943020116504689, + 21888242871839275222246405745257275088548364400416034343698203702857724362572, + 454932003781333, + 21888242871839275222246405745257275088548364400416034343698204038004167795549, + 21888242871839275222246405745257275088548364400416034343698203625179735939929, + 419348640281967, + 21888242871839275222246405745257275088548364400416034343698204049244610618056, + 21888242871839275222246405745257275088548364400416034343698203997875762991762, + 283994982588180, + 21888242871839275222246405745257275088548364400416034343698203643356273270119, + 215840030531155, + 21888242871839275222246405745257275088548364400416034343698204005393813733772, + 21888242871839275222246405745257275088548364400416034343698204072926324795690, + 345349247574740, + 21888242871839275222246405745257275088548364400416034343698203671412873137443, + 525430037096647, + 21888242871839275222246405745257275088548364400416034343698204124366475494157, + 21888242871839275222246405745257275088548364400416034343698204038612416863076, + 302147404912718, + 272097228957334, + 92751073929976, + 122847174261627, + 502394050951704, + 551087108130153, + 229925189773965, + 21888242871839275222246405745257275088548364400416034343698204062387818620955, + 462552400784970, + 21888242871839275222246405745257275088548364400416034343698203932842775565329, + 21888242871839275222246405745257275088548364400416034343698203868250451109006, + 343614619059285, + 493106060295156, + 21888242871839275222246405745257275088548364400416034343698204054485683346308, + 21888242871839275222246405745257275088548364400416034343698203832217430839202, + 140164972062470, + 484885106248115, + 21888242871839275222246405745257275088548364400416034343698204030577531960466, + 21888242871839275222246405745257275088548364400416034343698204035179877405051, + 488450295977851, + 465065265457370, + 21888242871839275222246405745257275088548364400416034343698203973713224101862, + 250697423494150, + 97247839841200, + 179438020717676, + 21888242871839275222246405745257275088548364400416034343698203930708546070438, + 21888242871839275222246405745257275088548364400416034343698204004903628820932, + 394433888331906, + 21888242871839275222246405745257275088548364400416034343698203907305455365551, + 21888242871839275222246405745257275088548364400416034343698204163673170771547, + 21888242871839275222246405745257275088548364400416034343698203656890399421244, + 21888242871839275222246405745257275088548364400416034343698203664487282864938, + 21888242871839275222246405745257275088548364400416034343698203741691684955817, + 371002725056398, + 99233540335932, + 442972913290422, + 301060516048498, + 361115599506102, + 21888242871839275222246405745257275088548364400416034343698203743293866966701, + 8997240985436, + 294418100706051, + 21888242871839275222246405745257275088548364400416034343698203935287871838438, + 561068298149529, + 185540143709970, + 21888242871839275222246405745257275088548364400416034343698203992557564478023, + 290923454688751, + 362225153950840, + 556076370836402, + 77030974315721, + 21888242871839275222246405745257275088548364400416034343698203720731804671768, + 481202630889915, + 219738482800662, + 21888242871839275222246405745257275088548364400416034343698204094247997561426, + 42019388116889, + 266019823494784, + 21888242871839275222246405745257275088548364400416034343698203968720134311522, + 21888242871839275222246405745257275088548364400416034343698203946362871731349, + 21888242871839275222246405745257275088548364400416034343698203919293522740544, + 30625525265057, + 21888242871839275222246405745257275088548364400416034343698203676780278433138, + 467710128163853, + 430250806777358, + 409975125672831, + 48886177228444, + 21888242871839275222246405745257275088548364400416034343698203836897748225677, + 21888242871839275222246405745257275088548364400416034343698203971618612213639, + 93104634229803, + 398380573241024, + 21888242871839275222246405745257275088548364400416034343698204161933698906769, + 19126751611497, + 383972885044798, + 539526938369858, + 450656103341815, + 521587401958877, + 21888242871839275222246405745257275088548364400416034343698204117268308781447, + 300327497687862, + 21888242871839275222246405745257275088548364400416034343698203847098146433020, + 449236646120968, + 56239765812688, + 135560374011303, + 21888242871839275222246405745257275088548364400416034343698204019093601851594, + 21888242871839275222246405745257275088548364400416034343698203742311407563639, + 243106444232312, + 200707340646792, + 21888242871839275222246405745257275088548364400416034343698203864641144968017, + 21888242871839275222246405745257275088548364400416034343698203626596521147196, + 21888242871839275222246405745257275088548364400416034343698203783832645525296, + 21888242871839275222246405745257275088548364400416034343698203931464326649746, + 57452229773836, + 21888242871839275222246405745257275088548364400416034343698203822953774313928, + 21888242871839275222246405745257275088548364400416034343698203801741198628568, + 316728158698601, + 21888242871839275222246405745257275088548364400416034343698203716644684003687, + 493354947491964, + 21888242871839275222246405745257275088548364400416034343698203734241869830860, + 21888242871839275222246405745257275088548364400416034343698203769185785869065, + 510526095599819, + 431713324847685, + 21888242871839275222246405745257275088548364400416034343698203715718766883713, + 550851297957440, + 21888242871839275222246405745257275088548364400416034343698204000136838328710, + 3463182364106, + 21888242871839275222246405745257275088548364400416034343698203947447635337671, + 25484548381475, + 389319961572353, + 432527450516792, + 146475405882988, + 21888242871839275222246405745257275088548364400416034343698204062782014252653, + 21888242871839275222246405745257275088548364400416034343698204008524899361431, + 510101630023833, + 21888242871839275222246405745257275088548364400416034343698203818732125867183, + 21888242871839275222246405745257275088548364400416034343698203969457364868852, + 21888242871839275222246405745257275088548364400416034343698204056945271679956, + 21888242871839275222246405745257275088548364400416034343698203902928333759982, + 58496068079775, + 236987178088438, + 163595854645490, + 385359156390132, + 4183870519046, + 21888242871839275222246405745257275088548364400416034343698203834125766942679, + 21888242871839275222246405745257275088548364400416034343698203653235919848387, + 21888242871839275222246405745257275088548364400416034343698204073301925454034, + 21888242871839275222246405745257275088548364400416034343698204162830986994593, + 197018257223403, + 21888242871839275222246405745257275088548364400416034343698203963573737507009, + 21888242871839275222246405745257275088548364400416034343698203709235936363076, + 320464484558136, + 21888242871839275222246405745257275088548364400416034343698203648009605568865, + 21888242871839275222246405745257275088548364400416034343698204017149968990570, + 231118721569939, + 109165942358449, + 21888242871839275222246405745257275088548364400416034343698203896970233268759, + 64974204244811, + 21888242871839275222246405745257275088548364400416034343698203746277775301035, + 21888242871839275222246405745257275088548364400416034343698203730648323552982, + 21888242871839275222246405745257275088548364400416034343698203828376747049710, + 295847197528573, + 21888242871839275222246405745257275088548364400416034343698203697886500288587, + 407321270722679, + 531900186527027, + 21888242871839275222246405745257275088548364400416034343698203994837478545512, + 21888242871839275222246405745257275088548364400416034343698204075179912858372, + 456040857195530, + 21888242871839275222246405745257275088548364400416034343698203722402594625181, + 21888242871839275222246405745257275088548364400416034343698204010124494135329, + 253760846899474, + 289899516429423, + 21888242871839275222246405745257275088548364400416034343698203880892993301265, + 21888242871839275222246405745257275088548364400416034343698203997519347796530, + 21888242871839275222246405745257275088548364400416034343698203660141315224152, + 21888242871839275222246405745257275088548364400416034343698203921732275734475, + 198841463444047, + 169540075160858, + 59734758274868, + 21888242871839275222246405745257275088548364400416034343698203738664559308749, + 21888242871839275222246405745257275088548364400416034343698204029536966577583, + 448405891204741, + 21888242871839275222246405745257275088548364400416034343698203866856775514899, + 362071388352450, + 21888242871839275222246405745257275088548364400416034343698203645383851390650, + 428834192468183, + 54424830920174, + 420789217023120, + 328936461913623, + 21888242871839275222246405745257275088548364400416034343698203711600939771827, + 181832165620253, + 191070333593114, + 21888242871839275222246405745257275088548364400416034343698203982198480501976, + 21888242871839275222246405745257275088548364400416034343698203717956994643310, + 21888242871839275222246405745257275088548364400416034343698204066766229425239, + 302271250665223, + 356003224325324, + 21888242871839275222246405745257275088548364400416034343698203958057347651269, + 21888242871839275222246405745257275088548364400416034343698204152984963827785, + 21888242871839275222246405745257275088548364400416034343698204005126294520580, + 21888242871839275222246405745257275088548364400416034343698204174302470411125, + 21888242871839275222246405745257275088548364400416034343698203647735470484078, + 394045764632142, + 21888242871839275222246405745257275088548364400416034343698203741350527717293, + 21888242871839275222246405745257275088548364400416034343698203925001846872253, + 21888242871839275222246405745257275088548364400416034343698203682309103183971, + 118511226552678, + 169520870072675, + 464999682122875, + 21888242871839275222246405745257275088548364400416034343698203726518289006120, + 432478243101118, + 21888242871839275222246405745257275088548364400416034343698204180222365802083, + 50258895121817, + 470486059591008, + 285336552066376, + 37889122677832, + 528055115060965, + 21888242871839275222246405745257275088548364400416034343698203722879240332260, + 102198735514082, + 429613876291819, + 97073677105255, + 21888242871839275222246405745257275088548364400416034343698204016903361601924, + 21888242871839275222246405745257275088548364400416034343698203878306876500313, + 21888242871839275222246405745257275088548364400416034343698203950199220016993, + 21888242871839275222246405745257275088548364400416034343698203801504671091459, + 21888242871839275222246405745257275088548364400416034343698203637270656842832, + 449297062816832, + 21888242871839275222246405745257275088548364400416034343698203723530499414625, + 21888242871839275222246405745257275088548364400416034343698203986502437263884, + 21888242871839275222246405745257275088548364400416034343698203799869075825311, + 21888242871839275222246405745257275088548364400416034343698203642807269318850, + 398976391799963, + 177568246703364, + 21888242871839275222246405745257275088548364400416034343698203939265049800533, + 21888242871839275222246405745257275088548364400416034343698203649363197539215, + 21888242871839275222246405745257275088548364400416034343698204150101695045047, + 121388153691570, + 21888242871839275222246405745257275088548364400416034343698203658876236506368, + 411965970449069, + 194684530505174, + 527443781969406, + 21888242871839275222246405745257275088548364400416034343698203869171354724575, + 371114809720366, + 251149602426367, + 21888242871839275222246405745257275088548364400416034343698204136191194002725, + 93220222408638, + 21888242871839275222246405745257275088548364400416034343698203625830339278028, + 326148100078036, + 295343069704340, + 407205754351534, + 519291346844145, + 102464003732289, + 246436944392427, + 241303318927088, + 21888242871839275222246405745257275088548364400416034343698203748579130524550, + 21888242871839275222246405745257275088548364400416034343698203798295098170570, + 189223229917605, + 402326880882439, + 21888242871839275222246405745257275088548364400416034343698204087607451682817, + 21888242871839275222246405745257275088548364400416034343698204155083347405717, + 21888242871839275222246405745257275088548364400416034343698203933665893772662, + 168749373531572, + 21888242871839275222246405745257275088548364400416034343698203927498541372784, + 96957111126445, + 148172072424702, + 62733441974415, + 440119895573136, + 21888242871839275222246405745257275088548364400416034343698203888845376539242, + 21888242871839275222246405745257275088548364400416034343698203890291305629556, + 21888242871839275222246405745257275088548364400416034343698204119848497793459, + 21888242871839275222246405745257275088548364400416034343698203855286574851790, + 361495311603073, + 229992651667089, + 421385726479401, + 21888242871839275222246405745257275088548364400416034343698203936015670460433, + 21888242871839275222246405745257275088548364400416034343698203787131673328999, + 21888242871839275222246405745257275088548364400416034343698203962522923549743, + 21888242871839275222246405745257275088548364400416034343698203955164414010960, + 21888242871839275222246405745257275088548364400416034343698204000476201111323, + 21888242871839275222246405745257275088548364400416034343698204138562845619227, + 21888242871839275222246405745257275088548364400416034343698203825675970401016, + 466915498709319, + 114087148066913, + 291443402082816, + 146710075969233, + 103858624074530, + 208765986372873, + 21888242871839275222246405745257275088548364400416034343698204153596723867242, + 153662155348195, + 425843642511835, + 21888242871839275222246405745257275088548364400416034343698203842297179688211, + 146382976745707, + 437957640842264, + 207673175140742, + 21888242871839275222246405745257275088548364400416034343698203638497066171706, + 41380163696212, + 21888242871839275222246405745257275088548364400416034343698203846201977849684, + 21888242871839275222246405745257275088548364400416034343698203839414652128149, + 21888242871839275222246405745257275088548364400416034343698204034155824241735, + 114601347359209, + 21888242871839275222246405745257275088548364400416034343698204111940538715239, + 185999647876363, + 254211691411556, + 253988405327372, + 21888242871839275222246405745257275088548364400416034343698204057497115300732, + 21888242871839275222246405745257275088548364400416034343698203760982941017401, + 65404480575062, + 21888242871839275222246405745257275088548364400416034343698204181071738163896, + 21888242871839275222246405745257275088548364400416034343698203859882522991534, + 432097950045472, + 247480260529595, + 489766567101502, + 512782920457535, + 164040308593658, + 21888242871839275222246405745257275088548364400416034343698203804113227515360, + 21888242871839275222246405745257275088548364400416034343698203708407559587225, + 112704488408810, + 278100775627298, + 207695072282968, + 507455600737464, + 186007362535195, + 21888242871839275222246405745257275088548364400416034343698203721525687472181, + 21888242871839275222246405745257275088548364400416034343698203781482162836601, + 21888242871839275222246405745257275088548364400416034343698203937951588526953, + 21888242871839275222246405745257275088548364400416034343698203822368527876889, + 21888242871839275222246405745257275088548364400416034343698204002156836646537, + 446202629598197, + 136539790169668, + 21888242871839275222246405745257275088548364400416034343698203682133211343754, + 136965612115308, + 21888242871839275222246405745257275088548364400416034343698203644270218911920, + 21888242871839275222246405745257275088548364400416034343698203934970029459445, + 21888242871839275222246405745257275088548364400416034343698204171598220875033, + 21888242871839275222246405745257275088548364400416034343698203783193696097974, + 274511252640913, + 21888242871839275222246405745257275088548364400416034343698203798095693049900, + 21888242871839275222246405745257275088548364400416034343698204098794815074865, + 21888242871839275222246405745257275088548364400416034343698204161168713121141, + 21888242871839275222246405745257275088548364400416034343698203647527691756731, + 21888242871839275222246405745257275088548364400416034343698203806069003163136, + 208825377863188, + 21888242871839275222246405745257275088548364400416034343698204092276028456982, + 545733826015896, + 21888242871839275222246405745257275088548364400416034343698204127701369881551, + 341886714938313, + 21888242871839275222246405745257275088548364400416034343698204103718387094177, + 21888242871839275222246405745257275088548364400416034343698203736980494773964, + 376132232526619, + 21888242871839275222246405745257275088548364400416034343698203729811726044920, + 21888242871839275222246405745257275088548364400416034343698203710177097389943, + 108649007918694, + 481728641508906, + 21888242871839275222246405745257275088548364400416034343698204151479398879597, + 548820420503573, + 228012098793191, + 21888242871839275222246405745257275088548364400416034343698203626151140249809, + 419350121006562, + 21888242871839275222246405745257275088548364400416034343698203706091236347302, + 21888242871839275222246405745257275088548364400416034343698203917108118274798, + 21888242871839275222246405745257275088548364400416034343698203894886040876352, + 21888242871839275222246405745257275088548364400416034343698203993912010433072, + 135791890929645, + 419718735951117, + 372161863501064, + 21888242871839275222246405745257275088548364400416034343698203714559967543504, + 182973120278367, + 21888242871839275222246405745257275088548364400416034343698204157262265382922, + 21888242871839275222246405745257275088548364400416034343698203647564612706146, + 238976963855068, + 21888242871839275222246405745257275088548364400416034343698203799304921242959, + 467000233758341, + 21888242871839275222246405745257275088548364400416034343698203729846307094271, + 21888242871839275222246405745257275088548364400416034343698203779298293296263, + 213971040809973, + 21888242871839275222246405745257275088548364400416034343698204144414598350320, + 168934823013787, + 21888242871839275222246405745257275088548364400416034343698203689196440667201, + 19873528202938, + 21888242871839275222246405745257275088548364400416034343698204019289832775080, + 337765498283556, + 21888242871839275222246405745257275088548364400416034343698204031334208756291, + 21888242871839275222246405745257275088548364400416034343698204006604623369367, + 21888242871839275222246405745257275088548364400416034343698203943986155607149, + 125696788361820, + 21888242871839275222246405745257275088548364400416034343698204018855616952320, + 131709287918843, + 73005019761275, + 288702422500229, + 13296146856469, + 507119190876833, + 166762549580247, + 21888242871839275222246405745257275088548364400416034343698203862423328948160, + 14195035542193, + 161388545396042, + 140622956751038, + 21888242871839275222246405745257275088548364400416034343698203788649524465038, + 21888242871839275222246405745257275088548364400416034343698203836590029357979, + 21888242871839275222246405745257275088548364400416034343698203812263734376902, + 166694197733955, + 21888242871839275222246405745257275088548364400416034343698203919952841010822, + 140592214835460, + 178709635752063, + 425663309044740, + 21888242871839275222246405745257275088548364400416034343698203715758336246645, + 21888242871839275222246405745257275088548364400416034343698204109198241432906, + 21888242871839275222246405745257275088548364400416034343698204073406650768362, + 250766805051995, + 458573049801298, + 248965073344388, + 21888242871839275222246405745257275088548364400416034343698203964575042615404, + 102805560125178, + 30940989290127, + 63500249594261, + 38663993572158, + 494635748138919, + 212280089880296, + 21888242871839275222246405745257275088548364400416034343698203816041038943436, + 378467367252688, + 21888242871839275222246405745257275088548364400416034343698203836350696510475, + 21888242871839275222246405745257275088548364400416034343698204093350558029946, + 21888242871839275222246405745257275088548364400416034343698203851292170743482, + 21888242871839275222246405745257275088548364400416034343698203879440957407056, + 21888242871839275222246405745257275088548364400416034343698203634335548671137, + 21888242871839275222246405745257275088548364400416034343698204159395733755172, + 21888242871839275222246405745257275088548364400416034343698203694458642795546, + 21888242871839275222246405745257275088548364400416034343698203779825194891909, + 324035212105590, + 21888242871839275222246405745257275088548364400416034343698203691093164442489, + 21888242871839275222246405745257275088548364400416034343698203722033220263664, + 21888242871839275222246405745257275088548364400416034343698204161613636407988, + 296290789006052, + 538647937615101, + 163783661030913, + 433367466267698, + 131799010803796, + 73910070770090, + 278601691817691, + 21888242871839275222246405745257275088548364400416034343698203884156199424969, + 21888242871839275222246405745257275088548364400416034343698203925509776977174, + 21888242871839275222246405745257275088548364400416034343698204072906262214839, + 21888242871839275222246405745257275088548364400416034343698204063238824043160, + 21888242871839275222246405745257275088548364400416034343698203893519148875393, + 38986007150997, + 88500920785534, + 21888242871839275222246405745257275088548364400416034343698203803867749588859, + 559060558208560, + 269662957398089, + 21888242871839275222246405745257275088548364400416034343698204149353250343985, + 199352239468193, + 21888242871839275222246405745257275088548364400416034343698203838980995399652, + 442510658731789, + 387845730003682, + 307986531609884, + 21888242871839275222246405745257275088548364400416034343698204170196789258163, + 21888242871839275222246405745257275088548364400416034343698203861261748749443, + 531759122485953, + 21888242871839275222246405745257275088548364400416034343698204015911773742268, + 21888242871839275222246405745257275088548364400416034343698204101234127809453, + 394189131056137, + 520422567935208, + 21888242871839275222246405745257275088548364400416034343698204078463005579555, + 538490376756789, + 206611707697484, + 105782703077015, + 232237473589331, + 112568176009156, + 449718581066138, + 58558314247396, + 386116864596394, + 432563114941923, + 21888242871839275222246405745257275088548364400416034343698203710867653899895, + 413101433655496, + 498141432085204, + 212953750289862, + 21888242871839275222246405745257275088548364400416034343698203855607315982046, + 373822316408169, + 327752651339164, + 214161856025597, + 36156610423483, + 479450707673736, + 299338980434565, + 21888242871839275222246405745257275088548364400416034343698203684177486119144, + 21888242871839275222246405745257275088548364400416034343698204154338318654784, + 21888242871839275222246405745257275088548364400416034343698204101401453247185, + 21888242871839275222246405745257275088548364400416034343698204164335285035091, + 21888242871839275222246405745257275088548364400416034343698203996280939777171, + 21888242871839275222246405745257275088548364400416034343698204111220101611781, + 21888242871839275222246405745257275088548364400416034343698203962356601518962, + 119222025439665, + 21888242871839275222246405745257275088548364400416034343698204040653454070847, + 456520700217271, + 21888242871839275222246405745257275088548364400416034343698204065703795265504, + 21888242871839275222246405745257275088548364400416034343698203856505716798694, + 559984901764092, + 281890286102058, + 21888242871839275222246405745257275088548364400416034343698204136566266097304, + 21888242871839275222246405745257275088548364400416034343698203676211950419284, + 21888242871839275222246405745257275088548364400416034343698203912264256295206, + 315458642681747, + 21888242871839275222246405745257275088548364400416034343698203624616566874160, + 21888242871839275222246405745257275088548364400416034343698203701392291346869, + 21888242871839275222246405745257275088548364400416034343698204045376687943020, + 21888242871839275222246405745257275088548364400416034343698203650433078106324, + 21888242871839275222246405745257275088548364400416034343698203719379449085833, + 21888242871839275222246405745257275088548364400416034343698203791789092461995, + 386225189253156, + 247620182626767, + 21888242871839275222246405745257275088548364400416034343698204074750171781861, + 61814022726717, + 21888242871839275222246405745257275088548364400416034343698203729041072477504, + 93533001360291, + 204326026369672, + 16395637517522, + 21888242871839275222246405745257275088548364400416034343698203699979090598744, + 21888242871839275222246405745257275088548364400416034343698203792270822172129, + 69557133642674, + 21888242871839275222246405745257275088548364400416034343698203739738607552309, + 21888242871839275222246405745257275088548364400416034343698204093433952634536, + 21888242871839275222246405745257275088548364400416034343698203664020168378599, + 21888242871839275222246405745257275088548364400416034343698203719022350603452, + 491292569727527, + 453082133364722, + 21888242871839275222246405745257275088548364400416034343698204128795000585397, + 380076372680655, + 21888242871839275222246405745257275088548364400416034343698203919110460220708, + 231535904337122, + 21888242871839275222246405745257275088548364400416034343698203720757865570811, + 21888242871839275222246405745257275088548364400416034343698204037672440319740, + 21888242871839275222246405745257275088548364400416034343698204033291078028701, + 21888242871839275222246405745257275088548364400416034343698203794931580128145, + 21888242871839275222246405745257275088548364400416034343698203895293626681511, + 114950553610940, + 21888242871839275222246405745257275088548364400416034343698203769522148258414, + 472731554332337, + 21888242871839275222246405745257275088548364400416034343698203882050071309710, + 34917394104536, + 259651395755835, + 343475671808019, + 21888242871839275222246405745257275088548364400416034343698204184831436051008, + 307845868076491, + 21888242871839275222246405745257275088548364400416034343698203850370988515103, + 21888242871839275222246405745257275088548364400416034343698204074403266693119, + 21888242871839275222246405745257275088548364400416034343698203922711140528536, + 21888242871839275222246405745257275088548364400416034343698204175579754375929, + 21888242871839275222246405745257275088548364400416034343698204031902197294454, + 53531801742369, + 21888242871839275222246405745257275088548364400416034343698203671155959279164, + 21888242871839275222246405745257275088548364400416034343698203640895855773605, + 108920529300704, + 21888242871839275222246405745257275088548364400416034343698203824728172759365, + 138944340341610, + 336582808413033, + 21888242871839275222246405745257275088548364400416034343698203840562744675746, + 3427502244581, + 21888242871839275222246405745257275088548364400416034343698203711939901463964, + 227416836138501, + 21888242871839275222246405745257275088548364400416034343698203699332792232047, + 70909037944882, + 245487732820022, + 21888242871839275222246405745257275088548364400416034343698204167971424958869, + 21888242871839275222246405745257275088548364400416034343698203972225813340336, + 21888242871839275222246405745257275088548364400416034343698203856905795633545, + 462688393395539, + 21888242871839275222246405745257275088548364400416034343698203979910848116794, + 21888242871839275222246405745257275088548364400416034343698203723539961552538, + 21888242871839275222246405745257275088548364400416034343698204099388696755252, + 21888242871839275222246405745257275088548364400416034343698204099343451402384, + 21888242871839275222246405745257275088548364400416034343698203818578264532870, + 523117785291034, + 22329348300800, + 492663919162560, + 231400518400888, + 21888242871839275222246405745257275088548364400416034343698203790813512595448, + 459597593821064, + 426953565271462, + 21888242871839275222246405745257275088548364400416034343698204128910840099087, + 374846204299453, + 21888242871839275222246405745257275088548364400416034343698204093973519887255, + 329819731958037, + 21888242871839275222246405745257275088548364400416034343698203885485532324253, + 432555337420727, + 404156709950481, + 319656575553369, + 21888242871839275222246405745257275088548364400416034343698204031064398133245, + 21888242871839275222246405745257275088548364400416034343698204096564999805471, + 21888242871839275222246405745257275088548364400416034343698204153397119554403, + 79680628939444, + 157933374427742, + 21888242871839275222246405745257275088548364400416034343698204019118849033731, + 21888242871839275222246405745257275088548364400416034343698204054760849655529, + 21888242871839275222246405745257275088548364400416034343698204123416526266173, + 539192152020595, + 147415932330597, + 21888242871839275222246405745257275088548364400416034343698203679791038039275, + 384468130074132, + 197970604121294, + 21888242871839275222246405745257275088548364400416034343698203688870757547214, + 21888242871839275222246405745257275088548364400416034343698203765145985218656, + 21888242871839275222246405745257275088548364400416034343698204030325860667626, + 21888242871839275222246405745257275088548364400416034343698203984604151617834, + 21888242871839275222246405745257275088548364400416034343698203683445906839325, + 479414013875655, + 21888242871839275222246405745257275088548364400416034343698203752098880472954, + 21888242871839275222246405745257275088548364400416034343698203973128297246227, + 21888242871839275222246405745257275088548364400416034343698204093518320954763, + 360050066328049, + 424825621079019, + 21888242871839275222246405745257275088548364400416034343698204100416947143321, + 451154521358845, + 21888242871839275222246405745257275088548364400416034343698203826206965535601, + 21888242871839275222246405745257275088548364400416034343698203645909441153674, + 21888242871839275222246405745257275088548364400416034343698203778294939521515, + 21888242871839275222246405745257275088548364400416034343698204039318462608160, + 21888242871839275222246405745257275088548364400416034343698203997170275609478, + 123331478071322, + 65650100115140, + 21888242871839275222246405745257275088548364400416034343698204126114127935568, + 21888242871839275222246405745257275088548364400416034343698203733833447762562, + 21888242871839275222246405745257275088548364400416034343698203863794594330148, + 21888242871839275222246405745257275088548364400416034343698204125806512078824, + 239951150236152, + 21888242871839275222246405745257275088548364400416034343698203808809695968218, + 21888242871839275222246405745257275088548364400416034343698203826834357055279, + 219936375285209, + 21888242871839275222246405745257275088548364400416034343698204050617717297217, + 296516605093997, + 21888242871839275222246405745257275088548364400416034343698204043059785166130, + 21888242871839275222246405745257275088548364400416034343698204151018296807268, + 426624489150365, + 487388576613254, + 21888242871839275222246405745257275088548364400416034343698203960118146688347, + 126694995860759, + 21888242871839275222246405745257275088548364400416034343698203747988197531991, + 90303382024973, + 21888242871839275222246405745257275088548364400416034343698204124415523323426, + 445033527237253, + 21888242871839275222246405745257275088548364400416034343698203972487223002601, + 496532122228069, + 21888242871839275222246405745257275088548364400416034343698203728575060104413, + 21888242871839275222246405745257275088548364400416034343698203950846270492073, + 303597836354509, + 516873750124505, + 499595807585487, + 502945924720096, + 298608502857709, + 260340391858599, + 21888242871839275222246405745257275088548364400416034343698204079558971564887, + 21888242871839275222246405745257275088548364400416034343698203820524437349234, + 208464970784845, + 21888242871839275222246405745257275088548364400416034343698204041199772531285, + 386305159544775, + 21888242871839275222246405745257275088548364400416034343698203862078966025416, + 284617774716059, + 536424334912275, + 21888242871839275222246405745257275088548364400416034343698203893700946417585, + 230851759261629, + 21888242871839275222246405745257275088548364400416034343698203929216021293206, + 21888242871839275222246405745257275088548364400416034343698203978707981733719, + 145481766326051, + 21888242871839275222246405745257275088548364400416034343698204139722694166643, + 200715884942486, + 440199524977863, + 13209654771880, + 21888242871839275222246405745257275088548364400416034343698204031697340034441, + 21888242871839275222246405745257275088548364400416034343698204093389650390725, + 21888242871839275222246405745257275088548364400416034343698203753779483456032, + 21888242871839275222246405745257275088548364400416034343698204066574906059329, + 21888242871839275222246405745257275088548364400416034343698203831580297784277, + 386489455606265, + 21888242871839275222246405745257275088548364400416034343698203715707689033376, + 21888242871839275222246405745257275088548364400416034343698204176993227342677, + 21888242871839275222246405745257275088548364400416034343698204037394228658266, + 21888242871839275222246405745257275088548364400416034343698203672751475088700, + 21888242871839275222246405745257275088548364400416034343698203827073640549796, + 21888242871839275222246405745257275088548364400416034343698204042483490435652, + 528658987852094, + 444101165902483, + 21888242871839275222246405745257275088548364400416034343698203687978429160507, + 21888242871839275222246405745257275088548364400416034343698203691937367153858, + 220891664180958, + 112053912442558, + 279520439913860, + 21888242871839275222246405745257275088548364400416034343698203893170318652480, + 391504624775343, + 21888242871839275222246405745257275088548364400416034343698203858432500448548, + 21888242871839275222246405745257275088548364400416034343698203793992406971107, + 386577752230843, + 21888242871839275222246405745257275088548364400416034343698203921746067156039, + 79198308413785, + 139312913903370, + 21888242871839275222246405745257275088548364400416034343698203797894977516131, + 21888242871839275222246405745257275088548364400416034343698203807461813415595, + 21888242871839275222246405745257275088548364400416034343698204111062056920367, + 21888242871839275222246405745257275088548364400416034343698203925700149623015, + 475457111810553, + 36781967259189, + 21888242871839275222246405745257275088548364400416034343698203671146626158364, + 21888242871839275222246405745257275088548364400416034343698203892129902311313, + 21888242871839275222246405745257275088548364400416034343698203775360982403542, + 21888242871839275222246405745257275088548364400416034343698203840667291480919, + 21888242871839275222246405745257275088548364400416034343698203808034190711869, + 95115608089174, + 531255624133013, + 21888242871839275222246405745257275088548364400416034343698203850600729486864, + 21888242871839275222246405745257275088548364400416034343698203925805094929208, + 209032630929685, + 21888242871839275222246405745257275088548364400416034343698203910930376810089, + 376989216132466, + 21888242871839275222246405745257275088548364400416034343698203876553927855974, + 21888242871839275222246405745257275088548364400416034343698203900730398149006, + 34910716833081, + 21888242871839275222246405745257275088548364400416034343698203684118743886683, + 212990105219157, + 21888242871839275222246405745257275088548364400416034343698203939440407524769, + 232380648124914, + 21888242871839275222246405745257275088548364400416034343698203810793203246546, + 21888242871839275222246405745257275088548364400416034343698204171719549095498, + 21888242871839275222246405745257275088548364400416034343698203683466785475871, + 21888242871839275222246405745257275088548364400416034343698203887056304875749, + 21888242871839275222246405745257275088548364400416034343698203959419459509974, + 350110039899137, + 205220245630855, + 21888242871839275222246405745257275088548364400416034343698204148121601672986, + 21888242871839275222246405745257275088548364400416034343698204108226211527821, + 355018041990010, + 21888242871839275222246405745257275088548364400416034343698203723256155675114, + 301790854981120, + 2668605564048, + 21888242871839275222246405745257275088548364400416034343698204050106861269098, + 21888242871839275222246405745257275088548364400416034343698203922052934984695, + 104892061727461, + 179821678750400, + 71757779838895, + 195643319255703, + 213683113502960, + 379865114750372, + 74161449969030, + 314628747831820, + 211055336156358, + 21888242871839275222246405745257275088548364400416034343698203938467121809054, + 309285160237703, + 21888242871839275222246405745257275088548364400416034343698203695699670134332, + 21888242871839275222246405745257275088548364400416034343698204133054910388212, + 337223647550033, + 21888242871839275222246405745257275088548364400416034343698204036481624208461, + 296242330019418, + 40028780493136, + 21888242871839275222246405745257275088548364400416034343698203707763976952737, + 21888242871839275222246405745257275088548364400416034343698203731884426020376, + 524131491749742, + 21888242871839275222246405745257275088548364400416034343698203943087364421989, + 21888242871839275222246405745257275088548364400416034343698204135662884474417, + 21888242871839275222246405745257275088548364400416034343698203763011052400569, + 21888242871839275222246405745257275088548364400416034343698203631780918405360, + 359098548558991, + 21888242871839275222246405745257275088548364400416034343698203733450238932244, + 21888242871839275222246405745257275088548364400416034343698204015762702216042, + 349766401744822, + 473768025897425, + 21888242871839275222246405745257275088548364400416034343698203913754201191017, + 84988907112250, + 462515985462698, + 21888242871839275222246405745257275088548364400416034343698203733613852025362, + 21888242871839275222246405745257275088548364400416034343698204125203178425190, + 47850419540594, + 336369820226891, + 228512959786365, + 427312014846835, + 21888242871839275222246405745257275088548364400416034343698203970045822784468, + 21888242871839275222246405745257275088548364400416034343698203750332573284794, + 346008358008764, + 293041029129961, + 21888242871839275222246405745257275088548364400416034343698203850105496106600, + 21888242871839275222246405745257275088548364400416034343698203846103268145541, + 113677773642492, + 21888242871839275222246405745257275088548364400416034343698203922415460181127, + 21888242871839275222246405745257275088548364400416034343698204137627203716505, + 21888242871839275222246405745257275088548364400416034343698203836880861258022, + 21888242871839275222246405745257275088548364400416034343698203979443430984197, + 21888242871839275222246405745257275088548364400416034343698204135706912245930, + 500683630970299, + 21888242871839275222246405745257275088548364400416034343698203970903800951704, + 99527893626761, + 292463325770883, + 21888242871839275222246405745257275088548364400416034343698203757306116463866, + 433517576508647, + 21888242871839275222246405745257275088548364400416034343698203933876862684971, + 21888242871839275222246405745257275088548364400416034343698203636841128944339, + 177879486976271, + 21888242871839275222246405745257275088548364400416034343698203762665124660609, + 21888242871839275222246405745257275088548364400416034343698203998639811057174, + 21888242871839275222246405745257275088548364400416034343698203984048547651625, + 144957404107766, + 21888242871839275222246405745257275088548364400416034343698203637840354992058, + 21888242871839275222246405745257275088548364400416034343698203899482585115455, + 500703479368454, + 357233916174459, + 21888242871839275222246405745257275088548364400416034343698204030276776801193, + 296206426877451, + 21888242871839275222246405745257275088548364400416034343698203764596649186940, + 542832893190471, + 528423512772789, + 21888242871839275222246405745257275088548364400416034343698204050828525243581, + 21888242871839275222246405745257275088548364400416034343698203717830591464176, + 21888242871839275222246405745257275088548364400416034343698203937239373283751, + 21888242871839275222246405745257275088548364400416034343698203880019013081861, + 21888242871839275222246405745257275088548364400416034343698203952069072903034, + 21888242871839275222246405745257275088548364400416034343698204136667555058791, + 21888242871839275222246405745257275088548364400416034343698204167829846141811, + 358354899432598, + 361660084856676, + 360723417743893, + 21888242871839275222246405745257275088548364400416034343698203709544244044075, + 21888242871839275222246405745257275088548364400416034343698204134701697781867, + 21888242871839275222246405745257275088548364400416034343698203738772828075109, + 21888242871839275222246405745257275088548364400416034343698203667317369885697, + 21888242871839275222246405745257275088548364400416034343698203890183406884027, + 366836188889511, + 21888242871839275222246405745257275088548364400416034343698203984158370317699, + 410229089176907, + 21888242871839275222246405745257275088548364400416034343698203936261032900858, + 21888242871839275222246405745257275088548364400416034343698203739809069398745, + 21888242871839275222246405745257275088548364400416034343698203909499567205455, + 220209101731734, + 259149498754432, + 21888242871839275222246405745257275088548364400416034343698204003496852056255, + 498955802304753, + 21888242871839275222246405745257275088548364400416034343698203671511399540434, + 468635411773142, + 30680234711449, + 21888242871839275222246405745257275088548364400416034343698203817373569745464, + 23345250167335, + 133845240405390, + 443194394393040, + 242592375178555, + 21888242871839275222246405745257275088548364400416034343698203831117714024588, + 21888242871839275222246405745257275088548364400416034343698203812573231518250, + 21888242871839275222246405745257275088548364400416034343698204061958312179658, + 21888242871839275222246405745257275088548364400416034343698204140843989741975, + 21888242871839275222246405745257275088548364400416034343698203685831169510965, + 21888242871839275222246405745257275088548364400416034343698204166355640195878, + 21888242871839275222246405745257275088548364400416034343698203747352687069227, + 508861408393781, + 21888242871839275222246405745257275088548364400416034343698203659756720674815, + 21888242871839275222246405745257275088548364400416034343698203642888089371047, + 26099323191646, + 21888242871839275222246405745257275088548364400416034343698203985959684137479, + 21888242871839275222246405745257275088548364400416034343698203698030846868934, + 21888242871839275222246405745257275088548364400416034343698203824374331470329, + 342405778231535, + 21888242871839275222246405745257275088548364400416034343698203908476078714654, + 292398071873292, + 21888242871839275222246405745257275088548364400416034343698203974746751912520, + 133019718742655, + 21888242871839275222246405745257275088548364400416034343698203865008191309239, + 287666940660479, + 306195814824046, + 87348109965104, + 21888242871839275222246405745257275088548364400416034343698204108876397126691, + 94503232130471, + 244270368685234, + 476724392404134, + 228529156391125, + 21888242871839275222246405745257275088548364400416034343698204145699045393994, + 330836925887502, + 49312447933981, + 21888242871839275222246405745257275088548364400416034343698203779055197562675, + 147917729240771, + 21888242871839275222246405745257275088548364400416034343698203933586747591389, + 26913699641393, + 21888242871839275222246405745257275088548364400416034343698203791112762819350, + 21888242871839275222246405745257275088548364400416034343698204104039738205845, + 302692273620545, + 335079103612981, + 21888242871839275222246405745257275088548364400416034343698204019750562138659, + 21888242871839275222246405745257275088548364400416034343698203757300713922948, + 21888242871839275222246405745257275088548364400416034343698203649996962266168, + 21888242871839275222246405745257275088548364400416034343698203745724678385096, + 21888242871839275222246405745257275088548364400416034343698203999796701533989, + 490128274358856, + 416015044144043, + 39449960482354, + 335479548645760, + 21888242871839275222246405745257275088548364400416034343698203655680536332036, + 21888242871839275222246405745257275088548364400416034343698204113625971596197, + 21888242871839275222246405745257275088548364400416034343698203778542141339913, + 523559238259910, + 21888242871839275222246405745257275088548364400416034343698203646328831047539, + 21888242871839275222246405745257275088548364400416034343698203889800624047154, + 240102417163595, + 21888242871839275222246405745257275088548364400416034343698203748708432927626, + 477157717925058, + 21888242871839275222246405745257275088548364400416034343698203871896189760388, + 105819663671284, + 21888242871839275222246405745257275088548364400416034343698203790033678613863, + 456055788559479, + 21888242871839275222246405745257275088548364400416034343698203646663689847589, + 21888242871839275222246405745257275088548364400416034343698203860086906991213, + 155055892864415, + 21888242871839275222246405745257275088548364400416034343698203665715574344828, + 513819291137381, + 21888242871839275222246405745257275088548364400416034343698204101516695402451, + 21888242871839275222246405745257275088548364400416034343698204178015250441485, + 93800964280741, + 462511666820946, + 21888242871839275222246405745257275088548364400416034343698203702267363593312, + 21888242871839275222246405745257275088548364400416034343698203800638672932376, + 235417929533572, + 117684566875108, + 51996635374474, + 13519470267763, + 21888242871839275222246405745257275088548364400416034343698203945226799373323, + 21888242871839275222246405745257275088548364400416034343698203659998264327123, + 550129561304972, + 79113012199220, + 273538771926452, + 21888242871839275222246405745257275088548364400416034343698203794081472493745, + 21888242871839275222246405745257275088548364400416034343698204079477934501167, + 397369983155772, + 21888242871839275222246405745257275088548364400416034343698203705269358395706, + 21888242871839275222246405745257275088548364400416034343698203787531275199139, + 21888242871839275222246405745257275088548364400416034343698203985954846795098, + 21888242871839275222246405745257275088548364400416034343698204050454452265166, + 131524362935169, + 21888242871839275222246405745257275088548364400416034343698204030074553492699, + 21888242871839275222246405745257275088548364400416034343698204116837316411502, + 21888242871839275222246405745257275088548364400416034343698203681807017575840, + 21888242871839275222246405745257275088548364400416034343698204035513965675440, + 369139905440692, + 21888242871839275222246405745257275088548364400416034343698203696737374358678, + 392094848373778, + 21888242871839275222246405745257275088548364400416034343698204131868015356819, + 498790727607036, + 274045573409856, + 21888242871839275222246405745257275088548364400416034343698203672443464349822, + 14976873539594, + 146991956827048, + 21888242871839275222246405745257275088548364400416034343698203982034773844327, + 21888242871839275222246405745257275088548364400416034343698203982484938791528, + 352317944847522, + 21888242871839275222246405745257275088548364400416034343698204159272104385322, + 510157989042013, + 21888242871839275222246405745257275088548364400416034343698204004174674152873, + 21888242871839275222246405745257275088548364400416034343698203677773623347372, + 21888242871839275222246405745257275088548364400416034343698203866971356273950, + 253030439133610, + 343886743262605, + 547844687766989, + 21888242871839275222246405745257275088548364400416034343698203952212203087011, + 159260540721098, + 278020077226877, + 189490864541476, + 53728291302578, + 21888242871839275222246405745257275088548364400416034343698204084403540887055, + 21888242871839275222246405745257275088548364400416034343698203927510225650594, + 286096692486877, + 158505095402629, + 21888242871839275222246405745257275088548364400416034343698204109480457246662, + 21888242871839275222246405745257275088548364400416034343698204167887212702117, + 82387669107559, + 21888242871839275222246405745257275088548364400416034343698204161480674465117, + 21888242871839275222246405745257275088548364400416034343698204141527021563409, + 541741906275216, + 21888242871839275222246405745257275088548364400416034343698204007912055859073, + 21888242871839275222246405745257275088548364400416034343698204183206400029206, + 21888242871839275222246405745257275088548364400416034343698203861907746893237, + 21888242871839275222246405745257275088548364400416034343698203755878157714312, + 219094697500923, + 21888242871839275222246405745257275088548364400416034343698204073126234809335, + 21888242871839275222246405745257275088548364400416034343698204125312491257486, + 535596830425264, + 21888242871839275222246405745257275088548364400416034343698203825818906551500, + 347108320918605, + 121660221038447, + 21888242871839275222246405745257275088548364400416034343698203662792139554500, + 497446959629455, + 554173069426490, + 21888242871839275222246405745257275088548364400416034343698203811487520598800, + 21888242871839275222246405745257275088548364400416034343698203627727806520792, + 410754045676784, + 21888242871839275222246405745257275088548364400416034343698204063084940884094, + 21888242871839275222246405745257275088548364400416034343698203833381859364607, + 21888242871839275222246405745257275088548364400416034343698203952740260591006, + 21888242871839275222246405745257275088548364400416034343698204127423768691614, + 21888242871839275222246405745257275088548364400416034343698203857589844174646, + 21888242871839275222246405745257275088548364400416034343698203985314332678060, + 59455681732170, + 21888242871839275222246405745257275088548364400416034343698203776044009590311, + 72169994668916, + 365532174852717, + 354767832570452, + 21888242871839275222246405745257275088548364400416034343698203670352716106083, + 21888242871839275222246405745257275088548364400416034343698203884374030374918, + 383865088043542, + 21888242871839275222246405745257275088548364400416034343698203888223750354663, + 21888242871839275222246405745257275088548364400416034343698204123910068159237, + 122965712810847, + 21888242871839275222246405745257275088548364400416034343698204110213955854774, + 21888242871839275222246405745257275088548364400416034343698204063006316242610, + 21888242871839275222246405745257275088548364400416034343698203926289388280989, + 382926138469945, + 21888242871839275222246405745257275088548364400416034343698203958974542093492, + 46909570434206, + 21888242871839275222246405745257275088548364400416034343698203968039964006531, + 60770882613767, + 21888242871839275222246405745257275088548364400416034343698203671548722886390, + 513005252476358, + 389250505482464, + 21888242871839275222246405745257275088548364400416034343698203900191840430850, + 21888242871839275222246405745257275088548364400416034343698203637190052273314, + 21888242871839275222246405745257275088548364400416034343698204077647902272500, + 21888242871839275222246405745257275088548364400416034343698203898985890566887, + 488258219694108, + 21888242871839275222246405745257275088548364400416034343698203666251411692537, + 21888242871839275222246405745257275088548364400416034343698203914311778824162, + 150533382516109, + 218890038194040, + 21888242871839275222246405745257275088548364400416034343698203720699515744917, + 21888242871839275222246405745257275088548364400416034343698204173227781495238, + 21888242871839275222246405745257275088548364400416034343698203895782480908179, + 21888242871839275222246405745257275088548364400416034343698204009768517984720, + 21888242871839275222246405745257275088548364400416034343698203933885539134250, + 21888242871839275222246405745257275088548364400416034343698203984871973902378, + 303014986663453, + 21888242871839275222246405745257275088548364400416034343698203744440195146735, + 158626736476625, + 21888242871839275222246405745257275088548364400416034343698204171918833879995, + 21888242871839275222246405745257275088548364400416034343698203823028330068018, + 21888242871839275222246405745257275088548364400416034343698203837867271700111, + 320007253360926, + 318588207761318, + 184777114291191, + 89429988660369, + 21888242871839275222246405745257275088548364400416034343698203995314103163999, + 21888242871839275222246405745257275088548364400416034343698203965424369924342, + 21888242871839275222246405745257275088548364400416034343698204011062611185403, + 21888242871839275222246405745257275088548364400416034343698203712255966496097, + 513987510953688, + 179105260398215, + 431190986508221, + 402654334384661, + 21888242871839275222246405745257275088548364400416034343698204062707374539734, + 21888242871839275222246405745257275088548364400416034343698203920065231925613, + 164887927613371, + 21888242871839275222246405745257275088548364400416034343698203646791415538798, + 21888242871839275222246405745257275088548364400416034343698204057474808838604, + 129840801940738, + 21888242871839275222246405745257275088548364400416034343698203723759660433542, + 21888242871839275222246405745257275088548364400416034343698203863310724340940, + 534171060164931, + 21888242871839275222246405745257275088548364400416034343698203702032988210686, + 170615685360385, + 79755181413921, + 134859044670271, + 21888242871839275222246405745257275088548364400416034343698204080186628972379, + 479368715760808, + 21888242871839275222246405745257275088548364400416034343698204180382972630831, + 151832287735609, + 21888242871839275222246405745257275088548364400416034343698203644200759129145, + 21888242871839275222246405745257275088548364400416034343698204060782297037877, + 140651108977217, + 168484244021997, + 21888242871839275222246405745257275088548364400416034343698204099960793834891, + 21888242871839275222246405745257275088548364400416034343698204135311385070669, + 21888242871839275222246405745257275088548364400416034343698203732797004273796, + 21888242871839275222246405745257275088548364400416034343698204160782578635544, + 21888242871839275222246405745257275088548364400416034343698204124079157442611, + 21888242871839275222246405745257275088548364400416034343698203786482523221082, + 149560185506723, + 21888242871839275222246405745257275088548364400416034343698203929110634796572, + 21888242871839275222246405745257275088548364400416034343698203935057278914317, + 64428109822852, + 446220433801274, + 403131082387720, + 247091334203022, + 204837115904238, + 144544411618126, + 21888242871839275222246405745257275088548364400416034343698203660850973691766, + 277574707883641, + 21888242871839275222246405745257275088548364400416034343698203972883118445109, + 506382080206206, + 313667412350277, + 409746969108201, + 508512907320409, + 21888242871839275222246405745257275088548364400416034343698204070169104900278, + 21888242871839275222246405745257275088548364400416034343698203806209270342788, + 418759360999101, + 21888242871839275222246405745257275088548364400416034343698203960995565853249, + 21888242871839275222246405745257275088548364400416034343698204009074379494898, + 19701106853660, + 121156762442880, + 56134912503913, + 494797182211279, + 21888242871839275222246405745257275088548364400416034343698203731177393816366, + 120306082450119, + 21888242871839275222246405745257275088548364400416034343698204029096664286791, + 272227427003338, + 67108712877371, + 21888242871839275222246405745257275088548364400416034343698203708193990522238, + 21888242871839275222246405745257275088548364400416034343698203804979680785553, + 21888242871839275222246405745257275088548364400416034343698203856436613840834, + 281612395663625, + 21888242871839275222246405745257275088548364400416034343698203719177429848190, + 520936855350106, + 21888242871839275222246405745257275088548364400416034343698203846906942198075, + 159826697909461, + 21888242871839275222246405745257275088548364400416034343698204007116754339467, + 21888242871839275222246405745257275088548364400416034343698203729853513437511, + 21888242871839275222246405745257275088548364400416034343698204117892144419639, + 21888242871839275222246405745257275088548364400416034343698203848012373308676, + 21888242871839275222246405745257275088548364400416034343698204175939819612884, + 37257784454648, + 21888242871839275222246405745257275088548364400416034343698203848333743939074, + 21888242871839275222246405745257275088548364400416034343698203684598386204819, + 21888242871839275222246405745257275088548364400416034343698203669807868561712, + 553636679983581, + 266248264876848, + 1696623887615, + 460021838054639, + 551225744936023, + 21888242871839275222246405745257275088548364400416034343698203978728907978883, + 117300255630775, + 21888242871839275222246405745257275088548364400416034343698204160584922496472, + 21888242871839275222246405745257275088548364400416034343698204164590770408534, + 413849099780787, + 382671004897346, + 21888242871839275222246405745257275088548364400416034343698203885091211709160, + 256205945791060, + 467620353800445, + 21888242871839275222246405745257275088548364400416034343698203696644617778366, + 21888242871839275222246405745257275088548364400416034343698203696100288701440, + 450680520019832, + 21888242871839275222246405745257275088548364400416034343698203665464546120713, + 21888242871839275222246405745257275088548364400416034343698204170406728573456, + 21888242871839275222246405745257275088548364400416034343698203932548624672392, + 55415574980102, + 21888242871839275222246405745257275088548364400416034343698204022311760840830, + 21888242871839275222246405745257275088548364400416034343698203740135905888273, + 21888242871839275222246405745257275088548364400416034343698203842963615067797, + 21888242871839275222246405745257275088548364400416034343698203679166008322664, + 252257741877047, + 274753974010622, + 307108049065605, + 505945806082978, + 21888242871839275222246405745257275088548364400416034343698203649278913402164, + 188773831190425, + 21888242871839275222246405745257275088548364400416034343698204178425146245385, + 21888242871839275222246405745257275088548364400416034343698203956180598291518, + 21888242871839275222246405745257275088548364400416034343698204013550785257663, + 21888242871839275222246405745257275088548364400416034343698203793751508809717, + 21888242871839275222246405745257275088548364400416034343698203754791870515949, + 21888242871839275222246405745257275088548364400416034343698203680979983495459, + 7484287282560, + 21888242871839275222246405745257275088548364400416034343698204085433978081107, + 402923671900957, + 21888242871839275222246405745257275088548364400416034343698204185003695345479, + 21888242871839275222246405745257275088548364400416034343698204067388641402273, + 446526253045075, + 213127533034660, + 21888242871839275222246405745257275088548364400416034343698204116156428512564, + 287526399418249, + 21888242871839275222246405745257275088548364400416034343698204036755126383133, + 21888242871839275222246405745257275088548364400416034343698203789525889652779, + 21888242871839275222246405745257275088548364400416034343698203696320367562788, + 245116363862921, + 21888242871839275222246405745257275088548364400416034343698203976023821126655, + 21888242871839275222246405745257275088548364400416034343698203746427351519641, + 385126294218741, + 21888242871839275222246405745257275088548364400416034343698203866460187334178, + 37484755299004, + 21888242871839275222246405745257275088548364400416034343698203805722225410147, + 379319435469847, + 21888242871839275222246405745257275088548364400416034343698204125701078598550, + 21888242871839275222246405745257275088548364400416034343698204105595972219781, + 21888242871839275222246405745257275088548364400416034343698204082214903273731, + 46245822190803, + 439806479327707, + 21888242871839275222246405745257275088548364400416034343698203943413515679779, + 21888242871839275222246405745257275088548364400416034343698203760771426462846, + 21888242871839275222246405745257275088548364400416034343698203806035576242558, + 21888242871839275222246405745257275088548364400416034343698203841247965738574, + 522081352658086, + 368153395548304, + 208327811620326, + 21888242871839275222246405745257275088548364400416034343698203629587835023761, + 392578965893562, + 21888242871839275222246405745257275088548364400416034343698203968514191803036, + 543054981221548, + 120891143732807, + 539937601784836, + 298523299636488, + 228749400745949, + 21888242871839275222246405745257275088548364400416034343698203801604218835229, + 533098555071431, + 21888242871839275222246405745257275088548364400416034343698203954367991881918, + 21888242871839275222246405745257275088548364400416034343698203711591502162756, + 198845725968386, + 21888242871839275222246405745257275088548364400416034343698204052860591101635, + 21888242871839275222246405745257275088548364400416034343698204136066485316536, + 311609539318176, + 21888242871839275222246405745257275088548364400416034343698204133664589875269, + 21888242871839275222246405745257275088548364400416034343698203842810791889282, + 21888242871839275222246405745257275088548364400416034343698204023441098384887, + 21888242871839275222246405745257275088548364400416034343698203897500058873203, + 155589684985144, + 140552544818342, + 261493957219492, + 21888242871839275222246405745257275088548364400416034343698204160333496046153, + 259138498008423, + 70756903051789, + 102925276598390, + 21888242871839275222246405745257275088548364400416034343698203646506151211384, + 504738095598101, + 21888242871839275222246405745257275088548364400416034343698203632115740483684, + 205058522477590, + 448466840061906, + 21888242871839275222246405745257275088548364400416034343698203828084986676533, + 489058744126251, + 21888242871839275222246405745257275088548364400416034343698203698641607724225, + 21888242871839275222246405745257275088548364400416034343698203660545266617569, + 21888242871839275222246405745257275088548364400416034343698203888537991211973, + 105344966956442, + 330817545695487, + 245720667384761, + 480489504923090, + 354628313847716, + 21888242871839275222246405745257275088548364400416034343698203803365931549903, + 21888242871839275222246405745257275088548364400416034343698203806409392764364, + 238119678467026, + 219254108119750, + 21888242871839275222246405745257275088548364400416034343698204012856912274159, + 531986437842836, + 249694222907720, + 21888242871839275222246405745257275088548364400416034343698203854413799070588, + 21888242871839275222246405745257275088548364400416034343698203797124630384058, + 21888242871839275222246405745257275088548364400416034343698204026247831582454, + 281037802612242, + 21888242871839275222246405745257275088548364400416034343698203928388810660144, + 246971747364077, + 252078775361282, + 76692611363633, + 21888242871839275222246405745257275088548364400416034343698203629292131408041, + 522069532386425, + 85741501275367, + 514903985447045, + 21888242871839275222246405745257275088548364400416034343698203681483644708938, + 21888242871839275222246405745257275088548364400416034343698203710803304944757, + 21888242871839275222246405745257275088548364400416034343698203790134681306050, + 21888242871839275222246405745257275088548364400416034343698203896281139247143, + 21888242871839275222246405745257275088548364400416034343698204022132885347353, + 240607635787546, + 21888242871839275222246405745257275088548364400416034343698203839311412987901, + 21888242871839275222246405745257275088548364400416034343698203810430147695074, + 265279608049616, + 274991470542653, + 336139918541800, + 234638136094823, + 21888242871839275222246405745257275088548364400416034343698203968763741474725, + 21888242871839275222246405745257275088548364400416034343698203779479236838441, + 374799985590686, + 401852063228824, + 67707980251824, + 21888242871839275222246405745257275088548364400416034343698203639271630662224, + 21888242871839275222246405745257275088548364400416034343698203719556265622362, + 21888242871839275222246405745257275088548364400416034343698203942290341025534, + 418683989479557, + 21888242871839275222246405745257275088548364400416034343698203775788873897318, + 271501653517471, + 21888242871839275222246405745257275088548364400416034343698204098167375845608, + 490796020685627, + 169958209401612, + 34007758280637, + 404166189474830, + 449447882375111, + 21888242871839275222246405745257275088548364400416034343698203744663844743829, + 21888242871839275222246405745257275088548364400416034343698203776163202630226, + 21888242871839275222246405745257275088548364400416034343698203914384405678165, + 21888242871839275222246405745257275088548364400416034343698204154766668502660, + 35450430065333, + 21888242871839275222246405745257275088548364400416034343698203886000695155443, + 21888242871839275222246405745257275088548364400416034343698204015166409264518, + 21888242871839275222246405745257275088548364400416034343698203699048922769093, + 63868346169000, + 266099824396080, + 65021518916487, + 21888242871839275222246405745257275088548364400416034343698204011633114772433, + 21888242871839275222246405745257275088548364400416034343698204144965862987057, + 454000305365487, + 21888242871839275222246405745257275088548364400416034343698203626770333561507, + 448166298878582, + 131359014598282, + 326603445053939, + 35752418366533, + 55170058881572, + 9214776451856, + 471185994430014, + 133958703964683, + 21888242871839275222246405745257275088548364400416034343698204105916645754979, + 398831574900467, + 21888242871839275222246405745257275088548364400416034343698203920226359338621, + 307681172182485, + 419829170900782, + 86097586094036, + 152635966078407, + 21888242871839275222246405745257275088548364400416034343698203732656640886232, + 463559226943551, + 205230087204289, + 21888242871839275222246405745257275088548364400416034343698203727931279714045, + 21888242871839275222246405745257275088548364400416034343698204181727216761825, + 435231423964222, + 21888242871839275222246405745257275088548364400416034343698203663960626417855, + 114411351282225, + 21888242871839275222246405745257275088548364400416034343698204102200768800696, + 249402349652572, + 21888242871839275222246405745257275088548364400416034343698203970631912025600, + 71744158601681, + 502709928070973, + 212041290161618, + 410113376680758, + 21888242871839275222246405745257275088548364400416034343698203968026393656480, + 21888242871839275222246405745257275088548364400416034343698204119238228245811, + 21888242871839275222246405745257275088548364400416034343698204174482407513201, + 21888242871839275222246405745257275088548364400416034343698203854774565683393, + 21888242871839275222246405745257275088548364400416034343698203999038137285182, + 334002321769523, + 434164514385882, + 215583743726393, + 485630116828807, + 21888242871839275222246405745257275088548364400416034343698204117221290240268, + 21888242871839275222246405745257275088548364400416034343698203805779451446476, + 115581431413981, + 410420107884417, + 126934792852163, + 21888242871839275222246405745257275088548364400416034343698204095624127069190, + 253179417814123, + 21888242871839275222246405745257275088548364400416034343698203712304593482091, + 82547254465995, + 519114308759282, + 21888242871839275222246405745257275088548364400416034343698204043870528979056, + 21888242871839275222246405745257275088548364400416034343698203946213074412009, + 434501712095293, + 21888242871839275222246405745257275088548364400416034343698204154254499307617, + 21888242871839275222246405745257275088548364400416034343698204125125412844621, + 21888242871839275222246405745257275088548364400416034343698204093481552621040, + 21888242871839275222246405745257275088548364400416034343698203934317852891471, + 287407189046242, + 21888242871839275222246405745257275088548364400416034343698204095616323044429, + 21888242871839275222246405745257275088548364400416034343698204176866649906628, + 21888242871839275222246405745257275088548364400416034343698203924359123220467, + 21888242871839275222246405745257275088548364400416034343698203872694467510723, + 57741711107577, + 21888242871839275222246405745257275088548364400416034343698203828960378367988, + 444559474921411, + 21888242871839275222246405745257275088548364400416034343698203837642991641963, + 21888242871839275222246405745257275088548364400416034343698203734680218453324, + 420406815253351, + 21888242871839275222246405745257275088548364400416034343698203804199774351459, + 21888242871839275222246405745257275088548364400416034343698203791500146213941, + 21888242871839275222246405745257275088548364400416034343698203797783004319392, + 21888242871839275222246405745257275088548364400416034343698203752261775667841, + 334049775878808, + 526589247105901, + 21888242871839275222246405745257275088548364400416034343698203752966092238567, + 95863117836879, + 21888242871839275222246405745257275088548364400416034343698203850685914835790, + 21888242871839275222246405745257275088548364400416034343698203985139490804934, + 21888242871839275222246405745257275088548364400416034343698204007284509078273, + 242885811373054, + 100638862799859, + 21888242871839275222246405745257275088548364400416034343698204042716807621288, + 530006478542493, + 433550064672653, + 296548022737466, + 21888242871839275222246405745257275088548364400416034343698203645983909481012, + 21888242871839275222246405745257275088548364400416034343698203887361337484978, + 21888242871839275222246405745257275088548364400416034343698204057261937662227, + 21888242871839275222246405745257275088548364400416034343698203943989946049910, + 21888242871839275222246405745257275088548364400416034343698204115315064071258, + 21888242871839275222246405745257275088548364400416034343698203821305262529127, + 193128379801943, + 21888242871839275222246405745257275088548364400416034343698203897921044639144, + 21888242871839275222246405745257275088548364400416034343698204042084880168422, + 1350092420577, + 21888242871839275222246405745257275088548364400416034343698203871961560040518, + 21888242871839275222246405745257275088548364400416034343698203913542842158792, + 21888242871839275222246405745257275088548364400416034343698203797361015694020, + 535128821752405, + 21888242871839275222246405745257275088548364400416034343698203841899099884268, + 21888242871839275222246405745257275088548364400416034343698203714966681376875, + 135575653578443, + 325080612110002, + 21888242871839275222246405745257275088548364400416034343698203775630029747679, + 181237059974551, + 21888242871839275222246405745257275088548364400416034343698204069937661216562, + 21888242871839275222246405745257275088548364400416034343698203816185488962950, + 21888242871839275222246405745257275088548364400416034343698203696352490724211, + 194316505522689, + 462734129227207, + 395407340094, + 21888242871839275222246405745257275088548364400416034343698204051403908355976, + 376787968635254, + 21888242871839275222246405745257275088548364400416034343698204087534943264249, + 173624590026167, + 92936104495233, + 393048451167117, + 321521583190155, + 21888242871839275222246405745257275088548364400416034343698203830356193742572, + 336877552784456, + 21888242871839275222246405745257275088548364400416034343698203934064299484334, + 355298134758597, + 424193095963488, + 155568286121378, + 253091416826516, + 45786351187602, + 21888242871839275222246405745257275088548364400416034343698203733713376588911, + 21888242871839275222246405745257275088548364400416034343698203895085877465310, + 531759420909030, + 356006955754436, + 21888242871839275222246405745257275088548364400416034343698203666039993989003, + 21888242871839275222246405745257275088548364400416034343698203906219909027543, + 21888242871839275222246405745257275088548364400416034343698203982605712989599, + 21888242871839275222246405745257275088548364400416034343698204144832232788862, + 292686523570821, + 21888242871839275222246405745257275088548364400416034343698203824048971819186, + 159003415291090, + 17054319651106, + 543383460149799, + 390414740692077, + 45799293618520, + 21888242871839275222246405745257275088548364400416034343698204026287657593064, + 21888242871839275222246405745257275088548364400416034343698203761965880773770, + 73228447327196, + 21888242871839275222246405745257275088548364400416034343698203698502138102742, + 21888242871839275222246405745257275088548364400416034343698203637685754449014, + 359083811109419, + 420835125014613, + 21888242871839275222246405745257275088548364400416034343698204087246794733244, + 21888242871839275222246405745257275088548364400416034343698203854254096417528, + 21888242871839275222246405745257275088548364400416034343698203624448672912649, + 202980367752757, + 37635725774597, + 466161530683371, + 235640918032747, + 520557382746446, + 509014424073762, + 21888242871839275222246405745257275088548364400416034343698204071636658101241, + 21888242871839275222246405745257275088548364400416034343698203728740810853597, + 21888242871839275222246405745257275088548364400416034343698203689503828254089, + 171163012447274, + 464288544533020, + 21888242871839275222246405745257275088548364400416034343698203671145592876156, + 290565699013791, + 21888242871839275222246405745257275088548364400416034343698204163911565935944, + 513113384204867, + 21888242871839275222246405745257275088548364400416034343698203790154439364902, + 21888242871839275222246405745257275088548364400416034343698203957452025812182, + 19401188273344, + 3124120475208, + 359548562090392, + 131048393744612, + 21888242871839275222246405745257275088548364400416034343698203634676153321940, + 21888242871839275222246405745257275088548364400416034343698204080492661716985, + 183253382902030, + 21888242871839275222246405745257275088548364400416034343698204012233573368586, + 522619513922331, + 21888242871839275222246405745257275088548364400416034343698203764077646309256, + 21888242871839275222246405745257275088548364400416034343698203954646017020096, + 192113042647346, + 21888242871839275222246405745257275088548364400416034343698203769682780672758, + 21888242871839275222246405745257275088548364400416034343698203724624630466098, + 21888242871839275222246405745257275088548364400416034343698203803611730425733, + 21888242871839275222246405745257275088548364400416034343698204123892248478930, + 21888242871839275222246405745257275088548364400416034343698203908624393584354, + 21888242871839275222246405745257275088548364400416034343698203947343849510097, + 517021597373840, + 371674555461594, + 250354762206585, + 21888242871839275222246405745257275088548364400416034343698204045220273357368, + 218959956099224, + 430188023227577, + 325874355904783, + 432978798565176, + 155382571788125, + 410715903991927, + 546640037519085, + 21888242871839275222246405745257275088548364400416034343698204163363046947958, + 460465638134911, + 21888242871839275222246405745257275088548364400416034343698203961052510179874, + 478166652091252, + 500632974532540, + 20729236699285, + 412134375006735, + 21888242871839275222246405745257275088548364400416034343698203937321977753696, + 10344643945131, + 113366583897584, + 21888242871839275222246405745257275088548364400416034343698203732839919028169, + 21888242871839275222246405745257275088548364400416034343698204133574523418219, + 21888242871839275222246405745257275088548364400416034343698204133880077135394, + 40077614446245, + 95449997682378, + 220701529182706, + 21888242871839275222246405745257275088548364400416034343698204108391068593416, + 338099748663491, + 21888242871839275222246405745257275088548364400416034343698203892229911420608, + 21888242871839275222246405745257275088548364400416034343698204159125762792398, + 221486929404578, + 444766512580163, + 21888242871839275222246405745257275088548364400416034343698204120307292973146, + 351574190870369, + 134295588463691, + 21888242871839275222246405745257275088548364400416034343698203725394607758043, + 21888242871839275222246405745257275088548364400416034343698203705954350865104, + 21888242871839275222246405745257275088548364400416034343698203899626132004207, + 21888242871839275222246405745257275088548364400416034343698204069151092456629, + 220646837625388, + 21888242871839275222246405745257275088548364400416034343698204075415788182724, + 196838476299011, + 337860119993473, + 21888242871839275222246405745257275088548364400416034343698204184591677166240, + 21888242871839275222246405745257275088548364400416034343698203860199148831036, + 266304329195397, + 486548940753801, + 21888242871839275222246405745257275088548364400416034343698203641980136641392, + 21888242871839275222246405745257275088548364400416034343698203835862852688241, + 21888242871839275222246405745257275088548364400416034343698203736588972412760, + 378366740434074, + 21888242871839275222246405745257275088548364400416034343698203629362081549732, + 21888242871839275222246405745257275088548364400416034343698203760536641474716, + 190362726642803, + 21888242871839275222246405745257275088548364400416034343698203819880036370102, + 556936076634023, + 21888242871839275222246405745257275088548364400416034343698203871890985170251, + 9639821579053, + 317627152205445, + 437797646761306, + 21888242871839275222246405745257275088548364400416034343698203890899506923884, + 21888242871839275222246405745257275088548364400416034343698203947884917236186, + 559171071183643, + 21888242871839275222246405745257275088548364400416034343698204113768407261243, + 21888242871839275222246405745257275088548364400416034343698203652116632308724, + 129042181686238, + 200712601472921, + 21888242871839275222246405745257275088548364400416034343698203785528986912840, + 21888242871839275222246405745257275088548364400416034343698203660610456071770, + 21888242871839275222246405745257275088548364400416034343698203650114214834275, + 423219434463947, + 204470972906940, + 21888242871839275222246405745257275088548364400416034343698204107665425642358, + 21888242871839275222246405745257275088548364400416034343698203760294627201817, + 121178518324320, + 109251096466536, + 446645401916941, + 21888242871839275222246405745257275088548364400416034343698203749275652319377, + 213783327024050, + 124901723423068, + 471273285898738, + 39073854046896, + 478896256923272, + 21888242871839275222246405745257275088548364400416034343698204122574869551684, + 152421956924375, + 347495605913808, + 21888242871839275222246405745257275088548364400416034343698203866596175424844, + 479410981698748, + 21888242871839275222246405745257275088548364400416034343698203676673936426700, + 126725540610179, + 21888242871839275222246405745257275088548364400416034343698203696956935414306, + 235823163164089, + 21888242871839275222246405745257275088548364400416034343698204114445457504699, + 21888242871839275222246405745257275088548364400416034343698203713290834487592, + 164009594133219, + 21888242871839275222246405745257275088548364400416034343698203938851803459490, + 21888242871839275222246405745257275088548364400416034343698203809326143063693, + 35908694784404, + 21888242871839275222246405745257275088548364400416034343698203677181076618749, + 208400295679007, + 74338998273593, + 21888242871839275222246405745257275088548364400416034343698204058442593321678, + 21888242871839275222246405745257275088548364400416034343698203631941002863787, + 162152701369209, + 362646338120391, + 530246435028853, + 321876514153778, + 475051152044140, + 20108360096043, + 14634603735830, + 21888242871839275222246405745257275088548364400416034343698203772276637503026, + 21888242871839275222246405745257275088548364400416034343698204027238493784506, + 38461500014198, + 370324742203432, + 310021164061159, + 161017164160778, + 21888242871839275222246405745257275088548364400416034343698203698944882693312, + 461202248027923, + 21888242871839275222246405745257275088548364400416034343698203654162670432888, + 21888242871839275222246405745257275088548364400416034343698203807516666681943, + 21888242871839275222246405745257275088548364400416034343698203865683734598553, + 247627725944158, + 21888242871839275222246405745257275088548364400416034343698204062513276757587, + 21888242871839275222246405745257275088548364400416034343698203819971843031732, + 529696554658427, + 177495185155123, + 21888242871839275222246405745257275088548364400416034343698203795685456954274, + 142269019619004, + 463434396921067, + 21888242871839275222246405745257275088548364400416034343698203645660874792410, + 171409705629880, + 21888242871839275222246405745257275088548364400416034343698204074794894276679, + 21888242871839275222246405745257275088548364400416034343698203769991046773842, + 21888242871839275222246405745257275088548364400416034343698203732829502360378, + 21888242871839275222246405745257275088548364400416034343698203708373966935682, + 21888242871839275222246405745257275088548364400416034343698203793116804529662, + 2105082420445, + 21888242871839275222246405745257275088548364400416034343698203706451414210332, + 21888242871839275222246405745257275088548364400416034343698203858893300957893, + 249805417885132, + 21888242871839275222246405745257275088548364400416034343698203979905487149071, + 21888242871839275222246405745257275088548364400416034343698203660619183585052, + 58680866420917, + 21888242871839275222246405745257275088548364400416034343698204084717747749449, + 21888242871839275222246405745257275088548364400416034343698203986373484225061, + 21888242871839275222246405745257275088548364400416034343698204164289718559355, + 21888242871839275222246405745257275088548364400416034343698203826234371914045, + 21888242871839275222246405745257275088548364400416034343698203834933398645067, + 486888140243844, + 65910229565636, + 449648825051230, + 21888242871839275222246405745257275088548364400416034343698203746109091724660, + 451366226570787, + 21888242871839275222246405745257275088548364400416034343698204074968720399577, + 21888242871839275222246405745257275088548364400416034343698204173524784226231, + 557093390306627, + 21888242871839275222246405745257275088548364400416034343698203990981337471257, + 21888242871839275222246405745257275088548364400416034343698203719619536916326, + 21888242871839275222246405745257275088548364400416034343698203727643899355291, + 21888242871839275222246405745257275088548364400416034343698203826333338004053, + 122781732784411, + 371168328185686, + 21888242871839275222246405745257275088548364400416034343698203976722403003277, + 537635825356267, + 21888242871839275222246405745257275088548364400416034343698203979584127341777, + 309407840712142, + 406943460682570, + 190812754506902, + 131851664770544, + 21888242871839275222246405745257275088548364400416034343698203761511693651374, + 394883001195595, + 96043105704316, + 208641071957430, + 488189916159098, + 21888242871839275222246405745257275088548364400416034343698204049169781402801, + 468630044286202, + 560205720574365, + 39862825625514, + 21888242871839275222246405745257275088548364400416034343698203946132292319926, + 491172815399854, + 52365425446284, + 72120763936365, + 21888242871839275222246405745257275088548364400416034343698203947563880541213, + 555487560097760, + 21888242871839275222246405745257275088548364400416034343698203952094026320464, + 21888242871839275222246405745257275088548364400416034343698203675775526225292, + 21888242871839275222246405745257275088548364400416034343698204001613726502609, + 21888242871839275222246405745257275088548364400416034343698204055643138381128, + 95825448196335, + 21888242871839275222246405745257275088548364400416034343698203954255562916086, + 21888242871839275222246405745257275088548364400416034343698204125645354351584, + 21888242871839275222246405745257275088548364400416034343698204164417614454121, + 458316732162759, + 21888242871839275222246405745257275088548364400416034343698203830381693280618, + 21888242871839275222246405745257275088548364400416034343698203668167724385606, + 234880461813997, + 21888242871839275222246405745257275088548364400416034343698204131902050033305, + 244102030311833, + 379895961825891, + 21888242871839275222246405745257275088548364400416034343698203835008825070621, + 410051621213707, + 21888242871839275222246405745257275088548364400416034343698204167429154770097, + 302691611692941, + 21888242871839275222246405745257275088548364400416034343698204096629779662053, + 21888242871839275222246405745257275088548364400416034343698204064854570173481, + 539832499071025, + 178668554852738, + 21888242871839275222246405745257275088548364400416034343698204002353894529662, + 21888242871839275222246405745257275088548364400416034343698203981137732791296, + 486297654765104, + 41503548705500, + 21888242871839275222246405745257275088548364400416034343698203633191528072958, + 37467139204283, + 21888242871839275222246405745257275088548364400416034343698203860602590476925, + 447317862895370, + 21888242871839275222246405745257275088548364400416034343698203779522510740506, + 239939439785069, + 18762178334817, + 29524456565014, + 447468074729294, + 247419245833040, + 21888242871839275222246405745257275088548364400416034343698203834879057274415, + 21888242871839275222246405745257275088548364400416034343698203807328093560584, + 21888242871839275222246405745257275088548364400416034343698203891376687778009, + 108371291070146, + 284424729221228, + 21888242871839275222246405745257275088548364400416034343698203696238283514179, + 21888242871839275222246405745257275088548364400416034343698204028850192006578, + 21888242871839275222246405745257275088548364400416034343698203799494202197721, + 21888242871839275222246405745257275088548364400416034343698203639427993208478, + 21888242871839275222246405745257275088548364400416034343698204017518114846060, + 525892551198711, + 21888242871839275222246405745257275088548364400416034343698203915720540025743, + 21888242871839275222246405745257275088548364400416034343698204083163202922826, + 192010293918551, + 111872326047040, + 551570011317106, + 250402865552053, + 530773583305137, + 21888242871839275222246405745257275088548364400416034343698204177148497123052, + 21888242871839275222246405745257275088548364400416034343698203817625625523428, + 21888242871839275222246405745257275088548364400416034343698203810536659746438, + 508954864998569, + 21888242871839275222246405745257275088548364400416034343698204062806355639105, + 21888242871839275222246405745257275088548364400416034343698204061683539920067, + 76283922699651, + 139007937903682, + 251352788506378, + 463941291320834, + 21888242871839275222246405745257275088548364400416034343698203729298561058160, + 21888242871839275222246405745257275088548364400416034343698203808593872549326, + 468542970514328, + 21888242871839275222246405745257275088548364400416034343698203968650973570729, + 21888242871839275222246405745257275088548364400416034343698204126725074904418, + 21888242871839275222246405745257275088548364400416034343698203775068976616193, + 447683647535406, + 21888242871839275222246405745257275088548364400416034343698203828624120253998, + 247441180444445, + 426559424425336, + 21888242871839275222246405745257275088548364400416034343698203922572605307399, + 486359727999030, + 21888242871839275222246405745257275088548364400416034343698203703699604817548, + 21888242871839275222246405745257275088548364400416034343698203859339841093588, + 199232225756536, + 21888242871839275222246405745257275088548364400416034343698203951615054967755, + 19804340786328, + 21888242871839275222246405745257275088548364400416034343698203700466422844424, + 21888242871839275222246405745257275088548364400416034343698203755138703292632, + 21888242871839275222246405745257275088548364400416034343698203882007134580301, + 21888242871839275222246405745257275088548364400416034343698204014372740784342, + 287689420313488, + 21888242871839275222246405745257275088548364400416034343698203689917390660495, + 180727596173269, + 336929433360312, + 21888242871839275222246405745257275088548364400416034343698204024515848958434, + 21888242871839275222246405745257275088548364400416034343698203702071929789199, + 21888242871839275222246405745257275088548364400416034343698204052164455528093, + 399347203451275, + 21888242871839275222246405745257275088548364400416034343698203920972961413162, + 386700740320043, + 14493375943069, + 21888242871839275222246405745257275088548364400416034343698204013192357233399, + 22237500912429, + 164903393090778, + 110559235928681, + 442322551091562, + 254659966330394, + 21888242871839275222246405745257275088548364400416034343698204165882640036278, + 194017229333681, + 174898005516710, + 173234593808759, + 21888242871839275222246405745257275088548364400416034343698204051166675937922, + 62970535476146, + 352682740583156, + 45485578647451, + 21888242871839275222246405745257275088548364400416034343698204040368462846384, + 423732290201093, + 439478333534658, + 21888242871839275222246405745257275088548364400416034343698204050167975234306, + 395586335654909, + 21888242871839275222246405745257275088548364400416034343698204160439104336472, + 144262602338397, + 356876510229323, + 6908325294012, + 21888242871839275222246405745257275088548364400416034343698203628883833780183, + 21888242871839275222246405745257275088548364400416034343698203674759887700731, + 21888242871839275222246405745257275088548364400416034343698203940374379235458, + 52160184412014, + 176931886422612, + 248327681192036, + 21888242871839275222246405745257275088548364400416034343698203763398573057277, + 21888242871839275222246405745257275088548364400416034343698203650680862035348, + 202420672129722, + 178241306629490, + 337075973986190, + 95801258000420, + 21888242871839275222246405745257275088548364400416034343698204139694265736574, + 196682621385333, + 473355116588855, + 21888242871839275222246405745257275088548364400416034343698204058947072749867, + 21888242871839275222246405745257275088548364400416034343698203957741890264799, + 21888242871839275222246405745257275088548364400416034343698203941261940213364, + 144216844456984, + 21888242871839275222246405745257275088548364400416034343698203698467787359736, + 21888242871839275222246405745257275088548364400416034343698203891813714913245, + 21888242871839275222246405745257275088548364400416034343698203974361057371997, + 21888242871839275222246405745257275088548364400416034343698203842708452803412, + 87168344633233, + 21888242871839275222246405745257275088548364400416034343698203851084623769818, + 21888242871839275222246405745257275088548364400416034343698203760625467070119, + 21888242871839275222246405745257275088548364400416034343698203672717187388590, + 274584019802317, + 21888242871839275222246405745257275088548364400416034343698203632978487142346, + 21888242871839275222246405745257275088548364400416034343698203811446309407705, + 21888242871839275222246405745257275088548364400416034343698203663534817903305, + 21888242871839275222246405745257275088548364400416034343698204069514263603114, + 289404056533473, + 38461418805092, + 120631364757123, + 243827120526241, + 21888242871839275222246405745257275088548364400416034343698203644484675927746, + 21888242871839275222246405745257275088548364400416034343698203694540890926015, + 39623950048977, + 203375031678716, + 21888242871839275222246405745257275088548364400416034343698203991847756302513, + 21888242871839275222246405745257275088548364400416034343698203851095961305618, + 122139597296299, + 238042851892262, + 21888242871839275222246405745257275088548364400416034343698203775755441049523, + 21888242871839275222246405745257275088548364400416034343698203892452857924199, + 21888242871839275222246405745257275088548364400416034343698204045739228525401, + 306742096038429, + 491399846331952, + 21888242871839275222246405745257275088548364400416034343698204067714369739606, + 146586441909859, + 139016145784669, + 339371470533167, + 21888242871839275222246405745257275088548364400416034343698204062347687937187, + 128930103730275, + 21888242871839275222246405745257275088548364400416034343698204126455570654732, + 21888242871839275222246405745257275088548364400416034343698203953186866951418, + 320027159448746, + 176141115517798, + 65656682993515, + 21888242871839275222246405745257275088548364400416034343698204036447525300758, + 21888242871839275222246405745257275088548364400416034343698203632933069881268, + 21888242871839275222246405745257275088548364400416034343698203763217319803117, + 21888242871839275222246405745257275088548364400416034343698203927166322330241, + 21888242871839275222246405745257275088548364400416034343698204053800844754756, + 560273368403257, + 21888242871839275222246405745257275088548364400416034343698203974594461619129, + 21888242871839275222246405745257275088548364400416034343698203663217030218581, + 21888242871839275222246405745257275088548364400416034343698203657995831164012, + 291997548056689, + 21888242871839275222246405745257275088548364400416034343698204124365648836831, + 21888242871839275222246405745257275088548364400416034343698203722394496038385, + 21888242871839275222246405745257275088548364400416034343698203758545736610965, + 513877513374629, + 21888242871839275222246405745257275088548364400416034343698204084500525101363, + 110154982335440, + 79177536335023, + 11354447753829, + 21888242871839275222246405745257275088548364400416034343698204045050387510871, + 21888242871839275222246405745257275088548364400416034343698203895284528020586, + ]), + Polynomial::new([ + 47266338516713, + 21888242871839275222246405745257275088548364400416034343698204148339469773614, + 242899065053064, + 21888242871839275222246405745257275088548364400416034343698203849898924787443, + 395858726750704, + 68657726729221, + 21888242871839275222246405745257275088548364400416034343698203871567606205634, + 21888242871839275222246405745257275088548364400416034343698203707452064604169, + 21888242871839275222246405745257275088548364400416034343698203960324801432687, + 286110152811298, + 21888242871839275222246405745257275088548364400416034343698203719387121715391, + 21888242871839275222246405745257275088548364400416034343698204074613415256751, + 126131100443610, + 21888242871839275222246405745257275088548364400416034343698204160280013762893, + 21888242871839275222246405745257275088548364400416034343698203773696969162848, + 64414722612220, + 508356509854637, + 217046299439814, + 488888903324779, + 393560696192695, + 269096900442139, + 21888242871839275222246405745257275088548364400416034343698203735582562162803, + 21888242871839275222246405745257275088548364400416034343698204066345966932326, + 231896935113741, + 21888242871839275222246405745257275088548364400416034343698204153807518295790, + 21888242871839275222246405745257275088548364400416034343698203926560971640862, + 21888242871839275222246405745257275088548364400416034343698204120007168716238, + 122251320872168, + 347617404193045, + 463800176081326, + 21888242871839275222246405745257275088548364400416034343698203958887680098797, + 363327253411981, + 406341643346707, + 21888242871839275222246405745257275088548364400416034343698203649516274411256, + 21888242871839275222246405745257275088548364400416034343698203942623975962221, + 337382950639924, + 21888242871839275222246405745257275088548364400416034343698203983928418113359, + 21888242871839275222246405745257275088548364400416034343698203886218945433893, + 21888242871839275222246405745257275088548364400416034343698204038762551322008, + 309436006424771, + 213041476694334, + 395834654405615, + 21888242871839275222246405745257275088548364400416034343698203738913985233012, + 21888242871839275222246405745257275088548364400416034343698203927306905061582, + 426598485269582, + 200803836707112, + 21888242871839275222246405745257275088548364400416034343698204057427779388648, + 242547683997724, + 21888242871839275222246405745257275088548364400416034343698204179191754137366, + 433900310969720, + 21888242871839275222246405745257275088548364400416034343698203657362331547868, + 21888242871839275222246405745257275088548364400416034343698204028150370295023, + 21888242871839275222246405745257275088548364400416034343698204129910316725079, + 21888242871839275222246405745257275088548364400416034343698204066140110941964, + 21888242871839275222246405745257275088548364400416034343698204022853754598401, + 21888242871839275222246405745257275088548364400416034343698203767011023197551, + 112538126513465, + 164488665170799, + 21888242871839275222246405745257275088548364400416034343698203979617448176120, + 121539730809687, + 21888242871839275222246405745257275088548364400416034343698204145898914727315, + 220358514459196, + 99411361744436, + 21888242871839275222246405745257275088548364400416034343698203886156796044410, + 155274627031587, + 21888242871839275222246405745257275088548364400416034343698204118061369122736, + 21888242871839275222246405745257275088548364400416034343698204107430066369046, + 468583845950404, + 514490056134433, + 41644381992352, + 502403811454843, + 21888242871839275222246405745257275088548364400416034343698203843098109859289, + 21888242871839275222246405745257275088548364400416034343698203883368743297706, + 21888242871839275222246405745257275088548364400416034343698203890582244947680, + 466812237102149, + 21888242871839275222246405745257275088548364400416034343698204064748635696339, + 21888242871839275222246405745257275088548364400416034343698203915024634558303, + 21888242871839275222246405745257275088548364400416034343698203897784141978421, + 21888242871839275222246405745257275088548364400416034343698204019365212968367, + 21888242871839275222246405745257275088548364400416034343698204158160677913130, + 498264455208858, + 21888242871839275222246405745257275088548364400416034343698204073965034112943, + 21888242871839275222246405745257275088548364400416034343698203885798792725513, + 21888242871839275222246405745257275088548364400416034343698203859283416687772, + 86246984628875, + 152522674894138, + 21888242871839275222246405745257275088548364400416034343698204004645220325052, + 279228435490585, + 254153858775434, + 21888242871839275222246405745257275088548364400416034343698203701062462229583, + 111962203940101, + 21888242871839275222246405745257275088548364400416034343698204086651505423069, + 21888242871839275222246405745257275088548364400416034343698203768889297290326, + 43359652456349, + 21888242871839275222246405745257275088548364400416034343698203742314617203663, + 433923400462077, + 306142759337926, + 21888242871839275222246405745257275088548364400416034343698204044557031130958, + 341457333462533, + 21888242871839275222246405745257275088548364400416034343698203925426042762840, + 21888242871839275222246405745257275088548364400416034343698203742892650886893, + 21888242871839275222246405745257275088548364400416034343698203989256308296651, + 21888242871839275222246405745257275088548364400416034343698204123503301317394, + 21888242871839275222246405745257275088548364400416034343698204182051869761534, + 21888242871839275222246405745257275088548364400416034343698203919635183177306, + 21888242871839275222246405745257275088548364400416034343698203837572128683728, + 241219111637840, + 104881058028367, + 21888242871839275222246405745257275088548364400416034343698204035031380625052, + 226421419390997, + 21888242871839275222246405745257275088548364400416034343698203894451605608023, + 40708298495853, + 204558163159926, + 91564476688546, + 21888242871839275222246405745257275088548364400416034343698204092637961883444, + 363426860456369, + 194652650414556, + 21888242871839275222246405745257275088548364400416034343698203806493470606997, + 21888242871839275222246405745257275088548364400416034343698203850268046671660, + 21888242871839275222246405745257275088548364400416034343698204145567500674101, + 21888242871839275222246405745257275088548364400416034343698203737856107282062, + 188045332334242, + 21888242871839275222246405745257275088548364400416034343698203794178394886633, + 21888242871839275222246405745257275088548364400416034343698204044105580556449, + 21888242871839275222246405745257275088548364400416034343698203912150293662055, + 21888242871839275222246405745257275088548364400416034343698203778726648077804, + 21888242871839275222246405745257275088548364400416034343698203733732493907593, + 21888242871839275222246405745257275088548364400416034343698203970833219306251, + 21888242871839275222246405745257275088548364400416034343698203868264233415015, + 21888242871839275222246405745257275088548364400416034343698203892866305225062, + 21888242871839275222246405745257275088548364400416034343698203943575379681854, + 247418934844146, + 21888242871839275222246405745257275088548364400416034343698203758846611798241, + 62007194258040, + 21888242871839275222246405745257275088548364400416034343698203726028770501636, + 21888242871839275222246405745257275088548364400416034343698204012385946872624, + 474714355661697, + 21888242871839275222246405745257275088548364400416034343698203681390925470028, + 21888242871839275222246405745257275088548364400416034343698204019480216828802, + 21888242871839275222246405745257275088548364400416034343698203805618939328050, + 116880542198494, + 21888242871839275222246405745257275088548364400416034343698204022996310069722, + 21888242871839275222246405745257275088548364400416034343698204170052877514836, + 395505639007937, + 21888242871839275222246405745257275088548364400416034343698204147362248745798, + 90516041989978, + 21888242871839275222246405745257275088548364400416034343698204101844940685420, + 21888242871839275222246405745257275088548364400416034343698203913715407994086, + 317717636958641, + 21888242871839275222246405745257275088548364400416034343698204075197425573663, + 21888242871839275222246405745257275088548364400416034343698204098236498003070, + 257787078719775, + 211961027838623, + 21888242871839275222246405745257275088548364400416034343698204180967718080854, + 21888242871839275222246405745257275088548364400416034343698204140591182272717, + 21888242871839275222246405745257275088548364400416034343698203797361878627504, + 21888242871839275222246405745257275088548364400416034343698204044790371708672, + 21888242871839275222246405745257275088548364400416034343698204027709110137305, + 382223893196713, + 84936259895332, + 21888242871839275222246405745257275088548364400416034343698203760796375783238, + 21888242871839275222246405745257275088548364400416034343698204170324448040454, + 21888242871839275222246405745257275088548364400416034343698204109432741835226, + 21888242871839275222246405745257275088548364400416034343698204045952800182599, + 21888242871839275222246405745257275088548364400416034343698203828560461136699, + 151308235148952, + 21888242871839275222246405745257275088548364400416034343698203638759666887041, + 21888242871839275222246405745257275088548364400416034343698203752059548851617, + 21888242871839275222246405745257275088548364400416034343698203696780394363078, + 21888242871839275222246405745257275088548364400416034343698203805675884918852, + 21888242871839275222246405745257275088548364400416034343698203844220006553227, + 182493077027767, + 242712032766239, + 32733241558887, + 21888242871839275222246405745257275088548364400416034343698203626074658432419, + 104787670378124, + 63479386994247, + 546613421345553, + 21888242871839275222246405745257275088548364400416034343698203948470695318016, + 519190007798814, + 202189420436088, + 21888242871839275222246405745257275088548364400416034343698203859559983870322, + 553012823345053, + 100810911551205, + 21888242871839275222246405745257275088548364400416034343698203934148679278243, + 21888242871839275222246405745257275088548364400416034343698204077949598322137, + 21888242871839275222246405745257275088548364400416034343698203845149244220036, + 21888242871839275222246405745257275088548364400416034343698203636653186499508, + 21888242871839275222246405745257275088548364400416034343698204169168327298617, + 21888242871839275222246405745257275088548364400416034343698203742589624996915, + 109995426441363, + 21888242871839275222246405745257275088548364400416034343698204184475969430020, + 146607638745368, + 345330435898537, + 21888242871839275222246405745257275088548364400416034343698203996990746958981, + 244750560686496, + 21888242871839275222246405745257275088548364400416034343698203913788059398100, + 21888242871839275222246405745257275088548364400416034343698203688860752333192, + 21888242871839275222246405745257275088548364400416034343698203678520614658485, + 21888242871839275222246405745257275088548364400416034343698203648943172607712, + 278817626000519, + 21888242871839275222246405745257275088548364400416034343698203775126918666877, + 520039710732122, + 260724630129241, + 315047084526017, + 21888242871839275222246405745257275088548364400416034343698203815511733928218, + 21888242871839275222246405745257275088548364400416034343698203987175861690635, + 3421883166345, + 280773681769057, + 65086471824190, + 21888242871839275222246405745257275088548364400416034343698204092233911952675, + 21888242871839275222246405745257275088548364400416034343698204099297988244497, + 21888242871839275222246405745257275088548364400416034343698203824624428735127, + 346336116872055, + 356695661795583, + 21888242871839275222246405745257275088548364400416034343698204017776263274851, + 21888242871839275222246405745257275088548364400416034343698203951809274101492, + 211503350869215, + 21888242871839275222246405745257275088548364400416034343698203740636501279418, + 21888242871839275222246405745257275088548364400416034343698203955074160263455, + 327492576696360, + 21888242871839275222246405745257275088548364400416034343698203894139464459916, + 21888242871839275222246405745257275088548364400416034343698203812122099445791, + 21888242871839275222246405745257275088548364400416034343698203904376640312673, + 21888242871839275222246405745257275088548364400416034343698204059973902642613, + 205124231074118, + 21888242871839275222246405745257275088548364400416034343698203818935930144681, + 21888242871839275222246405745257275088548364400416034343698203925461404548814, + 462612495345746, + 323638583594711, + 283172462476748, + 21888242871839275222246405745257275088548364400416034343698204143421953906058, + 21888242871839275222246405745257275088548364400416034343698203990033981603071, + 21888242871839275222246405745257275088548364400416034343698203685094827251248, + 21888242871839275222246405745257275088548364400416034343698203629678562713616, + 445855311925381, + 21888242871839275222246405745257275088548364400416034343698204176982409004773, + 21888242871839275222246405745257275088548364400416034343698203950553091255706, + 189855322547234, + 21888242871839275222246405745257275088548364400416034343698204066237463334095, + 543089570111109, + 21888242871839275222246405745257275088548364400416034343698203914649480058266, + 137804537307778, + 21888242871839275222246405745257275088548364400416034343698204073580334718425, + 140015967499966, + 145835260741250, + 210679472084401, + 21888242871839275222246405745257275088548364400416034343698203783722090771947, + 21888242871839275222246405745257275088548364400416034343698203775938867630693, + 557618753512462, + 21888242871839275222246405745257275088548364400416034343698204141120986362173, + 21888242871839275222246405745257275088548364400416034343698203685880347673450, + 21888242871839275222246405745257275088548364400416034343698203735112008488182, + 21888242871839275222246405745257275088548364400416034343698203776996475438284, + 512307595295066, + 310061077829262, + 21888242871839275222246405745257275088548364400416034343698203976859718768793, + 21888242871839275222246405745257275088548364400416034343698203836042164163159, + 189846684358885, + 355202188435602, + 328060686777199, + 21888242871839275222246405745257275088548364400416034343698203725258825640190, + 21888242871839275222246405745257275088548364400416034343698203636541499612529, + 21888242871839275222246405745257275088548364400416034343698203944283718082921, + 328860841874511, + 21888242871839275222246405745257275088548364400416034343698203660553069103235, + 21888242871839275222246405745257275088548364400416034343698203696764420153276, + 180498481451001, + 88018458286152, + 468755810514337, + 219449294244764, + 117841285017640, + 21888242871839275222246405745257275088548364400416034343698203967399230614569, + 21888242871839275222246405745257275088548364400416034343698204104055860012943, + 21888242871839275222246405745257275088548364400416034343698204119021905045465, + 281561787476925, + 21888242871839275222246405745257275088548364400416034343698204097723007836984, + 21888242871839275222246405745257275088548364400416034343698203725955021144974, + 462970640492264, + 21888242871839275222246405745257275088548364400416034343698204071254568014247, + 373473699778652, + 149194523036460, + 228429129496242, + 283428802761132, + 101396004852478, + 114985872448736, + 335086596620183, + 472733324516847, + 21888242871839275222246405745257275088548364400416034343698204162009061903267, + 155817928134760, + 21888242871839275222246405745257275088548364400416034343698203743155330308254, + 264766954049541, + 58658052391396, + 260352872858851, + 21888242871839275222246405745257275088548364400416034343698203709683763910974, + 45826294271331, + 21888242871839275222246405745257275088548364400416034343698204052420294959021, + 21888242871839275222246405745257275088548364400416034343698203924862635381678, + 255137408898042, + 205177272463778, + 21888242871839275222246405745257275088548364400416034343698203829283127199362, + 4707086586191, + 44692998504921, + 267854594160549, + 246243307988204, + 21888242871839275222246405745257275088548364400416034343698204070205855721898, + 21888242871839275222246405745257275088548364400416034343698203886823195537134, + 122490753053898, + 236851645166667, + 21888242871839275222246405745257275088548364400416034343698204084664797294031, + 21888242871839275222246405745257275088548364400416034343698203787845382951569, + 21888242871839275222246405745257275088548364400416034343698203851282975101236, + 21888242871839275222246405745257275088548364400416034343698204002312567696770, + 187411777972431, + 3071558961014, + 21888242871839275222246405745257275088548364400416034343698204135210479332316, + 379525931034565, + 293823621417937, + 153413374829722, + 444082033628436, + 109106313271636, + 21888242871839275222246405745257275088548364400416034343698203897452723126530, + 255379574864781, + 160078356043557, + 21888242871839275222246405745257275088548364400416034343698203857537405582582, + 21888242871839275222246405745257275088548364400416034343698204110820022474576, + 324948942163104, + 21888242871839275222246405745257275088548364400416034343698204128460282651133, + 485657623565952, + 159224009870448, + 21888242871839275222246405745257275088548364400416034343698204054682855799799, + 288927221620161, + 214324204456845, + 338687939764975, + 553008218096762, + 21888242871839275222246405745257275088548364400416034343698203749411581394714, + 21888242871839275222246405745257275088548364400416034343698203937438008840052, + 31797233758560, + 21888242871839275222246405745257275088548364400416034343698203735219313863664, + 356091403518856, + 103191026906551, + 21888242871839275222246405745257275088548364400416034343698203990897872785295, + 21888242871839275222246405745257275088548364400416034343698203841838497476235, + 23845357802462, + 148398886695024, + 310858545399154, + 21888242871839275222246405745257275088548364400416034343698203973770275836923, + 339284440573872, + 21888242871839275222246405745257275088548364400416034343698203669957647897085, + 21888242871839275222246405745257275088548364400416034343698203774137006054303, + 21888242871839275222246405745257275088548364400416034343698203656678743143286, + 556285247471080, + 456801689334410, + 21888242871839275222246405745257275088548364400416034343698204004032614860059, + 540203983182848, + 428019397703650, + 21888242871839275222246405745257275088548364400416034343698203934929160972859, + 75044268959191, + 21888242871839275222246405745257275088548364400416034343698204093991431481518, + 238171609357828, + 21888242871839275222246405745257275088548364400416034343698203835899635975500, + 21888242871839275222246405745257275088548364400416034343698204031776781477059, + 7754121643733, + 238384252044388, + 21888242871839275222246405745257275088548364400416034343698203761129397589376, + 324259122324149, + 21888242871839275222246405745257275088548364400416034343698204062118346758520, + 21888242871839275222246405745257275088548364400416034343698203830131639043727, + 21888242871839275222246405745257275088548364400416034343698203666276057447191, + 12837285438620, + 26522345666334, + 103601229511308, + 21888242871839275222246405745257275088548364400416034343698204105423829444907, + 21888242871839275222246405745257275088548364400416034343698203988283971931734, + 21888242871839275222246405745257275088548364400416034343698204044559837197287, + 77662255197368, + 21888242871839275222246405745257275088548364400416034343698203840367203024896, + 84339717073739, + 354027338760691, + 491475090180679, + 21888242871839275222246405745257275088548364400416034343698204185459709053969, + 21888242871839275222246405745257275088548364400416034343698203956886981647258, + 21888242871839275222246405745257275088548364400416034343698203814108552769397, + 21888242871839275222246405745257275088548364400416034343698203742893014051000, + 317603697141164, + 21888242871839275222246405745257275088548364400416034343698204002052155237816, + 21888242871839275222246405745257275088548364400416034343698204079328148055966, + 439230896067396, + 21888242871839275222246405745257275088548364400416034343698203789320874872804, + 21888242871839275222246405745257275088548364400416034343698203640455371937902, + 21888242871839275222246405745257275088548364400416034343698204043116364855751, + 21888242871839275222246405745257275088548364400416034343698203718493016707003, + 21888242871839275222246405745257275088548364400416034343698204083690778352016, + 21888242871839275222246405745257275088548364400416034343698203724079008515620, + 21551670943299, + 440324623625276, + 37151262497054, + 358706962907765, + 21888242871839275222246405745257275088548364400416034343698203694740012371314, + 21888242871839275222246405745257275088548364400416034343698203655735909976433, + 314531653269272, + 18952246028754, + 312358971620752, + 21888242871839275222246405745257275088548364400416034343698204077327273558605, + 250173819256702, + 376089839842833, + 372032558011928, + 21888242871839275222246405745257275088548364400416034343698203852882982059730, + 543450051640982, + 21888242871839275222246405745257275088548364400416034343698203692871352044107, + 44864560077484, + 194600126449651, + 21888242871839275222246405745257275088548364400416034343698203668931963115835, + 21888242871839275222246405745257275088548364400416034343698203825690688014903, + 21888242871839275222246405745257275088548364400416034343698203629911155593434, + 245039408818342, + 454710381162212, + 21888242871839275222246405745257275088548364400416034343698203767482126267468, + 214371119392647, + 78292029880528, + 21888242871839275222246405745257275088548364400416034343698204037972905779157, + 502125964647913, + 279215883958787, + 369027333306567, + 484629835012801, + 21888242871839275222246405745257275088548364400416034343698203674694589704528, + 21888242871839275222246405745257275088548364400416034343698203999094085014553, + 199916648086213, + 21888242871839275222246405745257275088548364400416034343698204158424581656896, + 86959088236884, + 59910408444219, + 452856737826028, + 21888242871839275222246405745257275088548364400416034343698203732020234455164, + 21888242871839275222246405745257275088548364400416034343698204069189082377524, + 480043756963061, + 21888242871839275222246405745257275088548364400416034343698204173222832563041, + 304358945535564, + 21888242871839275222246405745257275088548364400416034343698203683675205828462, + 69365646890047, + 21888242871839275222246405745257275088548364400416034343698203661513038547024, + 350098853267223, + 538219860600502, + 21888242871839275222246405745257275088548364400416034343698203652830286189747, + 21888242871839275222246405745257275088548364400416034343698203946725145861218, + 317696486051029, + 193799826944320, + 21888242871839275222246405745257275088548364400416034343698204124306287230947, + 511146302543156, + 24618569063854, + 510781900895308, + 21888242871839275222246405745257275088548364400416034343698204115654301093667, + 21888242871839275222246405745257275088548364400416034343698203676273869249487, + 193034506032630, + 137743581236334, + 491330609493006, + 458160783719756, + 21888242871839275222246405745257275088548364400416034343698203833290823563350, + 350313523771156, + 21888242871839275222246405745257275088548364400416034343698203829324829090075, + 303024554201042, + 21888242871839275222246405745257275088548364400416034343698204018132756721948, + 483605450912786, + 238123479128810, + 21888242871839275222246405745257275088548364400416034343698203809385193857272, + 21888242871839275222246405745257275088548364400416034343698204004638398967982, + 542940341840341, + 226305776487030, + 22179719383963, + 21888242871839275222246405745257275088548364400416034343698203779225340651341, + 8464597789088, + 21888242871839275222246405745257275088548364400416034343698203705259762466728, + 211147846622223, + 208952108902702, + 21888242871839275222246405745257275088548364400416034343698204029057923402683, + 120222128066607, + 458081206171408, + 90751275240293, + 21888242871839275222246405745257275088548364400416034343698203676192048280606, + 419499585277034, + 21888242871839275222246405745257275088548364400416034343698203820617842370483, + 295146783550214, + 12746625192632, + 21888242871839275222246405745257275088548364400416034343698204043770114460738, + 21888242871839275222246405745257275088548364400416034343698203988918998702078, + 512264875230008, + 21888242871839275222246405745257275088548364400416034343698203699397380654289, + 51463909251973, + 21888242871839275222246405745257275088548364400416034343698204058960453123133, + 222216190601104, + 21888242871839275222246405745257275088548364400416034343698203666934362646232, + 21888242871839275222246405745257275088548364400416034343698204040567986127752, + 21888242871839275222246405745257275088548364400416034343698203847117559310361, + 21888242871839275222246405745257275088548364400416034343698203709860129875027, + 21888242871839275222246405745257275088548364400416034343698204018983774519038, + 21888242871839275222246405745257275088548364400416034343698204109325541885345, + 276221210816819, + 21888242871839275222246405745257275088548364400416034343698203968699315815641, + 21888242871839275222246405745257275088548364400416034343698203866414845105683, + 21888242871839275222246405745257275088548364400416034343698203745856801662946, + 411332837461100, + 21888242871839275222246405745257275088548364400416034343698203981152383438356, + 21888242871839275222246405745257275088548364400416034343698203937081162921566, + 21888242871839275222246405745257275088548364400416034343698204036293988970822, + 417415299755173, + 21888242871839275222246405745257275088548364400416034343698203700257996793516, + 358952126966069, + 21888242871839275222246405745257275088548364400416034343698204070762861475611, + 21888242871839275222246405745257275088548364400416034343698204123375145317967, + 21888242871839275222246405745257275088548364400416034343698203722934403477840, + 21888242871839275222246405745257275088548364400416034343698203655264354345619, + 21888242871839275222246405745257275088548364400416034343698203945365528439443, + 21888242871839275222246405745257275088548364400416034343698203720678336824843, + 201524374679229, + 535135396816044, + 196365453198342, + 21888242871839275222246405745257275088548364400416034343698204124086431691544, + 446608867808190, + 520563528801791, + 109825957777104, + 412349211770173, + 36025167643715, + 523846319304690, + 23098549485904, + 21888242871839275222246405745257275088548364400416034343698203869159536289695, + 21888242871839275222246405745257275088548364400416034343698203644625182741214, + 559920009412921, + 21888242871839275222246405745257275088548364400416034343698203782576998025451, + 21888242871839275222246405745257275088548364400416034343698204139249494387384, + 21888242871839275222246405745257275088548364400416034343698203903410311094452, + 21888242871839275222246405745257275088548364400416034343698204021142681654682, + 547934446574260, + 21888242871839275222246405745257275088548364400416034343698203801263542909117, + 21888242871839275222246405745257275088548364400416034343698204046190696757568, + 494756504064946, + 21888242871839275222246405745257275088548364400416034343698203906595977246461, + 21888242871839275222246405745257275088548364400416034343698203628645259888775, + 21888242871839275222246405745257275088548364400416034343698203970575070051956, + 21888242871839275222246405745257275088548364400416034343698204139124801202978, + 362583415027805, + 313023091496109, + 21888242871839275222246405745257275088548364400416034343698203971376272944137, + 74596195080374, + 21888242871839275222246405745257275088548364400416034343698203626503271667474, + 213985947980736, + 317162212370276, + 21888242871839275222246405745257275088548364400416034343698203635154207924770, + 399191331307432, + 395501726314121, + 473267377646567, + 21888242871839275222246405745257275088548364400416034343698203960583645068864, + 21888242871839275222246405745257275088548364400416034343698203929952971218225, + 21888242871839275222246405745257275088548364400416034343698203936204226073188, + 342798169730315, + 530349225510551, + 21888242871839275222246405745257275088548364400416034343698203696085142054125, + 132702724649505, + 21888242871839275222246405745257275088548364400416034343698203949202728340057, + 108276445371671, + 459404534321554, + 17259717111176, + 21888242871839275222246405745257275088548364400416034343698204068621219582468, + 29099461541483, + 358840746168736, + 21888242871839275222246405745257275088548364400416034343698203682619723465088, + 541384528057846, + 533556631908952, + 562410066930772, + 555507386312717, + 240984312839739, + 343968290438970, + 21888242871839275222246405745257275088548364400416034343698204078141612109977, + 279266075811887, + 21888242871839275222246405745257275088548364400416034343698203644275473271416, + 243115994421685, + 21888242871839275222246405745257275088548364400416034343698203905965169425031, + 21888242871839275222246405745257275088548364400416034343698203757725780017501, + 303225027086851, + 250385696765494, + 21888242871839275222246405745257275088548364400416034343698203771767676212378, + 21888242871839275222246405745257275088548364400416034343698204005219152614240, + 469881415026800, + 21888242871839275222246405745257275088548364400416034343698204013576380069171, + 21888242871839275222246405745257275088548364400416034343698203949121744476759, + 21888242871839275222246405745257275088548364400416034343698204186067210917194, + 6158081690189, + 21888242871839275222246405745257275088548364400416034343698204126131006062685, + 395209766111429, + 102960012996524, + 123891181075475, + 273778572758807, + 456632039455110, + 21888242871839275222246405745257275088548364400416034343698204173036235106482, + 21888242871839275222246405745257275088548364400416034343698203779124571907660, + 21888242871839275222246405745257275088548364400416034343698203847028916578951, + 21888242871839275222246405745257275088548364400416034343698203749181628556145, + 21888242871839275222246405745257275088548364400416034343698203626654173663891, + 83426071060888, + 21888242871839275222246405745257275088548364400416034343698204109181968122523, + 21888242871839275222246405745257275088548364400416034343698203948059126141486, + 281857415177772, + 379104129108462, + 492359343496961, + 50132294845149, + 450067001405535, + 133318680971546, + 179211511412003, + 390167328547548, + 21888242871839275222246405745257275088548364400416034343698203716354044739969, + 431601374172342, + 21888242871839275222246405745257275088548364400416034343698203875774299785209, + 499570368017216, + 21888242871839275222246405745257275088548364400416034343698204144540872327494, + 21888242871839275222246405745257275088548364400416034343698203988260138111727, + 306066480946084, + 292746996304025, + 21888242871839275222246405745257275088548364400416034343698204001125038652241, + 21888242871839275222246405745257275088548364400416034343698203644765467098731, + 21888242871839275222246405745257275088548364400416034343698203751911527043621, + 21888242871839275222246405745257275088548364400416034343698203681773328749027, + 51483305388581, + 21888242871839275222246405745257275088548364400416034343698204060666488136781, + 250905843462086, + 21888242871839275222246405745257275088548364400416034343698203683224929533336, + 21888242871839275222246405745257275088548364400416034343698203736083200940718, + 21888242871839275222246405745257275088548364400416034343698203737070085872927, + 21888242871839275222246405745257275088548364400416034343698204012341105499071, + 21888242871839275222246405745257275088548364400416034343698204152378621744393, + 21888242871839275222246405745257275088548364400416034343698203977017469588624, + 21888242871839275222246405745257275088548364400416034343698203962057528520681, + 21888242871839275222246405745257275088548364400416034343698203846464506530742, + 273584874370086, + 98283449719848, + 21888242871839275222246405745257275088548364400416034343698203906043037458938, + 105868429164795, + 21888242871839275222246405745257275088548364400416034343698204007934510426562, + 533058917251864, + 367448394685869, + 21888242871839275222246405745257275088548364400416034343698203657350124113725, + 21888242871839275222246405745257275088548364400416034343698203753252214692381, + 21888242871839275222246405745257275088548364400416034343698203703398794098218, + 21888242871839275222246405745257275088548364400416034343698203690700004387328, + 234610484116660, + 21888242871839275222246405745257275088548364400416034343698204047773421680297, + 4113255563741, + 21888242871839275222246405745257275088548364400416034343698204049648952677802, + 393622060963376, + 21888242871839275222246405745257275088548364400416034343698203959110960049973, + 342912035729608, + 21888242871839275222246405745257275088548364400416034343698204153101780746903, + 21888242871839275222246405745257275088548364400416034343698203779105518624594, + 303918632421826, + 510637814664935, + 415079854037203, + 535052756710239, + 462743196352700, + 481980533064920, + 184606800969369, + 21888242871839275222246405745257275088548364400416034343698203637165498458783, + 21888242871839275222246405745257275088548364400416034343698203872964370907174, + 458504569380849, + 420264742714760, + 21888242871839275222246405745257275088548364400416034343698204121685697957461, + 235654662705194, + 490886680110686, + 21888242871839275222246405745257275088548364400416034343698204139194006054033, + 21888242871839275222246405745257275088548364400416034343698203648776629876382, + 21888242871839275222246405745257275088548364400416034343698204079873270512162, + 462650301687317, + 248008495351247, + 144477056922115, + 21888242871839275222246405745257275088548364400416034343698203792404481360802, + 21888242871839275222246405745257275088548364400416034343698203778102424767059, + 504518135299274, + 488115969349071, + 21888242871839275222246405745257275088548364400416034343698203729394921465855, + 21888242871839275222246405745257275088548364400416034343698203724973322664432, + 395810073471205, + 21888242871839275222246405745257275088548364400416034343698203903264789358555, + 282558154256464, + 21888242871839275222246405745257275088548364400416034343698203627082113922678, + 21888242871839275222246405745257275088548364400416034343698204041264486257145, + 21888242871839275222246405745257275088548364400416034343698203851330750045525, + 64030383489128, + 21888242871839275222246405745257275088548364400416034343698203707203027872642, + 250121517124751, + 21888242871839275222246405745257275088548364400416034343698203720061688726313, + 21888242871839275222246405745257275088548364400416034343698204131927156944106, + 390136751444836, + 21888242871839275222246405745257275088548364400416034343698204044377067650963, + 400782243763806, + 21888242871839275222246405745257275088548364400416034343698203817264188216664, + 253687267724346, + 21888242871839275222246405745257275088548364400416034343698203937048131696172, + 149209800537801, + 179353395307502, + 21888242871839275222246405745257275088548364400416034343698203900797570605216, + 287579639919524, + 432528021659858, + 407565634396903, + 151744923330130, + 21888242871839275222246405745257275088548364400416034343698203997126818897530, + 534480710979730, + 352733228236549, + 25347347600882, + 21888242871839275222246405745257275088548364400416034343698203888726166126511, + 332886084644208, + 21888242871839275222246405745257275088548364400416034343698204046547697806101, + 21888242871839275222246405745257275088548364400416034343698203945929999905902, + 469108405513093, + 142927183637046, + 241821065557486, + 542594507719859, + 99453985048187, + 21888242871839275222246405745257275088548364400416034343698204037567340980796, + 25947404789207, + 87697751240036, + 40764528266127, + 65093052184402, + 21888242871839275222246405745257275088548364400416034343698204057657609906179, + 21888242871839275222246405745257275088548364400416034343698203856672642126229, + 21888242871839275222246405745257275088548364400416034343698203654671110991878, + 409672308526396, + 390160834813908, + 114167331104367, + 278492856753145, + 21888242871839275222246405745257275088548364400416034343698203934023347643782, + 21888242871839275222246405745257275088548364400416034343698204176054428062015, + 40728318822471, + 374262289984340, + 180563881275524, + 21888242871839275222246405745257275088548364400416034343698203962718773545850, + 311325097108156, + 21888242871839275222246405745257275088548364400416034343698203799121789771763, + 112437703165253, + 340445298890869, + 388543221082788, + 21888242871839275222246405745257275088548364400416034343698203867600560281625, + 21888242871839275222246405745257275088548364400416034343698204084736461514091, + 388692767696251, + 21888242871839275222246405745257275088548364400416034343698204099256898515161, + 408007551420504, + 21888242871839275222246405745257275088548364400416034343698203972146079151888, + 21888242871839275222246405745257275088548364400416034343698204103362780390425, + 21888242871839275222246405745257275088548364400416034343698203884012090136562, + 81726796842392, + 21888242871839275222246405745257275088548364400416034343698203653969070310242, + 21888242871839275222246405745257275088548364400416034343698203929873486248231, + 21888242871839275222246405745257275088548364400416034343698203631758650374024, + 21888242871839275222246405745257275088548364400416034343698203918394812303886, + 177861036534480, + 21888242871839275222246405745257275088548364400416034343698203996357883123705, + 214218940695034, + 21888242871839275222246405745257275088548364400416034343698203767620851916142, + 203951945149996, + 261724098200266, + 21888242871839275222246405745257275088548364400416034343698203948936173995302, + 136350977785812, + 21888242871839275222246405745257275088548364400416034343698204044426453641864, + 21888242871839275222246405745257275088548364400416034343698204042464434953968, + 21888242871839275222246405745257275088548364400416034343698203945441845806232, + 518729449161158, + 396517078826039, + 21888242871839275222246405745257275088548364400416034343698203914183066396212, + 187397733127345, + 312732096416426, + 370114905355848, + 21888242871839275222246405745257275088548364400416034343698203882944518834583, + 21888242871839275222246405745257275088548364400416034343698203642921338624810, + 121789669513670, + 21888242871839275222246405745257275088548364400416034343698203844816370447221, + 21888242871839275222246405745257275088548364400416034343698204156179365237249, + 21888242871839275222246405745257275088548364400416034343698203643127888349682, + 21888242871839275222246405745257275088548364400416034343698203760549871518837, + 21888242871839275222246405745257275088548364400416034343698203962666057371871, + 362364565984874, + 47541800909753, + 429918454701550, + 21888242871839275222246405745257275088548364400416034343698204160077273774218, + 21888242871839275222246405745257275088548364400416034343698204115759665234546, + 21888242871839275222246405745257275088548364400416034343698203667660564197235, + 561118438834935, + 21888242871839275222246405745257275088548364400416034343698204078700874618793, + 21888242871839275222246405745257275088548364400416034343698203871934422641701, + 390482243890744, + 97371499592645, + 104469460122527, + 392356567292048, + 184219074870428, + 213468140964892, + 21888242871839275222246405745257275088548364400416034343698204140431534846694, + 379234657377773, + 21888242871839275222246405745257275088548364400416034343698203655894851789625, + 21888242871839275222246405745257275088548364400416034343698203763805155535880, + 149604252180339, + 21888242871839275222246405745257275088548364400416034343698204039798141004767, + 161847334899614, + 21888242871839275222246405745257275088548364400416034343698203655243214683724, + 559648822380903, + 21888242871839275222246405745257275088548364400416034343698203905120865523115, + 21888242871839275222246405745257275088548364400416034343698203745120683917454, + 21888242871839275222246405745257275088548364400416034343698204057404240455904, + 316415205399997, + 186695731093095, + 460978332001487, + 21888242871839275222246405745257275088548364400416034343698203903941428755944, + 378711455454392, + 188416199589625, + 18198200325191, + 21888242871839275222246405745257275088548364400416034343698203734841698718307, + 558780512292268, + 290761121614672, + 21888242871839275222246405745257275088548364400416034343698204117890366343823, + 514634843823820, + 433805867349985, + 75418152464507, + 458606906826291, + 21888242871839275222246405745257275088548364400416034343698203928053024294188, + 391807943967950, + 227548942111593, + 21888242871839275222246405745257275088548364400416034343698203776807138440562, + 21888242871839275222246405745257275088548364400416034343698204094668501502361, + 202045973623151, + 21888242871839275222246405745257275088548364400416034343698204176482928090647, + 21888242871839275222246405745257275088548364400416034343698203693805166661643, + 349004123609192, + 21888242871839275222246405745257275088548364400416034343698203950836239714480, + 25857894566422, + 77313405546244, + 516814331783117, + 83301024920177, + 21888242871839275222246405745257275088548364400416034343698203790097508962695, + 21888242871839275222246405745257275088548364400416034343698203876050249287967, + 21888242871839275222246405745257275088548364400416034343698203961598221651566, + 410649717191052, + 463381395590226, + 21888242871839275222246405745257275088548364400416034343698203825945577804746, + 21888242871839275222246405745257275088548364400416034343698203727002225269937, + 21888242871839275222246405745257275088548364400416034343698203676426853082349, + 282491759579745, + 373469001774441, + 398769650640203, + 47601856770082, + 21888242871839275222246405745257275088548364400416034343698203688899807727903, + 21888242871839275222246405745257275088548364400416034343698203636288842714001, + 21888242871839275222246405745257275088548364400416034343698203972480542910051, + 275484246893361, + 415384146507320, + 503755888331819, + 21888242871839275222246405745257275088548364400416034343698204094023783369585, + 81275890541531, + 21888242871839275222246405745257275088548364400416034343698204173349052271828, + 72881046206994, + 501636747461053, + 21888242871839275222246405745257275088548364400416034343698204091680167401094, + 258817392427135, + 443921373256387, + 513854831366412, + 21888242871839275222246405745257275088548364400416034343698203879917873122961, + 69070281992976, + 52047359491231, + 47468766118090, + 21888242871839275222246405745257275088548364400416034343698203714291256677845, + 264754384872759, + 336524333246795, + 444883409792035, + 52888495200810, + 21888242871839275222246405745257275088548364400416034343698203658135003049483, + 21888242871839275222246405745257275088548364400416034343698203694343664578277, + 21888242871839275222246405745257275088548364400416034343698204096373250815655, + 21888242871839275222246405745257275088548364400416034343698204161367134479109, + 21888242871839275222246405745257275088548364400416034343698203769422596788474, + 21888242871839275222246405745257275088548364400416034343698204024269984714754, + 21888242871839275222246405745257275088548364400416034343698203699785106156296, + 494525986167260, + 21888242871839275222246405745257275088548364400416034343698204131360403356105, + 21888242871839275222246405745257275088548364400416034343698203886298362883072, + 21888242871839275222246405745257275088548364400416034343698204130026931447900, + 56943076573016, + 169820995104831, + 21888242871839275222246405745257275088548364400416034343698203890802452898177, + 21888242871839275222246405745257275088548364400416034343698204084473949077318, + 445351105066941, + 21888242871839275222246405745257275088548364400416034343698204148462139102282, + 24831077662758, + 21888242871839275222246405745257275088548364400416034343698204071721763191589, + 160874908713788, + 31568937189919, + 48688803816737, + 21888242871839275222246405745257275088548364400416034343698204078569537935144, + 21888242871839275222246405745257275088548364400416034343698203947848650607556, + 561846268633336, + 343355980324342, + 93481112062054, + 21888242871839275222246405745257275088548364400416034343698203697954101081900, + 21888242871839275222246405745257275088548364400416034343698204028335536753408, + 199053154931120, + 21888242871839275222246405745257275088548364400416034343698204032616553601891, + 21888242871839275222246405745257275088548364400416034343698204022877600253099, + 502188546685103, + 178052690775550, + 21888242871839275222246405745257275088548364400416034343698203975715145744948, + 21888242871839275222246405745257275088548364400416034343698203628986924919756, + 21888242871839275222246405745257275088548364400416034343698204038223434076607, + 366917770394864, + 21888242871839275222246405745257275088548364400416034343698204147850978132866, + 77726955234232, + 21888242871839275222246405745257275088548364400416034343698203740344813152652, + 21888242871839275222246405745257275088548364400416034343698203962092535649618, + 392763118736406, + 255217699303869, + 21888242871839275222246405745257275088548364400416034343698203690153111465183, + 21888242871839275222246405745257275088548364400416034343698203753448832702568, + 390537982316058, + 21888242871839275222246405745257275088548364400416034343698203866669616685498, + 353166070966118, + 2883892206898, + 367662817472619, + 21888242871839275222246405745257275088548364400416034343698203980524697867362, + 21888242871839275222246405745257275088548364400416034343698203706003742558372, + 21888242871839275222246405745257275088548364400416034343698204004246904925738, + 21888242871839275222246405745257275088548364400416034343698203776459024556206, + 21888242871839275222246405745257275088548364400416034343698203902617546231735, + 122092334962550, + 181929153976391, + 357089651212259, + 21888242871839275222246405745257275088548364400416034343698203855606004091777, + 21888242871839275222246405745257275088548364400416034343698203848949027873965, + 273551970381091, + 21888242871839275222246405745257275088548364400416034343698204016727237669792, + 451006347358348, + 199398354701801, + 21888242871839275222246405745257275088548364400416034343698203784719130364540, + 21888242871839275222246405745257275088548364400416034343698204038596548338471, + 21888242871839275222246405745257275088548364400416034343698203719800358903799, + 106947146522514, + 96169345697014, + 226853674173724, + 21888242871839275222246405745257275088548364400416034343698204058729511737689, + 330215246102885, + 465328516244893, + 21888242871839275222246405745257275088548364400416034343698204073858585799203, + 21888242871839275222246405745257275088548364400416034343698203993398134792630, + 21888242871839275222246405745257275088548364400416034343698203750017372491458, + 437809104949962, + 424233284591014, + 283319433826962, + 21888242871839275222246405745257275088548364400416034343698203825331249710209, + 21888242871839275222246405745257275088548364400416034343698204070486162316363, + 514009078496282, + 21888242871839275222246405745257275088548364400416034343698203696137358675318, + 55048394218906, + 21888242871839275222246405745257275088548364400416034343698203807357423135623, + 252001229979252, + 345523612619076, + 462986603510254, + 322401784407214, + 21888242871839275222246405745257275088548364400416034343698203862906837314786, + 209799821708698, + 254125590366675, + 136203818630727, + 304696551013994, + 457286304602073, + 486458267360968, + 448473496662233, + 225895879748125, + 21888242871839275222246405745257275088548364400416034343698204127167035894341, + 532915015326863, + 21888242871839275222246405745257275088548364400416034343698203716612923543086, + 21888242871839275222246405745257275088548364400416034343698203888922254269386, + 21888242871839275222246405745257275088548364400416034343698203691065129433890, + 123014796835150, + 228938236611332, + 21888242871839275222246405745257275088548364400416034343698204038025087800395, + 514944218335123, + 21888242871839275222246405745257275088548364400416034343698204032788049118320, + 240209083785036, + 306483622975259, + 338600886089450, + 261122282537752, + 21888242871839275222246405745257275088548364400416034343698203965514525423736, + 299638206503818, + 21888242871839275222246405745257275088548364400416034343698203666346267648243, + 21888242871839275222246405745257275088548364400416034343698203665621106665640, + 21888242871839275222246405745257275088548364400416034343698203930840285969528, + 462760417173688, + 218501930823104, + 383037268053271, + 21888242871839275222246405745257275088548364400416034343698204013200922070080, + 292457114029347, + 21888242871839275222246405745257275088548364400416034343698203698770281974621, + 200478483892085, + 21888242871839275222246405745257275088548364400416034343698203733111024413421, + 21888242871839275222246405745257275088548364400416034343698203912376089416079, + 21888242871839275222246405745257275088548364400416034343698203765474595406841, + 21888242871839275222246405745257275088548364400416034343698203814394202454660, + 164254058786724, + 21888242871839275222246405745257275088548364400416034343698203806254044749733, + 482791584145259, + 283590171026751, + 21888242871839275222246405745257275088548364400416034343698203977585640079563, + 172798349765770, + 21888242871839275222246405745257275088548364400416034343698204046971568419955, + 233245184349053, + 223788922574971, + 106515314676432, + 21888242871839275222246405745257275088548364400416034343698203699035682006448, + 154734654109103, + 406062089903961, + 21888242871839275222246405745257275088548364400416034343698203683917683523725, + 17005829663680, + 21888242871839275222246405745257275088548364400416034343698203941932658049707, + 21888242871839275222246405745257275088548364400416034343698203630013827960508, + 289936356892652, + 21888242871839275222246405745257275088548364400416034343698203801000197320524, + 21888242871839275222246405745257275088548364400416034343698203713811281102330, + 21888242871839275222246405745257275088548364400416034343698204107597675798527, + 396512582787544, + 522600318467887, + 146655595444237, + 152309858992463, + 21888242871839275222246405745257275088548364400416034343698203740654120869722, + 21888242871839275222246405745257275088548364400416034343698203724105335488753, + 547680661915051, + 485368801392540, + 119631526589443, + 27579805281792, + 21888242871839275222246405745257275088548364400416034343698203666681880637988, + 21888242871839275222246405745257275088548364400416034343698204125433156952815, + 7723348107298, + 21888242871839275222246405745257275088548364400416034343698204071330581492310, + 340573644746938, + 255433973250966, + 175296418892010, + 21888242871839275222246405745257275088548364400416034343698203668297742499678, + 58118519567694, + 251808022732699, + 558785066347834, + 21888242871839275222246405745257275088548364400416034343698203927543139956072, + 21888242871839275222246405745257275088548364400416034343698204077907647547543, + 76859708965779, + 21888242871839275222246405745257275088548364400416034343698203941582310717965, + 21888242871839275222246405745257275088548364400416034343698203643791242322013, + 428523016041267, + 493703027442721, + 21888242871839275222246405745257275088548364400416034343698203908996009128404, + 21888242871839275222246405745257275088548364400416034343698203712688349700509, + 21888242871839275222246405745257275088548364400416034343698203781531251487547, + 21888242871839275222246405745257275088548364400416034343698204088053272795975, + 21888242871839275222246405745257275088548364400416034343698204060286333951868, + 21888242871839275222246405745257275088548364400416034343698203834894730609128, + 216951608276857, + 21888242871839275222246405745257275088548364400416034343698204069642025823092, + 21888242871839275222246405745257275088548364400416034343698204098571532971131, + 21888242871839275222246405745257275088548364400416034343698203790641251192579, + 14008855152808, + 272031540815659, + 211596434825850, + 21888242871839275222246405745257275088548364400416034343698203758753188697146, + 21888242871839275222246405745257275088548364400416034343698204096701929476766, + 21888242871839275222246405745257275088548364400416034343698204182561125448094, + 368689053574308, + 44238816937118, + 256698474814429, + 21888242871839275222246405745257275088548364400416034343698203838743658652662, + 21888242871839275222246405745257275088548364400416034343698204068550911827114, + 405200303130134, + 21888242871839275222246405745257275088548364400416034343698203846011984655524, + 357227033475148, + 21888242871839275222246405745257275088548364400416034343698203646377597830077, + 21888242871839275222246405745257275088548364400416034343698203647281233713914, + 162105729744329, + 21888242871839275222246405745257275088548364400416034343698204172156750646361, + 21888242871839275222246405745257275088548364400416034343698204002565421040685, + 21888242871839275222246405745257275088548364400416034343698204051461369011028, + 21888242871839275222246405745257275088548364400416034343698203720351674453492, + 437864582227264, + 296327752321111, + 483551036150141, + 66095455920440, + 21888242871839275222246405745257275088548364400416034343698204111356944533112, + 21888242871839275222246405745257275088548364400416034343698203800707250740126, + 320078374471666, + 508459150673839, + 21888242871839275222246405745257275088548364400416034343698204113467540849798, + 297353602915991, + 21888242871839275222246405745257275088548364400416034343698203873329762419941, + 524684526073160, + 546500049583641, + 24874923518557, + 95765759112022, + 21888242871839275222246405745257275088548364400416034343698204070714378469001, + 21888242871839275222246405745257275088548364400416034343698203985257330905233, + 21888242871839275222246405745257275088548364400416034343698203707111217269278, + 359592851809340, + 21888242871839275222246405745257275088548364400416034343698204011980719333374, + 21888242871839275222246405745257275088548364400416034343698203738273206331742, + 472746460844906, + 533752130860154, + 25990083556093, + 290533908429748, + 543376325042518, + 21888242871839275222246405745257275088548364400416034343698203864722182733439, + 21888242871839275222246405745257275088548364400416034343698203968010099691906, + 21888242871839275222246405745257275088548364400416034343698204100017673565122, + 337697966704888, + 21888242871839275222246405745257275088548364400416034343698203993972507186318, + 201652552890350, + 21888242871839275222246405745257275088548364400416034343698203680825257464250, + 21888242871839275222246405745257275088548364400416034343698203714430548378280, + 378553607213264, + 21888242871839275222246405745257275088548364400416034343698203704211417050746, + 21888242871839275222246405745257275088548364400416034343698204030605093674622, + 21888242871839275222246405745257275088548364400416034343698203817773073000880, + 21888242871839275222246405745257275088548364400416034343698203841372095028674, + 262749960912394, + 376503208753555, + 327743209655762, + 21888242871839275222246405745257275088548364400416034343698204143521830786202, + 21888242871839275222246405745257275088548364400416034343698204072588671647366, + 174519451470205, + 21888242871839275222246405745257275088548364400416034343698203737573651328993, + 59457030290832, + 269816852454127, + 423758564090781, + 500119139295214, + 21888242871839275222246405745257275088548364400416034343698204067326185193082, + 562262113917960, + 21888242871839275222246405745257275088548364400416034343698203846924480800200, + 21888242871839275222246405745257275088548364400416034343698203639579481832872, + 503235107139110, + 21888242871839275222246405745257275088548364400416034343698204123064040522053, + 21888242871839275222246405745257275088548364400416034343698203678958007286218, + 525571023368616, + 21888242871839275222246405745257275088548364400416034343698203642929361257981, + 51171965876645, + 175901697229283, + 21888242871839275222246405745257275088548364400416034343698203836894774519824, + 21888242871839275222246405745257275088548364400416034343698203711613610887498, + 235405437397978, + 21888242871839275222246405745257275088548364400416034343698203982254500034942, + 21888242871839275222246405745257275088548364400416034343698203650850342220150, + 295745904643032, + 21888242871839275222246405745257275088548364400416034343698203798531426636878, + 21888242871839275222246405745257275088548364400416034343698203651895054311234, + 318900793870083, + 181334674200384, + 15995438784275, + 394768735788488, + 21888242871839275222246405745257275088548364400416034343698203852673546886801, + 152397213155140, + 289826559895548, + 496222817663157, + 21888242871839275222246405745257275088548364400416034343698203954230182165584, + 21888242871839275222246405745257275088548364400416034343698203978186848132240, + 21888242871839275222246405745257275088548364400416034343698204152596393844253, + 77227727383569, + 435053967014136, + 4433509044615, + 21888242871839275222246405745257275088548364400416034343698204118756717316824, + 173844812592918, + 529269654949466, + 203718509598711, + 357406282919345, + 243744252530482, + 21888242871839275222246405745257275088548364400416034343698204094389391502219, + 325202629580099, + 21888242871839275222246405745257275088548364400416034343698204172384077922606, + 236851828881880, + 525751665719470, + 366881225429351, + 21888242871839275222246405745257275088548364400416034343698204178612243678300, + 202619900649099, + 229095048673731, + 431368772596389, + 269885814114550, + 21888242871839275222246405745257275088548364400416034343698203910243749937008, + 442569601081925, + 21888242871839275222246405745257275088548364400416034343698203837196056801097, + 21888242871839275222246405745257275088548364400416034343698204054893552985375, + 325112884660500, + 21888242871839275222246405745257275088548364400416034343698204096105167895970, + 458663177889372, + 188362477652804, + 21888242871839275222246405745257275088548364400416034343698203840053471255185, + 21888242871839275222246405745257275088548364400416034343698203877540901077702, + 331971694242945, + 21888242871839275222246405745257275088548364400416034343698203739524250333699, + 21888242871839275222246405745257275088548364400416034343698203871445210197682, + 21888242871839275222246405745257275088548364400416034343698203957990769848377, + 21888242871839275222246405745257275088548364400416034343698204071557519904965, + 21888242871839275222246405745257275088548364400416034343698204147461948349801, + 21888242871839275222246405745257275088548364400416034343698204184321322086824, + 8610474890091, + 544180980517150, + 368507428961945, + 87008833165937, + 451667183887344, + 396316568101804, + 21888242871839275222246405745257275088548364400416034343698203965497466583901, + 150375784041305, + 21888242871839275222246405745257275088548364400416034343698203823204852868600, + 516744344565923, + 21888242871839275222246405745257275088548364400416034343698204027690664254428, + 327410698775086, + 21888242871839275222246405745257275088548364400416034343698203626885401593629, + 408806799465063, + 262160991255253, + 21888242871839275222246405745257275088548364400416034343698203809825742141948, + 21888242871839275222246405745257275088548364400416034343698203686627491582434, + 21888242871839275222246405745257275088548364400416034343698203780899691858850, + 99091360717191, + 215672112712756, + 290844386479642, + 384493066041136, + 105379190799434, + 300672817876295, + 21888242871839275222246405745257275088548364400416034343698204176667419258829, + 154225340408503, + 338717849595709, + 21888242871839275222246405745257275088548364400416034343698204185273281699968, + 21888242871839275222246405745257275088548364400416034343698203804216143825558, + 21888242871839275222246405745257275088548364400416034343698204032519000261546, + 158087745781856, + 21888242871839275222246405745257275088548364400416034343698203678123856556520, + 130562394010423, + 21888242871839275222246405745257275088548364400416034343698203993718424005338, + 477613240037114, + 21888242871839275222246405745257275088548364400416034343698204013866161048520, + 130584597664261, + 221399653712358, + 525010095509598, + 175778646751763, + 560917881079204, + 21888242871839275222246405745257275088548364400416034343698204068447323921215, + 21888242871839275222246405745257275088548364400416034343698203655190410507160, + 21888242871839275222246405745257275088548364400416034343698203801686651063090, + 21888242871839275222246405745257275088548364400416034343698203939523727153450, + 21888242871839275222246405745257275088548364400416034343698203851509724142533, + 78323589756369, + 21888242871839275222246405745257275088548364400416034343698203911620866803930, + 21888242871839275222246405745257275088548364400416034343698203997840865322403, + 21888242871839275222246405745257275088548364400416034343698203999082859106522, + 21888242871839275222246405745257275088548364400416034343698203766274298102202, + 21888242871839275222246405745257275088548364400416034343698204092795820931367, + 21888242871839275222246405745257275088548364400416034343698203954088783033911, + 298841761204726, + 266134115983079, + 488075435529002, + 201120482763673, + 21888242871839275222246405745257275088548364400416034343698203738744430757631, + 21888242871839275222246405745257275088548364400416034343698203635911024593226, + 21888242871839275222246405745257275088548364400416034343698203792753595210546, + 378893428586292, + 21888242871839275222246405745257275088548364400416034343698204106616779632766, + 21888242871839275222246405745257275088548364400416034343698203700264483075171, + 502671261943575, + 189854576152433, + 544476172979547, + 455695145193727, + 21888242871839275222246405745257275088548364400416034343698204059044181753432, + 22708173161368, + 148398815805468, + 21888242871839275222246405745257275088548364400416034343698203752781280203984, + 301807374599424, + 543126426296029, + 250800677893542, + 219789705984112, + 21888242871839275222246405745257275088548364400416034343698203986721698014658, + 340966060146070, + 358893595438444, + 21888242871839275222246405745257275088548364400416034343698203950019448332417, + 21888242871839275222246405745257275088548364400416034343698203768753953999263, + 21888242871839275222246405745257275088548364400416034343698204025959350711684, + 161603391875606, + 21888242871839275222246405745257275088548364400416034343698204072483420976274, + 21888242871839275222246405745257275088548364400416034343698204029916367828257, + 21888242871839275222246405745257275088548364400416034343698204060224042031140, + 435303807657147, + 519647894296100, + 21888242871839275222246405745257275088548364400416034343698203767258265073229, + 21888242871839275222246405745257275088548364400416034343698203699190965911112, + 21888242871839275222246405745257275088548364400416034343698204059190141596440, + 21888242871839275222246405745257275088548364400416034343698203745192017432775, + 21888242871839275222246405745257275088548364400416034343698203934482734990337, + 21888242871839275222246405745257275088548364400416034343698204178611444507357, + 21888242871839275222246405745257275088548364400416034343698204139221332327059, + 378110829923542, + 500363888401292, + 105943148789517, + 461679681915876, + 6838812231980, + 21888242871839275222246405745257275088548364400416034343698203771985216446524, + 541920949505118, + 99074533916751, + 21888242871839275222246405745257275088548364400416034343698203648749535137301, + 109024789535318, + 21888242871839275222246405745257275088548364400416034343698203692599149232789, + 21888242871839275222246405745257275088548364400416034343698203872820273325388, + 21888242871839275222246405745257275088548364400416034343698203798258567650432, + 291744941135688, + 21888242871839275222246405745257275088548364400416034343698204156310312312893, + 77257320030850, + 473129183886589, + 17054164632974, + 21888242871839275222246405745257275088548364400416034343698203935904056115723, + 239800107088780, + 21888242871839275222246405745257275088548364400416034343698204156896748368749, + 21888242871839275222246405745257275088548364400416034343698203958514522388476, + 151384877670188, + 101325339554968, + 21888242871839275222246405745257275088548364400416034343698204073058000694628, + 21888242871839275222246405745257275088548364400416034343698203973118102977079, + 21888242871839275222246405745257275088548364400416034343698203964357458312689, + 201186797926909, + 485274958476038, + 21888242871839275222246405745257275088548364400416034343698203952014416656451, + 273792755540502, + 367880813729453, + 21888242871839275222246405745257275088548364400416034343698203945843756425872, + 138628723728979, + 21888242871839275222246405745257275088548364400416034343698203909170336605900, + 21888242871839275222246405745257275088548364400416034343698204111919033198996, + 21888242871839275222246405745257275088548364400416034343698203989435806988132, + 21888242871839275222246405745257275088548364400416034343698203894085739329681, + 242580572890528, + 455999694691395, + 64389531576857, + 21888242871839275222246405745257275088548364400416034343698204126193410447653, + 272646645621199, + 21888242871839275222246405745257275088548364400416034343698204123023357370386, + 21888242871839275222246405745257275088548364400416034343698204083888251563256, + 496916728294455, + 380046892324749, + 21888242871839275222246405745257275088548364400416034343698204087364586034442, + 99732233181626, + 21888242871839275222246405745257275088548364400416034343698203972271303393993, + 452640127700844, + 524982755179898, + 363831341483816, + 21888242871839275222246405745257275088548364400416034343698204139984264701517, + 21888242871839275222246405745257275088548364400416034343698203718174136775088, + 418955713068112, + 21888242871839275222246405745257275088548364400416034343698203902059147266069, + 326036279502500, + 46395133130094, + 415136018829031, + 430681575017827, + 50429101884830, + 247552558482097, + 21888242871839275222246405745257275088548364400416034343698204113713822488979, + 21888242871839275222246405745257275088548364400416034343698204001879650592520, + 21888242871839275222246405745257275088548364400416034343698203694291347488129, + 21888242871839275222246405745257275088548364400416034343698203785373422801253, + 362431733315759, + 21888242871839275222246405745257275088548364400416034343698204006947357080559, + 21888242871839275222246405745257275088548364400416034343698203883883470642257, + 398003259428499, + 21888242871839275222246405745257275088548364400416034343698203863927322424561, + 21888242871839275222246405745257275088548364400416034343698203813697284142915, + 21888242871839275222246405745257275088548364400416034343698203958504395917875, + 527478803558851, + 21888242871839275222246405745257275088548364400416034343698203828387471565571, + 21888242871839275222246405745257275088548364400416034343698204005096662013995, + 50791277054342, + 316522409528537, + 21888242871839275222246405745257275088548364400416034343698204120260820163839, + 21888242871839275222246405745257275088548364400416034343698204051838510795328, + 318970866906966, + 21888242871839275222246405745257275088548364400416034343698204058947948287994, + 521265459075431, + 319670818032488, + 21888242871839275222246405745257275088548364400416034343698203893711006175635, + 317845896868381, + 21888242871839275222246405745257275088548364400416034343698203702769575818302, + 21888242871839275222246405745257275088548364400416034343698203881414416724895, + 388881511005764, + 522563120467689, + 21888242871839275222246405745257275088548364400416034343698203960869390124302, + 397059617264487, + 70081447693563, + 21888242871839275222246405745257275088548364400416034343698203802655339219767, + 413633704026896, + 444427039699486, + 21888242871839275222246405745257275088548364400416034343698203746376500567793, + 12163843966689, + 32561539364617, + 21888242871839275222246405745257275088548364400416034343698203721616938274290, + 373076867337037, + 449800207760568, + 21888242871839275222246405745257275088548364400416034343698204047981300521682, + 461470908878870, + 21888242871839275222246405745257275088548364400416034343698204038819519359828, + 21888242871839275222246405745257275088548364400416034343698203869216614680972, + 71279133641336, + 21888242871839275222246405745257275088548364400416034343698203973385939060822, + 13278908766949, + 360481711505036, + 105034207015785, + 21888242871839275222246405745257275088548364400416034343698203668616052382250, + 130378823298388, + 409101635295033, + 208339185968809, + 399328581004832, + 508182941846184, + 441971962035521, + 233476969891740, + 21888242871839275222246405745257275088548364400416034343698204093880259026975, + 428820585975734, + 168176052025588, + 31423755781737, + 43636455408248, + 418450815222673, + 21888242871839275222246405745257275088548364400416034343698204158115779820835, + 21888242871839275222246405745257275088548364400416034343698203759028370236245, + 14361053528994, + 21888242871839275222246405745257275088548364400416034343698204074054688611510, + 21888242871839275222246405745257275088548364400416034343698204065838524202051, + 52542265247220, + 21888242871839275222246405745257275088548364400416034343698203965766866631732, + 419548215623855, + 524134169993569, + 171282831680316, + 156309716826362, + 21888242871839275222246405745257275088548364400416034343698204008540971047045, + 21888242871839275222246405745257275088548364400416034343698203840859057728463, + 21888242871839275222246405745257275088548364400416034343698203698464543781244, + 21888242871839275222246405745257275088548364400416034343698203852306853854296, + 94196294695524, + 515058391550275, + 21888242871839275222246405745257275088548364400416034343698203937282651856706, + 401172329251465, + 480131845800490, + 7057844711558, + 502956170019582, + 21888242871839275222246405745257275088548364400416034343698203764379610667668, + 21888242871839275222246405745257275088548364400416034343698204015293825851172, + 21888242871839275222246405745257275088548364400416034343698204038739170675937, + 34914744721557, + 21888242871839275222246405745257275088548364400416034343698203964730711632879, + 21888242871839275222246405745257275088548364400416034343698204168726584374578, + 501206492343021, + 21888242871839275222246405745257275088548364400416034343698203647946197933837, + 21888242871839275222246405745257275088548364400416034343698204024491252311211, + 21888242871839275222246405745257275088548364400416034343698203732240234064977, + 21888242871839275222246405745257275088548364400416034343698203842994590770137, + 493093448240254, + 309474002642720, + 21888242871839275222246405745257275088548364400416034343698203812064729551619, + 467198112683809, + 21888242871839275222246405745257275088548364400416034343698203666049389643542, + 21888242871839275222246405745257275088548364400416034343698203643120800301278, + 84122994346923, + 21888242871839275222246405745257275088548364400416034343698204063706685709444, + 403638834803099, + 212413063175702, + 21888242871839275222246405745257275088548364400416034343698203647900107907722, + 21888242871839275222246405745257275088548364400416034343698204018028076192652, + 21888242871839275222246405745257275088548364400416034343698203652158197029131, + 21888242871839275222246405745257275088548364400416034343698203673353544351202, + 343028883068678, + 21888242871839275222246405745257275088548364400416034343698203896661612846903, + 430591886055921, + 347273761380793, + 11882243240984, + 21888242871839275222246405745257275088548364400416034343698203944412345818772, + 406561142662507, + 21888242871839275222246405745257275088548364400416034343698203675483235280279, + 499601727971156, + 21888242871839275222246405745257275088548364400416034343698204032816410484845, + 156005459332287, + 21888242871839275222246405745257275088548364400416034343698203690578745368200, + 21888242871839275222246405745257275088548364400416034343698204163813164444421, + 21888242871839275222246405745257275088548364400416034343698203868006411630841, + 86824571091225, + 88837391860146, + 21888242871839275222246405745257275088548364400416034343698203704594651938685, + 21888242871839275222246405745257275088548364400416034343698203872246130329148, + 21888242871839275222246405745257275088548364400416034343698203876837075646382, + 465570909947108, + 157125536976838, + 362547153432285, + 458675554321754, + 21888242871839275222246405745257275088548364400416034343698203777644375553753, + 308004969578472, + 21888242871839275222246405745257275088548364400416034343698203873155304035236, + 373177501168831, + 21888242871839275222246405745257275088548364400416034343698203989470400364052, + 431783031962040, + 471747521793540, + 348261263845040, + 179708847399774, + 21888242871839275222246405745257275088548364400416034343698203982077316679123, + 21888242871839275222246405745257275088548364400416034343698204040269251083634, + 21888242871839275222246405745257275088548364400416034343698203958816652246043, + 21888242871839275222246405745257275088548364400416034343698204087556196405738, + 21888242871839275222246405745257275088548364400416034343698204013182059929153, + 234842710071038, + 217194555213274, + 21888242871839275222246405745257275088548364400416034343698204010845861518364, + 132276821180808, + 21888242871839275222246405745257275088548364400416034343698203802468737507222, + 502530310072159, + 21888242871839275222246405745257275088548364400416034343698203952881203551886, + 21888242871839275222246405745257275088548364400416034343698204038496879404615, + 278722477288868, + 318827275619750, + 21888242871839275222246405745257275088548364400416034343698203830365079250699, + 21888242871839275222246405745257275088548364400416034343698203634544926548927, + 21888242871839275222246405745257275088548364400416034343698203825868895482657, + 230605269638266, + 317162889790718, + 21888242871839275222246405745257275088548364400416034343698204131104640391089, + 21888242871839275222246405745257275088548364400416034343698203957225304897692, + 21888242871839275222246405745257275088548364400416034343698203849410107038457, + 21888242871839275222246405745257275088548364400416034343698203642362204555116, + 21888242871839275222246405745257275088548364400416034343698203988004653421847, + 21888242871839275222246405745257275088548364400416034343698204130547537517845, + 198324836282439, + 223881227030310, + 21888242871839275222246405745257275088548364400416034343698203647450283984797, + 21888242871839275222246405745257275088548364400416034343698203971718622052974, + 21888242871839275222246405745257275088548364400416034343698203918837199600956, + 453625048777114, + 21888242871839275222246405745257275088548364400416034343698204125018429854468, + 21888242871839275222246405745257275088548364400416034343698204075399335175142, + 66407931072477, + 428770386360251, + 511012041940510, + 102332330166495, + 451273238294195, + 403374382904850, + 21888242871839275222246405745257275088548364400416034343698204161020559186530, + 186128185818769, + 531333723845568, + 21888242871839275222246405745257275088548364400416034343698203746110165784552, + 445569441890840, + 21888242871839275222246405745257275088548364400416034343698203982724039079305, + 21888242871839275222246405745257275088548364400416034343698203746967844527166, + 21888242871839275222246405745257275088548364400416034343698203966886278820489, + 21888242871839275222246405745257275088548364400416034343698203789809366543391, + 21888242871839275222246405745257275088548364400416034343698204118620857731619, + 21888242871839275222246405745257275088548364400416034343698203974903865765991, + 21888242871839275222246405745257275088548364400416034343698203684654032095011, + 349929309649159, + 139761864873113, + 166455801906280, + 21160334518948, + 471264692815391, + 316103717644530, + 21888242871839275222246405745257275088548364400416034343698203952215162412202, + 68801410810964, + 21888242871839275222246405745257275088548364400416034343698203732962079314595, + 219719610487934, + 21888242871839275222246405745257275088548364400416034343698203631941246354269, + 88054206119785, + 148375351180679, + 21888242871839275222246405745257275088548364400416034343698204080694217750443, + 21888242871839275222246405745257275088548364400416034343698204063342748940911, + 353887589581852, + 467873227403440, + 21888242871839275222246405745257275088548364400416034343698204180130936910516, + 21888242871839275222246405745257275088548364400416034343698203975190800057007, + 208342372182608, + 532675142145723, + 387613434488664, + 21888242871839275222246405745257275088548364400416034343698203754808325939634, + 21888242871839275222246405745257275088548364400416034343698204095233933845176, + 551590108341786, + 244244593747244, + 21888242871839275222246405745257275088548364400416034343698204072817371623393, + 7406198072832, + 21888242871839275222246405745257275088548364400416034343698204107332050856814, + 173449551107654, + 519999567925486, + 315667738039417, + 21888242871839275222246405745257275088548364400416034343698203800538887341024, + 21888242871839275222246405745257275088548364400416034343698203651119327979556, + 21888242871839275222246405745257275088548364400416034343698204068660235601357, + 70332808597228, + 21888242871839275222246405745257275088548364400416034343698203649439171566989, + 21888242871839275222246405745257275088548364400416034343698203848645567184452, + 226700879250980, + 433213168721705, + 21888242871839275222246405745257275088548364400416034343698203888004918672857, + 21888242871839275222246405745257275088548364400416034343698203662124186060312, + 21888242871839275222246405745257275088548364400416034343698204148594415608890, + 21888242871839275222246405745257275088548364400416034343698203652480463396269, + 492400525797431, + 21888242871839275222246405745257275088548364400416034343698203945460884279661, + 21888242871839275222246405745257275088548364400416034343698203734659024007983, + 21888242871839275222246405745257275088548364400416034343698204043056103420218, + 46551473783258, + 21888242871839275222246405745257275088548364400416034343698203756067107536938, + 83550277166988, + 300740446176379, + 276902064734379, + 21888242871839275222246405745257275088548364400416034343698203664952424083106, + 21888242871839275222246405745257275088548364400416034343698203806426254775640, + 21888242871839275222246405745257275088548364400416034343698204002327515517064, + 21888242871839275222246405745257275088548364400416034343698203788519264872737, + 261860585775399, + 241645244607625, + 21888242871839275222246405745257275088548364400416034343698203846570375622789, + 207561694370448, + 271356336325884, + 344983057713393, + 21888242871839275222246405745257275088548364400416034343698204147470182557215, + 15565899089154, + 21888242871839275222246405745257275088548364400416034343698204105207347415841, + 345715626256676, + 319339753704140, + 91444038232356, + 426955755825586, + 21888242871839275222246405745257275088548364400416034343698203675562288311641, + 15657098224203, + 210805034401615, + 21888242871839275222246405745257275088548364400416034343698203725670667184150, + 469574837567851, + 154296225110463, + 88762953019741, + 49242293881452, + 21888242871839275222246405745257275088548364400416034343698203874068976267782, + 361404389621106, + 485320525617638, + 21888242871839275222246405745257275088548364400416034343698203674840006646071, + 21888242871839275222246405745257275088548364400416034343698203887100101309099, + 21888242871839275222246405745257275088548364400416034343698203983962342059708, + 21888242871839275222246405745257275088548364400416034343698204157035327949661, + 21888242871839275222246405745257275088548364400416034343698204114176858662777, + 21888242871839275222246405745257275088548364400416034343698203839205779810393, + 281345423268030, + 402035047368635, + 21888242871839275222246405745257275088548364400416034343698203799528388504366, + 21888242871839275222246405745257275088548364400416034343698204071547365587612, + 151856054774843, + 21888242871839275222246405745257275088548364400416034343698203950802231486396, + 21888242871839275222246405745257275088548364400416034343698203965617639603537, + 21888242871839275222246405745257275088548364400416034343698203764101412334003, + 21888242871839275222246405745257275088548364400416034343698203755524631867280, + 368710899158094, + 21888242871839275222246405745257275088548364400416034343698204175035742596651, + 21888242871839275222246405745257275088548364400416034343698203759741948777667, + 21888242871839275222246405745257275088548364400416034343698203743459923936722, + 21888242871839275222246405745257275088548364400416034343698203815587455627905, + 267077277918727, + 21888242871839275222246405745257275088548364400416034343698204011613100111571, + 21888242871839275222246405745257275088548364400416034343698203926043775340185, + 224262310489129, + 21888242871839275222246405745257275088548364400416034343698203982226725508482, + 325647195914181, + 21888242871839275222246405745257275088548364400416034343698203921083541589199, + 202086740754207, + 21888242871839275222246405745257275088548364400416034343698204159670650426882, + 21888242871839275222246405745257275088548364400416034343698204143396989632207, + 21888242871839275222246405745257275088548364400416034343698203674253837388558, + 21888242871839275222246405745257275088548364400416034343698203868654467920316, + 21888242871839275222246405745257275088548364400416034343698203689987975793490, + 21888242871839275222246405745257275088548364400416034343698203915303577995236, + 209009159003519, + 21888242871839275222246405745257275088548364400416034343698204059130139142791, + 21888242871839275222246405745257275088548364400416034343698203989272233462375, + 21888242871839275222246405745257275088548364400416034343698203731564710244260, + 175681982496837, + 157128790147910, + 21888242871839275222246405745257275088548364400416034343698203732107499866846, + 258829971466028, + 284210618291351, + 21888242871839275222246405745257275088548364400416034343698203829509241015994, + 21888242871839275222246405745257275088548364400416034343698203730775817685224, + 255363466597847, + 21888242871839275222246405745257275088548364400416034343698204072991630682919, + 68879725015628, + 182556847051345, + 143530478680785, + 21888242871839275222246405745257275088548364400416034343698203999071864178192, + 21888242871839275222246405745257275088548364400416034343698203820088085813449, + 21888242871839275222246405745257275088548364400416034343698203695347908688060, + 21888242871839275222246405745257275088548364400416034343698203747381193769453, + 332055504505025, + 21888242871839275222246405745257275088548364400416034343698203838990755320653, + 216776817244908, + 370514763683990, + 8248426460615, + 21888242871839275222246405745257275088548364400416034343698203867679984299038, + 428127293497826, + 21888242871839275222246405745257275088548364400416034343698203939630551281667, + 116832260332388, + 86587870990549, + 325412842542315, + 21888242871839275222246405745257275088548364400416034343698203822661672706271, + 23524344221501, + 21888242871839275222246405745257275088548364400416034343698203780456676571563, + 21888242871839275222246405745257275088548364400416034343698203660658653724128, + 145026442039408, + 21888242871839275222246405745257275088548364400416034343698203996505135239358, + 380656425051424, + 21888242871839275222246405745257275088548364400416034343698203909782820778767, + 21888242871839275222246405745257275088548364400416034343698203922437856904648, + 376382875198429, + 21888242871839275222246405745257275088548364400416034343698204135011475458048, + 404276957225492, + 406697745785896, + 21888242871839275222246405745257275088548364400416034343698203623903016977353, + 424463095539718, + 372400047893711, + 21888242871839275222246405745257275088548364400416034343698204179978009495058, + 233120467986746, + 419236398705060, + 21888242871839275222246405745257275088548364400416034343698203826957648746937, + 209615248719428, + 331113243230059, + 21888242871839275222246405745257275088548364400416034343698203814875152779234, + 21888242871839275222246405745257275088548364400416034343698204079535493047310, + 21888242871839275222246405745257275088548364400416034343698203697886497447853, + 21888242871839275222246405745257275088548364400416034343698203866401630799153, + 449536452551133, + 258789667897143, + 469658843760058, + 21888242871839275222246405745257275088548364400416034343698203860269282703487, + 21888242871839275222246405745257275088548364400416034343698203767594861956373, + 21888242871839275222246405745257275088548364400416034343698203997892947051904, + 21888242871839275222246405745257275088548364400416034343698204042519681051588, + 21888242871839275222246405745257275088548364400416034343698203667898974679596, + 249996720409205, + 496237080585929, + 21888242871839275222246405745257275088548364400416034343698203643279106125721, + 21888242871839275222246405745257275088548364400416034343698203763257606205041, + 289691644252411, + 9695012402126, + 455859631444335, + 13876540064158, + 374774186112890, + 190189197087834, + 21888242871839275222246405745257275088548364400416034343698203694007554905581, + 21888242871839275222246405745257275088548364400416034343698203772447897771683, + 21888242871839275222246405745257275088548364400416034343698203853629628285988, + 44967874011048, + 21888242871839275222246405745257275088548364400416034343698203809283489471002, + 21888242871839275222246405745257275088548364400416034343698203883312398281172, + 382109807562506, + 415198944815466, + 487682854417917, + 21888242871839275222246405745257275088548364400416034343698203744049523667251, + 120685940883117, + 28355691902095, + 376994066376535, + 21888242871839275222246405745257275088548364400416034343698203860940589571519, + 21888242871839275222246405745257275088548364400416034343698204127869138294376, + 21888242871839275222246405745257275088548364400416034343698203770037925781366, + 32498798921589, + 21888242871839275222246405745257275088548364400416034343698204085469927218802, + 21888242871839275222246405745257275088548364400416034343698204027404259107737, + 21888242871839275222246405745257275088548364400416034343698203626647376932485, + 21888242871839275222246405745257275088548364400416034343698203915962171505296, + 418501704174320, + 184361755835352, + 453127994450148, + 21888242871839275222246405745257275088548364400416034343698203654995946611911, + 21888242871839275222246405745257275088548364400416034343698203795455296944672, + 21888242871839275222246405745257275088548364400416034343698203962367464587613, + 21888242871839275222246405745257275088548364400416034343698203871104005537082, + 374781543421626, + 328186024799985, + 21888242871839275222246405745257275088548364400416034343698204070560709006449, + 21888242871839275222246405745257275088548364400416034343698204152050169869919, + 21888242871839275222246405745257275088548364400416034343698204153046067855547, + 367824842351019, + 81910573881468, + 220489424600543, + 266010597721712, + 295225211924030, + 21888242871839275222246405745257275088548364400416034343698203775289707833738, + 21888242871839275222246405745257275088548364400416034343698203898396647941971, + 21888242871839275222246405745257275088548364400416034343698203965042226753819, + 21888242871839275222246405745257275088548364400416034343698203741631878042834, + 21888242871839275222246405745257275088548364400416034343698204177471434066882, + 21888242871839275222246405745257275088548364400416034343698204127082784459363, + 225137547347031, + 21888242871839275222246405745257275088548364400416034343698203885767133914259, + 21888242871839275222246405745257275088548364400416034343698203707725812632603, + 21888242871839275222246405745257275088548364400416034343698203843281490106933, + 128987493185658, + 86564682114777, + 21888242871839275222246405745257275088548364400416034343698204107158177189636, + 553162966513540, + 521029920528220, + 21888242871839275222246405745257275088548364400416034343698204024826926320652, + 21888242871839275222246405745257275088548364400416034343698204073684121919647, + 21888242871839275222246405745257275088548364400416034343698203952866065323935, + 22393774168464, + 21888242871839275222246405745257275088548364400416034343698204098428728099459, + 21888242871839275222246405745257275088548364400416034343698203633846091882173, + 21888242871839275222246405745257275088548364400416034343698203889680494131945, + 69431567614582, + 531066364246035, + 21888242871839275222246405745257275088548364400416034343698204097300176923427, + 21888242871839275222246405745257275088548364400416034343698203830918035420605, + 21888242871839275222246405745257275088548364400416034343698204104058338801862, + 302929283173111, + 459885382922455, + 21888242871839275222246405745257275088548364400416034343698203983025420537791, + 243958781011377, + 347812839357696, + 539017439963552, + 21888242871839275222246405745257275088548364400416034343698204055617522423139, + 21888242871839275222246405745257275088548364400416034343698204071101529392049, + 21888242871839275222246405745257275088548364400416034343698203782062884993468, + 383782809652919, + 386897524141571, + 21888242871839275222246405745257275088548364400416034343698203950176909557911, + 21888242871839275222246405745257275088548364400416034343698203979460285548808, + 21888242871839275222246405745257275088548364400416034343698203801188111020993, + 21888242871839275222246405745257275088548364400416034343698203780131836758313, + 504763100770559, + 21888242871839275222246405745257275088548364400416034343698203974041375393164, + 21888242871839275222246405745257275088548364400416034343698204125782525649915, + 50390931967688, + 21888242871839275222246405745257275088548364400416034343698203695367143540765, + 21888242871839275222246405745257275088548364400416034343698204116742390906592, + 21888242871839275222246405745257275088548364400416034343698204081218143537834, + 21888242871839275222246405745257275088548364400416034343698204121168609067287, + 21888242871839275222246405745257275088548364400416034343698203991792902302083, + 551310825312024, + 423628356078340, + 77050773591890, + 21888242871839275222246405745257275088548364400416034343698204150331809872764, + 21888242871839275222246405745257275088548364400416034343698203858128487985867, + 288817812090320, + 21888242871839275222246405745257275088548364400416034343698204081786611031609, + 21888242871839275222246405745257275088548364400416034343698203961065632488768, + 343261515957614, + 477897828726076, + 21888242871839275222246405745257275088548364400416034343698203862459372800966, + 21888242871839275222246405745257275088548364400416034343698204040922047720496, + 39995638358050, + 21888242871839275222246405745257275088548364400416034343698203983106712566554, + 67578563737636, + 21888242871839275222246405745257275088548364400416034343698203867655553836052, + 99009518484230, + 21888242871839275222246405745257275088548364400416034343698203773870796335845, + 21888242871839275222246405745257275088548364400416034343698203809239813101913, + 196386597268448, + 79466704658876, + 21888242871839275222246405745257275088548364400416034343698203982536890427792, + 21888242871839275222246405745257275088548364400416034343698203693102865577597, + 246544901846855, + 21888242871839275222246405745257275088548364400416034343698204183405625496280, + 21888242871839275222246405745257275088548364400416034343698203733228025452102, + 345633468044999, + 21888242871839275222246405745257275088548364400416034343698203648622083809028, + 21888242871839275222246405745257275088548364400416034343698203640694906787647, + 446021338238824, + 21888242871839275222246405745257275088548364400416034343698203682883957601253, + 267826656398032, + 21888242871839275222246405745257275088548364400416034343698203728899834446730, + 21888242871839275222246405745257275088548364400416034343698204074005347958007, + 21888242871839275222246405745257275088548364400416034343698203712600139080673, + 452215261242179, + 318211604966088, + 263738098149622, + 320751415258017, + 283049472714505, + 21888242871839275222246405745257275088548364400416034343698203934927405381628, + 560780049734860, + 21888242871839275222246405745257275088548364400416034343698203903963910425446, + 21888242871839275222246405745257275088548364400416034343698204173884188464063, + 47561043506279, + 130548891274163, + 21888242871839275222246405745257275088548364400416034343698203824986762502484, + 76590444237575, + 65391062564861, + 21888242871839275222246405745257275088548364400416034343698204017236615144346, + 239854359377641, + 21888242871839275222246405745257275088548364400416034343698203715416458083383, + 21888242871839275222246405745257275088548364400416034343698203684163186957858, + 325066655300097, + 336054805762744, + 21888242871839275222246405745257275088548364400416034343698204075883116621670, + 108495094760112, + 329004820350807, + 21888242871839275222246405745257275088548364400416034343698204108010854852087, + 9477967225686, + 239300079570820, + 274407400646710, + 454418984603376, + 21888242871839275222246405745257275088548364400416034343698204089972056418431, + 390934260770900, + 316691065988005, + 21888242871839275222246405745257275088548364400416034343698203986081413755998, + 21888242871839275222246405745257275088548364400416034343698203768831451914403, + 330848167578533, + 21888242871839275222246405745257275088548364400416034343698204063881598249343, + 21888242871839275222246405745257275088548364400416034343698204135305756166559, + 21888242871839275222246405745257275088548364400416034343698203868908901000640, + 525631759949020, + 21888242871839275222246405745257275088548364400416034343698203957974882269694, + 21888242871839275222246405745257275088548364400416034343698203983503718021190, + 21888242871839275222246405745257275088548364400416034343698203668172464312933, + 21888242871839275222246405745257275088548364400416034343698203884322355751690, + 482433060941842, + 189130692472780, + 21888242871839275222246405745257275088548364400416034343698203869782173691871, + 366834516169300, + 260165640209534, + 389796878382801, + 21888242871839275222246405745257275088548364400416034343698203756196971921430, + 319224422475972, + 21888242871839275222246405745257275088548364400416034343698204117812748427536, + 21888242871839275222246405745257275088548364400416034343698204023556987700357, + 21888242871839275222246405745257275088548364400416034343698204025182572837906, + 21888242871839275222246405745257275088548364400416034343698203852535864395635, + 21888242871839275222246405745257275088548364400416034343698203936472628236390, + 491611975880912, + 21888242871839275222246405745257275088548364400416034343698203914028841631162, + 21888242871839275222246405745257275088548364400416034343698203808388067848328, + 21888242871839275222246405745257275088548364400416034343698203712570794410453, + 129063998495914, + 21888242871839275222246405745257275088548364400416034343698203638117940297503, + 117678317392921, + 296150494658585, + 259812954860336, + 196768498289520, + 21888242871839275222246405745257275088548364400416034343698204166205196490136, + 21888242871839275222246405745257275088548364400416034343698203670630322832371, + 358620918018680, + 510251889419232, + 21888242871839275222246405745257275088548364400416034343698203933087368545054, + 56752799227789, + 302067651127643, + 340744709553116, + 460165031815116, + 21888242871839275222246405745257275088548364400416034343698204099529617179395, + 21888242871839275222246405745257275088548364400416034343698203790321502553727, + 545683669862192, + 21888242871839275222246405745257275088548364400416034343698203989719834274501, + 256335176582151, + 490950455555727, + 21888242871839275222246405745257275088548364400416034343698203726880144602107, + 75002231607190, + 21888242871839275222246405745257275088548364400416034343698203903764542784909, + 21888242871839275222246405745257275088548364400416034343698203698805613760997, + 21888242871839275222246405745257275088548364400416034343698203985137371380722, + 300470661870510, + 21888242871839275222246405745257275088548364400416034343698203970942514736940, + 516341961525291, + 21888242871839275222246405745257275088548364400416034343698203968317419088451, + 53858643563040, + 489982784962788, + 377325849051932, + 71474661313096, + 505338618066086, + 21888242871839275222246405745257275088548364400416034343698204176927769252456, + 21888242871839275222246405745257275088548364400416034343698203973388126308091, + 21888242871839275222246405745257275088548364400416034343698203779146089956818, + 351491471605821, + 21888242871839275222246405745257275088548364400416034343698203829715512130654, + 50191996299556, + 21888242871839275222246405745257275088548364400416034343698204077451105331790, + 21888242871839275222246405745257275088548364400416034343698203817079046567276, + 298181185903515, + 244921085792995, + 287916895215674, + 21888242871839275222246405745257275088548364400416034343698204096068221403702, + 319691125131373, + 21888242871839275222246405745257275088548364400416034343698203880628034458084, + 21888242871839275222246405745257275088548364400416034343698203640649079137518, + 21888242871839275222246405745257275088548364400416034343698203958574146060447, + 21888242871839275222246405745257275088548364400416034343698203654592473130735, + 21888242871839275222246405745257275088548364400416034343698203901788387030574, + 263443651091578, + 21888242871839275222246405745257275088548364400416034343698203971181378974319, + 178021772739614, + 299645253039613, + 21888242871839275222246405745257275088548364400416034343698203824176746054378, + 73332040032914, + 418139695259483, + 21888242871839275222246405745257275088548364400416034343698204065540694282618, + 21888242871839275222246405745257275088548364400416034343698203792184718525302, + 21888242871839275222246405745257275088548364400416034343698204065010023281971, + 21888242871839275222246405745257275088548364400416034343698203980645994135238, + 193925660800602, + 21888242871839275222246405745257275088548364400416034343698204138954617946108, + 21888242871839275222246405745257275088548364400416034343698203840480774435245, + 21888242871839275222246405745257275088548364400416034343698204001666970893071, + 321677721904704, + 21888242871839275222246405745257275088548364400416034343698204061146600234619, + 21888242871839275222246405745257275088548364400416034343698203953119207903819, + 21888242871839275222246405745257275088548364400416034343698204012266420299217, + 250594114511483, + 314185327670662, + 21888242871839275222246405745257275088548364400416034343698204163740723453768, + 515820077004283, + 510469986199722, + 21888242871839275222246405745257275088548364400416034343698204014174883666251, + 21888242871839275222246405745257275088548364400416034343698204136487608194571, + 284767557038783, + 320715857601398, + 290681395145567, + 37226974704666, + 21888242871839275222246405745257275088548364400416034343698203762310993152222, + 76409558143869, + 126420954506060, + 342562717382057, + 21888242871839275222246405745257275088548364400416034343698203791878443164862, + 21888242871839275222246405745257275088548364400416034343698203626911806785594, + 459887814476380, + 26288637016122, + 424372983052067, + 404830651952140, + 21888242871839275222246405745257275088548364400416034343698204063626451877976, + 562437327527017, + 204667198767588, + 445750525715798, + 312955466349709, + 21888242871839275222246405745257275088548364400416034343698204007672431898736, + 21888242871839275222246405745257275088548364400416034343698203939173470501318, + 446500426664751, + 366050055933229, + 115381822255134, + 21888242871839275222246405745257275088548364400416034343698203715524006428859, + 2856287419002, + 21888242871839275222246405745257275088548364400416034343698203857459663492656, + 21888242871839275222246405745257275088548364400416034343698203942271800940987, + 21888242871839275222246405745257275088548364400416034343698203949024519319470, + 21888242871839275222246405745257275088548364400416034343698204066803833935509, + 244472906134421, + 21888242871839275222246405745257275088548364400416034343698203890996270486357, + 21888242871839275222246405745257275088548364400416034343698203715461267394202, + 21888242871839275222246405745257275088548364400416034343698203681806345835286, + 21888242871839275222246405745257275088548364400416034343698204178410682513987, + 21888242871839275222246405745257275088548364400416034343698203953650304734564, + 471707068442895, + 21888242871839275222246405745257275088548364400416034343698203649348845365474, + 79922687597488, + 248298538800417, + 442967803994346, + 21888242871839275222246405745257275088548364400416034343698203718104502510070, + 21888242871839275222246405745257275088548364400416034343698203999933861261708, + 21888242871839275222246405745257275088548364400416034343698203739167292871043, + 114810175781740, + 21888242871839275222246405745257275088548364400416034343698203713698797968516, + 21888242871839275222246405745257275088548364400416034343698204174093350787629, + 308203817483477, + 21888242871839275222246405745257275088548364400416034343698203678579280166397, + 21888242871839275222246405745257275088548364400416034343698203787617287440254, + 102303953503851, + 140759880955970, + 146929631749104, + 546398396532892, + 317424552275231, + 303107573982089, + 21888242871839275222246405745257275088548364400416034343698203667350207026338, + 492511845262705, + 21888242871839275222246405745257275088548364400416034343698203972438074143086, + 21288204619005, + 266692766428461, + 304812284445765, + 21888242871839275222246405745257275088548364400416034343698203853054149152460, + 267864050491989, + 21888242871839275222246405745257275088548364400416034343698204106028104314163, + 21888242871839275222246405745257275088548364400416034343698203832839450641831, + 21888242871839275222246405745257275088548364400416034343698203974641750841725, + 308588786263013, + 21888242871839275222246405745257275088548364400416034343698203888815131038611, + 21888242871839275222246405745257275088548364400416034343698203696220625214079, + 237787216143650, + 112722106511163, + 304884193574688, + 133681973748622, + 21888242871839275222246405745257275088548364400416034343698204097552468192160, + 338210787811322, + 60646892288586, + 12501282899143, + 21888242871839275222246405745257275088548364400416034343698203903607892624290, + 316481530977092, + 21888242871839275222246405745257275088548364400416034343698203974981580238536, + 21888242871839275222246405745257275088548364400416034343698204027622459565571, + 235926178692927, + 159665314346766, + 21888242871839275222246405745257275088548364400416034343698204140271418774391, + 21888242871839275222246405745257275088548364400416034343698203685854001517207, + 75880207440142, + 21888242871839275222246405745257275088548364400416034343698203873689122940441, + 21888242871839275222246405745257275088548364400416034343698204012768660089168, + 21888242871839275222246405745257275088548364400416034343698203759616394774512, + 182999143314864, + 225250302597910, + 21888242871839275222246405745257275088548364400416034343698203675706400416870, + 21888242871839275222246405745257275088548364400416034343698204114227184755935, + 541681858762224, + 424270390740343, + 479058477416480, + 21888242871839275222246405745257275088548364400416034343698203847516060516095, + 137599130840568, + 21888242871839275222246405745257275088548364400416034343698203946727891959391, + 21888242871839275222246405745257275088548364400416034343698203923482819871305, + 229876011247038, + 21888242871839275222246405745257275088548364400416034343698204117533196375816, + 21888242871839275222246405745257275088548364400416034343698204185182849982228, + 47489632517575, + 515183266859031, + 48673732471270, + 21888242871839275222246405745257275088548364400416034343698203891136138727076, + 21888242871839275222246405745257275088548364400416034343698204063040173760622, + 456021568015686, + 301402969518062, + 40606469458511, + 406704190090008, + 21888242871839275222246405745257275088548364400416034343698203762423672704393, + 142589909490602, + 21888242871839275222246405745257275088548364400416034343698204098934943950883, + 524232354229144, + 34282149056697, + 21888242871839275222246405745257275088548364400416034343698204011877222632328, + 21888242871839275222246405745257275088548364400416034343698204023995900505499, + 21888242871839275222246405745257275088548364400416034343698203995456153282069, + 253366869242178, + 21888242871839275222246405745257275088548364400416034343698203921852151676028, + 21888242871839275222246405745257275088548364400416034343698203995646734615508, + 21888242871839275222246405745257275088548364400416034343698204053493606494850, + 58613349513078, + 163600027134240, + 21888242871839275222246405745257275088548364400416034343698204168749563686015, + 21888242871839275222246405745257275088548364400416034343698204141346981927493, + 195274283875881, + 21888242871839275222246405745257275088548364400416034343698203752738336162790, + 441499680886593, + 21888242871839275222246405745257275088548364400416034343698204058450233886763, + 254811877871319, + 21888242871839275222246405745257275088548364400416034343698203975824442102859, + 21888242871839275222246405745257275088548364400416034343698203873009664519921, + 258322861274313, + 21888242871839275222246405745257275088548364400416034343698204031397542475927, + 21888242871839275222246405745257275088548364400416034343698204085962884763846, + 310824660317727, + 21888242871839275222246405745257275088548364400416034343698203890770329903716, + 21888242871839275222246405745257275088548364400416034343698203743653364305170, + 21888242871839275222246405745257275088548364400416034343698203805285658508548, + 446206717665968, + 21888242871839275222246405745257275088548364400416034343698203710223074125994, + 445350301413212, + 2143582334606, + 21888242871839275222246405745257275088548364400416034343698203878077861439428, + 21888242871839275222246405745257275088548364400416034343698203734841443576503, + 239272363987915, + 21888242871839275222246405745257275088548364400416034343698203698911957958955, + 331130626545025, + 21888242871839275222246405745257275088548364400416034343698203775064761796521, + 21888242871839275222246405745257275088548364400416034343698204095312483408895, + 21888242871839275222246405745257275088548364400416034343698203630914718493961, + 438158603809471, + 28294798709863, + 551037315893067, + 21888242871839275222246405745257275088548364400416034343698204035785230021343, + 517849859761569, + 21888242871839275222246405745257275088548364400416034343698204129776334268132, + 140834227815763, + 21888242871839275222246405745257275088548364400416034343698204180207724168346, + 163020267309458, + 21888242871839275222246405745257275088548364400416034343698203923379063763228, + 188584217700683, + 479444608317046, + 254903629400184, + 21888242871839275222246405745257275088548364400416034343698203724679581767574, + 485498846549025, + 21888242871839275222246405745257275088548364400416034343698203877318519026963, + 467404746628749, + 104366242606195, + 36423030685845, + 23631516293624, + 511704020040104, + 21888242871839275222246405745257275088548364400416034343698203759650048289140, + 21888242871839275222246405745257275088548364400416034343698204048921655604236, + 21888242871839275222246405745257275088548364400416034343698203926952759571997, + 264973362841658, + 114853102350869, + 21888242871839275222246405745257275088548364400416034343698203794978307528607, + 21888242871839275222246405745257275088548364400416034343698203667779369983829, + 182706797818030, + 355945845113352, + 21888242871839275222246405745257275088548364400416034343698203890218764604846, + 317988524789763, + 367343512474727, + 21888242871839275222246405745257275088548364400416034343698204092034260270971, + 21888242871839275222246405745257275088548364400416034343698203994381905558838, + 21888242871839275222246405745257275088548364400416034343698203772517337496256, + 489061504079647, + 21888242871839275222246405745257275088548364400416034343698203894929024370169, + 21888242871839275222246405745257275088548364400416034343698204073593760465682, + 280880372770845, + 230943193578387, + 21888242871839275222246405745257275088548364400416034343698204148177870324561, + 161790610719990, + 213456641473680, + 246163539321500, + 406696430627398, + 543268929535254, + 21888242871839275222246405745257275088548364400416034343698203936756954349074, + 21888242871839275222246405745257275088548364400416034343698203749260011102351, + 21888242871839275222246405745257275088548364400416034343698203885506941669576, + 21888242871839275222246405745257275088548364400416034343698203700625261974427, + 6450504404145, + 390446124024722, + 436733387391198, + 21888242871839275222246405745257275088548364400416034343698203956074691053409, + 121206345386519, + 406437545696770, + 21888242871839275222246405745257275088548364400416034343698203818031116553248, + 21888242871839275222246405745257275088548364400416034343698204042600749475402, + 145684250394933, + 21888242871839275222246405745257275088548364400416034343698203694281368880657, + 527131961647437, + 21888242871839275222246405745257275088548364400416034343698204157980440125053, + 466482912940481, + 21888242871839275222246405745257275088548364400416034343698204124850916821141, + 344377161573969, + 21888242871839275222246405745257275088548364400416034343698203821585254169472, + 21888242871839275222246405745257275088548364400416034343698203723163822973375, + 21888242871839275222246405745257275088548364400416034343698203743633594276597, + 21888242871839275222246405745257275088548364400416034343698203983935630303718, + 21888242871839275222246405745257275088548364400416034343698203714819979418684, + 395807695584101, + 21888242871839275222246405745257275088548364400416034343698204117773403707881, + 132721634935930, + 21888242871839275222246405745257275088548364400416034343698204082453949497719, + 21888242871839275222246405745257275088548364400416034343698203713028558216872, + 21888242871839275222246405745257275088548364400416034343698203790548833389904, + 21888242871839275222246405745257275088548364400416034343698204077689130256049, + 99275904098918, + 21888242871839275222246405745257275088548364400416034343698204148984198638484, + 532260453428323, + 21888242871839275222246405745257275088548364400416034343698203664141895051904, + 21888242871839275222246405745257275088548364400416034343698204128038025203470, + 21888242871839275222246405745257275088548364400416034343698204109021970809480, + 21888242871839275222246405745257275088548364400416034343698203992786054141747, + 21888242871839275222246405745257275088548364400416034343698204053770738245822, + 21888242871839275222246405745257275088548364400416034343698203811764864299983, + 21888242871839275222246405745257275088548364400416034343698203836639511039649, + 38714175921236, + 455707774034754, + 21888242871839275222246405745257275088548364400416034343698203835899879737754, + 536722940244902, + 60931838320399, + 21888242871839275222246405745257275088548364400416034343698203945491139042985, + 544830648841190, + 21888242871839275222246405745257275088548364400416034343698204021342218824129, + 21888242871839275222246405745257275088548364400416034343698204164351488586995, + 21888242871839275222246405745257275088548364400416034343698203675267899975040, + 498266013120170, + 21888242871839275222246405745257275088548364400416034343698203853309063625981, + 424045793006601, + 436997115380040, + 285574181956259, + 233059873664907, + 21888242871839275222246405745257275088548364400416034343698204090875938535949, + 386195086195638, + 546786385610883, + 21888242871839275222246405745257275088548364400416034343698204122770377278004, + 21888242871839275222246405745257275088548364400416034343698204053917426531055, + 21888242871839275222246405745257275088548364400416034343698203709375700943611, + 447779267476428, + 44761258298444, + 21888242871839275222246405745257275088548364400416034343698203907292541801403, + 21888242871839275222246405745257275088548364400416034343698203645741571740165, + 21888242871839275222246405745257275088548364400416034343698203980017486957997, + 193890806509535, + 21888242871839275222246405745257275088548364400416034343698203914632168574386, + 312404954250077, + 21888242871839275222246405745257275088548364400416034343698204140340700727281, + 340803649977301, + 446754436597639, + 104609266270324, + 470759990788037, + 453738603822353, + 242365296662642, + 184928291514177, + 21888242871839275222246405745257275088548364400416034343698203950232602293746, + 125765367325398, + 471715319753259, + 237296919779832, + 21888242871839275222246405745257275088548364400416034343698204181084784331311, + 21888242871839275222246405745257275088548364400416034343698203911634018581487, + 21888242871839275222246405745257275088548364400416034343698203970094592759076, + 417704155832855, + 366747691039403, + 328547590236963, + 123936460409341, + 21888242871839275222246405745257275088548364400416034343698203836054586794233, + 541928283906678, + 21888242871839275222246405745257275088548364400416034343698203913463972488964, + 21888242871839275222246405745257275088548364400416034343698204123725320855564, + 21888242871839275222246405745257275088548364400416034343698203906017620156898, + 504413031000596, + 500235013336155, + 57380038150345, + 21888242871839275222246405745257275088548364400416034343698204025411642273212, + 32159439904908, + 216076454504784, + 21888242871839275222246405745257275088548364400416034343698203910494602860873, + 21888242871839275222246405745257275088548364400416034343698204071393093065479, + 21888242871839275222246405745257275088548364400416034343698203835393887411613, + 223880868279713, + 21888242871839275222246405745257275088548364400416034343698204037112316251779, + 135436150615193, + 21888242871839275222246405745257275088548364400416034343698203782059899865610, + 21888242871839275222246405745257275088548364400416034343698203953941066671863, + 123297289662412, + 21888242871839275222246405745257275088548364400416034343698204069021512586247, + 21888242871839275222246405745257275088548364400416034343698203768811801053403, + 21888242871839275222246405745257275088548364400416034343698204011404954582775, + 351431470418518, + 333286307146346, + 21888242871839275222246405745257275088548364400416034343698203862565904598840, + 245277345793081, + 130323592513023, + 21888242871839275222246405745257275088548364400416034343698204133565903090758, + 303185896677289, + 169733444979875, + 21888242871839275222246405745257275088548364400416034343698203854885869315454, + 21888242871839275222246405745257275088548364400416034343698203755169477458825, + 274369641016031, + 271652272472376, + 21888242871839275222246405745257275088548364400416034343698204106160622997309, + 21888242871839275222246405745257275088548364400416034343698204139380269081756, + 386492577391520, + 556752127649197, + 202276219379900, + 139659131735550, + 21888242871839275222246405745257275088548364400416034343698203883590469068598, + 21888242871839275222246405745257275088548364400416034343698203907833232754321, + 21888242871839275222246405745257275088548364400416034343698203631295694930536, + 398205720959359, + 21888242871839275222246405745257275088548364400416034343698204154788072160420, + 283771803287126, + 21888242871839275222246405745257275088548364400416034343698204080938351866700, + 454088338496962, + 151997996807484, + 21888242871839275222246405745257275088548364400416034343698203780936055337305, + 309402800737721, + 21888242871839275222246405745257275088548364400416034343698204172585298420140, + 434294846951817, + 21888242871839275222246405745257275088548364400416034343698204123593209869758, + 21888242871839275222246405745257275088548364400416034343698204134008585705217, + 21888242871839275222246405745257275088548364400416034343698204134313659365303, + 242030881282765, + 21888242871839275222246405745257275088548364400416034343698203781641762453829, + 21888242871839275222246405745257275088548364400416034343698203971948273882245, + 21888242871839275222246405745257275088548364400416034343698203949153753367691, + 21888242871839275222246405745257275088548364400416034343698203810189953308443, + 508553997488152, + 21888242871839275222246405745257275088548364400416034343698203709679619837744, + 460401092291394, + 426799430956509, + 21888242871839275222246405745257275088548364400416034343698203823007854489430, + 21888242871839275222246405745257275088548364400416034343698203639095954026677, + 21888242871839275222246405745257275088548364400416034343698203727738235662297, + 405706041632501, + 21888242871839275222246405745257275088548364400416034343698203889084679596177, + 21888242871839275222246405745257275088548364400416034343698203778218757997500, + 21888242871839275222246405745257275088548364400416034343698203642184299167498, + 513112220512486, + 17371361181925, + 518435741008510, + 21888242871839275222246405745257275088548364400416034343698203715142333955838, + 419454229046156, + 408594245650616, + 21888242871839275222246405745257275088548364400416034343698203688752285729565, + 21888242871839275222246405745257275088548364400416034343698203989395133668029, + 200465792241961, + 478592991808705, + 497704923546999, + 273273965063587, + 21888242871839275222246405745257275088548364400416034343698204185285900329254, + 21888242871839275222246405745257275088548364400416034343698204072117324785351, + 348150107329044, + 21888242871839275222246405745257275088548364400416034343698203628179339538628, + 21888242871839275222246405745257275088548364400416034343698203873711411631826, + 21888242871839275222246405745257275088548364400416034343698203730002791651629, + 555564727496206, + 320881687712017, + 353123380722100, + 21888242871839275222246405745257275088548364400416034343698203788355077102925, + 21888242871839275222246405745257275088548364400416034343698204064180564843509, + 74897470167015, + 254533477222393, + 21888242871839275222246405745257275088548364400416034343698204021965471895842, + 84077406237066, + 461119669152295, + 484389770570115, + 21888242871839275222246405745257275088548364400416034343698203802366532865595, + 325170876578734, + 21888242871839275222246405745257275088548364400416034343698203956488581809024, + 317993693307447, + 21888242871839275222246405745257275088548364400416034343698203630534223393046, + 21888242871839275222246405745257275088548364400416034343698204180049424499385, + 21888242871839275222246405745257275088548364400416034343698203700073000571940, + 21888242871839275222246405745257275088548364400416034343698204044736387919662, + 21888242871839275222246405745257275088548364400416034343698203712492890483454, + 21888242871839275222246405745257275088548364400416034343698203946668290469646, + 21888242871839275222246405745257275088548364400416034343698203774650043988715, + 336527887913235, + 21888242871839275222246405745257275088548364400416034343698203647224938313198, + 484941592247741, + 21888242871839275222246405745257275088548364400416034343698204076687327627965, + 21888242871839275222246405745257275088548364400416034343698203655798400121789, + 323336877958294, + 21888242871839275222246405745257275088548364400416034343698203777010962769385, + 21888242871839275222246405745257275088548364400416034343698203923364068589599, + 21888242871839275222246405745257275088548364400416034343698203718215565592164, + 21888242871839275222246405745257275088548364400416034343698203837654259979362, + 21888242871839275222246405745257275088548364400416034343698203774188528486229, + 21888242871839275222246405745257275088548364400416034343698203674127274474357, + 110705380590671, + 422230645856544, + 500030796271566, + 21888242871839275222246405745257275088548364400416034343698204150774638288257, + 10252191100057, + 369829203048361, + 21888242871839275222246405745257275088548364400416034343698204118178776827305, + 21888242871839275222246405745257275088548364400416034343698203967883720075926, + 262600550357220, + 21888242871839275222246405745257275088548364400416034343698203966053095086678, + 20404772092686, + 99441075899926, + 440821099679511, + 391939327100394, + 21888242871839275222246405745257275088548364400416034343698204051486575552078, + 57799770111748, + 86472398009475, + 547128203872392, + 21888242871839275222246405745257275088548364400416034343698203866638311445680, + 21888242871839275222246405745257275088548364400416034343698204112715486674291, + 457070032471885, + 21888242871839275222246405745257275088548364400416034343698203737731845633427, + 21888242871839275222246405745257275088548364400416034343698203759554419073988, + 21888242871839275222246405745257275088548364400416034343698203862847155157209, + 21888242871839275222246405745257275088548364400416034343698203881280386000272, + 21888242871839275222246405745257275088548364400416034343698203790692744724621, + 360193110372038, + 265023778087251, + 510831961779373, + 21888242871839275222246405745257275088548364400416034343698204074114015243802, + 159267041429291, + 180344679666841, + 21888242871839275222246405745257275088548364400416034343698204174000416775433, + 21888242871839275222246405745257275088548364400416034343698204143824996186726, + 285972442366743, + 21888242871839275222246405745257275088548364400416034343698204080266501610823, + 21888242871839275222246405745257275088548364400416034343698204073982153038093, + 21888242871839275222246405745257275088548364400416034343698204136533907829509, + 256750257950781, + 3663600900674, + 21888242871839275222246405745257275088548364400416034343698204055406180452330, + 226143224228921, + 21888242871839275222246405745257275088548364400416034343698204181440852112263, + 522756495048632, + 21888242871839275222246405745257275088548364400416034343698203977398091047497, + 21888242871839275222246405745257275088548364400416034343698203869135932898262, + 354368620473557, + 157055530058660, + 471504168829981, + 21888242871839275222246405745257275088548364400416034343698203847870094652482, + 216734603536386, + 21888242871839275222246405745257275088548364400416034343698203704399906419695, + 21888242871839275222246405745257275088548364400416034343698203909014936240799, + 244544280908366, + 249605342946718, + 21888242871839275222246405745257275088548364400416034343698203979252412048041, + 168621036745993, + 21888242871839275222246405745257275088548364400416034343698203890831626515445, + 21888242871839275222246405745257275088548364400416034343698203818142863299351, + 553652466829745, + 21888242871839275222246405745257275088548364400416034343698204120414204165076, + 21888242871839275222246405745257275088548364400416034343698203998212989274606, + 21888242871839275222246405745257275088548364400416034343698204036563836649854, + 21888242871839275222246405745257275088548364400416034343698204175799247074986, + 380512487745024, + 21888242871839275222246405745257275088548364400416034343698203716165723499017, + 21888242871839275222246405745257275088548364400416034343698204033880571031062, + 367697541661829, + 21888242871839275222246405745257275088548364400416034343698203638554977586677, + 117341389874459, + 21888242871839275222246405745257275088548364400416034343698203761264600133266, + 411612697354803, + 239143854004503, + 83017855350191, + 21888242871839275222246405745257275088548364400416034343698203830431434756622, + 346643863939297, + 396507061727915, + 95322934316569, + 100742954600475, + 285610468355591, + 383518421643129, + 21888242871839275222246405745257275088548364400416034343698203761696852193792, + 245542572185814, + 21888242871839275222246405745257275088548364400416034343698203916721101235577, + 21888242871839275222246405745257275088548364400416034343698204033438101641485, + 491057310233399, + 21888242871839275222246405745257275088548364400416034343698203937218381662294, + 188183898720336, + 150372088463395, + 21888242871839275222246405745257275088548364400416034343698203695079800511468, + 21888242871839275222246405745257275088548364400416034343698203777837880568130, + 476038018851916, + 21888242871839275222246405745257275088548364400416034343698203674021320774639, + 350819413008547, + 91684294519645, + 164756531706018, + 560678060149297, + 548483445679211, + 21888242871839275222246405745257275088548364400416034343698203801218174846639, + 505749630803235, + 506846253410495, + 25599556723380, + 21888242871839275222246405745257275088548364400416034343698204128646781105907, + 21888242871839275222246405745257275088548364400416034343698203996616706694347, + 21888242871839275222246405745257275088548364400416034343698204006245673886588, + 402405355374034, + 467820541189732, + 250367978385665, + 117092587093565, + 44724639565661, + 21888242871839275222246405745257275088548364400416034343698203636611562890073, + 21888242871839275222246405745257275088548364400416034343698204078797836733615, + 140656083643245, + 21888242871839275222246405745257275088548364400416034343698203901219573369111, + 154332741157473, + 21888242871839275222246405745257275088548364400416034343698204130048552931357, + 169877609213430, + 122484012990969, + 342057165416851, + 21888242871839275222246405745257275088548364400416034343698203813229975683235, + 495874661875167, + 480413132167947, + 21888242871839275222246405745257275088548364400416034343698204019770037878632, + 21888242871839275222246405745257275088548364400416034343698203865515365483609, + 126060389142732, + 21888242871839275222246405745257275088548364400416034343698203901338009675146, + 21888242871839275222246405745257275088548364400416034343698203946680542148910, + 21888242871839275222246405745257275088548364400416034343698203658761670030050, + 21888242871839275222246405745257275088548364400416034343698203806391665692894, + 21888242871839275222246405745257275088548364400416034343698204006728410320556, + 464633513619767, + 21888242871839275222246405745257275088548364400416034343698204167459941654774, + 75433061606475, + 21888242871839275222246405745257275088548364400416034343698203770488065989550, + 261708856822467, + 21888242871839275222246405745257275088548364400416034343698203899978411545779, + 47012454081689, + 534369451367609, + 21888242871839275222246405745257275088548364400416034343698203906716276871592, + 21888242871839275222246405745257275088548364400416034343698204146047296498722, + 363043082882398, + 20628281785106, + 21888242871839275222246405745257275088548364400416034343698203772248204674299, + 269586651901733, + 388527679962843, + 21888242871839275222246405745257275088548364400416034343698203866046591319222, + 153713455908627, + 21888242871839275222246405745257275088548364400416034343698204009984839818475, + 21888242871839275222246405745257275088548364400416034343698203670597267104404, + 345747071623269, + 21888242871839275222246405745257275088548364400416034343698203679227357128591, + 21888242871839275222246405745257275088548364400416034343698203803350726668897, + 509257022727980, + 137303438301912, + 21888242871839275222246405745257275088548364400416034343698203816663888306513, + 556187425036613, + 441063782975336, + 198192881378026, + 336975470903148, + 262989100036164, + 21888242871839275222246405745257275088548364400416034343698203683336996844984, + 99191140253037, + 342560841458824, + 21888242871839275222246405745257275088548364400416034343698203976160931774398, + 21888242871839275222246405745257275088548364400416034343698203744164158473226, + 21888242871839275222246405745257275088548364400416034343698203698451417638595, + 177710532392899, + 21888242871839275222246405745257275088548364400416034343698203750937247538356, + 21888242871839275222246405745257275088548364400416034343698203947098308873954, + 444794089472953, + 32300149606600, + 331236087649212, + 21888242871839275222246405745257275088548364400416034343698203799423739072930, + 21888242871839275222246405745257275088548364400416034343698204016272359231247, + 21888242871839275222246405745257275088548364400416034343698203948871437257816, + 21888242871839275222246405745257275088548364400416034343698203805185800347948, + 352522554644997, + 21888242871839275222246405745257275088548364400416034343698204061719061273613, + 6567686033087, + 20790506700753, + 21888242871839275222246405745257275088548364400416034343698203910376081359920, + 293276047433011, + 257368438854196, + 21888242871839275222246405745257275088548364400416034343698204070182046456087, + 421015259453064, + 545384256643062, + 470812745997381, + 21888242871839275222246405745257275088548364400416034343698203851314694337381, + 208521164401602, + 167239426390411, + 21888242871839275222246405745257275088548364400416034343698203931590523593160, + 21888242871839275222246405745257275088548364400416034343698203657091811259539, + 21888242871839275222246405745257275088548364400416034343698203665969274647862, + 135856619866268, + 299309807670197, + 21888242871839275222246405745257275088548364400416034343698203801747445985564, + 468329935232503, + 547264171545932, + 352448838816939, + 516190045826373, + 48819231500469, + 407141496304925, + 21888242871839275222246405745257275088548364400416034343698204051978452722692, + 21888242871839275222246405745257275088548364400416034343698204064676911952767, + 21888242871839275222246405745257275088548364400416034343698204105848944569021, + 21888242871839275222246405745257275088548364400416034343698203940883558461855, + 445453877797880, + 466473134130124, + 21888242871839275222246405745257275088548364400416034343698204145932954075425, + 231556655080199, + 495059336224280, + 446182614362278, + 21888242871839275222246405745257275088548364400416034343698203714858234393021, + 21888242871839275222246405745257275088548364400416034343698203654317747506727, + 125137579521100, + 340860086858373, + 310385183056316, + 165410912558532, + 21888242871839275222246405745257275088548364400416034343698203847492075164488, + 182707775727100, + 21888242871839275222246405745257275088548364400416034343698203809267529827944, + 21888242871839275222246405745257275088548364400416034343698203626472193946754, + 2291107069204, + 235381637596576, + 21888242871839275222246405745257275088548364400416034343698204011938453611153, + 75772572353195, + 21888242871839275222246405745257275088548364400416034343698203866629961698582, + 149393851877018, + 21888242871839275222246405745257275088548364400416034343698204032469852150970, + 383822764124905, + 545837017592252, + 21888242871839275222246405745257275088548364400416034343698203877557304314507, + 168314628179676, + 21888242871839275222246405745257275088548364400416034343698203785269272448279, + 298027776846510, + 26082303666769, + 21888242871839275222246405745257275088548364400416034343698203867951934670015, + 21888242871839275222246405745257275088548364400416034343698203891191328200985, + 111877749375006, + 19703793263083, + 240170584467518, + 131811937888150, + 21888242871839275222246405745257275088548364400416034343698204141413444006793, + 164695580603553, + 21888242871839275222246405745257275088548364400416034343698204141367392617330, + 418169433183356, + 21888242871839275222246405745257275088548364400416034343698203990883728349401, + 379979359728960, + 21888242871839275222246405745257275088548364400416034343698204150668322147979, + 21888242871839275222246405745257275088548364400416034343698203958089167885574, + 21888242871839275222246405745257275088548364400416034343698203884536256990830, + 21888242871839275222246405745257275088548364400416034343698203733014791912359, + 126118252921938, + 21888242871839275222246405745257275088548364400416034343698204182750459082821, + 21888242871839275222246405745257275088548364400416034343698204151305641861024, + 21888242871839275222246405745257275088548364400416034343698203796116529186688, + 21888242871839275222246405745257275088548364400416034343698203666992076246208, + 512751562340541, + 79110939782457, + 21888242871839275222246405745257275088548364400416034343698203765020914483492, + 21888242871839275222246405745257275088548364400416034343698203742876530999766, + 341872118513646, + 21888242871839275222246405745257275088548364400416034343698203892274221342025, + 519977122851009, + 21888242871839275222246405745257275088548364400416034343698203795937626276441, + 21888242871839275222246405745257275088548364400416034343698203745862242202223, + 485814811188332, + 386027785970892, + 203323679282323, + 21888242871839275222246405745257275088548364400416034343698204165052697893553, + 21888242871839275222246405745257275088548364400416034343698203934158878239773, + 510838637948851, + 21888242871839275222246405745257275088548364400416034343698204002848270713226, + 21888242871839275222246405745257275088548364400416034343698203984463165501961, + 21888242871839275222246405745257275088548364400416034343698203715777931276091, + 142480010037581, + 192287470755178, + 21888242871839275222246405745257275088548364400416034343698204180626450848572, + 21888242871839275222246405745257275088548364400416034343698204082419012723721, + 21888242871839275222246405745257275088548364400416034343698204042139889669890, + 10028993802939, + 93254646865112, + 142136445729969, + 176434919114027, + 241449109749854, + 21888242871839275222246405745257275088548364400416034343698203873140873644898, + 394428561092570, + 21888242871839275222246405745257275088548364400416034343698203929732913327136, + 271175671170821, + 21888242871839275222246405745257275088548364400416034343698203631529460069767, + 21888242871839275222246405745257275088548364400416034343698204100019714910602, + 21888242871839275222246405745257275088548364400416034343698204071350601188340, + 21888242871839275222246405745257275088548364400416034343698203849709994277779, + 88474031152854, + 127443051594192, + 454734329075382, + 83143365966108, + 21888242871839275222246405745257275088548364400416034343698204011892667982238, + 21888242871839275222246405745257275088548364400416034343698203751392691659174, + 21888242871839275222246405745257275088548364400416034343698204074610122019937, + 21888242871839275222246405745257275088548364400416034343698203981698984152535, + 21888242871839275222246405745257275088548364400416034343698203798080511350111, + 376251065475704, + 21888242871839275222246405745257275088548364400416034343698203952867800699135, + 192455781496173, + 324487216116693, + 238402271222816, + 132593657292833, + 289397798686940, + 21888242871839275222246405745257275088548364400416034343698203774969753888464, + 19031359235818, + 21888242871839275222246405745257275088548364400416034343698203773346059550728, + 21888242871839275222246405745257275088548364400416034343698204030821228921727, + 21888242871839275222246405745257275088548364400416034343698203754649834108586, + 21888242871839275222246405745257275088548364400416034343698203680591892215345, + 46314571073561, + 21888242871839275222246405745257275088548364400416034343698203730126938288250, + 21888242871839275222246405745257275088548364400416034343698203835201096082895, + 291561110509060, + 92447476319678, + 21888242871839275222246405745257275088548364400416034343698203943133511311599, + 27175324432464, + 3250530901484, + 21888242871839275222246405745257275088548364400416034343698203940603218142028, + 377885964630716, + 21888242871839275222246405745257275088548364400416034343698203742897861112425, + 558092666523720, + 21888242871839275222246405745257275088548364400416034343698203683830198241758, + 21888242871839275222246405745257275088548364400416034343698203720417522894682, + 534152216636837, + 30356698032644, + 21888242871839275222246405745257275088548364400416034343698204049467272679708, + 283474713657742, + 366983206192650, + 67016336917459, + 125546555597456, + 191885036477018, + 217625107153732, + 21888242871839275222246405745257275088548364400416034343698203903367371637654, + 21888242871839275222246405745257275088548364400416034343698203743528324753764, + 178433426040252, + 21888242871839275222246405745257275088548364400416034343698204142799650586397, + 21888242871839275222246405745257275088548364400416034343698203924228145278883, + 360445057729440, + 56255293934318, + 169491867963463, + 533637509042074, + 556972892067316, + 21888242871839275222246405745257275088548364400416034343698203668851838201167, + 21888242871839275222246405745257275088548364400416034343698203893656170997067, + 21888242871839275222246405745257275088548364400416034343698203744722271298472, + 21888242871839275222246405745257275088548364400416034343698204001828185133220, + 491221540483916, + 266957882895098, + 21888242871839275222246405745257275088548364400416034343698203966313064537245, + 109510468882093, + 21888242871839275222246405745257275088548364400416034343698203966224141574823, + 21888242871839275222246405745257275088548364400416034343698204027058840012865, + 52358451015135, + 191227279876679, + 411084156106215, + 118599231484358, + 21888242871839275222246405745257275088548364400416034343698203940877074837716, + 559479141770450, + 21888242871839275222246405745257275088548364400416034343698203885806771395520, + 21888242871839275222246405745257275088548364400416034343698203939515295825586, + 303557329459027, + 130965360346199, + 85272915937427, + 392206746849164, + 135495328338385, + 287959687039014, + 481566914804161, + 21888242871839275222246405745257275088548364400416034343698203639859688759500, + 268837885398954, + 21888242871839275222246405745257275088548364400416034343698203635273636753165, + 21888242871839275222246405745257275088548364400416034343698204123541994644374, + 83007327201801, + 21888242871839275222246405745257275088548364400416034343698203945063575373091, + 333989407733185, + 166260175678534, + 21888242871839275222246405745257275088548364400416034343698203864332954344458, + 466239112769711, + 21888242871839275222246405745257275088548364400416034343698203852297784834590, + 21888242871839275222246405745257275088548364400416034343698203967688661358585, + 397143936677399, + 21888242871839275222246405745257275088548364400416034343698203814911787762775, + 21888242871839275222246405745257275088548364400416034343698204132254553735836, + 21888242871839275222246405745257275088548364400416034343698203936824233667703, + 21888242871839275222246405745257275088548364400416034343698203740147633377667, + 184252462081441, + 21888242871839275222246405745257275088548364400416034343698203768851471478009, + 21888242871839275222246405745257275088548364400416034343698204068148605338163, + 412850360547061, + 21888242871839275222246405745257275088548364400416034343698203972579434655007, + 21888242871839275222246405745257275088548364400416034343698204114068537865327, + 374252589014898, + 465028197059509, + 112570734166848, + 538356722566964, + 21888242871839275222246405745257275088548364400416034343698203775565072310436, + 495310331929116, + 21888242871839275222246405745257275088548364400416034343698204084054776085951, + 491597093475463, + 21888242871839275222246405745257275088548364400416034343698204133713823428948, + 431546553949071, + 21888242871839275222246405745257275088548364400416034343698203648753037771094, + 108604389962849, + 417519398166319, + 21888242871839275222246405745257275088548364400416034343698203747248483184047, + 21888242871839275222246405745257275088548364400416034343698203882931951765908, + 183389197459347, + 21888242871839275222246405745257275088548364400416034343698203684550100864462, + 21888242871839275222246405745257275088548364400416034343698203665666902003998, + 378342565870457, + 21888242871839275222246405745257275088548364400416034343698204070138396965833, + 391092577049590, + 21888242871839275222246405745257275088548364400416034343698203708961456592341, + 21888242871839275222246405745257275088548364400416034343698203772371414448230, + 21888242871839275222246405745257275088548364400416034343698204082857367521787, + 163999725102266, + 21888242871839275222246405745257275088548364400416034343698204054822490312235, + 21888242871839275222246405745257275088548364400416034343698203979339272834602, + 322048580226852, + 21888242871839275222246405745257275088548364400416034343698203883972913345219, + 104199518748540, + 71824251659702, + 261216627210194, + 32918787174888, + 21888242871839275222246405745257275088548364400416034343698203956511181638528, + 193471508437258, + 144272298285404, + 167239443667269, + 21888242871839275222246405745257275088548364400416034343698204111968114533331, + 185945726029101, + 21888242871839275222246405745257275088548364400416034343698204041848986141394, + 131642893575892, + 21888242871839275222246405745257275088548364400416034343698203858204938540201, + 333600551062247, + 171802842621785, + 21888242871839275222246405745257275088548364400416034343698203723847171546420, + 21888242871839275222246405745257275088548364400416034343698203688343993473835, + 21888242871839275222246405745257275088548364400416034343698204127465801081094, + 177967042443188, + 550489389969866, + 21888242871839275222246405745257275088548364400416034343698203998743288137949, + 21888242871839275222246405745257275088548364400416034343698203833819306042855, + 245989509367179, + 21888242871839275222246405745257275088548364400416034343698204173548748341630, + 416263880572400, + 353042125967703, + 21888242871839275222246405745257275088548364400416034343698204020205668949025, + 1350909850964, + 345837135353144, + 199561674956489, + 21888242871839275222246405745257275088548364400416034343698203904244657101449, + 451558186547531, + 267454966602263, + 273710107528534, + 204922438854988, + 21888242871839275222246405745257275088548364400416034343698203850256353074735, + 21888242871839275222246405745257275088548364400416034343698204019901755819537, + 88952360025715, + 455197875299373, + 101487232319540, + 21888242871839275222246405745257275088548364400416034343698204116311765512151, + 541514772635589, + 377392933116566, + 15266978420446, + 21888242871839275222246405745257275088548364400416034343698203650887729793808, + 286688864823362, + 289347432031552, + 21888242871839275222246405745257275088548364400416034343698203756724679241126, + 295652834813408, + 555187824110177, + 170332038856864, + 258920908403229, + 510471330540283, + 192670390386250, + 123544641387067, + 21888242871839275222246405745257275088548364400416034343698203925303101444015, + 21888242871839275222246405745257275088548364400416034343698203896666489782801, + 21888242871839275222246405745257275088548364400416034343698204144502047450407, + 168731610449593, + 109426055355751, + 21888242871839275222246405745257275088548364400416034343698203664100052556791, + 21888242871839275222246405745257275088548364400416034343698204119642497611940, + 21888242871839275222246405745257275088548364400416034343698204084374811214364, + 531247852473444, + 93519168873606, + 460646735698193, + 21888242871839275222246405745257275088548364400416034343698203887422306453150, + 166048383950742, + 99392090283073, + 21888242871839275222246405745257275088548364400416034343698203901738183109425, + 21888242871839275222246405745257275088548364400416034343698204009345110747236, + 21888242871839275222246405745257275088548364400416034343698204107128250780958, + 188860585726122, + 21888242871839275222246405745257275088548364400416034343698204159630840093479, + 21888242871839275222246405745257275088548364400416034343698203981018686885916, + 147785382078040, + 21888242871839275222246405745257275088548364400416034343698204056232054173807, + 21888242871839275222246405745257275088548364400416034343698203672225247290643, + 279205258676918, + 21888242871839275222246405745257275088548364400416034343698203929781630884976, + 21888242871839275222246405745257275088548364400416034343698203846047373438791, + 21888242871839275222246405745257275088548364400416034343698203889739234489428, + 561995345645577, + 145571446559119, + 21888242871839275222246405745257275088548364400416034343698203881165089091374, + 21888242871839275222246405745257275088548364400416034343698203695119615954170, + 21888242871839275222246405745257275088548364400416034343698203706894715171637, + 129324861259965, + 345428454329683, + 21888242871839275222246405745257275088548364400416034343698204028453808785747, + 169751114842587, + 343788067216919, + 21888242871839275222246405745257275088548364400416034343698203899417780974957, + 21888242871839275222246405745257275088548364400416034343698203660757329948706, + 21888242871839275222246405745257275088548364400416034343698204118577424242321, + 488475641994855, + 556262355447359, + 155160508556121, + 21888242871839275222246405745257275088548364400416034343698203801710797221705, + 290231032730534, + 21888242871839275222246405745257275088548364400416034343698203887991245430615, + 451306973225812, + 530426555654405, + 21888242871839275222246405745257275088548364400416034343698203867805377491232, + 21888242871839275222246405745257275088548364400416034343698203702708937717621, + 377786972854716, + 460003275234356, + 465875818469309, + 21888242871839275222246405745257275088548364400416034343698203664614032717319, + 356385686638872, + 21888242871839275222246405745257275088548364400416034343698203963388554906373, + 21888242871839275222246405745257275088548364400416034343698203687966192058491, + 465162364981425, + 21888242871839275222246405745257275088548364400416034343698204185869260561561, + 45056077443947, + 40490687011538, + 21888242871839275222246405745257275088548364400416034343698203941195989063039, + 21888242871839275222246405745257275088548364400416034343698203877763689845988, + 244291713491510, + 140814961693275, + 21888242871839275222246405745257275088548364400416034343698203902959966537020, + 21888242871839275222246405745257275088548364400416034343698203905724675347773, + 21888242871839275222246405745257275088548364400416034343698204164773014296975, + 21888242871839275222246405745257275088548364400416034343698204182587626253219, + 21888242871839275222246405745257275088548364400416034343698204139496854482810, + 309763516009486, + 204255809901808, + 21888242871839275222246405745257275088548364400416034343698204166298502499059, + 343093394432710, + 21888242871839275222246405745257275088548364400416034343698203803045793305643, + 21888242871839275222246405745257275088548364400416034343698203887812295079486, + 21888242871839275222246405745257275088548364400416034343698204155212141503593, + 21888242871839275222246405745257275088548364400416034343698204135345699066808, + 164915959072273, + 146098938162882, + 89556449014567, + 21888242871839275222246405745257275088548364400416034343698203736626153949403, + 239199450430889, + 4890796198194, + 255465353603016, + 153298137454606, + 21888242871839275222246405745257275088548364400416034343698203659350870362673, + 21888242871839275222246405745257275088548364400416034343698203914829589108393, + 21888242871839275222246405745257275088548364400416034343698203667531092242649, + 21888242871839275222246405745257275088548364400416034343698203893830831928933, + 246829084571049, + 21888242871839275222246405745257275088548364400416034343698203692145750060513, + 21888242871839275222246405745257275088548364400416034343698203650891228688920, + 33517645497879, + 169611078647931, + 21888242871839275222246405745257275088548364400416034343698203879222778637528, + 21888242871839275222246405745257275088548364400416034343698203730917956442680, + 24025771193605, + 28423983471321, + 171259311204864, + 65756366711723, + 21888242871839275222246405745257275088548364400416034343698203659118114158693, + 21888242871839275222246405745257275088548364400416034343698203878857904147931, + 21888242871839275222246405745257275088548364400416034343698204115487216405697, + 21888242871839275222246405745257275088548364400416034343698204053425678875702, + 21888242871839275222246405745257275088548364400416034343698204068179384638784, + 21888242871839275222246405745257275088548364400416034343698203917659712528680, + 235776701350126, + 21888242871839275222246405745257275088548364400416034343698204007923302842249, + 21888242871839275222246405745257275088548364400416034343698203979359654058093, + 21888242871839275222246405745257275088548364400416034343698204043235486863706, + 430293357020967, + 252540318628015, + 21888242871839275222246405745257275088548364400416034343698203861000070047365, + 254190329764228, + 21888242871839275222246405745257275088548364400416034343698204019358465775418, + 21888242871839275222246405745257275088548364400416034343698204047873719349345, + 277405067247327, + 21888242871839275222246405745257275088548364400416034343698203914120812404735, + 21888242871839275222246405745257275088548364400416034343698203649455798877973, + 21888242871839275222246405745257275088548364400416034343698203740864140847457, + 511662438031514, + 290433198119355, + 21888242871839275222246405745257275088548364400416034343698204126931812384061, + 522603269991739, + 21888242871839275222246405745257275088548364400416034343698203911397447281105, + 421737158893841, + 329528230728049, + 21888242871839275222246405745257275088548364400416034343698203856961886559219, + 157009377173894, + 183936922362685, + 346168644217838, + 56803104066378, + 537715494074708, + 21888242871839275222246405745257275088548364400416034343698203636555024932657, + 181284899265527, + 21888242871839275222246405745257275088548364400416034343698203794848857783102, + 21888242871839275222246405745257275088548364400416034343698204157184215756350, + 250406568684128, + 187820129903877, + 100775673931734, + 32648825410024, + 195619702758397, + 352858294162128, + 5105394522431, + 292046691710820, + 65928788392749, + 21888242871839275222246405745257275088548364400416034343698203629844084020069, + 110459457052571, + 21888242871839275222246405745257275088548364400416034343698203895527561189682, + 302210062316019, + 130396894921846, + 349361231051378, + 21888242871839275222246405745257275088548364400416034343698204173907840701486, + 21888242871839275222246405745257275088548364400416034343698204079145390665341, + 275509061503801, + 21888242871839275222246405745257275088548364400416034343698203693559177297457, + 21888242871839275222246405745257275088548364400416034343698203743855631646638, + 21888242871839275222246405745257275088548364400416034343698203838667312827279, + 446270646621407, + 231779113391780, + 24627646829426, + 21888242871839275222246405745257275088548364400416034343698203790408860754126, + 10115314339412, + 493485845922549, + 21888242871839275222246405745257275088548364400416034343698204067905815883673, + 161971398586658, + 301709962162214, + 446332446887402, + 116826243072891, + 21888242871839275222246405745257275088548364400416034343698203766234116880275, + 210526866696184, + 502516036003517, + 384339594173692, + 21888242871839275222246405745257275088548364400416034343698204074770071947088, + 558564538322954, + 21888242871839275222246405745257275088548364400416034343698203866328760509588, + 21888242871839275222246405745257275088548364400416034343698203886158922916442, + 490303503838662, + 21888242871839275222246405745257275088548364400416034343698203822338068177954, + 21888242871839275222246405745257275088548364400416034343698203633485365099028, + 21888242871839275222246405745257275088548364400416034343698203728277287555423, + 448343200158664, + 21888242871839275222246405745257275088548364400416034343698204170937848974251, + 381126683473458, + 466825022762334, + 21888242871839275222246405745257275088548364400416034343698203723367500348551, + 218904712177651, + 279353289208537, + 388670559626375, + 438184514740346, + 21888242871839275222246405745257275088548364400416034343698203987282393460245, + 21888242871839275222246405745257275088548364400416034343698204084239339921549, + 21888242871839275222246405745257275088548364400416034343698204043921041302712, + 21888242871839275222246405745257275088548364400416034343698203913034297953396, + 135744205373967, + 21888242871839275222246405745257275088548364400416034343698203719493499838204, + 87670856180409, + 550449764344913, + 237077262674922, + 228581622276862, + 21888242871839275222246405745257275088548364400416034343698203943598334532379, + 21888242871839275222246405745257275088548364400416034343698203745952795884545, + 21888242871839275222246405745257275088548364400416034343698203969763506504760, + 21888242871839275222246405745257275088548364400416034343698204162357516379363, + 409624151822562, + 21888242871839275222246405745257275088548364400416034343698203855051959693126, + 21888242871839275222246405745257275088548364400416034343698204182343146917322, + 224825437643773, + 196468801063756, + 365913116994102, + 21888242871839275222246405745257275088548364400416034343698204127318588887632, + 21888242871839275222246405745257275088548364400416034343698204139111872773782, + 545905038398660, + 106635122446051, + 480631027092329, + 21888242871839275222246405745257275088548364400416034343698204164323633071505, + 177611355137375, + 21888242871839275222246405745257275088548364400416034343698203794637361772102, + 137126623092666, + 21888242871839275222246405745257275088548364400416034343698204054605094812833, + 494823484516968, + 21888242871839275222246405745257275088548364400416034343698203974063170508247, + 539624740848979, + 21888242871839275222246405745257275088548364400416034343698203726586192810333, + 21888242871839275222246405745257275088548364400416034343698204157104809782145, + 21888242871839275222246405745257275088548364400416034343698203806113892972547, + 21888242871839275222246405745257275088548364400416034343698204049714123716242, + 21888242871839275222246405745257275088548364400416034343698203676263277730077, + 548353075857856, + 21888242871839275222246405745257275088548364400416034343698203732107266500279, + 21888242871839275222246405745257275088548364400416034343698204121376707561388, + 21888242871839275222246405745257275088548364400416034343698203992914655567233, + 504314931349123, + 260373170929797, + 21888242871839275222246405745257275088548364400416034343698203933690515257358, + 94661929263675, + 21888242871839275222246405745257275088548364400416034343698203743763597559331, + 312831094435072, + 21888242871839275222246405745257275088548364400416034343698203773481534803089, + 137212854368994, + 501821665794244, + 117972060448046, + 21888242871839275222246405745257275088548364400416034343698203793806645004354, + 398905277312528, + 21888242871839275222246405745257275088548364400416034343698203710547414336116, + 235472365411814, + 488178495658665, + 21888242871839275222246405745257275088548364400416034343698204126108386370897, + 83253470062977, + 14020399380493, + 21888242871839275222246405745257275088548364400416034343698204163331157212174, + 243382403603191, + 432191261237206, + 21888242871839275222246405745257275088548364400416034343698204075642348317975, + 21888242871839275222246405745257275088548364400416034343698203911842592640297, + 435160010405120, + 516533381232478, + 332625666702811, + 21888242871839275222246405745257275088548364400416034343698203633543725800717, + 21888242871839275222246405745257275088548364400416034343698204070391177178296, + 21888242871839275222246405745257275088548364400416034343698203834085377998637, + 21888242871839275222246405745257275088548364400416034343698204105522730826597, + 532212319519407, + 21888242871839275222246405745257275088548364400416034343698203786508736111815, + 292899996455145, + 328495598341440, + 21888242871839275222246405745257275088548364400416034343698203822646336253247, + 21888242871839275222246405745257275088548364400416034343698203979523214556082, + 21888242871839275222246405745257275088548364400416034343698204061260678141410, + 433989981321597, + 21888242871839275222246405745257275088548364400416034343698203857261193612978, + 361095718572477, + 21888242871839275222246405745257275088548364400416034343698203724909909757169, + 202712841843490, + 21888242871839275222246405745257275088548364400416034343698203724954728696977, + 11641810923790, + 21888242871839275222246405745257275088548364400416034343698204091311407441610, + 21888242871839275222246405745257275088548364400416034343698203892527666414301, + 21888242871839275222246405745257275088548364400416034343698203959789459704785, + 47227067282275, + 470506785347461, + 192287199028301, + 41195325982856, + 19989120987644, + 21888242871839275222246405745257275088548364400416034343698203730633381041081, + 21888242871839275222246405745257275088548364400416034343698204068593998003596, + 63041838804754, + 310977746324412, + 21888242871839275222246405745257275088548364400416034343698203626987613696938, + 21888242871839275222246405745257275088548364400416034343698204083923362685145, + 21888242871839275222246405745257275088548364400416034343698203911652113398260, + 297945867103263, + 21888242871839275222246405745257275088548364400416034343698204095947145299698, + 21888242871839275222246405745257275088548364400416034343698203738171665727379, + 21888242871839275222246405745257275088548364400416034343698203691787682397467, + 535863984914295, + 510985058925139, + 533223114180068, + 192546519113079, + 21888242871839275222246405745257275088548364400416034343698203773508190195307, + 452894901819177, + 21888242871839275222246405745257275088548364400416034343698203770701594992398, + 133388621013059, + 21888242871839275222246405745257275088548364400416034343698204103284160658143, + 21888242871839275222246405745257275088548364400416034343698204035181360379936, + 287379198218492, + 21888242871839275222246405745257275088548364400416034343698204024433132588493, + 425963119456611, + 403463809933220, + 21888242871839275222246405745257275088548364400416034343698204143128533178909, + 500298727573028, + 145369580541434, + 442551728914343, + 278860637370869, + 480516900381541, + 21888242871839275222246405745257275088548364400416034343698204153915839389571, + 387429713463597, + 21888242871839275222246405745257275088548364400416034343698204144418979750455, + 21888242871839275222246405745257275088548364400416034343698203749636014753066, + 21888242871839275222246405745257275088548364400416034343698203854107687473006, + 21888242871839275222246405745257275088548364400416034343698203689594900753010, + 21888242871839275222246405745257275088548364400416034343698204158322566900186, + 394454237082710, + 502402475232877, + 71634784398854, + 21888242871839275222246405745257275088548364400416034343698204029537516460283, + 21888242871839275222246405745257275088548364400416034343698204186213232361247, + 21888242871839275222246405745257275088548364400416034343698203661697529937802, + 21888242871839275222246405745257275088548364400416034343698203893679917028812, + 21888242871839275222246405745257275088548364400416034343698204009127118243592, + 21888242871839275222246405745257275088548364400416034343698203746420387765797, + 21888242871839275222246405745257275088548364400416034343698203911845042737720, + 21888242871839275222246405745257275088548364400416034343698203752118218969841, + 21888242871839275222246405745257275088548364400416034343698203919579567643828, + 21888242871839275222246405745257275088548364400416034343698203801689947709155, + 21888242871839275222246405745257275088548364400416034343698203798613431700674, + 370835496688444, + 21888242871839275222246405745257275088548364400416034343698203803287094623898, + 515995808086845, + 194126581409019, + 319859530012181, + 148409415451485, + 480813876322029, + 21888242871839275222246405745257275088548364400416034343698203977296119071021, + 21888242871839275222246405745257275088548364400416034343698203831729478382548, + 14669736117196, + 242130753588242, + 381295780416357, + 21888242871839275222246405745257275088548364400416034343698203772923599645648, + 493162873342832, + 353478287859767, + 265686326292591, + 21888242871839275222246405745257275088548364400416034343698204185438017888795, + 434271616434079, + 21888242871839275222246405745257275088548364400416034343698204068419007395999, + 21888242871839275222246405745257275088548364400416034343698203838226082309348, + 21888242871839275222246405745257275088548364400416034343698204141072925341969, + 21888242871839275222246405745257275088548364400416034343698203723257608898430, + 185716208841646, + 21888242871839275222246405745257275088548364400416034343698204156070865547042, + 21888242871839275222246405745257275088548364400416034343698204052136262802649, + 194368759517753, + 21888242871839275222246405745257275088548364400416034343698203873330581393226, + 21888242871839275222246405745257275088548364400416034343698204031161611237852, + 21888242871839275222246405745257275088548364400416034343698203927614544140476, + 123356938627238, + 533124998965386, + 49438203105205, + 372603972066942, + 344868838495232, + 141741643466434, + 229878575885289, + 21888242871839275222246405745257275088548364400416034343698204147901614249539, + 21888242871839275222246405745257275088548364400416034343698204084084708436496, + 21888242871839275222246405745257275088548364400416034343698203898257941927378, + 21888242871839275222246405745257275088548364400416034343698203802048305236004, + 21888242871839275222246405745257275088548364400416034343698203892484149112108, + 21888242871839275222246405745257275088548364400416034343698203855240756107844, + 21888242871839275222246405745257275088548364400416034343698203786010805823087, + 219023991744074, + 21888242871839275222246405745257275088548364400416034343698203789973052156016, + 387130456634714, + 257192258229958, + 145228500010086, + 155858136176027, + 481348543472059, + 68992709260684, + 21888242871839275222246405745257275088548364400416034343698203634243447414611, + 21888242871839275222246405745257275088548364400416034343698203841311023795674, + 43898709299705, + 73525302650884, + 351126448322164, + 21888242871839275222246405745257275088548364400416034343698203869175478753526, + 21888242871839275222246405745257275088548364400416034343698203925637391803808, + 474636923407322, + 496911691227966, + 21888242871839275222246405745257275088548364400416034343698203718652903084120, + 203599627392852, + 248390899896556, + 159908850168509, + 21888242871839275222246405745257275088548364400416034343698204050426576550182, + 21888242871839275222246405745257275088548364400416034343698203674703832599087, + 21888242871839275222246405745257275088548364400416034343698203996745186309468, + 59046302513939, + 120697844182021, + 207041114360793, + 458710092526900, + 21888242871839275222246405745257275088548364400416034343698203867213658317212, + 21888242871839275222246405745257275088548364400416034343698203639733756301992, + 21888242871839275222246405745257275088548364400416034343698203817852105512781, + 21888242871839275222246405745257275088548364400416034343698204143859344849578, + 498528460933933, + 380572584806983, + 220215618690169, + 21888242871839275222246405745257275088548364400416034343698203671533268603583, + 23409958692875, + 21888242871839275222246405745257275088548364400416034343698204025800118882284, + 151128348822320, + 74029580990274, + 21888242871839275222246405745257275088548364400416034343698204150396738031056, + 21888242871839275222246405745257275088548364400416034343698203793602033221119, + 309131622965568, + 21888242871839275222246405745257275088548364400416034343698203980474456432257, + 21888242871839275222246405745257275088548364400416034343698203866346088782531, + 21888242871839275222246405745257275088548364400416034343698203737457029413604, + 2382470622176, + 453016511498306, + 526708062335451, + 454676172160909, + 21888242871839275222246405745257275088548364400416034343698204098593694077541, + 142443265553403, + 162416277889089, + 513201133567686, + 491924256632584, + 21888242871839275222246405745257275088548364400416034343698203698542390273308, + 21888242871839275222246405745257275088548364400416034343698203836256637521295, + 75444301522555, + 21888242871839275222246405745257275088548364400416034343698204178605047943535, + 228531731189063, + 21888242871839275222246405745257275088548364400416034343698204114749382915821, + 21888242871839275222246405745257275088548364400416034343698203774486395264612, + 21888242871839275222246405745257275088548364400416034343698203834641468063879, + 15975026459723, + 230467661580087, + 21888242871839275222246405745257275088548364400416034343698203990046716652402, + 21888242871839275222246405745257275088548364400416034343698204165564921401458, + 195287910157049, + 321911585425099, + 411583187691702, + 144132925371181, + 21888242871839275222246405745257275088548364400416034343698203941418283779787, + 21888242871839275222246405745257275088548364400416034343698203883471711340428, + 21888242871839275222246405745257275088548364400416034343698203886890842306975, + 21888242871839275222246405745257275088548364400416034343698203857563670892012, + 316451254002325, + 527266737711426, + 341821363085514, + 21888242871839275222246405745257275088548364400416034343698203757883718904691, + 21888242871839275222246405745257275088548364400416034343698204067418851825021, + 401216365317367, + 21888242871839275222246405745257275088548364400416034343698203826239185844793, + 67177423336360, + 21888242871839275222246405745257275088548364400416034343698203825175247691671, + 462590854478526, + 21888242871839275222246405745257275088548364400416034343698203735391739985993, + 248478029602859, + 410428294395276, + 21888242871839275222246405745257275088548364400416034343698204154358995694163, + 21888242871839275222246405745257275088548364400416034343698203887770518190506, + 441921695043186, + 21888242871839275222246405745257275088548364400416034343698203989731020231693, + 481006283601540, + 98264813936435, + 541266008091729, + 21888242871839275222246405745257275088548364400416034343698203813447233603791, + 21888242871839275222246405745257275088548364400416034343698203760343552247793, + 345788949523509, + 138491925852481, + 335721167034689, + 409033416393427, + 21888242871839275222246405745257275088548364400416034343698203914655379670193, + 12464762851486, + 21888242871839275222246405745257275088548364400416034343698204065106190820938, + 21888242871839275222246405745257275088548364400416034343698203665484236085073, + 21888242871839275222246405745257275088548364400416034343698203684768239304747, + 21888242871839275222246405745257275088548364400416034343698203892278906321560, + 21888242871839275222246405745257275088548364400416034343698203948570105414128, + 21888242871839275222246405745257275088548364400416034343698203961918805848224, + 190485678586351, + 21888242871839275222246405745257275088548364400416034343698203702063412856331, + 240610481640037, + 266938966332509, + 229857732721742, + 21888242871839275222246405745257275088548364400416034343698204040995756529546, + 21888242871839275222246405745257275088548364400416034343698204000101427128918, + 236509795437184, + 21888242871839275222246405745257275088548364400416034343698203654857823884695, + 21888242871839275222246405745257275088548364400416034343698203740661015700359, + 21888242871839275222246405745257275088548364400416034343698203842363183692840, + 458509952702856, + 252157965872277, + 562901920134605, + 37185817313288, + 21888242871839275222246405745257275088548364400416034343698204033539985830495, + 21888242871839275222246405745257275088548364400416034343698204113061536777685, + 391471065382825, + 21888242871839275222246405745257275088548364400416034343698203960463428203957, + 21888242871839275222246405745257275088548364400416034343698203637571244255868, + 220144193127877, + 21888242871839275222246405745257275088548364400416034343698203773602896677919, + 21888242871839275222246405745257275088548364400416034343698203650927420119922, + 279029962807214, + 21888242871839275222246405745257275088548364400416034343698204039022893557819, + 21888242871839275222246405745257275088548364400416034343698204110944892535833, + 166718699111161, + 21888242871839275222246405745257275088548364400416034343698203788446086409821, + 21888242871839275222246405745257275088548364400416034343698203666987137265736, + 464845943734086, + 430238159042980, + 519963635587290, + 14581593543635, + 21888242871839275222246405745257275088548364400416034343698204082687905716438, + 21888242871839275222246405745257275088548364400416034343698203710615530763643, + 561769991589134, + 522515926410521, + 21888242871839275222246405745257275088548364400416034343698203785236119903137, + 21888242871839275222246405745257275088548364400416034343698203696556416926446, + 21888242871839275222246405745257275088548364400416034343698204083700240877782, + 21888242871839275222246405745257275088548364400416034343698203916048049527753, + 169172943815445, + 21888242871839275222246405745257275088548364400416034343698204163238984464623, + 21888242871839275222246405745257275088548364400416034343698203928453099704638, + 282022410761392, + 122785213130718, + 344597383927458, + 378034209389226, + 21888242871839275222246405745257275088548364400416034343698204142318450209170, + 355374698164959, + 443220318430019, + 21888242871839275222246405745257275088548364400416034343698203743861204569294, + 479888663597971, + 469648520720306, + 458182521382252, + 21888242871839275222246405745257275088548364400416034343698203979305050552440, + 21888242871839275222246405745257275088548364400416034343698204032118841753501, + 70791256138390, + 27417017477810, + 21888242871839275222246405745257275088548364400416034343698203865226699287047, + 21888242871839275222246405745257275088548364400416034343698204164107542985067, + 21888242871839275222246405745257275088548364400416034343698203706550309990342, + 341462710873721, + 21888242871839275222246405745257275088548364400416034343698204016607178080629, + 21888242871839275222246405745257275088548364400416034343698203878801252465390, + 21888242871839275222246405745257275088548364400416034343698204030864515969840, + 341146083139439, + 524236203442416, + 64350926883582, + 561418363761657, + 21888242871839275222246405745257275088548364400416034343698203772987446524148, + 21888242871839275222246405745257275088548364400416034343698204159239539090026, + 171621936370521, + 343055251374344, + 21888242871839275222246405745257275088548364400416034343698204179551978736146, + 21888242871839275222246405745257275088548364400416034343698204072677713803636, + 21888242871839275222246405745257275088548364400416034343698204073470175773939, + 21888242871839275222246405745257275088548364400416034343698203754219870746704, + 21888242871839275222246405745257275088548364400416034343698203987153249707766, + 21888242871839275222246405745257275088548364400416034343698203949784047030670, + 333267380235821, + 341639396253451, + 462271545397710, + 160650243502935, + 95220067067597, + 315082416139848, + 21888242871839275222246405745257275088548364400416034343698203790780694116943, + 122156074473063, + 21888242871839275222246405745257275088548364400416034343698203746613021009459, + 21888242871839275222246405745257275088548364400416034343698203878583371027682, + 158620439604653, + 264484945223280, + 21888242871839275222246405745257275088548364400416034343698204036493508137473, + 21888242871839275222246405745257275088548364400416034343698204049269825219162, + 58460651898768, + 21888242871839275222246405745257275088548364400416034343698203867171936456527, + 21888242871839275222246405745257275088548364400416034343698203858295214471734, + 60951018335362, + 527934697623729, + 520020876555780, + 21888242871839275222246405745257275088548364400416034343698203810091362251466, + 21888242871839275222246405745257275088548364400416034343698203681748933803364, + 539128764930940, + 191759167335980, + 21888242871839275222246405745257275088548364400416034343698203687411461999212, + 48716783247228, + 21888242871839275222246405745257275088548364400416034343698204057704681189567, + 21888242871839275222246405745257275088548364400416034343698203634124731902103, + 111294158387738, + 416499108842263, + 21888242871839275222246405745257275088548364400416034343698204014778320900150, + 21888242871839275222246405745257275088548364400416034343698203960574934519593, + 104345560367094, + 21888242871839275222246405745257275088548364400416034343698203778736748205514, + 401383034277039, + 46403574137533, + 21888242871839275222246405745257275088548364400416034343698203707565974205407, + 21888242871839275222246405745257275088548364400416034343698203711853824044282, + 294688749386851, + 398757615298697, + 64222885571967, + 21888242871839275222246405745257275088548364400416034343698204015301202896193, + 325889544238982, + 11365775026578, + 21888242871839275222246405745257275088548364400416034343698204094157237058951, + 21888242871839275222246405745257275088548364400416034343698204075131533458360, + 21888242871839275222246405745257275088548364400416034343698203683665089729616, + 21888242871839275222246405745257275088548364400416034343698203744055291129891, + 29508099067557, + 21888242871839275222246405745257275088548364400416034343698203690394478168787, + 459926873506427, + 21888242871839275222246405745257275088548364400416034343698203737893497617341, + 158265390725525, + 305457636113886, + 21888242871839275222246405745257275088548364400416034343698203866341070477862, + 336174329055670, + 21888242871839275222246405745257275088548364400416034343698203729455891310439, + 21888242871839275222246405745257275088548364400416034343698204121451132892814, + 296482734351747, + 46703548470720, + 353015259584137, + 30893372663566, + 21888242871839275222246405745257275088548364400416034343698204184371088151958, + 21888242871839275222246405745257275088548364400416034343698203908714532191348, + 21888242871839275222246405745257275088548364400416034343698203956588857763461, + 21888242871839275222246405745257275088548364400416034343698204072917122858342, + 371775232033202, + 507974475495984, + 364693706388411, + 89938168300908, + 21888242871839275222246405745257275088548364400416034343698203967833705330738, + 86157216663568, + 84386162131041, + 167173855298712, + 129293112127489, + 21888242871839275222246405745257275088548364400416034343698203917799409169927, + 504996567094371, + 21888242871839275222246405745257275088548364400416034343698204072906900158870, + 21888242871839275222246405745257275088548364400416034343698204050942897822198, + 21888242871839275222246405745257275088548364400416034343698203724799525013147, + 359174259905677, + 21888242871839275222246405745257275088548364400416034343698203815938400470176, + 21888242871839275222246405745257275088548364400416034343698203689428079988738, + 21888242871839275222246405745257275088548364400416034343698203771287852907374, + 548059734537100, + 287124699609737, + 21888242871839275222246405745257275088548364400416034343698203650363753351276, + 21888242871839275222246405745257275088548364400416034343698203794035832795345, + 515361595820293, + 3094387150321, + 63147589487899, + 21888242871839275222246405745257275088548364400416034343698204043910339309551, + 85329944426859, + 104159981994418, + 21888242871839275222246405745257275088548364400416034343698203733700855982657, + 21888242871839275222246405745257275088548364400416034343698203768279843503539, + 330804203974148, + 374771183359764, + 387504038387049, + 478509307946354, + 21888242871839275222246405745257275088548364400416034343698203829672516918127, + 21888242871839275222246405745257275088548364400416034343698204096080989148148, + 21888242871839275222246405745257275088548364400416034343698204046773892553083, + 21888242871839275222246405745257275088548364400416034343698204094613437054241, + 21888242871839275222246405745257275088548364400416034343698203876199731287958, + 21888242871839275222246405745257275088548364400416034343698204141156089652726, + 21888242871839275222246405745257275088548364400416034343698204110877342037147, + 465982099111749, + 409340348453514, + 21888242871839275222246405745257275088548364400416034343698203849521618205077, + 54293535474323, + 91040128137105, + 518924719619385, + 21888242871839275222246405745257275088548364400416034343698203985522731009235, + 21888242871839275222246405745257275088548364400416034343698204097430732372042, + 30306732259557, + 21888242871839275222246405745257275088548364400416034343698203964448136064237, + 9715863189515, + 21888242871839275222246405745257275088548364400416034343698203965926303565462, + 559267677556433, + 228792303429260, + 154501375407270, + 338562701297695, + 505312313027972, + 21888242871839275222246405745257275088548364400416034343698203906553130800112, + 441445604976363, + 89097093110385, + 21888242871839275222246405745257275088548364400416034343698203821129192127681, + 21888242871839275222246405745257275088548364400416034343698203858738461222849, + 21888242871839275222246405745257275088548364400416034343698204087164359638977, + 424449257944976, + 21888242871839275222246405745257275088548364400416034343698203995550207372910, + 327088156841287, + 21888242871839275222246405745257275088548364400416034343698203921990356096846, + 21888242871839275222246405745257275088548364400416034343698204132566343454056, + 231149008618462, + 228903598897027, + 461978125039983, + 559271883930538, + 21888242871839275222246405745257275088548364400416034343698203795894741972899, + 21888242871839275222246405745257275088548364400416034343698203659496395266626, + 175104977224008, + 183232691861266, + 21888242871839275222246405745257275088548364400416034343698203714741555740318, + 21888242871839275222246405745257275088548364400416034343698203687254168891852, + 21888242871839275222246405745257275088548364400416034343698204083411717839942, + 458738057968383, + 21888242871839275222246405745257275088548364400416034343698203921605992087044, + 21888242871839275222246405745257275088548364400416034343698204007916440298530, + 21888242871839275222246405745257275088548364400416034343698203782371594154102, + 21888242871839275222246405745257275088548364400416034343698203701418708761388, + 401239337238374, + 21888242871839275222246405745257275088548364400416034343698204029742705440624, + 174123841295483, + 21888242871839275222246405745257275088548364400416034343698203785720202432395, + 511608367802752, + 289432612791027, + 21888242871839275222246405745257275088548364400416034343698204051155475786433, + 373979055468348, + 21888242871839275222246405745257275088548364400416034343698203958690758222883, + 21888242871839275222246405745257275088548364400416034343698203860050601773043, + 473686410089642, + 21888242871839275222246405745257275088548364400416034343698203972890892100471, + 21888242871839275222246405745257275088548364400416034343698204066065491391883, + 532849410072369, + 21888242871839275222246405745257275088548364400416034343698203717476337104773, + 21888242871839275222246405745257275088548364400416034343698203906511787088866, + 274127418322345, + 21888242871839275222246405745257275088548364400416034343698204022541801507830, + 552387194919554, + 21888242871839275222246405745257275088548364400416034343698203657802408821774, + 438579543988000, + 21888242871839275222246405745257275088548364400416034343698203776475091755937, + 21888242871839275222246405745257275088548364400416034343698203879588390250565, + 21888242871839275222246405745257275088548364400416034343698204133400883750125, + 512690377798723, + 546681158738067, + 21888242871839275222246405745257275088548364400416034343698204119939453157699, + 283697412208884, + 21888242871839275222246405745257275088548364400416034343698204135414064184373, + 253755685203571, + 247369320229048, + 176753381757714, + 21888242871839275222246405745257275088548364400416034343698204180442682204483, + 21888242871839275222246405745257275088548364400416034343698204137465749539200, + 21888242871839275222246405745257275088548364400416034343698203854389665993245, + 507729535115666, + 21888242871839275222246405745257275088548364400416034343698203712841286763500, + 21888242871839275222246405745257275088548364400416034343698203804934596900133, + 21888242871839275222246405745257275088548364400416034343698204125301032521128, + 21888242871839275222246405745257275088548364400416034343698203710129544801046, + 21888242871839275222246405745257275088548364400416034343698203661208935469406, + 365305282112835, + 21888242871839275222246405745257275088548364400416034343698203727602241577338, + 21888242871839275222246405745257275088548364400416034343698203894262606282408, + 21888242871839275222246405745257275088548364400416034343698203765469372148437, + 239429918346474, + 21888242871839275222246405745257275088548364400416034343698203992071853288827, + 21888242871839275222246405745257275088548364400416034343698203886984913227733, + 21888242871839275222246405745257275088548364400416034343698203885116413004473, + 406786503491582, + 410031216201302, + 21888242871839275222246405745257275088548364400416034343698203864003742312649, + 252424009501640, + 21888242871839275222246405745257275088548364400416034343698203740310258131160, + 21888242871839275222246405745257275088548364400416034343698203867051931551825, + 21888242871839275222246405745257275088548364400416034343698203702919016971167, + 21888242871839275222246405745257275088548364400416034343698204016393717603246, + 379889597767843, + 21888242871839275222246405745257275088548364400416034343698203748523948215853, + 21888242871839275222246405745257275088548364400416034343698204108591007793676, + 21888242871839275222246405745257275088548364400416034343698203682646910151917, + 21888242871839275222246405745257275088548364400416034343698203999877868372332, + 14758284593277, + 21888242871839275222246405745257275088548364400416034343698203912825420594953, + 552834376277452, + 21888242871839275222246405745257275088548364400416034343698203799715572413365, + 21888242871839275222246405745257275088548364400416034343698203795476687155980, + 21888242871839275222246405745257275088548364400416034343698203697031870579759, + 21888242871839275222246405745257275088548364400416034343698203687307970372926, + 21888242871839275222246405745257275088548364400416034343698203651773982053405, + 21888242871839275222246405745257275088548364400416034343698204042668053643066, + 21888242871839275222246405745257275088548364400416034343698203705619787512102, + 21888242871839275222246405745257275088548364400416034343698203645792437299238, + 21888242871839275222246405745257275088548364400416034343698203729695115164778, + 83035710530827, + 388890212686816, + 396292051367040, + 179787910081234, + 21888242871839275222246405745257275088548364400416034343698203840229671110753, + 21888242871839275222246405745257275088548364400416034343698204020785043381378, + 348683647673078, + 21888242871839275222246405745257275088548364400416034343698203930525404355050, + 362391769311968, + 418801107714162, + 508378035216515, + 21888242871839275222246405745257275088548364400416034343698204068650642542857, + 21888242871839275222246405745257275088548364400416034343698203948258147606600, + 222450976640450, + 21888242871839275222246405745257275088548364400416034343698204057573445170307, + 306211974847413, + 474309767152790, + 21888242871839275222246405745257275088548364400416034343698204108929742019711, + 453496220014459, + 306788349810921, + 21888242871839275222246405745257275088548364400416034343698203762461683056091, + 253326342143439, + 21888242871839275222246405745257275088548364400416034343698204091713546899159, + 21888242871839275222246405745257275088548364400416034343698204101960625148533, + 327874705762313, + 199273055273283, + 313215354410435, + 21888242871839275222246405745257275088548364400416034343698203979249108715016, + 24489320672204, + 21888242871839275222246405745257275088548364400416034343698204107263081137791, + 7871820690472, + 490004300557333, + 21888242871839275222246405745257275088548364400416034343698203755841830745219, + 21888242871839275222246405745257275088548364400416034343698203766783220631483, + 210760835263647, + 193115507649078, + 339529275778047, + 361637151892101, + 21888242871839275222246405745257275088548364400416034343698204060430771910905, + 100734376337092, + 21888242871839275222246405745257275088548364400416034343698204147976496263820, + 61522403963397, + 21888242871839275222246405745257275088548364400416034343698203949806608494520, + 289195899281335, + 21888242871839275222246405745257275088548364400416034343698204093549350134323, + 21888242871839275222246405745257275088548364400416034343698203675074476543799, + 21888242871839275222246405745257275088548364400416034343698203975873948229992, + 87029467417263, + 474865274483019, + 404667436476457, + 348878202304269, + 498322466668440, + 166596198093806, + 353886061662761, + 325787491996164, + 21888242871839275222246405745257275088548364400416034343698203626412846213800, + 340286024985601, + 103148624036086, + 21888242871839275222246405745257275088548364400416034343698203661375924848736, + 372090680365721, + 21888242871839275222246405745257275088548364400416034343698203855655813638429, + 21888242871839275222246405745257275088548364400416034343698204031005667897692, + 21888242871839275222246405745257275088548364400416034343698203750741020275933, + 254551316251650, + 88768468595091, + 220879890100144, + 21888242871839275222246405745257275088548364400416034343698204137814793119814, + 521561576144964, + 36317656561523, + 223243404482745, + 444579351040105, + 321266354463110, + 253465387354865, + 436500238244519, + 21888242871839275222246405745257275088548364400416034343698204020933919670645, + 545892318316402, + 239554204129306, + 21888242871839275222246405745257275088548364400416034343698204109196744277583, + 21888242871839275222246405745257275088548364400416034343698203718668239358581, + 21888242871839275222246405745257275088548364400416034343698203716888400683730, + 548951158735390, + 488607177614827, + 38245350482671, + 542581393967327, + 386331716879346, + 21888242871839275222246405745257275088548364400416034343698204152817844659937, + 177869877573858, + 21888242871839275222246405745257275088548364400416034343698204071994654485098, + 33128314562477, + 21888242871839275222246405745257275088548364400416034343698204184331975919915, + 166514601764117, + 230947428197468, + 21888242871839275222246405745257275088548364400416034343698203988228182126504, + 21888242871839275222246405745257275088548364400416034343698203760705748050354, + 210259841021835, + 21888242871839275222246405745257275088548364400416034343698203814888137847555, + 21888242871839275222246405745257275088548364400416034343698204125422940735114, + 21888242871839275222246405745257275088548364400416034343698203965629260263115, + 350608403981089, + 21888242871839275222246405745257275088548364400416034343698203839691046130373, + 21888242871839275222246405745257275088548364400416034343698204087114690814489, + 21888242871839275222246405745257275088548364400416034343698203895946272966760, + 21888242871839275222246405745257275088548364400416034343698203770328634308921, + 355605992722711, + 21888242871839275222246405745257275088548364400416034343698203969286068947264, + 21888242871839275222246405745257275088548364400416034343698203943495885115658, + 21888242871839275222246405745257275088548364400416034343698203900029271331259, + 21888242871839275222246405745257275088548364400416034343698203853948455238170, + 540148145128954, + 21888242871839275222246405745257275088548364400416034343698204165582369594855, + 21888242871839275222246405745257275088548364400416034343698204013136315222780, + 21888242871839275222246405745257275088548364400416034343698203979786108587717, + 21888242871839275222246405745257275088548364400416034343698203725600814241055, + 33110861815917, + 21888242871839275222246405745257275088548364400416034343698203901187443907709, + 21888242871839275222246405745257275088548364400416034343698203655036742593358, + 21888242871839275222246405745257275088548364400416034343698203846302115773094, + 21888242871839275222246405745257275088548364400416034343698204155030359226437, + 411375359998882, + 21888242871839275222246405745257275088548364400416034343698203884698495580014, + 435240182573932, + 220618354438499, + 357439378918562, + 307501984447964, + 4986770810431, + 12018428236609, + 21888242871839275222246405745257275088548364400416034343698203709766660433866, + 560351840347370, + 21888242871839275222246405745257275088548364400416034343698203917588872565897, + 21888242871839275222246405745257275088548364400416034343698204046206615316557, + 132471316461502, + 49421664658103, + 319668237485287, + 21888242871839275222246405745257275088548364400416034343698204041623177589281, + 21888242871839275222246405745257275088548364400416034343698203745597661427119, + 21888242871839275222246405745257275088548364400416034343698203670281208507152, + 158859892968758, + 278047443509750, + 21888242871839275222246405745257275088548364400416034343698203651994238305345, + 70940748791177, + 37677691548085, + 331372793210585, + 125383005124002, + 357038405815615, + 21888242871839275222246405745257275088548364400416034343698203864510905330101, + 416337936659536, + 401378296802949, + 548570487419638, + 21888242871839275222246405745257275088548364400416034343698203795844777054052, + 21888242871839275222246405745257275088548364400416034343698203861468595018858, + 21888242871839275222246405745257275088548364400416034343698203975520946112187, + 21888242871839275222246405745257275088548364400416034343698204165606700336395, + 21888242871839275222246405745257275088548364400416034343698203708917345201996, + 494730270288515, + 24390299968029, + 393554504861314, + 223849664480538, + 363220233222099, + 31842965953799, + 83755784540551, + 6153108306903, + 21888242871839275222246405745257275088548364400416034343698204126494633815489, + 21888242871839275222246405745257275088548364400416034343698203972173826988538, + 21888242871839275222246405745257275088548364400416034343698203832923283268646, + 21888242871839275222246405745257275088548364400416034343698203870158746836238, + 21888242871839275222246405745257275088548364400416034343698203646847170213318, + 373990005916170, + 21888242871839275222246405745257275088548364400416034343698203653136695745343, + 70497004480456, + 21888242871839275222246405745257275088548364400416034343698204029213885646885, + 512461109554821, + 312533200604910, + 21888242871839275222246405745257275088548364400416034343698204027706717838657, + 439896011365565, + 432472301837123, + 294420768951056, + 21888242871839275222246405745257275088548364400416034343698203985107882436285, + 21888242871839275222246405745257275088548364400416034343698203979122850228696, + 253231126813759, + 21888242871839275222246405745257275088548364400416034343698203796152330878903, + 495076194122986, + 487509659913070, + 21888242871839275222246405745257275088548364400416034343698204061524823849546, + 21888242871839275222246405745257275088548364400416034343698204145896044009467, + 437726298963527, + 444251574667009, + 21888242871839275222246405745257275088548364400416034343698203697035926888319, + 21888242871839275222246405745257275088548364400416034343698203948700544866251, + 101933887060262, + 21888242871839275222246405745257275088548364400416034343698203625853741760958, + 148702721494144, + 116394073887873, + 21888242871839275222246405745257275088548364400416034343698204182024577266794, + 21888242871839275222246405745257275088548364400416034343698203801990616977187, + 188303194281751, + 21888242871839275222246405745257275088548364400416034343698204156050886811644, + 30325505622953, + 266160311924357, + 436248058198991, + 21888242871839275222246405745257275088548364400416034343698203781776473788052, + 243553994513440, + 21888242871839275222246405745257275088548364400416034343698204032433902236968, + 21888242871839275222246405745257275088548364400416034343698203861269020251056, + 21888242871839275222246405745257275088548364400416034343698203972046384778333, + 282397016852495, + 21888242871839275222246405745257275088548364400416034343698204045781163016500, + 230588566378689, + 21888242871839275222246405745257275088548364400416034343698203956397465080643, + 199248253216980, + 21888242871839275222246405745257275088548364400416034343698204159616067581993, + 21888242871839275222246405745257275088548364400416034343698203986844185578101, + 411406811513904, + 21888242871839275222246405745257275088548364400416034343698204122969872182027, + 79619325499175, + 21888242871839275222246405745257275088548364400416034343698204125387667076574, + 21888242871839275222246405745257275088548364400416034343698203902357379611433, + 21888242871839275222246405745257275088548364400416034343698204006764818307067, + 243105443402992, + 390468201507389, + 21888242871839275222246405745257275088548364400416034343698204118834278909850, + 131191286191090, + 1275885026387, + 21888242871839275222246405745257275088548364400416034343698203850967936194836, + 21888242871839275222246405745257275088548364400416034343698204151338052872807, + 21888242871839275222246405745257275088548364400416034343698203733022770666393, + 263636987829414, + 21888242871839275222246405745257275088548364400416034343698204079408319709228, + 21888242871839275222246405745257275088548364400416034343698203927603421247142, + 469104427123083, + 21888242871839275222246405745257275088548364400416034343698203646940032483716, + 21888242871839275222246405745257275088548364400416034343698203986760037742743, + 21888242871839275222246405745257275088548364400416034343698203791780338168126, + 121659298521070, + 439276686404301, + 21888242871839275222246405745257275088548364400416034343698204166211192243009, + 21888242871839275222246405745257275088548364400416034343698203652233126080760, + 549447591120273, + 432924799806860, + 189021380111772, + 21888242871839275222246405745257275088548364400416034343698203932356554176599, + 199369709506169, + 436410998574716, + 157383396927326, + 422814339796998, + 129374659029426, + 21888242871839275222246405745257275088548364400416034343698204168387194601745, + 6680865425415, + 164696628614039, + 503189002263760, + 229295561834965, + 21888242871839275222246405745257275088548364400416034343698203888450699203022, + 64885300937109, + 21888242871839275222246405745257275088548364400416034343698204133414729438579, + 21888242871839275222246405745257275088548364400416034343698203773477219582691, + 21888242871839275222246405745257275088548364400416034343698204106240253116934, + 21888242871839275222246405745257275088548364400416034343698203727394297322205, + 43618649102862, + 21888242871839275222246405745257275088548364400416034343698204063030971112972, + 21888242871839275222246405745257275088548364400416034343698203780492644275288, + 21888242871839275222246405745257275088548364400416034343698203782849492849680, + 21888242871839275222246405745257275088548364400416034343698203989987498493806, + 21888242871839275222246405745257275088548364400416034343698203805554295993589, + 234245848820094, + 166593883900559, + 156644862516675, + 431857718447059, + 280588609303757, + 21888242871839275222246405745257275088548364400416034343698203909245774291342, + 21888242871839275222246405745257275088548364400416034343698203881375044262631, + 201002595696150, + 141469422044939, + 21888242871839275222246405745257275088548364400416034343698204010422470435101, + 21888242871839275222246405745257275088548364400416034343698204132584074231732, + 21888242871839275222246405745257275088548364400416034343698204069071181748854, + 21888242871839275222246405745257275088548364400416034343698204017229592845315, + 21888242871839275222246405745257275088548364400416034343698203998488322918171, + 21888242871839275222246405745257275088548364400416034343698203722013893424137, + 21888242871839275222246405745257275088548364400416034343698203972008418649771, + 556382850728462, + 21888242871839275222246405745257275088548364400416034343698204049446179716723, + 21888242871839275222246405745257275088548364400416034343698203897287673894874, + 15720164863274, + 21888242871839275222246405745257275088548364400416034343698203642918733095675, + 37918831768069, + 305635570128331, + 182515773591187, + 21888242871839275222246405745257275088548364400416034343698204073037793056297, + 274441961952675, + 191449267902432, + 21888242871839275222246405745257275088548364400416034343698203911187167790142, + 21888242871839275222246405745257275088548364400416034343698203648346500166320, + 21888242871839275222246405745257275088548364400416034343698203701725964137281, + 74371181493456, + 265303647557390, + 21888242871839275222246405745257275088548364400416034343698203652868279800566, + 21888242871839275222246405745257275088548364400416034343698203859982630521690, + 413775508747832, + 517609140762467, + 554957735035132, + 150130363908752, + 483214836282502, + 35273600870358, + 334041555294065, + 21888242871839275222246405745257275088548364400416034343698203768277344370015, + 21888242871839275222246405745257275088548364400416034343698203672140387012225, + 21888242871839275222246405745257275088548364400416034343698203755738475849779, + 534888866588035, + 464693989151183, + 21888242871839275222246405745257275088548364400416034343698204087026717576406, + 21888242871839275222246405745257275088548364400416034343698203664320507324871, + 63013430870973, + 21888242871839275222246405745257275088548364400416034343698203786977993313846, + 21888242871839275222246405745257275088548364400416034343698203814631595554834, + 76203980100625, + 477011716495491, + 337967723263923, + 21888242871839275222246405745257275088548364400416034343698204079720247303076, + 21888242871839275222246405745257275088548364400416034343698203666290830044077, + 21888242871839275222246405745257275088548364400416034343698203958998681479661, + 130462976141086, + 74341868366679, + 149927539731015, + 321592407456627, + 223080603061095, + 21888242871839275222246405745257275088548364400416034343698203931709944708621, + 411215168156299, + 21888242871839275222246405745257275088548364400416034343698203961281060293482, + 21888242871839275222246405745257275088548364400416034343698203817351309994618, + 61938355541498, + 501838245105926, + 21888242871839275222246405745257275088548364400416034343698204167561695526495, + 21888242871839275222246405745257275088548364400416034343698203749191287343002, + 21888242871839275222246405745257275088548364400416034343698203729981438962975, + 21888242871839275222246405745257275088548364400416034343698203836801803919861, + 215536778138723, + 251943406168667, + 412727139679064, + 21888242871839275222246405745257275088548364400416034343698204000246300675599, + 403661269791044, + 294280071890750, + 508310180775966, + 10602057870529, + 392893365689092, + 21888242871839275222246405745257275088548364400416034343698204105847857902951, + 308674809038079, + 21888242871839275222246405745257275088548364400416034343698203838570377826810, + 186409859144269, + 21888242871839275222246405745257275088548364400416034343698203777427943536294, + 217948746234173, + 462389515713090, + 551198033646696, + 21888242871839275222246405745257275088548364400416034343698204045215939014439, + 529823045251412, + 14142524382953, + 375706378708650, + 21888242871839275222246405745257275088548364400416034343698204112911757027616, + 21888242871839275222246405745257275088548364400416034343698203763107634518947, + 21888242871839275222246405745257275088548364400416034343698204140996479606997, + 342358785074537, + 21888242871839275222246405745257275088548364400416034343698203788804493990707, + 251065579191760, + 21888242871839275222246405745257275088548364400416034343698203893174100379124, + 310402851189388, + 21888242871839275222246405745257275088548364400416034343698204094559408378739, + 21888242871839275222246405745257275088548364400416034343698203935168475026149, + 460126276947033, + 531893726750398, + 496498547546091, + 21888242871839275222246405745257275088548364400416034343698203623902563350889, + 217665101574289, + 39114026810018, + 2713282100487, + 21888242871839275222246405745257275088548364400416034343698203623706059844353, + 21888242871839275222246405745257275088548364400416034343698203931284155273214, + 164849058977301, + 21888242871839275222246405745257275088548364400416034343698203785009928939346, + 165106771103655, + 232368310608643, + 21888242871839275222246405745257275088548364400416034343698204098564785422711, + 21888242871839275222246405745257275088548364400416034343698203897742004309694, + 21888242871839275222246405745257275088548364400416034343698203667058497570812, + 480650064921480, + 21888242871839275222246405745257275088548364400416034343698204013742486259209, + 21888242871839275222246405745257275088548364400416034343698203858514956046206, + 377353246303034, + 21888242871839275222246405745257275088548364400416034343698204030485798716489, + 21888242871839275222246405745257275088548364400416034343698204103223822903183, + 396333782638743, + 21888242871839275222246405745257275088548364400416034343698203944858723015107, + 170754731131212, + 428447699232662, + 18370971642239, + 555295534756126, + 21888242871839275222246405745257275088548364400416034343698203744333127785829, + 508245665222352, + 21888242871839275222246405745257275088548364400416034343698203762439126914794, + 531126840040626, + 21888242871839275222246405745257275088548364400416034343698204020947083024271, + 153946266665383, + 376474835064497, + 92161455885902, + 211819930492000, + 21888242871839275222246405745257275088548364400416034343698204043325303471987, + 21888242871839275222246405745257275088548364400416034343698203795715270908629, + 21888242871839275222246405745257275088548364400416034343698203968653320606339, + 21888242871839275222246405745257275088548364400416034343698203991121218520370, + 21888242871839275222246405745257275088548364400416034343698203857463832404726, + 386341677644716, + 80230128052330, + 27975964691642, + 21888242871839275222246405745257275088548364400416034343698203995552190962703, + 90642837336913, + 21888242871839275222246405745257275088548364400416034343698203785074317038165, + 21888242871839275222246405745257275088548364400416034343698203948876876520571, + 21888242871839275222246405745257275088548364400416034343698204119377062136335, + 21888242871839275222246405745257275088548364400416034343698203642782116224192, + 49591690604840, + 478639624474028, + 454034279598505, + 41326599290815, + 210645509827418, + 21888242871839275222246405745257275088548364400416034343698203829818802379988, + 308710271905806, + 366673145319056, + 21888242871839275222246405745257275088548364400416034343698203770094191766362, + 222979674175558, + 21888242871839275222246405745257275088548364400416034343698203996335716228266, + 320874750622804, + 393500312547021, + 540493934920612, + 21888242871839275222246405745257275088548364400416034343698203735708680739570, + 21888242871839275222246405745257275088548364400416034343698204036033328017220, + 553842741543319, + 384503760930700, + 21888242871839275222246405745257275088548364400416034343698203737252255268775, + 17256748556536, + 293039139216281, + 21888242871839275222246405745257275088548364400416034343698204069859597157176, + 192387144160139, + 102077317592207, + 113208055602031, + 181227604164185, + 272149544784625, + 248452802036697, + 21888242871839275222246405745257275088548364400416034343698203714691633849305, + 1982964674034, + 431122038073361, + 21888242871839275222246405745257275088548364400416034343698203925918302584446, + 113257571562813, + 238765135359477, + 21888242871839275222246405745257275088548364400416034343698203860766294764625, + 21888242871839275222246405745257275088548364400416034343698203873897525593874, + 510184898334862, + 21888242871839275222246405745257275088548364400416034343698204075384503881403, + 21888242871839275222246405745257275088548364400416034343698204115868045801115, + 219696442340149, + 306035287085401, + 55550740186542, + 486830853685684, + 173005139473031, + 21888242871839275222246405745257275088548364400416034343698203813012507947217, + 381213977187787, + 376979060428082, + 21888242871839275222246405745257275088548364400416034343698203691250401784684, + 21888242871839275222246405745257275088548364400416034343698203839445258800663, + 41677752667737, + 31726415620090, + 260235856645298, + 21888242871839275222246405745257275088548364400416034343698203794361117137951, + 21888242871839275222246405745257275088548364400416034343698204080303843893706, + 21888242871839275222246405745257275088548364400416034343698203779888314206471, + 342321764197455, + 498601332895828, + 169999854491547, + 367959044729192, + 384334443890279, + 21888242871839275222246405745257275088548364400416034343698203861951801990978, + 274463256506926, + 358209416371425, + 21888242871839275222246405745257275088548364400416034343698203680915331811908, + 334066083047596, + 553620133462622, + 209208912782168, + 24920432170418, + 250675765486500, + 21888242871839275222246405745257275088548364400416034343698204151837874677792, + 21888242871839275222246405745257275088548364400416034343698203697978286625300, + 21888242871839275222246405745257275088548364400416034343698204085947684507890, + 21888242871839275222246405745257275088548364400416034343698204003107465690167, + 124060118142771, + 21888242871839275222246405745257275088548364400416034343698204013672206055564, + 21888242871839275222246405745257275088548364400416034343698203897494817401347, + 21888242871839275222246405745257275088548364400416034343698204112815624323286, + 21888242871839275222246405745257275088548364400416034343698204101917821772061, + 21888242871839275222246405745257275088548364400416034343698204131891452661221, + 529768981248712, + 148847807232391, + 21888242871839275222246405745257275088548364400416034343698203939771067666672, + 21888242871839275222246405745257275088548364400416034343698204061124373369074, + 344613011320051, + 21888242871839275222246405745257275088548364400416034343698204036018255969630, + 514190260192099, + 386690082668707, + 383670579257133, + 39566988573061, + 21888242871839275222246405745257275088548364400416034343698203951175976607114, + 337905500598349, + 21888242871839275222246405745257275088548364400416034343698203711722244872995, + 10787866988470, + 381484745422502, + 495333884646337, + 154979832389594, + 21888242871839275222246405745257275088548364400416034343698203738742814963189, + 267816616394163, + 468539800078189, + 437697454024733, + 163080800930359, + 21888242871839275222246405745257275088548364400416034343698203632553566571280, + 21888242871839275222246405745257275088548364400416034343698204045995188748526, + 21888242871839275222246405745257275088548364400416034343698203856304422652883, + 21888242871839275222246405745257275088548364400416034343698203825892954604913, + 111319126113310, + 21888242871839275222246405745257275088548364400416034343698203911272389285772, + 21888242871839275222246405745257275088548364400416034343698203772792895950983, + 21888242871839275222246405745257275088548364400416034343698204092469654343506, + 94791770543098, + 21888242871839275222246405745257275088548364400416034343698203764048689241178, + 21888242871839275222246405745257275088548364400416034343698203628167398725207, + 481517040441695, + 451899534318876, + 532820394186919, + 532959417379228, + 21888242871839275222246405745257275088548364400416034343698203944803226112870, + 21888242871839275222246405745257275088548364400416034343698203656049594262400, + 21888242871839275222246405745257275088548364400416034343698204163901829084425, + 6679458233770, + 21888242871839275222246405745257275088548364400416034343698203678941596032094, + 319509283250890, + 61200054775436, + 21888242871839275222246405745257275088548364400416034343698203854759879846659, + 21888242871839275222246405745257275088548364400416034343698204092622282220156, + 21888242871839275222246405745257275088548364400416034343698203853400557686910, + 312112412752289, + 113061939886300, + 21888242871839275222246405745257275088548364400416034343698204021348436839934, + 462220749034677, + 214601116719921, + 21888242871839275222246405745257275088548364400416034343698204020576600911029, + 21888242871839275222246405745257275088548364400416034343698203972671374581511, + 21888242871839275222246405745257275088548364400416034343698203916103823817159, + 21888242871839275222246405745257275088548364400416034343698203966535349027596, + 21888242871839275222246405745257275088548364400416034343698204129483501760382, + 21888242871839275222246405745257275088548364400416034343698204015202284484497, + 244902712738138, + 21888242871839275222246405745257275088548364400416034343698203847699126626720, + 295236429735543, + 267702610488164, + 21888242871839275222246405745257275088548364400416034343698203684444613709257, + 410479033979790, + 507838086808554, + 21888242871839275222246405745257275088548364400416034343698204151403176673098, + 559523978968033, + 21888242871839275222246405745257275088548364400416034343698204134141022257179, + 21888242871839275222246405745257275088548364400416034343698203962179895696250, + 493981798642623, + 21888242871839275222246405745257275088548364400416034343698203713354052233320, + 17204359126831, + 21888242871839275222246405745257275088548364400416034343698204120220757996782, + 553761643773944, + 487038012144144, + 526960247440789, + 20468126144844, + 387095000960461, + 21888242871839275222246405745257275088548364400416034343698204142507098126462, + 464769880662462, + 444802885952633, + 21888242871839275222246405745257275088548364400416034343698203757463705689913, + 223990996855536, + 21888242871839275222246405745257275088548364400416034343698203630601746776696, + 21888242871839275222246405745257275088548364400416034343698203873952316583177, + 359235480486524, + 21888242871839275222246405745257275088548364400416034343698204045979799435892, + 21888242871839275222246405745257275088548364400416034343698203744359006769785, + 353818818136457, + 21888242871839275222246405745257275088548364400416034343698204059497458276811, + 21888242871839275222246405745257275088548364400416034343698203707670371190954, + 415614668119702, + 502140131524808, + 221463287597857, + 21888242871839275222246405745257275088548364400416034343698203955362553044502, + 21888242871839275222246405745257275088548364400416034343698203813983589098702, + 283148604770093, + 370659317511675, + 21888242871839275222246405745257275088548364400416034343698203935087894941061, + 392558588044378, + 430207778129770, + 81665454653505, + 21888242871839275222246405745257275088548364400416034343698204010847988526659, + 289696653680442, + 350414483042510, + 490803315412862, + 90601145119496, + 325176838659341, + 444564253251656, + 524655090404657, + 74718559785845, + 94517935073117, + 21888242871839275222246405745257275088548364400416034343698203675978510640080, + 41337650811886, + 21888242871839275222246405745257275088548364400416034343698203744570106781220, + 77953788183223, + 324547479965865, + 551942762026508, + 252971428772511, + 438240437230342, + 21888242871839275222246405745257275088548364400416034343698204003547444903318, + 21888242871839275222246405745257275088548364400416034343698203969180090203863, + 21888242871839275222246405745257275088548364400416034343698203781707177038621, + 21888242871839275222246405745257275088548364400416034343698204153269085837989, + 475404327054766, + 21888242871839275222246405745257275088548364400416034343698203698036619501728, + 446006185810823, + 21888242871839275222246405745257275088548364400416034343698204084478294366013, + 235858426541594, + 21888242871839275222246405745257275088548364400416034343698203884345933193201, + 21888242871839275222246405745257275088548364400416034343698203678556229421579, + 21888242871839275222246405745257275088548364400416034343698203769505777103158, + 21888242871839275222246405745257275088548364400416034343698203624275878729501, + 21888242871839275222246405745257275088548364400416034343698203766560713837161, + 21888242871839275222246405745257275088548364400416034343698204135053748954363, + 21888242871839275222246405745257275088548364400416034343698204077624260700165, + 21888242871839275222246405745257275088548364400416034343698204137377391656824, + 21888242871839275222246405745257275088548364400416034343698204036463589547223, + 76157471164737, + 175709094202180, + 21888242871839275222246405745257275088548364400416034343698203913977843279472, + 46908376880834, + 21888242871839275222246405745257275088548364400416034343698204147479079984804, + 21888242871839275222246405745257275088548364400416034343698204036926321281737, + 21888242871839275222246405745257275088548364400416034343698204138522675577480, + 52578178844332, + 21888242871839275222246405745257275088548364400416034343698203885157660887202, + 21888242871839275222246405745257275088548364400416034343698203710043708373174, + 21888242871839275222246405745257275088548364400416034343698203665292370164217, + 22564233474904, + 21888242871839275222246405745257275088548364400416034343698204001205123404746, + 322710224946809, + 379849680281101, + 21888242871839275222246405745257275088548364400416034343698203949271675773341, + 317737965061108, + 529309891857903, + 148928715270031, + 92813692034315, + 21888242871839275222246405745257275088548364400416034343698203712914678861962, + 21888242871839275222246405745257275088548364400416034343698203889540597203893, + 407573903409620, + 396254828214002, + 21888242871839275222246405745257275088548364400416034343698203946041963439869, + 21888242871839275222246405745257275088548364400416034343698203889774529723287, + 320286967675142, + 21888242871839275222246405745257275088548364400416034343698204039856131921176, + 226942428296012, + 315573550993825, + 391305152962081, + 21888242871839275222246405745257275088548364400416034343698203730324189142727, + 131457156457644, + 21888242871839275222246405745257275088548364400416034343698203970695661663212, + 21888242871839275222246405745257275088548364400416034343698203698135987997108, + 21888242871839275222246405745257275088548364400416034343698203857156969243340, + 422986964603972, + 552694516676339, + 410559832374975, + 511038782265476, + 345261315561145, + 365155316551891, + 544654307796253, + 21888242871839275222246405745257275088548364400416034343698204161668496629173, + 255294402114120, + 21888242871839275222246405745257275088548364400416034343698203772244858665613, + 256417164795341, + 279718260029087, + 75831388260911, + 21888242871839275222246405745257275088548364400416034343698203725015426500683, + 529083618020986, + 523749202249364, + 378859437577826, + 43652894255207, + 21888242871839275222246405745257275088548364400416034343698204186533657924158, + 164288678778315, + 302491980800552, + 21888242871839275222246405745257275088548364400416034343698203628154883952219, + 21888242871839275222246405745257275088548364400416034343698203656879316206988, + 21888242871839275222246405745257275088548364400416034343698203929350814002995, + 536340652988907, + 21888242871839275222246405745257275088548364400416034343698204099231680959343, + 21888242871839275222246405745257275088548364400416034343698203656808346539257, + 180175336626179, + 21888242871839275222246405745257275088548364400416034343698204023648740662111, + 206768465963978, + 183593182578423, + 93900687232398, + 186627435348477, + 55972141318798, + 412367893213830, + 29297199912199, + 21888242871839275222246405745257275088548364400416034343698203639855243032752, + 21888242871839275222246405745257275088548364400416034343698203690059629457025, + 21888242871839275222246405745257275088548364400416034343698204139017104013175, + 389339451205942, + 26963148935625, + 287406354684618, + 21888242871839275222246405745257275088548364400416034343698203954613350961409, + 270285491925937, + 502710221929380, + 277092996280881, + 258134052331031, + 300827599479252, + 549442924042470, + 21888242871839275222246405745257275088548364400416034343698203999908337710990, + 429099893598412, + 241471070590629, + 537904530424493, + 21888242871839275222246405745257275088548364400416034343698203821345914344935, + 497077359642117, + 21888242871839275222246405745257275088548364400416034343698203943237274363869, + 21888242871839275222246405745257275088548364400416034343698203773291879300948, + 525339917377321, + 393301810372942, + 21888242871839275222246405745257275088548364400416034343698203951910400635394, + 17986459349049, + 21888242871839275222246405745257275088548364400416034343698203635998629869677, + 468341114039300, + 21888242871839275222246405745257275088548364400416034343698204142602058103357, + 21888242871839275222246405745257275088548364400416034343698203736376444536070, + 150618001031105, + 403896712112474, + 21888242871839275222246405745257275088548364400416034343698203690878959048404, + 21888242871839275222246405745257275088548364400416034343698203885460395192114, + 254438183263932, + 307113161922446, + 244856838410906, + 101128265313950, + 21888242871839275222246405745257275088548364400416034343698203748825604449026, + 369948538209515, + 448006434557102, + 112571857794323, + 21888242871839275222246405745257275088548364400416034343698203696796907850095, + 197007114355442, + 21888242871839275222246405745257275088548364400416034343698204149401924334721, + 97693677308382, + 21888242871839275222246405745257275088548364400416034343698203939758181031503, + 21888242871839275222246405745257275088548364400416034343698203843895435034972, + 409575569866471, + 21888242871839275222246405745257275088548364400416034343698203693628072897687, + 508376555013598, + 471122990008570, + 21888242871839275222246405745257275088548364400416034343698203722243808565367, + 21888242871839275222246405745257275088548364400416034343698203818950003612191, + 450188221078547, + 21888242871839275222246405745257275088548364400416034343698204140834101105704, + 506787294931408, + 364225300105201, + 21888242871839275222246405745257275088548364400416034343698203905894093692389, + 339237048511174, + 492983344492408, + 70480285200497, + 21888242871839275222246405745257275088548364400416034343698203932836042976726, + 21888242871839275222246405745257275088548364400416034343698204167493112086247, + 274012673284994, + 21888242871839275222246405745257275088548364400416034343698203639533831974211, + 333602411229367, + 21888242871839275222246405745257275088548364400416034343698204185242982213819, + 497611203016554, + 21888242871839275222246405745257275088548364400416034343698203956400026772916, + 499317130747514, + 426611832356658, + 465226010785315, + 21888242871839275222246405745257275088548364400416034343698204044735939465045, + 21888242871839275222246405745257275088548364400416034343698203733910051455113, + 21888242871839275222246405745257275088548364400416034343698204092360221268376, + 21888242871839275222246405745257275088548364400416034343698203905635444476072, + 21888242871839275222246405745257275088548364400416034343698203741428778566669, + 438030638580407, + 21888242871839275222246405745257275088548364400416034343698204175931406681505, + 378545157490363, + 405404793312953, + 21888242871839275222246405745257275088548364400416034343698203653989112184913, + 477029068309325, + 413385588362918, + 21888242871839275222246405745257275088548364400416034343698203825124401976765, + 21888242871839275222246405745257275088548364400416034343698203885937447583581, + 21888242871839275222246405745257275088548364400416034343698203672352808601959, + 169004136705245, + 433376951342759, + 21888242871839275222246405745257275088548364400416034343698204113005122345753, + 21888242871839275222246405745257275088548364400416034343698203870687102336116, + 21888242871839275222246405745257275088548364400416034343698203690520045009039, + 227670917104060, + 21888242871839275222246405745257275088548364400416034343698203976990436647145, + 21888242871839275222246405745257275088548364400416034343698203837767524732692, + 211625859038086, + 32717581436245, + 21888242871839275222246405745257275088548364400416034343698204142448081304664, + 21888242871839275222246405745257275088548364400416034343698203908215540152426, + 447633197824487, + 142010005173386, + 21888242871839275222246405745257275088548364400416034343698204143145738051907, + 21888242871839275222246405745257275088548364400416034343698203668479073487968, + 369383616822189, + 111098694673531, + 21888242871839275222246405745257275088548364400416034343698204168192543041714, + 153912254901839, + 21888242871839275222246405745257275088548364400416034343698203937291521913432, + 393290780720291, + 21888242871839275222246405745257275088548364400416034343698203932916899238141, + 21888242871839275222246405745257275088548364400416034343698203854447845154629, + 21888242871839275222246405745257275088548364400416034343698204166343345510230, + 9933913760379, + 216247367821979, + 449680390990940, + 196325809827061, + 318051408505292, + 21888242871839275222246405745257275088548364400416034343698204105574074478527, + 21888242871839275222246405745257275088548364400416034343698203818186640001328, + 21888242871839275222246405745257275088548364400416034343698203752486572547809, + 424424799643940, + 314243044283410, + 21888242871839275222246405745257275088548364400416034343698203979645317019990, + 21888242871839275222246405745257275088548364400416034343698203843310447799921, + 556869982935132, + 21888242871839275222246405745257275088548364400416034343698204174224848022965, + 348480590158460, + 250803432662451, + 417172527775956, + 21888242871839275222246405745257275088548364400416034343698203685890577151165, + 21888242871839275222246405745257275088548364400416034343698203627346177639467, + 21888242871839275222246405745257275088548364400416034343698203654292978323252, + 122859630897468, + 21888242871839275222246405745257275088548364400416034343698203871243998906614, + 75729978574544, + 274079646103835, + 21888242871839275222246405745257275088548364400416034343698204185855573537425, + 21888242871839275222246405745257275088548364400416034343698204014146537358433, + 21888242871839275222246405745257275088548364400416034343698203992880361322789, + 21888242871839275222246405745257275088548364400416034343698203808037459611026, + 94028718645420, + 397240528728793, + 494593742324324, + 109873255667467, + 21888242871839275222246405745257275088548364400416034343698204013123200454830, + 21888242871839275222246405745257275088548364400416034343698203722086297609885, + 21888242871839275222246405745257275088548364400416034343698203866443645386988, + 127766067797850, + 21888242871839275222246405745257275088548364400416034343698203734963862450328, + 21888242871839275222246405745257275088548364400416034343698203633759047727569, + 21888242871839275222246405745257275088548364400416034343698203796398483333062, + 195545388724057, + 448563065628352, + 21888242871839275222246405745257275088548364400416034343698203854128476340045, + 89080130037040, + 37137167126841, + 21888242871839275222246405745257275088548364400416034343698203675139071017524, + 21888242871839275222246405745257275088548364400416034343698204096033282212416, + 21888242871839275222246405745257275088548364400416034343698204068638899542205, + 21888242871839275222246405745257275088548364400416034343698203826102579048917, + 226334298324897, + 21888242871839275222246405745257275088548364400416034343698204101697489534416, + 21888242871839275222246405745257275088548364400416034343698203901646155018634, + 366768367763831, + 21888242871839275222246405745257275088548364400416034343698204074222328680409, + 21888242871839275222246405745257275088548364400416034343698203807052341656811, + 21888242871839275222246405745257275088548364400416034343698203776907996644628, + 21888242871839275222246405745257275088548364400416034343698203672574403267611, + 21888242871839275222246405745257275088548364400416034343698204060350923131604, + 21888242871839275222246405745257275088548364400416034343698204008989161822393, + 291672049468706, + 21888242871839275222246405745257275088548364400416034343698203672230396437215, + 21888242871839275222246405745257275088548364400416034343698203782894451578815, + 215541638214062, + 523843016695698, + 21888242871839275222246405745257275088548364400416034343698204151156005889879, + 244357591540627, + 21888242871839275222246405745257275088548364400416034343698203918354310493618, + 312211467775052, + 236510178485308, + 521127603529440, + 21888242871839275222246405745257275088548364400416034343698203751886595766138, + 21888242871839275222246405745257275088548364400416034343698204000946478088327, + 550351492538111, + 151374402401341, + 173333324896670, + 21888242871839275222246405745257275088548364400416034343698203661254708266916, + 33223898203373, + 130581360231068, + 21888242871839275222246405745257275088548364400416034343698203665886034086030, + 21888242871839275222246405745257275088548364400416034343698203896854021141393, + 107580120858332, + 273314741706034, + 21888242871839275222246405745257275088548364400416034343698203723700782831848, + 21888242871839275222246405745257275088548364400416034343698204072949236862391, + 285428406827657, + 35367136710900, + 178586063955325, + 21888242871839275222246405745257275088548364400416034343698204132553193083202, + 21888242871839275222246405745257275088548364400416034343698204088062724425307, + 525323370451925, + 21888242871839275222246405745257275088548364400416034343698203689855644436566, + 21888242871839275222246405745257275088548364400416034343698204148798670248341, + 21888242871839275222246405745257275088548364400416034343698203990792659242080, + 21888242871839275222246405745257275088548364400416034343698204125544946602979, + 21888242871839275222246405745257275088548364400416034343698203869033212270415, + 313482803162982, + 21888242871839275222246405745257275088548364400416034343698203806358769619271, + 21888242871839275222246405745257275088548364400416034343698203980939511987509, + 145884039979875, + 194713749613445, + 21888242871839275222246405745257275088548364400416034343698204120561455758680, + 21888242871839275222246405745257275088548364400416034343698203965420831548828, + 255936965133275, + 21888242871839275222246405745257275088548364400416034343698204109615804237408, + 74606641031120, + 21888242871839275222246405745257275088548364400416034343698203719317627955375, + 70133298101227, + 490269351881194, + 21888242871839275222246405745257275088548364400416034343698203906769743215369, + 374014206191919, + 21888242871839275222246405745257275088548364400416034343698203626162107353830, + 149631921434571, + 77305523052622, + 475253941080699, + 174141442786172, + 150449915182128, + 545136840915124, + 110605963135135, + 179564995600310, + 21888242871839275222246405745257275088548364400416034343698203969688580958630, + 21888242871839275222246405745257275088548364400416034343698204028936217957890, + 504415109216179, + 21888242871839275222246405745257275088548364400416034343698203836967238353804, + 21888242871839275222246405745257275088548364400416034343698204077212310477938, + 278169915052470, + 21888242871839275222246405745257275088548364400416034343698204124950791706698, + 137328536015933, + 21888242871839275222246405745257275088548364400416034343698203889440506446166, + 454140508163888, + 21888242871839275222246405745257275088548364400416034343698203635828184603850, + 21888242871839275222246405745257275088548364400416034343698203891887020600784, + 124328271326062, + 227958542264404, + 21888242871839275222246405745257275088548364400416034343698203986753404497819, + 21888242871839275222246405745257275088548364400416034343698204153655880219256, + 348748460709658, + 21888242871839275222246405745257275088548364400416034343698204092859013836615, + 21888242871839275222246405745257275088548364400416034343698203738333211545274, + 21888242871839275222246405745257275088548364400416034343698203741683097882158, + 21888242871839275222246405745257275088548364400416034343698203698611357216338, + 21888242871839275222246405745257275088548364400416034343698203861332740020827, + 21888242871839275222246405745257275088548364400416034343698204162765798691429, + 21888242871839275222246405745257275088548364400416034343698203890589996656150, + 159883108398605, + 226067109871572, + 21888242871839275222246405745257275088548364400416034343698204082201379377738, + 210047177271027, + 21888242871839275222246405745257275088548364400416034343698204096425783655156, + 420245673615037, + 112049397110212, + 97684080770596, + 21888242871839275222246405745257275088548364400416034343698203760912471025756, + 432466972558753, + 21888242871839275222246405745257275088548364400416034343698204083406394803309, + 137898367327402, + 204487072822904, + 21888242871839275222246405745257275088548364400416034343698203978900318687452, + 452785656773329, + 323813913258827, + 21888242871839275222246405745257275088548364400416034343698203880841588887952, + 21888242871839275222246405745257275088548364400416034343698203986898326371965, + 21888242871839275222246405745257275088548364400416034343698204184713221887451, + 21888242871839275222246405745257275088548364400416034343698204180766464986936, + 21888242871839275222246405745257275088548364400416034343698204013661860226427, + 21888242871839275222246405745257275088548364400416034343698203826422113348107, + 21888242871839275222246405745257275088548364400416034343698203668116864371450, + 21888242871839275222246405745257275088548364400416034343698203704075493607260, + 21888242871839275222246405745257275088548364400416034343698203924274940580123, + 21888242871839275222246405745257275088548364400416034343698203858612543994094, + 21888242871839275222246405745257275088548364400416034343698203821691945218436, + 21888242871839275222246405745257275088548364400416034343698204020910455985529, + 542933107606511, + 21888242871839275222246405745257275088548364400416034343698203844985021847313, + 21888242871839275222246405745257275088548364400416034343698204164266581988478, + 492597728331853, + 295245100028182, + 311390150619681, + 439468932356116, + 181944021786192, + 21888242871839275222246405745257275088548364400416034343698203898063772319308, + 470046769581669, + 389959686423616, + 21888242871839275222246405745257275088548364400416034343698203959001682184569, + 21888242871839275222246405745257275088548364400416034343698203796188174258406, + 229362546298873, + 21888242871839275222246405745257275088548364400416034343698204126880346472354, + 340835909401141, + 21888242871839275222246405745257275088548364400416034343698203746532891805627, + 158321198563663, + 430832123329671, + 21888242871839275222246405745257275088548364400416034343698203643902876068781, + 298302131040536, + 544140713065178, + 21888242871839275222246405745257275088548364400416034343698203710889681854804, + 21888242871839275222246405745257275088548364400416034343698203755215551007156, + 478801570876180, + 21888242871839275222246405745257275088548364400416034343698203877099020749007, + 21888242871839275222246405745257275088548364400416034343698203800721132206021, + 21888242871839275222246405745257275088548364400416034343698203734262188723257, + 21888242871839275222246405745257275088548364400416034343698203643028321868053, + 21888242871839275222246405745257275088548364400416034343698203786470320637904, + 481084372206376, + 462131278744226, + 440410998158792, + 418842960915873, + 21888242871839275222246405745257275088548364400416034343698203953249068722304, + 93256555670293, + 21888242871839275222246405745257275088548364400416034343698203666520071632219, + 488297549370067, + 135925621789986, + 363222698733767, + 21888242871839275222246405745257275088548364400416034343698203971879869644217, + 144964877336091, + 21888242871839275222246405745257275088548364400416034343698204160217330374864, + 379520515094210, + 21888242871839275222246405745257275088548364400416034343698203816894998300336, + 528970269820029, + 30942816935986, + 21888242871839275222246405745257275088548364400416034343698204119760285152571, + 491385477775637, + 330697329476898, + 424909892305622, + 21888242871839275222246405745257275088548364400416034343698203656955754640910, + 100861331529577, + 21888242871839275222246405745257275088548364400416034343698203863519585006710, + 208925335306420, + 159993551870422, + 165208036172486, + 200465666427914, + 103155767334407, + 21888242871839275222246405745257275088548364400416034343698203846862130380903, + 83144089170626, + 21888242871839275222246405745257275088548364400416034343698203913740224911275, + 21888242871839275222246405745257275088548364400416034343698204015713808962034, + 21888242871839275222246405745257275088548364400416034343698203800041599227293, + 22117152405967, + 21888242871839275222246405745257275088548364400416034343698203629352895042567, + 404988543140100, + 21888242871839275222246405745257275088548364400416034343698204036033082523625, + 21888242871839275222246405745257275088548364400416034343698204127443059176088, + 21888242871839275222246405745257275088548364400416034343698203747164923184681, + 512993121698352, + 321258402151724, + 21888242871839275222246405745257275088548364400416034343698203950031569335211, + 21888242871839275222246405745257275088548364400416034343698204078538636947185, + 21888242871839275222246405745257275088548364400416034343698203699561136786395, + 208607177340593, + 489087728158445, + 21888242871839275222246405745257275088548364400416034343698203768948649897418, + 21888242871839275222246405745257275088548364400416034343698203697395094516852, + 394617413528825, + 21888242871839275222246405745257275088548364400416034343698203724354928109349, + 21888242871839275222246405745257275088548364400416034343698204053955822895379, + 21888242871839275222246405745257275088548364400416034343698204026203652676989, + 526297531905581, + 21888242871839275222246405745257275088548364400416034343698203644966706789339, + 501057245719814, + 21888242871839275222246405745257275088548364400416034343698204082280224920120, + 546718386056908, + 21888242871839275222246405745257275088548364400416034343698203839293555569638, + 21888242871839275222246405745257275088548364400416034343698203906263949572870, + 21888242871839275222246405745257275088548364400416034343698203726833971850228, + 21888242871839275222246405745257275088548364400416034343698203816059367004075, + 211119268700085, + 508396416119240, + 21888242871839275222246405745257275088548364400416034343698204103645525160054, + 57987890678707, + 527015532254732, + 442595966973895, + 174409022622535, + 170751412845699, + 108170327687919, + 21888242871839275222246405745257275088548364400416034343698204119979016423521, + 21888242871839275222246405745257275088548364400416034343698203958319533702813, + 110656984907279, + 115268018611246, + 21888242871839275222246405745257275088548364400416034343698204127089052581249, + 201881076905142, + 21888242871839275222246405745257275088548364400416034343698204124211778886988, + 123969096357278, + 215662142141698, + 21888242871839275222246405745257275088548364400416034343698203938497429393146, + 373737829953367, + 360647316981014, + 496002064514771, + 12503203986284, + 557539842854711, + 378661361675538, + 21888242871839275222246405745257275088548364400416034343698204157544429499987, + 120840146335245, + 21888242871839275222246405745257275088548364400416034343698203837005678381737, + 560479518587437, + 273518360003382, + 21888242871839275222246405745257275088548364400416034343698203707486830172882, + 21888242871839275222246405745257275088548364400416034343698203757228378584240, + 21888242871839275222246405745257275088548364400416034343698203933582409801402, + 21888242871839275222246405745257275088548364400416034343698203811945101827777, + 21888242871839275222246405745257275088548364400416034343698204028950658535859, + 21888242871839275222246405745257275088548364400416034343698203838498510091342, + 21888242871839275222246405745257275088548364400416034343698203684724861499697, + 408033732281482, + 21888242871839275222246405745257275088548364400416034343698203703901223008651, + 21888242871839275222246405745257275088548364400416034343698203723172603269860, + 21888242871839275222246405745257275088548364400416034343698203955890617872296, + 21888242871839275222246405745257275088548364400416034343698204148883341495984, + 21888242871839275222246405745257275088548364400416034343698204132642795803899, + 269797063351070, + 21888242871839275222246405745257275088548364400416034343698203823547122324922, + 21888242871839275222246405745257275088548364400416034343698204170964453174311, + 21888242871839275222246405745257275088548364400416034343698203905304425596181, + 21888242871839275222246405745257275088548364400416034343698203691957116551484, + 21888242871839275222246405745257275088548364400416034343698203814967945120476, + 402539232134947, + 21888242871839275222246405745257275088548364400416034343698203996581444414534, + 21888242871839275222246405745257275088548364400416034343698203720158679972709, + 21888242871839275222246405745257275088548364400416034343698203722886574828508, + 21888242871839275222246405745257275088548364400416034343698204079460171165801, + 332212303693678, + 344923304138604, + 97201007983139, + 482482646873714, + 357978895121893, + 21888242871839275222246405745257275088548364400416034343698203662022970122586, + 536554016524434, + 214718280138197, + 416082187949803, + 426128605621241, + 21888242871839275222246405745257275088548364400416034343698203927238452945353, + 21888242871839275222246405745257275088548364400416034343698203671961261891510, + 250726584409914, + 21888242871839275222246405745257275088548364400416034343698203951106307484773, + 21888242871839275222246405745257275088548364400416034343698203925412624284558, + 559369756973995, + 21888242871839275222246405745257275088548364400416034343698203723944338712082, + 170951698269726, + 557675453001119, + 236701079812404, + 211924593357580, + 309468279247593, + 21888242871839275222246405745257275088548364400416034343698203821866323661536, + 182637792227598, + 157340996044310, + 21888242871839275222246405745257275088548364400416034343698203825283514413944, + 114229534436357, + 21888242871839275222246405745257275088548364400416034343698204069259695596128, + 398637958520462, + 498377950597531, + 233054742501607, + 436009309244432, + 21888242871839275222246405745257275088548364400416034343698203636375257659461, + 21888242871839275222246405745257275088548364400416034343698203893483888687853, + 220614676725959, + 21888242871839275222246405745257275088548364400416034343698203638887924713990, + 21888242871839275222246405745257275088548364400416034343698203796183321828925, + 438975107118928, + 21888242871839275222246405745257275088548364400416034343698204056320620730492, + 269353967992488, + 21888242871839275222246405745257275088548364400416034343698204075292523136929, + 21888242871839275222246405745257275088548364400416034343698203677978176438168, + 294663561171499, + 209509413908146, + 21888242871839275222246405745257275088548364400416034343698203982477021212689, + 21888242871839275222246405745257275088548364400416034343698203659532948722395, + 21888242871839275222246405745257275088548364400416034343698203871135198077874, + 21888242871839275222246405745257275088548364400416034343698203848702810944344, + 417136959489708, + 351904038908713, + 21888242871839275222246405745257275088548364400416034343698204016409831899492, + 7467626046721, + 21888242871839275222246405745257275088548364400416034343698203736270226006139, + 98019791312964, + 523684144242030, + 21888242871839275222246405745257275088548364400416034343698204174538711199338, + 21888242871839275222246405745257275088548364400416034343698203753462615750377, + 21888242871839275222246405745257275088548364400416034343698204181676346736990, + 21888242871839275222246405745257275088548364400416034343698203854694392871532, + 21888242871839275222246405745257275088548364400416034343698203802823238369623, + 515584088974328, + 430808701751055, + 439287764631077, + 165182731836076, + 455110523193146, + 21888242871839275222246405745257275088548364400416034343698203642859245576098, + 21888242871839275222246405745257275088548364400416034343698203765801203725096, + 302260635833005, + 219881620974961, + 21888242871839275222246405745257275088548364400416034343698204035121028624363, + 21888242871839275222246405745257275088548364400416034343698204054808209840873, + 365215202754739, + 274994065889607, + 532398763769927, + 407717696843974, + 21888242871839275222246405745257275088548364400416034343698203809786261771578, + 202308246001663, + 21888242871839275222246405745257275088548364400416034343698203870859712241556, + 21888242871839275222246405745257275088548364400416034343698203678476666081571, + 163442719413899, + 397217392599174, + 21702087184574, + 21888242871839275222246405745257275088548364400416034343698203852024386890595, + 338333080887395, + 357571484438043, + 277143152856447, + 21888242871839275222246405745257275088548364400416034343698203848578246131280, + 450001263423229, + 21888242871839275222246405745257275088548364400416034343698203781166265482715, + 21888242871839275222246405745257275088548364400416034343698203682883433733557, + 21888242871839275222246405745257275088548364400416034343698203650525249926998, + 21888242871839275222246405745257275088548364400416034343698203727205499308657, + 506792016799793, + 553839063382803, + 21888242871839275222246405745257275088548364400416034343698204099929743033002, + 21888242871839275222246405745257275088548364400416034343698203773556252165133, + 141763467535298, + 98446503798166, + 61163531166796, + 478669662742210, + 258901458420383, + 21888242871839275222246405745257275088548364400416034343698203729159202639738, + 21888242871839275222246405745257275088548364400416034343698204102763569356106, + 193130246738149, + 21888242871839275222246405745257275088548364400416034343698203908218476223671, + 21888242871839275222246405745257275088548364400416034343698204057057811123381, + 308092511829688, + 21888242871839275222246405745257275088548364400416034343698203780557971272888, + 427867739258889, + 12819704968647, + 21888242871839275222246405745257275088548364400416034343698204057289083335269, + 20601798008922, + 91205606010260, + 21888242871839275222246405745257275088548364400416034343698203798833712965095, + 21888242871839275222246405745257275088548364400416034343698204049079931933625, + 446929081195939, + 21888242871839275222246405745257275088548364400416034343698203922420145139804, + 21888242871839275222246405745257275088548364400416034343698203869675674924732, + 450879718101670, + 238480173491844, + 21888242871839275222246405745257275088548364400416034343698203903261839370085, + 252124170282790, + 31147793178200, + 21888242871839275222246405745257275088548364400416034343698204081939032731678, + 153965998010170, + 431430455448975, + 21888242871839275222246405745257275088548364400416034343698203966781635054583, + 12676811022814, + 21888242871839275222246405745257275088548364400416034343698204003591517498337, + 21888242871839275222246405745257275088548364400416034343698203859474603049806, + 21888242871839275222246405745257275088548364400416034343698203979149110972450, + 43310114992073, + 427456682950791, + 333650185373028, + 21888242871839275222246405745257275088548364400416034343698203935069951985751, + 21888242871839275222246405745257275088548364400416034343698203853197391267418, + 409102855571649, + 21888242871839275222246405745257275088548364400416034343698204157324501383431, + 21888242871839275222246405745257275088548364400416034343698204152699665721444, + 21888242871839275222246405745257275088548364400416034343698204131801621358756, + 21888242871839275222246405745257275088548364400416034343698204086836309234236, + 21888242871839275222246405745257275088548364400416034343698204105688920840004, + 21888242871839275222246405745257275088548364400416034343698203981980145639953, + 165589632528936, + 21888242871839275222246405745257275088548364400416034343698203706198565077711, + 531144652119819, + 21888242871839275222246405745257275088548364400416034343698203666655003135316, + 21888242871839275222246405745257275088548364400416034343698203683095761895871, + 21888242871839275222246405745257275088548364400416034343698203784734530333543, + 21888242871839275222246405745257275088548364400416034343698204134792843122596, + 21888242871839275222246405745257275088548364400416034343698204092670899924149, + 363570188004899, + 466528905778645, + 21888242871839275222246405745257275088548364400416034343698204082639643069974, + 394582853919397, + 21888242871839275222246405745257275088548364400416034343698203927644195517603, + 21888242871839275222246405745257275088548364400416034343698203951724820063946, + 21888242871839275222246405745257275088548364400416034343698203770335801107767, + 21888242871839275222246405745257275088548364400416034343698203701475386337612, + 463899259398125, + 21888242871839275222246405745257275088548364400416034343698204070466201822659, + 21888242871839275222246405745257275088548364400416034343698203988107397489264, + 43442940127416, + 453438951504513, + 21888242871839275222246405745257275088548364400416034343698204182068431632332, + 38036725680926, + 553246347645560, + 21888242871839275222246405745257275088548364400416034343698204106374535777909, + 21888242871839275222246405745257275088548364400416034343698203675158029761571, + 522810994035659, + 339643137498749, + 21888242871839275222246405745257275088548364400416034343698203971592636094915, + 21888242871839275222246405745257275088548364400416034343698203687521109902769, + 21888242871839275222246405745257275088548364400416034343698204181601832016085, + 77461843653472, + 21888242871839275222246405745257275088548364400416034343698203771492023065897, + 21888242871839275222246405745257275088548364400416034343698204135176010595431, + 21888242871839275222246405745257275088548364400416034343698203989278292971410, + 203223360817721, + 1646405255932, + 558595558663487, + 214564264297329, + 30276844832850, + 58344328373356, + 21888242871839275222246405745257275088548364400416034343698203784102943568375, + 21888242871839275222246405745257275088548364400416034343698203742210258773569, + 384812179134838, + 126158402488008, + 21888242871839275222246405745257275088548364400416034343698204140332425225213, + 21888242871839275222246405745257275088548364400416034343698203801627171036885, + 274213337926051, + 21888242871839275222246405745257275088548364400416034343698204109506088270155, + 363018508489326, + 29204696382552, + 105266081251636, + 161586085208646, + 21888242871839275222246405745257275088548364400416034343698204143709197145244, + 21888242871839275222246405745257275088548364400416034343698203850403357383329, + 461068612241449, + 21888242871839275222246405745257275088548364400416034343698204122631327594102, + 21888242871839275222246405745257275088548364400416034343698203708285322517199, + 21888242871839275222246405745257275088548364400416034343698203897863449184466, + 21888242871839275222246405745257275088548364400416034343698203877607664061003, + 21888242871839275222246405745257275088548364400416034343698204147804921745856, + 379793367377242, + 299442182993567, + 41793281820477, + 21888242871839275222246405745257275088548364400416034343698204024915716259913, + 34334545284328, + 21888242871839275222246405745257275088548364400416034343698204120047882213380, + 21888242871839275222246405745257275088548364400416034343698204064404960356145, + 21888242871839275222246405745257275088548364400416034343698204095718390440567, + 21888242871839275222246405745257275088548364400416034343698203993255174468647, + 524543899673420, + 91783574581016, + 109059436807235, + 21888242871839275222246405745257275088548364400416034343698203858726316672128, + 21888242871839275222246405745257275088548364400416034343698203895201770879239, + 21888242871839275222246405745257275088548364400416034343698204165004801006734, + 21888242871839275222246405745257275088548364400416034343698204017883528995569, + 21888242871839275222246405745257275088548364400416034343698204066645630773634, + 548531707408294, + 223752014717789, + 21888242871839275222246405745257275088548364400416034343698203761571441501583, + 21888242871839275222246405745257275088548364400416034343698203651052977427222, + 328215561191077, + 181740213365767, + 21888242871839275222246405745257275088548364400416034343698203640909905091921, + 287437935753972, + 35546161188541, + 21888242871839275222246405745257275088548364400416034343698204177664281058333, + 113009926349381, + 407778063154968, + 21888242871839275222246405745257275088548364400416034343698203970413615778065, + 21888242871839275222246405745257275088548364400416034343698203784825239842507, + 541363164544190, + 21888242871839275222246405745257275088548364400416034343698204108728405197727, + 267929663189291, + 21888242871839275222246405745257275088548364400416034343698203931571681787193, + 21888242871839275222246405745257275088548364400416034343698203898444622179532, + 21888242871839275222246405745257275088548364400416034343698203711731742996336, + 21888242871839275222246405745257275088548364400416034343698203832634720547030, + 96367309786997, + 174022565789179, + 158955411472633, + 171540500590248, + 136367302743200, + 21888242871839275222246405745257275088548364400416034343698203702904018219898, + 191525596966999, + 512739874764697, + 302044909812052, + 21888242871839275222246405745257275088548364400416034343698203848381113551027, + 98653415736208, + 21888242871839275222246405745257275088548364400416034343698204007180210459184, + 21888242871839275222246405745257275088548364400416034343698204017055884504700, + 21888242871839275222246405745257275088548364400416034343698204139122121706517, + 21888242871839275222246405745257275088548364400416034343698204100232090270002, + 367116783728450, + 514978635559620, + 458689050170156, + 33400582228221, + 21888242871839275222246405745257275088548364400416034343698203688860442608576, + 57982961818127, + 21888242871839275222246405745257275088548364400416034343698203646000483148411, + 21888242871839275222246405745257275088548364400416034343698203939201410448359, + 370797491081875, + 489691461070873, + 200701578830474, + 21888242871839275222246405745257275088548364400416034343698204084333758052087, + 21888242871839275222246405745257275088548364400416034343698203679059799748575, + 292830274571889, + 21888242871839275222246405745257275088548364400416034343698203655117734312578, + 21888242871839275222246405745257275088548364400416034343698203807214756722201, + 21888242871839275222246405745257275088548364400416034343698204005878273103486, + 21888242871839275222246405745257275088548364400416034343698203869166940348184, + 21888242871839275222246405745257275088548364400416034343698204021966409474713, + 21888242871839275222246405745257275088548364400416034343698204109569962701297, + 21888242871839275222246405745257275088548364400416034343698203845272674729131, + 21888242871839275222246405745257275088548364400416034343698203758231378085882, + 21888242871839275222246405745257275088548364400416034343698204051311717596496, + 403148353010722, + 21888242871839275222246405745257275088548364400416034343698204124727587270654, + 21888242871839275222246405745257275088548364400416034343698204065964002008369, + 264912820705251, + 21888242871839275222246405745257275088548364400416034343698203956748460104008, + 21888242871839275222246405745257275088548364400416034343698203956060357841213, + 21888242871839275222246405745257275088548364400416034343698203642202101588163, + 21888242871839275222246405745257275088548364400416034343698203707968373725414, + 21888242871839275222246405745257275088548364400416034343698203990595967756567, + 21888242871839275222246405745257275088548364400416034343698203811443550788452, + 504478291497511, + 108943929486338, + 21888242871839275222246405745257275088548364400416034343698203797874829455463, + 60548979563757, + 33439134740053, + 365652811643850, + 21888242871839275222246405745257275088548364400416034343698203952836510047343, + 461901786831557, + 255396300903995, + 21888242871839275222246405745257275088548364400416034343698203909212608426435, + 342205134122776, + 21888242871839275222246405745257275088548364400416034343698203711314133917612, + 535120997745820, + 415509954872429, + 21888242871839275222246405745257275088548364400416034343698204085374117126092, + 27647489932110, + 21888242871839275222246405745257275088548364400416034343698204107758620019528, + 194061956551530, + 198560311047736, + 21888242871839275222246405745257275088548364400416034343698204175669444963719, + 363619428843923, + 389117254636111, + 17916141475957, + 21888242871839275222246405745257275088548364400416034343698203989329731335620, + 348650916769217, + 21888242871839275222246405745257275088548364400416034343698203949362002658595, + 21888242871839275222246405745257275088548364400416034343698203758581522324299, + 550158381161717, + 262767435238955, + 170759628127561, + 388879718285333, + 21888242871839275222246405745257275088548364400416034343698204144796717636091, + 9070995920689, + 368245325535155, + 21888242871839275222246405745257275088548364400416034343698204014481689514733, + 21888242871839275222246405745257275088548364400416034343698203693077317900273, + 350147587631439, + 430088209751645, + 187674124828504, + 21888242871839275222246405745257275088548364400416034343698204090170933307320, + 21888242871839275222246405745257275088548364400416034343698203750238220136020, + 211854642080310, + 21888242871839275222246405745257275088548364400416034343698203750355426928819, + 415190199436000, + 246979246111479, + 21888242871839275222246405745257275088548364400416034343698204094193541803437, + 209533081596731, + 174541077810460, + 21888242871839275222246405745257275088548364400416034343698203816804842932334, + 335768359818865, + 221539367049165, + 256850772283675, + 229283379278966, + 21888242871839275222246405745257275088548364400416034343698203789009918777528, + 21888242871839275222246405745257275088548364400416034343698203861990623070026, + 24895553471716, + 21888242871839275222246405745257275088548364400416034343698204026256417542874, + 477531165782185, + 280875793699963, + 21888242871839275222246405745257275088548364400416034343698203828839096102478, + 21888242871839275222246405745257275088548364400416034343698203849117843866081, + 482787369469403, + 21888242871839275222246405745257275088548364400416034343698203969116637923686, + 349393932961803, + 21888242871839275222246405745257275088548364400416034343698203985783152260050, + 21888242871839275222246405745257275088548364400416034343698203945509391887138, + 21888242871839275222246405745257275088548364400416034343698203874648265399936, + 313883326836227, + 498044802740294, + 175571027214229, + 114383409051977, + 21888242871839275222246405745257275088548364400416034343698203982848223805627, + 21888242871839275222246405745257275088548364400416034343698203806068393284945, + 187632466034203, + 210210107658580, + 21888242871839275222246405745257275088548364400416034343698204173780369465405, + 147119057661692, + 268746556621066, + 261778566010007, + 21888242871839275222246405745257275088548364400416034343698204006155725823256, + 21888242871839275222246405745257275088548364400416034343698203676620554079347, + 21888242871839275222246405745257275088548364400416034343698203998146489090851, + 21888242871839275222246405745257275088548364400416034343698204112204309813609, + 21888242871839275222246405745257275088548364400416034343698204082511329057619, + 145259980924549, + 493013258075190, + 21888242871839275222246405745257275088548364400416034343698204082061979775724, + 482007873762416, + 91006565583436, + 117399633936706, + 21888242871839275222246405745257275088548364400416034343698204062827341722897, + 21888242871839275222246405745257275088548364400416034343698203888095053861428, + 21888242871839275222246405745257275088548364400416034343698203705143743520768, + 21888242871839275222246405745257275088548364400416034343698203658156255357361, + 509952411857327, + 21888242871839275222246405745257275088548364400416034343698203786204466566673, + 21888242871839275222246405745257275088548364400416034343698204179617897699012, + 29780039330249, + 21888242871839275222246405745257275088548364400416034343698204049680128023948, + 278371921437368, + 414081226653332, + 301417908910031, + 450945692742691, + 193786875555030, + 228629321296488, + 267856857755730, + 361691330597705, + 437350768070516, + 21888242871839275222246405745257275088548364400416034343698203881366482628193, + 21888242871839275222246405745257275088548364400416034343698203665984775509910, + 301018487226727, + 21888242871839275222246405745257275088548364400416034343698203841669181375292, + 21888242871839275222246405745257275088548364400416034343698203850315655087333, + 21888242871839275222246405745257275088548364400416034343698203998140154961441, + 165288435934967, + 21888242871839275222246405745257275088548364400416034343698203957759068703043, + 21888242871839275222246405745257275088548364400416034343698203688185852735162, + 423641382100532, + 21888242871839275222246405745257275088548364400416034343698204147611037374225, + 309206117299754, + 358566314148949, + 21888242871839275222246405745257275088548364400416034343698203956438856575993, + 21888242871839275222246405745257275088548364400416034343698203824622885262072, + 21888242871839275222246405745257275088548364400416034343698204037285820451683, + 21888242871839275222246405745257275088548364400416034343698204017713122780254, + 21888242871839275222246405745257275088548364400416034343698203741681516288781, + 21888242871839275222246405745257275088548364400416034343698203963507477750785, + 75468135795955, + 403284695752483, + 21888242871839275222246405745257275088548364400416034343698203866810773001340, + 21888242871839275222246405745257275088548364400416034343698203975415834882721, + 21888242871839275222246405745257275088548364400416034343698203707842429259654, + 21888242871839275222246405745257275088548364400416034343698203774353810379304, + 138637570775415, + 115922169277270, + 522280865587611, + 21888242871839275222246405745257275088548364400416034343698203770431759074104, + 21888242871839275222246405745257275088548364400416034343698203859434520205145, + 21888242871839275222246405745257275088548364400416034343698203791283004382438, + 230681148998563, + 21888242871839275222246405745257275088548364400416034343698203987560868513730, + 21888242871839275222246405745257275088548364400416034343698203691272812004868, + 21888242871839275222246405745257275088548364400416034343698203929492581411263, + 21888242871839275222246405745257275088548364400416034343698204099410305725203, + 404199852086867, + 257301489182910, + 400723235001716, + 398636515331327, + 517774719698833, + 9937463633401, + 143487768631713, + 21888242871839275222246405745257275088548364400416034343698203862345595395998, + 21888242871839275222246405745257275088548364400416034343698203694465249738359, + 174338888200218, + 21888242871839275222246405745257275088548364400416034343698203862339708005962, + 21888242871839275222246405745257275088548364400416034343698204125499633797184, + 21888242871839275222246405745257275088548364400416034343698203865169054090604, + 227229683782154, + 368037083676419, + 97225527453561, + 21888242871839275222246405745257275088548364400416034343698203698085072114450, + 21888242871839275222246405745257275088548364400416034343698204178811009417901, + 21888242871839275222246405745257275088548364400416034343698204037615506823910, + 21888242871839275222246405745257275088548364400416034343698204140434566504426, + 21888242871839275222246405745257275088548364400416034343698203983055224515489, + 485063831174991, + 21888242871839275222246405745257275088548364400416034343698203689621063138711, + 21888242871839275222246405745257275088548364400416034343698203690219149276696, + 70832008663599, + 21888242871839275222246405745257275088548364400416034343698204173529429218830, + 21888242871839275222246405745257275088548364400416034343698204079347320838040, + 21888242871839275222246405745257275088548364400416034343698203843856484771955, + 167609492417148, + 544165342116214, + 90993371499820, + 21888242871839275222246405745257275088548364400416034343698203987439328883996, + 21888242871839275222246405745257275088548364400416034343698203857854664402946, + 21888242871839275222246405745257275088548364400416034343698203873004014765599, + 351015137324492, + 82914655887692, + 326918967304986, + 21888242871839275222246405745257275088548364400416034343698203792324031466724, + 152571474892139, + 99158271964028, + 211288301954440, + 439796049183087, + 21888242871839275222246405745257275088548364400416034343698203749864427001508, + 21888242871839275222246405745257275088548364400416034343698203728480106222744, + 21888242871839275222246405745257275088548364400416034343698203783363348202613, + 21888242871839275222246405745257275088548364400416034343698203953398999292057, + 11077706901782, + 350332515282225, + 21888242871839275222246405745257275088548364400416034343698204000866008097826, + 150062155798127, + 506281551955240, + 442846665994344, + 21888242871839275222246405745257275088548364400416034343698203671932584578012, + 224341230592851, + 344839667464554, + 21888242871839275222246405745257275088548364400416034343698204024971056198571, + 357582057046668, + 21888242871839275222246405745257275088548364400416034343698203735197423835493, + 21888242871839275222246405745257275088548364400416034343698203783712884249180, + 420529086581101, + 21888242871839275222246405745257275088548364400416034343698203771838287536501, + 21888242871839275222246405745257275088548364400416034343698203754685939794905, + 21888242871839275222246405745257275088548364400416034343698203740857791923735, + 560626255796405, + 166580510935087, + 300413197915435, + 20602808059481, + 335279400118512, + 21888242871839275222246405745257275088548364400416034343698203857435696381101, + 21888242871839275222246405745257275088548364400416034343698203657629294046528, + 21888242871839275222246405745257275088548364400416034343698203760247945873622, + 21888242871839275222246405745257275088548364400416034343698204119568769697236, + 21888242871839275222246405745257275088548364400416034343698203777033713048856, + 21888242871839275222246405745257275088548364400416034343698204061997089902095, + 21888242871839275222246405745257275088548364400416034343698204085953797685710, + 21888242871839275222246405745257275088548364400416034343698203909482655960997, + 21888242871839275222246405745257275088548364400416034343698204107539052506570, + 93880989697029, + 217639657160004, + 554343252814540, + 393212041452863, + 31117994101883, + 271395527635308, + 21888242871839275222246405745257275088548364400416034343698204017250999241918, + 21888242871839275222246405745257275088548364400416034343698204170519720059964, + 102671813689377, + 118380330703025, + 21888242871839275222246405745257275088548364400416034343698204020179927060899, + 21888242871839275222246405745257275088548364400416034343698203843882878086725, + 21888242871839275222246405745257275088548364400416034343698204097421699193556, + 292853430293064, + 121287648292095, + 127866484190787, + 137723428554370, + 414529521478519, + 21888242871839275222246405745257275088548364400416034343698203926146792949675, + 21888242871839275222246405745257275088548364400416034343698203805105295096176, + 21888242871839275222246405745257275088548364400416034343698203819638250187624, + 21888242871839275222246405745257275088548364400416034343698204098161776963448, + 21888242871839275222246405745257275088548364400416034343698203877084393242535, + 21888242871839275222246405745257275088548364400416034343698204184163871585741, + 21888242871839275222246405745257275088548364400416034343698204091037437660949, + 21888242871839275222246405745257275088548364400416034343698203815826906164233, + 508550824561906, + 21888242871839275222246405745257275088548364400416034343698203677734230836580, + 21888242871839275222246405745257275088548364400416034343698203816844107087402, + 402476871393264, + 21888242871839275222246405745257275088548364400416034343698203922139612632479, + 394361634765206, + 281742897217673, + 370651495377705, + 459932926743083, + 201974959333537, + 511513863725729, + 21888242871839275222246405745257275088548364400416034343698203878496381253051, + 398424779077397, + 549704712056681, + 14172296685938, + 123722197900481, + 406893947468053, + 318389901446686, + 520036108744245, + 172701646083676, + 410704273504998, + 21888242871839275222246405745257275088548364400416034343698203675599490400587, + 519251579617597, + 424248340821705, + 21888242871839275222246405745257275088548364400416034343698204029765315789297, + 21888242871839275222246405745257275088548364400416034343698204017382499589141, + 21888242871839275222246405745257275088548364400416034343698204158211536805084, + 185632024937052, + 21888242871839275222246405745257275088548364400416034343698204086574410721622, + 21888242871839275222246405745257275088548364400416034343698203854885870111097, + 80635497563853, + 138524302758273, + 342802395712551, + 526763450744484, + 247381141162796, + 21888242871839275222246405745257275088548364400416034343698203645691166789320, + 21888242871839275222246405745257275088548364400416034343698204150122148462412, + 21888242871839275222246405745257275088548364400416034343698203802280314845372, + 21888242871839275222246405745257275088548364400416034343698204175520356159749, + 21888242871839275222246405745257275088548364400416034343698203779338170502023, + 40739485834421, + 21888242871839275222246405745257275088548364400416034343698204152425486916430, + 21888242871839275222246405745257275088548364400416034343698203763621344757366, + 21888242871839275222246405745257275088548364400416034343698203801267058476515, + 21888242871839275222246405745257275088548364400416034343698203726382267945404, + 21888242871839275222246405745257275088548364400416034343698203752723700567862, + 185585310795804, + 403297078533236, + 523780877476495, + 118020246998656, + 19345750879612, + 21888242871839275222246405745257275088548364400416034343698204152217463682959, + 21888242871839275222246405745257275088548364400416034343698203816690424684227, + 21888242871839275222246405745257275088548364400416034343698204031919116120996, + 417678438257823, + 21888242871839275222246405745257275088548364400416034343698204082519309206379, + 224632661447587, + 21888242871839275222246405745257275088548364400416034343698203645971932886441, + 21888242871839275222246405745257275088548364400416034343698204107616022279983, + 21888242871839275222246405745257275088548364400416034343698203866681029602202, + 21888242871839275222246405745257275088548364400416034343698203802385313633200, + 21888242871839275222246405745257275088548364400416034343698203804616421118117, + 140866614044509, + 97415730096002, + 458837035601025, + 209991048092155, + 21888242871839275222246405745257275088548364400416034343698203649905909553500, + 280463959639165, + 287262195776985, + 21888242871839275222246405745257275088548364400416034343698203786634232805107, + 21888242871839275222246405745257275088548364400416034343698204123922027304617, + 158398608551794, + 21888242871839275222246405745257275088548364400416034343698203865746755465896, + 325922128882698, + 131539735571935, + 21888242871839275222246405745257275088548364400416034343698204108046808549563, + 21888242871839275222246405745257275088548364400416034343698203809609525088867, + 21888242871839275222246405745257275088548364400416034343698204059449208627647, + 21888242871839275222246405745257275088548364400416034343698203975937906305275, + 353609620727551, + 21888242871839275222246405745257275088548364400416034343698203798705196181973, + 21888242871839275222246405745257275088548364400416034343698203773676283053131, + 96777303719023, + 112660094753734, + 21888242871839275222246405745257275088548364400416034343698204150878265025890, + 21888242871839275222246405745257275088548364400416034343698204144033122190987, + 144617200277918, + 475296492500707, + 271075926064058, + 150210127374197, + 21888242871839275222246405745257275088548364400416034343698203655214873810452, + 171150195994865, + 21888242871839275222246405745257275088548364400416034343698203988636621340576, + 182843486857260, + 99472863466135, + 21888242871839275222246405745257275088548364400416034343698203935897358560520, + 412806609255228, + 21888242871839275222246405745257275088548364400416034343698204112589522972163, + 21888242871839275222246405745257275088548364400416034343698203898233588977728, + 21888242871839275222246405745257275088548364400416034343698204132085251318950, + 21888242871839275222246405745257275088548364400416034343698203869688728771267, + 188491529065354, + 484385381470502, + 21888242871839275222246405745257275088548364400416034343698204115603722037361, + 21888242871839275222246405745257275088548364400416034343698203643915310065252, + 21888242871839275222246405745257275088548364400416034343698203936083647278315, + 345297516991747, + 216243939188359, + 21888242871839275222246405745257275088548364400416034343698204133642526579034, + 108224345962166, + 21888242871839275222246405745257275088548364400416034343698203753200117454900, + 90483794725933, + 155436298418469, + 466693772287567, + 363851077382138, + 21888242871839275222246405745257275088548364400416034343698204145711749005511, + 21888242871839275222246405745257275088548364400416034343698203865484193523623, + 392192828814297, + 529091318873209, + 21888242871839275222246405745257275088548364400416034343698203792414002417063, + 229013683295546, + 21888242871839275222246405745257275088548364400416034343698203668436811504086, + 372062822387706, + 21888242871839275222246405745257275088548364400416034343698203717777262727770, + 471468852881423, + 21888242871839275222246405745257275088548364400416034343698203761903102933325, + 160335616367434, + 190454403025724, + 21888242871839275222246405745257275088548364400416034343698203907179423735626, + 21888242871839275222246405745257275088548364400416034343698203966040325362093, + 21888242871839275222246405745257275088548364400416034343698204001527590507234, + 475987958796020, + 21888242871839275222246405745257275088548364400416034343698203939879767903205, + 448792362562769, + 60841127457107, + 21888242871839275222246405745257275088548364400416034343698203964891344548443, + 21888242871839275222246405745257275088548364400416034343698204077623096356485, + 21888242871839275222246405745257275088548364400416034343698204186325694493884, + 21888242871839275222246405745257275088548364400416034343698204124277687742248, + 21888242871839275222246405745257275088548364400416034343698203697638985641964, + 26562633671609, + 8089933910901, + 243359591767347, + 76241360616674, + 21888242871839275222246405745257275088548364400416034343698203948392484125405, + 21888242871839275222246405745257275088548364400416034343698204051500075469159, + 483577759220242, + 518835461126564, + 231811704944699, + 21888242871839275222246405745257275088548364400416034343698204107041205709767, + 387292404407861, + 149939275536961, + 433455974640051, + 539294478596301, + 481546421764745, + 180992498036293, + 21888242871839275222246405745257275088548364400416034343698203981939066033889, + 21888242871839275222246405745257275088548364400416034343698204163641925200267, + 21888242871839275222246405745257275088548364400416034343698203775181529795609, + 21888242871839275222246405745257275088548364400416034343698203684294610512927, + 287949135012220, + 21888242871839275222246405745257275088548364400416034343698204093386983210340, + 21888242871839275222246405745257275088548364400416034343698204151871464901758, + 21888242871839275222246405745257275088548364400416034343698203800997592661912, + 271075252261238, + 347742425862062, + 292792720459139, + 21888242871839275222246405745257275088548364400416034343698203834661121470372, + 57273533417149, + 539685926971420, + 128248819018752, + 425833869827165, + 21888242871839275222246405745257275088548364400416034343698203794451614159004, + 549287401272142, + 406093124757342, + 21888242871839275222246405745257275088548364400416034343698203960271240097201, + 21888242871839275222246405745257275088548364400416034343698203687009594956259, + 500716916322498, + 21888242871839275222246405745257275088548364400416034343698204057810988941515, + 387266938852573, + 239743063689305, + 15646711316214, + 21888242871839275222246405745257275088548364400416034343698203645817230410751, + 132326221928768, + 21888242871839275222246405745257275088548364400416034343698204138718949158114, + 21888242871839275222246405745257275088548364400416034343698204088986026107393, + 520476254079811, + 536272506218961, + 12795934214014, + 21888242871839275222246405745257275088548364400416034343698203882109343857972, + 212806624270416, + 252721171095986, + 456470325621448, + 86923784107618, + 415038683554676, + 21888242871839275222246405745257275088548364400416034343698203913717231659994, + 112102004993744, + 426357573257499, + 21888242871839275222246405745257275088548364400416034343698203738945413435565, + 21888242871839275222246405745257275088548364400416034343698203701477538852077, + 21888242871839275222246405745257275088548364400416034343698204099276968752405, + 21888242871839275222246405745257275088548364400416034343698203993460274367650, + 349665490732131, + 550105435425546, + 294665687885864, + 21888242871839275222246405745257275088548364400416034343698204100285606563801, + 21888242871839275222246405745257275088548364400416034343698204100218122550371, + 441772305412802, + 21888242871839275222246405745257275088548364400416034343698203817394243490041, + 21888242871839275222246405745257275088548364400416034343698204036926725178927, + 265717610362388, + 21888242871839275222246405745257275088548364400416034343698204107055483154653, + 178320512808641, + 452875124715649, + 245172964941654, + 21888242871839275222246405745257275088548364400416034343698203906896276320021, + 21888242871839275222246405745257275088548364400416034343698204024478822342328, + 21888242871839275222246405745257275088548364400416034343698203861805575363609, + 31350615945757, + 21888242871839275222246405745257275088548364400416034343698203994912811507069, + 21888242871839275222246405745257275088548364400416034343698203846743648674929, + 358929989213635, + 19875694716557, + 113354359354000, + 21888242871839275222246405745257275088548364400416034343698204180922079354899, + 314353749110371, + 317549945500431, + 21888242871839275222246405745257275088548364400416034343698203678516201252423, + 344592727599975, + 21888242871839275222246405745257275088548364400416034343698203931293419127949, + 21888242871839275222246405745257275088548364400416034343698204022053489059987, + 21888242871839275222246405745257275088548364400416034343698203705779171126232, + 32915938508218, + 431983837547796, + 21888242871839275222246405745257275088548364400416034343698203876358368572887, + 259988267432247, + 21888242871839275222246405745257275088548364400416034343698204150766276712978, + 105157377066415, + 21888242871839275222246405745257275088548364400416034343698204149972929089554, + 463350331733574, + 447923010392046, + 425825581641533, + 21888242871839275222246405745257275088548364400416034343698203800797808783468, + 431941768278606, + 21888242871839275222246405745257275088548364400416034343698204024689014049404, + 21888242871839275222246405745257275088548364400416034343698204020939296506609, + 21888242871839275222246405745257275088548364400416034343698204067509044659442, + 21888242871839275222246405745257275088548364400416034343698204154657722767956, + 21888242871839275222246405745257275088548364400416034343698204099843004426996, + 21888242871839275222246405745257275088548364400416034343698203894406318014773, + 21888242871839275222246405745257275088548364400416034343698203846196364498080, + 21888242871839275222246405745257275088548364400416034343698204041147285231674, + 21888242871839275222246405745257275088548364400416034343698203705584961158083, + 181836794763249, + 21888242871839275222246405745257275088548364400416034343698204104805157093525, + 21888242871839275222246405745257275088548364400416034343698203943617697150709, + 21888242871839275222246405745257275088548364400416034343698203917939107979269, + 21888242871839275222246405745257275088548364400416034343698203973086284339347, + 293930685357574, + 21888242871839275222246405745257275088548364400416034343698203764418888311235, + 21888242871839275222246405745257275088548364400416034343698203852241722027613, + 21888242871839275222246405745257275088548364400416034343698204098567001702293, + 414480926614617, + 21888242871839275222246405745257275088548364400416034343698203962943528901808, + 21888242871839275222246405745257275088548364400416034343698204023324023026301, + 424688374268130, + 16247834297766, + 21888242871839275222246405745257275088548364400416034343698203862966512429615, + 129888352235993, + 106858595849951, + 249619120984573, + 21888242871839275222246405745257275088548364400416034343698204173077209643864, + 21888242871839275222246405745257275088548364400416034343698203846661261971207, + 21888242871839275222246405745257275088548364400416034343698203753203233448598, + 21888242871839275222246405745257275088548364400416034343698204136152843368860, + 21888242871839275222246405745257275088548364400416034343698203861766013490062, + 21888242871839275222246405745257275088548364400416034343698203651031298715452, + 21888242871839275222246405745257275088548364400416034343698204126413006964006, + 508415513177919, + 139353171258863, + 21888242871839275222246405745257275088548364400416034343698204186078814237764, + 21888242871839275222246405745257275088548364400416034343698204086650943248175, + 495486932484987, + 438949507778947, + 21888242871839275222246405745257275088548364400416034343698203924327947448980, + 330945845063501, + 313467608563961, + 278300464956290, + 21888242871839275222246405745257275088548364400416034343698203879285276448329, + 251282399548701, + 13444588434515, + 21888242871839275222246405745257275088548364400416034343698203921221435610198, + 21888242871839275222246405745257275088548364400416034343698203937137586546362, + 21888242871839275222246405745257275088548364400416034343698204111954506376426, + 160484693170099, + 21888242871839275222246405745257275088548364400416034343698204119039996821909, + 21888242871839275222246405745257275088548364400416034343698203847772106456339, + 41755045927136, + 444866638334477, + 21888242871839275222246405745257275088548364400416034343698203812271327920373, + 556824494992036, + 21888242871839275222246405745257275088548364400416034343698204122746355218275, + 140903808819685, + 371345015902576, + 26431202785230, + 415122184858401, + 21888242871839275222246405745257275088548364400416034343698203967791720242367, + 473116471188444, + 21888242871839275222246405745257275088548364400416034343698204063517157102037, + 21888242871839275222246405745257275088548364400416034343698204104577205648551, + 21888242871839275222246405745257275088548364400416034343698204152041744390213, + 21888242871839275222246405745257275088548364400416034343698203864185975848636, + 373999891646325, + 21888242871839275222246405745257275088548364400416034343698203863630891277490, + 21888242871839275222246405745257275088548364400416034343698203927153761692588, + 21888242871839275222246405745257275088548364400416034343698204138797415316669, + 21888242871839275222246405745257275088548364400416034343698204016086847458574, + 21888242871839275222246405745257275088548364400416034343698204104880071659633, + 199851927363585, + 403385069012210, + 21888242871839275222246405745257275088548364400416034343698203920743887969237, + 403142329999799, + 265675626135898, + 21888242871839275222246405745257275088548364400416034343698204122929153595257, + 112873366601137, + 21888242871839275222246405745257275088548364400416034343698203840827507173962, + 21888242871839275222246405745257275088548364400416034343698204026816231131266, + 21888242871839275222246405745257275088548364400416034343698204094631100431513, + 21888242871839275222246405745257275088548364400416034343698204009043400267017, + 21888242871839275222246405745257275088548364400416034343698203786555177486402, + 469803104341725, + 21888242871839275222246405745257275088548364400416034343698203883056629495406, + 21888242871839275222246405745257275088548364400416034343698203826057839087928, + 362662718805720, + 21888242871839275222246405745257275088548364400416034343698203697956364237242, + 21888242871839275222246405745257275088548364400416034343698203777783678305805, + 399428895608400, + 350658415206208, + 21888242871839275222246405745257275088548364400416034343698203788975687233875, + 21888242871839275222246405745257275088548364400416034343698203937495406261994, + 213119506887157, + 21888242871839275222246405745257275088548364400416034343698203758537473829997, + 21888242871839275222246405745257275088548364400416034343698204056643606289557, + 21888242871839275222246405745257275088548364400416034343698204172334888089927, + 21888242871839275222246405745257275088548364400416034343698203965217855335791, + 170882761855641, + 21888242871839275222246405745257275088548364400416034343698203780416642700802, + 21888242871839275222246405745257275088548364400416034343698203940380571748195, + 196927971778365, + 301475532813725, + 68180249559731, + 145301284113866, + 305337167776575, + 485598401933368, + 21888242871839275222246405745257275088548364400416034343698203912511348425535, + 21888242871839275222246405745257275088548364400416034343698203670962370031368, + 21888242871839275222246405745257275088548364400416034343698204053697094248253, + 21888242871839275222246405745257275088548364400416034343698203701192413072433, + 21888242871839275222246405745257275088548364400416034343698203699583353691624, + 21888242871839275222246405745257275088548364400416034343698204003961821008129, + 175321189943797, + 531489633356192, + 21888242871839275222246405745257275088548364400416034343698204126977592897516, + 493107578995016, + 517187329862693, + 21888242871839275222246405745257275088548364400416034343698203810113368777244, + 21888242871839275222246405745257275088548364400416034343698203936441214766404, + 21888242871839275222246405745257275088548364400416034343698203738328772598141, + 61438895686504, + 335902651425151, + 77119759299825, + 4720619728039, + 21888242871839275222246405745257275088548364400416034343698203710497267673465, + 105053972692812, + 175487562135909, + 488835051319424, + 449442529332287, + 557622228530529, + 21888242871839275222246405745257275088548364400416034343698203675826978275007, + 21888242871839275222246405745257275088548364400416034343698203990989792119067, + 276032800460255, + 113436178740694, + 21888242871839275222246405745257275088548364400416034343698203926743120148895, + 204855917678324, + 21888242871839275222246405745257275088548364400416034343698203990179289834120, + 424842125473633, + 21888242871839275222246405745257275088548364400416034343698204030290373505670, + 559835002909154, + 21888242871839275222246405745257275088548364400416034343698203808679014716451, + 21888242871839275222246405745257275088548364400416034343698203831987064695314, + 333702782579081, + 266061669013673, + 308597459839066, + 21888242871839275222246405745257275088548364400416034343698203745773479284266, + 36050532044852, + 369162851511012, + 21888242871839275222246405745257275088548364400416034343698203769678071469475, + 21888242871839275222246405745257275088548364400416034343698203638968471653816, + 344502407707561, + 355070668686974, + 281033003183304, + 21888242871839275222246405745257275088548364400416034343698203753027585036997, + 383395445139595, + 21888242871839275222246405745257275088548364400416034343698203841476651324620, + 242925223993095, + 259653528267759, + 21888242871839275222246405745257275088548364400416034343698204136473555479028, + 21888242871839275222246405745257275088548364400416034343698203743147955537773, + 60112940425366, + 556406374175760, + 50292284254866, + 21888242871839275222246405745257275088548364400416034343698203807314767843054, + 21888242871839275222246405745257275088548364400416034343698203903144874563778, + 21888242871839275222246405745257275088548364400416034343698203915437457401491, + 411911167433295, + 21888242871839275222246405745257275088548364400416034343698203802736071947567, + 21888242871839275222246405745257275088548364400416034343698203950547796849860, + 325961936340553, + 21888242871839275222246405745257275088548364400416034343698203957787188837176, + 471458710238874, + 21888242871839275222246405745257275088548364400416034343698204180790435884202, + 21888242871839275222246405745257275088548364400416034343698203972577558094370, + 21888242871839275222246405745257275088548364400416034343698203920537716673057, + 291495302694672, + 131501549442294, + 525288352690450, + 47285462532700, + 303184984792105, + 546493352228891, + 28628362042609, + 473705473719293, + 21888242871839275222246405745257275088548364400416034343698203827197127019212, + 208950386666475, + 285054190917090, + 516074364314603, + 21888242871839275222246405745257275088548364400416034343698204125432752898810, + 21888242871839275222246405745257275088548364400416034343698203824445372830874, + 21888242871839275222246405745257275088548364400416034343698204124884777303522, + 21888242871839275222246405745257275088548364400416034343698203937343630834872, + 155383067768436, + 255647675099318, + 66937908391749, + 21888242871839275222246405745257275088548364400416034343698203826215093072050, + 21888242871839275222246405745257275088548364400416034343698203857376852951358, + 389793840500559, + 21888242871839275222246405745257275088548364400416034343698203961941304684218, + 533130110232250, + 21888242871839275222246405745257275088548364400416034343698204150266962587350, + 195627849130361, + 21888242871839275222246405745257275088548364400416034343698203827824324751089, + 21888242871839275222246405745257275088548364400416034343698203834357159271242, + 21888242871839275222246405745257275088548364400416034343698204023753075763649, + 560788730396452, + 21888242871839275222246405745257275088548364400416034343698203769325539343742, + 21888242871839275222246405745257275088548364400416034343698204076730505920412, + 442998521377609, + 363365244969196, + 3605875062089, + 432071164535758, + 286308062452492, + 21888242871839275222246405745257275088548364400416034343698204080247894194598, + 178574820353135, + 21888242871839275222246405745257275088548364400416034343698204096142668824337, + 21888242871839275222246405745257275088548364400416034343698203756205916483494, + 214476114590750, + 21888242871839275222246405745257275088548364400416034343698203754178522474563, + 279296328184065, + 144885633044041, + 490183974934092, + 333566678127059, + 21888242871839275222246405745257275088548364400416034343698203790032275700571, + 235314825663071, + 296714052404853, + 487333912660800, + 21888242871839275222246405745257275088548364400416034343698204103910123532671, + 521141942433481, + 21888242871839275222246405745257275088548364400416034343698203894946824678794, + 21888242871839275222246405745257275088548364400416034343698203767463250845124, + 21888242871839275222246405745257275088548364400416034343698203928679563888062, + 136621903693773, + 21888242871839275222246405745257275088548364400416034343698203806347283821789, + 496690954418697, + 561972325011054, + 313516585826169, + 231386147115193, + 21888242871839275222246405745257275088548364400416034343698203966551161892861, + 21888242871839275222246405745257275088548364400416034343698204131569341357537, + 21888242871839275222246405745257275088548364400416034343698203782154476928142, + 21888242871839275222246405745257275088548364400416034343698203908881843695234, + 161005936291601, + 21888242871839275222246405745257275088548364400416034343698203884161485285667, + 21888242871839275222246405745257275088548364400416034343698203698931079937675, + 21888242871839275222246405745257275088548364400416034343698203851565957861014, + 65858249638526, + 21888242871839275222246405745257275088548364400416034343698203835453851320545, + 221320314329784, + 215554655263872, + 21888242871839275222246405745257275088548364400416034343698204049482803531330, + 263171431016920, + 435987930064133, + 143216537092333, + 21888242871839275222246405745257275088548364400416034343698204164594539952306, + 21888242871839275222246405745257275088548364400416034343698204028475868518204, + 21888242871839275222246405745257275088548364400416034343698204000628842765484, + 123404948663904, + 21888242871839275222246405745257275088548364400416034343698203930016372346348, + 83091546474576, + 189939653501458, + 39923747790809, + 21888242871839275222246405745257275088548364400416034343698203714412456921795, + 21888242871839275222246405745257275088548364400416034343698203814294387925103, + 21888242871839275222246405745257275088548364400416034343698203867293146739528, + 21888242871839275222246405745257275088548364400416034343698203867443150019779, + 60488128305410, + 237138818983974, + 21888242871839275222246405745257275088548364400416034343698203943101881019050, + 194063499537522, + 21888242871839275222246405745257275088548364400416034343698203969246497920113, + 21888242871839275222246405745257275088548364400416034343698203987205565461644, + 463433069717658, + 21888242871839275222246405745257275088548364400416034343698203665238001468454, + 272547184565976, + 282703752080264, + 21888242871839275222246405745257275088548364400416034343698204156258170480243, + 189126280137381, + 93870632525628, + 443174397258270, + 179970599254343, + 21888242871839275222246405745257275088548364400416034343698203975829867971691, + 21888242871839275222246405745257275088548364400416034343698203784776713136583, + 534820634671295, + 306339251797924, + 21888242871839275222246405745257275088548364400416034343698204130137643690310, + 296876522606047, + 21888242871839275222246405745257275088548364400416034343698204106149341306753, + 422716346808106, + 21888242871839275222246405745257275088548364400416034343698203627071115600413, + 21888242871839275222246405745257275088548364400416034343698203923628090896520, + 173212413572369, + 21888242871839275222246405745257275088548364400416034343698204131715126490849, + 21888242871839275222246405745257275088548364400416034343698203807467813810482, + 21888242871839275222246405745257275088548364400416034343698203800816121622554, + 21888242871839275222246405745257275088548364400416034343698203725150745653394, + 21888242871839275222246405745257275088548364400416034343698203803534835708907, + 21888242871839275222246405745257275088548364400416034343698203752656705262185, + 21888242871839275222246405745257275088548364400416034343698203824323159098419, + 21888242871839275222246405745257275088548364400416034343698204101060648012976, + 553419819788091, + 351732645063055, + 424645884774362, + 21888242871839275222246405745257275088548364400416034343698203654980606134845, + 269685142459974, + 21888242871839275222246405745257275088548364400416034343698204175412442023357, + 414229924977048, + 551527839798155, + 21888242871839275222246405745257275088548364400416034343698204101456650444484, + 21888242871839275222246405745257275088548364400416034343698203959784023150309, + 152038662758048, + 21888242871839275222246405745257275088548364400416034343698204048131440557213, + 21888242871839275222246405745257275088548364400416034343698204111744160070947, + 539595203368383, + 456034414305773, + 402426797512699, + 21888242871839275222246405745257275088548364400416034343698204158207315987424, + 290857464243473, + 21888242871839275222246405745257275088548364400416034343698204159377391342964, + 423688816488720, + 21888242871839275222246405745257275088548364400416034343698203696245926819755, + 196409702053743, + 14960126115821, + 21888242871839275222246405745257275088548364400416034343698203778059582392694, + 21888242871839275222246405745257275088548364400416034343698204032839097653463, + 490246031142443, + 21888242871839275222246405745257275088548364400416034343698203827764526079423, + 21888242871839275222246405745257275088548364400416034343698204046001475340324, + 21888242871839275222246405745257275088548364400416034343698203933161762490381, + 21888242871839275222246405745257275088548364400416034343698203841631111364990, + 21888242871839275222246405745257275088548364400416034343698203921010181555461, + 238599687963132, + 21888242871839275222246405745257275088548364400416034343698204003312556206519, + 370128533096661, + 21888242871839275222246405745257275088548364400416034343698204020708846327288, + 21888242871839275222246405745257275088548364400416034343698204121085622083688, + 32126928440558, + 21888242871839275222246405745257275088548364400416034343698204135279414068778, + 362765432759955, + 408857708006975, + 360544938814507, + 21888242871839275222246405745257275088548364400416034343698203996256634542568, + 21888242871839275222246405745257275088548364400416034343698203889375667569132, + 370234699108731, + 21888242871839275222246405745257275088548364400416034343698203752578916610448, + 21888242871839275222246405745257275088548364400416034343698204130862189869945, + 21888242871839275222246405745257275088548364400416034343698204063593431085126, + 21888242871839275222246405745257275088548364400416034343698203689629010517394, + 390658978314692, + 21888242871839275222246405745257275088548364400416034343698203988567322311059, + 474649840648651, + 506861383851797, + 21888242871839275222246405745257275088548364400416034343698203918791906237861, + 164760882316111, + 534746330115083, + 460001069009789, + 21888242871839275222246405745257275088548364400416034343698204161557339579486, + 21888242871839275222246405745257275088548364400416034343698203862846324493057, + 224985885322354, + 21888242871839275222246405745257275088548364400416034343698203979252399985651, + 21888242871839275222246405745257275088548364400416034343698203809515296159917, + 149924191625652, + 21888242871839275222246405745257275088548364400416034343698204047937719601189, + 131024540822866, + 495926306918952, + 21888242871839275222246405745257275088548364400416034343698203838298969323046, + 21888242871839275222246405745257275088548364400416034343698203724393273140226, + 10658350691900, + 21888242871839275222246405745257275088548364400416034343698203927920602862389, + 21888242871839275222246405745257275088548364400416034343698203829384071795857, + 106206880339911, + 197102236835249, + 253618637787439, + 21888242871839275222246405745257275088548364400416034343698203848648102430797, + 177175644690444, + 21888242871839275222246405745257275088548364400416034343698203717499163666806, + 21888242871839275222246405745257275088548364400416034343698204182717223535871, + 322467679108099, + 21888242871839275222246405745257275088548364400416034343698204174569691486555, + 524251123227794, + 21888242871839275222246405745257275088548364400416034343698203918572552697426, + 4322080214554, + 21888242871839275222246405745257275088548364400416034343698203745478524471087, + 237060265899710, + 515028903620893, + 21888242871839275222246405745257275088548364400416034343698203928329997745100, + 303956761372891, + 407103634372696, + 21888242871839275222246405745257275088548364400416034343698204042353411200747, + 23904784656727, + 21888242871839275222246405745257275088548364400416034343698203680608413478052, + 280371619845805, + 21888242871839275222246405745257275088548364400416034343698203697524732006472, + 21888242871839275222246405745257275088548364400416034343698203911328705117992, + 21888242871839275222246405745257275088548364400416034343698203873988603209404, + 21888242871839275222246405745257275088548364400416034343698204089464892242974, + 21888242871839275222246405745257275088548364400416034343698203923201862897188, + 21888242871839275222246405745257275088548364400416034343698203935617496174218, + 35683915874685, + 267180361872417, + 21888242871839275222246405745257275088548364400416034343698203693505381920753, + 21888242871839275222246405745257275088548364400416034343698204043492572016827, + 179732710564429, + 159833158868297, + 21888242871839275222246405745257275088548364400416034343698203689715708888084, + 52111941158519, + 21888242871839275222246405745257275088548364400416034343698203971557271343115, + 32236325671771, + 21888242871839275222246405745257275088548364400416034343698203691367931387954, + 21888242871839275222246405745257275088548364400416034343698204175841554947811, + 346238034735037, + 21888242871839275222246405745257275088548364400416034343698203846940951800989, + 21888242871839275222246405745257275088548364400416034343698203821077162522126, + 32784321179147, + 21888242871839275222246405745257275088548364400416034343698204089329963846657, + 266028105770408, + 21888242871839275222246405745257275088548364400416034343698203764523223135448, + 171077395176073, + 102846267129626, + 21888242871839275222246405745257275088548364400416034343698203829891852027789, + 413860533577053, + 21888242871839275222246405745257275088548364400416034343698203984814402095823, + 188890213446198, + 554101099433497, + 490450413779067, + 21888242871839275222246405745257275088548364400416034343698203770770310455461, + 21888242871839275222246405745257275088548364400416034343698203795160893506638, + 28503598592377, + 21888242871839275222246405745257275088548364400416034343698203821628061845561, + 185007105692497, + 538038246692917, + 433623061558080, + 29912022071102, + 300221118922770, + 392535308020070, + 418819163736646, + 457388557414870, + 21888242871839275222246405745257275088548364400416034343698203868308076460901, + 488372302763169, + 21888242871839275222246405745257275088548364400416034343698204038690624281534, + 61766904206490, + 179963158863855, + 183908496898652, + 21888242871839275222246405745257275088548364400416034343698203895373287876625, + 222663580288833, + 21888242871839275222246405745257275088548364400416034343698203688322608026556, + 21888242871839275222246405745257275088548364400416034343698203978208897510571, + 106576640894713, + 21888242871839275222246405745257275088548364400416034343698203632710291900286, + 162884945612003, + 21888242871839275222246405745257275088548364400416034343698203696714050194448, + 21888242871839275222246405745257275088548364400416034343698203834619268400433, + 21888242871839275222246405745257275088548364400416034343698204055167303005522, + 21888242871839275222246405745257275088548364400416034343698203882073076098431, + 21888242871839275222246405745257275088548364400416034343698203771213447230296, + 21888242871839275222246405745257275088548364400416034343698203821432915763885, + 560807616838486, + 97961364086713, + 101330123028635, + 294008560560928, + 317493793464162, + 107329696648111, + 368880020020322, + 21888242871839275222246405745257275088548364400416034343698203861121814429904, + 232875590521068, + 21888242871839275222246405745257275088548364400416034343698204099845115697144, + 137956643633836, + 268213284912333, + 485443644130441, + 276769980833210, + 21888242871839275222246405745257275088548364400416034343698204072964322355452, + 93198848390352, + 21888242871839275222246405745257275088548364400416034343698203670758618616762, + 21888242871839275222246405745257275088548364400416034343698203984168355182171, + 21888242871839275222246405745257275088548364400416034343698203652699172373921, + 21888242871839275222246405745257275088548364400416034343698203838602740167945, + 21888242871839275222246405745257275088548364400416034343698203785509990737470, + 227198925138037, + 308266032783070, + 21888242871839275222246405745257275088548364400416034343698203812679393925701, + 21888242871839275222246405745257275088548364400416034343698203724884152464143, + 21888242871839275222246405745257275088548364400416034343698203983256221912742, + 21888242871839275222246405745257275088548364400416034343698203834998204605997, + 21888242871839275222246405745257275088548364400416034343698204074817830199396, + 510810453271304, + 21888242871839275222246405745257275088548364400416034343698203713309526888146, + 76152909046642, + 197859925537019, + 555048511915754, + 21888242871839275222246405745257275088548364400416034343698203847412834597667, + 473463237989269, + 387679945881063, + 260443455355111, + 21888242871839275222246405745257275088548364400416034343698204116212558405900, + 21888242871839275222246405745257275088548364400416034343698203906713655666765, + 21888242871839275222246405745257275088548364400416034343698203829747956382417, + 551583593114486, + 21888242871839275222246405745257275088548364400416034343698203658506317530375, + 21888242871839275222246405745257275088548364400416034343698204112275521956623, + 21888242871839275222246405745257275088548364400416034343698203976248056411938, + 21888242871839275222246405745257275088548364400416034343698203745146855920440, + 21888242871839275222246405745257275088548364400416034343698203897075925029735, + 78730932348064, + 172356035456247, + 21888242871839275222246405745257275088548364400416034343698203770329606326100, + 21888242871839275222246405745257275088548364400416034343698203987109654904675, + 224558767179063, + 21888242871839275222246405745257275088548364400416034343698203940439641887801, + 72908786617210, + 215149994337416, + 21888242871839275222246405745257275088548364400416034343698203684177500585562, + 21888242871839275222246405745257275088548364400416034343698203743701883655030, + 380332360175715, + 21888242871839275222246405745257275088548364400416034343698203856379805109930, + 139660038981724, + 234904742904380, + 179285203310120, + 66913070428865, + 353408727936833, + 322198938529412, + 282299682418603, + 91647310308618, + 514469585550724, + 21888242871839275222246405745257275088548364400416034343698204013680181983390, + 226191319584781, + 21888242871839275222246405745257275088548364400416034343698203822244924595237, + 21888242871839275222246405745257275088548364400416034343698203790807809866605, + 21888242871839275222246405745257275088548364400416034343698203803937378928070, + 21888242871839275222246405745257275088548364400416034343698204169898487539095, + 21888242871839275222246405745257275088548364400416034343698203994411300599101, + 363747321633149, + 166197432147586, + 405616912683491, + 550372395372821, + 231545723790723, + 300625384165061, + 521380510798154, + 21888242871839275222246405745257275088548364400416034343698203810696545357519, + 434398971251934, + 21888242871839275222246405745257275088548364400416034343698203803908654142258, + 92748668280087, + 21888242871839275222246405745257275088548364400416034343698204015073962025030, + 21888242871839275222246405745257275088548364400416034343698204102369344294400, + 489692535151350, + 27503866912316, + 552752155658925, + 440732680026977, + 75271818025574, + 21888242871839275222246405745257275088548364400416034343698203819168142170162, + 21888242871839275222246405745257275088548364400416034343698203891219866575730, + 101221065443434, + 21888242871839275222246405745257275088548364400416034343698204085536273277985, + 21888242871839275222246405745257275088548364400416034343698203652070786912566, + 340597259948437, + 251020105895603, + 21888242871839275222246405745257275088548364400416034343698204069949838150031, + 21888242871839275222246405745257275088548364400416034343698204083184181954005, + 21888242871839275222246405745257275088548364400416034343698204072231572968362, + 21888242871839275222246405745257275088548364400416034343698203770094165346164, + 21888242871839275222246405745257275088548364400416034343698204108335031857693, + 413372416559577, + 242840916100725, + 21888242871839275222246405745257275088548364400416034343698203889696734382853, + 491682964195840, + 446289687305644, + 21888242871839275222246405745257275088548364400416034343698204084140499421324, + 21888242871839275222246405745257275088548364400416034343698203968539088281243, + 221119730767648, + 21888242871839275222246405745257275088548364400416034343698204091585931751118, + 10883471014612, + 21888242871839275222246405745257275088548364400416034343698203854350752560257, + 297790851907801, + 21888242871839275222246405745257275088548364400416034343698204108830081948257, + 21888242871839275222246405745257275088548364400416034343698203908968064374142, + 21888242871839275222246405745257275088548364400416034343698203957272548641895, + 461178714695282, + 21888242871839275222246405745257275088548364400416034343698204005180044904615, + 21888242871839275222246405745257275088548364400416034343698204053342611520482, + 21888242871839275222246405745257275088548364400416034343698204105060058950152, + 21888242871839275222246405745257275088548364400416034343698204059558476180970, + 21888242871839275222246405745257275088548364400416034343698204111769562637812, + 87237818627024, + 21888242871839275222246405745257275088548364400416034343698204159877339190616, + 173693949659321, + 524370460006165, + 367893325861450, + 21888242871839275222246405745257275088548364400416034343698203937458610814213, + 21888242871839275222246405745257275088548364400416034343698204136359345204521, + 99893207884337, + 35491187274205, + 21888242871839275222246405745257275088548364400416034343698203739726017148567, + 21888242871839275222246405745257275088548364400416034343698204069803037900260, + 115438826494738, + 381704645430191, + 321057486341001, + 21888242871839275222246405745257275088548364400416034343698203923769748993651, + 179353005338446, + 291244605007043, + 213315527701787, + 21888242871839275222246405745257275088548364400416034343698203933167818123996, + 203678292304692, + 21888242871839275222246405745257275088548364400416034343698204047329466558945, + 21888242871839275222246405745257275088548364400416034343698204087627932058045, + 21888242871839275222246405745257275088548364400416034343698203928355839622383, + 21888242871839275222246405745257275088548364400416034343698204041512468773976, + 397255488999254, + 21888242871839275222246405745257275088548364400416034343698204135684787055949, + 495904480353506, + 21888242871839275222246405745257275088548364400416034343698203984655484075551, + 21888242871839275222246405745257275088548364400416034343698203624230197957603, + 91621253222546, + 314595966422708, + 21888242871839275222246405745257275088548364400416034343698203833165991874874, + 21888242871839275222246405745257275088548364400416034343698203910915630841794, + 21888242871839275222246405745257275088548364400416034343698203807436818691691, + 183095688151495, + 123358344111879, + 230128805700817, + 21888242871839275222246405745257275088548364400416034343698203706024356875386, + 21888242871839275222246405745257275088548364400416034343698204060039216468960, + 21888242871839275222246405745257275088548364400416034343698203975314340625433, + 164585065682203, + 522743229023636, + 196178305181022, + 465016591959480, + 377368053353613, + 26471012899086, + 21888242871839275222246405745257275088548364400416034343698203883911259132001, + 21888242871839275222246405745257275088548364400416034343698203639842026006359, + 21888242871839275222246405745257275088548364400416034343698204164487816663546, + 145286691457784, + 247189479405865, + 57651155040575, + 226151648402578, + 230430027427028, + 21888242871839275222246405745257275088548364400416034343698203762925103871041, + 21888242871839275222246405745257275088548364400416034343698203692731075545554, + 21888242871839275222246405745257275088548364400416034343698204089005541290652, + 21888242871839275222246405745257275088548364400416034343698203869943990915343, + 255338353509600, + 21888242871839275222246405745257275088548364400416034343698204149812329815329, + 21888242871839275222246405745257275088548364400416034343698203650283378583032, + 21888242871839275222246405745257275088548364400416034343698203939885653120449, + 65505014903745, + 21888242871839275222246405745257275088548364400416034343698203719103234002072, + 359783513255000, + 21888242871839275222246405745257275088548364400416034343698203649800171856099, + 21888242871839275222246405745257275088548364400416034343698203855029098842359, + 21888242871839275222246405745257275088548364400416034343698203845878776205659, + 10274044575745, + 457753073129664, + 21888242871839275222246405745257275088548364400416034343698204035221207871281, + 23043459031605, + 21888242871839275222246405745257275088548364400416034343698203996340756436815, + 21888242871839275222246405745257275088548364400416034343698203755052183629735, + 452943867801628, + 102575519685313, + 21888242871839275222246405745257275088548364400416034343698203732418308632220, + 540046321681320, + 21888242871839275222246405745257275088548364400416034343698203646469353753174, + 21888242871839275222246405745257275088548364400416034343698203802732142127991, + 21888242871839275222246405745257275088548364400416034343698204105517830955246, + 111578167079504, + 21888242871839275222246405745257275088548364400416034343698203973810611910045, + 21888242871839275222246405745257275088548364400416034343698204138753904956963, + 21888242871839275222246405745257275088548364400416034343698203740779338642362, + 21888242871839275222246405745257275088548364400416034343698203873364368513272, + 261597852522509, + 21888242871839275222246405745257275088548364400416034343698203687061163109042, + 21888242871839275222246405745257275088548364400416034343698204087514635897645, + 21888242871839275222246405745257275088548364400416034343698203832329539943482, + 304405332309281, + 21888242871839275222246405745257275088548364400416034343698203916993741390420, + 415596117298827, + 123906966546545, + 343850396704940, + 509727710634050, + 160506003278735, + 21888242871839275222246405745257275088548364400416034343698204095335210513361, + 205536239033409, + 21888242871839275222246405745257275088548364400416034343698203887748588217573, + 514517199249397, + 151897213394981, + 21888242871839275222246405745257275088548364400416034343698203731825672719752, + 342744980425780, + 21888242871839275222246405745257275088548364400416034343698203678637875712501, + 54931253915498, + 21888242871839275222246405745257275088548364400416034343698204166907659731805, + 440839997076496, + 21888242871839275222246405745257275088548364400416034343698203992406448378682, + 551943154249878, + 111706719341461, + 21888242871839275222246405745257275088548364400416034343698203985411190702702, + 21888242871839275222246405745257275088548364400416034343698204109703656296700, + 21888242871839275222246405745257275088548364400416034343698203718296003760445, + 21888242871839275222246405745257275088548364400416034343698203744733596135112, + 21888242871839275222246405745257275088548364400416034343698203954979414667282, + 21888242871839275222246405745257275088548364400416034343698203885331997583934, + 236071464177571, + 21888242871839275222246405745257275088548364400416034343698204136308343288633, + 439475311106098, + 324028747702939, + 379539342258468, + 385898854428314, + 104145773952362, + 21888242871839275222246405745257275088548364400416034343698203940735187724955, + 21647094305495, + 21888242871839275222246405745257275088548364400416034343698203825139652863945, + 21888242871839275222246405745257275088548364400416034343698204039121962078694, + 353757456062841, + 469534549737207, + 136840625177622, + 21888242871839275222246405745257275088548364400416034343698204134909951855332, + 387880143440073, + 377168927214990, + 539666051883635, + 93198404453055, + 194922875816953, + 226786086087615, + 21888242871839275222246405745257275088548364400416034343698203771636006233368, + 541657461493882, + 21888242871839275222246405745257275088548364400416034343698203731699529263683, + 259858815755278, + 548678031483645, + 113984141116456, + 382362749385742, + 387610805950909, + 21888242871839275222246405745257275088548364400416034343698203738310821706964, + 336509775600015, + 108785287187624, + 119006504766664, + 17133260997683, + 21888242871839275222246405745257275088548364400416034343698204061621818269271, + 21888242871839275222246405745257275088548364400416034343698203915395380540332, + 59114063627223, + 299474965211937, + 287706819509354, + 21888242871839275222246405745257275088548364400416034343698203914199206240996, + 21888242871839275222246405745257275088548364400416034343698203984836144110897, + 134926518407098, + 379915211367223, + 21888242871839275222246405745257275088548364400416034343698203924246695221907, + 528885274578724, + 21888242871839275222246405745257275088548364400416034343698203894989441840640, + 21888242871839275222246405745257275088548364400416034343698204185417827060340, + 313953810347420, + 367328459856260, + 495528566024055, + 21888242871839275222246405745257275088548364400416034343698203781481646013252, + 21888242871839275222246405745257275088548364400416034343698203919443244955459, + 449816132084825, + 39222271248494, + 21888242871839275222246405745257275088548364400416034343698203762572633616829, + 31320767930842, + 21888242871839275222246405745257275088548364400416034343698204039326551792591, + 391015984257775, + 21888242871839275222246405745257275088548364400416034343698204067400578910375, + 303593803988638, + 21888242871839275222246405745257275088548364400416034343698203746575199268337, + 347195681082812, + 258621530127328, + 21888242871839275222246405745257275088548364400416034343698203685213673086838, + 21888242871839275222246405745257275088548364400416034343698203707580441313997, + 21888242871839275222246405745257275088548364400416034343698204135400737959890, + 21888242871839275222246405745257275088548364400416034343698203957112389391897, + 21888242871839275222246405745257275088548364400416034343698204050081225737860, + 160094837593498, + 420754604375763, + 21888242871839275222246405745257275088548364400416034343698203817642313898062, + 21888242871839275222246405745257275088548364400416034343698204161375879305719, + 21888242871839275222246405745257275088548364400416034343698203967703235504842, + 21888242871839275222246405745257275088548364400416034343698203841160840629148, + 21888242871839275222246405745257275088548364400416034343698204152949606149778, + 21888242871839275222246405745257275088548364400416034343698204175312115921469, + 21888242871839275222246405745257275088548364400416034343698203770430545186981, + 21888242871839275222246405745257275088548364400416034343698203910448315583402, + 21888242871839275222246405745257275088548364400416034343698203712857397434654, + 21888242871839275222246405745257275088548364400416034343698204094498139756858, + 21888242871839275222246405745257275088548364400416034343698203878549848061556, + 21888242871839275222246405745257275088548364400416034343698204004488604307240, + 21888242871839275222246405745257275088548364400416034343698203651022071255723, + 21888242871839275222246405745257275088548364400416034343698203827410340238933, + 525477371756698, + 21888242871839275222246405745257275088548364400416034343698204096832584218161, + 21888242871839275222246405745257275088548364400416034343698204129603358012743, + 479176327431026, + 21888242871839275222246405745257275088548364400416034343698204083260910268239, + 21888242871839275222246405745257275088548364400416034343698204027357770673113, + 21888242871839275222246405745257275088548364400416034343698204170976373717090, + 444472979343611, + 21888242871839275222246405745257275088548364400416034343698204103697517137913, + 312502647474749, + 21888242871839275222246405745257275088548364400416034343698203802477153025474, + 361071754562069, + 410320150292409, + 21888242871839275222246405745257275088548364400416034343698203722692183862051, + 21888242871839275222246405745257275088548364400416034343698203957727891928584, + 21888242871839275222246405745257275088548364400416034343698203964947926284209, + 388164671013378, + 383513385899817, + 560289996818649, + 21888242871839275222246405745257275088548364400416034343698203821041465815270, + 419307807352613, + 21888242871839275222246405745257275088548364400416034343698203919952201681197, + 21888242871839275222246405745257275088548364400416034343698203736835023410213, + 21888242871839275222246405745257275088548364400416034343698203670920901398601, + 21888242871839275222246405745257275088548364400416034343698204140901598656699, + 21888242871839275222246405745257275088548364400416034343698203840579505035441, + 21888242871839275222246405745257275088548364400416034343698204036988970501641, + 116153177843274, + 543383112835287, + 419090139383926, + 150543514115596, + 21888242871839275222246405745257275088548364400416034343698203819583009430083, + 292344163890060, + 21888242871839275222246405745257275088548364400416034343698204125439827300970, + 408574259407159, + 21888242871839275222246405745257275088548364400416034343698204016747770628930, + 21888242871839275222246405745257275088548364400416034343698204137148210162498, + 320893457028337, + 185939556478594, + 462904510219338, + 208559825904537, + 21888242871839275222246405745257275088548364400416034343698203660645510792507, + 21888242871839275222246405745257275088548364400416034343698204065601218915706, + 21888242871839275222246405745257275088548364400416034343698203788283005454817, + 72765640790349, + 184661468108905, + 285630152321870, + 111257655432361, + 21888242871839275222246405745257275088548364400416034343698203759950139004793, + 21888242871839275222246405745257275088548364400416034343698203885419804989432, + 513935226678360, + 21888242871839275222246405745257275088548364400416034343698203702756772992766, + 21888242871839275222246405745257275088548364400416034343698203896935580402592, + 21888242871839275222246405745257275088548364400416034343698203922888040907471, + 21888242871839275222246405745257275088548364400416034343698203868453619524455, + 360226566385425, + 21888242871839275222246405745257275088548364400416034343698203822249687524883, + 21888242871839275222246405745257275088548364400416034343698203701299847043765, + 159190374319364, + 21888242871839275222246405745257275088548364400416034343698203929554662095713, + 21888242871839275222246405745257275088548364400416034343698203697758184197422, + 21888242871839275222246405745257275088548364400416034343698203870112825868732, + 197839462964411, + 47708231865675, + 144747445596605, + 21888242871839275222246405745257275088548364400416034343698203632601797893416, + 21888242871839275222246405745257275088548364400416034343698204037871387993470, + 242290847479509, + 245869751228388, + 21888242871839275222246405745257275088548364400416034343698203958432810710886, + 21888242871839275222246405745257275088548364400416034343698203678680632296422, + 465579813228975, + 21888242871839275222246405745257275088548364400416034343698203812370910709966, + 112160652994619, + 236787455996118, + 457840355106713, + 85245063003931, + 187493344351280, + 499489468284167, + 155845311101618, + 21888242871839275222246405745257275088548364400416034343698204094263227433056, + 21888242871839275222246405745257275088548364400416034343698204091546848926442, + 283481350266389, + 260802027293462, + 21888242871839275222246405745257275088548364400416034343698204175501806598431, + 220811130670335, + 21888242871839275222246405745257275088548364400416034343698204073372468124135, + 358217847730302, + 21888242871839275222246405745257275088548364400416034343698203822250676684322, + 173349507478306, + 21888242871839275222246405745257275088548364400416034343698204106654447828390, + 322543415504167, + 519958974645665, + 548554674584244, + 21888242871839275222246405745257275088548364400416034343698204082560692964464, + 21888242871839275222246405745257275088548364400416034343698204004070155417915, + 21888242871839275222246405745257275088548364400416034343698204130270827547947, + 21888242871839275222246405745257275088548364400416034343698204020847844771601, + 492834319347277, + 546375199223044, + 21888242871839275222246405745257275088548364400416034343698204086509078060036, + 249682035928414, + 267543518300834, + 21888242871839275222246405745257275088548364400416034343698204027531454166900, + 21888242871839275222246405745257275088548364400416034343698204084087640306306, + 21888242871839275222246405745257275088548364400416034343698203963907700208694, + 21888242871839275222246405745257275088548364400416034343698203883404146844754, + 496754005809525, + 433763835079399, + 21888242871839275222246405745257275088548364400416034343698203831040907999518, + 347140884139061, + 254350046865703, + 326928940051148, + 21888242871839275222246405745257275088548364400416034343698203971052967702378, + 202564938734793, + 410975104148754, + 22317357094012, + 45376645529822, + 4473327354946, + 272790658649074, + 21888242871839275222246405745257275088548364400416034343698204132473781638420, + 464737633748641, + 21888242871839275222246405745257275088548364400416034343698203866858082917332, + 139947334299751, + 225539652131445, + 118431443402046, + 13569468527456, + 21888242871839275222246405745257275088548364400416034343698204073600402956987, + 224559122099406, + 21888242871839275222246405745257275088548364400416034343698203933139125937535, + 21888242871839275222246405745257275088548364400416034343698203957825338017335, + 21888242871839275222246405745257275088548364400416034343698203842096059629245, + 523148703027156, + 352829369178923, + 21888242871839275222246405745257275088548364400416034343698203813244423389732, + 21888242871839275222246405745257275088548364400416034343698203773096483079611, + 332949101848931, + 21888242871839275222246405745257275088548364400416034343698203652300683212828, + 21888242871839275222246405745257275088548364400416034343698204002479244971228, + 283567041309161, + 425070487454368, + 94729335422435, + 529522204117790, + 405758813573156, + 21888242871839275222246405745257275088548364400416034343698203771257660952736, + 412613888254339, + 524876604550210, + 151413136002693, + 134296039129900, + 417579524105481, + 21888242871839275222246405745257275088548364400416034343698203872045215589914, + 71207946498346, + 21888242871839275222246405745257275088548364400416034343698203703032901201241, + 21888242871839275222246405745257275088548364400416034343698203909414313833583, + 21888242871839275222246405745257275088548364400416034343698203688802270817825, + 327186635802213, + 68019534322748, + 504865875903386, + 21888242871839275222246405745257275088548364400416034343698203624188306307698, + 538837032093428, + 21888242871839275222246405745257275088548364400416034343698204179294845387966, + 322889272861512, + 21888242871839275222246405745257275088548364400416034343698203840299828184890, + 21888242871839275222246405745257275088548364400416034343698204070847693361768, + 21888242871839275222246405745257275088548364400416034343698203668163593947203, + 21888242871839275222246405745257275088548364400416034343698204148640295903581, + 21888242871839275222246405745257275088548364400416034343698204113585989475042, + 21888242871839275222246405745257275088548364400416034343698203689357405696416, + 21888242871839275222246405745257275088548364400416034343698204062578875845443, + 156719352076263, + 288693273027370, + 21888242871839275222246405745257275088548364400416034343698204035516546018726, + 21888242871839275222246405745257275088548364400416034343698203701462265936031, + 443807609762271, + 432150942128022, + 200912414668343, + 21888242871839275222246405745257275088548364400416034343698203865111456699670, + 21888242871839275222246405745257275088548364400416034343698203941247391365416, + 21888242871839275222246405745257275088548364400416034343698203766051574246951, + 46249004311975, + 21888242871839275222246405745257275088548364400416034343698203846608381037969, + 21888242871839275222246405745257275088548364400416034343698203795852284864218, + 479678796652839, + 77210648571704, + 224562314823015, + 21888242871839275222246405745257275088548364400416034343698203949460990231760, + 21888242871839275222246405745257275088548364400416034343698203922636435306187, + 48163815921363, + 375823369355273, + 21888242871839275222246405745257275088548364400416034343698203725855988864052, + 21888242871839275222246405745257275088548364400416034343698204026243586751340, + 21888242871839275222246405745257275088548364400416034343698203792263151410131, + 443910364001632, + 206789525699741, + 21888242871839275222246405745257275088548364400416034343698203812090807061820, + 196052574298985, + 467293609866917, + 21888242871839275222246405745257275088548364400416034343698203966413225465071, + 305575286841091, + 167138058262081, + 44732230593411, + 21888242871839275222246405745257275088548364400416034343698203648578120225069, + 322177315399648, + 21888242871839275222246405745257275088548364400416034343698203789998663456277, + 543816048117001, + 21888242871839275222246405745257275088548364400416034343698204087336023837679, + 21888242871839275222246405745257275088548364400416034343698203679383761057517, + 324116658957800, + 21888242871839275222246405745257275088548364400416034343698203949310830798288, + 21888242871839275222246405745257275088548364400416034343698203634199547909303, + 85777348931984, + 21888242871839275222246405745257275088548364400416034343698203819824460213493, + 21888242871839275222246405745257275088548364400416034343698203658056020598787, + 21888242871839275222246405745257275088548364400416034343698204010494353949111, + 21888242871839275222246405745257275088548364400416034343698203851388014089703, + 72231681284138, + 21888242871839275222246405745257275088548364400416034343698203806544902668801, + 21888242871839275222246405745257275088548364400416034343698204183245474580262, + 163762033766183, + 300012773674685, + 21888242871839275222246405745257275088548364400416034343698204114393894656160, + 21888242871839275222246405745257275088548364400416034343698204012359449022734, + 21888242871839275222246405745257275088548364400416034343698204163565989758884, + 21888242871839275222246405745257275088548364400416034343698203668428213661647, + 21888242871839275222246405745257275088548364400416034343698203893194047521511, + 93999159207295, + 534656042427856, + 125487194749824, + 61760412258856, + 533839015161590, + 476373908259580, + 21888242871839275222246405745257275088548364400416034343698203901550520680923, + 163413428167055, + 21888242871839275222246405745257275088548364400416034343698203794370534958408, + 414193813019876, + 21888242871839275222246405745257275088548364400416034343698203812610321979628, + 21888242871839275222246405745257275088548364400416034343698203779601700526092, + 21888242871839275222246405745257275088548364400416034343698203951220723054500, + 21888242871839275222246405745257275088548364400416034343698204167657900245946, + 560088388715844, + 21888242871839275222246405745257275088548364400416034343698203767794100972117, + 21888242871839275222246405745257275088548364400416034343698203810090797989580, + 21888242871839275222246405745257275088548364400416034343698203760733295320520, + 540810769997343, + 21888242871839275222246405745257275088548364400416034343698203633469735950408, + 514886331047306, + 554011067670999, + 431401372969143, + 21888242871839275222246405745257275088548364400416034343698203648053387554715, + 4934594598578, + 63237474378258, + 166794987095308, + 21888242871839275222246405745257275088548364400416034343698203711173697598600, + 227730347938420, + 507504156431805, + 299617074273238, + 21888242871839275222246405745257275088548364400416034343698203770022551990540, + 21888242871839275222246405745257275088548364400416034343698203870649508882896, + 167266313576826, + 21888242871839275222246405745257275088548364400416034343698203820963154964503, + 21888242871839275222246405745257275088548364400416034343698204136836787717024, + 21888242871839275222246405745257275088548364400416034343698203723080528776914, + 67272138764736, + 21888242871839275222246405745257275088548364400416034343698203701833780829504, + 333373875410241, + 39878977931872, + 223079721329893, + 14473792707293, + 21888242871839275222246405745257275088548364400416034343698203705855774119129, + 398781353039052, + 403576378904135, + 21888242871839275222246405745257275088548364400416034343698204094990721749420, + 189120098875412, + 556107850754361, + 10059707221556, + 21888242871839275222246405745257275088548364400416034343698204109057761492974, + 21888242871839275222246405745257275088548364400416034343698204126195710295204, + 21888242871839275222246405745257275088548364400416034343698204005968570332709, + 331662220708432, + 217080571780503, + 155496100714813, + 459838088671688, + 17515269129760, + 486271284009529, + 239059516446754, + 143369547024661, + 21888242871839275222246405745257275088548364400416034343698203633560012661330, + 21888242871839275222246405745257275088548364400416034343698203677509241362425, + 33185560534173, + 21888242871839275222246405745257275088548364400416034343698203770885154026539, + 204707621440546, + 42748756513429, + 497417469239926, + 21888242871839275222246405745257275088548364400416034343698203788024663090053, + 21888242871839275222246405745257275088548364400416034343698203811678679070591, + 41508270680828, + 21888242871839275222246405745257275088548364400416034343698204108518506202540, + 21888242871839275222246405745257275088548364400416034343698203700918581845409, + 515785126930068, + 21888242871839275222246405745257275088548364400416034343698204049512841867522, + 21888242871839275222246405745257275088548364400416034343698203906413198592497, + 21888242871839275222246405745257275088548364400416034343698203625856591515490, + 175895367484560, + 21888242871839275222246405745257275088548364400416034343698203800738976439610, + 377659538459070, + 439971724823523, + 531787153558061, + 21888242871839275222246405745257275088548364400416034343698204017510851006187, + 183412933667984, + 39214705149532, + 21888242871839275222246405745257275088548364400416034343698203626242172787613, + 400289810168729, + 21888242871839275222246405745257275088548364400416034343698203821904363372063, + 21888242871839275222246405745257275088548364400416034343698203989812883051280, + 559333657660377, + 21888242871839275222246405745257275088548364400416034343698203681949560594369, + 21888242871839275222246405745257275088548364400416034343698204032575092320455, + 21888242871839275222246405745257275088548364400416034343698204170817495340892, + 21888242871839275222246405745257275088548364400416034343698203940640144053179, + 21888242871839275222246405745257275088548364400416034343698204092889057341664, + 251100516008950, + 171581282928301, + 373340536249086, + 491048918917315, + 13212551008872, + 21888242871839275222246405745257275088548364400416034343698203966254218786654, + 21888242871839275222246405745257275088548364400416034343698203887025774668385, + 21888242871839275222246405745257275088548364400416034343698203928935178057478, + 21888242871839275222246405745257275088548364400416034343698203866446653059669, + 46202449978406, + 21888242871839275222246405745257275088548364400416034343698203799689332053074, + 21888242871839275222246405745257275088548364400416034343698203675222911981112, + 286402235647769, + 21888242871839275222246405745257275088548364400416034343698203892558164651436, + 21888242871839275222246405745257275088548364400416034343698203796568294891515, + 148048262186553, + 303337470756476, + 21888242871839275222246405745257275088548364400416034343698204163672088822297, + 21888242871839275222246405745257275088548364400416034343698203714256446690308, + 21888242871839275222246405745257275088548364400416034343698203900219982062215, + 21888242871839275222246405745257275088548364400416034343698204010279968169578, + 21888242871839275222246405745257275088548364400416034343698203907352469695426, + 499406005641825, + 21888242871839275222246405745257275088548364400416034343698204041726042304657, + 495777028027373, + 135647960034839, + 21888242871839275222246405745257275088548364400416034343698203940281505840785, + 21888242871839275222246405745257275088548364400416034343698203872896886200573, + 21888242871839275222246405745257275088548364400416034343698203839427259323740, + 21888242871839275222246405745257275088548364400416034343698204101312454935176, + 83978412666300, + 95818373676921, + 519980290465002, + 21888242871839275222246405745257275088548364400416034343698203905102356408415, + 437475117224755, + 100772165314924, + 21888242871839275222246405745257275088548364400416034343698204169082954624081, + 21888242871839275222246405745257275088548364400416034343698203794772499403046, + 390466180214986, + 21888242871839275222246405745257275088548364400416034343698203986976586741021, + 109874522830750, + 21888242871839275222246405745257275088548364400416034343698203956454709323691, + 21888242871839275222246405745257275088548364400416034343698204092267395633378, + 21888242871839275222246405745257275088548364400416034343698204089849427624717, + 21888242871839275222246405745257275088548364400416034343698204051449960735491, + 44104610488315, + 21888242871839275222246405745257275088548364400416034343698203850474444985065, + 456174383828881, + 351462571789235, + 21888242871839275222246405745257275088548364400416034343698204103659294770851, + 464723465050585, + 89492858867319, + 393338642680490, + 211040732923119, + 118431348724808, + 129600063653949, + 21888242871839275222246405745257275088548364400416034343698203634771335419775, + 21888242871839275222246405745257275088548364400416034343698203905509828407221, + 21888242871839275222246405745257275088548364400416034343698204053135190158127, + 184379588626741, + 385978334620625, + 457730243798168, + 194225030967800, + 197864887712181, + 21888242871839275222246405745257275088548364400416034343698203922401452214639, + 260141958501045, + 3370021763882, + 172924752772255, + 21888242871839275222246405745257275088548364400416034343698204058261296230512, + 372651798902077, + 288509978016252, + 21888242871839275222246405745257275088548364400416034343698204102985225603939, + 109847005461365, + 21888242871839275222246405745257275088548364400416034343698203838774500437052, + 21888242871839275222246405745257275088548364400416034343698204029936803663894, + 21888242871839275222246405745257275088548364400416034343698203856183113625256, + 21888242871839275222246405745257275088548364400416034343698203682504902363672, + 296633264018814, + 21888242871839275222246405745257275088548364400416034343698204143645781618997, + 21888242871839275222246405745257275088548364400416034343698204149281773102921, + 21888242871839275222246405745257275088548364400416034343698204036136179552961, + 208997574033074, + 21888242871839275222246405745257275088548364400416034343698203946520689918898, + 355527202729310, + 360694939918239, + 21888242871839275222246405745257275088548364400416034343698203973907726122839, + 276819871600666, + 323535734082332, + 361425268477948, + 21888242871839275222246405745257275088548364400416034343698204098838295396123, + 19048927238543, + 21888242871839275222246405745257275088548364400416034343698204041010059802860, + 3751906198929, + 21888242871839275222246405745257275088548364400416034343698203995043249946494, + 422979276129997, + 147603947132613, + 21888242871839275222246405745257275088548364400416034343698203896241972650424, + 21888242871839275222246405745257275088548364400416034343698203911792327589020, + 198434803783134, + 358912539795139, + 21888242871839275222246405745257275088548364400416034343698204037588619553927, + 21888242871839275222246405745257275088548364400416034343698203934871364521160, + 148894198202919, + 21888242871839275222246405745257275088548364400416034343698203809802591208947, + 317118798931491, + 550843976428129, + 152317876624243, + 163845102576956, + 21888242871839275222246405745257275088548364400416034343698203702427074662821, + 21888242871839275222246405745257275088548364400416034343698203720598248836474, + 420752533836748, + 21888242871839275222246405745257275088548364400416034343698203850478964298677, + 228916881590778, + 21888242871839275222246405745257275088548364400416034343698203966757033620794, + 21888242871839275222246405745257275088548364400416034343698203682979697645294, + 378619643540701, + 21888242871839275222246405745257275088548364400416034343698203772259618931653, + 403403213563333, + 171186901724352, + 310245923418151, + 83572106690827, + 493552575591715, + 320288321682618, + 96975374620793, + 493025308040078, + 409494968071900, + 402593764966362, + 21888242871839275222246405745257275088548364400416034343698204055091401522324, + 21888242871839275222246405745257275088548364400416034343698204051282680188681, + 284287762241965, + 21888242871839275222246405745257275088548364400416034343698203643667130623550, + 166722701525257, + 21888242871839275222246405745257275088548364400416034343698203860029373312284, + 393630894649763, + 21888242871839275222246405745257275088548364400416034343698203982520435874774, + 21888242871839275222246405745257275088548364400416034343698203821279483082449, + 400730410321665, + 408344231318850, + 21888242871839275222246405745257275088548364400416034343698203783919140783959, + 21888242871839275222246405745257275088548364400416034343698204019181971584736, + 21888242871839275222246405745257275088548364400416034343698203701785692799218, + 502314537331199, + 21888242871839275222246405745257275088548364400416034343698204109521305489613, + 384536107067187, + 156747274477511, + 473636465766880, + 21888242871839275222246405745257275088548364400416034343698203793553471156490, + 21888242871839275222246405745257275088548364400416034343698203933806882189020, + 21888242871839275222246405745257275088548364400416034343698203645321474021668, + 246576270992276, + 21888242871839275222246405745257275088548364400416034343698203975279960595308, + 21888242871839275222246405745257275088548364400416034343698203964617588797855, + 21888242871839275222246405745257275088548364400416034343698203697781334716951, + 412624074447294, + 21888242871839275222246405745257275088548364400416034343698204151866385366305, + 21888242871839275222246405745257275088548364400416034343698204077383605696528, + 21888242871839275222246405745257275088548364400416034343698204137149798441064, + 485161777306494, + 366033396076708, + 21888242871839275222246405745257275088548364400416034343698203857022356043704, + 21888242871839275222246405745257275088548364400416034343698204014774311462717, + 21888242871839275222246405745257275088548364400416034343698204116842936637173, + 343517770889085, + 21888242871839275222246405745257275088548364400416034343698204066589014469713, + 21888242871839275222246405745257275088548364400416034343698203860880473528893, + 507447872055126, + 21888242871839275222246405745257275088548364400416034343698203903448397176605, + 253810566730026, + 239416469641450, + 21888242871839275222246405745257275088548364400416034343698203642578169541813, + 45736664924061, + 21888242871839275222246405745257275088548364400416034343698203799233168023311, + 171112983617181, + 442597647932510, + 21888242871839275222246405745257275088548364400416034343698203658581589658363, + 379558770443044, + 38564036792245, + 21888242871839275222246405745257275088548364400416034343698203787608624971609, + 160817390424643, + 232462016692320, + 492333045838684, + 21888242871839275222246405745257275088548364400416034343698203831123538987313, + 510484908235078, + 224824019117272, + 21888242871839275222246405745257275088548364400416034343698203849230392656646, + 21888242871839275222246405745257275088548364400416034343698203917271633420951, + 21888242871839275222246405745257275088548364400416034343698203799013221780035, + 21888242871839275222246405745257275088548364400416034343698203661377894777608, + 33453562536622, + 21888242871839275222246405745257275088548364400416034343698203759468073193769, + 21888242871839275222246405745257275088548364400416034343698203655106686365363, + 35964239955936, + 509472040745427, + 21888242871839275222246405745257275088548364400416034343698203634782270307935, + 21888242871839275222246405745257275088548364400416034343698203787733105494686, + 119000900322411, + 21888242871839275222246405745257275088548364400416034343698204096523300320895, + 192834323802799, + 50183657947440, + 42123438914710, + 405384916089316, + 21888242871839275222246405745257275088548364400416034343698203992599345842305, + 21888242871839275222246405745257275088548364400416034343698204034623156168162, + 532293559828779, + 21888242871839275222246405745257275088548364400416034343698204176815903310068, + 21888242871839275222246405745257275088548364400416034343698203778449738281023, + 21888242871839275222246405745257275088548364400416034343698204165046515284371, + 21888242871839275222246405745257275088548364400416034343698203980593995923900, + 21888242871839275222246405745257275088548364400416034343698203770854631608567, + 21888242871839275222246405745257275088548364400416034343698204004085938172063, + 110409788661675, + 21888242871839275222246405745257275088548364400416034343698204089438199060097, + 21888242871839275222246405745257275088548364400416034343698203800592580891427, + 292883552515036, + 8053463068511, + 21888242871839275222246405745257275088548364400416034343698204014038932900057, + 21888242871839275222246405745257275088548364400416034343698204090368122705016, + 21888242871839275222246405745257275088548364400416034343698204106505002043672, + 21888242871839275222246405745257275088548364400416034343698203801561487657822, + 21888242871839275222246405745257275088548364400416034343698204035034623755435, + 316129415265855, + 21888242871839275222246405745257275088548364400416034343698204094294026146280, + 21888242871839275222246405745257275088548364400416034343698204064585602307711, + 130281985236649, + 21888242871839275222246405745257275088548364400416034343698203769707551689684, + 21888242871839275222246405745257275088548364400416034343698204056730634074077, + 21888242871839275222246405745257275088548364400416034343698203809362064328548, + 21888242871839275222246405745257275088548364400416034343698203737759046701619, + 409885802824155, + 21888242871839275222246405745257275088548364400416034343698203960532329648848, + 21888242871839275222246405745257275088548364400416034343698203669980338319420, + 328775635502109, + 447840862162504, + 21888242871839275222246405745257275088548364400416034343698203688339305331945, + 21888242871839275222246405745257275088548364400416034343698204057199123162802, + 21888242871839275222246405745257275088548364400416034343698203669535963009148, + 21888242871839275222246405745257275088548364400416034343698204045473742340267, + 21888242871839275222246405745257275088548364400416034343698204014350720709123, + 110495472447438, + 342251736033717, + 21888242871839275222246405745257275088548364400416034343698203705194002962282, + 297521529483008, + 236997553282349, + 21888242871839275222246405745257275088548364400416034343698203709057273227552, + 330985355008232, + 223398544150519, + 425276140303966, + 229069283493727, + 78935308801097, + 21888242871839275222246405745257275088548364400416034343698203968783225952385, + 21888242871839275222246405745257275088548364400416034343698203750957949595862, + 21888242871839275222246405745257275088548364400416034343698203852225514040940, + 170715048610124, + 21888242871839275222246405745257275088548364400416034343698203769310681162509, + 21888242871839275222246405745257275088548364400416034343698204046859213762505, + 21888242871839275222246405745257275088548364400416034343698204033752517970203, + 236152539230561, + 440149598526504, + 21888242871839275222246405745257275088548364400416034343698203672793427631372, + 21888242871839275222246405745257275088548364400416034343698203665228818959570, + 353435096417437, + 21888242871839275222246405745257275088548364400416034343698203700698876575046, + 462016254815361, + 21888242871839275222246405745257275088548364400416034343698204092591238244801, + 21888242871839275222246405745257275088548364400416034343698204089873257885122, + 21888242871839275222246405745257275088548364400416034343698204084313350186805, + 21888242871839275222246405745257275088548364400416034343698203842688037259323, + 21888242871839275222246405745257275088548364400416034343698204092623066989595, + 21888242871839275222246405745257275088548364400416034343698203751885886363614, + 21888242871839275222246405745257275088548364400416034343698203855134739939903, + 21888242871839275222246405745257275088548364400416034343698203836331065644927, + 21888242871839275222246405745257275088548364400416034343698203938012405655696, + 21888242871839275222246405745257275088548364400416034343698203948703883492766, + 21888242871839275222246405745257275088548364400416034343698203949705080051712, + 21888242871839275222246405745257275088548364400416034343698203729273804288981, + 231121312995688, + 349011338517149, + 501076603527931, + 67702670348241, + 16473933767265, + 21888242871839275222246405745257275088548364400416034343698204063275302249947, + 9332999173440, + 21888242871839275222246405745257275088548364400416034343698204180124781196531, + 333745610448163, + 20780770701238, + 21888242871839275222246405745257275088548364400416034343698203917782229090580, + 400413129471442, + 21888242871839275222246405745257275088548364400416034343698203824878658885306, + 494307433286887, + 34058549025138, + 306091533079867, + 423172358481135, + 309120623028464, + 329862524577954, + 21888242871839275222246405745257275088548364400416034343698204069624142136680, + 21888242871839275222246405745257275088548364400416034343698203878529071871980, + 42373160527732, + 21888242871839275222246405745257275088548364400416034343698203827344269973366, + 21888242871839275222246405745257275088548364400416034343698203969779589881957, + 21888242871839275222246405745257275088548364400416034343698204110991706637355, + 21888242871839275222246405745257275088548364400416034343698204156752092090934, + 21888242871839275222246405745257275088548364400416034343698204080734907710967, + 508510462506195, + 21888242871839275222246405745257275088548364400416034343698203917001628269738, + 21888242871839275222246405745257275088548364400416034343698203853710665954096, + 21888242871839275222246405745257275088548364400416034343698203895666508274192, + 21888242871839275222246405745257275088548364400416034343698203846482037213676, + 454551547443764, + 243690813194221, + 21888242871839275222246405745257275088548364400416034343698203841144331494978, + 21888242871839275222246405745257275088548364400416034343698203707184189842491, + 21888242871839275222246405745257275088548364400416034343698203902848502204853, + 470303748000748, + 21888242871839275222246405745257275088548364400416034343698203946567010786042, + 291831553766184, + 392571087794432, + 345712496044074, + 222118275464673, + 21888242871839275222246405745257275088548364400416034343698204074479597379850, + 38456035190541, + 209021944581781, + 282317257811526, + 21888242871839275222246405745257275088548364400416034343698203903956072395490, + 385408002189897, + 330548581562344, + 21888242871839275222246405745257275088548364400416034343698203759500877727031, + 208440989561329, + 21888242871839275222246405745257275088548364400416034343698203912334673050425, + 555277532952179, + 11137313095408, + 21888242871839275222246405745257275088548364400416034343698203712505375917434, + 21888242871839275222246405745257275088548364400416034343698203890922136081546, + 21888242871839275222246405745257275088548364400416034343698204095095737987414, + 21888242871839275222246405745257275088548364400416034343698203930604040884981, + 21888242871839275222246405745257275088548364400416034343698203961135944340263, + 88076089502883, + 21888242871839275222246405745257275088548364400416034343698204183768330347391, + 21888242871839275222246405745257275088548364400416034343698203645022836243185, + 291991818365273, + 21888242871839275222246405745257275088548364400416034343698203771562756593309, + 502694056331742, + 269396606851260, + 21888242871839275222246405745257275088548364400416034343698203983587751292067, + 21888242871839275222246405745257275088548364400416034343698203946509102796502, + 21888242871839275222246405745257275088548364400416034343698204095237532954098, + 461287066858102, + 92193346867026, + 21888242871839275222246405745257275088548364400416034343698203686041040193265, + 21888242871839275222246405745257275088548364400416034343698203848781102998259, + 21888242871839275222246405745257275088548364400416034343698203995624786012082, + 276787963003944, + 21888242871839275222246405745257275088548364400416034343698203836805766144017, + 351218160656719, + 21888242871839275222246405745257275088548364400416034343698203979844579284508, + 205818050092170, + 138284061302154, + 21888242871839275222246405745257275088548364400416034343698203669269743635876, + 44937459051139, + 408577987136423, + 501674240533622, + 21888242871839275222246405745257275088548364400416034343698203941175822394048, + 296635278075283, + 21888242871839275222246405745257275088548364400416034343698203909595725064880, + 21888242871839275222246405745257275088548364400416034343698203915730633956516, + 254240773602409, + 558962451757993, + 222381411176091, + 21888242871839275222246405745257275088548364400416034343698203779833869196961, + 130356329979813, + 274332876721472, + 435132791122712, + 470913401031362, + 21888242871839275222246405745257275088548364400416034343698203756898665173997, + 21888242871839275222246405745257275088548364400416034343698203703586519437329, + 21888242871839275222246405745257275088548364400416034343698204006656347976355, + 21888242871839275222246405745257275088548364400416034343698204165875403703222, + 92999153433024, + 449304951164260, + 21888242871839275222246405745257275088548364400416034343698203633179777206534, + 21888242871839275222246405745257275088548364400416034343698203671178492388096, + 158200291260258, + 21888242871839275222246405745257275088548364400416034343698203857604662399451, + 43902122693921, + 21888242871839275222246405745257275088548364400416034343698204063762186632776, + 21888242871839275222246405745257275088548364400416034343698204031798739339948, + 21888242871839275222246405745257275088548364400416034343698203736298386944908, + 410507652230244, + 546970463300902, + 65281838417326, + 320036792823047, + 21888242871839275222246405745257275088548364400416034343698204164746723425217, + 325875810293706, + 21888242871839275222246405745257275088548364400416034343698203863725336180125, + 534854017867072, + 258964524605888, + 418406898826382, + 21888242871839275222246405745257275088548364400416034343698204041021479782548, + 21888242871839275222246405745257275088548364400416034343698203850912100219949, + 21888242871839275222246405745257275088548364400416034343698203654328688299289, + 87380554942707, + 21888242871839275222246405745257275088548364400416034343698203898566503526189, + 306225917085718, + 214829027799133, + 73577516482672, + 21888242871839275222246405745257275088548364400416034343698203704516944272274, + 362372262108577, + 486829757856506, + 337232199070323, + 21888242871839275222246405745257275088548364400416034343698204143863531409613, + 55393834330091, + 281557243266351, + 341027418559672, + 21888242871839275222246405745257275088548364400416034343698204060842087547045, + 27678850686031, + 196595747854908, + 21888242871839275222246405745257275088548364400416034343698203935795256504006, + 21888242871839275222246405745257275088548364400416034343698204174225427031610, + 444455234118049, + 125072528716937, + 560403434348560, + 21888242871839275222246405745257275088548364400416034343698203888573447244919, + 205612634036475, + 21888242871839275222246405745257275088548364400416034343698203997224912215831, + 21888242871839275222246405745257275088548364400416034343698203967532534431320, + 226326783963997, + 21888242871839275222246405745257275088548364400416034343698203667659934133077, + 481666191579718, + 21888242871839275222246405745257275088548364400416034343698203660917298267294, + 21888242871839275222246405745257275088548364400416034343698203840492342865544, + 21888242871839275222246405745257275088548364400416034343698203945844516281275, + 21888242871839275222246405745257275088548364400416034343698203667318198771324, + 21888242871839275222246405745257275088548364400416034343698203974553442114981, + 21888242871839275222246405745257275088548364400416034343698203805183323009343, + 21888242871839275222246405745257275088548364400416034343698204061001697223005, + 21888242871839275222246405745257275088548364400416034343698203965261630921808, + 21888242871839275222246405745257275088548364400416034343698203630990878923837, + 21888242871839275222246405745257275088548364400416034343698203953822009473074, + 21888242871839275222246405745257275088548364400416034343698203948469806697920, + 23809078848360, + 21888242871839275222246405745257275088548364400416034343698203727935657094020, + 336652374954613, + 21888242871839275222246405745257275088548364400416034343698203686968751929401, + 499768634126291, + 21888242871839275222246405745257275088548364400416034343698204181789588801028, + 21888242871839275222246405745257275088548364400416034343698203769201627026678, + 21888242871839275222246405745257275088548364400416034343698203748144899061131, + 191685891144230, + 70834470725573, + 526617434324308, + 113152655346460, + 21888242871839275222246405745257275088548364400416034343698203711675618047135, + 21888242871839275222246405745257275088548364400416034343698204162531560338800, + 375354020954611, + 218657368552652, + 55920712512905, + 130942698822161, + 545964076933653, + 21888242871839275222246405745257275088548364400416034343698204075642687129004, + 521236301910473, + 385781865526961, + 21888242871839275222246405745257275088548364400416034343698203982991508328345, + 21888242871839275222246405745257275088548364400416034343698203863846981784068, + 21888242871839275222246405745257275088548364400416034343698203811740411348305, + 21888242871839275222246405745257275088548364400416034343698204164910374529451, + 359266329667734, + 112128539919338, + 21888242871839275222246405745257275088548364400416034343698203725553110404236, + 314317516435876, + 397561201674878, + 21888242871839275222246405745257275088548364400416034343698203763711689571454, + 432588696530499, + 21888242871839275222246405745257275088548364400416034343698203827671814019162, + 285352547422558, + 384459817033141, + 21888242871839275222246405745257275088548364400416034343698204062916792238792, + 275852426715048, + 21888242871839275222246405745257275088548364400416034343698203904874714648966, + 346212331490972, + 21888242871839275222246405745257275088548364400416034343698203833430961865385, + 21888242871839275222246405745257275088548364400416034343698204018869981255940, + 21888242871839275222246405745257275088548364400416034343698203661485807289672, + 21888242871839275222246405745257275088548364400416034343698203902918905290236, + 21888242871839275222246405745257275088548364400416034343698204076953220306924, + 550838713940659, + 490509418093124, + 264225608149301, + 80615148513289, + 21888242871839275222246405745257275088548364400416034343698203911066064666492, + 72439482166348, + 21888242871839275222246405745257275088548364400416034343698203851037975715412, + 21888242871839275222246405745257275088548364400416034343698203668199894665232, + 303675732263945, + 21888242871839275222246405745257275088548364400416034343698204036344504774481, + 469321270756399, + 361278220518586, + 21888242871839275222246405745257275088548364400416034343698203876933547720518, + 119450760592572, + 21888242871839275222246405745257275088548364400416034343698203723133082499187, + 21888242871839275222246405745257275088548364400416034343698203649879260800940, + 269300136303705, + 21888242871839275222246405745257275088548364400416034343698204087211465859809, + 21888242871839275222246405745257275088548364400416034343698203678050011087313, + 21888242871839275222246405745257275088548364400416034343698203668382155332737, + 363971925037554, + 21888242871839275222246405745257275088548364400416034343698203691696015609998, + 5379190631492, + 21888242871839275222246405745257275088548364400416034343698204172171255412652, + 21888242871839275222246405745257275088548364400416034343698203841629145926828, + 469478969866709, + 365297101125165, + 178690243026616, + 21888242871839275222246405745257275088548364400416034343698204046481858388682, + 243868981461811, + 21888242871839275222246405745257275088548364400416034343698203932789817446586, + 21888242871839275222246405745257275088548364400416034343698203725932191489084, + 21888242871839275222246405745257275088548364400416034343698203880364049190461, + 21888242871839275222246405745257275088548364400416034343698204003825692853179, + 21888242871839275222246405745257275088548364400416034343698203837876524730348, + 21888242871839275222246405745257275088548364400416034343698204085184433701988, + 21888242871839275222246405745257275088548364400416034343698203966621413100573, + 544839418852298, + 21888242871839275222246405745257275088548364400416034343698203809743096165255, + 21888242871839275222246405745257275088548364400416034343698203770502207855027, + 450985170385132, + 21888242871839275222246405745257275088548364400416034343698203763343805390132, + 399042858863586, + 21888242871839275222246405745257275088548364400416034343698203895559785293416, + 21888242871839275222246405745257275088548364400416034343698203990963460707616, + 21888242871839275222246405745257275088548364400416034343698204135313299180279, + 239957643212280, + 138610278477039, + 156386328763859, + 21888242871839275222246405745257275088548364400416034343698204157648423642324, + 21888242871839275222246405745257275088548364400416034343698204089559214697194, + 351229420465330, + 21888242871839275222246405745257275088548364400416034343698204019750521766457, + 21888242871839275222246405745257275088548364400416034343698203664899544247876, + 69553022129983, + 281032555395055, + 403461360958466, + 21888242871839275222246405745257275088548364400416034343698203799557480668938, + 21888242871839275222246405745257275088548364400416034343698203673685543461154, + 364108296246429, + 21888242871839275222246405745257275088548364400416034343698204177468422393208, + 21888242871839275222246405745257275088548364400416034343698203686515432578931, + 514743430678103, + 48909743453178, + 21888242871839275222246405745257275088548364400416034343698203930444173245639, + 21888242871839275222246405745257275088548364400416034343698204173809817206726, + 60801352336042, + 21888242871839275222246405745257275088548364400416034343698203943784844345827, + 21888242871839275222246405745257275088548364400416034343698203932180414838723, + 21888242871839275222246405745257275088548364400416034343698204008518188426183, + 21888242871839275222246405745257275088548364400416034343698203629507907559527, + 21888242871839275222246405745257275088548364400416034343698204165693064302075, + 21888242871839275222246405745257275088548364400416034343698204106409510809300, + 200328091772121, + 274018660592695, + 21888242871839275222246405745257275088548364400416034343698204109310354482336, + 247559810611667, + 337415347407453, + 168837397800141, + 21888242871839275222246405745257275088548364400416034343698204024882871843901, + 503991826440507, + 21888242871839275222246405745257275088548364400416034343698203652415360109467, + 21888242871839275222246405745257275088548364400416034343698203732413330005211, + 21888242871839275222246405745257275088548364400416034343698203967325390982642, + 197115172242406, + 21888242871839275222246405745257275088548364400416034343698204127455593032207, + 240342998261519, + 451272604631164, + 114118355701219, + 21888242871839275222246405745257275088548364400416034343698203880644515639579, + 21888242871839275222246405745257275088548364400416034343698203765899568851146, + 452403137843651, + 21888242871839275222246405745257275088548364400416034343698203745811723465754, + 557965838216268, + 98016497446626, + 60730474818847, + 167240717738, + 210902516024739, + 21888242871839275222246405745257275088548364400416034343698203636801330929174, + 316295659141242, + 544021017165858, + 21888242871839275222246405745257275088548364400416034343698204106179917111537, + 21888242871839275222246405745257275088548364400416034343698203662583303170209, + 21888242871839275222246405745257275088548364400416034343698203777852645035469, + 21888242871839275222246405745257275088548364400416034343698203756409993668471, + 21888242871839275222246405745257275088548364400416034343698204040237224038519, + 21888242871839275222246405745257275088548364400416034343698203686526828731995, + 309947145744643, + 21888242871839275222246405745257275088548364400416034343698203940210848868113, + 264550949217622, + 21888242871839275222246405745257275088548364400416034343698203874760514242546, + 21888242871839275222246405745257275088548364400416034343698204170542983866336, + 73522003604069, + 21888242871839275222246405745257275088548364400416034343698203716847350429055, + 21888242871839275222246405745257275088548364400416034343698203673070908273566, + 215622208042059, + 526748301880252, + 21888242871839275222246405745257275088548364400416034343698204009251409597715, + 484752052308551, + 249125569226325, + 294441112160337, + 21888242871839275222246405745257275088548364400416034343698204049167742829958, + 21888242871839275222246405745257275088548364400416034343698203952839426209220, + 21888242871839275222246405745257275088548364400416034343698203676295093893670, + 21888242871839275222246405745257275088548364400416034343698204170465921803263, + 355542810956399, + 21888242871839275222246405745257275088548364400416034343698204057151489114990, + 319639792085874, + 21888242871839275222246405745257275088548364400416034343698203907729603770593, + 21888242871839275222246405745257275088548364400416034343698203956383494180419, + 21888242871839275222246405745257275088548364400416034343698203898600239926389, + 486972417813657, + 21888242871839275222246405745257275088548364400416034343698204022694939961137, + 554522987285281, + 21888242871839275222246405745257275088548364400416034343698204044468210285886, + 69959332698653, + 117485921601704, + 21888242871839275222246405745257275088548364400416034343698203840812245938004, + 21888242871839275222246405745257275088548364400416034343698204150658672476644, + 21888242871839275222246405745257275088548364400416034343698204009043809150850, + 21888242871839275222246405745257275088548364400416034343698203637307244665508, + 21888242871839275222246405745257275088548364400416034343698203788887246249790, + 21888242871839275222246405745257275088548364400416034343698204086199096262234, + 21888242871839275222246405745257275088548364400416034343698204077768638912365, + 21888242871839275222246405745257275088548364400416034343698203850402366543688, + 21888242871839275222246405745257275088548364400416034343698203633445540614525, + 132215243739449, + 223147536517943, + 354214282381877, + 21888242871839275222246405745257275088548364400416034343698203841043975687613, + 21888242871839275222246405745257275088548364400416034343698203973443973876752, + 28539513541676, + 169618047118691, + 246087465535619, + 38362152275775, + 443213146281720, + 21888242871839275222246405745257275088548364400416034343698204177114459117308, + 302793304800392, + 21888242871839275222246405745257275088548364400416034343698203784011592309754, + 21888242871839275222246405745257275088548364400416034343698204170407417996897, + 299955139632655, + 223367749482873, + 376650001015592, + 346605731546062, + 64881165518139, + 21888242871839275222246405745257275088548364400416034343698203778397751538629, + 21888242871839275222246405745257275088548364400416034343698203898222568991117, + 488717691701651, + 21888242871839275222246405745257275088548364400416034343698203775699246415019, + 208110800032035, + 21888242871839275222246405745257275088548364400416034343698203755856453477180, + 21888242871839275222246405745257275088548364400416034343698204047747668101818, + 138037267974036, + 352986221118795, + 156650867673883, + 21888242871839275222246405745257275088548364400416034343698203670870163650874, + 358911509172711, + 21888242871839275222246405745257275088548364400416034343698204162966970429598, + 21888242871839275222246405745257275088548364400416034343698204154421069970935, + 21888242871839275222246405745257275088548364400416034343698203862564328600356, + 21888242871839275222246405745257275088548364400416034343698204047962592081492, + 21888242871839275222246405745257275088548364400416034343698203987836649564013, + 433452809950780, + 21888242871839275222246405745257275088548364400416034343698203906505209494209, + 200351001328056, + 21888242871839275222246405745257275088548364400416034343698203661471473184078, + 21888242871839275222246405745257275088548364400416034343698203648500717463933, + 21888242871839275222246405745257275088548364400416034343698204005813064897154, + 21888242871839275222246405745257275088548364400416034343698203889784429622929, + 398769179490777, + 100611428066707, + 21888242871839275222246405745257275088548364400416034343698203853489037804533, + 562044808152013, + 352548238408044, + 21888242871839275222246405745257275088548364400416034343698203670659773549012, + 533433276767779, + 308294931936748, + 21888242871839275222246405745257275088548364400416034343698203745773897028727, + 111137395559140, + 21888242871839275222246405745257275088548364400416034343698203798278088797900, + 21888242871839275222246405745257275088548364400416034343698203792895621712538, + 560456893523761, + 21888242871839275222246405745257275088548364400416034343698203883541874786575, + 21888242871839275222246405745257275088548364400416034343698203952479844344022, + 21888242871839275222246405745257275088548364400416034343698204079590510923513, + 452904132211055, + 21888242871839275222246405745257275088548364400416034343698203929705165334604, + 21888242871839275222246405745257275088548364400416034343698204107435031703662, + 168182246258456, + 159317745087313, + 21888242871839275222246405745257275088548364400416034343698204054332732161983, + 21888242871839275222246405745257275088548364400416034343698203905572272237083, + 394890396955282, + 21888242871839275222246405745257275088548364400416034343698203736879076516799, + 21888242871839275222246405745257275088548364400416034343698204086545989200132, + 21888242871839275222246405745257275088548364400416034343698204143718618028044, + 546922980502404, + 360467123086337, + 21888242871839275222246405745257275088548364400416034343698203995547822287179, + 14267581536263, + 21888242871839275222246405745257275088548364400416034343698204140536851128978, + 21888242871839275222246405745257275088548364400416034343698203686136391648702, + 464621221828370, + 21888242871839275222246405745257275088548364400416034343698203800369048513961, + 56990024458091, + 21888242871839275222246405745257275088548364400416034343698204150571765771815, + 413882203940674, + 21888242871839275222246405745257275088548364400416034343698203678566222618758, + 21888242871839275222246405745257275088548364400416034343698204003383722832779, + 21888242871839275222246405745257275088548364400416034343698204103297615185024, + 21888242871839275222246405745257275088548364400416034343698203944911517674863, + 21888242871839275222246405745257275088548364400416034343698203744751069598913, + 21888242871839275222246405745257275088548364400416034343698203731715122856893, + 21888242871839275222246405745257275088548364400416034343698203882047333351451, + 259434135782114, + 21888242871839275222246405745257275088548364400416034343698203658156835935943, + 21888242871839275222246405745257275088548364400416034343698203696301533306334, + 21888242871839275222246405745257275088548364400416034343698204131101727728627, + 21888242871839275222246405745257275088548364400416034343698204142533240559180, + 21888242871839275222246405745257275088548364400416034343698204019214688377570, + 21888242871839275222246405745257275088548364400416034343698203965373317337229, + 423915903029326, + 21888242871839275222246405745257275088548364400416034343698203957666142356955, + 21888242871839275222246405745257275088548364400416034343698203686037434485503, + 242068198478104, + 21888242871839275222246405745257275088548364400416034343698204075807893889425, + 21888242871839275222246405745257275088548364400416034343698203714660660641448, + 308535114429355, + 422953388323717, + 468469582080182, + 486520637898570, + 5030513098869, + 21888242871839275222246405745257275088548364400416034343698204069496897281887, + 489817547680319, + 516478068703277, + 21888242871839275222246405745257275088548364400416034343698203921129922369704, + 21888242871839275222246405745257275088548364400416034343698203913136183599404, + 21888242871839275222246405745257275088548364400416034343698204184033072058091, + 376400261685416, + 312515050307060, + 21888242871839275222246405745257275088548364400416034343698203821446608944303, + 21888242871839275222246405745257275088548364400416034343698204150740515868828, + 21888242871839275222246405745257275088548364400416034343698203941058133158368, + 254151060680369, + 510112510193710, + 76447595891871, + 269367473017937, + 431023944745813, + 21888242871839275222246405745257275088548364400416034343698204171436514900909, + 21888242871839275222246405745257275088548364400416034343698203861939207956323, + 364305509567404, + 21888242871839275222246405745257275088548364400416034343698204152106454430282, + 313338169690017, + 21888242871839275222246405745257275088548364400416034343698204140840544535007, + 504321919153385, + 413595026633660, + 21888242871839275222246405745257275088548364400416034343698203944221911669263, + 21888242871839275222246405745257275088548364400416034343698204107754384097484, + 21888242871839275222246405745257275088548364400416034343698203636824619764376, + 18286163939349, + 158080022604554, + 215833444786938, + 21888242871839275222246405745257275088548364400416034343698203879216673679339, + 21888242871839275222246405745257275088548364400416034343698203886623085780987, + 533250176417411, + 21888242871839275222246405745257275088548364400416034343698204156744967127980, + 21888242871839275222246405745257275088548364400416034343698204024952797569798, + 21888242871839275222246405745257275088548364400416034343698203638595157135845, + 301254402538627, + 427510732366058, + 392362128840325, + 164930212114518, + 21888242871839275222246405745257275088548364400416034343698203806975793714508, + 21888242871839275222246405745257275088548364400416034343698203641060724507976, + 449436648780575, + 21888242871839275222246405745257275088548364400416034343698204049577050586629, + 282139081548644, + 346371446532637, + 104219201542472, + 520714054102777, + 21888242871839275222246405745257275088548364400416034343698203821213039318474, + 544850645637170, + 21888242871839275222246405745257275088548364400416034343698203765656747781501, + 21888242871839275222246405745257275088548364400416034343698203970425022323969, + 21888242871839275222246405745257275088548364400416034343698203791050097975851, + 21888242871839275222246405745257275088548364400416034343698204023350297600384, + 21888242871839275222246405745257275088548364400416034343698203913291273533960, + 79908366277520, + 21888242871839275222246405745257275088548364400416034343698204123348339050857, + 21888242871839275222246405745257275088548364400416034343698203707748361341298, + 20174830631397, + 268581393090905, + 21888242871839275222246405745257275088548364400416034343698203743539279334687, + 319987218322878, + 271141205723864, + 340598804588518, + 21888242871839275222246405745257275088548364400416034343698203953317967154904, + 21888242871839275222246405745257275088548364400416034343698204006375680774994, + 21888242871839275222246405745257275088548364400416034343698203682775538188439, + 21888242871839275222246405745257275088548364400416034343698203897132165815700, + 499784154456128, + 21888242871839275222246405745257275088548364400416034343698204048750033271901, + 21888242871839275222246405745257275088548364400416034343698203870837787917918, + 21888242871839275222246405745257275088548364400416034343698203710987462875832, + 21888242871839275222246405745257275088548364400416034343698203768580830480321, + 21888242871839275222246405745257275088548364400416034343698203635548541018187, + 430626230226296, + 21888242871839275222246405745257275088548364400416034343698203752254292557247, + 136378172147209, + 21888242871839275222246405745257275088548364400416034343698203743040923706889, + 307201836917247, + 21888242871839275222246405745257275088548364400416034343698203748829681584854, + 21888242871839275222246405745257275088548364400416034343698203973253685222729, + 21888242871839275222246405745257275088548364400416034343698203989903012637210, + 21888242871839275222246405745257275088548364400416034343698204181008069124106, + 21888242871839275222246405745257275088548364400416034343698203676178464637257, + 21888242871839275222246405745257275088548364400416034343698204067327979367870, + 24003179467975, + 469747900252352, + 263896428006326, + 492332763949013, + 287679149587892, + 21888242871839275222246405745257275088548364400416034343698203644034810725159, + 207143357764031, + 195036893127, + 129542297973129, + 21888242871839275222246405745257275088548364400416034343698203628724026055952, + 21888242871839275222246405745257275088548364400416034343698204158027600442875, + 21888242871839275222246405745257275088548364400416034343698203992315380395085, + 145031257638945, + 21888242871839275222246405745257275088548364400416034343698204139902884901150, + 51787801866049, + 21888242871839275222246405745257275088548364400416034343698203933054280897310, + 21888242871839275222246405745257275088548364400416034343698203985548936391925, + 21888242871839275222246405745257275088548364400416034343698203716556669742288, + 21888242871839275222246405745257275088548364400416034343698203822562266433601, + 257536949065745, + 342662177931825, + 63063643618026, + 262857531124879, + 60081429154002, + 539803562267037, + 21888242871839275222246405745257275088548364400416034343698203866002265941430, + 21888242871839275222246405745257275088548364400416034343698203839012807013142, + 183224801637380, + 9321887715401, + 137715037996950, + 65756400154425, + 21888242871839275222246405745257275088548364400416034343698203790695112042213, + 149772535944695, + 21888242871839275222246405745257275088548364400416034343698204175236088135705, + 202986246572425, + 464129473281572, + 21888242871839275222246405745257275088548364400416034343698203911166031510046, + 21888242871839275222246405745257275088548364400416034343698203990373921497367, + 21888242871839275222246405745257275088548364400416034343698203879131517314052, + 21888242871839275222246405745257275088548364400416034343698203756008818503808, + 248435780499672, + 37279420371734, + 497211548248081, + 19565556805201, + 155368379603667, + 21888242871839275222246405745257275088548364400416034343698203928843004232879, + 520006057918181, + 21888242871839275222246405745257275088548364400416034343698203676636829450782, + 21888242871839275222246405745257275088548364400416034343698203747141137409143, + 356574865827330, + 368635187559594, + 119743590252412, + 21888242871839275222246405745257275088548364400416034343698204149938591837130, + 21888242871839275222246405745257275088548364400416034343698203705813633780171, + 21888242871839275222246405745257275088548364400416034343698204025887940497194, + 21888242871839275222246405745257275088548364400416034343698203770178056698120, + 21888242871839275222246405745257275088548364400416034343698204126040933414961, + 18508844977778, + 21888242871839275222246405745257275088548364400416034343698204030041383003481, + 244427282765566, + 399777795728923, + 21888242871839275222246405745257275088548364400416034343698203990532084579140, + 21888242871839275222246405745257275088548364400416034343698203945703080799213, + 410246612989342, + 309736455265367, + 21888242871839275222246405745257275088548364400416034343698203867246515498482, + 21888242871839275222246405745257275088548364400416034343698203625548164795558, + 21888242871839275222246405745257275088548364400416034343698203634420590226141, + 234138274200962, + 349457079290519, + 478661560306337, + 21888242871839275222246405745257275088548364400416034343698204099523288552896, + 411472020184120, + 17204190043202, + 530136871219618, + 21888242871839275222246405745257275088548364400416034343698203902380933473857, + 21888242871839275222246405745257275088548364400416034343698203842633179703339, + 21888242871839275222246405745257275088548364400416034343698204060553676772224, + 21888242871839275222246405745257275088548364400416034343698203986820639492891, + 21888242871839275222246405745257275088548364400416034343698203668347030903176, + 21888242871839275222246405745257275088548364400416034343698203705054444415585, + 21888242871839275222246405745257275088548364400416034343698203887873093153318, + 21888242871839275222246405745257275088548364400416034343698204074640506051263, + 21888242871839275222246405745257275088548364400416034343698204045291289274898, + 21888242871839275222246405745257275088548364400416034343698203971087158258351, + 21888242871839275222246405745257275088548364400416034343698203801882277886143, + 463307027598636, + 21888242871839275222246405745257275088548364400416034343698203907620872908749, + 413803980170547, + 472984166705536, + 166979478365643, + 220577706749815, + 21888242871839275222246405745257275088548364400416034343698204057848178924408, + 94322408057899, + 21888242871839275222246405745257275088548364400416034343698203764152730349155, + 507718352292455, + 21888242871839275222246405745257275088548364400416034343698203826008744513924, + 21888242871839275222246405745257275088548364400416034343698203746049079257698, + 21888242871839275222246405745257275088548364400416034343698203918980433343782, + 21888242871839275222246405745257275088548364400416034343698203920829399923476, + 200683950626384, + 203980755767904, + 275515971824605, + 21888242871839275222246405745257275088548364400416034343698204179765392014080, + 21888242871839275222246405745257275088548364400416034343698203771926252458923, + 21888242871839275222246405745257275088548364400416034343698204030008735856021, + 471936443110085, + 30620318365895, + 21888242871839275222246405745257275088548364400416034343698204079254565882395, + 559678137153441, + 186591847378983, + 21888242871839275222246405745257275088548364400416034343698203633593266122849, + 21888242871839275222246405745257275088548364400416034343698204181348461972169, + 521403959841192, + 487598881156911, + 54878406867152, + 21888242871839275222246405745257275088548364400416034343698203788356514477724, + 21888242871839275222246405745257275088548364400416034343698203981847669514926, + 21888242871839275222246405745257275088548364400416034343698204013442205633279, + 4739715538067, + 498593912273353, + 21888242871839275222246405745257275088548364400416034343698204063527427955725, + 21888242871839275222246405745257275088548364400416034343698204033508391723292, + 266383156479177, + 414958354012059, + 191331281731522, + 21888242871839275222246405745257275088548364400416034343698204070962976573445, + 21888242871839275222246405745257275088548364400416034343698204024254642752391, + 168212906464066, + 21888242871839275222246405745257275088548364400416034343698204165309294571837, + 21888242871839275222246405745257275088548364400416034343698203930783099187164, + 32984857278891, + 21888242871839275222246405745257275088548364400416034343698203678580054573425, + 21888242871839275222246405745257275088548364400416034343698204079141767664873, + 398472793168262, + 21888242871839275222246405745257275088548364400416034343698204082571044008550, + 21888242871839275222246405745257275088548364400416034343698204166456053136592, + 21888242871839275222246405745257275088548364400416034343698203739936172785144, + 21888242871839275222246405745257275088548364400416034343698203864203229012915, + 21888242871839275222246405745257275088548364400416034343698203763980677147981, + 21888242871839275222246405745257275088548364400416034343698203898180966011750, + 21888242871839275222246405745257275088548364400416034343698203752927491440084, + 21888242871839275222246405745257275088548364400416034343698204048224677317583, + 21888242871839275222246405745257275088548364400416034343698204028190229481776, + 21888242871839275222246405745257275088548364400416034343698203780676440385408, + 21888242871839275222246405745257275088548364400416034343698203812080418000101, + 21656116749389, + 119134811363728, + 21888242871839275222246405745257275088548364400416034343698203846373795899605, + 21888242871839275222246405745257275088548364400416034343698203845519006582722, + 21888242871839275222246405745257275088548364400416034343698203932763884587158, + 505550625998495, + 50300518190739, + 413421111457327, + 21888242871839275222246405745257275088548364400416034343698204044294987528741, + 458557574084227, + 21888242871839275222246405745257275088548364400416034343698203676000274963326, + 12774116933834, + 321468071619325, + 21888242871839275222246405745257275088548364400416034343698204144162543289092, + 21888242871839275222246405745257275088548364400416034343698203905819563556316, + 114076443963705, + 21888242871839275222246405745257275088548364400416034343698203959033211022316, + 21888242871839275222246405745257275088548364400416034343698203846827555311827, + 21888242871839275222246405745257275088548364400416034343698203977593053470842, + 21888242871839275222246405745257275088548364400416034343698203951149979847006, + 21888242871839275222246405745257275088548364400416034343698203757461431804580, + 164847836439149, + 21888242871839275222246405745257275088548364400416034343698203716761287776455, + 77271204586737, + 33472465661464, + 21888242871839275222246405745257275088548364400416034343698203819151675386985, + 21888242871839275222246405745257275088548364400416034343698203840913203741011, + 535206232879292, + 439756034415511, + 21888242871839275222246405745257275088548364400416034343698203911097543385467, + 246641451206622, + 529407282149843, + 21888242871839275222246405745257275088548364400416034343698203900017857989151, + 21888242871839275222246405745257275088548364400416034343698203996004123930518, + 44522867593506, + 21888242871839275222246405745257275088548364400416034343698203723543198037565, + 346988584518990, + 21888242871839275222246405745257275088548364400416034343698203756149751452341, + 320866841211111, + 96268363574426, + 288426984275814, + 21888242871839275222246405745257275088548364400416034343698203946103156188426, + 21888242871839275222246405745257275088548364400416034343698203791586620829649, + 315678720865648, + 21888242871839275222246405745257275088548364400416034343698203975450041660471, + 21888242871839275222246405745257275088548364400416034343698204136285287106995, + 21888242871839275222246405745257275088548364400416034343698203936607774187316, + 21888242871839275222246405745257275088548364400416034343698203931916075590201, + 417887344001635, + 174226661304632, + 436642311688904, + 154283381348378, + 21888242871839275222246405745257275088548364400416034343698203708008960536919, + 21888242871839275222246405745257275088548364400416034343698203821306599435263, + 175498839337290, + 412037550139714, + 398447119565051, + 21888242871839275222246405745257275088548364400416034343698203718733615329248, + 21888242871839275222246405745257275088548364400416034343698203954380917249440, + 21888242871839275222246405745257275088548364400416034343698204172146837056397, + 50802305428334, + 21888242871839275222246405745257275088548364400416034343698203987202192512450, + 21888242871839275222246405745257275088548364400416034343698203625431854861806, + 119479544481197, + 21888242871839275222246405745257275088548364400416034343698203973264654221541, + 445873631498629, + 21888242871839275222246405745257275088548364400416034343698203892719245208961, + 21888242871839275222246405745257275088548364400416034343698203651489593414480, + 21888242871839275222246405745257275088548364400416034343698204145282509089550, + 21888242871839275222246405745257275088548364400416034343698203680265529992514, + 21888242871839275222246405745257275088548364400416034343698203667677830232860, + 156263035449297, + 21888242871839275222246405745257275088548364400416034343698204005925835854593, + 440007462446168, + 21888242871839275222246405745257275088548364400416034343698204043814983102281, + 519646162438983, + 523539499204016, + 128489740053947, + 21888242871839275222246405745257275088548364400416034343698203943488409732375, + 198211390994921, + 28389072202561, + 21888242871839275222246405745257275088548364400416034343698204108154905825530, + 21888242871839275222246405745257275088548364400416034343698204038595742801303, + 245535355085340, + 380767469878798, + 473896427471972, + 21888242871839275222246405745257275088548364400416034343698203993208008931627, + 21888242871839275222246405745257275088548364400416034343698203997561908869094, + 21888242871839275222246405745257275088548364400416034343698203698524364787532, + 21888242871839275222246405745257275088548364400416034343698203698419222554110, + 488876289542725, + 21888242871839275222246405745257275088548364400416034343698203771844864366932, + 21888242871839275222246405745257275088548364400416034343698203759526226467219, + 273623802232033, + 34838420825646, + 21888242871839275222246405745257275088548364400416034343698203687811521847111, + 560042083081353, + 21888242871839275222246405745257275088548364400416034343698204172476242091754, + 159388792828339, + 320542432212340, + 248200686495349, + 449798428199291, + 21888242871839275222246405745257275088548364400416034343698204047445740805412, + 234059845548050, + 131036582409352, + 552213027605173, + 272159386219944, + 21888242871839275222246405745257275088548364400416034343698203765275674195848, + 21888242871839275222246405745257275088548364400416034343698203696818701924747, + 141337877576803, + 21888242871839275222246405745257275088548364400416034343698203802156478914139, + 278204578838379, + 21888242871839275222246405745257275088548364400416034343698204098916866339970, + 490457022890425, + 255454341028125, + 21888242871839275222246405745257275088548364400416034343698203816356062974130, + 21888242871839275222246405745257275088548364400416034343698203964224518784230, + 21888242871839275222246405745257275088548364400416034343698203673585897592670, + 157780485931869, + 21888242871839275222246405745257275088548364400416034343698203667095970267273, + 21888242871839275222246405745257275088548364400416034343698204094525371659342, + 21888242871839275222246405745257275088548364400416034343698203873828738186614, + 54208967139567, + 21888242871839275222246405745257275088548364400416034343698203753680523360462, + 46894351729977, + 478528768866489, + 558831028496948, + 21888242871839275222246405745257275088548364400416034343698203831094081839271, + 338118439635553, + 21888242871839275222246405745257275088548364400416034343698203715071933002442, + 21888242871839275222246405745257275088548364400416034343698203695090453465616, + 21888242871839275222246405745257275088548364400416034343698203649775723614367, + 485857526379191, + 21888242871839275222246405745257275088548364400416034343698203836054075774097, + 21888242871839275222246405745257275088548364400416034343698204146812265435982, + 21888242871839275222246405745257275088548364400416034343698203824710586442560, + 21888242871839275222246405745257275088548364400416034343698203993364553689909, + 21888242871839275222246405745257275088548364400416034343698203996210294537723, + 21888242871839275222246405745257275088548364400416034343698203682833979144826, + 21888242871839275222246405745257275088548364400416034343698204098911139528002, + 124145682885501, + 21888242871839275222246405745257275088548364400416034343698203778420833444036, + 21888242871839275222246405745257275088548364400416034343698204042668172468596, + 21888242871839275222246405745257275088548364400416034343698204128498335117325, + 440648137668528, + 111937528209201, + 21888242871839275222246405745257275088548364400416034343698203995038593286980, + 88818428786323, + 21888242871839275222246405745257275088548364400416034343698203908919417679381, + 21888242871839275222246405745257275088548364400416034343698203798817426951016, + 21888242871839275222246405745257275088548364400416034343698204100443375751083, + 19197732928951, + 470241471651182, + 494518614396102, + 18956176438649, + 434720798098906, + 474750986031436, + 269039640054465, + 21888242871839275222246405745257275088548364400416034343698203812441090299438, + 21888242871839275222246405745257275088548364400416034343698204076345526033516, + 21888242871839275222246405745257275088548364400416034343698203702320999439210, + 502382826836016, + 21888242871839275222246405745257275088548364400416034343698203725909418599422, + 21888242871839275222246405745257275088548364400416034343698203912905715272914, + 21888242871839275222246405745257275088548364400416034343698204072259823716426, + 340005853169715, + 388172878142454, + 21888242871839275222246405745257275088548364400416034343698203652806522718558, + 21888242871839275222246405745257275088548364400416034343698203962471323823560, + 392812137816096, + 8136173036088, + 369146949064676, + 21888242871839275222246405745257275088548364400416034343698204082100541119054, + 62979809268309, + 335800969814951, + 312257481970030, + 469869881590336, + 21888242871839275222246405745257275088548364400416034343698203667346660196695, + 21888242871839275222246405745257275088548364400416034343698204005900224651704, + 105820064194105, + 540873020111083, + 102842871097202, + 21888242871839275222246405745257275088548364400416034343698203723280911604432, + 21888242871839275222246405745257275088548364400416034343698204032794263496994, + 494918848363385, + 21888242871839275222246405745257275088548364400416034343698204136409526939300, + 234707560841882, + 510211775350526, + 117249506276730, + 21888242871839275222246405745257275088548364400416034343698203713128370089455, + 21888242871839275222246405745257275088548364400416034343698203662102758498603, + 504387034844171, + 133278245926240, + 81472281692575, + 277378153632141, + 508562871292711, + 482171283082550, + 21888242871839275222246405745257275088548364400416034343698204105800294989838, + 21888242871839275222246405745257275088548364400416034343698204139214646132899, + 21630366381277, + 21888242871839275222246405745257275088548364400416034343698203658645752408247, + 141255067782503, + 21888242871839275222246405745257275088548364400416034343698204177159865302648, + 21888242871839275222246405745257275088548364400416034343698204082040528429927, + 420235307579381, + 21888242871839275222246405745257275088548364400416034343698204052622066043456, + 21888242871839275222246405745257275088548364400416034343698203692405666723189, + 21888242871839275222246405745257275088548364400416034343698203698632873176236, + 21888242871839275222246405745257275088548364400416034343698203890265004169216, + 341777635514976, + 362918278330336, + 21888242871839275222246405745257275088548364400416034343698203803294746200390, + 152997828952447, + 21888242871839275222246405745257275088548364400416034343698203779498540674693, + 262849846277614, + 21888242871839275222246405745257275088548364400416034343698203939393370139351, + 21888242871839275222246405745257275088548364400416034343698204002636832505429, + 18317109012763, + 21888242871839275222246405745257275088548364400416034343698204159957192406979, + 417035298637296, + 530000233313355, + 544349547847591, + 34509063686282, + 21888242871839275222246405745257275088548364400416034343698203625305286875525, + 21888242871839275222246405745257275088548364400416034343698204160782183127043, + 462558204342044, + 469393467910769, + 21888242871839275222246405745257275088548364400416034343698204074872956162214, + 21888242871839275222246405745257275088548364400416034343698203798986000389213, + 284184053930992, + 160952886889230, + 21888242871839275222246405745257275088548364400416034343698204045961460110228, + 21888242871839275222246405745257275088548364400416034343698204015627528983516, + 21888242871839275222246405745257275088548364400416034343698203910072826478259, + 21888242871839275222246405745257275088548364400416034343698204076899495909105, + 268695127850167, + 21888242871839275222246405745257275088548364400416034343698203940699139090398, + 188047774134760, + 21888242871839275222246405745257275088548364400416034343698204024011325430046, + 314819735475491, + 21888242871839275222246405745257275088548364400416034343698203789649193953951, + 346322051999167, + 21888242871839275222246405745257275088548364400416034343698203642833568478491, + 420297225348684, + 506981346340467, + 21888242871839275222246405745257275088548364400416034343698204080454297146834, + 21888242871839275222246405745257275088548364400416034343698204179747179230827, + 21888242871839275222246405745257275088548364400416034343698204126220320704834, + 21888242871839275222246405745257275088548364400416034343698204153113870016850, + 21888242871839275222246405745257275088548364400416034343698203817991078608650, + 21888242871839275222246405745257275088548364400416034343698203688152001554363, + 267019029369301, + 21888242871839275222246405745257275088548364400416034343698204066803246740932, + 21888242871839275222246405745257275088548364400416034343698204173604029193854, + 21888242871839275222246405745257275088548364400416034343698203976089851713849, + 21888242871839275222246405745257275088548364400416034343698203947860612237668, + 21888242871839275222246405745257275088548364400416034343698203881649212485829, + 21888242871839275222246405745257275088548364400416034343698203951808748128776, + 21888242871839275222246405745257275088548364400416034343698203655156925677999, + 21888242871839275222246405745257275088548364400416034343698204064564813525480, + 21888242871839275222246405745257275088548364400416034343698203855658861858075, + 21888242871839275222246405745257275088548364400416034343698203901448103018446, + 336477008602320, + 21888242871839275222246405745257275088548364400416034343698204030024412939285, + 459010146179787, + 21888242871839275222246405745257275088548364400416034343698203886756693948393, + 21888242871839275222246405745257275088548364400416034343698203633597500870844, + 220605567041711, + 21888242871839275222246405745257275088548364400416034343698204020888139254690, + 21888242871839275222246405745257275088548364400416034343698204124781193714393, + 21888242871839275222246405745257275088548364400416034343698203938101663096816, + 21888242871839275222246405745257275088548364400416034343698203671030598078182, + 21888242871839275222246405745257275088548364400416034343698203861292191641158, + 174547895975097, + 21888242871839275222246405745257275088548364400416034343698204138876684099826, + 21888242871839275222246405745257275088548364400416034343698203950065373836335, + 214309840860768, + 522616560151627, + 21888242871839275222246405745257275088548364400416034343698204169890731276650, + 484667997022381, + 21888242871839275222246405745257275088548364400416034343698203631747808094998, + 382898690333209, + 542229846439688, + 21888242871839275222246405745257275088548364400416034343698203869086425021127, + 172725378221741, + 21888242871839275222246405745257275088548364400416034343698203657837422376437, + 131138868152731, + 21888242871839275222246405745257275088548364400416034343698203670528109680484, + 368278985080026, + 21888242871839275222246405745257275088548364400416034343698203725448660523841, + 45472905162591, + 557863234531575, + 11611728379081, + 21888242871839275222246405745257275088548364400416034343698203872523812747804, + 21888242871839275222246405745257275088548364400416034343698203941958038549435, + 487977439905400, + 21888242871839275222246405745257275088548364400416034343698204093182233641230, + 195778877396120, + 289630049921129, + 21888242871839275222246405745257275088548364400416034343698203674373617724680, + 21888242871839275222246405745257275088548364400416034343698203642755891943780, + 21888242871839275222246405745257275088548364400416034343698203771123316250363, + 21888242871839275222246405745257275088548364400416034343698203723424699467710, + 324809052014411, + 185884354805795, + 332151009637871, + 21888242871839275222246405745257275088548364400416034343698204185350849245505, + 504945130659636, + 362272939084013, + 21888242871839275222246405745257275088548364400416034343698203909023095286255, + 412939866828878, + 458830394917940, + 21888242871839275222246405745257275088548364400416034343698203813398973336008, + 21888242871839275222246405745257275088548364400416034343698203689173656533761, + 21888242871839275222246405745257275088548364400416034343698204166940610915893, + 21888242871839275222246405745257275088548364400416034343698203874250280029397, + 21888242871839275222246405745257275088548364400416034343698204119894133988958, + 21888242871839275222246405745257275088548364400416034343698204077375004427754, + 186347480393232, + 21888242871839275222246405745257275088548364400416034343698203947309238406647, + 150384208942011, + 321327263282765, + 21888242871839275222246405745257275088548364400416034343698203709709764744822, + 418158913247596, + 499738603040507, + 21888242871839275222246405745257275088548364400416034343698203961230934245210, + 70794530719686, + 364005768079952, + 21888242871839275222246405745257275088548364400416034343698204063192710089427, + 467550426581820, + 322797186021477, + 349139167755833, + 157296251292855, + 30656646099215, + 21888242871839275222246405745257275088548364400416034343698203980080884898012, + 21888242871839275222246405745257275088548364400416034343698203864460900533807, + 88551018100527, + 21888242871839275222246405745257275088548364400416034343698203932973894168391, + 183063400054665, + 21888242871839275222246405745257275088548364400416034343698203928783649380130, + 21888242871839275222246405745257275088548364400416034343698204101873038797623, + 285312122840129, + 71372724692636, + 21888242871839275222246405745257275088548364400416034343698203658818151545654, + 207342013033584, + 526001524903233, + 245744482982857, + 272118617528514, + 523650119406197, + 554892221254418, + 7764885798127, + 21888242871839275222246405745257275088548364400416034343698204087001211871937, + 498297684120193, + 21888242871839275222246405745257275088548364400416034343698203726563911703681, + 111756881574478, + 21888242871839275222246405745257275088548364400416034343698204162652455326325, + 21888242871839275222246405745257275088548364400416034343698203987484562398368, + 21888242871839275222246405745257275088548364400416034343698204105072773606767, + 21888242871839275222246405745257275088548364400416034343698203895303218007033, + 442287594788972, + 491323367676829, + 21888242871839275222246405745257275088548364400416034343698203841535641489638, + 297413569252021, + 21888242871839275222246405745257275088548364400416034343698203878581521852506, + 21888242871839275222246405745257275088548364400416034343698203745747326747974, + 47040634724092, + 21888242871839275222246405745257275088548364400416034343698203857365279351210, + 21888242871839275222246405745257275088548364400416034343698203785481276637787, + 386268866688964, + 224288068607867, + 21888242871839275222246405745257275088548364400416034343698203703720274058192, + 21888242871839275222246405745257275088548364400416034343698203892435379168945, + 21888242871839275222246405745257275088548364400416034343698203760801642933246, + 21888242871839275222246405745257275088548364400416034343698203936543922937147, + 310112574993936, + 235204559342581, + 21888242871839275222246405745257275088548364400416034343698203879188975769285, + 386406109749594, + 21888242871839275222246405745257275088548364400416034343698203739799890817705, + 21888242871839275222246405745257275088548364400416034343698203703501852552649, + 21888242871839275222246405745257275088548364400416034343698204098321679686792, + 129065068876161, + 21888242871839275222246405745257275088548364400416034343698203889674280128374, + 21888242871839275222246405745257275088548364400416034343698204155104629737407, + 121460939233255, + 21888242871839275222246405745257275088548364400416034343698203869562444100727, + 285792926383296, + 21888242871839275222246405745257275088548364400416034343698204102197466150909, + 274953941114572, + 480993795527621, + 512161850969371, + 21888242871839275222246405745257275088548364400416034343698203818994760571066, + 21888242871839275222246405745257275088548364400416034343698204021123207587857, + 21888242871839275222246405745257275088548364400416034343698204173453789473510, + 21888242871839275222246405745257275088548364400416034343698203720827521199454, + 84657477613647, + 503390648057058, + 504408294464739, + 21888242871839275222246405745257275088548364400416034343698204069622257797317, + 116631344852464, + 346238196174900, + 21888242871839275222246405745257275088548364400416034343698203726458680925318, + 317103300305959, + 21888242871839275222246405745257275088548364400416034343698204141790061748414, + 177726993726182, + 21888242871839275222246405745257275088548364400416034343698203842526422645624, + 21888242871839275222246405745257275088548364400416034343698203909666094921041, + 21888242871839275222246405745257275088548364400416034343698204117012527184458, + 21888242871839275222246405745257275088548364400416034343698203670594271905001, + 21888242871839275222246405745257275088548364400416034343698203960159873170608, + 332206470453120, + 21888242871839275222246405745257275088548364400416034343698203933659454072242, + 232914615139886, + 524077045365668, + 481723905436488, + 21888242871839275222246405745257275088548364400416034343698203715170480936338, + 380669018289628, + 539877494895710, + 21888242871839275222246405745257275088548364400416034343698203980810989282796, + 168120756535985, + 21888242871839275222246405745257275088548364400416034343698203805165412258072, + 21888242871839275222246405745257275088548364400416034343698204118036770485820, + 21888242871839275222246405745257275088548364400416034343698203686831576156716, + 255459654932349, + 274483985327227, + 21888242871839275222246405745257275088548364400416034343698204015072373252417, + 21888242871839275222246405745257275088548364400416034343698203662526619430571, + 447512316504814, + 21888242871839275222246405745257275088548364400416034343698203673879288910723, + 21888242871839275222246405745257275088548364400416034343698203659309803873215, + 21888242871839275222246405745257275088548364400416034343698204182748680707555, + 21888242871839275222246405745257275088548364400416034343698204183141561085240, + 21888242871839275222246405745257275088548364400416034343698204070320407468163, + 378512573678490, + 237836244825899, + 21888242871839275222246405745257275088548364400416034343698203692032877332663, + 546117272974625, + 21888242871839275222246405745257275088548364400416034343698203994792337437234, + 21888242871839275222246405745257275088548364400416034343698204102228923440182, + 21888242871839275222246405745257275088548364400416034343698204066312787668964, + 136084521690741, + 21888242871839275222246405745257275088548364400416034343698203712998907328787, + 21888242871839275222246405745257275088548364400416034343698203888000444836797, + 419315005536232, + 479718796722035, + 202128597709432, + 203946364158349, + 452993614877128, + 189223164365238, + 121776203668304, + 410186160608256, + 21888242871839275222246405745257275088548364400416034343698203695100587476686, + 21888242871839275222246405745257275088548364400416034343698203962039709858100, + 58498947449959, + 21888242871839275222246405745257275088548364400416034343698203906165935044975, + 297808477273764, + 88091592320166, + 21888242871839275222246405745257275088548364400416034343698204144904646414640, + 21888242871839275222246405745257275088548364400416034343698203950925714073265, + 36267541664294, + 309954882923748, + 225349027552030, + 21888242871839275222246405745257275088548364400416034343698204078701044153598, + 374478407037578, + 316334089131711, + 21888242871839275222246405745257275088548364400416034343698204158093625358628, + 21888242871839275222246405745257275088548364400416034343698203883212814168615, + 21888242871839275222246405745257275088548364400416034343698204168626370016192, + 278995208486833, + 487913864236065, + 21888242871839275222246405745257275088548364400416034343698204184675363618170, + 89649224695813, + 135337288136436, + 21888242871839275222246405745257275088548364400416034343698203851269957789536, + 351363058285704, + 21888242871839275222246405745257275088548364400416034343698203812998153810562, + 544114518759316, + 529849985855405, + 167170121861825, + 142985022518187, + 156346767313316, + 380311109229297, + 518445567609638, + 21888242871839275222246405745257275088548364400416034343698203820711471267770, + 21888242871839275222246405745257275088548364400416034343698203862232031614418, + 163306182685884, + 21888242871839275222246405745257275088548364400416034343698203769332947330719, + 21888242871839275222246405745257275088548364400416034343698203733917782330049, + 22536806716037, + 237213645919387, + 21888242871839275222246405745257275088548364400416034343698203921900511048281, + 21888242871839275222246405745257275088548364400416034343698203904499677617885, + 21888242871839275222246405745257275088548364400416034343698204002936752926694, + 388577481789747, + 21888242871839275222246405745257275088548364400416034343698203710765312541922, + 21888242871839275222246405745257275088548364400416034343698203786475960734978, + 21888242871839275222246405745257275088548364400416034343698203859794849709042, + 21888242871839275222246405745257275088548364400416034343698203838911274240790, + 21888242871839275222246405745257275088548364400416034343698203890399824181214, + 21888242871839275222246405745257275088548364400416034343698204047331667390564, + 21888242871839275222246405745257275088548364400416034343698203767557640703025, + 21888242871839275222246405745257275088548364400416034343698203928598143737789, + 63948416131579, + 410703074945452, + 85636195805533, + 21888242871839275222246405745257275088548364400416034343698204108903077132633, + 21888242871839275222246405745257275088548364400416034343698204020558947209777, + 21888242871839275222246405745257275088548364400416034343698203932420709519759, + 21888242871839275222246405745257275088548364400416034343698204111921204235884, + 336005712214858, + 65071306739549, + 338368696407378, + 21888242871839275222246405745257275088548364400416034343698204160584981087889, + 249353096743282, + 21888242871839275222246405745257275088548364400416034343698203636082220161523, + 506032290247324, + 332052888030463, + 21888242871839275222246405745257275088548364400416034343698203773142214474158, + 367424025712771, + 21888242871839275222246405745257275088548364400416034343698204155149411967409, + 21888242871839275222246405745257275088548364400416034343698204155697473342457, + 407684128957643, + 560423284502383, + 561282740387242, + 449547696695779, + 21888242871839275222246405745257275088548364400416034343698203828690695581420, + 21888242871839275222246405745257275088548364400416034343698203949977420622296, + 21888242871839275222246405745257275088548364400416034343698203829878190038602, + 316137250690540, + 21888242871839275222246405745257275088548364400416034343698203808413722417990, + 21888242871839275222246405745257275088548364400416034343698203757716340592949, + 21888242871839275222246405745257275088548364400416034343698203827370995038740, + 493189419706449, + 21888242871839275222246405745257275088548364400416034343698203672267964056162, + 21888242871839275222246405745257275088548364400416034343698203672272199426321, + 21888242871839275222246405745257275088548364400416034343698203768924546225675, + 21888242871839275222246405745257275088548364400416034343698203895957560704787, + 247116363573029, + 21888242871839275222246405745257275088548364400416034343698204116928473034402, + 63783053737306, + 21888242871839275222246405745257275088548364400416034343698203948356493912038, + 113063388272090, + 24052333232367, + 21888242871839275222246405745257275088548364400416034343698203760585460009638, + 21888242871839275222246405745257275088548364400416034343698204139717722168128, + 494324559859696, + 356099540524916, + 21888242871839275222246405745257275088548364400416034343698203962142617931475, + 394190852951414, + 366662403753849, + 21888242871839275222246405745257275088548364400416034343698203970550315670709, + 21888242871839275222246405745257275088548364400416034343698203719001129314617, + 400101778175752, + 353953840779973, + 372790811741172, + 21888242871839275222246405745257275088548364400416034343698203715419881263184, + 21888242871839275222246405745257275088548364400416034343698203648178634946796, + 21888242871839275222246405745257275088548364400416034343698204075194603995462, + 21888242871839275222246405745257275088548364400416034343698204069100630499578, + 21888242871839275222246405745257275088548364400416034343698203962346017698721, + 21888242871839275222246405745257275088548364400416034343698204079981100282752, + 21888242871839275222246405745257275088548364400416034343698203880946242581580, + 21888242871839275222246405745257275088548364400416034343698203760627919789527, + 21888242871839275222246405745257275088548364400416034343698204148958968383738, + 21888242871839275222246405745257275088548364400416034343698204138359722019077, + 21888242871839275222246405745257275088548364400416034343698204048421340578015, + 214094483699569, + 21888242871839275222246405745257275088548364400416034343698203951424928717665, + 21888242871839275222246405745257275088548364400416034343698204078348174547124, + 404190375502156, + 490371128812078, + 21888242871839275222246405745257275088548364400416034343698203647514852199075, + 305010804130967, + 21888242871839275222246405745257275088548364400416034343698203830450226725980, + 42741219996524, + 21888242871839275222246405745257275088548364400416034343698204138935210453833, + 21888242871839275222246405745257275088548364400416034343698204155818947613672, + 350102648854384, + 21888242871839275222246405745257275088548364400416034343698204086444685767480, + 21888242871839275222246405745257275088548364400416034343698204039012214883023, + 488106423558242, + 21888242871839275222246405745257275088548364400416034343698203976564907298482, + 56044130294252, + 21888242871839275222246405745257275088548364400416034343698204040669983040956, + 21888242871839275222246405745257275088548364400416034343698203931646988280783, + 21888242871839275222246405745257275088548364400416034343698203956516332906229, + 21888242871839275222246405745257275088548364400416034343698204171685070540505, + 21888242871839275222246405745257275088548364400416034343698204097764720337147, + 21888242871839275222246405745257275088548364400416034343698203657026100848411, + 39764804749675, + 498811680621826, + 417196314237069, + 102112404993338, + 556135369904752, + 527458875135475, + 21888242871839275222246405745257275088548364400416034343698204113289730981692, + 85246057901253, + 21888242871839275222246405745257275088548364400416034343698203775043490225198, + 21888242871839275222246405745257275088548364400416034343698204135048878307658, + 106480818006898, + 21888242871839275222246405745257275088548364400416034343698203985434921724532, + 474151420400537, + 21888242871839275222246405745257275088548364400416034343698203768633386550806, + 448159921724435, + 90070892036270, + 74026679510518, + 371133709719329, + 71650220876859, + 130360055567922, + 21888242871839275222246405745257275088548364400416034343698203911051935220154, + 476210871708362, + 511908220431363, + 214321392079750, + 21888242871839275222246405745257275088548364400416034343698204065923432112507, + 21888242871839275222246405745257275088548364400416034343698203647480115875061, + 507680673306639, + 358125833364286, + 247901977796397, + 21888242871839275222246405745257275088548364400416034343698203815462986238360, + 21888242871839275222246405745257275088548364400416034343698203934410718864077, + 232649617698107, + 66439866206218, + 132243857633710, + 21888242871839275222246405745257275088548364400416034343698203751089846702994, + 21888242871839275222246405745257275088548364400416034343698203991398679878993, + 21888242871839275222246405745257275088548364400416034343698203815426268870663, + 21888242871839275222246405745257275088548364400416034343698203862431882089282, + 21888242871839275222246405745257275088548364400416034343698204023088105886890, + 420403864869445, + 21888242871839275222246405745257275088548364400416034343698203730773416096455, + 235775598325134, + 365841892613127, + 453690964096265, + 21888242871839275222246405745257275088548364400416034343698203793686737494119, + 336299590097470, + 21888242871839275222246405745257275088548364400416034343698203684214546883782, + 21888242871839275222246405745257275088548364400416034343698204098426139840101, + 21888242871839275222246405745257275088548364400416034343698203679198107860717, + 430369970793682, + 21888242871839275222246405745257275088548364400416034343698203834540113439694, + 21888242871839275222246405745257275088548364400416034343698203770334988059768, + 85490342514039, + 316409732763576, + 21888242871839275222246405745257275088548364400416034343698204039613536604781, + 21888242871839275222246405745257275088548364400416034343698203933630447843885, + 60434459294909, + 21888242871839275222246405745257275088548364400416034343698204027944468769585, + 21888242871839275222246405745257275088548364400416034343698204176983614142513, + 69440676532667, + 450900733438624, + 192577103704144, + 366105680879734, + 127251088380311, + 21888242871839275222246405745257275088548364400416034343698203719382168996092, + 455941140552293, + 456077003855628, + 225621090769912, + 129684954027511, + 21888242871839275222246405745257275088548364400416034343698204171526216025604, + 389453519699406, + 21888242871839275222246405745257275088548364400416034343698203647907822718342, + 136421547972382, + 331953060058452, + 284537389464551, + 21888242871839275222246405745257275088548364400416034343698203868442618655488, + 82315569734044, + 169254355720903, + 21888242871839275222246405745257275088548364400416034343698203999681957312020, + 21888242871839275222246405745257275088548364400416034343698203915388826937242, + 448379910090690, + 253994417752448, + 504627151083224, + 270753908904254, + 111629658668364, + 21888242871839275222246405745257275088548364400416034343698204001948601552116, + 370586980115937, + 355978364835670, + 21888242871839275222246405745257275088548364400416034343698204064834038773868, + 466904067095360, + 21888242871839275222246405745257275088548364400416034343698203661476063141181, + 391767978838516, + 234499638083799, + 242974096612491, + 525678489627633, + 222790043824604, + 308595864886279, + 238937595311779, + 21888242871839275222246405745257275088548364400416034343698204062618328360361, + 21888242871839275222246405745257275088548364400416034343698203733206526311877, + 21888242871839275222246405745257275088548364400416034343698204132769237284103, + 225407371651186, + 215861374532580, + 21888242871839275222246405745257275088548364400416034343698203791191835238762, + 33714158342222, + 31685007603063, + 92404012847951, + 21888242871839275222246405745257275088548364400416034343698203730540433463208, + 21888242871839275222246405745257275088548364400416034343698203937734186271036, + 21888242871839275222246405745257275088548364400416034343698203996650552908311, + 485169894549130, + 112009307720380, + 453380186680791, + 21888242871839275222246405745257275088548364400416034343698203915058445830830, + 21888242871839275222246405745257275088548364400416034343698203695123088218689, + 21888242871839275222246405745257275088548364400416034343698203817987018890862, + 21888242871839275222246405745257275088548364400416034343698204044578430835567, + 21888242871839275222246405745257275088548364400416034343698204080578391698245, + 21888242871839275222246405745257275088548364400416034343698204061540897753352, + 21888242871839275222246405745257275088548364400416034343698203628428564003686, + 21888242871839275222246405745257275088548364400416034343698203687380538125582, + 21888242871839275222246405745257275088548364400416034343698203631650702310511, + 17236597578068, + 21888242871839275222246405745257275088548364400416034343698203722527785317540, + 21888242871839275222246405745257275088548364400416034343698204107065208617407, + 21888242871839275222246405745257275088548364400416034343698203806623585148475, + 3168885290849, + 21888242871839275222246405745257275088548364400416034343698203817391368626435, + 2252326082750, + 21888242871839275222246405745257275088548364400416034343698203870270997204289, + 294030926990599, + 134037916285545, + 21888242871839275222246405745257275088548364400416034343698203696242994634128, + 21888242871839275222246405745257275088548364400416034343698203688848183581337, + 21888242871839275222246405745257275088548364400416034343698204005476960582050, + 21888242871839275222246405745257275088548364400416034343698203756460736074196, + 307753101327530, + 377907671699296, + 21888242871839275222246405745257275088548364400416034343698203902515818353033, + 21888242871839275222246405745257275088548364400416034343698203722223441509791, + 101182130343016, + 21888242871839275222246405745257275088548364400416034343698204054461821518381, + 21888242871839275222246405745257275088548364400416034343698203706458829823062, + 21888242871839275222246405745257275088548364400416034343698203931354339126342, + 65387972328821, + 273180791684694, + 506028696514364, + 21888242871839275222246405745257275088548364400416034343698203936457550824138, + 21888242871839275222246405745257275088548364400416034343698204065189355902868, + 21888242871839275222246405745257275088548364400416034343698204111839585368430, + 21888242871839275222246405745257275088548364400416034343698204021469298121405, + 558325876694896, + 21888242871839275222246405745257275088548364400416034343698203853156248861323, + 228657116158286, + 125716202907923, + 21888242871839275222246405745257275088548364400416034343698203658575517098148, + 21888242871839275222246405745257275088548364400416034343698203945006505743815, + 499546497797321, + 21888242871839275222246405745257275088548364400416034343698203711879528175972, + 174258991469531, + 454384452419784, + 307327537805208, + 357108459723188, + 482799746042591, + 73380507914103, + 21888242871839275222246405745257275088548364400416034343698203877471985159252, + 223987924909903, + 504199348642711, + 131315822098912, + 448927210768865, + 550223526062080, + 366570490608193, + 95029768389064, + 84001749568421, + 51741558745132, + 21888242871839275222246405745257275088548364400416034343698203831675437071375, + 21888242871839275222246405745257275088548364400416034343698204081121667126127, + 21888242871839275222246405745257275088548364400416034343698203740859515738362, + 21888242871839275222246405745257275088548364400416034343698204052503929066596, + 21888242871839275222246405745257275088548364400416034343698203985541611750478, + 21888242871839275222246405745257275088548364400416034343698203627477047181582, + 21888242871839275222246405745257275088548364400416034343698204115937369466592, + 420423944545828, + 21888242871839275222246405745257275088548364400416034343698204070264225584157, + 544188766339845, + 21888242871839275222246405745257275088548364400416034343698203866159050681466, + 199730308792314, + 376393212438776, + 108136228855541, + 201308636475408, + 116879884154229, + 21888242871839275222246405745257275088548364400416034343698203858744016210444, + 146372762518, + 21888242871839275222246405745257275088548364400416034343698203661400653946080, + 21888242871839275222246405745257275088548364400416034343698204082553408597425, + 21888242871839275222246405745257275088548364400416034343698203660714927095948, + 408845573840414, + 21888242871839275222246405745257275088548364400416034343698203715041375104144, + 21888242871839275222246405745257275088548364400416034343698203998072859474847, + 408837763722012, + 130932414309631, + 21888242871839275222246405745257275088548364400416034343698203669365004499095, + 21888242871839275222246405745257275088548364400416034343698203984316760896417, + 129139411540616, + 21888242871839275222246405745257275088548364400416034343698203660334949845873, + 21888242871839275222246405745257275088548364400416034343698203729542751768846, + 191179604715957, + 21888242871839275222246405745257275088548364400416034343698204092257817309080, + 21888242871839275222246405745257275088548364400416034343698204168703338503714, + 327354700857491, + 21888242871839275222246405745257275088548364400416034343698203873406978508884, + 21888242871839275222246405745257275088548364400416034343698204062671551730048, + 478171414770782, + 547253572713684, + 21888242871839275222246405745257275088548364400416034343698203930284243657832, + 21888242871839275222246405745257275088548364400416034343698203877102933914827, + 21888242871839275222246405745257275088548364400416034343698203964962571500748, + 218171572705703, + 21888242871839275222246405745257275088548364400416034343698203773306754997837, + 21888242871839275222246405745257275088548364400416034343698204165139277467802, + 21888242871839275222246405745257275088548364400416034343698203766023407292882, + 21888242871839275222246405745257275088548364400416034343698203739624404620595, + 21888242871839275222246405745257275088548364400416034343698204169064439153031, + 21888242871839275222246405745257275088548364400416034343698204169585219150650, + 514848906038655, + 136677576788969, + 238123240872087, + 21888242871839275222246405745257275088548364400416034343698203762075051810091, + 363112671135136, + 21888242871839275222246405745257275088548364400416034343698203713771879894861, + 21888242871839275222246405745257275088548364400416034343698203947500804385882, + 21888242871839275222246405745257275088548364400416034343698203632123415456435, + 21888242871839275222246405745257275088548364400416034343698203949859867998580, + 21888242871839275222246405745257275088548364400416034343698204123577842792699, + 21888242871839275222246405745257275088548364400416034343698204123464982976938, + 21888242871839275222246405745257275088548364400416034343698203896445438287241, + 87806878672899, + 21888242871839275222246405745257275088548364400416034343698203917621026383538, + 311394042415263, + 230475419302601, + 21888242871839275222246405745257275088548364400416034343698203886767803153539, + 397166081899687, + 459397694823386, + 21888242871839275222246405745257275088548364400416034343698204020426280408359, + 21888242871839275222246405745257275088548364400416034343698203724522883904345, + 395462702537820, + 21888242871839275222246405745257275088548364400416034343698203757069369622878, + 282175827046410, + 21888242871839275222246405745257275088548364400416034343698204128118019498218, + 145058695566311, + 21888242871839275222246405745257275088548364400416034343698203883123032891302, + 21888242871839275222246405745257275088548364400416034343698204022385279955804, + 71506977456920, + 21888242871839275222246405745257275088548364400416034343698203976487987975314, + 180106847196903, + 21888242871839275222246405745257275088548364400416034343698203797171292864465, + 432164838358613, + 415171405255892, + 74137214767285, + 21888242871839275222246405745257275088548364400416034343698204019945317735567, + 21888242871839275222246405745257275088548364400416034343698203760056828864333, + 1627465428024, + 281087172329656, + 21888242871839275222246405745257275088548364400416034343698203723352367509102, + 286870506619783, + 386994674788187, + 541932447964253, + 29763938221298, + 509674721519341, + 21888242871839275222246405745257275088548364400416034343698203912442078395616, + 392387446565946, + 54864513356521, + 21888242871839275222246405745257275088548364400416034343698203696143672371224, + 21888242871839275222246405745257275088548364400416034343698204175341576435547, + 21888242871839275222246405745257275088548364400416034343698203729023750137877, + 349411296660186, + 21888242871839275222246405745257275088548364400416034343698204019529984961304, + 486597397889750, + 21888242871839275222246405745257275088548364400416034343698203729667739396035, + 273566201325559, + 21888242871839275222246405745257275088548364400416034343698204007162777598443, + 59987584080749, + 181401176846450, + 492818864304452, + 520790420004992, + 133115514669907, + 21888242871839275222246405745257275088548364400416034343698203928440085053943, + 21888242871839275222246405745257275088548364400416034343698203994254906247709, + 102839371501964, + 21888242871839275222246405745257275088548364400416034343698203661111033351629, + 21888242871839275222246405745257275088548364400416034343698203697847493566504, + 406467859720504, + 226586429393324, + 21888242871839275222246405745257275088548364400416034343698203715769900250798, + 21888242871839275222246405745257275088548364400416034343698203743534673860957, + 21888242871839275222246405745257275088548364400416034343698203780911348304530, + 21888242871839275222246405745257275088548364400416034343698203953279618327903, + 196532323470586, + 21888242871839275222246405745257275088548364400416034343698203738149424623094, + 21888242871839275222246405745257275088548364400416034343698203786291259674030, + 275114861604323, + 388098918939642, + 214592614657717, + 21888242871839275222246405745257275088548364400416034343698203742515982271278, + 314716923853499, + 23969282004781, + 400638704148096, + 215707811536458, + 21888242871839275222246405745257275088548364400416034343698203909826083430896, + 21888242871839275222246405745257275088548364400416034343698203790859202194909, + 21888242871839275222246405745257275088548364400416034343698204113160494847356, + 217691825310084, + 280065350910749, + 111944502794507, + 438402838166481, + 172038825030947, + 21888242871839275222246405745257275088548364400416034343698204071477946666976, + 276301147201467, + 21888242871839275222246405745257275088548364400416034343698204132873578324646, + 537793760206678, + 371087678141556, + 336297184842538, + 21888242871839275222246405745257275088548364400416034343698204027614010393561, + 315494118194657, + 418522623922055, + 496009754715829, + 21888242871839275222246405745257275088548364400416034343698203697700455185723, + 106399132863291, + 439180079823672, + 519762409468275, + 478796006922511, + 21888242871839275222246405745257275088548364400416034343698203721428561976161, + 441140235767348, + 495024884880938, + 21888242871839275222246405745257275088548364400416034343698203760672220385937, + 21888242871839275222246405745257275088548364400416034343698203993373575660291, + 21888242871839275222246405745257275088548364400416034343698203918108703314572, + 21888242871839275222246405745257275088548364400416034343698203632080065944203, + 196385836235378, + 104919509398368, + 21888242871839275222246405745257275088548364400416034343698204052123547155424, + 238526454391010, + 21888242871839275222246405745257275088548364400416034343698204002876818217001, + 21888242871839275222246405745257275088548364400416034343698204099505498504645, + 21888242871839275222246405745257275088548364400416034343698204156130732255523, + 80483030087669, + 21888242871839275222246405745257275088548364400416034343698203638183628950683, + 21888242871839275222246405745257275088548364400416034343698203632249161534375, + 451428697606457, + 21888242871839275222246405745257275088548364400416034343698204128544298567672, + 21888242871839275222246405745257275088548364400416034343698203691472988592478, + 67219923746810, + 488189101738471, + 252272885285335, + 21888242871839275222246405745257275088548364400416034343698203859989537958834, + 229319951691173, + 21888242871839275222246405745257275088548364400416034343698204170253865576313, + 189032060128779, + 21888242871839275222246405745257275088548364400416034343698204035624839510366, + 21888242871839275222246405745257275088548364400416034343698204108217879762752, + 21888242871839275222246405745257275088548364400416034343698203680882542310470, + 527659776850540, + 12100671417758, + 21888242871839275222246405745257275088548364400416034343698203915083400502965, + 274933517867469, + 21888242871839275222246405745257275088548364400416034343698203625972035761973, + 495506428868860, + 39362679015653, + 21888242871839275222246405745257275088548364400416034343698203759969546221984, + 278935631286198, + 80276210007489, + 409094310155016, + 21888242871839275222246405745257275088548364400416034343698203881846949512150, + 39060025111508, + 21888242871839275222246405745257275088548364400416034343698203730185335386058, + 479226165638760, + 169999398167481, + 21888242871839275222246405745257275088548364400416034343698204052496443544836, + 21888242871839275222246405745257275088548364400416034343698203861301106927871, + 534633251109313, + 21888242871839275222246405745257275088548364400416034343698203918713349441975, + 372021172214899, + 21888242871839275222246405745257275088548364400416034343698203981219700808529, + 174791209989707, + 349952562116643, + 516135578371019, + 495834318591222, + 66142404316757, + 21888242871839275222246405745257275088548364400416034343698204157271462200139, + 377353963796314, + 21888242871839275222246405745257275088548364400416034343698204174006022420759, + 21888242871839275222246405745257275088548364400416034343698203640111305181383, + 314173348679894, + 202226271459630, + 285999521818029, + 560030231464798, + 61487916199397, + 21888242871839275222246405745257275088548364400416034343698204168947174006792, + 147339342364153, + 251627114026225, + 21888242871839275222246405745257275088548364400416034343698203923817536645456, + 21888242871839275222246405745257275088548364400416034343698204050798966072312, + 363002518441973, + 21888242871839275222246405745257275088548364400416034343698203754080896265820, + 21888242871839275222246405745257275088548364400416034343698203900560123029946, + 21888242871839275222246405745257275088548364400416034343698204170829152906380, + 110989756664669, + 21888242871839275222246405745257275088548364400416034343698203815564101934225, + 252029502848143, + 372500451215543, + 513522932547573, + 331311198807761, + 458334907028381, + 33878237723301, + 21888242871839275222246405745257275088548364400416034343698204044680929072637, + 392277391539886, + 21888242871839275222246405745257275088548364400416034343698203688687198702831, + 21888242871839275222246405745257275088548364400416034343698204148897751807607, + 266183034306621, + 21888242871839275222246405745257275088548364400416034343698204180344899198955, + 21888242871839275222246405745257275088548364400416034343698203849888656912435, + 180534511065569, + 80832805849928, + 21888242871839275222246405745257275088548364400416034343698203794094195834559, + 21888242871839275222246405745257275088548364400416034343698204155082381958789, + 21888242871839275222246405745257275088548364400416034343698204084039010262405, + 21888242871839275222246405745257275088548364400416034343698203747265414419041, + 21888242871839275222246405745257275088548364400416034343698203946590359754581, + 21888242871839275222246405745257275088548364400416034343698203990529997494571, + 21888242871839275222246405745257275088548364400416034343698204085784171591495, + 21888242871839275222246405745257275088548364400416034343698203955919839076124, + 202346225638836, + 325013936523627, + 23599206207417, + 21888242871839275222246405745257275088548364400416034343698203892083538392847, + 442906545205081, + 21888242871839275222246405745257275088548364400416034343698204180507209161199, + 21888242871839275222246405745257275088548364400416034343698204180639530391579, + 21888242871839275222246405745257275088548364400416034343698203953190939677136, + 558138195820957, + 21888242871839275222246405745257275088548364400416034343698203634714239928679, + 21888242871839275222246405745257275088548364400416034343698203744316018193031, + 46701858947596, + 459743147810499, + 21888242871839275222246405745257275088548364400416034343698203731274433805832, + 21888242871839275222246405745257275088548364400416034343698204050028302491581, + 134083175564124, + 21888242871839275222246405745257275088548364400416034343698204016197005233093, + 21888242871839275222246405745257275088548364400416034343698204166639437514046, + 495084709351620, + 21888242871839275222246405745257275088548364400416034343698203721272329006011, + 208661502514981, + 21888242871839275222246405745257275088548364400416034343698203929267181484362, + 21888242871839275222246405745257275088548364400416034343698204008221796536184, + 317427715862423, + 21888242871839275222246405745257275088548364400416034343698203897271491662488, + 21888242871839275222246405745257275088548364400416034343698204006062232104717, + 21888242871839275222246405745257275088548364400416034343698203771212963773014, + 21888242871839275222246405745257275088548364400416034343698203898074323447127, + 21888242871839275222246405745257275088548364400416034343698203659235337639345, + 21888242871839275222246405745257275088548364400416034343698203639813654282605, + 21888242871839275222246405745257275088548364400416034343698204128893849646941, + 21888242871839275222246405745257275088548364400416034343698204175831241749449, + 450593589941956, + 21888242871839275222246405745257275088548364400416034343698203938819433845399, + 21888242871839275222246405745257275088548364400416034343698204153780670289079, + 21888242871839275222246405745257275088548364400416034343698203764813597153283, + 463245614957273, + 360777847028533, + 348744322953374, + 21888242871839275222246405745257275088548364400416034343698203902524358319721, + 183930666375247, + 21888242871839275222246405745257275088548364400416034343698204123685437292854, + 277908811730798, + 306517779901674, + 188782820854000, + 21888242871839275222246405745257275088548364400416034343698204154061857401739, + 77089772633049, + 21888242871839275222246405745257275088548364400416034343698203723598390067140, + 385719050658367, + 21888242871839275222246405745257275088548364400416034343698204129260041208232, + 70360509392537, + 88462259042436, + 21888242871839275222246405745257275088548364400416034343698204055142405075564, + 21888242871839275222246405745257275088548364400416034343698204091831245745160, + 21888242871839275222246405745257275088548364400416034343698204007852547891575, + 432935597677560, + 329425890023254, + 21888242871839275222246405745257275088548364400416034343698204064419053785728, + 509940244831999, + 21888242871839275222246405745257275088548364400416034343698204056480517947571, + 245506688320358, + 343475203372925, + 21888242871839275222246405745257275088548364400416034343698204064276311008640, + 21888242871839275222246405745257275088548364400416034343698203907968786443194, + 21888242871839275222246405745257275088548364400416034343698203710325992062552, + 526313698155612, + 333440570278359, + 282628116363407, + 183098527234502, + 383749769171010, + 165222053931305, + 21888242871839275222246405745257275088548364400416034343698203864411139646589, + 21888242871839275222246405745257275088548364400416034343698204114392830227722, + 21888242871839275222246405745257275088548364400416034343698203696232727317300, + 73551900017197, + 21888242871839275222246405745257275088548364400416034343698204135221394442227, + 275779477735364, + 21888242871839275222246405745257275088548364400416034343698204047005080083231, + 21888242871839275222246405745257275088548364400416034343698203969722548733497, + 462927097975309, + 409847827993257, + 298985935343557, + 21888242871839275222246405745257275088548364400416034343698204165163459004620, + 21888242871839275222246405745257275088548364400416034343698203709318518012104, + 21888242871839275222246405745257275088548364400416034343698203934327185035512, + 21888242871839275222246405745257275088548364400416034343698204139070586050148, + 161261743876013, + 21888242871839275222246405745257275088548364400416034343698203723309793957348, + 21888242871839275222246405745257275088548364400416034343698204072218904009638, + 21888242871839275222246405745257275088548364400416034343698203879956092936814, + 21888242871839275222246405745257275088548364400416034343698203945640266890113, + 473513736861115, + 12228536474682, + 21888242871839275222246405745257275088548364400416034343698203992823914065059, + 21888242871839275222246405745257275088548364400416034343698204088198824728460, + 218797478504657, + 21888242871839275222246405745257275088548364400416034343698204160836736273946, + 21888242871839275222246405745257275088548364400416034343698203700360944999065, + 21888242871839275222246405745257275088548364400416034343698204168908716564354, + 21888242871839275222246405745257275088548364400416034343698203798810848588627, + 287851214181642, + 204509449025491, + 95210848435094, + 240121186873302, + 161064297343925, + 459768892626906, + 537686090578914, + 21888242871839275222246405745257275088548364400416034343698204020684466887883, + 21888242871839275222246405745257275088548364400416034343698204057787871551916, + 495618828497630, + 21888242871839275222246405745257275088548364400416034343698203753360937526300, + 21888242871839275222246405745257275088548364400416034343698203982496265340282, + 286772320066983, + 6992717227022, + 21888242871839275222246405745257275088548364400416034343698203697852782263189, + 21888242871839275222246405745257275088548364400416034343698203902612522215028, + 185328047234842, + 21888242871839275222246405745257275088548364400416034343698203717479922481131, + 287239750447518, + 21888242871839275222246405745257275088548364400416034343698203679151825733520, + 348078474667964, + 21888242871839275222246405745257275088548364400416034343698204156236889658977, + 8059482479224, + 21888242871839275222246405745257275088548364400416034343698203801539961128484, + 327165569387901, + 21888242871839275222246405745257275088548364400416034343698204086247073241391, + 21888242871839275222246405745257275088548364400416034343698204047870302211232, + 82095030312308, + 21888242871839275222246405745257275088548364400416034343698203625893163601299, + 532653764751721, + 145843127266448, + 21888242871839275222246405745257275088548364400416034343698204119089341920744, + 25511141673215, + 21888242871839275222246405745257275088548364400416034343698203835041919141288, + 21888242871839275222246405745257275088548364400416034343698203990448577608182, + 276077211565199, + 319486889840317, + 21888242871839275222246405745257275088548364400416034343698203984579744961426, + 21888242871839275222246405745257275088548364400416034343698203726141453459521, + 505961102697362, + 21888242871839275222246405745257275088548364400416034343698203911593686518570, + 21888242871839275222246405745257275088548364400416034343698203990218974134895, + 21888242871839275222246405745257275088548364400416034343698203867645706411118, + 21888242871839275222246405745257275088548364400416034343698204027520903408081, + 444071447665539, + 21888242871839275222246405745257275088548364400416034343698203772131741490112, + 21888242871839275222246405745257275088548364400416034343698203851787299387441, + 21888242871839275222246405745257275088548364400416034343698204101795230916850, + 262416638947213, + 21888242871839275222246405745257275088548364400416034343698203639853214631567, + 34998899615665, + 21888242871839275222246405745257275088548364400416034343698204055627114536133, + 21888242871839275222246405745257275088548364400416034343698204106808825856960, + 21888242871839275222246405745257275088548364400416034343698203982894730024543, + 21888242871839275222246405745257275088548364400416034343698203726268666707812, + 21888242871839275222246405745257275088548364400416034343698203952147303335421, + 21888242871839275222246405745257275088548364400416034343698203944683687238245, + 21888242871839275222246405745257275088548364400416034343698204048908971735776, + 21888242871839275222246405745257275088548364400416034343698203781154234377929, + 21888242871839275222246405745257275088548364400416034343698204186376712574883, + 21888242871839275222246405745257275088548364400416034343698203929474103550005, + 425478578208997, + 560715475456312, + 549310103520592, + 21888242871839275222246405745257275088548364400416034343698204097111023319114, + 21888242871839275222246405745257275088548364400416034343698204018906144259595, + 21888242871839275222246405745257275088548364400416034343698204142769218801309, + 21888242871839275222246405745257275088548364400416034343698203730702886820467, + 21888242871839275222246405745257275088548364400416034343698204186509340130329, + 521940247624065, + 21888242871839275222246405745257275088548364400416034343698204025382854426865, + 194665250911576, + 21888242871839275222246405745257275088548364400416034343698204128745092135982, + 395724344851708, + 12102954124571, + 21888242871839275222246405745257275088548364400416034343698203783651391498199, + 21888242871839275222246405745257275088548364400416034343698203704911186250502, + 234187331665761, + 320107703202898, + 286153623115876, + 21888242871839275222246405745257275088548364400416034343698203752125801307804, + 21888242871839275222246405745257275088548364400416034343698203873856012920670, + 167194503811147, + 21888242871839275222246405745257275088548364400416034343698203758417229743863, + 62350708297068, + 149830442213920, + 21888242871839275222246405745257275088548364400416034343698203663429802301519, + 21888242871839275222246405745257275088548364400416034343698203918504746396950, + 384393209049909, + 21888242871839275222246405745257275088548364400416034343698203768581049794070, + 21888242871839275222246405745257275088548364400416034343698203800783131840448, + 425920994594113, + 57148448546806, + 21888242871839275222246405745257275088548364400416034343698203696139259444574, + 106132668272082, + 21888242871839275222246405745257275088548364400416034343698203669016741256408, + 21888242871839275222246405745257275088548364400416034343698204011049100084142, + 118528184112691, + 21888242871839275222246405745257275088548364400416034343698203625138623486213, + 41266488533923, + 21888242871839275222246405745257275088548364400416034343698203912071642156709, + 21888242871839275222246405745257275088548364400416034343698203766879120608896, + 21888242871839275222246405745257275088548364400416034343698204125318129596019, + 21888242871839275222246405745257275088548364400416034343698203989208871441972, + 21888242871839275222246405745257275088548364400416034343698203760509442864071, + 460097263443870, + 276451196745143, + 21888242871839275222246405745257275088548364400416034343698203998357550327143, + 21888242871839275222246405745257275088548364400416034343698204180635505324968, + 295878706329750, + 21888242871839275222246405745257275088548364400416034343698203712430453004159, + 317977274995785, + 21888242871839275222246405745257275088548364400416034343698203687086449898761, + 67464992430166, + 95100214014349, + 471663703582173, + 21888242871839275222246405745257275088548364400416034343698204120594725220538, + 21888242871839275222246405745257275088548364400416034343698203839763385267309, + 53030396502022, + 420109754170786, + 12088196042455, + 80980142499981, + 429445504448675, + 269595235596689, + 21888242871839275222246405745257275088548364400416034343698203879670506279260, + 290059068591849, + 11160580259780, + 21888242871839275222246405745257275088548364400416034343698203638072405879101, + 21888242871839275222246405745257275088548364400416034343698203815226887963655, + 307227924080034, + 21888242871839275222246405745257275088548364400416034343698203838337944116711, + 498003064045112, + 21888242871839275222246405745257275088548364400416034343698204069762825857917, + 253341897790827, + 1686477100299, + 215046021606197, + 21888242871839275222246405745257275088548364400416034343698203844513912086075, + 398603461291316, + 21888242871839275222246405745257275088548364400416034343698203712976871511909, + 21888242871839275222246405745257275088548364400416034343698204114215113183614, + 348483798922088, + 284403754541808, + 257620692034359, + 21888242871839275222246405745257275088548364400416034343698203763734826339600, + 21888242871839275222246405745257275088548364400416034343698203723758273914532, + 21888242871839275222246405745257275088548364400416034343698203638226047025653, + 364355083848233, + 21888242871839275222246405745257275088548364400416034343698204040307376160983, + 21888242871839275222246405745257275088548364400416034343698204013916894539196, + 21888242871839275222246405745257275088548364400416034343698203698940036004271, + 439525921435749, + 449142112912296, + 107565230543271, + 21888242871839275222246405745257275088548364400416034343698203817700572013371, + 362599687891210, + 21888242871839275222246405745257275088548364400416034343698203878490117055240, + 424313279381624, + 21888242871839275222246405745257275088548364400416034343698203868905177740024, + 21888242871839275222246405745257275088548364400416034343698203851285128372274, + 21888242871839275222246405745257275088548364400416034343698204022037877884028, + 21888242871839275222246405745257275088548364400416034343698203694801366617701, + 428767034725084, + 405537948571234, + 190521795154413, + 176240129741585, + 21888242871839275222246405745257275088548364400416034343698204093461396199765, + 536253217693918, + 21888242871839275222246405745257275088548364400416034343698203829209013565082, + 21888242871839275222246405745257275088548364400416034343698203815157527256944, + 537842716279163, + 21888242871839275222246405745257275088548364400416034343698203720038266982273, + 490248104788162, + 120518685317050, + 466001017352444, + 340533982118853, + 21888242871839275222246405745257275088548364400416034343698203964923695059328, + 21888242871839275222246405745257275088548364400416034343698203894942742400202, + 439878729878998, + 94454313454173, + 21888242871839275222246405745257275088548364400416034343698203760872758382463, + 98216020700474, + 21888242871839275222246405745257275088548364400416034343698203893441054479268, + 21888242871839275222246405745257275088548364400416034343698203889420443068740, + 21888242871839275222246405745257275088548364400416034343698204088677500821744, + 21888242871839275222246405745257275088548364400416034343698203743977001384672, + 69008678045306, + 457161841937562, + 21888242871839275222246405745257275088548364400416034343698204159460094905584, + 154928290171504, + 125875920724107, + 21888242871839275222246405745257275088548364400416034343698204154553877029190, + 21888242871839275222246405745257275088548364400416034343698203651316571639199, + 21888242871839275222246405745257275088548364400416034343698204038950504689003, + 214535367390719, + 21888242871839275222246405745257275088548364400416034343698203931584338609560, + 80702958200888, + 386086131114084, + 57902333109342, + 467033075733501, + 355487539318709, + 523183959176441, + 165867106354711, + 252466316509084, + 163666404291773, + 202420036209180, + 21888242871839275222246405745257275088548364400416034343698204087228435612013, + 132534182495004, + 21888242871839275222246405745257275088548364400416034343698204101312041822368, + 419864775285285, + 21888242871839275222246405745257275088548364400416034343698203915331543226912, + 21888242871839275222246405745257275088548364400416034343698203989925874133806, + 21888242871839275222246405745257275088548364400416034343698203935056449928296, + 524549838625995, + 208227342269696, + 21888242871839275222246405745257275088548364400416034343698203947012957985796, + 21888242871839275222246405745257275088548364400416034343698203842009528168560, + 86594831149391, + 21888242871839275222246405745257275088548364400416034343698203901142667724859, + 21888242871839275222246405745257275088548364400416034343698204055100367125604, + 21888242871839275222246405745257275088548364400416034343698203781461803788146, + 21888242871839275222246405745257275088548364400416034343698203653407023172226, + 21888242871839275222246405745257275088548364400416034343698203985327297359903, + 158131834092561, + 462613196651256, + 21888242871839275222246405745257275088548364400416034343698203697755509071931, + 280748830877501, + 21888242871839275222246405745257275088548364400416034343698203880541967621582, + 302048957529097, + 177716250698972, + 73860540761684, + 468535813766049, + 103657467456575, + 21888242871839275222246405745257275088548364400416034343698204017118351578508, + 21888242871839275222246405745257275088548364400416034343698203847871091942059, + 21888242871839275222246405745257275088548364400416034343698203834331953584237, + 21888242871839275222246405745257275088548364400416034343698203872929956865562, + 312306394518943, + 21888242871839275222246405745257275088548364400416034343698203970617064627669, + 310529686596394, + 516654905690442, + 179341253273556, + 21888242871839275222246405745257275088548364400416034343698204124225791988455, + 21888242871839275222246405745257275088548364400416034343698204120770710057837, + 21888242871839275222246405745257275088548364400416034343698204120097638839747, + 21888242871839275222246405745257275088548364400416034343698203666219861245753, + 21888242871839275222246405745257275088548364400416034343698204127974925604639, + 21888242871839275222246405745257275088548364400416034343698203886155291409853, + 471262420473240, + 21888242871839275222246405745257275088548364400416034343698203680268551935715, + 500361870971596, + 18818506355129, + 72421944975531, + 21888242871839275222246405745257275088548364400416034343698203954288585707882, + 21888242871839275222246405745257275088548364400416034343698204014427309091590, + 21888242871839275222246405745257275088548364400416034343698203716625769014627, + 203983276202404, + 21888242871839275222246405745257275088548364400416034343698203779713972635104, + 462664686481128, + 317014566004857, + 140150586281532, + 562707501989494, + 500074552861721, + 285064106879682, + 21888242871839275222246405745257275088548364400416034343698203640474158289891, + 471970608769001, + 21888242871839275222246405745257275088548364400416034343698203970966976135606, + 21888242871839275222246405745257275088548364400416034343698203845101960490709, + 365276888918496, + 21888242871839275222246405745257275088548364400416034343698203734199909075885, + 21888242871839275222246405745257275088548364400416034343698204026186234013831, + 255851948051039, + 499504703101032, + 21888242871839275222246405745257275088548364400416034343698203700958169527996, + 21888242871839275222246405745257275088548364400416034343698204107773270893209, + 518854629865327, + 21888242871839275222246405745257275088548364400416034343698204172730869077726, + 21888242871839275222246405745257275088548364400416034343698203693591521130917, + 24461024015315, + 21888242871839275222246405745257275088548364400416034343698203665253672500857, + 364159619083719, + 21888242871839275222246405745257275088548364400416034343698203754014814977157, + 157362707650782, + 17657962633581, + 21888242871839275222246405745257275088548364400416034343698203682835816488150, + 177308508480148, + 21888242871839275222246405745257275088548364400416034343698203706653556020117, + 49965452344283, + 21888242871839275222246405745257275088548364400416034343698203689946312962914, + 21888242871839275222246405745257275088548364400416034343698204020947010871309, + 176949885197312, + 39892626805134, + 131534841213624, + 286592655853903, + 21888242871839275222246405745257275088548364400416034343698204153780704503313, + 71258865024383, + 21888242871839275222246405745257275088548364400416034343698203784416893870538, + 48627511073525, + 432362804753588, + 21888242871839275222246405745257275088548364400416034343698204163571669750847, + 21888242871839275222246405745257275088548364400416034343698204123945539724262, + 111064212285590, + 21888242871839275222246405745257275088548364400416034343698203944879595548498, + 210681460951077, + 513569473443268, + 300453096992762, + 21888242871839275222246405745257275088548364400416034343698203665951817012009, + 224176112030105, + 21888242871839275222246405745257275088548364400416034343698203765725439309108, + 119746786372698, + 246206680653079, + 21888242871839275222246405745257275088548364400416034343698203775752437294509, + 101725214327116, + 166045150861125, + 482761158704915, + 21888242871839275222246405745257275088548364400416034343698203753258579273676, + 224748568457825, + 21888242871839275222246405745257275088548364400416034343698203797496318668150, + 482777940728891, + 519476269025038, + 511195333940504, + 21888242871839275222246405745257275088548364400416034343698203702170930013466, + 21888242871839275222246405745257275088548364400416034343698203767581255710253, + 21888242871839275222246405745257275088548364400416034343698203662005613925897, + 21888242871839275222246405745257275088548364400416034343698203753034187756247, + 21888242871839275222246405745257275088548364400416034343698203845784327507910, + 21888242871839275222246405745257275088548364400416034343698203837743022682981, + 157790700686284, + 418621446439417, + 21888242871839275222246405745257275088548364400416034343698203765920577804498, + 21888242871839275222246405745257275088548364400416034343698204077418672172413, + 21888242871839275222246405745257275088548364400416034343698204077757550818378, + 409248080764941, + 21888242871839275222246405745257275088548364400416034343698203881167923881047, + 21888242871839275222246405745257275088548364400416034343698204174977293103983, + 551029412028674, + 236019044757822, + 21888242871839275222246405745257275088548364400416034343698203752066927363439, + 40111399119535, + 21888242871839275222246405745257275088548364400416034343698203865348438951446, + 481388963525691, + 21888242871839275222246405745257275088548364400416034343698203630700875548844, + 64657637168133, + 21888242871839275222246405745257275088548364400416034343698204125632998348749, + 21888242871839275222246405745257275088548364400416034343698204133250535442127, + 220048404772884, + 21888242871839275222246405745257275088548364400416034343698203774044234126004, + 205776169825453, + 21888242871839275222246405745257275088548364400416034343698203700751472477138, + 21888242871839275222246405745257275088548364400416034343698204114393538806088, + 75720909272609, + 21888242871839275222246405745257275088548364400416034343698204122648621675485, + 21888242871839275222246405745257275088548364400416034343698203863961685324401, + 21888242871839275222246405745257275088548364400416034343698204094868029598784, + 411201581252262, + 443375784496427, + 160337093310323, + 47542393497485, + 549723830696735, + 21888242871839275222246405745257275088548364400416034343698203683636644236867, + 393613473070185, + 21888242871839275222246405745257275088548364400416034343698203795462816546017, + 370761153143509, + 135100101241638, + 242067802258131, + 21888242871839275222246405745257275088548364400416034343698203738569353707850, + 370329339646907, + 317115685374468, + 21888242871839275222246405745257275088548364400416034343698203941022486167203, + 21888242871839275222246405745257275088548364400416034343698203650927068657475, + 69432671851558, + 21888242871839275222246405745257275088548364400416034343698204082078574166308, + 21888242871839275222246405745257275088548364400416034343698203944838763920426, + 47903499564654, + 21888242871839275222246405745257275088548364400416034343698203830730364591204, + 123357970723706, + 21888242871839275222246405745257275088548364400416034343698203897469539018929, + 293895205115946, + 492307054904747, + 435076823843559, + 21888242871839275222246405745257275088548364400416034343698203859776878371561, + 316054120187401, + 317081835929253, + 21888242871839275222246405745257275088548364400416034343698203865347933589052, + 355681849318621, + 386187463415802, + 67290607260790, + 242318315456799, + 21888242871839275222246405745257275088548364400416034343698204025977557535723, + 245459521523554, + 21888242871839275222246405745257275088548364400416034343698204182036756530939, + 21888242871839275222246405745257275088548364400416034343698204167524048071424, + 364919328840058, + 172967626675582, + 21888242871839275222246405745257275088548364400416034343698203736904626540828, + 21888242871839275222246405745257275088548364400416034343698204173372065977483, + 21888242871839275222246405745257275088548364400416034343698203950535224295331, + 493175938110793, + 21888242871839275222246405745257275088548364400416034343698203730607342771715, + 21888242871839275222246405745257275088548364400416034343698203836852098009197, + 21888242871839275222246405745257275088548364400416034343698203970893647615605, + 490986721280461, + 449833395469838, + 380489779638573, + 263968758045780, + 220369126308680, + 284805557818317, + 21888242871839275222246405745257275088548364400416034343698204137550863438220, + 222057186772084, + 21888242871839275222246405745257275088548364400416034343698203667118272879037, + 21888242871839275222246405745257275088548364400416034343698204077758948242348, + 21888242871839275222246405745257275088548364400416034343698203775442695031182, + 356236797006287, + 21888242871839275222246405745257275088548364400416034343698204140778929960634, + 21888242871839275222246405745257275088548364400416034343698204148922432069197, + 21888242871839275222246405745257275088548364400416034343698204133939404530088, + 21888242871839275222246405745257275088548364400416034343698203921820075746414, + 21888242871839275222246405745257275088548364400416034343698203657236913138632, + 133602072235515, + 423616560720622, + 329718973929443, + 21888242871839275222246405745257275088548364400416034343698203656169562380781, + 524897769386395, + 118033237273894, + 21888242871839275222246405745257275088548364400416034343698203870263305254905, + 236166415525856, + 291814336039576, + 343375027963725, + 21888242871839275222246405745257275088548364400416034343698203670373179782949, + 21888242871839275222246405745257275088548364400416034343698203956233528205079, + 21888242871839275222246405745257275088548364400416034343698204148532966627811, + 49752025236450, + 7546704876929, + 21888242871839275222246405745257275088548364400416034343698203964714951955287, + 21888242871839275222246405745257275088548364400416034343698203651982067388443, + 317054422148228, + 330961285788184, + 190955944852091, + 50858504887989, + 21888242871839275222246405745257275088548364400416034343698204122112862445539, + 21888242871839275222246405745257275088548364400416034343698204094867309239850, + 14407905276932, + 21888242871839275222246405745257275088548364400416034343698203876860306420963, + 21888242871839275222246405745257275088548364400416034343698203804694994788098, + 375385526896536, + 22735421617720, + 309735701956974, + 21888242871839275222246405745257275088548364400416034343698204130386134147027, + 124414417646016, + 21888242871839275222246405745257275088548364400416034343698203868676852736696, + 21888242871839275222246405745257275088548364400416034343698203822291160072225, + 21888242871839275222246405745257275088548364400416034343698203973381568372944, + 120284401212045, + 30726348238733, + 21888242871839275222246405745257275088548364400416034343698203664854423920003, + 21888242871839275222246405745257275088548364400416034343698203844929143761111, + 271728035868749, + 128201408450721, + 211418023304995, + 270250966969195, + 111843372051008, + 45255676375278, + 21888242871839275222246405745257275088548364400416034343698203671724246528189, + 516611088936636, + 365572185076725, + 21888242871839275222246405745257275088548364400416034343698203982170176135667, + 21888242871839275222246405745257275088548364400416034343698203822450788888183, + 21888242871839275222246405745257275088548364400416034343698204074793482524261, + 21888242871839275222246405745257275088548364400416034343698203675933709579558, + 523861509510728, + 21888242871839275222246405745257275088548364400416034343698204180193837023099, + 21888242871839275222246405745257275088548364400416034343698204144823722291727, + 359031888904478, + 21888242871839275222246405745257275088548364400416034343698203916114158964693, + 229508705621871, + 309915509297241, + 472530130985334, + 289369887323472, + 21888242871839275222246405745257275088548364400416034343698203661499152247410, + 21888242871839275222246405745257275088548364400416034343698203783705772332217, + 21888242871839275222246405745257275088548364400416034343698203833723887163554, + 21888242871839275222246405745257275088548364400416034343698204135149153330121, + 21888242871839275222246405745257275088548364400416034343698203928462446034595, + 389644539911710, + 21888242871839275222246405745257275088548364400416034343698203638381394307911, + 21888242871839275222246405745257275088548364400416034343698204078607370812381, + 21888242871839275222246405745257275088548364400416034343698203868195690131121, + 21888242871839275222246405745257275088548364400416034343698204111070726449078, + 21888242871839275222246405745257275088548364400416034343698203954274195124767, + 21888242871839275222246405745257275088548364400416034343698204042578758717988, + 21888242871839275222246405745257275088548364400416034343698203702606636578256, + 553315020057745, + 21888242871839275222246405745257275088548364400416034343698203674061515420585, + 481028426910532, + 21888242871839275222246405745257275088548364400416034343698203675076301026834, + 449172994706187, + 527352845090838, + 490400334609105, + 21888242871839275222246405745257275088548364400416034343698204028025140090762, + 40521798817800, + 76840823081957, + 352362643502319, + 187634995488716, + 100693583454596, + 21888242871839275222246405745257275088548364400416034343698203646887761994739, + 21888242871839275222246405745257275088548364400416034343698203675318946797009, + 87294152480511, + 21888242871839275222246405745257275088548364400416034343698204035096763556492, + 243786574076763, + 110616836996317, + 21888242871839275222246405745257275088548364400416034343698204083708575956339, + 21888242871839275222246405745257275088548364400416034343698204106772347159206, + 21888242871839275222246405745257275088548364400416034343698204066910887571907, + 246676027283715, + 21888242871839275222246405745257275088548364400416034343698203972302704171179, + 118416900542399, + 21888242871839275222246405745257275088548364400416034343698204147811137274438, + 120740913362651, + 414788682616280, + 253079001714321, + 560715068571408, + 21888242871839275222246405745257275088548364400416034343698203696385443043997, + 21888242871839275222246405745257275088548364400416034343698203623904430846975, + 21888242871839275222246405745257275088548364400416034343698204001528386535960, + 142990007971726, + 276383032398910, + 21888242871839275222246405745257275088548364400416034343698204010708693743729, + 21888242871839275222246405745257275088548364400416034343698203842880309314867, + 187982414010977, + 350555350160080, + 117045655281230, + 21888242871839275222246405745257275088548364400416034343698203894964679865153, + 430986571536604, + 21888242871839275222246405745257275088548364400416034343698203981200965470278, + 21888242871839275222246405745257275088548364400416034343698204045381227267149, + 528367525132693, + 5845739956538, + 21888242871839275222246405745257275088548364400416034343698204164081115168266, + 21888242871839275222246405745257275088548364400416034343698204182448997617009, + 21888242871839275222246405745257275088548364400416034343698203667172427268969, + 293948204919995, + 21888242871839275222246405745257275088548364400416034343698203982737089734047, + 21888242871839275222246405745257275088548364400416034343698203651196059125026, + 21888242871839275222246405745257275088548364400416034343698203701711424466445, + 21888242871839275222246405745257275088548364400416034343698203839977610873363, + 21888242871839275222246405745257275088548364400416034343698203821272344441713, + 21888242871839275222246405745257275088548364400416034343698203723537369226061, + 21888242871839275222246405745257275088548364400416034343698204169875616767805, + 121865221911032, + 427434153114407, + 219278175500308, + 21888242871839275222246405745257275088548364400416034343698203996861461754347, + 242836602711582, + 21888242871839275222246405745257275088548364400416034343698203816268457665810, + 21888242871839275222246405745257275088548364400416034343698203970756720373196, + 491125886204718, + 21888242871839275222246405745257275088548364400416034343698203747050671258206, + 168418597382304, + 21888242871839275222246405745257275088548364400416034343698204042707751886601, + 330428821010781, + 21888242871839275222246405745257275088548364400416034343698203715035620677007, + 21888242871839275222246405745257275088548364400416034343698204091197702149905, + 21888242871839275222246405745257275088548364400416034343698204041481179237768, + 2601520752462, + 129824335329616, + 21888242871839275222246405745257275088548364400416034343698203822169819753060, + 21888242871839275222246405745257275088548364400416034343698204045367485145677, + 47769445476101, + 286224674516652, + 243069937452005, + 454745733877372, + 149426039328976, + 370943308939287, + 21888242871839275222246405745257275088548364400416034343698203767014346175193, + 21888242871839275222246405745257275088548364400416034343698204073323825587460, + 253198385871162, + 21888242871839275222246405745257275088548364400416034343698203656118754672234, + 21888242871839275222246405745257275088548364400416034343698204009208419577265, + 21888242871839275222246405745257275088548364400416034343698204035705507732645, + 21888242871839275222246405745257275088548364400416034343698203658148240383393, + 258193560675837, + 110799988506695, + 486789792924201, + 3690790587285, + 313047151750434, + 188698321594463, + 531951870708584, + 236102275094746, + 281140934656986, + 187791019992850, + 21888242871839275222246405745257275088548364400416034343698203973691709902484, + 200392472724712, + 233529297504305, + 21888242871839275222246405745257275088548364400416034343698203768231751265155, + 457651042724793, + 21888242871839275222246405745257275088548364400416034343698203895181562756808, + 21888242871839275222246405745257275088548364400416034343698204046437237018241, + 369500442136889, + 463412240979455, + 30761940091352, + 21888242871839275222246405745257275088548364400416034343698203828004955957359, + 21888242871839275222246405745257275088548364400416034343698203957083741471549, + 21888242871839275222246405745257275088548364400416034343698204115077229608164, + 338724349767836, + 125711987221085, + 21888242871839275222246405745257275088548364400416034343698203979923179551214, + 5897000701987, + 352758615705006, + 290700131215617, + 21888242871839275222246405745257275088548364400416034343698203669996954724866, + 211513139836158, + 452451111858147, + 21888242871839275222246405745257275088548364400416034343698203820650775132133, + 105253960695294, + 21888242871839275222246405745257275088548364400416034343698203785191109523823, + 269614202282615, + 21888242871839275222246405745257275088548364400416034343698204013338849049532, + 21888242871839275222246405745257275088548364400416034343698203848494222598933, + 21888242871839275222246405745257275088548364400416034343698203946736982555755, + 194115570064086, + 21888242871839275222246405745257275088548364400416034343698204046453169895121, + 21888242871839275222246405745257275088548364400416034343698204168912692822892, + 21888242871839275222246405745257275088548364400416034343698203887786298259402, + 527551347380194, + 184086531453124, + 519866380304426, + 21888242871839275222246405745257275088548364400416034343698203693332436547340, + 156228976616563, + 21888242871839275222246405745257275088548364400416034343698203818497741359250, + 297960271457432, + 476330354820091, + 21888242871839275222246405745257275088548364400416034343698204079105261991971, + 21888242871839275222246405745257275088548364400416034343698203973896413521909, + 21888242871839275222246405745257275088548364400416034343698204154864617175434, + 21888242871839275222246405745257275088548364400416034343698203636252602193012, + 414611012245734, + 163950116380883, + 240070170168098, + 21888242871839275222246405745257275088548364400416034343698204132153660769920, + 21888242871839275222246405745257275088548364400416034343698203991207507138689, + 407512639041176, + 21888242871839275222246405745257275088548364400416034343698203901820280183702, + 485346622009667, + 21888242871839275222246405745257275088548364400416034343698203773946015094617, + 21888242871839275222246405745257275088548364400416034343698204154981863580578, + 223314583026989, + 21888242871839275222246405745257275088548364400416034343698203819264079617045, + 461444809500522, + 189249985956066, + 21888242871839275222246405745257275088548364400416034343698203806668616486762, + 417020645429938, + 467862933289803, + 21888242871839275222246405745257275088548364400416034343698203807928421784332, + 21888242871839275222246405745257275088548364400416034343698203890359309239517, + 6908315737907, + 91664734587783, + 529115457479445, + 8256770564132, + 189092521888123, + 455207266177670, + 21888242871839275222246405745257275088548364400416034343698203648340217365221, + 61439763573419, + 21888242871839275222246405745257275088548364400416034343698204039551946710069, + 21888242871839275222246405745257275088548364400416034343698204147700182366809, + 21888242871839275222246405745257275088548364400416034343698204130716894371904, + 445749576809865, + 21888242871839275222246405745257275088548364400416034343698204138946546429510, + 416015737684570, + 304052466415573, + 21888242871839275222246405745257275088548364400416034343698203774446914776515, + 21888242871839275222246405745257275088548364400416034343698203646165516925548, + 360353968325265, + 191800734351365, + 416091017927488, + 417710985345548, + 21888242871839275222246405745257275088548364400416034343698204121997147845237, + 21888242871839275222246405745257275088548364400416034343698204135469204278794, + 333432929454461, + 21888242871839275222246405745257275088548364400416034343698203958312490775360, + 21888242871839275222246405745257275088548364400416034343698204138677188103507, + 171239708989556, + 21888242871839275222246405745257275088548364400416034343698203825477970396984, + 21888242871839275222246405745257275088548364400416034343698203844367862677590, + 437516343967512, + 21888242871839275222246405745257275088548364400416034343698203991869482086833, + 553786624899169, + 23221096006494, + 489578539484224, + 21888242871839275222246405745257275088548364400416034343698203718815913847839, + 21888242871839275222246405745257275088548364400416034343698203791649010634069, + 53604071414195, + 21888242871839275222246405745257275088548364400416034343698203664923000270741, + 21888242871839275222246405745257275088548364400416034343698203944622388629085, + 503594812006728, + 21888242871839275222246405745257275088548364400416034343698204051247514312429, + 21888242871839275222246405745257275088548364400416034343698203945257278247172, + 21888242871839275222246405745257275088548364400416034343698203817701871612431, + 21888242871839275222246405745257275088548364400416034343698203947402757039645, + 21888242871839275222246405745257275088548364400416034343698203791459349749809, + 21888242871839275222246405745257275088548364400416034343698203912507034665280, + 170507981338382, + 21888242871839275222246405745257275088548364400416034343698204126300594107439, + 21888242871839275222246405745257275088548364400416034343698203897647732817661, + 21888242871839275222246405745257275088548364400416034343698204036355622333444, + 118647357005579, + 178304299746074, + 21888242871839275222246405745257275088548364400416034343698203688802507307443, + 68616238670824, + 21888242871839275222246405745257275088548364400416034343698204142442411595178, + 170367642983197, + 21888242871839275222246405745257275088548364400416034343698203937693630728671, + 473981456603877, + 21888242871839275222246405745257275088548364400416034343698203692898140787497, + 21888242871839275222246405745257275088548364400416034343698203791398871221091, + 67019244403644, + 367274637499994, + 300330541109781, + 345923690610317, + 251841148665157, + 21888242871839275222246405745257275088548364400416034343698203786398467168252, + 21888242871839275222246405745257275088548364400416034343698203949934566518823, + 21888242871839275222246405745257275088548364400416034343698204068028557949103, + 222179055489475, + 531205475357198, + 14330054351477, + 21888242871839275222246405745257275088548364400416034343698203878540636105963, + 21888242871839275222246405745257275088548364400416034343698203860843669037477, + 21888242871839275222246405745257275088548364400416034343698203761978089722035, + 21888242871839275222246405745257275088548364400416034343698204016984851078896, + 21888242871839275222246405745257275088548364400416034343698204045348100072971, + 21888242871839275222246405745257275088548364400416034343698204168356594382494, + 549084587676381, + 21888242871839275222246405745257275088548364400416034343698204149856240073314, + 21888242871839275222246405745257275088548364400416034343698203817026918487421, + 21888242871839275222246405745257275088548364400416034343698203637667722349874, + 21888242871839275222246405745257275088548364400416034343698203982278818248866, + 105730019349195, + 21888242871839275222246405745257275088548364400416034343698204012875585479153, + 21888242871839275222246405745257275088548364400416034343698204076958947745409, + 21888242871839275222246405745257275088548364400416034343698204099575131670552, + 21888242871839275222246405745257275088548364400416034343698203788468556489349, + 156847010303182, + 393645508809177, + 310849788398725, + 450144948630406, + 21888242871839275222246405745257275088548364400416034343698203861332482101586, + 287871309929058, + 208403104310486, + 69916386461687, + 121695064330704, + 233186087288397, + 561665299631257, + 115511572697503, + 21888242871839275222246405745257275088548364400416034343698203764406875350109, + 21888242871839275222246405745257275088548364400416034343698204180920361732300, + 21888242871839275222246405745257275088548364400416034343698203986515255850199, + 21888242871839275222246405745257275088548364400416034343698203930335773426283, + 21888242871839275222246405745257275088548364400416034343698204004350427479574, + 21888242871839275222246405745257275088548364400416034343698203944855499943170, + 326865100637610, + 250852081209373, + 289857813423990, + 282818107661981, + 21888242871839275222246405745257275088548364400416034343698204068918587095762, + 228719381540669, + 21888242871839275222246405745257275088548364400416034343698203861851490908265, + 21888242871839275222246405745257275088548364400416034343698203867055692968104, + 21888242871839275222246405745257275088548364400416034343698204032707323764221, + 21888242871839275222246405745257275088548364400416034343698204183786648648038, + 87192007241706, + 21888242871839275222246405745257275088548364400416034343698203689048858276130, + 316093799532844, + 442896045736684, + 21888242871839275222246405745257275088548364400416034343698203671551882959580, + 21888242871839275222246405745257275088548364400416034343698203818907870448878, + 46593111176782, + 21888242871839275222246405745257275088548364400416034343698204122186493331381, + 21888242871839275222246405745257275088548364400416034343698204044489161469675, + 197459419722939, + 258836200157817, + 329909604202046, + 21888242871839275222246405745257275088548364400416034343698203984409953193908, + 21888242871839275222246405745257275088548364400416034343698203831453835827120, + 121492335045762, + 21888242871839275222246405745257275088548364400416034343698203723206951849335, + 159765600508218, + 21888242871839275222246405745257275088548364400416034343698203745613224248618, + 21888242871839275222246405745257275088548364400416034343698203652863298755122, + 342222916371467, + 21888242871839275222246405745257275088548364400416034343698204099645339051757, + 111668327345785, + 21888242871839275222246405745257275088548364400416034343698203809584503442858, + 426589444734016, + 201348963503783, + 21888242871839275222246405745257275088548364400416034343698204143085954404252, + 105321711291960, + 21888242871839275222246405745257275088548364400416034343698204146677901060396, + 256335528640610, + 21888242871839275222246405745257275088548364400416034343698203895032860289587, + 376879811489780, + 481565227283600, + 21888242871839275222246405745257275088548364400416034343698204155323847469470, + 315002638748197, + 524403029035795, + 364638764404049, + 21888242871839275222246405745257275088548364400416034343698204023547944544036, + 21888242871839275222246405745257275088548364400416034343698203861264125413650, + 75869092539489, + 449874618666584, + 21888242871839275222246405745257275088548364400416034343698203702860456006748, + 21888242871839275222246405745257275088548364400416034343698204057000996887852, + 21888242871839275222246405745257275088548364400416034343698203804244361380595, + 28685604087046, + 25094843943128, + 510071937103328, + 21888242871839275222246405745257275088548364400416034343698203748182912923304, + 21888242871839275222246405745257275088548364400416034343698203787834601991325, + 266041669248201, + 46032961829586, + 113048123490023, + 21888242871839275222246405745257275088548364400416034343698204112781598422731, + 21888242871839275222246405745257275088548364400416034343698204164317860652756, + 21888242871839275222246405745257275088548364400416034343698203984890412734136, + 21888242871839275222246405745257275088548364400416034343698204084493091303599, + 241912597574420, + 353565100568927, + 325721494931735, + 21888242871839275222246405745257275088548364400416034343698203882333952114516, + 21888242871839275222246405745257275088548364400416034343698204075198626168528, + 438481343679480, + 397589722695340, + 21888242871839275222246405745257275088548364400416034343698203642725831664973, + 56248273321384, + 275703973499216, + 174834271686789, + 21888242871839275222246405745257275088548364400416034343698203736630392696922, + 21888242871839275222246405745257275088548364400416034343698203949726056212758, + 43154446851921, + 21888242871839275222246405745257275088548364400416034343698203954300764895377, + 124315707668396, + 345757120225079, + 162532305370242, + 80526265748427, + 248112524193748, + 512830538962130, + 260069784653279, + 133721333259258, + 561089926308108, + 21888242871839275222246405745257275088548364400416034343698203799439995216417, + 172669060889507, + 21888242871839275222246405745257275088548364400416034343698203722346823943575, + 26827553000510, + 21888242871839275222246405745257275088548364400416034343698203827537477210584, + 21888242871839275222246405745257275088548364400416034343698203777731663277131, + 21888242871839275222246405745257275088548364400416034343698204006261776740205, + 341367657471899, + 21888242871839275222246405745257275088548364400416034343698203662492187568406, + 98380302650168, + 277293594983871, + 200666524417772, + 660736971564, + 256721942590105, + 562143141786815, + 21888242871839275222246405745257275088548364400416034343698203972152670529515, + 422303697915299, + 21888242871839275222246405745257275088548364400416034343698203630183689136717, + 21888242871839275222246405745257275088548364400416034343698203981249646092763, + 21888242871839275222246405745257275088548364400416034343698203798944370463738, + 21888242871839275222246405745257275088548364400416034343698204162112895357774, + 228246821138386, + 199219883725991, + 136223560280609, + 21888242871839275222246405745257275088548364400416034343698203703575716073811, + 21888242871839275222246405745257275088548364400416034343698203834007146058646, + 346725797810171, + 46086945903092, + 166597252729302, + 364553994750896, + 15324659499521, + 94454967874993, + 487078605307909, + 21888242871839275222246405745257275088548364400416034343698204162447195465748, + 21888242871839275222246405745257275088548364400416034343698203978297451296281, + 59324238073179, + 21888242871839275222246405745257275088548364400416034343698203849564597909732, + 21888242871839275222246405745257275088548364400416034343698204111391608793818, + 21888242871839275222246405745257275088548364400416034343698203655692943103954, + 258920974511299, + 389646552782558, + 21888242871839275222246405745257275088548364400416034343698204005182389256207, + 21888242871839275222246405745257275088548364400416034343698203909041919636851, + 21888242871839275222246405745257275088548364400416034343698203898934696215895, + 105416803178842, + 134840486821502, + 21888242871839275222246405745257275088548364400416034343698204115752928053554, + 61722737591201, + 21888242871839275222246405745257275088548364400416034343698203789306541625766, + 346415346497704, + 21888242871839275222246405745257275088548364400416034343698203878719455854492, + 385768149523296, + 287488549030732, + 324002909248188, + 298835356925958, + 21888242871839275222246405745257275088548364400416034343698204135556200021114, + 21888242871839275222246405745257275088548364400416034343698203745828387895825, + 21888242871839275222246405745257275088548364400416034343698203726175345923295, + 21888242871839275222246405745257275088548364400416034343698203667850230829457, + 21888242871839275222246405745257275088548364400416034343698204027514653838388, + 21888242871839275222246405745257275088548364400416034343698203726980602822527, + 11565513355181, + 21888242871839275222246405745257275088548364400416034343698203959027757086441, + 21888242871839275222246405745257275088548364400416034343698204138071857021336, + 21888242871839275222246405745257275088548364400416034343698203931694653998800, + 377477273194547, + 21888242871839275222246405745257275088548364400416034343698204047682267352626, + 21888242871839275222246405745257275088548364400416034343698203971492599137024, + 21888242871839275222246405745257275088548364400416034343698203869846320681392, + 325254164784149, + 21888242871839275222246405745257275088548364400416034343698203819396246655163, + 224165172479915, + 21888242871839275222246405745257275088548364400416034343698203912904436751533, + 21888242871839275222246405745257275088548364400416034343698203902696350502468, + 21888242871839275222246405745257275088548364400416034343698204078847338671825, + 21888242871839275222246405745257275088548364400416034343698204132910876937907, + 156494057831664, + 21888242871839275222246405745257275088548364400416034343698203834777980212023, + 212229800979495, + 21888242871839275222246405745257275088548364400416034343698203901558389077705, + 21888242871839275222246405745257275088548364400416034343698204089782673706007, + 21888242871839275222246405745257275088548364400416034343698203992802455156293, + 237324708691622, + 21888242871839275222246405745257275088548364400416034343698204077563529175732, + 21888242871839275222246405745257275088548364400416034343698203699188624923064, + 21888242871839275222246405745257275088548364400416034343698204144793504724331, + 414601206242389, + 21888242871839275222246405745257275088548364400416034343698204017999538676078, + 21888242871839275222246405745257275088548364400416034343698204038927515124933, + 21888242871839275222246405745257275088548364400416034343698203810123226818326, + 480533045154499, + 290139315584680, + 469187498109384, + 21888242871839275222246405745257275088548364400416034343698203655737496370385, + 487640399981117, + 21888242871839275222246405745257275088548364400416034343698203738893150969655, + 291156535611738, + 67148223273975, + 21888242871839275222246405745257275088548364400416034343698203626488242806100, + 347044497295166, + 84079892052335, + 21888242871839275222246405745257275088548364400416034343698203973712575729791, + 21888242871839275222246405745257275088548364400416034343698203772035266259237, + 75853911089764, + 108276647063561, + 21888242871839275222246405745257275088548364400416034343698203999869587252738, + 512056274336106, + 166546984781821, + 21888242871839275222246405745257275088548364400416034343698203736180601685631, + 21888242871839275222246405745257275088548364400416034343698204142839614499100, + 21888242871839275222246405745257275088548364400416034343698203930553102752360, + 21888242871839275222246405745257275088548364400416034343698204165277321778767, + 21888242871839275222246405745257275088548364400416034343698203680808705669338, + 183947595640103, + 241602564108462, + 173798276250477, + 21888242871839275222246405745257275088548364400416034343698203705359645242392, + 443117031588445, + 247191940743359, + 21888242871839275222246405745257275088548364400416034343698204060753515666289, + 21888242871839275222246405745257275088548364400416034343698204117824824057886, + 26114969891506, + 393465000331304, + 21888242871839275222246405745257275088548364400416034343698203823534897870172, + 21888242871839275222246405745257275088548364400416034343698203968348890566322, + 21888242871839275222246405745257275088548364400416034343698204180213482817406, + 522163469369326, + 21888242871839275222246405745257275088548364400416034343698204144781211824034, + 416938954892811, + 247618340831399, + 21888242871839275222246405745257275088548364400416034343698204115269548866079, + 21888242871839275222246405745257275088548364400416034343698204052969381103198, + 21888242871839275222246405745257275088548364400416034343698204113192616640688, + 21888242871839275222246405745257275088548364400416034343698203908792356751809, + 519482336613357, + 21888242871839275222246405745257275088548364400416034343698203893719479361129, + 390564953974884, + 96117422054777, + 21888242871839275222246405745257275088548364400416034343698203774552928060200, + 21888242871839275222246405745257275088548364400416034343698203751372620145531, + 21888242871839275222246405745257275088548364400416034343698203975086592574379, + 21888242871839275222246405745257275088548364400416034343698203731908213685950, + 71796676354048, + 21888242871839275222246405745257275088548364400416034343698204053922542557768, + 282119724562301, + 21888242871839275222246405745257275088548364400416034343698203776511860411198, + 21888242871839275222246405745257275088548364400416034343698203939552210313417, + 129340831845312, + 203519027197813, + 560450466957003, + 271530112617196, + 201128632708435, + 387531902496583, + 21888242871839275222246405745257275088548364400416034343698203780831199219468, + 487978190774432, + 153558282835219, + 21888242871839275222246405745257275088548364400416034343698203777727854077694, + 251753644290680, + 29954143892400, + 21888242871839275222246405745257275088548364400416034343698204145924625295430, + 318321391467675, + 353128400667130, + 21888242871839275222246405745257275088548364400416034343698203740633519492407, + 263502282323713, + 401496294550338, + 21888242871839275222246405745257275088548364400416034343698204027712505759729, + 522095925758205, + 52476215524896, + 21888242871839275222246405745257275088548364400416034343698203772729245089089, + 66856296232742, + 9994191836156, + 21888242871839275222246405745257275088548364400416034343698203804485534157785, + 64742742997595, + 348925922506000, + 476947761965399, + 21888242871839275222246405745257275088548364400416034343698203703991066666042, + 21888242871839275222246405745257275088548364400416034343698204053203103320180, + 251648739353250, + 21888242871839275222246405745257275088548364400416034343698203978668729893044, + 135710851507236, + 21888242871839275222246405745257275088548364400416034343698203830639739265368, + 198793328112812, + 260958327809732, + 21888242871839275222246405745257275088548364400416034343698204151108262658877, + 183781588417889, + 428219652244158, + 391762201374188, + 70539666659304, + 316495976256059, + 21888242871839275222246405745257275088548364400416034343698203723906445950755, + 21888242871839275222246405745257275088548364400416034343698204088532355947201, + 21888242871839275222246405745257275088548364400416034343698203956166608188229, + 21888242871839275222246405745257275088548364400416034343698204130490629600166, + 99563312374114, + 21888242871839275222246405745257275088548364400416034343698204164271632055409, + 507536388130035, + 230873255848072, + 21888242871839275222246405745257275088548364400416034343698203836030642690249, + 505046519502065, + 306906585312123, + 153038214776379, + 237274895286270, + 21888242871839275222246405745257275088548364400416034343698203863332374038803, + 169644600978545, + 21888242871839275222246405745257275088548364400416034343698203627886351946314, + 175693905042428, + 21888242871839275222246405745257275088548364400416034343698203927204955042962, + 21888242871839275222246405745257275088548364400416034343698203816636763712035, + 21888242871839275222246405745257275088548364400416034343698203942737791767494, + 300118945311038, + 21888242871839275222246405745257275088548364400416034343698203751686621362453, + 21888242871839275222246405745257275088548364400416034343698204014129619523220, + 2288189390973, + 97947984733073, + 394683767500270, + 21888242871839275222246405745257275088548364400416034343698203823215863016052, + 21888242871839275222246405745257275088548364400416034343698204087942820304270, + 366218873581588, + 21888242871839275222246405745257275088548364400416034343698203712584417155210, + 536280189734975, + 225185560858688, + 458328627276599, + 21888242871839275222246405745257275088548364400416034343698204074607133803157, + 21888242871839275222246405745257275088548364400416034343698203909308486001938, + 63368677190621, + 21888242871839275222246405745257275088548364400416034343698204030514700965428, + 21888242871839275222246405745257275088548364400416034343698203776406455569341, + 245492040225383, + 21888242871839275222246405745257275088548364400416034343698203720111727857638, + 57758914961891, + 21888242871839275222246405745257275088548364400416034343698203813859432310764, + 338268973885490, + 21888242871839275222246405745257275088548364400416034343698204108494497903144, + 21888242871839275222246405745257275088548364400416034343698203668931002954322, + 21888242871839275222246405745257275088548364400416034343698203801921204324437, + 21888242871839275222246405745257275088548364400416034343698203929565921495737, + 523156551597186, + 21888242871839275222246405745257275088548364400416034343698203832220471109542, + 1932989911515, + 13621528079925, + 134657348865416, + 501850879018362, + 286403045218897, + 420766786350850, + 21888242871839275222246405745257275088548364400416034343698204020479374981314, + 21888242871839275222246405745257275088548364400416034343698203680123277440448, + 21888242871839275222246405745257275088548364400416034343698204116511720500559, + 21888242871839275222246405745257275088548364400416034343698203779614883667227, + 21888242871839275222246405745257275088548364400416034343698203694787592049664, + 21888242871839275222246405745257275088548364400416034343698203735373975590673, + 284899638612876, + 556308594111793, + 18401209821433, + 21888242871839275222246405745257275088548364400416034343698204078138434617349, + 21888242871839275222246405745257275088548364400416034343698203975873460385980, + 2426376569819, + 21888242871839275222246405745257275088548364400416034343698203828303189756961, + 181945028221727, + 32520192006265, + 21888242871839275222246405745257275088548364400416034343698203976330487593799, + 150688591458724, + 253258099645387, + 21888242871839275222246405745257275088548364400416034343698203924440724826992, + 21888242871839275222246405745257275088548364400416034343698203661151821127404, + 21888242871839275222246405745257275088548364400416034343698204117079769016586, + 143815932851449, + 314187452178462, + 260872429416796, + 354314761209774, + 21888242871839275222246405745257275088548364400416034343698203744368979492161, + 21888242871839275222246405745257275088548364400416034343698203757788170650980, + 21888242871839275222246405745257275088548364400416034343698204126623331431881, + 21888242871839275222246405745257275088548364400416034343698203776801570776402, + 21888242871839275222246405745257275088548364400416034343698203778676970608612, + 394761322611691, + 21888242871839275222246405745257275088548364400416034343698203670183072969528, + 165687070969406, + 21888242871839275222246405745257275088548364400416034343698203823507130691044, + 285244273500196, + 438180412518585, + 21888242871839275222246405745257275088548364400416034343698203724920554837695, + 222027970334087, + 21888242871839275222246405745257275088548364400416034343698204084240137934929, + 21888242871839275222246405745257275088548364400416034343698204179753832438143, + 433962521325940, + 252680026686263, + 21888242871839275222246405745257275088548364400416034343698203967560482140336, + 21888242871839275222246405745257275088548364400416034343698203774266461699002, + 439566089303250, + 7265786891506, + 218006882899139, + 380964777693262, + 21888242871839275222246405745257275088548364400416034343698204099807901574251, + 21888242871839275222246405745257275088548364400416034343698203676136073837141, + 21888242871839275222246405745257275088548364400416034343698204181608007541751, + 388851262843442, + 58152873903014, + 364883055849232, + 126312029785934, + 21888242871839275222246405745257275088548364400416034343698203785062070574864, + 190307507877749, + 21888242871839275222246405745257275088548364400416034343698204026995556881898, + 78869914484392, + 432822317441267, + 19006546945871, + 21888242871839275222246405745257275088548364400416034343698204134192872442080, + 155399522032704, + 253096782365049, + 133509015834152, + 21888242871839275222246405745257275088548364400416034343698204065486868579902, + 21888242871839275222246405745257275088548364400416034343698204105902873701111, + 481713371630141, + 21888242871839275222246405745257275088548364400416034343698204178620517596385, + 21888242871839275222246405745257275088548364400416034343698204183047778622675, + 176179858458371, + 36165571529941, + 21888242871839275222246405745257275088548364400416034343698203837634230068743, + 447071774235580, + 335613036479001, + 501129467099875, + 375971332865846, + 21888242871839275222246405745257275088548364400416034343698204049123418911484, + 21888242871839275222246405745257275088548364400416034343698203915829585330587, + 21888242871839275222246405745257275088548364400416034343698203804680626897092, + 450500157083305, + 332370169513206, + 54570285636029, + 284852531176183, + 21888242871839275222246405745257275088548364400416034343698203952111979455463, + 21888242871839275222246405745257275088548364400416034343698203674122755792840, + 146126728652359, + 285121358828549, + 411248949527173, + 141021251520644, + 21888242871839275222246405745257275088548364400416034343698203788593089554996, + 250261121647595, + 57967682664661, + 311229074725119, + 21888242871839275222246405745257275088548364400416034343698204161382935473139, + 21888242871839275222246405745257275088548364400416034343698203886189026232860, + 21888242871839275222246405745257275088548364400416034343698203885314388271042, + 21888242871839275222246405745257275088548364400416034343698204113671265281147, + 302098209612761, + 437175453609949, + 497093471344645, + 21888242871839275222246405745257275088548364400416034343698204072166497242729, + 21888242871839275222246405745257275088548364400416034343698203666994855572003, + 21888242871839275222246405745257275088548364400416034343698203709656808123603, + 35825141360302, + 21888242871839275222246405745257275088548364400416034343698204065946018786242, + 536583072950314, + 281753160546947, + 21888242871839275222246405745257275088548364400416034343698204012366063587111, + 21888242871839275222246405745257275088548364400416034343698203636660200697401, + 148451179901320, + 551593501102574, + 319383245159999, + 21888242871839275222246405745257275088548364400416034343698204094649317192282, + 21888242871839275222246405745257275088548364400416034343698203843767406119558, + 248935845584940, + 21888242871839275222246405745257275088548364400416034343698203723263070464635, + 244233470414796, + 102406955701841, + 420202236551596, + 21888242871839275222246405745257275088548364400416034343698203726638880433120, + 30082012447358, + 121447796707741, + 21888242871839275222246405745257275088548364400416034343698204088386374564551, + 353044982306112, + 21888242871839275222246405745257275088548364400416034343698203675866837862144, + 112868183166693, + 21888242871839275222246405745257275088548364400416034343698203660408874557163, + 21888242871839275222246405745257275088548364400416034343698204146280745076560, + 546422809644492, + 21888242871839275222246405745257275088548364400416034343698203638329904539234, + 21888242871839275222246405745257275088548364400416034343698203862541595342470, + 21888242871839275222246405745257275088548364400416034343698204091137164425357, + 21888242871839275222246405745257275088548364400416034343698204176879401103572, + 151802537935552, + 21888242871839275222246405745257275088548364400416034343698203802317134982620, + 212197800344286, + 156144067570470, + 499722227876648, + 485372547480710, + 42746203429718, + 21888242871839275222246405745257275088548364400416034343698204077519573123745, + 21888242871839275222246405745257275088548364400416034343698204164898382156932, + 21888242871839275222246405745257275088548364400416034343698203791257205537019, + 53510162892337, + 21888242871839275222246405745257275088548364400416034343698203766383514816429, + 217042962597433, + 21888242871839275222246405745257275088548364400416034343698204094032015149167, + 21888242871839275222246405745257275088548364400416034343698203816627665559351, + 94028667521514, + 21888242871839275222246405745257275088548364400416034343698203668968034125792, + 95125877792675, + 21888242871839275222246405745257275088548364400416034343698203643220463312987, + 21888242871839275222246405745257275088548364400416034343698203738982233727864, + 21888242871839275222246405745257275088548364400416034343698203875101680479369, + 21888242871839275222246405745257275088548364400416034343698204094712282348881, + 21888242871839275222246405745257275088548364400416034343698203771725895037951, + 21888242871839275222246405745257275088548364400416034343698203645743145058612, + 21888242871839275222246405745257275088548364400416034343698204003749294828560, + 21888242871839275222246405745257275088548364400416034343698204129493867217515, + 277053500513565, + 21888242871839275222246405745257275088548364400416034343698204157688170690798, + 415622052766479, + 16967877113480, + 370744342638545, + 21888242871839275222246405745257275088548364400416034343698203872646148778766, + 228772618892089, + 36955162091585, + 21888242871839275222246405745257275088548364400416034343698203891294909627574, + 377090082802252, + 78698150445636, + 21888242871839275222246405745257275088548364400416034343698204077884293767092, + 230119177644478, + 21888242871839275222246405745257275088548364400416034343698204045734686409821, + 21888242871839275222246405745257275088548364400416034343698203974868527801913, + 75472104762414, + 21888242871839275222246405745257275088548364400416034343698204022480243839604, + 76132476732653, + 21888242871839275222246405745257275088548364400416034343698203840801949427561, + 21888242871839275222246405745257275088548364400416034343698203786358421465098, + 414701708365662, + 81823133555756, + 21888242871839275222246405745257275088548364400416034343698203772165873584343, + 51959367781973, + 155355015354876, + 181819675887748, + 129343185911725, + 79512245885261, + 21888242871839275222246405745257275088548364400416034343698203655203018654556, + 21888242871839275222246405745257275088548364400416034343698203896028266836339, + 21888242871839275222246405745257275088548364400416034343698204117454928060669, + 182979290822363, + 21888242871839275222246405745257275088548364400416034343698203953409711848453, + 21888242871839275222246405745257275088548364400416034343698203842583112042453, + 468251675403158, + 293292324276458, + 343999243348916, + 34728217873263, + 21888242871839275222246405745257275088548364400416034343698203859082880704056, + 21888242871839275222246405745257275088548364400416034343698203749966677338393, + 21888242871839275222246405745257275088548364400416034343698204158309522369181, + 345639941806392, + 21888242871839275222246405745257275088548364400416034343698204074646303884090, + 203467117024363, + 90336668612035, + 379627525184855, + 21888242871839275222246405745257275088548364400416034343698204092183098019947, + 244704066004269, + 106964869688985, + 21888242871839275222246405745257275088548364400416034343698203645541286693536, + 19190322551954, + 21888242871839275222246405745257275088548364400416034343698203880576012043699, + 21888242871839275222246405745257275088548364400416034343698204082121989919812, + 60475990799288, + 21888242871839275222246405745257275088548364400416034343698203646199471350913, + 198899005259961, + 142159595577795, + 118790362964881, + 113674758807332, + 21888242871839275222246405745257275088548364400416034343698203642141404046740, + 521110632020245, + 555687618039435, + 377209192362499, + 21888242871839275222246405745257275088548364400416034343698203633382115703872, + 21888242871839275222246405745257275088548364400416034343698204137759636554167, + 21888242871839275222246405745257275088548364400416034343698204044821731290704, + 216870756104990, + 21888242871839275222246405745257275088548364400416034343698203938353205791141, + 21888242871839275222246405745257275088548364400416034343698204080302299647717, + 21888242871839275222246405745257275088548364400416034343698203752183812415068, + 21888242871839275222246405745257275088548364400416034343698203625070011961485, + 338526645173857, + 21888242871839275222246405745257275088548364400416034343698203886318891521590, + 241435033824407, + 304192439790832, + 21888242871839275222246405745257275088548364400416034343698203887967753941116, + 428857000289082, + 530936649475255, + 555311821070753, + 379130840782722, + 21888242871839275222246405745257275088548364400416034343698203794511943389408, + 21888242871839275222246405745257275088548364400416034343698203755732245064613, + 21888242871839275222246405745257275088548364400416034343698204136139382033443, + 108699594480308, + 21888242871839275222246405745257275088548364400416034343698203808376548524569, + 21888242871839275222246405745257275088548364400416034343698203734318978535328, + 21888242871839275222246405745257275088548364400416034343698203990049193080323, + 21888242871839275222246405745257275088548364400416034343698203695790973733317, + 21888242871839275222246405745257275088548364400416034343698204089479545864591, + 298658343315096, + 531321026224085, + 404601335213368, + 259209684241604, + 21888242871839275222246405745257275088548364400416034343698203839683484451679, + 21888242871839275222246405745257275088548364400416034343698203764074307837032, + 328492687242282, + 507630860638163, + 21888242871839275222246405745257275088548364400416034343698204011590883655331, + 21888242871839275222246405745257275088548364400416034343698204140532414732393, + 544615510228272, + 21888242871839275222246405745257275088548364400416034343698203934175061489326, + 141863488772536, + 261703023653751, + 21888242871839275222246405745257275088548364400416034343698203845212484368864, + 21888242871839275222246405745257275088548364400416034343698203982784107019817, + 171380437854438, + 21888242871839275222246405745257275088548364400416034343698203935634434613271, + 411917224335164, + 21888242871839275222246405745257275088548364400416034343698204034831651388242, + 21888242871839275222246405745257275088548364400416034343698203917506480827635, + 111268508358505, + 21888242871839275222246405745257275088548364400416034343698204137373766898185, + 310336196678559, + 21888242871839275222246405745257275088548364400416034343698203710247658393600, + 246286348331422, + 24744182985074, + 21888242871839275222246405745257275088548364400416034343698203841590950377088, + 21888242871839275222246405745257275088548364400416034343698203921996769475316, + 410185870366838, + 21888242871839275222246405745257275088548364400416034343698203739906918794254, + 21888242871839275222246405745257275088548364400416034343698203687572076864765, + 21888242871839275222246405745257275088548364400416034343698203754193860412833, + 21888242871839275222246405745257275088548364400416034343698203647691295054484, + 561366367768929, + 21888242871839275222246405745257275088548364400416034343698203990058378802544, + 96200680708877, + 183755609837495, + 21888242871839275222246405745257275088548364400416034343698203845238431592744, + 266821691263059, + 21888242871839275222246405745257275088548364400416034343698204114960276325167, + 21888242871839275222246405745257275088548364400416034343698203995334321731356, + 21888242871839275222246405745257275088548364400416034343698204039665795352699, + 21888242871839275222246405745257275088548364400416034343698203919113104895215, + 130269611840058, + 21888242871839275222246405745257275088548364400416034343698203696796698835689, + 21888242871839275222246405745257275088548364400416034343698204009078056909647, + 21888242871839275222246405745257275088548364400416034343698204053688606847858, + 21888242871839275222246405745257275088548364400416034343698204023256178193358, + 21888242871839275222246405745257275088548364400416034343698203820578040065132, + 499913647994662, + 405749826058639, + 252750485800530, + 299517685833888, + 21888242871839275222246405745257275088548364400416034343698203786382036023455, + 21888242871839275222246405745257275088548364400416034343698203867717475524042, + 21888242871839275222246405745257275088548364400416034343698203713275735424851, + 21888242871839275222246405745257275088548364400416034343698203858735378678042, + 26449798197708, + 21888242871839275222246405745257275088548364400416034343698203951499078042885, + 486202689840272, + 21888242871839275222246405745257275088548364400416034343698203650932114634265, + 21888242871839275222246405745257275088548364400416034343698203886319521884795, + 21888242871839275222246405745257275088548364400416034343698204088779190699392, + 21888242871839275222246405745257275088548364400416034343698203961858484161009, + 21888242871839275222246405745257275088548364400416034343698203644801706912801, + 21888242871839275222246405745257275088548364400416034343698203745651123124486, + 538496058975946, + 21888242871839275222246405745257275088548364400416034343698203750392122043295, + 21888242871839275222246405745257275088548364400416034343698203963617905011283, + 21888242871839275222246405745257275088548364400416034343698204134100797230385, + 21888242871839275222246405745257275088548364400416034343698204051631576555502, + 521809251378290, + 181580148430819, + 21888242871839275222246405745257275088548364400416034343698203871330204307417, + 494542048781001, + 21888242871839275222246405745257275088548364400416034343698204104176034928973, + 32162048856893, + 61650554956202, + 201446157623476, + 21888242871839275222246405745257275088548364400416034343698204180454900834075, + 21888242871839275222246405745257275088548364400416034343698204074524450045950, + 21888242871839275222246405745257275088548364400416034343698203715444146735170, + 97769673830433, + 21888242871839275222246405745257275088548364400416034343698204103521809091680, + 213529588654578, + 432923826605023, + 21888242871839275222246405745257275088548364400416034343698203745149852807582, + 21888242871839275222246405745257275088548364400416034343698204098338835438902, + 21888242871839275222246405745257275088548364400416034343698203648429806784956, + 553727777037945, + 332302021026420, + 21888242871839275222246405745257275088548364400416034343698204136851048893717, + 216802572051328, + 21888242871839275222246405745257275088548364400416034343698203805799894219105, + 21888242871839275222246405745257275088548364400416034343698203867649826612124, + 2522649707088, + 251971272071019, + 191994139349712, + 21888242871839275222246405745257275088548364400416034343698204145140446610999, + 21888242871839275222246405745257275088548364400416034343698204120737877269374, + 360666524521450, + 273427015345823, + 83057693096747, + 21888242871839275222246405745257275088548364400416034343698203631483497725038, + 316999628999835, + 21888242871839275222246405745257275088548364400416034343698204045450571977434, + 252887438812310, + 21888242871839275222246405745257275088548364400416034343698203798630779099901, + 21888242871839275222246405745257275088548364400416034343698203865120106359660, + 535380784966692, + 287814795822615, + 236844899454411, + 21888242871839275222246405745257275088548364400416034343698203836329750031111, + 461878291739851, + 540009070196166, + 21888242871839275222246405745257275088548364400416034343698203627585737741096, + 271197879250563, + 21888242871839275222246405745257275088548364400416034343698203924118967750611, + 21888242871839275222246405745257275088548364400416034343698204070075844284906, + 21888242871839275222246405745257275088548364400416034343698203743975506202222, + 21888242871839275222246405745257275088548364400416034343698204048918070704575, + 21888242871839275222246405745257275088548364400416034343698203686523998443789, + 21888242871839275222246405745257275088548364400416034343698203851424081211918, + 419653706480113, + 279519042833814, + 418201929166657, + 21888242871839275222246405745257275088548364400416034343698203932014369163020, + 21888242871839275222246405745257275088548364400416034343698203916224318631377, + 330533331353241, + 491197039085820, + 21888242871839275222246405745257275088548364400416034343698204005445478374997, + 339183607275741, + 469178738951937, + 94674666264153, + 553781121236539, + 21888242871839275222246405745257275088548364400416034343698203899367700245514, + 353914206778425, + 21888242871839275222246405745257275088548364400416034343698203983533873809701, + 503403835807397, + 546501248624265, + 1911299289971, + 21888242871839275222246405745257275088548364400416034343698203647865507594729, + 21888242871839275222246405745257275088548364400416034343698203959554683169081, + 21888242871839275222246405745257275088548364400416034343698204164057600458608, + 21888242871839275222246405745257275088548364400416034343698203971982897481783, + 21888242871839275222246405745257275088548364400416034343698203765538560173492, + 301639528316156, + 21888242871839275222246405745257275088548364400416034343698203932831510879561, + 387813386841204, + 130286507922068, + 374455418759678, + 21888242871839275222246405745257275088548364400416034343698204093797152167710, + 21888242871839275222246405745257275088548364400416034343698204081093314216848, + 359273369171138, + 21888242871839275222246405745257275088548364400416034343698203978516582246918, + 280851842471448, + 63972711957045, + 21888242871839275222246405745257275088548364400416034343698204080880113935431, + 21888242871839275222246405745257275088548364400416034343698203735109975602984, + 21888242871839275222246405745257275088548364400416034343698204114358846216177, + 41451320587277, + 116096828115642, + 458826408183760, + 21888242871839275222246405745257275088548364400416034343698204008140199239319, + 287248452271327, + 21888242871839275222246405745257275088548364400416034343698203786831622190255, + 150327221782422, + 21888242871839275222246405745257275088548364400416034343698204136647058387933, + 558085401294061, + 21888242871839275222246405745257275088548364400416034343698203714624628525575, + 497203953787794, + 21888242871839275222246405745257275088548364400416034343698203826565174939807, + 21888242871839275222246405745257275088548364400416034343698204020622914942895, + 21888242871839275222246405745257275088548364400416034343698204102919634800532, + 21888242871839275222246405745257275088548364400416034343698203792605418786319, + 21888242871839275222246405745257275088548364400416034343698203783646786616910, + 21888242871839275222246405745257275088548364400416034343698203939580788317547, + 158983226089498, + 314462171671700, + 192265044518614, + 154232212195097, + 88415275033812, + 21888242871839275222246405745257275088548364400416034343698203935101480137318, + 291598253947250, + 21888242871839275222246405745257275088548364400416034343698204021636899389737, + 487788074352707, + 21888242871839275222246405745257275088548364400416034343698203801193378065103, + 21888242871839275222246405745257275088548364400416034343698203643578157944207, + 21888242871839275222246405745257275088548364400416034343698203961636952552607, + 507475252696232, + 481402154884120, + 275909992008887, + 21888242871839275222246405745257275088548364400416034343698204128982518778648, + 326151006075415, + 21888242871839275222246405745257275088548364400416034343698203647657242885145, + 496638511151029, + 438143440961323, + 21888242871839275222246405745257275088548364400416034343698203659829076702777, + 329258057590360, + 21888242871839275222246405745257275088548364400416034343698204172322173099130, + 97179178246321, + 21888242871839275222246405745257275088548364400416034343698204076692378908619, + 507564498793624, + 80514365752213, + 21888242871839275222246405745257275088548364400416034343698203706989839136808, + 49455605717536, + 12530879149139, + 329014212105335, + 21888242871839275222246405745257275088548364400416034343698203768153153198640, + 292984205836323, + 402461537459019, + 21888242871839275222246405745257275088548364400416034343698203649173902930406, + 21888242871839275222246405745257275088548364400416034343698204067307304458026, + 21888242871839275222246405745257275088548364400416034343698204071566962617830, + 540743405890874, + 274215304211750, + 104890357212021, + 130646214324711, + 248246624150128, + 21888242871839275222246405745257275088548364400416034343698204042283328042856, + 21888242871839275222246405745257275088548364400416034343698203678087153858329, + 21888242871839275222246405745257275088548364400416034343698204020705157498265, + 21888242871839275222246405745257275088548364400416034343698203956060320883322, + 437149057738814, + 21888242871839275222246405745257275088548364400416034343698203927904725167768, + 79424370622608, + 192543961166806, + 21888242871839275222246405745257275088548364400416034343698203816802342345861, + 478499027016843, + 21888242871839275222246405745257275088548364400416034343698203627483622173389, + 145255635220580, + 247117511199919, + 21888242871839275222246405745257275088548364400416034343698204059642494225846, + 21888242871839275222246405745257275088548364400416034343698204003974450023086, + 21888242871839275222246405745257275088548364400416034343698204143834691754153, + 313479031111734, + 21888242871839275222246405745257275088548364400416034343698204100435611840972, + 21888242871839275222246405745257275088548364400416034343698203840022911373207, + 214201657977288, + 21888242871839275222246405745257275088548364400416034343698203882450190067696, + 21888242871839275222246405745257275088548364400416034343698203669014067896520, + 21888242871839275222246405745257275088548364400416034343698203873010557437675, + 21888242871839275222246405745257275088548364400416034343698203958360315961380, + 21888242871839275222246405745257275088548364400416034343698203795197525710771, + 21888242871839275222246405745257275088548364400416034343698204018143603764198, + 21888242871839275222246405745257275088548364400416034343698203973397278127318, + 426250482388287, + 21888242871839275222246405745257275088548364400416034343698203650267203625942, + 21888242871839275222246405745257275088548364400416034343698203853379289620073, + 21888242871839275222246405745257275088548364400416034343698203757931299766132, + 21888242871839275222246405745257275088548364400416034343698204025857446667403, + 21888242871839275222246405745257275088548364400416034343698204105551559138416, + 441621410155554, + 21888242871839275222246405745257275088548364400416034343698204098084519007449, + 425119081068453, + 496230337291005, + 21888242871839275222246405745257275088548364400416034343698203645274220278470, + 21888242871839275222246405745257275088548364400416034343698203640144189319131, + 330091761549975, + 21888242871839275222246405745257275088548364400416034343698203852891502071135, + 21888242871839275222246405745257275088548364400416034343698203942487275040418, + 394572975190343, + 551777633914740, + 21888242871839275222246405745257275088548364400416034343698204012614128160756, + 21888242871839275222246405745257275088548364400416034343698204102632482770239, + 358085256384172, + 21888242871839275222246405745257275088548364400416034343698204167079224441143, + 192841693687642, + 129997355323437, + 100453834122189, + 21888242871839275222246405745257275088548364400416034343698203869057675902314, + 21888242871839275222246405745257275088548364400416034343698204094106060675986, + 21888242871839275222246405745257275088548364400416034343698203920195340686331, + 279580297574369, + 246942031488563, + 21888242871839275222246405745257275088548364400416034343698203694379723908988, + 10851783987695, + 21888242871839275222246405745257275088548364400416034343698204123972813789587, + 112893396299825, + 21888242871839275222246405745257275088548364400416034343698203649751549005946, + 21888242871839275222246405745257275088548364400416034343698203665381175699235, + 471968647732443, + 237392427563512, + 177650407090043, + 21888242871839275222246405745257275088548364400416034343698204131890289817741, + 21888242871839275222246405745257275088548364400416034343698204161328229831890, + 21888242871839275222246405745257275088548364400416034343698203786050641626893, + 21888242871839275222246405745257275088548364400416034343698204146699497150969, + 223404682807706, + 21888242871839275222246405745257275088548364400416034343698203963139307476806, + 214171403079944, + 166454062961838, + 539216451001209, + 355725264947838, + 21322868765081, + 21888242871839275222246405745257275088548364400416034343698204172957665567298, + 444099827647317, + 191625752702407, + 553798590497255, + 354832101636167, + 21888242871839275222246405745257275088548364400416034343698203885935817749623, + 372335698057289, + 21888242871839275222246405745257275088548364400416034343698203677400107818567, + 21888242871839275222246405745257275088548364400416034343698203700303828361581, + 21888242871839275222246405745257275088548364400416034343698203944788403287615, + 21888242871839275222246405745257275088548364400416034343698204025288994341334, + 285411232355853, + 21888242871839275222246405745257275088548364400416034343698204153984050197420, + 21888242871839275222246405745257275088548364400416034343698203882774519592852, + 199389060681750, + 21888242871839275222246405745257275088548364400416034343698204151225061947575, + 167879962173045, + 458153001943675, + 21888242871839275222246405745257275088548364400416034343698203879700549946309, + 379235281888432, + 321297305850835, + 454404351407824, + 21888242871839275222246405745257275088548364400416034343698203645603882546927, + 21888242871839275222246405745257275088548364400416034343698203987089098927629, + 21888242871839275222246405745257275088548364400416034343698203689195774734897, + 21888242871839275222246405745257275088548364400416034343698204043089153376699, + 21888242871839275222246405745257275088548364400416034343698204020811829684884, + 21888242871839275222246405745257275088548364400416034343698203901659208905676, + 21888242871839275222246405745257275088548364400416034343698203684758955634387, + 520872895940021, + 21888242871839275222246405745257275088548364400416034343698203891639761944806, + 21888242871839275222246405745257275088548364400416034343698203822370128863276, + 21888242871839275222246405745257275088548364400416034343698204063687300440827, + 244246388777565, + 21888242871839275222246405745257275088548364400416034343698203709952025708155, + 436399593520045, + 21888242871839275222246405745257275088548364400416034343698203672161581862423, + 21888242871839275222246405745257275088548364400416034343698203839713303953334, + 21888242871839275222246405745257275088548364400416034343698203862481252050696, + 233310973846786, + 21888242871839275222246405745257275088548364400416034343698203905205712035859, + 21888242871839275222246405745257275088548364400416034343698203757999604727574, + 21888242871839275222246405745257275088548364400416034343698203869358957762319, + 21888242871839275222246405745257275088548364400416034343698203776079693548219, + 21888242871839275222246405745257275088548364400416034343698203868623966361714, + 21888242871839275222246405745257275088548364400416034343698203905051884890888, + 21888242871839275222246405745257275088548364400416034343698203776666777425636, + 21888242871839275222246405745257275088548364400416034343698203684635136539490, + 21888242871839275222246405745257275088548364400416034343698203965136952149052, + 21888242871839275222246405745257275088548364400416034343698203847543813139325, + 269534843474153, + 33272763758125, + 21888242871839275222246405745257275088548364400416034343698204032310839630480, + 21888242871839275222246405745257275088548364400416034343698203881229049731229, + 21888242871839275222246405745257275088548364400416034343698204071605375159007, + 21888242871839275222246405745257275088548364400416034343698203898914375169764, + 21888242871839275222246405745257275088548364400416034343698204080382884806821, + 403956416391666, + 21888242871839275222246405745257275088548364400416034343698203651760475948321, + 223715714089432, + 21888242871839275222246405745257275088548364400416034343698204034439509783330, + 527530347088611, + 21888242871839275222246405745257275088548364400416034343698204083174221022859, + 21888242871839275222246405745257275088548364400416034343698203685495858559673, + 54731202120133, + 223705573319060, + 122935969402075, + 517012724766567, + 21888242871839275222246405745257275088548364400416034343698204113624216287040, + 381256296901154, + 494436219186942, + 48019531497601, + 451805049235532, + 21888242871839275222246405745257275088548364400416034343698203933130924228958, + 130016149005220, + 21888242871839275222246405745257275088548364400416034343698203983244066695432, + 21888242871839275222246405745257275088548364400416034343698203958561514143229, + 355480198731764, + 503212184400546, + 514089387617340, + 21888242871839275222246405745257275088548364400416034343698203640250292894863, + 336321667623063, + 21888242871839275222246405745257275088548364400416034343698204040359808287508, + 21888242871839275222246405745257275088548364400416034343698203750622049291183, + 21888242871839275222246405745257275088548364400416034343698204047553372353104, + 410954426309805, + 517152971498106, + 466450469492663, + 21888242871839275222246405745257275088548364400416034343698203921634513923772, + 21888242871839275222246405745257275088548364400416034343698203671528950536111, + 90445153995372, + 163002890177901, + 248433736681581, + 21888242871839275222246405745257275088548364400416034343698203664474758407952, + 21888242871839275222246405745257275088548364400416034343698204163704218161660, + 296483056681788, + 484191932939860, + 21888242871839275222246405745257275088548364400416034343698203784414423373374, + 12494355912362, + 261864508380890, + 489276951859416, + 21888242871839275222246405745257275088548364400416034343698204168886802318526, + 288803683248476, + 223206644339590, + 21888242871839275222246405745257275088548364400416034343698204072059815126757, + 65161256959040, + 21888242871839275222246405745257275088548364400416034343698204071063559422720, + 332647434853715, + 21888242871839275222246405745257275088548364400416034343698204048654760243097, + 21888242871839275222246405745257275088548364400416034343698204093353091889041, + 526129358641415, + 21888242871839275222246405745257275088548364400416034343698203754998884625296, + 21888242871839275222246405745257275088548364400416034343698203995456051618010, + 21888242871839275222246405745257275088548364400416034343698204064246128913118, + 19516867614932, + 512708797665724, + 350498157370604, + 21888242871839275222246405745257275088548364400416034343698204110678264491920, + 21888242871839275222246405745257275088548364400416034343698203951925285598270, + 21888242871839275222246405745257275088548364400416034343698203935324495653059, + 345680332802784, + 21888242871839275222246405745257275088548364400416034343698203783611568230105, + 21888242871839275222246405745257275088548364400416034343698204009578782894115, + 115621910668010, + 406624313913555, + 363556813542440, + 21888242871839275222246405745257275088548364400416034343698203788668455076211, + 21888242871839275222246405745257275088548364400416034343698203787206767103665, + 70157162403705, + 21888242871839275222246405745257275088548364400416034343698204121550970404312, + 21888242871839275222246405745257275088548364400416034343698204019318184224345, + 344340766083854, + 21888242871839275222246405745257275088548364400416034343698204105752536841247, + 557023053946133, + 110143885333462, + 21888242871839275222246405745257275088548364400416034343698203757679985592788, + 21888242871839275222246405745257275088548364400416034343698203721958497206421, + 277845919550853, + 21888242871839275222246405745257275088548364400416034343698203846543028304114, + 21888242871839275222246405745257275088548364400416034343698203713901323545639, + 21888242871839275222246405745257275088548364400416034343698204090224683527472, + 499257068270129, + 21888242871839275222246405745257275088548364400416034343698203819889686149514, + 163970233947880, + 21888242871839275222246405745257275088548364400416034343698203876697003174321, + 268675703967548, + 21888242871839275222246405745257275088548364400416034343698203703358142851967, + 378222050979208, + 21888242871839275222246405745257275088548364400416034343698203897095245633321, + 21888242871839275222246405745257275088548364400416034343698203800410433074482, + 18316985268589, + 21888242871839275222246405745257275088548364400416034343698203901912792608942, + 411447138701940, + 204523065546099, + 64973169395879, + 21888242871839275222246405745257275088548364400416034343698204035881987606944, + 473469390529475, + 483748950249005, + 21888242871839275222246405745257275088548364400416034343698203866432161875300, + 21888242871839275222246405745257275088548364400416034343698203949117403055147, + 486451007239547, + 95854030758362, + 21888242871839275222246405745257275088548364400416034343698204140729383015567, + 233959136789231, + 21888242871839275222246405745257275088548364400416034343698203632156873186709, + 21888242871839275222246405745257275088548364400416034343698204121996498805027, + 21888242871839275222246405745257275088548364400416034343698203929635846971448, + 472733602528818, + 21888242871839275222246405745257275088548364400416034343698203670035558922133, + 170718526081893, + 21888242871839275222246405745257275088548364400416034343698204160261058629820, + 21888242871839275222246405745257275088548364400416034343698203652932041117951, + 374094284690502, + 21888242871839275222246405745257275088548364400416034343698204079166346953171, + 323503538174672, + 122701179787402, + 21888242871839275222246405745257275088548364400416034343698204161723415143754, + 273559257952077, + 21888242871839275222246405745257275088548364400416034343698203929143897796643, + 21888242871839275222246405745257275088548364400416034343698203694963521413403, + 21888242871839275222246405745257275088548364400416034343698204127802260724078, + 21888242871839275222246405745257275088548364400416034343698203828036783554304, + 453445771537647, + 384638003493140, + 554264677449310, + 539122277448884, + 76545747147845, + 181400797907484, + 68533159342152, + 21888242871839275222246405745257275088548364400416034343698203784824485740618, + 21888242871839275222246405745257275088548364400416034343698204119544163160923, + 521165144980597, + 21888242871839275222246405745257275088548364400416034343698203636073823606271, + 21888242871839275222246405745257275088548364400416034343698203732997933158064, + 21888242871839275222246405745257275088548364400416034343698203735953772397201, + 31808215918736, + 472069742789375, + 21888242871839275222246405745257275088548364400416034343698203855310752303663, + 190950420407593, + 466546662156251, + 21888242871839275222246405745257275088548364400416034343698203789924177887790, + 21888242871839275222246405745257275088548364400416034343698203738734047633356, + 21888242871839275222246405745257275088548364400416034343698203749798358467419, + 21888242871839275222246405745257275088548364400416034343698203959002883710901, + 21888242871839275222246405745257275088548364400416034343698204095112821046744, + 21888242871839275222246405745257275088548364400416034343698203667364869261199, + 21888242871839275222246405745257275088548364400416034343698203963220888856888, + 378021885530138, + 283206612024304, + 21888242871839275222246405745257275088548364400416034343698203847143441554138, + 21888242871839275222246405745257275088548364400416034343698203820333558970507, + 51274508384304, + 157896650407314, + 21888242871839275222246405745257275088548364400416034343698203781581289389269, + 21888242871839275222246405745257275088548364400416034343698204024571452269357, + 99110609853683, + 542039952354355, + 21888242871839275222246405745257275088548364400416034343698204120561894476127, + 21852376978343, + 260402448098471, + 21888242871839275222246405745257275088548364400416034343698203790766971076799, + 21888242871839275222246405745257275088548364400416034343698204133533846990842, + 122403448592063, + 412135815946131, + 341747055382552, + 317343301298061, + 21888242871839275222246405745257275088548364400416034343698203961005629346910, + 78495881251645, + 328991766290466, + 21888242871839275222246405745257275088548364400416034343698203828245878504781, + 21888242871839275222246405745257275088548364400416034343698203838045928962818, + 494658291135885, + 21888242871839275222246405745257275088548364400416034343698203874163805647027, + 55755956725753, + 201867485932962, + 21888242871839275222246405745257275088548364400416034343698204016306276833136, + 421334920124601, + 21888242871839275222246405745257275088548364400416034343698203810379187079642, + 21888242871839275222246405745257275088548364400416034343698203687363042889473, + 21888242871839275222246405745257275088548364400416034343698204164807552159091, + 202287506180836, + 500273785342658, + 242601789186825, + 21888242871839275222246405745257275088548364400416034343698203624626315170087, + 21888242871839275222246405745257275088548364400416034343698203735549322635021, + 21888242871839275222246405745257275088548364400416034343698204124184310058681, + 199974226696878, + 321316204554475, + 358710415328205, + 153847580069188, + 342523242631331, + 235446965385849, + 167489895422865, + 21888242871839275222246405745257275088548364400416034343698203951950617446619, + 21888242871839275222246405745257275088548364400416034343698204074952740470891, + 21888242871839275222246405745257275088548364400416034343698204124103421033630, + 21888242871839275222246405745257275088548364400416034343698204177219729490369, + 21888242871839275222246405745257275088548364400416034343698203862497533917014, + 21888242871839275222246405745257275088548364400416034343698203823248826593492, + 153080036349982, + 290677518542146, + 21888242871839275222246405745257275088548364400416034343698203781615608579842, + 21888242871839275222246405745257275088548364400416034343698203733889559293518, + 21888242871839275222246405745257275088548364400416034343698203990132802671425, + 205621803288625, + 21888242871839275222246405745257275088548364400416034343698203631227612853090, + 107414924704108, + 63845139784481, + 374569516121678, + 381938115746275, + 21888242871839275222246405745257275088548364400416034343698203803801037628420, + 211529196923882, + 183323266810224, + 21888242871839275222246405745257275088548364400416034343698203958149833943980, + 562246682607115, + 21888242871839275222246405745257275088548364400416034343698203753076099657338, + 21888242871839275222246405745257275088548364400416034343698203968542529745933, + 21888242871839275222246405745257275088548364400416034343698203842143501382370, + 343258225009774, + 21888242871839275222246405745257275088548364400416034343698204069011343723012, + 244180250406093, + 496360448473993, + 21888242871839275222246405745257275088548364400416034343698204014545371858718, + 21888242871839275222246405745257275088548364400416034343698203720028483357068, + 134800049567734, + 21888242871839275222246405745257275088548364400416034343698204116485684570574, + 306702785462700, + 549828001552731, + 360507202342579, + 21888242871839275222246405745257275088548364400416034343698203956767912468987, + 21888242871839275222246405745257275088548364400416034343698204085126522170165, + 21888242871839275222246405745257275088548364400416034343698203862792375871745, + 21888242871839275222246405745257275088548364400416034343698204062929913559307, + 545769955398860, + 21888242871839275222246405745257275088548364400416034343698204117949898537920, + 21888242871839275222246405745257275088548364400416034343698204061437396995791, + 527355886680263, + 550462612295744, + 487009759466231, + 21888242871839275222246405745257275088548364400416034343698203911119567210476, + 424600355024576, + 21888242871839275222246405745257275088548364400416034343698203901718451689290, + 21888242871839275222246405745257275088548364400416034343698203899962887009734, + 21888242871839275222246405745257275088548364400416034343698203887531532251512, + 97248308301252, + 190661728310427, + 21888242871839275222246405745257275088548364400416034343698204182414282557407, + 29244469366804, + 21888242871839275222246405745257275088548364400416034343698203751290472187648, + 355637703485535, + 21888242871839275222246405745257275088548364400416034343698203729297191458132, + 21888242871839275222246405745257275088548364400416034343698203903088256205036, + 21888242871839275222246405745257275088548364400416034343698204000512335287805, + 158597509351325, + 21888242871839275222246405745257275088548364400416034343698204091888556910892, + 21888242871839275222246405745257275088548364400416034343698203981130595738481, + 153571850876746, + 467996193753526, + 21888242871839275222246405745257275088548364400416034343698203907817643599321, + 21888242871839275222246405745257275088548364400416034343698203938135990650048, + 21888242871839275222246405745257275088548364400416034343698203985002460695974, + 422431660460622, + 382530517955162, + 235649464762862, + 21888242871839275222246405745257275088548364400416034343698203832388529823501, + 21888242871839275222246405745257275088548364400416034343698203719143990293803, + 311365769974345, + 493844905517848, + 21888242871839275222246405745257275088548364400416034343698203955588046475080, + 161483624340834, + 302230229337885, + 55557813168043, + 21888242871839275222246405745257275088548364400416034343698204096913135096997, + 472765014046401, + 76736493329799, + 21888242871839275222246405745257275088548364400416034343698203993655907638114, + 277150884715766, + 21888242871839275222246405745257275088548364400416034343698203907147931559693, + 21888242871839275222246405745257275088548364400416034343698203772157658509971, + 21888242871839275222246405745257275088548364400416034343698203825414082750455, + 366483306238727, + 21888242871839275222246405745257275088548364400416034343698204111716068599828, + 397703912702578, + 21888242871839275222246405745257275088548364400416034343698203959921615017689, + 525584000960713, + 64762611341537, + 21888242871839275222246405745257275088548364400416034343698204057383444580430, + 21888242871839275222246405745257275088548364400416034343698203734467744255523, + 161274594696262, + 410334590435851, + 435644118054426, + 21888242871839275222246405745257275088548364400416034343698203883615723800728, + 187277731123256, + 21888242871839275222246405745257275088548364400416034343698204009417460153155, + 470918367744054, + 239972761965402, + 21888242871839275222246405745257275088548364400416034343698203760310872271958, + 21888242871839275222246405745257275088548364400416034343698203763067273815396, + 428518476334586, + 21888242871839275222246405745257275088548364400416034343698203689936058959961, + 21888242871839275222246405745257275088548364400416034343698204097289113951740, + 336802852961557, + 224423613299833, + 178510547425401, + 21888242871839275222246405745257275088548364400416034343698203918051035980266, + 21888242871839275222246405745257275088548364400416034343698203939723268863384, + 21888242871839275222246405745257275088548364400416034343698203846395288257690, + 21888242871839275222246405745257275088548364400416034343698203628381098562133, + 562934149880968, + 551761010149257, + 14207975829937, + 21888242871839275222246405745257275088548364400416034343698204061400274106007, + 21888242871839275222246405745257275088548364400416034343698204088443668676940, + 217339250829984, + 21888242871839275222246405745257275088548364400416034343698203730105656916084, + 170015276610067, + 21888242871839275222246405745257275088548364400416034343698203926458653875643, + 221625409200647, + 114706324905965, + 21888242871839275222246405745257275088548364400416034343698204066612808451388, + 92592509694577, + 21888242871839275222246405745257275088548364400416034343698203707954849747861, + 308993061681251, + 21888242871839275222246405745257275088548364400416034343698203704552458763893, + 21888242871839275222246405745257275088548364400416034343698204142818116198226, + 145198848602935, + 303007172422434, + 21888242871839275222246405745257275088548364400416034343698203665680698109002, + 135345550064449, + 21888242871839275222246405745257275088548364400416034343698203934647205219405, + 27785010503800, + 21888242871839275222246405745257275088548364400416034343698203788703242453023, + 391612605426981, + 196828143516313, + 21888242871839275222246405745257275088548364400416034343698204117407979127542, + 301615599713013, + 290249184255697, + 21888242871839275222246405745257275088548364400416034343698204137293265083280, + 151871903602058, + 21888242871839275222246405745257275088548364400416034343698203876358862787051, + 503577433782685, + 476873807519329, + 21888242871839275222246405745257275088548364400416034343698204183358004972956, + 21888242871839275222246405745257275088548364400416034343698204055843666570505, + 21888242871839275222246405745257275088548364400416034343698203778925410528585, + 96667717511070, + 21888242871839275222246405745257275088548364400416034343698203679846281787052, + 21888242871839275222246405745257275088548364400416034343698204119319813621288, + 388760798030958, + 21888242871839275222246405745257275088548364400416034343698203868745182848444, + 21888242871839275222246405745257275088548364400416034343698203785650264401400, + 21888242871839275222246405745257275088548364400416034343698204083767734766688, + 505629386744455, + 65977192860794, + 345579736103356, + 21888242871839275222246405745257275088548364400416034343698203893188384750713, + 100426345923935, + 520466313011690, + 21888242871839275222246405745257275088548364400416034343698204121411414601632, + 21888242871839275222246405745257275088548364400416034343698203709775286234929, + 280782944081088, + 100132314564400, + 21888242871839275222246405745257275088548364400416034343698203729709768850561, + 21888242871839275222246405745257275088548364400416034343698203989467882204018, + 100667797662221, + 21888242871839275222246405745257275088548364400416034343698204168170587544729, + 303376417658006, + 21888242871839275222246405745257275088548364400416034343698204079337749794000, + 21888242871839275222246405745257275088548364400416034343698204020054767014736, + 226838887315769, + 21888242871839275222246405745257275088548364400416034343698204084865320652902, + 21888242871839275222246405745257275088548364400416034343698203660064175573616, + 86665479343921, + 152793295926094, + 366882539598414, + 191586574206888, + 169522727383091, + 489308856387300, + 173531659443213, + 21888242871839275222246405745257275088548364400416034343698203756846010081681, + 21888242871839275222246405745257275088548364400416034343698203645702931840748, + 439445837639455, + 410178800045506, + 359143922370314, + 21888242871839275222246405745257275088548364400416034343698204084064080894079, + 292039906784901, + 323146706080965, + 21888242871839275222246405745257275088548364400416034343698203847776927250036, + 168402897678818, + 131033697939865, + 286069127101300, + 21888242871839275222246405745257275088548364400416034343698204151495595544814, + 21888242871839275222246405745257275088548364400416034343698203751610170753062, + 1043997002385, + 21888242871839275222246405745257275088548364400416034343698203906824480744037, + 203216641569332, + 554285121444655, + 21888242871839275222246405745257275088548364400416034343698203693759911876683, + 21888242871839275222246405745257275088548364400416034343698203783451005563994, + 21888242871839275222246405745257275088548364400416034343698203860989094020954, + 480194044855287, + 240810725612550, + 471884100433489, + 21888242871839275222246405745257275088548364400416034343698203655920212441430, + 62328646047081, + 458569007324569, + 21888242871839275222246405745257275088548364400416034343698204034165984811956, + 21888242871839275222246405745257275088548364400416034343698203997476031742543, + 21888242871839275222246405745257275088548364400416034343698203802824345497799, + 393640789484655, + 21888242871839275222246405745257275088548364400416034343698203672877166866484, + 393561825311065, + 21888242871839275222246405745257275088548364400416034343698204056473829302940, + 359666710441178, + 21888242871839275222246405745257275088548364400416034343698203881437729198668, + 21888242871839275222246405745257275088548364400416034343698203943004109844966, + 558690901187685, + 336990774340938, + 21888242871839275222246405745257275088548364400416034343698203676995921040329, + 21888242871839275222246405745257275088548364400416034343698204009481237326928, + 130124365746131, + 21888242871839275222246405745257275088548364400416034343698204013829386156630, + 21888242871839275222246405745257275088548364400416034343698203822315840618995, + 21888242871839275222246405745257275088548364400416034343698204083969532179565, + 21888242871839275222246405745257275088548364400416034343698203769805169357510, + 291208166306911, + 59753362419861, + 21888242871839275222246405745257275088548364400416034343698204138766024193896, + 21888242871839275222246405745257275088548364400416034343698203910218142538143, + 21888242871839275222246405745257275088548364400416034343698203756084443534604, + 21888242871839275222246405745257275088548364400416034343698203948428890148281, + 460020792711601, + 21888242871839275222246405745257275088548364400416034343698203707268362078101, + 365287516987788, + 21888242871839275222246405745257275088548364400416034343698203670009694991586, + 21888242871839275222246405745257275088548364400416034343698203643604030989323, + 175140091521417, + 261178676489146, + 21888242871839275222246405745257275088548364400416034343698204002999249790965, + 380612381917505, + 453478828495340, + 384176008803418, + 21888242871839275222246405745257275088548364400416034343698203855486806923731, + 64296691936440, + 315738277697596, + 203362781381781, + 21888242871839275222246405745257275088548364400416034343698203972768112262162, + 21888242871839275222246405745257275088548364400416034343698203818667875020363, + 21888242871839275222246405745257275088548364400416034343698203915122540870220, + 228424421361448, + 21888242871839275222246405745257275088548364400416034343698203719642045798552, + 21888242871839275222246405745257275088548364400416034343698204000313429480822, + 21888242871839275222246405745257275088548364400416034343698203814912553684497, + 21888242871839275222246405745257275088548364400416034343698203940219102950992, + 21888242871839275222246405745257275088548364400416034343698203919752330922626, + 21888242871839275222246405745257275088548364400416034343698203821452251429249, + 21888242871839275222246405745257275088548364400416034343698203819559063797760, + 21888242871839275222246405745257275088548364400416034343698204182234240801602, + 87769894716667, + 21888242871839275222246405745257275088548364400416034343698203694999665692914, + 21888242871839275222246405745257275088548364400416034343698203984364380711136, + 21888242871839275222246405745257275088548364400416034343698203686259483531501, + 355401752941810, + 21888242871839275222246405745257275088548364400416034343698203882002603211078, + 42486089020041, + 514647296209694, + 21888242871839275222246405745257275088548364400416034343698203886922800925341, + 391516373598608, + 21888242871839275222246405745257275088548364400416034343698204034440646990019, + 37443588885780, + 328886042276957, + 104041058781594, + 21888242871839275222246405745257275088548364400416034343698203850612453092403, + 21888242871839275222246405745257275088548364400416034343698203750294922259910, + 235641393537045, + 38251099825425, + 21888242871839275222246405745257275088548364400416034343698203968874475020861, + 322435589779830, + 21888242871839275222246405745257275088548364400416034343698203905836601569749, + 21888242871839275222246405745257275088548364400416034343698204082990444181541, + 21888242871839275222246405745257275088548364400416034343698203959915405682424, + 261695213228064, + 448402323370295, + 21888242871839275222246405745257275088548364400416034343698203823709191629512, + 21888242871839275222246405745257275088548364400416034343698203977038367676013, + 21888242871839275222246405745257275088548364400416034343698204049990615180616, + 21888242871839275222246405745257275088548364400416034343698203875973994876517, + 440063978866993, + 399688314770966, + 21888242871839275222246405745257275088548364400416034343698203697639151721896, + 21888242871839275222246405745257275088548364400416034343698203935724977168023, + 44218451226796, + 135448047796416, + 470867058432623, + 286130116137424, + 334540197970388, + 259224588324581, + 67219052060822, + 21888242871839275222246405745257275088548364400416034343698203976984611420003, + 288869158345435, + 279612957838515, + 21888242871839275222246405745257275088548364400416034343698203951936193934577, + 21888242871839275222246405745257275088548364400416034343698204104276968170758, + 21888242871839275222246405745257275088548364400416034343698203863759133221841, + 266293063531406, + 21888242871839275222246405745257275088548364400416034343698203802917322770715, + 21888242871839275222246405745257275088548364400416034343698203659809781142557, + 396628877996718, + 119112235849073, + 21888242871839275222246405745257275088548364400416034343698204085315455667335, + 172123773863286, + 21888242871839275222246405745257275088548364400416034343698204128532392583043, + 21888242871839275222246405745257275088548364400416034343698204131116959758517, + 461908712367548, + 404194523560147, + 91783225111060, + 225470972154909, + 261729586848854, + 21888242871839275222246405745257275088548364400416034343698203709157383884849, + 21888242871839275222246405745257275088548364400416034343698203724559928695521, + 21888242871839275222246405745257275088548364400416034343698203682124154919696, + 191190089376885, + 21888242871839275222246405745257275088548364400416034343698203763485147573383, + 141546842701028, + 21888242871839275222246405745257275088548364400416034343698203892399231548772, + 21888242871839275222246405745257275088548364400416034343698204038718280721999, + 433233013067219, + 182546116350660, + 21888242871839275222246405745257275088548364400416034343698203815040377582810, + 21888242871839275222246405745257275088548364400416034343698204153542560690060, + 196408971583782, + 21888242871839275222246405745257275088548364400416034343698204038781657036256, + 56884669674171, + 540502837591090, + 21888242871839275222246405745257275088548364400416034343698203922867545406918, + 21888242871839275222246405745257275088548364400416034343698203979731187071247, + 21888242871839275222246405745257275088548364400416034343698204011072389807432, + 86082872726408, + 377774219539001, + 21888242871839275222246405745257275088548364400416034343698203844579570263832, + 21888242871839275222246405745257275088548364400416034343698203635300011437073, + 21888242871839275222246405745257275088548364400416034343698204177611799985847, + 51913686372729, + 21888242871839275222246405745257275088548364400416034343698203903652664525143, + 21888242871839275222246405745257275088548364400416034343698203709658263275874, + 21888242871839275222246405745257275088548364400416034343698203681808466077993, + 333004564916733, + 139216890579397, + 21888242871839275222246405745257275088548364400416034343698204160250369326745, + 21888242871839275222246405745257275088548364400416034343698203736078418333691, + 369092858702590, + 497200842131881, + 21888242871839275222246405745257275088548364400416034343698203832729472657841, + 195073418060439, + 21888242871839275222246405745257275088548364400416034343698203646891183859234, + 21888242871839275222246405745257275088548364400416034343698203989841678299735, + 333503040328703, + 117138766685296, + 21888242871839275222246405745257275088548364400416034343698203846382730943377, + 21888242871839275222246405745257275088548364400416034343698204145833592482000, + 473287770581588, + 21888242871839275222246405745257275088548364400416034343698203658336208331743, + 21888242871839275222246405745257275088548364400416034343698203949286365332789, + 541584624999979, + 167760787042560, + 21888242871839275222246405745257275088548364400416034343698203772241857178929, + 21888242871839275222246405745257275088548364400416034343698203875794995786426, + 77851725379147, + 500604474397953, + 21888242871839275222246405745257275088548364400416034343698203832407553666096, + 247707124773766, + 21888242871839275222246405745257275088548364400416034343698204046884262874334, + 21888242871839275222246405745257275088548364400416034343698203934239615490318, + 23256013642934, + 86480483710908, + 216302506843656, + 21888242871839275222246405745257275088548364400416034343698203991013706495807, + 21888242871839275222246405745257275088548364400416034343698204087891914679578, + 21888242871839275222246405745257275088548364400416034343698203815813108116850, + 249744518602158, + 252639977872930, + 115023252379486, + 21888242871839275222246405745257275088548364400416034343698204074529778671575, + 21888242871839275222246405745257275088548364400416034343698203707963279286895, + 21888242871839275222246405745257275088548364400416034343698203702750824597275, + 48672582770664, + 472856474933666, + 429230723940082, + 174337285852417, + 148624463069752, + 21888242871839275222246405745257275088548364400416034343698204149751417049608, + 148198012500030, + 21888242871839275222246405745257275088548364400416034343698203644745535847208, + 355832946582281, + 21888242871839275222246405745257275088548364400416034343698203826549523762910, + 46998723427863, + 21888242871839275222246405745257275088548364400416034343698203869228156464640, + 308739785301563, + 21888242871839275222246405745257275088548364400416034343698204035198777244971, + 21888242871839275222246405745257275088548364400416034343698203663092592150208, + 383206891069028, + 21888242871839275222246405745257275088548364400416034343698203828967295795059, + 21888242871839275222246405745257275088548364400416034343698203909104428018204, + 21888242871839275222246405745257275088548364400416034343698203920371016085199, + 135321013190735, + 21888242871839275222246405745257275088548364400416034343698204025376132678874, + 239726430572608, + 21888242871839275222246405745257275088548364400416034343698203824845721061135, + 304004408492758, + 11285822012314, + 21888242871839275222246405745257275088548364400416034343698204034976047642623, + 21888242871839275222246405745257275088548364400416034343698203988090893355021, + 21888242871839275222246405745257275088548364400416034343698203676317445684641, + 21888242871839275222246405745257275088548364400416034343698204037535114134851, + 21888242871839275222246405745257275088548364400416034343698203671595487686026, + 21888242871839275222246405745257275088548364400416034343698204012830876629958, + 21888242871839275222246405745257275088548364400416034343698203827201796462628, + 202525127862798, + 210916222547999, + 501944569855382, + 21888242871839275222246405745257275088548364400416034343698204012823790199128, + 210565089691530, + 162579984197885, + 557321741409299, + 21888242871839275222246405745257275088548364400416034343698203799568147683962, + 21888242871839275222246405745257275088548364400416034343698203784426587146709, + 443784803848252, + 164506007429705, + 21888242871839275222246405745257275088548364400416034343698204134121242760853, + 21888242871839275222246405745257275088548364400416034343698204168869161417620, + 21888242871839275222246405745257275088548364400416034343698203670293194203345, + 280831100592641, + 21888242871839275222246405745257275088548364400416034343698203668710592653259, + 229381000848859, + 535396609798222, + 526235206935384, + 276462278294256, + 21888242871839275222246405745257275088548364400416034343698203947415695364847, + 21888242871839275222246405745257275088548364400416034343698204137047131006832, + 164770023797233, + 21888242871839275222246405745257275088548364400416034343698204033238208766983, + 21888242871839275222246405745257275088548364400416034343698203665874810340734, + 44805547079705, + 327329956201468, + 21888242871839275222246405745257275088548364400416034343698203747493248125276, + 381219151976190, + 338276207769216, + 21888242871839275222246405745257275088548364400416034343698203811703906621928, + 172382619223861, + 534154573924564, + 247067313884743, + 158844819606911, + 21888242871839275222246405745257275088548364400416034343698203825588877779029, + 416018893932052, + 21888242871839275222246405745257275088548364400416034343698203953381575926231, + 514190211261351, + 21888242871839275222246405745257275088548364400416034343698203783664457918104, + 21888242871839275222246405745257275088548364400416034343698203728968295292923, + 21888242871839275222246405745257275088548364400416034343698203716822053092200, + 21888242871839275222246405745257275088548364400416034343698203732918369953569, + 560207121776962, + 21888242871839275222246405745257275088548364400416034343698203946581955726949, + 319433041009210, + 543588595325390, + 21888242871839275222246405745257275088548364400416034343698203759951973862546, + 69585816209976, + 21888242871839275222246405745257275088548364400416034343698203638183054981280, + 21888242871839275222246405745257275088548364400416034343698203932098266351384, + 21888242871839275222246405745257275088548364400416034343698203985893143646103, + 72534785184933, + 21888242871839275222246405745257275088548364400416034343698203884096819982031, + 21888242871839275222246405745257275088548364400416034343698203762407700461665, + 21888242871839275222246405745257275088548364400416034343698203824251890766703, + 21888242871839275222246405745257275088548364400416034343698203764399160282228, + 103971923387214, + 179012817357132, + 21888242871839275222246405745257275088548364400416034343698203834789497579216, + 21888242871839275222246405745257275088548364400416034343698203944920477611935, + 274534627390174, + 21888242871839275222246405745257275088548364400416034343698204172154394068277, + 385841764522633, + 21888242871839275222246405745257275088548364400416034343698203672929642388163, + 163313328210184, + 21888242871839275222246405745257275088548364400416034343698203834224001578472, + 391521253056653, + 21888242871839275222246405745257275088548364400416034343698203744034253310193, + 22487958545879, + 21888242871839275222246405745257275088548364400416034343698203768919994247018, + 108682153445612, + 21888242871839275222246405745257275088548364400416034343698203974835261806856, + 21888242871839275222246405745257275088548364400416034343698203885095541950989, + 21888242871839275222246405745257275088548364400416034343698204160695510560203, + 129996985748138, + 361408307833322, + 21888242871839275222246405745257275088548364400416034343698203669648808990361, + 325561205557272, + 21888242871839275222246405745257275088548364400416034343698203739072038162476, + 21888242871839275222246405745257275088548364400416034343698203718806727175027, + 21888242871839275222246405745257275088548364400416034343698203938457042711821, + 524945277229343, + 296156974198917, + 21888242871839275222246405745257275088548364400416034343698203761948203969920, + 473625592472994, + 419426846098099, + 211350547949924, + 321132808984562, + 461444153458540, + 213556777075270, + 21888242871839275222246405745257275088548364400416034343698203799001560112866, + 541183560971465, + 105710399700607, + 21888242871839275222246405745257275088548364400416034343698203991882757470415, + 21888242871839275222246405745257275088548364400416034343698203987781634373914, + 21888242871839275222246405745257275088548364400416034343698203719808285046914, + 49589315635721, + 481916714328659, + 21888242871839275222246405745257275088548364400416034343698204132686721559020, + 311342657212193, + 202417592734288, + 21888242871839275222246405745257275088548364400416034343698204114996129204535, + 543451355489963, + 556427038292522, + 21888242871839275222246405745257275088548364400416034343698204062266981243852, + 17042442160657, + 457585537055545, + 21888242871839275222246405745257275088548364400416034343698203816705351240072, + 13517349242792, + 21888242871839275222246405745257275088548364400416034343698203951993038409152, + 21888242871839275222246405745257275088548364400416034343698203849157813193664, + 21888242871839275222246405745257275088548364400416034343698203675765606522574, + 21888242871839275222246405745257275088548364400416034343698204000717952423374, + 21888242871839275222246405745257275088548364400416034343698203885431231663846, + 21888242871839275222246405745257275088548364400416034343698203663432980903117, + 208444753090036, + 229520226674683, + 21888242871839275222246405745257275088548364400416034343698203759313443557578, + 21888242871839275222246405745257275088548364400416034343698204102824661423715, + 21888242871839275222246405745257275088548364400416034343698204000389740620407, + 21888242871839275222246405745257275088548364400416034343698203828200958737240, + 21888242871839275222246405745257275088548364400416034343698204125957212100113, + 21888242871839275222246405745257275088548364400416034343698203895406294569513, + 21888242871839275222246405745257275088548364400416034343698203924761101261663, + 426780527359866, + 21888242871839275222246405745257275088548364400416034343698203751304427331536, + 21888242871839275222246405745257275088548364400416034343698203926497588780930, + 96424963999395, + 100068385682288, + 21888242871839275222246405745257275088548364400416034343698203867988257028221, + 21888242871839275222246405745257275088548364400416034343698203784658579692137, + 470989777470258, + 21888242871839275222246405745257275088548364400416034343698203686653720199244, + 21888242871839275222246405745257275088548364400416034343698203670432184993232, + 122297157524105, + 469414424767764, + 480981753696989, + 21888242871839275222246405745257275088548364400416034343698203926943997786053, + 224773460868169, + 21888242871839275222246405745257275088548364400416034343698203683113915597972, + 21888242871839275222246405745257275088548364400416034343698204180771442079216, + 21888242871839275222246405745257275088548364400416034343698203721052592082185, + 21888242871839275222246405745257275088548364400416034343698204094344540544000, + 21888242871839275222246405745257275088548364400416034343698203728606007572691, + 387561115990502, + 21888242871839275222246405745257275088548364400416034343698204112579161709988, + 320905982230933, + 15659484386905, + 464172518014548, + 359109671680629, + 21888242871839275222246405745257275088548364400416034343698203865854337738924, + 21888242871839275222246405745257275088548364400416034343698203937688494140088, + 477140608002615, + 42010672369713, + 21888242871839275222246405745257275088548364400416034343698204086138229820622, + 21888242871839275222246405745257275088548364400416034343698203687960727490577, + 21888242871839275222246405745257275088548364400416034343698203825239558270514, + 55711664692933, + 364216367636172, + 165682459040600, + 21888242871839275222246405745257275088548364400416034343698203845500994474178, + 21888242871839275222246405745257275088548364400416034343698203793012612846103, + 21888242871839275222246405745257275088548364400416034343698203667123498613744, + 21888242871839275222246405745257275088548364400416034343698203629745736721496, + 437857868495534, + 468168822540755, + 21888242871839275222246405745257275088548364400416034343698203967134805871776, + 134010685987356, + 437266944532837, + 174824745121399, + 21888242871839275222246405745257275088548364400416034343698203696277033294867, + 37437742169067, + 21888242871839275222246405745257275088548364400416034343698203758915109393359, + 65865263274767, + 349832606551324, + 40870428266196, + 21888242871839275222246405745257275088548364400416034343698203881918061990620, + 553468348658420, + 21888242871839275222246405745257275088548364400416034343698203853974022547668, + 21888242871839275222246405745257275088548364400416034343698204180281222023276, + 461907388121163, + 378060928455613, + 21888242871839275222246405745257275088548364400416034343698204090502280315330, + 48728299484364, + 29487526478360, + 21888242871839275222246405745257275088548364400416034343698204118643300331699, + 21888242871839275222246405745257275088548364400416034343698203718618050416047, + 21888242871839275222246405745257275088548364400416034343698203743360304351841, + 21888242871839275222246405745257275088548364400416034343698203995847611736593, + 21888242871839275222246405745257275088548364400416034343698203862016771268578, + 484536972381438, + 142924268533001, + 21888242871839275222246405745257275088548364400416034343698203649086030476748, + 475990641638028, + 21888242871839275222246405745257275088548364400416034343698203757978288374571, + 314331030089956, + 317897570598994, + 21888242871839275222246405745257275088548364400416034343698204030407620807475, + 21888242871839275222246405745257275088548364400416034343698204116689088448086, + 21888242871839275222246405745257275088548364400416034343698204135669638847276, + 21888242871839275222246405745257275088548364400416034343698203726312735952717, + 438750666490773, + 21888242871839275222246405745257275088548364400416034343698203992146714929806, + 175307256886786, + 561205332674812, + 21888242871839275222246405745257275088548364400416034343698203715286606582142, + 34749403785081, + 21888242871839275222246405745257275088548364400416034343698203646994572354380, + 21888242871839275222246405745257275088548364400416034343698203724234718908859, + 323002220346497, + 357369057448871, + 256022667122240, + 393349566946025, + 300384233359234, + 21888242871839275222246405745257275088548364400416034343698203933739182100524, + 21888242871839275222246405745257275088548364400416034343698203987113986171749, + 21888242871839275222246405745257275088548364400416034343698203632912507155067, + 424077961221820, + 21888242871839275222246405745257275088548364400416034343698203713946516883367, + 558153817799537, + 138684678130880, + 21888242871839275222246405745257275088548364400416034343698203793627477800227, + 82097619512440, + 21888242871839275222246405745257275088548364400416034343698204146101860089255, + 374926633456743, + 323303513056160, + 21888242871839275222246405745257275088548364400416034343698203689454466363029, + 21888242871839275222246405745257275088548364400416034343698204051192514645042, + 537547399272157, + 21888242871839275222246405745257275088548364400416034343698203922232932263847, + 21888242871839275222246405745257275088548364400416034343698203704443647461160, + 21888242871839275222246405745257275088548364400416034343698203798035986213056, + 21888242871839275222246405745257275088548364400416034343698204131173723918017, + 278526523430085, + 169070967593393, + 488753190530721, + 21888242871839275222246405745257275088548364400416034343698204016771766597622, + 61178063336540, + 264929878872311, + 516501544607403, + 21888242871839275222246405745257275088548364400416034343698203655321465334799, + 486652143131706, + 549784337227887, + 21888242871839275222246405745257275088548364400416034343698203977243390700796, + 21888242871839275222246405745257275088548364400416034343698204164879624851551, + 21888242871839275222246405745257275088548364400416034343698203865680999368508, + 448145594026019, + 21888242871839275222246405745257275088548364400416034343698204184961042336618, + 21888242871839275222246405745257275088548364400416034343698204063687437983366, + 21888242871839275222246405745257275088548364400416034343698203965934443937236, + 427905063797338, + 170626637915460, + 21888242871839275222246405745257275088548364400416034343698203820817462549698, + 229057940919330, + 21888242871839275222246405745257275088548364400416034343698203767075448897245, + 21888242871839275222246405745257275088548364400416034343698203736804365164973, + 432682988794425, + 501672716788115, + 21888242871839275222246405745257275088548364400416034343698204031027311329225, + 21888242871839275222246405745257275088548364400416034343698204135867134020623, + 144427655674915, + 21888242871839275222246405745257275088548364400416034343698203723222022938239, + 21888242871839275222246405745257275088548364400416034343698204064299912675763, + 21888242871839275222246405745257275088548364400416034343698203783352164490154, + 21888242871839275222246405745257275088548364400416034343698204178508429801170, + 117007530399042, + 85955630302546, + 21888242871839275222246405745257275088548364400416034343698203691351468265650, + 223333652135650, + 21888242871839275222246405745257275088548364400416034343698203734344943988861, + 21888242871839275222246405745257275088548364400416034343698203825162165237543, + 21888242871839275222246405745257275088548364400416034343698203858809730502106, + 21888242871839275222246405745257275088548364400416034343698204152633520276455, + 21888242871839275222246405745257275088548364400416034343698204129866658009865, + 21888242871839275222246405745257275088548364400416034343698204027440442364405, + 21888242871839275222246405745257275088548364400416034343698203794773185814066, + 21888242871839275222246405745257275088548364400416034343698203652228793489191, + 3542398183606, + 481532580936855, + 191794972533999, + 92829369448425, + 21888242871839275222246405745257275088548364400416034343698203890823352469460, + 497416984213, + 405120967894741, + 469479951686331, + 472073163706945, + 21888242871839275222246405745257275088548364400416034343698203945145592411887, + 21888242871839275222246405745257275088548364400416034343698203982584460500752, + 21888242871839275222246405745257275088548364400416034343698203769699319408505, + 482582657504859, + 21888242871839275222246405745257275088548364400416034343698204172259349009794, + 302597582963475, + 149095000957418, + 29947378213075, + 21888242871839275222246405745257275088548364400416034343698203640945819724652, + 519294096388259, + 21888242871839275222246405745257275088548364400416034343698203923476610470019, + 21888242871839275222246405745257275088548364400416034343698204040088072980258, + 42461466146905, + 21888242871839275222246405745257275088548364400416034343698203816508023125343, + 21888242871839275222246405745257275088548364400416034343698204129410055440726, + 212181536816180, + 21888242871839275222246405745257275088548364400416034343698203792510574827290, + 21888242871839275222246405745257275088548364400416034343698204067416158506325, + 21888242871839275222246405745257275088548364400416034343698204155305259439262, + 418273859634777, + 21888242871839275222246405745257275088548364400416034343698203894165525892683, + 308938654406758, + 21888242871839275222246405745257275088548364400416034343698204010914138377963, + 21888242871839275222246405745257275088548364400416034343698203630079460943042, + 187103107405228, + 21888242871839275222246405745257275088548364400416034343698203999873512647432, + 21888242871839275222246405745257275088548364400416034343698203909322775289260, + 21888242871839275222246405745257275088548364400416034343698203738007558467917, + 21888242871839275222246405745257275088548364400416034343698203955519543414357, + 21888242871839275222246405745257275088548364400416034343698203969299552279220, + 426107078143392, + 374443569032059, + 21888242871839275222246405745257275088548364400416034343698204088373666847481, + 21888242871839275222246405745257275088548364400416034343698203675146532026036, + 437513619726468, + 21888242871839275222246405745257275088548364400416034343698203691282927717350, + 21888242871839275222246405745257275088548364400416034343698204114502478273885, + 371739258709875, + 21888242871839275222246405745257275088548364400416034343698204131108273601712, + 164871866776191, + 309033848863575, + 21888242871839275222246405745257275088548364400416034343698203836408819465065, + 21888242871839275222246405745257275088548364400416034343698203786191060054007, + 68246830627024, + 21888242871839275222246405745257275088548364400416034343698203922744755888330, + 121873627688125, + 28927720809350, + 286459760064072, + 39338851340275, + 121240801814530, + 448824547546952, + 21888242871839275222246405745257275088548364400416034343698204169555080050412, + 363763611703080, + 21888242871839275222246405745257275088548364400416034343698203769403804696938, + 114960495985847, + 21888242871839275222246405745257275088548364400416034343698204075499474129629, + 21888242871839275222246405745257275088548364400416034343698203805298464547322, + 223945437528482, + 21888242871839275222246405745257275088548364400416034343698204164789807959228, + 9663224980559, + 39189508813416, + 490282883976257, + 21888242871839275222246405745257275088548364400416034343698203735852901448133, + 21888242871839275222246405745257275088548364400416034343698203942771533265417, + 21888242871839275222246405745257275088548364400416034343698204092806184318885, + 21888242871839275222246405745257275088548364400416034343698203749491543234446, + 426477870707363, + 338964063060925, + 21888242871839275222246405745257275088548364400416034343698204058284716046826, + 329719606700748, + 143457607538254, + 21888242871839275222246405745257275088548364400416034343698203710847239196844, + 416412637353560, + 21888242871839275222246405745257275088548364400416034343698203986178211454890, + 21888242871839275222246405745257275088548364400416034343698204100474865878839, + 21888242871839275222246405745257275088548364400416034343698203923310174139682, + 21888242871839275222246405745257275088548364400416034343698203657208205121175, + 412173585197910, + 21888242871839275222246405745257275088548364400416034343698203804045012011924, + 21888242871839275222246405745257275088548364400416034343698203838209273187488, + 21888242871839275222246405745257275088548364400416034343698204138468590410079, + 173549286537938, + 21888242871839275222246405745257275088548364400416034343698204071994361030550, + 21888242871839275222246405745257275088548364400416034343698203641271057041780, + 142699858063430, + 21888242871839275222246405745257275088548364400416034343698204050022322800779, + 21888242871839275222246405745257275088548364400416034343698203637862666331770, + 550856045023531, + 21888242871839275222246405745257275088548364400416034343698204115700912998610, + 33949381370438, + 21888242871839275222246405745257275088548364400416034343698203634298464567510, + 21888242871839275222246405745257275088548364400416034343698203873753432698081, + 21888242871839275222246405745257275088548364400416034343698204101598763447137, + 21888242871839275222246405745257275088548364400416034343698204099250017756286, + 502367502017670, + 26440199735099, + 157008106882839, + 21888242871839275222246405745257275088548364400416034343698203788267322232628, + 21888242871839275222246405745257275088548364400416034343698203812084670660183, + 21888242871839275222246405745257275088548364400416034343698203882390013097451, + 130953531512313, + 507351396581506, + 21888242871839275222246405745257275088548364400416034343698203980197695818349, + 323361387627316, + 21888242871839275222246405745257275088548364400416034343698203977849556213529, + 21888242871839275222246405745257275088548364400416034343698203885195917640532, + 21888242871839275222246405745257275088548364400416034343698203834800472925407, + 9378233107248, + 21888242871839275222246405745257275088548364400416034343698203749927965571013, + 83176109669360, + 7324746386948, + 21888242871839275222246405745257275088548364400416034343698204006294872142660, + 237375606699499, + 269670492358657, + 562865563739828, + 21888242871839275222246405745257275088548364400416034343698204091526543833245, + 188127746797199, + 21888242871839275222246405745257275088548364400416034343698203661725877951241, + 128337897895799, + 190046804546530, + 294523348227093, + 21888242871839275222246405745257275088548364400416034343698203989629221678263, + 21888242871839275222246405745257275088548364400416034343698204068027601514887, + 64585160754028, + 21888242871839275222246405745257275088548364400416034343698204130642411859280, + 21888242871839275222246405745257275088548364400416034343698204095651673223873, + 21888242871839275222246405745257275088548364400416034343698203722206423535390, + 21888242871839275222246405745257275088548364400416034343698203900100538143428, + 21888242871839275222246405745257275088548364400416034343698203907944984120770, + 241445099236802, + 482946531230976, + 21888242871839275222246405745257275088548364400416034343698203724482309874487, + 21888242871839275222246405745257275088548364400416034343698203917530443559747, + 21888242871839275222246405745257275088548364400416034343698204034740212132936, + 21888242871839275222246405745257275088548364400416034343698203842779941828362, + 79198262136732, + 79469592774076, + 21888242871839275222246405745257275088548364400416034343698204113065422562470, + 21888242871839275222246405745257275088548364400416034343698204088003858933427, + 407556619825586, + 330374327473771, + 226628282640973, + 507881658019545, + 21888242871839275222246405745257275088548364400416034343698203684506959249263, + 56962439356121, + 256887804569918, + 21888242871839275222246405745257275088548364400416034343698203771912029839484, + 21888242871839275222246405745257275088548364400416034343698204013199691380017, + 21888242871839275222246405745257275088548364400416034343698203773883949725607, + 79855588805284, + 21888242871839275222246405745257275088548364400416034343698203679617631674156, + 21888242871839275222246405745257275088548364400416034343698203945087792479204, + 60882238364622, + 21888242871839275222246405745257275088548364400416034343698204153823178614660, + 21888242871839275222246405745257275088548364400416034343698203830225127136206, + 21888242871839275222246405745257275088548364400416034343698203988318688039348, + 503315747797108, + 102897932037082, + 21888242871839275222246405745257275088548364400416034343698204030474879378487, + 100580110389385, + 21888242871839275222246405745257275088548364400416034343698204140406215225996, + 466365515867678, + 21888242871839275222246405745257275088548364400416034343698203677939806554580, + 21888242871839275222246405745257275088548364400416034343698203867372514992993, + 302435605988455, + 123057537270142, + 315930695485800, + 279866068714646, + 21888242871839275222246405745257275088548364400416034343698203980196400200690, + 11612213448109, + 347742743868402, + 360804953371777, + 163494605615466, + 317277106289652, + 462028303277272, + 21888242871839275222246405745257275088548364400416034343698203724930477999051, + 21888242871839275222246405745257275088548364400416034343698204017734286887833, + 21888242871839275222246405745257275088548364400416034343698203672653306448196, + 21888242871839275222246405745257275088548364400416034343698203868082313341721, + 252437885713062, + 21888242871839275222246405745257275088548364400416034343698203910747002240741, + 123283975766940, + 21888242871839275222246405745257275088548364400416034343698203880275109773538, + 370991051520718, + 21888242871839275222246405745257275088548364400416034343698203910789968543187, + 21888242871839275222246405745257275088548364400416034343698203999843596517632, + 18845230600693, + 274284131199475, + 272979302225745, + 146980532694500, + 21888242871839275222246405745257275088548364400416034343698204047684611740563, + 230911438981692, + 21888242871839275222246405745257275088548364400416034343698203768659266020898, + 21888242871839275222246405745257275088548364400416034343698203925524279248998, + 25931358022494, + 21888242871839275222246405745257275088548364400416034343698203931553241447003, + 21888242871839275222246405745257275088548364400416034343698204058721703226166, + 115064639324606, + 242058291030490, + 428116674863712, + 326799004392286, + 21888242871839275222246405745257275088548364400416034343698203933866731474168, + 21888242871839275222246405745257275088548364400416034343698203980183691276176, + 21888242871839275222246405745257275088548364400416034343698203886814759036031, + 71559349639577, + 145670723597660, + 21888242871839275222246405745257275088548364400416034343698203803106551995948, + 473059621281564, + 210248301180449, + 21888242871839275222246405745257275088548364400416034343698203860943116372451, + 251231195262125, + 186330676571272, + 21888242871839275222246405745257275088548364400416034343698204163959662393490, + 21888242871839275222246405745257275088548364400416034343698204029118513254684, + 21888242871839275222246405745257275088548364400416034343698204033043030252794, + 21888242871839275222246405745257275088548364400416034343698203749698755292780, + 21888242871839275222246405745257275088548364400416034343698203853889868965337, + 21888242871839275222246405745257275088548364400416034343698203981998395402754, + 21888242871839275222246405745257275088548364400416034343698204071584167675584, + 302027866292445, + 242131549820657, + 21888242871839275222246405745257275088548364400416034343698203681053057493142, + 257485343674984, + 21888242871839275222246405745257275088548364400416034343698204170389184685518, + 225417836298195, + 21888242871839275222246405745257275088548364400416034343698203719858086918442, + 21888242871839275222246405745257275088548364400416034343698203721447988628428, + 136907075512898, + 21888242871839275222246405745257275088548364400416034343698204122884639128733, + 71802605620929, + 383747006188135, + 436683064824961, + 213054176185096, + 102444717757803, + 118488566881054, + 21888242871839275222246405745257275088548364400416034343698204076035028792095, + 525864015871038, + 21888242871839275222246405745257275088548364400416034343698203991575471587328, + 21888242871839275222246405745257275088548364400416034343698204070677430985878, + 444241946209574, + 21888242871839275222246405745257275088548364400416034343698203949369916261667, + 21888242871839275222246405745257275088548364400416034343698203751977488764285, + 431556876079515, + 52454909238632, + 21888242871839275222246405745257275088548364400416034343698203803466060998285, + 524794500416130, + 21888242871839275222246405745257275088548364400416034343698204071998388571851, + 307374127034371, + 21888242871839275222246405745257275088548364400416034343698203897325365927442, + 237656452089384, + 174839560918971, + 21888242871839275222246405745257275088548364400416034343698203694233248880421, + 21888242871839275222246405745257275088548364400416034343698203660349978216493, + 21888242871839275222246405745257275088548364400416034343698203993783927655216, + 454498684279796, + 21888242871839275222246405745257275088548364400416034343698204101894969440933, + 21888242871839275222246405745257275088548364400416034343698203722363693351266, + 21888242871839275222246405745257275088548364400416034343698203818358974951122, + 21888242871839275222246405745257275088548364400416034343698204166823413542861, + 25518937532180, + 21888242871839275222246405745257275088548364400416034343698203624365164970875, + 30282090858238, + 21888242871839275222246405745257275088548364400416034343698203997350960182572, + 286659364889682, + 88115986287193, + 252939661855551, + 21888242871839275222246405745257275088548364400416034343698204099803811551232, + 21888242871839275222246405745257275088548364400416034343698204063755415886573, + 561017853409021, + 21888242871839275222246405745257275088548364400416034343698203625273667253579, + 21888242871839275222246405745257275088548364400416034343698203927141047687433, + 21888242871839275222246405745257275088548364400416034343698204172588579463683, + 21888242871839275222246405745257275088548364400416034343698203880293746487169, + 393271735646186, + 21888242871839275222246405745257275088548364400416034343698204090352867328028, + 390292965916657, + 21888242871839275222246405745257275088548364400416034343698204184224253750282, + 367036742065945, + 21888242871839275222246405745257275088548364400416034343698204050202901431431, + 21888242871839275222246405745257275088548364400416034343698204011237252653710, + 21888242871839275222246405745257275088548364400416034343698203852869049364337, + 88842837645510, + 249235264153499, + 476512067137589, + 21888242871839275222246405745257275088548364400416034343698203913296469482154, + 21888242871839275222246405745257275088548364400416034343698204067057473829446, + 427125877408488, + 21888242871839275222246405745257275088548364400416034343698203975160758834381, + 21888242871839275222246405745257275088548364400416034343698203973450514667003, + 219451366221030, + 21888242871839275222246405745257275088548364400416034343698203696775126291080, + 21888242871839275222246405745257275088548364400416034343698204111806474711330, + 21888242871839275222246405745257275088548364400416034343698203972102313636156, + 21888242871839275222246405745257275088548364400416034343698204043770171211009, + 337332099378009, + 21888242871839275222246405745257275088548364400416034343698204158798760111659, + 66525348733511, + 21888242871839275222246405745257275088548364400416034343698204098843381979957, + 21888242871839275222246405745257275088548364400416034343698203875343212567890, + 21888242871839275222246405745257275088548364400416034343698203698624404587215, + 101476052757211, + 328183532106090, + 401389991053463, + 308176497427000, + 544194193166773, + 103507970516356, + 226334888452568, + 21888242871839275222246405745257275088548364400416034343698203797676217197936, + 94988110564911, + 21888242871839275222246405745257275088548364400416034343698203850524148293338, + 496730478524887, + 147301634961941, + 21888242871839275222246405745257275088548364400416034343698203664648508260624, + 21888242871839275222246405745257275088548364400416034343698203682761732167124, + 21888242871839275222246405745257275088548364400416034343698203736780647440275, + 449410900278594, + 21888242871839275222246405745257275088548364400416034343698203630973386735232, + 296959017179196, + 357277882376518, + 21888242871839275222246405745257275088548364400416034343698203679689274184875, + 21888242871839275222246405745257275088548364400416034343698203817927324790095, + 239407797648038, + 21888242871839275222246405745257275088548364400416034343698203945193385155147, + 167378207486615, + 450372409532882, + 378181636219544, + 21888242871839275222246405745257275088548364400416034343698203877113524378755, + 294780728860072, + 21888242871839275222246405745257275088548364400416034343698203883698928947556, + 21888242871839275222246405745257275088548364400416034343698204050464516322041, + 21888242871839275222246405745257275088548364400416034343698203801885876390308, + 21888242871839275222246405745257275088548364400416034343698204031890200731713, + 21888242871839275222246405745257275088548364400416034343698203981766471714631, + 21888242871839275222246405745257275088548364400416034343698204013062436098695, + 109344338694017, + 21888242871839275222246405745257275088548364400416034343698203849008753698287, + 21888242871839275222246405745257275088548364400416034343698203858669081425501, + 21888242871839275222246405745257275088548364400416034343698203658684337787991, + 21888242871839275222246405745257275088548364400416034343698203729523403724558, + 165900822230793, + 255852057745157, + 21888242871839275222246405745257275088548364400416034343698203931156099132659, + 463120338484016, + 254214230464899, + 536075704235000, + 354635378683415, + 21888242871839275222246405745257275088548364400416034343698203670744293810030, + 21888242871839275222246405745257275088548364400416034343698203953617217546095, + 458078022456630, + 21888242871839275222246405745257275088548364400416034343698203827884185532615, + 503491729369701, + 21888242871839275222246405745257275088548364400416034343698204018904746240673, + 21888242871839275222246405745257275088548364400416034343698203823265403176094, + 21888242871839275222246405745257275088548364400416034343698204095413219856139, + 102015858150085, + 21888242871839275222246405745257275088548364400416034343698203852070392079039, + 21888242871839275222246405745257275088548364400416034343698203808449609315420, + 270705091808510, + 454094957725225, + 21888242871839275222246405745257275088548364400416034343698203764225228959253, + 210822124605936, + 407591626833740, + 21888242871839275222246405745257275088548364400416034343698203837876162454131, + 21888242871839275222246405745257275088548364400416034343698203784972849306080, + 21888242871839275222246405745257275088548364400416034343698203932076851420771, + 21888242871839275222246405745257275088548364400416034343698203641366274110026, + 78880832542504, + 21888242871839275222246405745257275088548364400416034343698203857170592113934, + 207571581502490, + 77069149218531, + 21888242871839275222246405745257275088548364400416034343698203699385226159346, + 21888242871839275222246405745257275088548364400416034343698204161296809049478, + 21888242871839275222246405745257275088548364400416034343698204053178229425545, + 433247854063144, + 397046351158241, + 1995138158448, + 21888242871839275222246405745257275088548364400416034343698203932601581575924, + 118607429309436, + 21888242871839275222246405745257275088548364400416034343698204149698881732086, + 254776107249360, + 21888242871839275222246405745257275088548364400416034343698203983921492924037, + 21888242871839275222246405745257275088548364400416034343698203722188945872648, + 103893054500973, + 371618485809969, + 21888242871839275222246405745257275088548364400416034343698203732923705038612, + 21888242871839275222246405745257275088548364400416034343698203828450187512099, + 21888242871839275222246405745257275088548364400416034343698204116347438343443, + 21888242871839275222246405745257275088548364400416034343698203758972312507531, + 56095000412984, + 21888242871839275222246405745257275088548364400416034343698203828810922704176, + 21888242871839275222246405745257275088548364400416034343698203960318121931839, + 270348569475356, + 538044806656956, + 21888242871839275222246405745257275088548364400416034343698203725868778915688, + 301820532927366, + 519050300270308, + 175533148436001, + 185377656255113, + 223807831625099, + 160079280723056, + 21888242871839275222246405745257275088548364400416034343698204004035918867537, + 21888242871839275222246405745257275088548364400416034343698203939636965436608, + 266446230629632, + 21888242871839275222246405745257275088548364400416034343698203818104554111222, + 21888242871839275222246405745257275088548364400416034343698203643315263523370, + 21888242871839275222246405745257275088548364400416034343698203949299701239466, + 167375619678097, + 53841285532841, + 21888242871839275222246405745257275088548364400416034343698203949535315980449, + 21888242871839275222246405745257275088548364400416034343698203881717314545936, + 212275722749401, + 103974947202448, + 21888242871839275222246405745257275088548364400416034343698203994111003499246, + 21888242871839275222246405745257275088548364400416034343698203788544887591170, + 21888242871839275222246405745257275088548364400416034343698203976047708386356, + 21888242871839275222246405745257275088548364400416034343698203956584818672333, + 21888242871839275222246405745257275088548364400416034343698203754556345720504, + 57077681066407, + 352023516541707, + 366630468083053, + 92688218299181, + 463653912864628, + 477836645752534, + 160306979616971, + 21888242871839275222246405745257275088548364400416034343698203727829998902013, + 233715040209812, + 21888242871839275222246405745257275088548364400416034343698204079437561780684, + 21888242871839275222246405745257275088548364400416034343698203666422798652207, + 332185647108875, + 21888242871839275222246405745257275088548364400416034343698203684310755398533, + 21888242871839275222246405745257275088548364400416034343698203662103825941551, + 199844911041614, + 21888242871839275222246405745257275088548364400416034343698204125298437069266, + 21888242871839275222246405745257275088548364400416034343698203702469155427370, + 21888242871839275222246405745257275088548364400416034343698204114838044190526, + 21888242871839275222246405745257275088548364400416034343698203977953734291841, + 21888242871839275222246405745257275088548364400416034343698203803059907334886, + 21888242871839275222246405745257275088548364400416034343698203892459814487844, + 462298911778033, + 191666204533679, + 21888242871839275222246405745257275088548364400416034343698203851560218853504, + 21888242871839275222246405745257275088548364400416034343698204021629424802253, + 21888242871839275222246405745257275088548364400416034343698203790153399444477, + 21888242871839275222246405745257275088548364400416034343698204126660432376320, + 203876677632008, + 21888242871839275222246405745257275088548364400416034343698203676574924200182, + 21888242871839275222246405745257275088548364400416034343698203637216274996877, + 21888242871839275222246405745257275088548364400416034343698204067588006377049, + 348453433429722, + 21888242871839275222246405745257275088548364400416034343698204072197623241389, + 335384347109481, + 21888242871839275222246405745257275088548364400416034343698203939582391042624, + 21888242871839275222246405745257275088548364400416034343698203651729219949451, + 22660990106218, + 152006769577547, + 98821124405630, + 106318326093240, + 92557463137231, + 21888242871839275222246405745257275088548364400416034343698203846463314569671, + 358071655423131, + 21888242871839275222246405745257275088548364400416034343698203900634656801199, + 21888242871839275222246405745257275088548364400416034343698204156316184547049, + 21888242871839275222246405745257275088548364400416034343698203828771022846733, + 21888242871839275222246405745257275088548364400416034343698203950204737339308, + 21888242871839275222246405745257275088548364400416034343698204032346619660190, + 21888242871839275222246405745257275088548364400416034343698203721659915194258, + 21888242871839275222246405745257275088548364400416034343698204176048936207612, + 21888242871839275222246405745257275088548364400416034343698204185477848946378, + 120052728224189, + 21888242871839275222246405745257275088548364400416034343698203845763256658696, + 21888242871839275222246405745257275088548364400416034343698203957644396685334, + 21888242871839275222246405745257275088548364400416034343698204178654664872236, + 21888242871839275222246405745257275088548364400416034343698204017769196412287, + 21888242871839275222246405745257275088548364400416034343698203650823786303132, + 239334393695574, + 21888242871839275222246405745257275088548364400416034343698204104568162771686, + 114699394300727, + 252946261403954, + 21888242871839275222246405745257275088548364400416034343698203981763808274119, + 21888242871839275222246405745257275088548364400416034343698203803239511876833, + 79628418461026, + 443944600164367, + 21888242871839275222246405745257275088548364400416034343698203927676084067675, + 411598238615774, + 544172064632473, + 162348773368618, + 21888242871839275222246405745257275088548364400416034343698203662211085465180, + 477512239621551, + 21888242871839275222246405745257275088548364400416034343698203860932416183852, + 21888242871839275222246405745257275088548364400416034343698203712819020173643, + 541904827261666, + 451091709412324, + 90125744953168, + 448281058266174, + 21888242871839275222246405745257275088548364400416034343698203881250311351586, + 403493277696221, + 313649342141363, + 314766756077034, + 21888242871839275222246405745257275088548364400416034343698203882665096888650, + 21888242871839275222246405745257275088548364400416034343698204185836204751015, + 21888242871839275222246405745257275088548364400416034343698203878401655236440, + 21888242871839275222246405745257275088548364400416034343698203970415269924511, + 19660443760330, + 21888242871839275222246405745257275088548364400416034343698203650924592355240, + 124761473532443, + 480865211712605, + 47113463979661, + 21888242871839275222246405745257275088548364400416034343698203651131785317956, + 21888242871839275222246405745257275088548364400416034343698204059918897602316, + 227577907453139, + 21888242871839275222246405745257275088548364400416034343698204036518857030165, + 238074744122355, + 21888242871839275222246405745257275088548364400416034343698204146121478554054, + 235027686878036, + 21888242871839275222246405745257275088548364400416034343698203711560534121552, + 21888242871839275222246405745257275088548364400416034343698204137864422846351, + 125796350997409, + 475384124606625, + 437168074942362, + 372108910912875, + 218938754039615, + 289472582959160, + 21888242871839275222246405745257275088548364400416034343698203960202569418759, + 21888242871839275222246405745257275088548364400416034343698203687246556233153, + 501123764096097, + 21888242871839275222246405745257275088548364400416034343698204016335213427563, + 21888242871839275222246405745257275088548364400416034343698204134918717075212, + 284479141354285, + 21888242871839275222246405745257275088548364400416034343698204048968214966717, + 133621046374548, + 383231620126407, + 61645193749895, + 21888242871839275222246405745257275088548364400416034343698203956965528971375, + 375526661157954, + 21888242871839275222246405745257275088548364400416034343698203819625376607565, + 528528440648525, + 387964116340802, + 21888242871839275222246405745257275088548364400416034343698204095798791692035, + 21888242871839275222246405745257275088548364400416034343698204106930085622639, + 21888242871839275222246405745257275088548364400416034343698203730653146303026, + 21888242871839275222246405745257275088548364400416034343698203746343699097815, + 21888242871839275222246405745257275088548364400416034343698203702542991788710, + 21888242871839275222246405745257275088548364400416034343698203764476037657885, + 21888242871839275222246405745257275088548364400416034343698203799770914427368, + 21888242871839275222246405745257275088548364400416034343698203952797101573946, + 544718002214927, + 516050104379651, + 247299165525003, + 21888242871839275222246405745257275088548364400416034343698204028252147195611, + 557027700444585, + 455018737007702, + 21888242871839275222246405745257275088548364400416034343698203656271762647035, + 21888242871839275222246405745257275088548364400416034343698203856328816749612, + 167412628351076, + 21888242871839275222246405745257275088548364400416034343698204049195295194167, + 67416135981896, + 21888242871839275222246405745257275088548364400416034343698203935778349168867, + 127119378755323, + 21888242871839275222246405745257275088548364400416034343698203729474522663164, + 292748784848083, + 21888242871839275222246405745257275088548364400416034343698204171887466827066, + 21888242871839275222246405745257275088548364400416034343698204022775709987750, + 408835245054844, + 210683778502352, + 30555683283837, + 21888242871839275222246405745257275088548364400416034343698204057045162033361, + 21888242871839275222246405745257275088548364400416034343698203991548907882602, + 221426013074483, + 385048049278900, + 21888242871839275222246405745257275088548364400416034343698203778748941261068, + 21888242871839275222246405745257275088548364400416034343698203887918010134239, + 21888242871839275222246405745257275088548364400416034343698203989300553545057, + 21888242871839275222246405745257275088548364400416034343698203877007719745115, + 228050151992108, + 520670639875909, + 21888242871839275222246405745257275088548364400416034343698203680609901798040, + 21888242871839275222246405745257275088548364400416034343698203870547940573885, + 21888242871839275222246405745257275088548364400416034343698203964798189151121, + 21888242871839275222246405745257275088548364400416034343698203895022934999943, + 304117736423069, + 330476384404037, + 21888242871839275222246405745257275088548364400416034343698203805112004997235, + 21888242871839275222246405745257275088548364400416034343698203949762873350151, + 21888242871839275222246405745257275088548364400416034343698203782657120419513, + 270778560015353, + 21888242871839275222246405745257275088548364400416034343698203643503360718348, + 252325747717184, + 544451611611928, + 21888242871839275222246405745257275088548364400416034343698203865117105804686, + 21888242871839275222246405745257275088548364400416034343698204110953968664691, + 21888242871839275222246405745257275088548364400416034343698204006088353622673, + 21888242871839275222246405745257275088548364400416034343698204019184074987780, + 21888242871839275222246405745257275088548364400416034343698204064637448028667, + 244316031574132, + 30361512047489, + 21888242871839275222246405745257275088548364400416034343698203823028687433356, + 21888242871839275222246405745257275088548364400416034343698203642344282746544, + 21888242871839275222246405745257275088548364400416034343698203684738294863398, + 21888242871839275222246405745257275088548364400416034343698203797903166623375, + 190127630736285, + 342791787489615, + 21888242871839275222246405745257275088548364400416034343698204035855164908347, + 143578512845838, + 21888242871839275222246405745257275088548364400416034343698203952982557186757, + 21888242871839275222246405745257275088548364400416034343698203864810072385229, + 217863957901205, + 254548743245359, + 21888242871839275222246405745257275088548364400416034343698203700953174276928, + 21888242871839275222246405745257275088548364400416034343698203740711505906020, + 269882682692612, + 21888242871839275222246405745257275088548364400416034343698204011933203767574, + 20368045892722, + 81493134867187, + 398401790552539, + 180023622158286, + 21888242871839275222246405745257275088548364400416034343698204141878059593505, + 244326485989628, + 21888242871839275222246405745257275088548364400416034343698204062251848406351, + 21888242871839275222246405745257275088548364400416034343698203881217783221274, + 21888242871839275222246405745257275088548364400416034343698203945669565407396, + 6051255943193, + 21888242871839275222246405745257275088548364400416034343698203840351990237239, + 556294941970342, + 510122489176920, + 21888242871839275222246405745257275088548364400416034343698203767158407776438, + 493294650891742, + 378833920507321, + 21888242871839275222246405745257275088548364400416034343698203754840781189611, + 21888242871839275222246405745257275088548364400416034343698203734505068784074, + 327353923304002, + 531194592566385, + 21888242871839275222246405745257275088548364400416034343698204093468006296095, + 21888242871839275222246405745257275088548364400416034343698204137807274642326, + 21888242871839275222246405745257275088548364400416034343698204142348055920385, + 794330166487, + 273936877455697, + 417578049621046, + 21888242871839275222246405745257275088548364400416034343698204060658505640226, + 415740402074648, + 21888242871839275222246405745257275088548364400416034343698203825279359141034, + 294366633946142, + 62404676619288, + 21888242871839275222246405745257275088548364400416034343698204138394205885646, + 21888242871839275222246405745257275088548364400416034343698203807937981400589, + 64184342198211, + 256216230138271, + 21888242871839275222246405745257275088548364400416034343698203748433481468817, + 119441403105663, + 517933286334566, + 263510857188666, + 249410796570545, + 74750802164615, + 424796797740903, + 21888242871839275222246405745257275088548364400416034343698203844522043101245, + 156456198759573, + 266860199168956, + 293660142540119, + 21888242871839275222246405745257275088548364400416034343698203878937853240205, + 535763958470295, + 209750440682274, + 116056979766787, + 21888242871839275222246405745257275088548364400416034343698203913083276654349, + 21888242871839275222246405745257275088548364400416034343698203912728205535290, + 420479344261242, + 523449831864286, + 21888242871839275222246405745257275088548364400416034343698203834338692620567, + 91472285074782, + 206617848663359, + 107362482073321, + 429938215231260, + 178522840321710, + 274070622922550, + 452529164448715, + 21888242871839275222246405745257275088548364400416034343698204113003237376708, + 339038805137295, + 125284739151648, + 21888242871839275222246405745257275088548364400416034343698203943372208678612, + 21888242871839275222246405745257275088548364400416034343698203965310264464836, + 21888242871839275222246405745257275088548364400416034343698204065891703042030, + 205859955389239, + 21888242871839275222246405745257275088548364400416034343698204048691830165702, + 128197297222970, + 484255784104224, + 21888242871839275222246405745257275088548364400416034343698203931576837195696, + 68282396492201, + 21888242871839275222246405745257275088548364400416034343698203981970489564930, + 21888242871839275222246405745257275088548364400416034343698204122684750817848, + 21888242871839275222246405745257275088548364400416034343698203938949350627066, + 166673325276894, + 21888242871839275222246405745257275088548364400416034343698203693843932954849, + 21888242871839275222246405745257275088548364400416034343698204003770796114293, + 21888242871839275222246405745257275088548364400416034343698203646391110705225, + 65383050223281, + 21888242871839275222246405745257275088548364400416034343698203902486654576095, + 21888242871839275222246405745257275088548364400416034343698203783183163394208, + 105541400867199, + 21888242871839275222246405745257275088548364400416034343698203905489087842141, + 145133832292161, + 536609364116961, + 4692396686479, + 21888242871839275222246405745257275088548364400416034343698203751550601422693, + 21888242871839275222246405745257275088548364400416034343698203629167407256517, + 21888242871839275222246405745257275088548364400416034343698203798348298422522, + 480385900138561, + 519292312011089, + 21888242871839275222246405745257275088548364400416034343698203707640224067575, + 342224904258540, + 21888242871839275222246405745257275088548364400416034343698204088048105190880, + 21888242871839275222246405745257275088548364400416034343698204056549782505421, + 20002346637512, + 21888242871839275222246405745257275088548364400416034343698204005437351028119, + 21888242871839275222246405745257275088548364400416034343698204139224103451715, + 21888242871839275222246405745257275088548364400416034343698204117875191360665, + 532690156024485, + 21888242871839275222246405745257275088548364400416034343698203724369559297678, + 21888242871839275222246405745257275088548364400416034343698203855678850702942, + 399609816823883, + 49467195878877, + 21888242871839275222246405745257275088548364400416034343698204101113222613643, + 365803314618280, + 479096779151839, + 57289053897654, + 21888242871839275222246405745257275088548364400416034343698203992902700924430, + 468022236260701, + 79527026370103, + 158877871602054, + 155601364777775, + 21888242871839275222246405745257275088548364400416034343698204159188279096371, + 240812026082465, + 159905332902675, + 281075466054413, + 21888242871839275222246405745257275088548364400416034343698203822587336667266, + 21888242871839275222246405745257275088548364400416034343698204058129018945945, + 21888242871839275222246405745257275088548364400416034343698203780789515367310, + 21888242871839275222246405745257275088548364400416034343698203767744448205325, + 317257344898989, + 21888242871839275222246405745257275088548364400416034343698203783137272383797, + 21888242871839275222246405745257275088548364400416034343698203751932383768553, + 414341029771686, + 308135022291524, + 223663357269938, + 21888242871839275222246405745257275088548364400416034343698203669879736808393, + 333315048317584, + 21888242871839275222246405745257275088548364400416034343698203933556991758725, + 21888242871839275222246405745257275088548364400416034343698203744048838351332, + 543359395100543, + 21888242871839275222246405745257275088548364400416034343698204170874215742910, + 21888242871839275222246405745257275088548364400416034343698204126106392688366, + 333450158449082, + 21888242871839275222246405745257275088548364400416034343698203831384580660611, + 21888242871839275222246405745257275088548364400416034343698204033165596162655, + 381734939422134, + 163975926394267, + 21888242871839275222246405745257275088548364400416034343698204184787538294310, + 423889015130901, + 21888242871839275222246405745257275088548364400416034343698203718286262122592, + 21888242871839275222246405745257275088548364400416034343698203801515360004261, + 11617666805760, + 469083555479055, + 32446801555153, + 108544657199263, + 21888242871839275222246405745257275088548364400416034343698203963798373887227, + 257654348646064, + 21888242871839275222246405745257275088548364400416034343698204027127384173940, + 21888242871839275222246405745257275088548364400416034343698203853769938749600, + 471345607179012, + 21888242871839275222246405745257275088548364400416034343698204092294175794502, + 13818927181796, + 284537063198191, + 21888242871839275222246405745257275088548364400416034343698203669473572524806, + 21888242871839275222246405745257275088548364400416034343698203966281481734408, + 21888242871839275222246405745257275088548364400416034343698204085090894144118, + 38233169069479, + 21888242871839275222246405745257275088548364400416034343698203668045822166640, + 539808140950432, + 238925632670146, + 140009620076089, + 21888242871839275222246405745257275088548364400416034343698204099805456700919, + 556066341448799, + 221724862488829, + 97158053703292, + 127241744641491, + 21888242871839275222246405745257275088548364400416034343698204185327202145212, + 21888242871839275222246405745257275088548364400416034343698204180238549302294, + 21888242871839275222246405745257275088548364400416034343698203826771650672926, + 21888242871839275222246405745257275088548364400416034343698203876195169214101, + 21888242871839275222246405745257275088548364400416034343698203850958412831340, + 297229588634042, + 21888242871839275222246405745257275088548364400416034343698203862811576349391, + 301893531872841, + 21888242871839275222246405745257275088548364400416034343698203928379760933950, + 21888242871839275222246405745257275088548364400416034343698203743673830600947, + 123484909431987, + 21888242871839275222246405745257275088548364400416034343698204078752826438868, + 21888242871839275222246405745257275088548364400416034343698203988571071265752, + 21888242871839275222246405745257275088548364400416034343698204051041522690187, + 153644531445213, + 448024621994792, + 447745786745222, + 149599654959925, + 457011967865066, + 126626443490114, + 21888242871839275222246405745257275088548364400416034343698203636137247525195, + 558478983376007, + 21888242871839275222246405745257275088548364400416034343698203712169564987866, + 21888242871839275222246405745257275088548364400416034343698203935353460072004, + 21888242871839275222246405745257275088548364400416034343698203784935760654027, + 21888242871839275222246405745257275088548364400416034343698203846363711695811, + 21888242871839275222246405745257275088548364400416034343698203656892298442222, + 21888242871839275222246405745257275088548364400416034343698204083321510920171, + 550287719130220, + 21888242871839275222246405745257275088548364400416034343698204080363611396696, + 110970518378400, + 21888242871839275222246405745257275088548364400416034343698204071094608892239, + 21888242871839275222246405745257275088548364400416034343698203918103142091354, + 431930708068974, + 21888242871839275222246405745257275088548364400416034343698203962804992594496, + 122930570124083, + 556559749537470, + 21888242871839275222246405745257275088548364400416034343698203685747457780908, + 516740153705386, + 21888242871839275222246405745257275088548364400416034343698203814723307254735, + 21888242871839275222246405745257275088548364400416034343698204126269832793562, + 21888242871839275222246405745257275088548364400416034343698204019985993097095, + 80440339027229, + 21888242871839275222246405745257275088548364400416034343698204097127933626932, + 21888242871839275222246405745257275088548364400416034343698203656462015099811, + 21888242871839275222246405745257275088548364400416034343698203919203469976011, + 21888242871839275222246405745257275088548364400416034343698203624813759162765, + 37061136431481, + 21888242871839275222246405745257275088548364400416034343698203915809135293532, + 538809439245278, + 266531342114416, + 410960644306047, + 21888242871839275222246405745257275088548364400416034343698203969456823968905, + 459463471385427, + 127902986136768, + 541754306381763, + 115558746464224, + 21888242871839275222246405745257275088548364400416034343698203774107709160366, + 21888242871839275222246405745257275088548364400416034343698203700490934409084, + 20765236744804, + 304124313595505, + 21888242871839275222246405745257275088548364400416034343698203908851937703967, + 555066116593175, + 21888242871839275222246405745257275088548364400416034343698203829403804715684, + 21888242871839275222246405745257275088548364400416034343698204065703957686695, + 382930380530616, + 21888242871839275222246405745257275088548364400416034343698203674324024363279, + 492110983822210, + 39202183193035, + 562468170358644, + 21888242871839275222246405745257275088548364400416034343698203695480958482493, + 296042088728548, + 21888242871839275222246405745257275088548364400416034343698203646027466164473, + 21888242871839275222246405745257275088548364400416034343698204179485332727078, + 21888242871839275222246405745257275088548364400416034343698203842838613268827, + 21888242871839275222246405745257275088548364400416034343698203930111410371705, + 331219381439085, + 233999452033217, + 21888242871839275222246405745257275088548364400416034343698203949843180816582, + 21888242871839275222246405745257275088548364400416034343698203637595438613365, + 485548937266416, + 21888242871839275222246405745257275088548364400416034343698203818063414276234, + 21888242871839275222246405745257275088548364400416034343698204158561508588199, + 21888242871839275222246405745257275088548364400416034343698203799258974714634, + 409698601257035, + 21888242871839275222246405745257275088548364400416034343698203640804788608388, + 459952516208810, + 477026888774782, + 21888242871839275222246405745257275088548364400416034343698204040813587306809, + 346853323749187, + 21888242871839275222246405745257275088548364400416034343698203874246573781762, + 21888242871839275222246405745257275088548364400416034343698203624310455604623, + 103538009395592, + 488296454548066, + 21888242871839275222246405745257275088548364400416034343698204021446161755011, + 518411948083733, + 554427203714825, + 53672740050455, + 459060805535341, + 21888242871839275222246405745257275088548364400416034343698203705262906623634, + 309019602363659, + 385256880415263, + 21888242871839275222246405745257275088548364400416034343698204030195618220220, + 21888242871839275222246405745257275088548364400416034343698204044310645525568, + 134353137025634, + 305842189234461, + 21888242871839275222246405745257275088548364400416034343698203768287002186099, + 401506805354889, + 158682658993048, + 21888242871839275222246405745257275088548364400416034343698204020605690230929, + 21888242871839275222246405745257275088548364400416034343698203808320112140111, + 461521130062129, + 244258943821111, + 21888242871839275222246405745257275088548364400416034343698204118048602690189, + 21888242871839275222246405745257275088548364400416034343698203999361373850142, + 477878667858864, + 21888242871839275222246405745257275088548364400416034343698203644916842378842, + 362707614448908, + 363984157358804, + 429478557162877, + 21888242871839275222246405745257275088548364400416034343698204115309008343536, + 21888242871839275222246405745257275088548364400416034343698203751209762023501, + 21888242871839275222246405745257275088548364400416034343698203729172156699773, + 21888242871839275222246405745257275088548364400416034343698204100711127342137, + 21888242871839275222246405745257275088548364400416034343698203885532707523569, + 106465809078001, + 21888242871839275222246405745257275088548364400416034343698203794658233538132, + 21888242871839275222246405745257275088548364400416034343698203671820776740972, + 21888242871839275222246405745257275088548364400416034343698204017199451608503, + 277364931288790, + 21888242871839275222246405745257275088548364400416034343698203977144541605297, + 371837081554478, + 85085208475505, + 3707830287864, + 21888242871839275222246405745257275088548364400416034343698203977925400883970, + 132806077353032, + 448455108171993, + 124097402857597, + 469137320629021, + 21888242871839275222246405745257275088548364400416034343698204091879371330241, + 21888242871839275222246405745257275088548364400416034343698204136356403340048, + 295531315360489, + 279878684874145, + 63605946323025, + 233020489205782, + 21888242871839275222246405745257275088548364400416034343698204172051421576534, + 21888242871839275222246405745257275088548364400416034343698203811149714502776, + 338532193225871, + 21888242871839275222246405745257275088548364400416034343698203996800485745330, + 21888242871839275222246405745257275088548364400416034343698203818407011177524, + 21888242871839275222246405745257275088548364400416034343698203845054948066019, + 409237890829309, + 21888242871839275222246405745257275088548364400416034343698203809684852668304, + 21888242871839275222246405745257275088548364400416034343698203826684899511242, + 84570568606843, + 417416812358374, + 21888242871839275222246405745257275088548364400416034343698204107114771136903, + 21888242871839275222246405745257275088548364400416034343698203863111464122222, + 21888242871839275222246405745257275088548364400416034343698203646620826844834, + 21888242871839275222246405745257275088548364400416034343698203791443983519452, + 21888242871839275222246405745257275088548364400416034343698204142213042486475, + 21888242871839275222246405745257275088548364400416034343698203720609101088974, + 21888242871839275222246405745257275088548364400416034343698203696586965676103, + 21888242871839275222246405745257275088548364400416034343698203926411046551063, + 21888242871839275222246405745257275088548364400416034343698203990722900013674, + 475310413408906, + 21888242871839275222246405745257275088548364400416034343698203642649772105759, + 21888242871839275222246405745257275088548364400416034343698203867376231031804, + 495792999780074, + 21888242871839275222246405745257275088548364400416034343698203688363214861361, + 162986985230618, + 179807954852380, + 396624406675971, + 395581972440126, + 21888242871839275222246405745257275088548364400416034343698203738775317497662, + 21888242871839275222246405745257275088548364400416034343698203932909815824729, + 178719666294938, + 21888242871839275222246405745257275088548364400416034343698203922408645288641, + 21888242871839275222246405745257275088548364400416034343698203809882980563425, + 397181189394189, + 21888242871839275222246405745257275088548364400416034343698204180912001047058, + 21888242871839275222246405745257275088548364400416034343698203878157106200518, + 21888242871839275222246405745257275088548364400416034343698203970790414098944, + 217101593595691, + 21888242871839275222246405745257275088548364400416034343698204104300386223909, + 404104970385913, + 64909703320533, + 539057510680041, + 21888242871839275222246405745257275088548364400416034343698203831463576648362, + 21888242871839275222246405745257275088548364400416034343698203850023484720796, + 21888242871839275222246405745257275088548364400416034343698204076899942446936, + 21888242871839275222246405745257275088548364400416034343698203753365584086862, + 225141567946430, + 175201405228760, + 21888242871839275222246405745257275088548364400416034343698203626612687827008, + 491834080441015, + 178442355540900, + 21888242871839275222246405745257275088548364400416034343698203907985830401747, + 21888242871839275222246405745257275088548364400416034343698204184872996402179, + 21888242871839275222246405745257275088548364400416034343698204093398783524791, + 196388793675535, + 21888242871839275222246405745257275088548364400416034343698203647286066487196, + 21888242871839275222246405745257275088548364400416034343698203694599179249517, + 21888242871839275222246405745257275088548364400416034343698203891168570192796, + 21888242871839275222246405745257275088548364400416034343698204152134626439037, + 21888242871839275222246405745257275088548364400416034343698203819130831838538, + 230939917093927, + 21888242871839275222246405745257275088548364400416034343698203982578821626290, + 21888242871839275222246405745257275088548364400416034343698203789418370240708, + 21888242871839275222246405745257275088548364400416034343698204118392198619779, + 131746878757137, + 350144064260343, + 21888242871839275222246405745257275088548364400416034343698203807019505082176, + 20250234303326, + 21888242871839275222246405745257275088548364400416034343698203855569352681009, + 306625218237622, + 495457845221720, + 349418603723828, + 21888242871839275222246405745257275088548364400416034343698203902904322590247, + 434436078201337, + 21888242871839275222246405745257275088548364400416034343698203884071393548890, + 21888242871839275222246405745257275088548364400416034343698204059990398377095, + 21888242871839275222246405745257275088548364400416034343698203832712368772348, + 201591001152660, + 491317178177571, + 225726444352002, + 21888242871839275222246405745257275088548364400416034343698203929264808148062, + 534633983209739, + 21888242871839275222246405745257275088548364400416034343698203653410458575086, + 148389988319900, + 129150760264628, + 356848124477446, + 21888242871839275222246405745257275088548364400416034343698204159561931957099, + 21888242871839275222246405745257275088548364400416034343698203969014059205799, + 21888242871839275222246405745257275088548364400416034343698203919810145786168, + 203573078443474, + 438501586732888, + 21888242871839275222246405745257275088548364400416034343698204049517701109618, + 21888242871839275222246405745257275088548364400416034343698203772085342153867, + 427281125821672, + 333213766703618, + 21888242871839275222246405745257275088548364400416034343698203734600857116954, + 436037943428645, + 441575434450554, + 21888242871839275222246405745257275088548364400416034343698203993565999523935, + 451075800558837, + 21888242871839275222246405745257275088548364400416034343698204158513579982954, + 21888242871839275222246405745257275088548364400416034343698203976766690749426, + 21888242871839275222246405745257275088548364400416034343698203892059248267378, + 186928981544105, + 21888242871839275222246405745257275088548364400416034343698203985088448828726, + 21888242871839275222246405745257275088548364400416034343698204074846452567938, + 133886983324118, + 437762988731370, + 96635590777889, + 21888242871839275222246405745257275088548364400416034343698203947724644945258, + 21888242871839275222246405745257275088548364400416034343698203694483085968452, + 21888242871839275222246405745257275088548364400416034343698203675712178345996, + 21888242871839275222246405745257275088548364400416034343698204063760403488912, + 137723527368575, + 21888242871839275222246405745257275088548364400416034343698203742240734189483, + 21888242871839275222246405745257275088548364400416034343698203688074353374246, + 560450765164992, + 450162127897062, + 224831741745764, + 398158988979855, + 21888242871839275222246405745257275088548364400416034343698204022882624373438, + 21888242871839275222246405745257275088548364400416034343698204001219289497611, + 21888242871839275222246405745257275088548364400416034343698204020987126475541, + 323244515500593, + 153403522552471, + 359771888027147, + 439395474281197, + 342101161151592, + 21888242871839275222246405745257275088548364400416034343698203940293640282580, + 21888242871839275222246405745257275088548364400416034343698204099039164612463, + 21888242871839275222246405745257275088548364400416034343698203963272442949203, + 21888242871839275222246405745257275088548364400416034343698203660356392587609, + 21888242871839275222246405745257275088548364400416034343698203932668516912472, + 21888242871839275222246405745257275088548364400416034343698203839882901545442, + 45659148092421, + 83996536225644, + 345601200848254, + 388180404446062, + 407913860959930, + 377239554501485, + 21888242871839275222246405745257275088548364400416034343698204056620342053351, + 545971386316289, + 381268134012653, + 381216058853227, + 21888242871839275222246405745257275088548364400416034343698204030906064784267, + 523596468545936, + 21888242871839275222246405745257275088548364400416034343698203689785655570253, + 335108820039925, + 70953111342343, + 21888242871839275222246405745257275088548364400416034343698204176148379061584, + 21888242871839275222246405745257275088548364400416034343698203873649854623832, + 499890141516565, + 407037419316495, + 418716001285957, + 18165564173549, + 323277451529078, + 44986176421623, + 21888242871839275222246405745257275088548364400416034343698203878680311260742, + 21888242871839275222246405745257275088548364400416034343698204177897382558979, + 21888242871839275222246405745257275088548364400416034343698203998319772124404, + 21888242871839275222246405745257275088548364400416034343698203731206521197424, + 154859949047398, + 400003570786341, + 22425073898140, + 21888242871839275222246405745257275088548364400416034343698204081583171957570, + 21888242871839275222246405745257275088548364400416034343698203672476179503306, + 483389707381939, + 509896083561452, + 204831039776768, + 21888242871839275222246405745257275088548364400416034343698204034258705032491, + 21888242871839275222246405745257275088548364400416034343698203756883668200227, + 21888242871839275222246405745257275088548364400416034343698203995942609760510, + 21888242871839275222246405745257275088548364400416034343698203911111391673171, + 21888242871839275222246405745257275088548364400416034343698204004259085730914, + 246929864319639, + 21888242871839275222246405745257275088548364400416034343698204166913831491717, + 21888242871839275222246405745257275088548364400416034343698204128860510479593, + 325621660929291, + 21888242871839275222246405745257275088548364400416034343698203736177158996412, + 21888242871839275222246405745257275088548364400416034343698203630267429185637, + 106968181889501, + 21888242871839275222246405745257275088548364400416034343698203649544487044969, + 542866444455135, + 21888242871839275222246405745257275088548364400416034343698203834591661412281, + 247088376517439, + 542369621743905, + 491582067533361, + 21888242871839275222246405745257275088548364400416034343698203998079926137553, + 21888242871839275222246405745257275088548364400416034343698204024960287377341, + 409119992952442, + 21888242871839275222246405745257275088548364400416034343698204052632863771686, + 21888242871839275222246405745257275088548364400416034343698203840859411399534, + 510524191333296, + 21888242871839275222246405745257275088548364400416034343698204000775257609764, + 21888242871839275222246405745257275088548364400416034343698204131877619584719, + 21888242871839275222246405745257275088548364400416034343698203725113028881138, + 21888242871839275222246405745257275088548364400416034343698204057372200988918, + 21888242871839275222246405745257275088548364400416034343698203681210772414623, + 215585196641554, + 555985902979806, + 21888242871839275222246405745257275088548364400416034343698203858899738546776, + 21888242871839275222246405745257275088548364400416034343698203812292548593249, + 21888242871839275222246405745257275088548364400416034343698204028548931943701, + 195612333057186, + 127520588714018, + 382737240586288, + 21888242871839275222246405745257275088548364400416034343698203848305984374178, + 110483112696748, + 369006803490960, + 21888242871839275222246405745257275088548364400416034343698204127688834142884, + 449867186809489, + 21888242871839275222246405745257275088548364400416034343698203633293190374898, + 306707065504020, + 32688462530463, + 21888242871839275222246405745257275088548364400416034343698203650386329918513, + 21888242871839275222246405745257275088548364400416034343698203920950158400774, + 119914365732729, + 21888242871839275222246405745257275088548364400416034343698203796946024752137, + 21888242871839275222246405745257275088548364400416034343698203953046418951446, + 122725897407220, + 518314336653175, + 250593416388501, + 302171633527159, + 21888242871839275222246405745257275088548364400416034343698203731016139469109, + 39620541658864, + 68720030518518, + 21888242871839275222246405745257275088548364400416034343698204048652822008064, + 248382469654729, + 21888242871839275222246405745257275088548364400416034343698203892357496859962, + 28847702690210, + 21888242871839275222246405745257275088548364400416034343698204005036591962911, + 354917341424771, + 378998735055553, + 559813564460027, + 326628153641531, + 129104565236536, + 21888242871839275222246405745257275088548364400416034343698204068137929647282, + 347735255243027, + 282598379259883, + 21888242871839275222246405745257275088548364400416034343698204011603222542230, + 500344617653357, + 205918389622100, + 21888242871839275222246405745257275088548364400416034343698203963778464515733, + 21888242871839275222246405745257275088548364400416034343698203813849022627399, + 21888242871839275222246405745257275088548364400416034343698203740737486231552, + 21888242871839275222246405745257275088548364400416034343698204171562333049542, + 21888242871839275222246405745257275088548364400416034343698203756946460744832, + 409891047302634, + 387890280163297, + 21888242871839275222246405745257275088548364400416034343698203910361164916097, + 21888242871839275222246405745257275088548364400416034343698203955492975298797, + 21888242871839275222246405745257275088548364400416034343698204035602785181584, + 92257167980496, + 21888242871839275222246405745257275088548364400416034343698203794621644533089, + 363341307202745, + 21888242871839275222246405745257275088548364400416034343698203857553488536801, + 481680618889014, + 21888242871839275222246405745257275088548364400416034343698203863409521094417, + 268780975799823, + 489764650347580, + 21888242871839275222246405745257275088548364400416034343698203969612203130581, + 139415142469226, + 21888242871839275222246405745257275088548364400416034343698203999556820305109, + 21888242871839275222246405745257275088548364400416034343698203797358628832493, + 487132816824060, + 79022392889351, + 76608903106371, + 21888242871839275222246405745257275088548364400416034343698203711008698544007, + 387696327632004, + 21888242871839275222246405745257275088548364400416034343698204163578760287818, + 21888242871839275222246405745257275088548364400416034343698203699121051820933, + 441200965995213, + 21888242871839275222246405745257275088548364400416034343698203677601890863391, + 177694976002406, + 21888242871839275222246405745257275088548364400416034343698203760152372239932, + 48026627986546, + 10304592432371, + 445399623762118, + 65715059409829, + 541485147380459, + 21888242871839275222246405745257275088548364400416034343698204114836858699173, + 474735284463084, + 21888242871839275222246405745257275088548364400416034343698203743557360985452, + 34533248066119, + 21888242871839275222246405745257275088548364400416034343698203924634156395733, + 21888242871839275222246405745257275088548364400416034343698204000470643660686, + 348699430995790, + 21888242871839275222246405745257275088548364400416034343698203915210887979498, + 21888242871839275222246405745257275088548364400416034343698203823764882855278, + 21888242871839275222246405745257275088548364400416034343698203642922157289668, + 386098580508517, + 54517613081195, + 396106034014356, + 514886193644137, + 442535992509277, + 21888242871839275222246405745257275088548364400416034343698204059386336881684, + 234732519122370, + 113613409626336, + 48834704002353, + 21888242871839275222246405745257275088548364400416034343698203993360311076961, + 287672887961638, + 103677330970470, + 87414582524188, + 57374298190290, + 21888242871839275222246405745257275088548364400416034343698203753370726169460, + 75337297471286, + 186961447393549, + 167533366120507, + 21888242871839275222246405745257275088548364400416034343698203996724647666617, + 74918899423910, + 520560366698236, + 21888242871839275222246405745257275088548364400416034343698203866885748411030, + 21888242871839275222246405745257275088548364400416034343698203750749022863240, + 21888242871839275222246405745257275088548364400416034343698203831883577207444, + 53735120354785, + 21888242871839275222246405745257275088548364400416034343698203748952797034032, + 21888242871839275222246405745257275088548364400416034343698203900851324646857, + 439397424479145, + 21888242871839275222246405745257275088548364400416034343698204096403236848846, + 21888242871839275222246405745257275088548364400416034343698203900573287045439, + 21888242871839275222246405745257275088548364400416034343698203906208164782241, + 291042220102208, + 304828227957426, + 21888242871839275222246405745257275088548364400416034343698203889477883082668, + 21888242871839275222246405745257275088548364400416034343698203684867784209407, + 275438265009322, + 558858429784749, + 127358750906051, + 21888242871839275222246405745257275088548364400416034343698203930078479993041, + 21888242871839275222246405745257275088548364400416034343698203704260382029950, + 21888242871839275222246405745257275088548364400416034343698203802858346826391, + 21888242871839275222246405745257275088548364400416034343698203655465666920890, + 21888242871839275222246405745257275088548364400416034343698203876673832129708, + 21888242871839275222246405745257275088548364400416034343698203999497123108455, + 21888242871839275222246405745257275088548364400416034343698204011437570346880, + 21888242871839275222246405745257275088548364400416034343698203881858740888816, + 29795474243257, + 108512499140868, + 21888242871839275222246405745257275088548364400416034343698203697471304212047, + 293942236406991, + 232102313929412, + 506042600960006, + 100587853983223, + 21888242871839275222246405745257275088548364400416034343698203712632746726091, + 99946132603601, + 21888242871839275222246405745257275088548364400416034343698203688166241875224, + 82013310252957, + 21888242871839275222246405745257275088548364400416034343698203908236407304981, + 356021338055633, + 21888242871839275222246405745257275088548364400416034343698203869811520046625, + 28192493061858, + 202772123451101, + 48099988694527, + 50577326581010, + 21888242871839275222246405745257275088548364400416034343698203666945397692545, + 349757701778933, + 21888242871839275222246405745257275088548364400416034343698204028193846826218, + 407148611211850, + 21888242871839275222246405745257275088548364400416034343698203678543753109033, + 21888242871839275222246405745257275088548364400416034343698203973022273073957, + 207189774884379, + 52034597392629, + 21888242871839275222246405745257275088548364400416034343698203963766377827314, + 21888242871839275222246405745257275088548364400416034343698203925418636077725, + 21888242871839275222246405745257275088548364400416034343698203835581063673426, + 368054476057188, + 21888242871839275222246405745257275088548364400416034343698203950552789288272, + 21888242871839275222246405745257275088548364400416034343698203969343927937091, + 366987328330512, + 47787286985927, + 500409196745805, + 500525938091013, + 316265374146006, + 21888242871839275222246405745257275088548364400416034343698204019986872373450, + 21888242871839275222246405745257275088548364400416034343698203808796776469098, + 21888242871839275222246405745257275088548364400416034343698203786915390759996, + 409279771577815, + 138492454965135, + 21888242871839275222246405745257275088548364400416034343698203828631044517151, + 551598433548620, + 21888242871839275222246405745257275088548364400416034343698203742248158099222, + 21888242871839275222246405745257275088548364400416034343698203997444028555055, + 21888242871839275222246405745257275088548364400416034343698203817933388947448, + 21888242871839275222246405745257275088548364400416034343698203943168469156785, + 21888242871839275222246405745257275088548364400416034343698203648098956095137, + 81789115866894, + 21888242871839275222246405745257275088548364400416034343698204130129396169875, + 449747253771356, + 117591096742778, + 182985278902862, + 21888242871839275222246405745257275088548364400416034343698203668401533262259, + 39896238946904, + 21888242871839275222246405745257275088548364400416034343698203683635472238434, + 152887013584290, + 114599771296541, + 349080402660205, + 21888242871839275222246405745257275088548364400416034343698203658257939793878, + 497922626404527, + 21888242871839275222246405745257275088548364400416034343698204144643362031407, + 21888242871839275222246405745257275088548364400416034343698204141345051669173, + 21888242871839275222246405745257275088548364400416034343698203747207246684689, + 178303512135115, + 21888242871839275222246405745257275088548364400416034343698203802941068473941, + 448591572274643, + 446973615393688, + 21888242871839275222246405745257275088548364400416034343698203789570138458693, + 21888242871839275222246405745257275088548364400416034343698203913158441289498, + 21888242871839275222246405745257275088548364400416034343698203961969642927331, + 21888242871839275222246405745257275088548364400416034343698203798792154002793, + 21888242871839275222246405745257275088548364400416034343698204090064536325434, + 21888242871839275222246405745257275088548364400416034343698203933519995778381, + 142535708428921, + 374020462051976, + 130660697302438, + 21888242871839275222246405745257275088548364400416034343698204084795235063554, + 21888242871839275222246405745257275088548364400416034343698204180188752358363, + 21888242871839275222246405745257275088548364400416034343698203831070092169369, + 296030469154819, + 21888242871839275222246405745257275088548364400416034343698203941027849181651, + 21888242871839275222246405745257275088548364400416034343698203892848575357260, + 6375428296895, + 266170723653189, + 21888242871839275222246405745257275088548364400416034343698203664502488800700, + 258330741470457, + 21888242871839275222246405745257275088548364400416034343698203742429629614213, + 332821463340790, + 369590704659023, + 342652255763555, + 21888242871839275222246405745257275088548364400416034343698204055737147299378, + 268980315265195, + 108426126102174, + 491396653520725, + 21888242871839275222246405745257275088548364400416034343698203714890720454049, + 336046492613808, + 21888242871839275222246405745257275088548364400416034343698204160447383072895, + 292152556850677, + 21888242871839275222246405745257275088548364400416034343698203798847962044388, + 21888242871839275222246405745257275088548364400416034343698203637494867452257, + 510843521915593, + 21888242871839275222246405745257275088548364400416034343698203785847551381690, + 21888242871839275222246405745257275088548364400416034343698204027149136072086, + 305362614049384, + 420378120676358, + 21888242871839275222246405745257275088548364400416034343698204041705655832646, + 126721679992578, + 64661323434802, + 21888242871839275222246405745257275088548364400416034343698203957295077349864, + 51752506927431, + 21888242871839275222246405745257275088548364400416034343698203710628443635156, + 21888242871839275222246405745257275088548364400416034343698203821745556964668, + 514084058901036, + 21888242871839275222246405745257275088548364400416034343698203818477655239391, + 21888242871839275222246405745257275088548364400416034343698204052123904521556, + 21888242871839275222246405745257275088548364400416034343698203699436186278988, + 113814440446536, + 77279221905750, + 21888242871839275222246405745257275088548364400416034343698204100508845007815, + 327959977537795, + 21888242871839275222246405745257275088548364400416034343698203915830864680346, + 21888242871839275222246405745257275088548364400416034343698203953401897207638, + 302612346368582, + 21888242871839275222246405745257275088548364400416034343698203923858298079821, + 21888242871839275222246405745257275088548364400416034343698204095268572109329, + 21888242871839275222246405745257275088548364400416034343698203985097707256664, + 21888242871839275222246405745257275088548364400416034343698203739855974538293, + 21888242871839275222246405745257275088548364400416034343698204104189628588952, + 21888242871839275222246405745257275088548364400416034343698204116382855170502, + 21888242871839275222246405745257275088548364400416034343698203755855542067153, + 499790399254770, + 366011173069380, + 407459470384969, + 21888242871839275222246405745257275088548364400416034343698203754073925204657, + 21888242871839275222246405745257275088548364400416034343698204134043410509288, + 21888242871839275222246405745257275088548364400416034343698204068414567491274, + 21888242871839275222246405745257275088548364400416034343698203725400038928877, + 21888242871839275222246405745257275088548364400416034343698203763442253955758, + 30324052087269, + 320523106412428, + 425869768828872, + 131781910433551, + 21888242871839275222246405745257275088548364400416034343698203702990473422548, + 26209145700703, + 21888242871839275222246405745257275088548364400416034343698203886124034391233, + 169649000353935, + 123613811748723, + 343541054006584, + 21888242871839275222246405745257275088548364400416034343698203629943954031154, + 21888242871839275222246405745257275088548364400416034343698203672524786354671, + 248038121811304, + 558559909272222, + 37558979761189, + 21888242871839275222246405745257275088548364400416034343698204042761899467453, + 21888242871839275222246405745257275088548364400416034343698203972951671508900, + 21888242871839275222246405745257275088548364400416034343698203881182999960562, + 21888242871839275222246405745257275088548364400416034343698203788433984747804, + 214533495610406, + 85512439777604, + 21888242871839275222246405745257275088548364400416034343698203948662536653580, + 98025351834447, + 21888242871839275222246405745257275088548364400416034343698203691646744856412, + 21888242871839275222246405745257275088548364400416034343698203976056101480959, + 267822209444390, + 21888242871839275222246405745257275088548364400416034343698203803680844898729, + 21888242871839275222246405745257275088548364400416034343698204186316768547975, + 21888242871839275222246405745257275088548364400416034343698204168026002734359, + 476432778010091, + 21888242871839275222246405745257275088548364400416034343698203746411845749617, + 535294966673078, + 21888242871839275222246405745257275088548364400416034343698203737196270485518, + 21888242871839275222246405745257275088548364400416034343698204153270829410501, + 416269088284117, + 21888242871839275222246405745257275088548364400416034343698204067802011119955, + 428941323655402, + 21888242871839275222246405745257275088548364400416034343698204044254262823744, + 42220871581730, + 21888242871839275222246405745257275088548364400416034343698203965478994405602, + 334387880442489, + 423543803265362, + 21888242871839275222246405745257275088548364400416034343698203683392050676135, + 403388471441298, + 21888242871839275222246405745257275088548364400416034343698203681728006504051, + 21888242871839275222246405745257275088548364400416034343698203633719367524669, + 21888242871839275222246405745257275088548364400416034343698203631980088810618, + 21888242871839275222246405745257275088548364400416034343698203641131035122695, + 405971834831229, + 21888242871839275222246405745257275088548364400416034343698203810948342366884, + 21888242871839275222246405745257275088548364400416034343698203799143999141588, + 134289989551069, + 24435098027794, + 452296704780448, + 21888242871839275222246405745257275088548364400416034343698203810663462013261, + 21888242871839275222246405745257275088548364400416034343698203769214660270686, + 21888242871839275222246405745257275088548364400416034343698203863730054408191, + 62051461040685, + 21888242871839275222246405745257275088548364400416034343698203761495117565592, + 544752340540685, + 159851150829197, + 21888242871839275222246405745257275088548364400416034343698203899103528909243, + 21888242871839275222246405745257275088548364400416034343698203941173924481893, + 216014962357703, + 399896163388336, + 21888242871839275222246405745257275088548364400416034343698203988964461059930, + 21888242871839275222246405745257275088548364400416034343698203920420989556370, + 21888242871839275222246405745257275088548364400416034343698203642148642711176, + 515498157569651, + 21888242871839275222246405745257275088548364400416034343698203648403769043205, + 21888242871839275222246405745257275088548364400416034343698204183911612343349, + 21888242871839275222246405745257275088548364400416034343698204030597093725778, + 72171802077940, + 21888242871839275222246405745257275088548364400416034343698203776682701148536, + 21888242871839275222246405745257275088548364400416034343698204155165022491697, + 202034124983725, + 303245609605233, + 78053539465722, + 21888242871839275222246405745257275088548364400416034343698203665854262902458, + 499104309571568, + 21888242871839275222246405745257275088548364400416034343698203651592074316823, + 426177791089886, + 17100790124897, + 473761991500478, + 21888242871839275222246405745257275088548364400416034343698203788220520064424, + 21888242871839275222246405745257275088548364400416034343698204073159226876527, + 21888242871839275222246405745257275088548364400416034343698204180381968610470, + 21888242871839275222246405745257275088548364400416034343698204002417452439495, + 346670474293201, + 499126560260241, + 133729112426208, + 21888242871839275222246405745257275088548364400416034343698203762162644606931, + 457247719748254, + 77659921938480, + 21888242871839275222246405745257275088548364400416034343698203738276483182924, + 21888242871839275222246405745257275088548364400416034343698203703001491805256, + 21888242871839275222246405745257275088548364400416034343698203686475876726065, + 21888242871839275222246405745257275088548364400416034343698203630954546672576, + 21888242871839275222246405745257275088548364400416034343698204183943703227446, + 28024276799324, + 309374562324274, + 402746012755213, + 72061697089341, + 21888242871839275222246405745257275088548364400416034343698203889411130574816, + 452818703483456, + 347144095751685, + 519053218604674, + 137093821283362, + 134954170333780, + 30227485242045, + 252292085724262, + 39274333420786, + 21888242871839275222246405745257275088548364400416034343698204022000744537609, + 21888242871839275222246405745257275088548364400416034343698203875203507428672, + 21888242871839275222246405745257275088548364400416034343698204132106403624923, + 21888242871839275222246405745257275088548364400416034343698204161145025083453, + 133686161689560, + 21888242871839275222246405745257275088548364400416034343698204133988179477378, + 21888242871839275222246405745257275088548364400416034343698203875798935040282, + 242777947523668, + 21888242871839275222246405745257275088548364400416034343698203972701787003431, + 21888242871839275222246405745257275088548364400416034343698203743487608277975, + 309203003010766, + 312500827129773, + 21888242871839275222246405745257275088548364400416034343698204053369779884924, + 21888242871839275222246405745257275088548364400416034343698203715084448375232, + 322069357988699, + 382292100499909, + 376384436217929, + 360681580174279, + 21888242871839275222246405745257275088548364400416034343698204125898817042185, + 21888242871839275222246405745257275088548364400416034343698203717563945698183, + 21888242871839275222246405745257275088548364400416034343698203905504004753467, + 532309256147461, + 21888242871839275222246405745257275088548364400416034343698203730718813188418, + 21888242871839275222246405745257275088548364400416034343698204117354772342721, + 14467867892508, + 408103865812413, + 465158747788116, + 21888242871839275222246405745257275088548364400416034343698204125699585363908, + 89435593655395, + 297752448491794, + 112542192040554, + 547476981514950, + 392245689115483, + 21888242871839275222246405745257275088548364400416034343698204008148499057178, + 374955159695446, + 57756993924516, + 184697950875062, + 148613439401915, + 21888242871839275222246405745257275088548364400416034343698203990832688028103, + 240084330679764, + 534604692944294, + 153269184608844, + 37852455171843, + 169905782752272, + 233394041770657, + 21888242871839275222246405745257275088548364400416034343698203825003274257956, + 549099404899117, + 415950916841009, + 21888242871839275222246405745257275088548364400416034343698203914556750878459, + 21888242871839275222246405745257275088548364400416034343698203945339429373650, + 124866031421041, + 72587591802304, + 21888242871839275222246405745257275088548364400416034343698204149036660030105, + 21888242871839275222246405745257275088548364400416034343698204060986403981572, + 21888242871839275222246405745257275088548364400416034343698203758005121914694, + 21888242871839275222246405745257275088548364400416034343698204141253305921642, + 118704411929749, + 131013241109812, + 321054150135905, + 297444105756035, + 21888242871839275222246405745257275088548364400416034343698204064288925499823, + 118713526407483, + 229564647034656, + 358015698870524, + 7731610391330, + 21888242871839275222246405745257275088548364400416034343698203999744872208579, + 432268956366826, + 21888242871839275222246405745257275088548364400416034343698204079422922173788, + 21888242871839275222246405745257275088548364400416034343698204079157772287867, + 554487603209424, + 21888242871839275222246405745257275088548364400416034343698203931560273351708, + 21888242871839275222246405745257275088548364400416034343698204054275249111291, + 245129795428212, + 21888242871839275222246405745257275088548364400416034343698204118495358810767, + 21888242871839275222246405745257275088548364400416034343698203973486198125962, + 428749130785103, + 21888242871839275222246405745257275088548364400416034343698204056736170476105, + 11274868995400, + 21888242871839275222246405745257275088548364400416034343698203783939608871130, + 21888242871839275222246405745257275088548364400416034343698203967860265956240, + 21888242871839275222246405745257275088548364400416034343698203841996215249658, + 21888242871839275222246405745257275088548364400416034343698203776507085406783, + 21888242871839275222246405745257275088548364400416034343698203837434851194471, + 150967278944901, + 21888242871839275222246405745257275088548364400416034343698203708436168308450, + 21888242871839275222246405745257275088548364400416034343698203680332728158629, + 185605050841395, + 21888242871839275222246405745257275088548364400416034343698204171418136975189, + 21888242871839275222246405745257275088548364400416034343698203704783983393273, + 540209183123240, + 253963978232936, + 21888242871839275222246405745257275088548364400416034343698203670744630042428, + 547067961339686, + 391898368697028, + 21888242871839275222246405745257275088548364400416034343698204042003919970474, + 21888242871839275222246405745257275088548364400416034343698204136829178575988, + 21888242871839275222246405745257275088548364400416034343698203938558519280679, + 21888242871839275222246405745257275088548364400416034343698204164264874046567, + 21888242871839275222246405745257275088548364400416034343698203911097626612214, + 205192824061839, + 543324801815730, + 21888242871839275222246405745257275088548364400416034343698203901309164367618, + 443295020227843, + 21888242871839275222246405745257275088548364400416034343698203664370964667902, + 313974678679126, + 21888242871839275222246405745257275088548364400416034343698203699833262461933, + 21888242871839275222246405745257275088548364400416034343698203944896204446244, + 428349918060971, + 78323436359503, + 88925640375449, + 316622427642744, + 21888242871839275222246405745257275088548364400416034343698203897845797564192, + 116787180281621, + 21888242871839275222246405745257275088548364400416034343698204126013165462568, + 21888242871839275222246405745257275088548364400416034343698203635288551362446, + 191477433539792, + 21888242871839275222246405745257275088548364400416034343698204019602419600301, + 21888242871839275222246405745257275088548364400416034343698204100142079680237, + 21888242871839275222246405745257275088548364400416034343698203746517791517896, + 486674504380928, + 21888242871839275222246405745257275088548364400416034343698204183694708232739, + 383021617200735, + 21888242871839275222246405745257275088548364400416034343698203674275621326260, + 554075561158851, + 376439879696470, + 439944921975398, + 288180337301496, + 216364604218540, + 335468921221798, + 405853640243719, + 317483514932056, + 21888242871839275222246405745257275088548364400416034343698203623649041243956, + 21888242871839275222246405745257275088548364400416034343698204117412609193527, + 21888242871839275222246405745257275088548364400416034343698203849841118606751, + 429655657037607, + 27301502844688, + 21888242871839275222246405745257275088548364400416034343698204135307115392502, + 495762499066910, + 212633782299016, + 111340855485281, + 304224358390397, + 183486617801873, + 21888242871839275222246405745257275088548364400416034343698204168024041977602, + 52516385657426, + 21888242871839275222246405745257275088548364400416034343698204155912770561223, + 21888242871839275222246405745257275088548364400416034343698204039306542587259, + 21888242871839275222246405745257275088548364400416034343698204054332972221402, + 489656695686192, + 21888242871839275222246405745257275088548364400416034343698203929445363273558, + 505326779027692, + 426530362370394, + 21888242871839275222246405745257275088548364400416034343698204137253422436584, + 21888242871839275222246405745257275088548364400416034343698203815548483991777, + 21888242871839275222246405745257275088548364400416034343698204155162481956846, + 132520079344493, + 21888242871839275222246405745257275088548364400416034343698203690821729622665, + 34677623752993, + 21888242871839275222246405745257275088548364400416034343698204085858686800129, + 21888242871839275222246405745257275088548364400416034343698203931378199471489, + 21888242871839275222246405745257275088548364400416034343698203747774266795092, + 21888242871839275222246405745257275088548364400416034343698203784882194183964, + 63766974876902, + 253035641997915, + 21888242871839275222246405745257275088548364400416034343698203762097674202734, + 21888242871839275222246405745257275088548364400416034343698203851306950176339, + 311752428345503, + 367168333157685, + 21888242871839275222246405745257275088548364400416034343698203676362020820943, + 433527225992510, + 21888242871839275222246405745257275088548364400416034343698204003378800957628, + 285650731005559, + 153332102702768, + 56218099343092, + 21888242871839275222246405745257275088548364400416034343698203734725436682208, + 21888242871839275222246405745257275088548364400416034343698204179631406233758, + 41399539895757, + 21888242871839275222246405745257275088548364400416034343698203700354344895983, + 45922737427782, + 21888242871839275222246405745257275088548364400416034343698203994261689980533, + 21888242871839275222246405745257275088548364400416034343698203638399707623234, + 317706480206781, + 297321199677323, + 462426774009818, + 21888242871839275222246405745257275088548364400416034343698204183159603619862, + 21888242871839275222246405745257275088548364400416034343698204145120432812704, + 21888242871839275222246405745257275088548364400416034343698203936278391155649, + 21888242871839275222246405745257275088548364400416034343698203990001355337579, + 483288014718958, + 173917739659019, + 369907784079480, + 30863708850934, + 478085030792977, + 21888242871839275222246405745257275088548364400416034343698203764576899605700, + 173589676619603, + 520714934971627, + 21888242871839275222246405745257275088548364400416034343698204014577668810304, + 445220768729059, + 21888242871839275222246405745257275088548364400416034343698203898848837296720, + 74455743038889, + 21888242871839275222246405745257275088548364400416034343698203812077295516105, + 21888242871839275222246405745257275088548364400416034343698203806531987520850, + 280862447897973, + 168052868244733, + 21888242871839275222246405745257275088548364400416034343698204041696343076489, + 21888242871839275222246405745257275088548364400416034343698203821694655401350, + 142735332196430, + 377370037068734, + 21888242871839275222246405745257275088548364400416034343698204180588719498315, + 37049433551292, + 21888242871839275222246405745257275088548364400416034343698204087089744528514, + 21888242871839275222246405745257275088548364400416034343698203629743642746788, + 21888242871839275222246405745257275088548364400416034343698204162160003890629, + 133035728764568, + 228135927151923, + 94134826577274, + 289512323055491, + 21888242871839275222246405745257275088548364400416034343698203882581267419096, + 21888242871839275222246405745257275088548364400416034343698204016706189261262, + 63007856373721, + 21888242871839275222246405745257275088548364400416034343698204075148670104270, + 346976783588314, + 21888242871839275222246405745257275088548364400416034343698203782467759628679, + 211053376331887, + 21888242871839275222246405745257275088548364400416034343698204028149887777353, + 21888242871839275222246405745257275088548364400416034343698204044522787041006, + 122634778189540, + 202795626885151, + 351139840498926, + 228690241453183, + 182809228766220, + 560424211213277, + 540100481488546, + 106832390299141, + 21888242871839275222246405745257275088548364400416034343698203913326772914834, + 21888242871839275222246405745257275088548364400416034343698204025796540939413, + 21888242871839275222246405745257275088548364400416034343698203832193534749544, + 21888242871839275222246405745257275088548364400416034343698204113074128108585, + 344484218953032, + 382678520877525, + 21888242871839275222246405745257275088548364400416034343698203741926430816452, + 21888242871839275222246405745257275088548364400416034343698203924037333256058, + 318908729197629, + 21888242871839275222246405745257275088548364400416034343698203742509637096002, + 151502003886399, + 47494851120159, + 435744804426661, + 152720674752091, + 318058774478532, + 172718407806504, + 21888242871839275222246405745257275088548364400416034343698203910388678002663, + 21888242871839275222246405745257275088548364400416034343698203668623013195683, + 21888242871839275222246405745257275088548364400416034343698204051264053166832, + 21888242871839275222246405745257275088548364400416034343698204118533098548995, + 21888242871839275222246405745257275088548364400416034343698203941946934333648, + 182813253789300, + 60798124933671, + 19469573113030, + 429306988897386, + 457562998015620, + 21888242871839275222246405745257275088548364400416034343698203877263400699589, + 21888242871839275222246405745257275088548364400416034343698203894831204608819, + 476028194436928, + 340203102723080, + 21888242871839275222246405745257275088548364400416034343698203862304345315333, + 61503250168922, + 513228320037329, + 303959247302111, + 17169047671247, + 21888242871839275222246405745257275088548364400416034343698204097180432169801, + 534946730421144, + 204489117852925, + 434634359315947, + 442033467864212, + 21888242871839275222246405745257275088548364400416034343698203986445292846834, + 21888242871839275222246405745257275088548364400416034343698203762903002448862, + 119302642613873, + 21888242871839275222246405745257275088548364400416034343698203994186504352382, + 21888242871839275222246405745257275088548364400416034343698203797661231034061, + 428399775648064, + 434477626298473, + 220443936637863, + 21888242871839275222246405745257275088548364400416034343698204157165315126907, + 21888242871839275222246405745257275088548364400416034343698204185693063058544, + 21888242871839275222246405745257275088548364400416034343698203660735156618602, + 21888242871839275222246405745257275088548364400416034343698203668662783012389, + 21888242871839275222246405745257275088548364400416034343698203922561531959521, + 518412357038312, + 21888242871839275222246405745257275088548364400416034343698203812626248656443, + 21888242871839275222246405745257275088548364400416034343698204084781946778269, + 335074420607030, + 216301113469327, + 7322896931546, + 21888242871839275222246405745257275088548364400416034343698203659821389136392, + 159408499161635, + 311916275449198, + 21888242871839275222246405745257275088548364400416034343698203881696441186758, + 21888242871839275222246405745257275088548364400416034343698204155207456120172, + 21888242871839275222246405745257275088548364400416034343698203871818102515353, + 352160670432416, + 21888242871839275222246405745257275088548364400416034343698204138999016389453, + 21888242871839275222246405745257275088548364400416034343698204088570832618090, + 21888242871839275222246405745257275088548364400416034343698203770418688518467, + 314304691759653, + 459053776929865, + 21888242871839275222246405745257275088548364400416034343698203891869559071883, + 470096957706445, + 217005428306105, + 267924827675799, + 542648313761492, + 541759243253064, + 67653426735804, + 21888242871839275222246405745257275088548364400416034343698203705438399943043, + 21888242871839275222246405745257275088548364400416034343698203800587308963307, + 21888242871839275222246405745257275088548364400416034343698203740578365700410, + 21888242871839275222246405745257275088548364400416034343698204147748346077520, + 466594110748529, + 21888242871839275222246405745257275088548364400416034343698203674078830180689, + 415523989397891, + 334823641106460, + 298486983494761, + 21888242871839275222246405745257275088548364400416034343698204077916387765858, + 349412167834165, + 21888242871839275222246405745257275088548364400416034343698203827986608189975, + 21888242871839275222246405745257275088548364400416034343698203893454240697353, + 21888242871839275222246405745257275088548364400416034343698204085663840051793, + 204142591606465, + 213459311924936, + 21888242871839275222246405745257275088548364400416034343698203711201222179577, + 21888242871839275222246405745257275088548364400416034343698203708983241811809, + 15937712568706, + 356680949917212, + 21888242871839275222246405745257275088548364400416034343698203825885902300854, + 347955949374987, + 436229502813047, + 21888242871839275222246405745257275088548364400416034343698203835567721751778, + 384551859511620, + 434754056169597, + 21888242871839275222246405745257275088548364400416034343698203779535561220664, + 21888242871839275222246405745257275088548364400416034343698204084036760040830, + 21888242871839275222246405745257275088548364400416034343698204060107301415550, + 21888242871839275222246405745257275088548364400416034343698203915754006243777, + 46526783231778, + 84098523458570, + 222864123724741, + 514797235772265, + 418745902271918, + 21888242871839275222246405745257275088548364400416034343698203865367227076570, + 21888242871839275222246405745257275088548364400416034343698204159678706267280, + 21888242871839275222246405745257275088548364400416034343698203669589281009977, + 544570116549578, + 21888242871839275222246405745257275088548364400416034343698203934693246434024, + 21888242871839275222246405745257275088548364400416034343698204062651922820489, + 276876615569050, + 28884935772164, + 21888242871839275222246405745257275088548364400416034343698203733861176711188, + 21888242871839275222246405745257275088548364400416034343698203972933402565102, + 134345065695850, + 21888242871839275222246405745257275088548364400416034343698203632774035762675, + 21888242871839275222246405745257275088548364400416034343698204023958626912606, + 381715922956908, + 320145161763055, + 88957369127592, + 524952106368992, + 21888242871839275222246405745257275088548364400416034343698203910148952976623, + 532845422967955, + 21888242871839275222246405745257275088548364400416034343698203974944786848355, + 21888242871839275222246405745257275088548364400416034343698203702948325416708, + 152223265599438, + 519705108183841, + 21888242871839275222246405745257275088548364400416034343698204181914340220679, + 21888242871839275222246405745257275088548364400416034343698203945926510784672, + 548836251713773, + 21888242871839275222246405745257275088548364400416034343698203986590097010668, + 21888242871839275222246405745257275088548364400416034343698203996334387445853, + 264173134200929, + 21888242871839275222246405745257275088548364400416034343698203626913785466645, + 21888242871839275222246405745257275088548364400416034343698203939054996884675, + 21888242871839275222246405745257275088548364400416034343698203844244065008588, + 19600565810831, + 82889343680083, + 21888242871839275222246405745257275088548364400416034343698203626715182853462, + 21888242871839275222246405745257275088548364400416034343698203637132165772241, + 218472345102494, + 156098356603230, + 21888242871839275222246405745257275088548364400416034343698203823693058646019, + 21888242871839275222246405745257275088548364400416034343698203924184941504549, + 21888242871839275222246405745257275088548364400416034343698203844254298968451, + 67642809804999, + 294263146474247, + 21888242871839275222246405745257275088548364400416034343698203950857180204575, + 21888242871839275222246405745257275088548364400416034343698204040822017778633, + 21888242871839275222246405745257275088548364400416034343698203790873752784440, + 281162912633829, + 21888242871839275222246405745257275088548364400416034343698203910816883063781, + 445163919935881, + 361409508008603, + 305762736300882, + 558785113284560, + 46973109069302, + 21888242871839275222246405745257275088548364400416034343698203990970260311570, + 347912779957356, + 140472720463985, + 21888242871839275222246405745257275088548364400416034343698203672936607147158, + 21888242871839275222246405745257275088548364400416034343698204140035474751578, + 6396573073314, + 21888242871839275222246405745257275088548364400416034343698204184895809476603, + 17870000093322, + 21888242871839275222246405745257275088548364400416034343698204037434675815421, + 266595918302549, + 21888242871839275222246405745257275088548364400416034343698203973366326615786, + 21888242871839275222246405745257275088548364400416034343698203830245245903411, + 21888242871839275222246405745257275088548364400416034343698203917629264028269, + 21888242871839275222246405745257275088548364400416034343698204115231179083434, + 21888242871839275222246405745257275088548364400416034343698203998945373772676, + 293530491024846, + 21888242871839275222246405745257275088548364400416034343698204184666731963349, + 21888242871839275222246405745257275088548364400416034343698203913484108797323, + 346100268379606, + 21888242871839275222246405745257275088548364400416034343698204087778588010774, + 21888242871839275222246405745257275088548364400416034343698203735036927871558, + 256865144102823, + 468125878261410, + 339360499527695, + 486856139973897, + 164981389538176, + 523405532616587, + 452374700156541, + 451776947292743, + 21888242871839275222246405745257275088548364400416034343698203670925237863683, + 21888242871839275222246405745257275088548364400416034343698204067640291370646, + 21888242871839275222246405745257275088548364400416034343698204176390909946679, + 21888242871839275222246405745257275088548364400416034343698203650010341286825, + 21888242871839275222246405745257275088548364400416034343698204002713546111370, + 292527808985085, + 21888242871839275222246405745257275088548364400416034343698203958790186258625, + 21888242871839275222246405745257275088548364400416034343698204126602944957515, + 39783293193602, + 21888242871839275222246405745257275088548364400416034343698203664622948177409, + 21888242871839275222246405745257275088548364400416034343698204108312105825951, + 183394292025258, + 538386628543216, + 235526280779766, + 21888242871839275222246405745257275088548364400416034343698203641260041636299, + 262140106982617, + 16126989132892, + 21888242871839275222246405745257275088548364400416034343698203824022819207040, + 21888242871839275222246405745257275088548364400416034343698203659474390888553, + 21888242871839275222246405745257275088548364400416034343698203890249115366717, + 21888242871839275222246405745257275088548364400416034343698203906468852407241, + 21888242871839275222246405745257275088548364400416034343698203932184499328380, + 21888242871839275222246405745257275088548364400416034343698203756121970303920, + 21888242871839275222246405745257275088548364400416034343698203956417232971496, + 191451128877833, + 21888242871839275222246405745257275088548364400416034343698203804410122021236, + 196860173206615, + 500793571987435, + 321390878190398, + 21888242871839275222246405745257275088548364400416034343698203861747377384217, + 113503703504112, + 21888242871839275222246405745257275088548364400416034343698203903800919137991, + 21888242871839275222246405745257275088548364400416034343698203629474958861466, + 21888242871839275222246405745257275088548364400416034343698204034948545792419, + 21888242871839275222246405745257275088548364400416034343698204022384024555475, + 518065208602398, + 550561615651853, + 195051384459475, + 21888242871839275222246405745257275088548364400416034343698203859254392084517, + 506783798627063, + 21888242871839275222246405745257275088548364400416034343698204139538237640792, + 21888242871839275222246405745257275088548364400416034343698204108523856522303, + 58458914088961, + 285151983256155, + 208218586110283, + 21888242871839275222246405745257275088548364400416034343698203640887449414278, + 21888242871839275222246405745257275088548364400416034343698203981859312831606, + 21888242871839275222246405745257275088548364400416034343698203964783992721417, + 404456329998317, + 21888242871839275222246405745257275088548364400416034343698204157587684165872, + 21888242871839275222246405745257275088548364400416034343698203679218130263361, + 21888242871839275222246405745257275088548364400416034343698203702395414984186, + 92415162223917, + 21888242871839275222246405745257275088548364400416034343698203659164977696860, + 21888242871839275222246405745257275088548364400416034343698203692757253794779, + 21888242871839275222246405745257275088548364400416034343698204086819747729626, + 21888242871839275222246405745257275088548364400416034343698203871345012743447, + 21888242871839275222246405745257275088548364400416034343698204029126986727203, + 21888242871839275222246405745257275088548364400416034343698203733850787498330, + 550328096034546, + 92456289272692, + 21888242871839275222246405745257275088548364400416034343698204121260480418182, + 21888242871839275222246405745257275088548364400416034343698203671387582458702, + 21888242871839275222246405745257275088548364400416034343698203712379444704373, + 270192520560303, + 21888242871839275222246405745257275088548364400416034343698203813310513695874, + 230209633608270, + 21888242871839275222246405745257275088548364400416034343698204162792831587041, + 21888242871839275222246405745257275088548364400416034343698203795203387976809, + 21888242871839275222246405745257275088548364400416034343698203916026054400671, + 21888242871839275222246405745257275088548364400416034343698203966244429708361, + 6696371064161, + 21888242871839275222246405745257275088548364400416034343698204164398113838310, + 21888242871839275222246405745257275088548364400416034343698204095244139416081, + 21888242871839275222246405745257275088548364400416034343698204177173010026266, + 21888242871839275222246405745257275088548364400416034343698203930193774429617, + 501957257634530, + 101169912888663, + 220045919067610, + 21888242871839275222246405745257275088548364400416034343698203766959496570131, + 46745630612999, + 21888242871839275222246405745257275088548364400416034343698203831717771085611, + 337359855666796, + 21888242871839275222246405745257275088548364400416034343698203948286956595224, + 460006286477491, + 21888242871839275222246405745257275088548364400416034343698203889470689713579, + 458806109430143, + 21888242871839275222246405745257275088548364400416034343698204126561926870545, + 523629253761586, + 123742840723532, + 302209900119396, + 341768677804535, + 21888242871839275222246405745257275088548364400416034343698204115981492113094, + 374293087094128, + 114579054186386, + 129925395345367, + 206441852470170, + 21888242871839275222246405745257275088548364400416034343698204148490990314504, + 350715380551688, + 555962472793668, + 21888242871839275222246405745257275088548364400416034343698203699854482428529, + 21888242871839275222246405745257275088548364400416034343698204110891291523680, + 21888242871839275222246405745257275088548364400416034343698204057090306332398, + 21888242871839275222246405745257275088548364400416034343698203850220625676877, + 461111967968559, + 400803855270011, + 21888242871839275222246405745257275088548364400416034343698204021832044435974, + 446964979187638, + 21888242871839275222246405745257275088548364400416034343698203763930058511883, + 21888242871839275222246405745257275088548364400416034343698203646309528990303, + 21888242871839275222246405745257275088548364400416034343698204046873696925689, + 21888242871839275222246405745257275088548364400416034343698204173428166223832, + 21888242871839275222246405745257275088548364400416034343698203710875992084177, + 21888242871839275222246405745257275088548364400416034343698203881353291905385, + 239944501912714, + 21888242871839275222246405745257275088548364400416034343698204158461211511682, + 413391775263047, + 395437823105506, + 376098337462799, + 21888242871839275222246405745257275088548364400416034343698204103391663553198, + 21888242871839275222246405745257275088548364400416034343698203907776530090192, + 269444794578968, + 21888242871839275222246405745257275088548364400416034343698204100727629384218, + 21888242871839275222246405745257275088548364400416034343698204153423745511073, + 21888242871839275222246405745257275088548364400416034343698204153130086840312, + 33542170203466, + 153735714292035, + 307543214967224, + 21888242871839275222246405745257275088548364400416034343698203832121898842692, + 21888242871839275222246405745257275088548364400416034343698203871549393164609, + 21888242871839275222246405745257275088548364400416034343698203692440538389018, + 21888242871839275222246405745257275088548364400416034343698204145653246110614, + 21888242871839275222246405745257275088548364400416034343698204124681054912316, + 21888242871839275222246405745257275088548364400416034343698203971256206479466, + 433478217654377, + 236350097060918, + 21888242871839275222246405745257275088548364400416034343698203809969956438573, + 21888242871839275222246405745257275088548364400416034343698203943700346475625, + 112641427978651, + 21888242871839275222246405745257275088548364400416034343698204048209366644175, + 394576158583065, + 422731173500472, + 21888242871839275222246405745257275088548364400416034343698203744993324931754, + 118297561601809, + 152086268896235, + 21888242871839275222246405745257275088548364400416034343698203657891619288029, + 21888242871839275222246405745257275088548364400416034343698203669443664563808, + 21888242871839275222246405745257275088548364400416034343698204072269036742695, + 21888242871839275222246405745257275088548364400416034343698203639464471939007, + 21888242871839275222246405745257275088548364400416034343698204162702628536512, + 75470912122268, + 441119115445408, + 21888242871839275222246405745257275088548364400416034343698204184370517865872, + 21888242871839275222246405745257275088548364400416034343698203737998119420661, + 66454347543020, + 21888242871839275222246405745257275088548364400416034343698203679295716183427, + 142478897661466, + 327273595487284, + 491209869331002, + 21888242871839275222246405745257275088548364400416034343698203914541278506475, + 21888242871839275222246405745257275088548364400416034343698203833922677845746, + 21888242871839275222246405745257275088548364400416034343698203646126057452737, + 21888242871839275222246405745257275088548364400416034343698203719915453702942, + 21888242871839275222246405745257275088548364400416034343698204025245470456711, + 21888242871839275222246405745257275088548364400416034343698203686370961883468, + 514174185940925, + 21888242871839275222246405745257275088548364400416034343698204010816928608316, + 55482363377686, + 21888242871839275222246405745257275088548364400416034343698203659947233288337, + 236870857492709, + 21888242871839275222246405745257275088548364400416034343698204181590226610129, + 231911296160555, + 21888242871839275222246405745257275088548364400416034343698204168621664887301, + 21888242871839275222246405745257275088548364400416034343698203796067588380070, + 21888242871839275222246405745257275088548364400416034343698204002558638899720, + 21888242871839275222246405745257275088548364400416034343698203909308640148920, + 179611308911528, + 526008080302142, + 21888242871839275222246405745257275088548364400416034343698203827188802868225, + 376056957940908, + 21888242871839275222246405745257275088548364400416034343698203736442561050368, + 541377949115416, + 21888242871839275222246405745257275088548364400416034343698204094085110363460, + 235553557460050, + 209979324653922, + 21888242871839275222246405745257275088548364400416034343698203831139151753561, + 373317414210675, + 21888242871839275222246405745257275088548364400416034343698203780125375066802, + 21888242871839275222246405745257275088548364400416034343698203792703554302001, + 21888242871839275222246405745257275088548364400416034343698203680080155528809, + 21888242871839275222246405745257275088548364400416034343698204113454962707447, + 310596304213026, + 21888242871839275222246405745257275088548364400416034343698204073339848909964, + 21888242871839275222246405745257275088548364400416034343698204016887938958660, + 21888242871839275222246405745257275088548364400416034343698203866058437416809, + 484109309631155, + 438152849559009, + 21888242871839275222246405745257275088548364400416034343698203842236139677218, + 21888242871839275222246405745257275088548364400416034343698203739297912224871, + 79421186118578, + 183370348307462, + 21888242871839275222246405745257275088548364400416034343698204171822936545397, + 140458284463637, + 245228366859750, + 501942084750157, + 21888242871839275222246405745257275088548364400416034343698203949892203789931, + 247976571143014, + 21888242871839275222246405745257275088548364400416034343698203825539697773862, + 21888242871839275222246405745257275088548364400416034343698203763812601729159, + 149672649388567, + 84677557676648, + 239952778718074, + 21888242871839275222246405745257275088548364400416034343698203661777943773075, + 21888242871839275222246405745257275088548364400416034343698203802884831984741, + 21888242871839275222246405745257275088548364400416034343698204088384302022620, + 543580175168721, + 431282722888309, + 552652417885815, + 384145632606984, + 125168263430521, + 316039790736276, + 312659603062891, + 166005634278686, + 21888242871839275222246405745257275088548364400416034343698203767176995364103, + 502026494501768, + 21888242871839275222246405745257275088548364400416034343698203962696301705722, + 21888242871839275222246405745257275088548364400416034343698203739408967206042, + 246144881476946, + 21888242871839275222246405745257275088548364400416034343698203674860615573135, + 21888242871839275222246405745257275088548364400416034343698203950135745268777, + 347892153657269, + 53695269911717, + 21888242871839275222246405745257275088548364400416034343698203946187720810465, + 21888242871839275222246405745257275088548364400416034343698203813781862397606, + 21888242871839275222246405745257275088548364400416034343698203643382026913350, + 21888242871839275222246405745257275088548364400416034343698203960060409236191, + 21888242871839275222246405745257275088548364400416034343698204007475307036116, + 388888059655409, + 21888242871839275222246405745257275088548364400416034343698203869447969140308, + 21888242871839275222246405745257275088548364400416034343698203856630246614870, + 544581137669987, + 21888242871839275222246405745257275088548364400416034343698203914686207180522, + 358478872147516, + 21888242871839275222246405745257275088548364400416034343698203877473109341982, + 526477241584549, + 337979819140371, + 21888242871839275222246405745257275088548364400416034343698203972833191036339, + 2624276203845, + 401235616292930, + 220225934937260, + 21888242871839275222246405745257275088548364400416034343698203797487044567332, + 533875045094595, + 21888242871839275222246405745257275088548364400416034343698203766668619236343, + 21888242871839275222246405745257275088548364400416034343698203806859400949206, + 21888242871839275222246405745257275088548364400416034343698203754160533916119, + 348713229854296, + 275595600830255, + 452381042890165, + 245659912770938, + 21888242871839275222246405745257275088548364400416034343698203695947408366953, + 103947545552910, + 21888242871839275222246405745257275088548364400416034343698203876841092269256, + 21888242871839275222246405745257275088548364400416034343698204000804500600006, + 111496784056326, + 119266023189489, + 451625871244118, + 21888242871839275222246405745257275088548364400416034343698203888007858401917, + 21888242871839275222246405745257275088548364400416034343698203706031539032467, + 196564584231942, + 201797542506699, + 21888242871839275222246405745257275088548364400416034343698203697537766756048, + 465955595259740, + 21888242871839275222246405745257275088548364400416034343698203740711251490338, + 11773547465422, + 21888242871839275222246405745257275088548364400416034343698203809391920000527, + 21888242871839275222246405745257275088548364400416034343698203709350769067881, + 21888242871839275222246405745257275088548364400416034343698204166824240817370, + 460058852723831, + 330332595912130, + 120838181963744, + 21888242871839275222246405745257275088548364400416034343698203803225114446239, + 21888242871839275222246405745257275088548364400416034343698203787601204479194, + 21888242871839275222246405745257275088548364400416034343698203738899760729556, + 27309121835951, + 431299245154886, + 524685189249697, + 90094066229923, + 129207317222591, + 256335760636541, + 182871938455120, + 21888242871839275222246405745257275088548364400416034343698203962585374004212, + 108322845190294, + 21888242871839275222246405745257275088548364400416034343698203744718137207579, + 181523194258266, + 21888242871839275222246405745257275088548364400416034343698203671236936701949, + 21888242871839275222246405745257275088548364400416034343698204064325398308813, + 7485965982167, + 21888242871839275222246405745257275088548364400416034343698203657727047712526, + 21888242871839275222246405745257275088548364400416034343698204005711662567555, + 246143371767189, + 21888242871839275222246405745257275088548364400416034343698203920296949768060, + 21888242871839275222246405745257275088548364400416034343698203771934211262472, + 21888242871839275222246405745257275088548364400416034343698203642288477781685, + 21888242871839275222246405745257275088548364400416034343698203731654532845814, + 213930498107540, + 525589229578901, + 21888242871839275222246405745257275088548364400416034343698203891880747436539, + 125784514440657, + 21888242871839275222246405745257275088548364400416034343698204021236232588479, + 21888242871839275222246405745257275088548364400416034343698204184758956945858, + 89835238757017, + 112206871717769, + 21888242871839275222246405745257275088548364400416034343698203960140909954714, + 21888242871839275222246405745257275088548364400416034343698203659346769634809, + 21888242871839275222246405745257275088548364400416034343698203670668706596796, + 307185463168661, + 21888242871839275222246405745257275088548364400416034343698204092898990924457, + 21888242871839275222246405745257275088548364400416034343698204041096639201062, + 21888242871839275222246405745257275088548364400416034343698203691766971373271, + 305510756255309, + 21888242871839275222246405745257275088548364400416034343698204184709932221092, + 11520386035716, + 330219124883358, + 21888242871839275222246405745257275088548364400416034343698203903084189612348, + 21888242871839275222246405745257275088548364400416034343698203955311818742016, + 21888242871839275222246405745257275088548364400416034343698203844279743776432, + 265311315354230, + 21888242871839275222246405745257275088548364400416034343698203912742722806235, + 21888242871839275222246405745257275088548364400416034343698204008039369257617, + 307038578889993, + 21888242871839275222246405745257275088548364400416034343698204021635482416448, + 21888242871839275222246405745257275088548364400416034343698203844011544842968, + 424883831226146, + 168537423693571, + 21888242871839275222246405745257275088548364400416034343698203943063748344295, + 438995012559811, + 21888242871839275222246405745257275088548364400416034343698203706777913386761, + 21888242871839275222246405745257275088548364400416034343698203885835818149454, + 229426065101591, + 294637127528435, + 541786338107362, + 70506759222442, + 328053819088639, + 225299564233734, + 21873652212603, + 21888242871839275222246405745257275088548364400416034343698204133070185402311, + 248738606474442, + 21888242871839275222246405745257275088548364400416034343698204061436575909808, + 541507797727005, + 32224942650476, + 351781478321820, + 21888242871839275222246405745257275088548364400416034343698204103707009056958, + 21888242871839275222246405745257275088548364400416034343698203901483806789876, + 228437994694955, + 21888242871839275222246405745257275088548364400416034343698203637271502662340, + 21888242871839275222246405745257275088548364400416034343698204118697031974555, + 21888242871839275222246405745257275088548364400416034343698203716208809375694, + 21888242871839275222246405745257275088548364400416034343698203805412729454667, + 173785092551111, + 51660434523862, + 530335113106659, + 21888242871839275222246405745257275088548364400416034343698204035427169825175, + 21888242871839275222246405745257275088548364400416034343698204070709073288555, + 41020481962981, + 21888242871839275222246405745257275088548364400416034343698203740526926461521, + 21888242871839275222246405745257275088548364400416034343698203839262232899973, + 543618138960744, + 20639620936105, + 21888242871839275222246405745257275088548364400416034343698204002659317879586, + 21888242871839275222246405745257275088548364400416034343698203891486124036269, + 8650734163638, + 306055775552669, + 395390152609266, + 21888242871839275222246405745257275088548364400416034343698204100327658815403, + 80161755548962, + 278622891585575, + 104174638755673, + 21888242871839275222246405745257275088548364400416034343698203893949527954603, + 529879558849036, + 514882995353914, + 21888242871839275222246405745257275088548364400416034343698203703811616608412, + 53180520352407, + 21888242871839275222246405745257275088548364400416034343698204020975438500443, + 21888242871839275222246405745257275088548364400416034343698203785524796349443, + 21888242871839275222246405745257275088548364400416034343698204030468688492458, + 21888242871839275222246405745257275088548364400416034343698204123180022271323, + 21888242871839275222246405745257275088548364400416034343698203844291887191320, + 21888242871839275222246405745257275088548364400416034343698203783938390124764, + 21888242871839275222246405745257275088548364400416034343698203922853503557065, + 21888242871839275222246405745257275088548364400416034343698203669367190545319, + 21888242871839275222246405745257275088548364400416034343698204060303387739950, + 21888242871839275222246405745257275088548364400416034343698203869203028029406, + 429399758560356, + 268339928174455, + 57230812691646, + 64816057295887, + 21888242871839275222246405745257275088548364400416034343698203844388567895491, + 287675116466995, + 21888242871839275222246405745257275088548364400416034343698204106299283460951, + 21888242871839275222246405745257275088548364400416034343698203888620020253564, + 419418220196343, + 462332036436714, + 21888242871839275222246405745257275088548364400416034343698204182358086301901, + 21888242871839275222246405745257275088548364400416034343698204065246819837468, + 21888242871839275222246405745257275088548364400416034343698203880937868885466, + 21888242871839275222246405745257275088548364400416034343698203998471698715955, + 21888242871839275222246405745257275088548364400416034343698204043304560964372, + 21888242871839275222246405745257275088548364400416034343698203625652691592370, + 21888242871839275222246405745257275088548364400416034343698203894682968178585, + 21888242871839275222246405745257275088548364400416034343698203719967185811737, + 192927552513281, + 8157660497990, + 462125217673526, + 21888242871839275222246405745257275088548364400416034343698203761009831739133, + 21888242871839275222246405745257275088548364400416034343698203646159717035480, + 21888242871839275222246405745257275088548364400416034343698204088823028493253, + 21888242871839275222246405745257275088548364400416034343698204092034240081068, + 236075872051616, + 478883844250228, + 21888242871839275222246405745257275088548364400416034343698204045351397368966, + 21888242871839275222246405745257275088548364400416034343698204072130638639871, + 524096595841722, + 556663573443420, + 21888242871839275222246405745257275088548364400416034343698204004478546771203, + 14293979340134, + 200015846707757, + 21888242871839275222246405745257275088548364400416034343698204079049043845346, + 401452935176621, + 339887988341496, + 347494600288454, + 102316173667234, + 139147156551292, + 21888242871839275222246405745257275088548364400416034343698203826657206519351, + 21888242871839275222246405745257275088548364400416034343698203966486510826884, + 44128398999151, + 21888242871839275222246405745257275088548364400416034343698203676527413037297, + 538436501596387, + 21888242871839275222246405745257275088548364400416034343698204117593866527984, + 21888242871839275222246405745257275088548364400416034343698204178973769412957, + 138471273991111, + 21888242871839275222246405745257275088548364400416034343698203822039404858791, + 21888242871839275222246405745257275088548364400416034343698204128173477621020, + 21888242871839275222246405745257275088548364400416034343698203873086685443943, + 21888242871839275222246405745257275088548364400416034343698203710690236153128, + 431077427060042, + 176522743413893, + 21888242871839275222246405745257275088548364400416034343698204050385872470455, + 21888242871839275222246405745257275088548364400416034343698203855275868216414, + 21888242871839275222246405745257275088548364400416034343698203783181754676939, + 458504751272357, + 133112984827793, + 21888242871839275222246405745257275088548364400416034343698204135405700464765, + 21888242871839275222246405745257275088548364400416034343698204029942267375062, + 297643006678443, + 347712868227808, + 19462627484680, + 46418280644764, + 21888242871839275222246405745257275088548364400416034343698203958350272371841, + 376481485448316, + 21888242871839275222246405745257275088548364400416034343698204047819602395722, + 21888242871839275222246405745257275088548364400416034343698203982558754405899, + 8519291608399, + 21888242871839275222246405745257275088548364400416034343698204145114622479300, + 533890524849036, + 537290233955999, + 21888242871839275222246405745257275088548364400416034343698204053206307398193, + 480622812774061, + 138882080981036, + 21888242871839275222246405745257275088548364400416034343698203918618678967997, + 126189720303630, + 451004214427031, + 467211111387595, + 177946988803702, + 302731736457624, + 61172394153964, + 21888242871839275222246405745257275088548364400416034343698203790377232649758, + 267673345105972, + 419878442626916, + 21888242871839275222246405745257275088548364400416034343698203718913602966901, + 21888242871839275222246405745257275088548364400416034343698203985870713944018, + 21888242871839275222246405745257275088548364400416034343698204066004925410486, + 21888242871839275222246405745257275088548364400416034343698204088848244212407, + 21888242871839275222246405745257275088548364400416034343698203977358059951039, + 424779346556170, + 276698758091962, + 232923676345991, + 21888242871839275222246405745257275088548364400416034343698203966943881402312, + 21888242871839275222246405745257275088548364400416034343698204150843831738760, + 21888242871839275222246405745257275088548364400416034343698204052296382996626, + 21888242871839275222246405745257275088548364400416034343698203926559490424910, + 21888242871839275222246405745257275088548364400416034343698203920550236988980, + 21888242871839275222246405745257275088548364400416034343698203934149281745536, + 21888242871839275222246405745257275088548364400416034343698203662107493999448, + 21888242871839275222246405745257275088548364400416034343698203675337315478397, + 32000698807982, + 21888242871839275222246405745257275088548364400416034343698204174519032395988, + 21888242871839275222246405745257275088548364400416034343698203971229012349030, + 21888242871839275222246405745257275088548364400416034343698203855396444504897, + 367968719285063, + 163632675769028, + 21888242871839275222246405745257275088548364400416034343698203667319754724419, + 21888242871839275222246405745257275088548364400416034343698204112206152377634, + 225930233616074, + 21888242871839275222246405745257275088548364400416034343698203760581875241757, + 21888242871839275222246405745257275088548364400416034343698203860513449260829, + 115670868381557, + 460689331833541, + 21888242871839275222246405745257275088548364400416034343698204111735883135710, + 75021401419730, + 21888242871839275222246405745257275088548364400416034343698203889734583994804, + 409339422383968, + 21888242871839275222246405745257275088548364400416034343698204092676516452587, + 21888242871839275222246405745257275088548364400416034343698203929558615824742, + 21888242871839275222246405745257275088548364400416034343698204102090855481743, + 220040305723370, + 21888242871839275222246405745257275088548364400416034343698203631190506409734, + 21888242871839275222246405745257275088548364400416034343698203889375585616456, + 21888242871839275222246405745257275088548364400416034343698204067456444132525, + 21888242871839275222246405745257275088548364400416034343698204062941954634270, + 170115634880232, + 21888242871839275222246405745257275088548364400416034343698203796673065412630, + 392083795541639, + 21888242871839275222246405745257275088548364400416034343698204096458207633924, + 417343290476185, + 338687418278570, + 21888242871839275222246405745257275088548364400416034343698203938541634126844, + 491888739943912, + 21888242871839275222246405745257275088548364400416034343698204114067029940065, + 21888242871839275222246405745257275088548364400416034343698203944143424098507, + 415217904086410, + 46991319888174, + 448823197949058, + 212151485248752, + 144325333175255, + 479305458500211, + 21888242871839275222246405745257275088548364400416034343698203855805424439960, + 471032991490865, + 349778334385134, + 21888242871839275222246405745257275088548364400416034343698203902394141668890, + 504305774812745, + 243908965633321, + 21888242871839275222246405745257275088548364400416034343698203712575617382760, + 21888242871839275222246405745257275088548364400416034343698204031674628788621, + 390305457958075, + 499034272945455, + 166256238374907, + 390848397697484, + 236553931804786, + 40887452854715, + 21888242871839275222246405745257275088548364400416034343698203773137994745462, + 21888242871839275222246405745257275088548364400416034343698203976950914358516, + 303237356658743, + 447857751210157, + 321410953788087, + 215414834066854, + 444319374474484, + 21888242871839275222246405745257275088548364400416034343698203995686834053058, + 21888242871839275222246405745257275088548364400416034343698204134301370975992, + 21888242871839275222246405745257275088548364400416034343698203748044793405969, + 21888242871839275222246405745257275088548364400416034343698204140957472246573, + 89936323498899, + 21888242871839275222246405745257275088548364400416034343698203732427204412250, + 21888242871839275222246405745257275088548364400416034343698203978539186272887, + 243057158662852, + 288565184229497, + 21888242871839275222246405745257275088548364400416034343698203870326165319404, + 510143734867323, + 21888242871839275222246405745257275088548364400416034343698203958103786393398, + 21888242871839275222246405745257275088548364400416034343698203773332757507941, + 21888242871839275222246405745257275088548364400416034343698203788683356815387, + 427491772583196, + 21888242871839275222246405745257275088548364400416034343698203897859724440878, + 82458425943001, + 163230100768799, + 514369873171661, + 71914273731915, + 21888242871839275222246405745257275088548364400416034343698203628280440547114, + 21888242871839275222246405745257275088548364400416034343698204021812097360016, + 273353427267646, + 21888242871839275222246405745257275088548364400416034343698204135967216357271, + 21888242871839275222246405745257275088548364400416034343698203789827104800708, + 437953690442634, + 21888242871839275222246405745257275088548364400416034343698204154926155705732, + 529915869957324, + 21888242871839275222246405745257275088548364400416034343698204032081404836177, + 38672051508161, + 410293325931582, + 72365097572181, + 21888242871839275222246405745257275088548364400416034343698204158801297982864, + 21888242871839275222246405745257275088548364400416034343698204122848458283705, + 40472502065986, + 267119695033493, + 21888242871839275222246405745257275088548364400416034343698203693473479084602, + 21888242871839275222246405745257275088548364400416034343698204131711933287996, + 21888242871839275222246405745257275088548364400416034343698203822794999613165, + 271878807096040, + 21888242871839275222246405745257275088548364400416034343698204103315967493931, + 264449665031939, + 21888242871839275222246405745257275088548364400416034343698203870073326261450, + 21888242871839275222246405745257275088548364400416034343698204036121070036710, + 338315354109831, + 21888242871839275222246405745257275088548364400416034343698204186071891960813, + 21888242871839275222246405745257275088548364400416034343698203889389454700774, + 21888242871839275222246405745257275088548364400416034343698204146230231259868, + 336665118050217, + 178798207451168, + 441425214000429, + 460276657308578, + 311961861476429, + 455424221511948, + 362316959796332, + 443028309322084, + 21888242871839275222246405745257275088548364400416034343698204036995447468265, + 66581518233438, + 89629235820629, + 21888242871839275222246405745257275088548364400416034343698203805509510523426, + 21888242871839275222246405745257275088548364400416034343698204150080012686844, + 424743308157872, + 305576295766751, + 21888242871839275222246405745257275088548364400416034343698203966699519315596, + 21888242871839275222246405745257275088548364400416034343698203966022283710685, + 248662882865405, + 144726394180869, + 335101850027707, + 314474765170487, + 21888242871839275222246405745257275088548364400416034343698203815836776301167, + 21888242871839275222246405745257275088548364400416034343698203957364291320232, + 21888242871839275222246405745257275088548364400416034343698203642817915252602, + 21888242871839275222246405745257275088548364400416034343698203822890156645904, + 188488201525882, + 189218119515080, + 209296323953075, + 21888242871839275222246405745257275088548364400416034343698204134899750138738, + 21888242871839275222246405745257275088548364400416034343698203700707540481374, + 21888242871839275222246405745257275088548364400416034343698203716647200020325, + 184759894257945, + 21888242871839275222246405745257275088548364400416034343698204002755834649653, + 25449379375016, + 21888242871839275222246405745257275088548364400416034343698204098180274416224, + 21888242871839275222246405745257275088548364400416034343698203682904933523746, + 245944963293749, + 231221948870982, + 301534779146117, + 21888242871839275222246405745257275088548364400416034343698204095333864324357, + 21888242871839275222246405745257275088548364400416034343698203738117258520518, + 21888242871839275222246405745257275088548364400416034343698203835012782647816, + 25209178589512, + 162561062468249, + 515905355239270, + 127932746162896, + 21888242871839275222246405745257275088548364400416034343698203796069014165311, + 21888242871839275222246405745257275088548364400416034343698203854770506506020, + 21888242871839275222246405745257275088548364400416034343698203753330470575544, + 21888242871839275222246405745257275088548364400416034343698204144328733867687, + 164024958051608, + 21888242871839275222246405745257275088548364400416034343698203941270078202195, + 21888242871839275222246405745257275088548364400416034343698203836978649615045, + 21888242871839275222246405745257275088548364400416034343698204031112253971966, + 21888242871839275222246405745257275088548364400416034343698203665907840648290, + 261833502050978, + 21888242871839275222246405745257275088548364400416034343698203918476578714309, + 303630248877617, + 21888242871839275222246405745257275088548364400416034343698203909170077087554, + 478132204976452, + 507562504888504, + 441645480162408, + 439873559924248, + 21888242871839275222246405745257275088548364400416034343698203667284167093495, + 21888242871839275222246405745257275088548364400416034343698203931989041342953, + 21888242871839275222246405745257275088548364400416034343698203968117268835272, + 91866244336599, + 21888242871839275222246405745257275088548364400416034343698203822623515147176, + 21888242871839275222246405745257275088548364400416034343698204070482155049433, + 73748475658787, + 21888242871839275222246405745257275088548364400416034343698204016650369864533, + 21888242871839275222246405745257275088548364400416034343698203938583583847132, + 21888242871839275222246405745257275088548364400416034343698204160300077116046, + 21888242871839275222246405745257275088548364400416034343698203968030899113642, + 309654411886503, + 428587911436080, + 375456146961870, + 21888242871839275222246405745257275088548364400416034343698203832906144474231, + 21888242871839275222246405745257275088548364400416034343698203931012511007808, + 21888242871839275222246405745257275088548364400416034343698203993868436705059, + 253427922654332, + 21888242871839275222246405745257275088548364400416034343698203859628085756422, + 21888242871839275222246405745257275088548364400416034343698203904903183185477, + 169400403392393, + 59637856000648, + 21888242871839275222246405745257275088548364400416034343698203665403881903666, + 21888242871839275222246405745257275088548364400416034343698203646564865651670, + 21888242871839275222246405745257275088548364400416034343698204017449601612254, + 507672217739502, + 21888242871839275222246405745257275088548364400416034343698203741269983220926, + 21888242871839275222246405745257275088548364400416034343698204031350887847181, + 243304939841184, + 21888242871839275222246405745257275088548364400416034343698203691623429003345, + 87535962328257, + 21888242871839275222246405745257275088548364400416034343698203988986252045546, + 468220315499141, + 21888242871839275222246405745257275088548364400416034343698203946068379831869, + 21888242871839275222246405745257275088548364400416034343698203868247896931930, + 329901607155390, + 518598894385177, + 21888242871839275222246405745257275088548364400416034343698203899724358314572, + 209332583928680, + 21888242871839275222246405745257275088548364400416034343698203981054754873805, + 21888242871839275222246405745257275088548364400416034343698204184496966656799, + 45116589985220, + 321806076005987, + 270903089351166, + 21888242871839275222246405745257275088548364400416034343698203862802500841576, + 259970559698301, + 3489520392590, + 21888242871839275222246405745257275088548364400416034343698203971524524061108, + 21888242871839275222246405745257275088548364400416034343698203869217303204956, + 21888242871839275222246405745257275088548364400416034343698203781864874240236, + 21888242871839275222246405745257275088548364400416034343698203853149512515673, + 312709512172584, + 300746412777804, + 21888242871839275222246405745257275088548364400416034343698204073921925712042, + 411504365980640, + 21888242871839275222246405745257275088548364400416034343698204014521437671419, + 412406783007396, + 21888242871839275222246405745257275088548364400416034343698203895136826630917, + 422498193405532, + 21888242871839275222246405745257275088548364400416034343698203713402411017681, + 162730341478380, + 458191625042717, + 21888242871839275222246405745257275088548364400416034343698203696779357964870, + 21888242871839275222246405745257275088548364400416034343698204097081062152481, + 490252381207033, + 21888242871839275222246405745257275088548364400416034343698204146597053763589, + 21888242871839275222246405745257275088548364400416034343698203818265106578823, + 421966262468350, + 21888242871839275222246405745257275088548364400416034343698203869052475120371, + 21888242871839275222246405745257275088548364400416034343698204134021286035756, + 21888242871839275222246405745257275088548364400416034343698204031346303821108, + 147214873391653, + 21888242871839275222246405745257275088548364400416034343698203686202015437899, + 371459748067656, + 195366449509138, + 21888242871839275222246405745257275088548364400416034343698203914937691502480, + 21888242871839275222246405745257275088548364400416034343698203822576968992691, + 21888242871839275222246405745257275088548364400416034343698203877196529859595, + 21888242871839275222246405745257275088548364400416034343698203863133255829630, + 482578536917402, + 18143785271173, + 84764075406949, + 21888242871839275222246405745257275088548364400416034343698203632560676660809, + 553609616643957, + 349830996667697, + 470385445670336, + 425847233630877, + 334470268859009, + 21888242871839275222246405745257275088548364400416034343698203985427660089031, + 472232833341576, + 152876668825748, + 305576157411676, + 140356748033790, + 21888242871839275222246405745257275088548364400416034343698204097598387059857, + 257020149001437, + 21888242871839275222246405745257275088548364400416034343698203811522834718954, + 197686865660351, + 497609069980080, + 429329242929237, + 21888242871839275222246405745257275088548364400416034343698204024299496442455, + 21888242871839275222246405745257275088548364400416034343698203792464502821556, + 403672597620939, + 21888242871839275222246405745257275088548364400416034343698203772305160460419, + 190753848132102, + 21888242871839275222246405745257275088548364400416034343698204154700082954506, + 21888242871839275222246405745257275088548364400416034343698204073926229471469, + 21888242871839275222246405745257275088548364400416034343698204113337167251991, + 524955649188894, + 330334232846582, + 21888242871839275222246405745257275088548364400416034343698203639187072485802, + 21888242871839275222246405745257275088548364400416034343698203656288245069962, + 21888242871839275222246405745257275088548364400416034343698203948098728257892, + 538962682549340, + 21888242871839275222246405745257275088548364400416034343698203843785437939446, + 252546410071221, + 480764203387723, + 80104546178998, + 21888242871839275222246405745257275088548364400416034343698204083813718845694, + 199604298207743, + 21888242871839275222246405745257275088548364400416034343698204130114285127983, + 273743937208994, + 21888242871839275222246405745257275088548364400416034343698203802443181391579, + 21888242871839275222246405745257275088548364400416034343698203917977124538778, + 21888242871839275222246405745257275088548364400416034343698203932318577452680, + 305051008372584, + 496207263066716, + 98372354131483, + 21888242871839275222246405745257275088548364400416034343698204061894721961740, + 21888242871839275222246405745257275088548364400416034343698203655801906591577, + 494035232704530, + 213475100093274, + 21888242871839275222246405745257275088548364400416034343698203922815364196115, + 390046740016764, + 21888242871839275222246405745257275088548364400416034343698204053911424265455, + 465259728572796, + 21888242871839275222246405745257275088548364400416034343698203798188310616544, + 366099072052051, + 21888242871839275222246405745257275088548364400416034343698204036649432455800, + 547822590546805, + 21888242871839275222246405745257275088548364400416034343698203859918843913319, + 21888242871839275222246405745257275088548364400416034343698203647503415488020, + 358982162794893, + 68777563588583, + 21888242871839275222246405745257275088548364400416034343698204123547627320450, + 21888242871839275222246405745257275088548364400416034343698204063125972487564, + 21888242871839275222246405745257275088548364400416034343698203939455481186971, + 21888242871839275222246405745257275088548364400416034343698204175621465476936, + 21888242871839275222246405745257275088548364400416034343698203721523424711976, + 428977098775210, + 21888242871839275222246405745257275088548364400416034343698204169346457614385, + 264288509417756, + 470845811133353, + 342429374741620, + 21888242871839275222246405745257275088548364400416034343698203987318146000630, + 21888242871839275222246405745257275088548364400416034343698204180613953208669, + 21888242871839275222246405745257275088548364400416034343698203962776686803207, + 21888242871839275222246405745257275088548364400416034343698204156753406283787, + 519625598718962, + 513391892789972, + 12046010980014, + 21888242871839275222246405745257275088548364400416034343698203978661319414347, + 396776148615259, + 21888242871839275222246405745257275088548364400416034343698204149931794700755, + 21888242871839275222246405745257275088548364400416034343698203936354794710472, + 21888242871839275222246405745257275088548364400416034343698203897837332201370, + 21888242871839275222246405745257275088548364400416034343698203785223988994438, + 21888242871839275222246405745257275088548364400416034343698203628406072214318, + 21888242871839275222246405745257275088548364400416034343698203880825709916857, + 173487321655623, + 21888242871839275222246405745257275088548364400416034343698204045194533980433, + 284274281430524, + 130193895070796, + 21888242871839275222246405745257275088548364400416034343698203965487590298612, + 552228210093100, + 21888242871839275222246405745257275088548364400416034343698204181885165763647, + 21888242871839275222246405745257275088548364400416034343698203785495962695413, + 21888242871839275222246405745257275088548364400416034343698204008799579022358, + 137394940740968, + 21888242871839275222246405745257275088548364400416034343698203822812033662313, + 21888242871839275222246405745257275088548364400416034343698204120776753296708, + 21888242871839275222246405745257275088548364400416034343698203870425749437935, + 386005813441024, + 472122621183156, + 21888242871839275222246405745257275088548364400416034343698204184815751929328, + 353628047086055, + 21888242871839275222246405745257275088548364400416034343698203785754931983133, + 25715355388831, + 445840079527240, + 21888242871839275222246405745257275088548364400416034343698203697128544910491, + 526974264140112, + 21888242871839275222246405745257275088548364400416034343698204132272172381898, + 21888242871839275222246405745257275088548364400416034343698203919480092676680, + 61698730319739, + 220798325242578, + 71216141924858, + 84220498403379, + 21888242871839275222246405745257275088548364400416034343698203985877014130648, + 21888242871839275222246405745257275088548364400416034343698203645759789490164, + 452233159915811, + 21888242871839275222246405745257275088548364400416034343698203774178963130816, + 334327453163480, + 21888242871839275222246405745257275088548364400416034343698204033013438635142, + 21888242871839275222246405745257275088548364400416034343698203961026643119338, + 21888242871839275222246405745257275088548364400416034343698203702217581583533, + 21888242871839275222246405745257275088548364400416034343698204131993382123515, + 21888242871839275222246405745257275088548364400416034343698204126364392150642, + 418488482836928, + 21888242871839275222246405745257275088548364400416034343698204073053385545525, + 82384721239076, + 163626137717728, + 21888242871839275222246405745257275088548364400416034343698203938311948266510, + 163039522881304, + 21888242871839275222246405745257275088548364400416034343698203711130489927692, + 21888242871839275222246405745257275088548364400416034343698203921062143848939, + 21888242871839275222246405745257275088548364400416034343698203903520139019510, + 21888242871839275222246405745257275088548364400416034343698203766803748514469, + 21888242871839275222246405745257275088548364400416034343698203977904338823968, + 21888242871839275222246405745257275088548364400416034343698204121557275670902, + 21888242871839275222246405745257275088548364400416034343698203772548139276956, + 21888242871839275222246405745257275088548364400416034343698203818051458661975, + 21888242871839275222246405745257275088548364400416034343698203859600494445708, + 21888242871839275222246405745257275088548364400416034343698203688500368706642, + 114304312031933, + 164328072758521, + 21888242871839275222246405745257275088548364400416034343698203929701588254635, + 21888242871839275222246405745257275088548364400416034343698203703883504933723, + 21888242871839275222246405745257275088548364400416034343698204015191912849333, + 29437856813405, + 10057212908666, + 21888242871839275222246405745257275088548364400416034343698203998789617961092, + 21888242871839275222246405745257275088548364400416034343698204081974294016287, + 21888242871839275222246405745257275088548364400416034343698204128056854739648, + 21888242871839275222246405745257275088548364400416034343698204032779867106644, + 256416581054512, + 41867484450852, + 126129388902646, + 21888242871839275222246405745257275088548364400416034343698204070432008570687, + 21888242871839275222246405745257275088548364400416034343698203859620161755581, + 411927563778686, + 426930526437194, + 21888242871839275222246405745257275088548364400416034343698204002206302294496, + 21888242871839275222246405745257275088548364400416034343698204004120905272708, + 314994894580273, + 181727520448776, + 21888242871839275222246405745257275088548364400416034343698203925537388577934, + 21888242871839275222246405745257275088548364400416034343698203627382304424143, + 52857740753003, + 456341506639079, + 336390010759273, + 17483129687554, + 240059496662304, + 447270056753842, + 65415352280604, + 559318098454306, + 226010474244767, + 218028980990182, + 21888242871839275222246405745257275088548364400416034343698204182596845031629, + 385140266701670, + 147581003536644, + 444627102684650, + 21888242871839275222246405745257275088548364400416034343698203889126563424854, + 21888242871839275222246405745257275088548364400416034343698204146629211041263, + 21888242871839275222246405745257275088548364400416034343698203803001309558751, + 226459987125254, + 21888242871839275222246405745257275088548364400416034343698203854256809783243, + 471118142051487, + 21888242871839275222246405745257275088548364400416034343698203743136137951285, + 21888242871839275222246405745257275088548364400416034343698204012883967458280, + 550403118343152, + 56803580449706, + 497160008824544, + 21888242871839275222246405745257275088548364400416034343698203861250907755820, + 255078960180817, + 21888242871839275222246405745257275088548364400416034343698204022048272311993, + 444451454556864, + 21888242871839275222246405745257275088548364400416034343698203839569715181603, + 524784541790268, + 21888242871839275222246405745257275088548364400416034343698203887651581720107, + 80615060224447, + 398148249402180, + 21888242871839275222246405745257275088548364400416034343698204143492200129452, + 81797100531878, + 21888242871839275222246405745257275088548364400416034343698203631526049560330, + 560458780594838, + 21888242871839275222246405745257275088548364400416034343698204002655351634612, + 21888242871839275222246405745257275088548364400416034343698203938010785667030, + 21888242871839275222246405745257275088548364400416034343698204147282748497978, + 268247423236294, + 21888242871839275222246405745257275088548364400416034343698203785535652985321, + 21888242871839275222246405745257275088548364400416034343698204069527683009925, + 21888242871839275222246405745257275088548364400416034343698203657691573209558, + 562143931638118, + 21888242871839275222246405745257275088548364400416034343698204096114948813528, + 307403930868850, + 64763450976302, + 21888242871839275222246405745257275088548364400416034343698203676402521721605, + 21888242871839275222246405745257275088548364400416034343698204029263670631593, + 21888242871839275222246405745257275088548364400416034343698203652390403350740, + 25830778450970, + 290232394226305, + 21888242871839275222246405745257275088548364400416034343698203851785880536324, + 21888242871839275222246405745257275088548364400416034343698203943524428942376, + 200043473951913, + 21888242871839275222246405745257275088548364400416034343698203925077763753625, + 533970965574107, + 406765773719699, + 308188399964081, + 21888242871839275222246405745257275088548364400416034343698204040726420953246, + 226379897128643, + 130468954946494, + 278494406445971, + 467798549055326, + 21888242871839275222246405745257275088548364400416034343698203866766999692986, + 21888242871839275222246405745257275088548364400416034343698204010094257694806, + 550058784936492, + 82609494912372, + 21888242871839275222246405745257275088548364400416034343698203643849495156392, + 21888242871839275222246405745257275088548364400416034343698203695246558802696, + 100276400903269, + 322916106794499, + 257333916548992, + 19942457051494, + 21888242871839275222246405745257275088548364400416034343698203803061158736954, + 428410204769272, + 21888242871839275222246405745257275088548364400416034343698204085310030469752, + 21888242871839275222246405745257275088548364400416034343698203967709708820799, + 501428251533198, + 8042408442313, + 161832519165400, + 21888242871839275222246405745257275088548364400416034343698203783367990954450, + 21888242871839275222246405745257275088548364400416034343698203691826081587508, + 497355042993429, + 466774749955341, + 241664689008239, + 21888242871839275222246405745257275088548364400416034343698204124222118630715, + 476696988402408, + 21888242871839275222246405745257275088548364400416034343698204085997378028488, + 363721685066403, + 476781220514239, + 43440944039299, + 46520550811363, + 21888242871839275222246405745257275088548364400416034343698204046575657414248, + 21888242871839275222246405745257275088548364400416034343698203781676495277525, + 21888242871839275222246405745257275088548364400416034343698204091695878093962, + 277584667898266, + 21888242871839275222246405745257275088548364400416034343698204092270324196210, + 194382245785913, + 21888242871839275222246405745257275088548364400416034343698204168601676161302, + 392334536725571, + 516468736738444, + 21888242871839275222246405745257275088548364400416034343698204014092129621864, + 21888242871839275222246405745257275088548364400416034343698203772748116183181, + 21888242871839275222246405745257275088548364400416034343698203704285014463373, + 123873217638473, + 259862862416278, + 425223686396857, + 524021357905902, + 21888242871839275222246405745257275088548364400416034343698203854381405199650, + 52201610695967, + 21888242871839275222246405745257275088548364400416034343698203800745643001265, + 67218949549510, + 21888242871839275222246405745257275088548364400416034343698203875669643859920, + 21888242871839275222246405745257275088548364400416034343698204046717330407742, + 425225300643154, + 559797620067805, + 219190524208271, + 21888242871839275222246405745257275088548364400416034343698203743870647424802, + 21888242871839275222246405745257275088548364400416034343698203686586251902359, + 21888242871839275222246405745257275088548364400416034343698203982740424804953, + 21888242871839275222246405745257275088548364400416034343698203847713471542693, + 21888242871839275222246405745257275088548364400416034343698204065206386980803, + 21888242871839275222246405745257275088548364400416034343698203698668181102339, + 21888242871839275222246405745257275088548364400416034343698204121177991343903, + 225943102114239, + 21888242871839275222246405745257275088548364400416034343698203817400091924966, + 444116676628326, + 468653941427968, + 409179733514786, + 492485888670548, + 21888242871839275222246405745257275088548364400416034343698204037656051622643, + 440878109499404, + 185143046556001, + 425762020891883, + 21888242871839275222246405745257275088548364400416034343698203646868146694086, + 21888242871839275222246405745257275088548364400416034343698203877942413660100, + 21888242871839275222246405745257275088548364400416034343698203940941260531154, + 522134410282546, + 21888242871839275222246405745257275088548364400416034343698204045999342083056, + 21888242871839275222246405745257275088548364400416034343698203965224723835558, + 528436136487422, + 523847262836835, + 230297359856720, + 21888242871839275222246405745257275088548364400416034343698203658083655680325, + 475921212354959, + 482255881990077, + 21888242871839275222246405745257275088548364400416034343698203933671486418492, + 21888242871839275222246405745257275088548364400416034343698204009833664686958, + 21888242871839275222246405745257275088548364400416034343698204111050669394626, + 21888242871839275222246405745257275088548364400416034343698203907314419736618, + 21888242871839275222246405745257275088548364400416034343698203809612558678687, + 391476217786597, + 21888242871839275222246405745257275088548364400416034343698203886047485113904, + 123082241541067, + 21888242871839275222246405745257275088548364400416034343698203954323107970712, + 174027011551929, + 21888242871839275222246405745257275088548364400416034343698204133444191425777, + 21888242871839275222246405745257275088548364400416034343698203677260997307894, + 553069699324847, + 21888242871839275222246405745257275088548364400416034343698204144485054138623, + 261480635774069, + 34137054809561, + 21888242871839275222246405745257275088548364400416034343698204042971320050718, + 284145107232521, + 230088727169094, + 185944321123971, + 21888242871839275222246405745257275088548364400416034343698204176280345038098, + 21888242871839275222246405745257275088548364400416034343698204026505751015128, + 21888242871839275222246405745257275088548364400416034343698204026984614481560, + 24701495751600, + 21888242871839275222246405745257275088548364400416034343698203734954993513361, + 304863046555071, + 21888242871839275222246405745257275088548364400416034343698203654003060112514, + 417574808793996, + 509021658632825, + 208925247420473, + 526546315789487, + 21888242871839275222246405745257275088548364400416034343698203986544368222380, + 21888242871839275222246405745257275088548364400416034343698204174859328427983, + 21513954364518, + 246326491433637, + 252109489451016, + 21888242871839275222246405745257275088548364400416034343698203978822057756490, + 458493267019771, + 270237602070277, + 21888242871839275222246405745257275088548364400416034343698204029848818259202, + 467813433409630, + 21888242871839275222246405745257275088548364400416034343698203648921342029384, + 334798263235083, + 21888242871839275222246405745257275088548364400416034343698204000313110676619, + 21888242871839275222246405745257275088548364400416034343698203713285786231244, + 21888242871839275222246405745257275088548364400416034343698204153093306591846, + 21888242871839275222246405745257275088548364400416034343698203641490771329179, + 21888242871839275222246405745257275088548364400416034343698204002783557429711, + 350264511577393, + 425723776106194, + 66999661929497, + 65615978741553, + 21888242871839275222246405745257275088548364400416034343698203857545938992243, + 447160769572720, + 21888242871839275222246405745257275088548364400416034343698204127933055439006, + 21888242871839275222246405745257275088548364400416034343698203843719457429866, + 21888242871839275222246405745257275088548364400416034343698203763100061346930, + 372388500572712, + 21888242871839275222246405745257275088548364400416034343698204050710328994396, + 21888242871839275222246405745257275088548364400416034343698204171910515416772, + 21888242871839275222246405745257275088548364400416034343698203973466314365911, + 525312958731741, + 21888242871839275222246405745257275088548364400416034343698204174036146852991, + 21888242871839275222246405745257275088548364400416034343698203650507469897585, + 21888242871839275222246405745257275088548364400416034343698204185013881119303, + 36631205183842, + 352258894399139, + 21888242871839275222246405745257275088548364400416034343698204180886661936891, + 174135505660197, + 440180666033769, + 213833922555495, + 402157832508879, + 21888242871839275222246405745257275088548364400416034343698203780832286439327, + 351472317976505, + 184471656074139, + 292546242427071, + 21888242871839275222246405745257275088548364400416034343698203742477006139734, + 21888242871839275222246405745257275088548364400416034343698203863669864846642, + 76167458454586, + 21888242871839275222246405745257275088548364400416034343698203851192763264376, + 84643267740653, + 271245159451682, + 21888242871839275222246405745257275088548364400416034343698204019395564193406, + 21888242871839275222246405745257275088548364400416034343698203726494270617241, + 390275643365811, + 76557235690324, + 202889983701221, + 21888242871839275222246405745257275088548364400416034343698203748193980922273, + 21888242871839275222246405745257275088548364400416034343698204061988896021319, + 61457147703996, + 545664204465308, + 21888242871839275222246405745257275088548364400416034343698203966497292549712, + 143046892526269, + 541894627781047, + 235344910410833, + 21888242871839275222246405745257275088548364400416034343698204079698055879372, + 21888242871839275222246405745257275088548364400416034343698204092787390036414, + 21888242871839275222246405745257275088548364400416034343698203886734010798185, + 258831129770173, + 21888242871839275222246405745257275088548364400416034343698204112053459923522, + 457476866648631, + 21888242871839275222246405745257275088548364400416034343698203819824957160345, + 21888242871839275222246405745257275088548364400416034343698204080822381049958, + 414768746240474, + 21888242871839275222246405745257275088548364400416034343698204136564539402251, + 21888242871839275222246405745257275088548364400416034343698203721426318087645, + 407976616146737, + 21888242871839275222246405745257275088548364400416034343698203661075845778891, + 402331964035398, + 21888242871839275222246405745257275088548364400416034343698204126655349514104, + 21888242871839275222246405745257275088548364400416034343698203650306601286937, + 21888242871839275222246405745257275088548364400416034343698204053841159190429, + 126266758069399, + 21888242871839275222246405745257275088548364400416034343698203952296361485861, + 9914566292924, + 532457723348431, + 68727221687556, + 431635481308800, + 143870457527100, + 308915879917349, + 282414812990493, + 374831930272256, + 21888242871839275222246405745257275088548364400416034343698203791226291371861, + 21888242871839275222246405745257275088548364400416034343698203959929396845538, + 21888242871839275222246405745257275088548364400416034343698203656338370007855, + 396139061435880, + 54636845794374, + 430383293298817, + 554412630225017, + 555778476892352, + 74791000627275, + 21888242871839275222246405745257275088548364400416034343698203699863053108941, + 14538052510823, + 47957604314168, + 21888242871839275222246405745257275088548364400416034343698204083666386148756, + 21888242871839275222246405745257275088548364400416034343698203776652910150927, + 21888242871839275222246405745257275088548364400416034343698203654493599899053, + 21888242871839275222246405745257275088548364400416034343698203678120178817263, + 232660208464077, + 134160788676021, + 44002372709211, + 533666072176833, + 21888242871839275222246405745257275088548364400416034343698203771393819473346, + 84727335493741, + 240518996094096, + 332912841039588, + 21888242871839275222246405745257275088548364400416034343698203758730341583884, + 21888242871839275222246405745257275088548364400416034343698203734640472310037, + 21888242871839275222246405745257275088548364400416034343698203994616639997994, + 21888242871839275222246405745257275088548364400416034343698203904790042202509, + 560650536862717, + 491089918916778, + 21888242871839275222246405745257275088548364400416034343698203763879150032351, + 522117527679380, + 21888242871839275222246405745257275088548364400416034343698204178350814194387, + 258970231235555, + 21888242871839275222246405745257275088548364400416034343698203927857000381372, + 397779992391829, + 205059860027633, + 21888242871839275222246405745257275088548364400416034343698203968488357144882, + 21888242871839275222246405745257275088548364400416034343698203964819383103139, + 21888242871839275222246405745257275088548364400416034343698204098969852725143, + 21888242871839275222246405745257275088548364400416034343698203878097667020861, + 279314857702752, + 21888242871839275222246405745257275088548364400416034343698204170682727508166, + 222353740128654, + 54051282023750, + 21888242871839275222246405745257275088548364400416034343698203981678179135706, + 17530673730595, + 21888242871839275222246405745257275088548364400416034343698204121520334498420, + 21888242871839275222246405745257275088548364400416034343698204066551872263417, + 21888242871839275222246405745257275088548364400416034343698203661390311385283, + 21888242871839275222246405745257275088548364400416034343698203672100311777637, + 275518287847639, + 21888242871839275222246405745257275088548364400416034343698203809536356465420, + 21888242871839275222246405745257275088548364400416034343698203952831343510071, + 21888242871839275222246405745257275088548364400416034343698204132598921393239, + 21888242871839275222246405745257275088548364400416034343698203742976869030529, + 93810113770044, + 21888242871839275222246405745257275088548364400416034343698203879361092193930, + 21888242871839275222246405745257275088548364400416034343698203708756667413970, + 51996564081261, + 21888242871839275222246405745257275088548364400416034343698203787725019836812, + 21888242871839275222246405745257275088548364400416034343698203786766555763473, + 64716866100573, + 237756501797430, + 21888242871839275222246405745257275088548364400416034343698203655166077576227, + 21888242871839275222246405745257275088548364400416034343698203930456034855360, + 36475185498306, + 21888242871839275222246405745257275088548364400416034343698204011858872809680, + 13208918666038, + 21888242871839275222246405745257275088548364400416034343698204016975246679554, + 30335020772952, + 21888242871839275222246405745257275088548364400416034343698204021826570488690, + 21888242871839275222246405745257275088548364400416034343698203978084297191824, + 21888242871839275222246405745257275088548364400416034343698204149316620281774, + 21888242871839275222246405745257275088548364400416034343698203631215427238757, + 21888242871839275222246405745257275088548364400416034343698204030745730947795, + 21888242871839275222246405745257275088548364400416034343698203792090908992313, + 21888242871839275222246405745257275088548364400416034343698204185900120079591, + 142364486340879, + 21888242871839275222246405745257275088548364400416034343698203647169825975600, + 504032755477080, + 21888242871839275222246405745257275088548364400416034343698203893634039997044, + 544333937822186, + 21888242871839275222246405745257275088548364400416034343698203628855735157569, + 319138872753515, + 76874085194330, + 52289446492079, + 445305651798890, + 229767443714841, + 439403126483652, + 150801833169869, + 417307518478315, + 22964103574152, + 199654016330189, + 21888242871839275222246405745257275088548364400416034343698203993536831807679, + 21888242871839275222246405745257275088548364400416034343698203693393388562948, + 17884980080021, + 21888242871839275222246405745257275088548364400416034343698203777301457859565, + 38368686564589, + 83139456613124, + 330811459664209, + 21888242871839275222246405745257275088548364400416034343698204022469561079029, + 72502175307686, + 51079166062935, + 21888242871839275222246405745257275088548364400416034343698203698655470869105, + 21888242871839275222246405745257275088548364400416034343698203909090788699075, + 356663259423458, + 21888242871839275222246405745257275088548364400416034343698204093406547761980, + 21888242871839275222246405745257275088548364400416034343698203739978943114671, + 21888242871839275222246405745257275088548364400416034343698203632789849856144, + 435694747542367, + 247568475721647, + 21888242871839275222246405745257275088548364400416034343698203703387440556155, + 21888242871839275222246405745257275088548364400416034343698203686662749851749, + 21888242871839275222246405745257275088548364400416034343698204102428255218938, + 156588426158866, + 21888242871839275222246405745257275088548364400416034343698204066995145107858, + 384144431766197, + 21888242871839275222246405745257275088548364400416034343698203818052158254132, + 21888242871839275222246405745257275088548364400416034343698203995296862974332, + 400442682297672, + 21888242871839275222246405745257275088548364400416034343698204056201112006126, + 345558492145302, + 548858204254792, + 21888242871839275222246405745257275088548364400416034343698203803890096244846, + 251445077374283, + 21888242871839275222246405745257275088548364400416034343698204164004915465769, + 101519330385542, + 383597208676207, + 21888242871839275222246405745257275088548364400416034343698204116545963684316, + 199738429816096, + 21888242871839275222246405745257275088548364400416034343698204066585085547070, + 73460791499245, + 363590035889040, + 21888242871839275222246405745257275088548364400416034343698204071843267830443, + 21888242871839275222246405745257275088548364400416034343698203664918393649622, + 21888242871839275222246405745257275088548364400416034343698204185459366837361, + 553030621828356, + 142076628136450, + 309362441519120, + 513420547067788, + 21888242871839275222246405745257275088548364400416034343698203768119375949056, + 21888242871839275222246405745257275088548364400416034343698204002811944355925, + 89718885378434, + 21888242871839275222246405745257275088548364400416034343698203711907589846523, + 21888242871839275222246405745257275088548364400416034343698203883608267795709, + 21888242871839275222246405745257275088548364400416034343698203686631534856751, + 21888242871839275222246405745257275088548364400416034343698203669609472449760, + 21888242871839275222246405745257275088548364400416034343698204030493806281728, + 26777688870488, + 36137064407668, + 21888242871839275222246405745257275088548364400416034343698204107327368667172, + 21888242871839275222246405745257275088548364400416034343698203797463602423322, + 404290627663962, + 21888242871839275222246405745257275088548364400416034343698204022113376200819, + 21888242871839275222246405745257275088548364400416034343698203842652855945137, + 21888242871839275222246405745257275088548364400416034343698204091307852268523, + 21888242871839275222246405745257275088548364400416034343698203855384353184092, + 21888242871839275222246405745257275088548364400416034343698203913829854222322, + 195081038177847, + 64526401191216, + 21888242871839275222246405745257275088548364400416034343698203976482402112471, + 21888242871839275222246405745257275088548364400416034343698204169698828125252, + 195545224743508, + 100626334455702, + 448848835614134, + 21888242871839275222246405745257275088548364400416034343698203646695901873297, + 371757743634082, + 372271855901436, + 21888242871839275222246405745257275088548364400416034343698204147563376556471, + 317012220034973, + 21888242871839275222246405745257275088548364400416034343698203983412622458008, + 549123469000944, + 21888242871839275222246405745257275088548364400416034343698203818351954225101, + 21888242871839275222246405745257275088548364400416034343698203900237357281900, + 18135058501064, + 324093871018932, + 249717648330316, + 457978326324503, + 28755253165519, + 919892340698, + 20598127692200, + 63426778524466, + 21888242871839275222246405745257275088548364400416034343698203939309842022565, + 537353327261287, + 376957328560565, + 21888242871839275222246405745257275088548364400416034343698203735949820158435, + 226779840207469, + 52377135749195, + 21888242871839275222246405745257275088548364400416034343698204159150981412693, + 21888242871839275222246405745257275088548364400416034343698204156158427848014, + 21888242871839275222246405745257275088548364400416034343698204029139642415943, + 441913458816061, + 548701856781164, + 312375151682854, + 377293214593707, + 21888242871839275222246405745257275088548364400416034343698203710864944113648, + 21888242871839275222246405745257275088548364400416034343698203984386257917319, + 256308871288410, + 359064278842439, + 144987515327228, + 21888242871839275222246405745257275088548364400416034343698203662865001660236, + 21888242871839275222246405745257275088548364400416034343698203982482848419096, + 205087351862911, + 21888242871839275222246405745257275088548364400416034343698203916406629950219, + 21888242871839275222246405745257275088548364400416034343698203846589550894089, + 21888242871839275222246405745257275088548364400416034343698203765731261159890, + 21888242871839275222246405745257275088548364400416034343698204088873281507745, + 299752874000606, + 443651307978291, + 21888242871839275222246405745257275088548364400416034343698203672460235504864, + 21888242871839275222246405745257275088548364400416034343698204071312326487921, + 149738196584397, + 539785694354219, + 21888242871839275222246405745257275088548364400416034343698203830901635564605, + 500714487761352, + 21888242871839275222246405745257275088548364400416034343698203708107020371793, + 21888242871839275222246405745257275088548364400416034343698203829208436327992, + 322383175968087, + 287809981803846, + 53881585424200, + 21888242871839275222246405745257275088548364400416034343698204033201010585624, + 21888242871839275222246405745257275088548364400416034343698203878012579350148, + 21888242871839275222246405745257275088548364400416034343698203634556992872676, + 45609218390142, + 21888242871839275222246405745257275088548364400416034343698203955453471230535, + 215836951335563, + 21888242871839275222246405745257275088548364400416034343698203644949441924845, + 82503761950774, + 21888242871839275222246405745257275088548364400416034343698203853057235899528, + 21888242871839275222246405745257275088548364400416034343698203646345622053940, + 21888242871839275222246405745257275088548364400416034343698203788550468508094, + 479676799048453, + 403484460760235, + 21888242871839275222246405745257275088548364400416034343698204141793271614538, + 21888242871839275222246405745257275088548364400416034343698203688422085206645, + 21888242871839275222246405745257275088548364400416034343698204156623079737648, + 249612812250976, + 250695434503535, + 21888242871839275222246405745257275088548364400416034343698204050948148651462, + 21888242871839275222246405745257275088548364400416034343698204168517712198390, + 155447561037419, + 21888242871839275222246405745257275088548364400416034343698204154714898414628, + 21888242871839275222246405745257275088548364400416034343698204054318043892403, + 21888242871839275222246405745257275088548364400416034343698204108345946623763, + 203587368149869, + 218116272331977, + 277646050903552, + 497753611444215, + 21888242871839275222246405745257275088548364400416034343698203714606903741836, + 477036845486089, + 21888242871839275222246405745257275088548364400416034343698204073218783811601, + 418682518757530, + 21888242871839275222246405745257275088548364400416034343698203690901869364852, + 21888242871839275222246405745257275088548364400416034343698204131097335896794, + 21888242871839275222246405745257275088548364400416034343698204146217457877219, + 21888242871839275222246405745257275088548364400416034343698203693638626453006, + 21888242871839275222246405745257275088548364400416034343698203656406610838951, + 21888242871839275222246405745257275088548364400416034343698203840553076350024, + 370816481519647, + 247818258730224, + 21888242871839275222246405745257275088548364400416034343698203823148906082290, + 21888242871839275222246405745257275088548364400416034343698203996345557902455, + 21888242871839275222246405745257275088548364400416034343698203793897377408938, + 21888242871839275222246405745257275088548364400416034343698203838835085642196, + 21888242871839275222246405745257275088548364400416034343698204030482258859752, + 242306751676422, + 155673856161889, + 21888242871839275222246405745257275088548364400416034343698204032060738644362, + 21888242871839275222246405745257275088548364400416034343698203643484032748478, + 21888242871839275222246405745257275088548364400416034343698203928315883292823, + 21888242871839275222246405745257275088548364400416034343698203738648882303934, + 21888242871839275222246405745257275088548364400416034343698204134527217205303, + 21888242871839275222246405745257275088548364400416034343698203683482420333447, + 21888242871839275222246405745257275088548364400416034343698204099724499203992, + 21888242871839275222246405745257275088548364400416034343698203913547523557691, + 21888242871839275222246405745257275088548364400416034343698203904084954613508, + 361251126362264, + 493393535644223, + 21888242871839275222246405745257275088548364400416034343698203738345995065549, + 57982468449903, + 448086380127416, + 21888242871839275222246405745257275088548364400416034343698203855908174928971, + 21888242871839275222246405745257275088548364400416034343698203983467368923094, + 21888242871839275222246405745257275088548364400416034343698203931239964859419, + 21888242871839275222246405745257275088548364400416034343698203669474764028655, + 238816244858077, + 420529631765748, + 21888242871839275222246405745257275088548364400416034343698203679490501474035, + 21888242871839275222246405745257275088548364400416034343698204060806226454632, + 280126456077114, + 21888242871839275222246405745257275088548364400416034343698204105418713978625, + 21888242871839275222246405745257275088548364400416034343698203925241690117300, + 425043175573008, + 451622072864695, + 247924760706551, + 21888242871839275222246405745257275088548364400416034343698203696852668658930, + 21888242871839275222246405745257275088548364400416034343698203946543970630191, + 21888242871839275222246405745257275088548364400416034343698203728187261348002, + 550458733998072, + 21888242871839275222246405745257275088548364400416034343698203814250024204463, + 283838548155909, + 254547268418739, + 260879654174709, + 393928231406656, + 21888242871839275222246405745257275088548364400416034343698203982370566689268, + 111476286052004, + 21888242871839275222246405745257275088548364400416034343698203653064484740039, + 160751446499607, + 21888242871839275222246405745257275088548364400416034343698203976679888842449, + 21888242871839275222246405745257275088548364400416034343698204127482894684038, + 15941268385512, + 21888242871839275222246405745257275088548364400416034343698203814466870438859, + 21888242871839275222246405745257275088548364400416034343698204023497904454080, + 21888242871839275222246405745257275088548364400416034343698204032455873852334, + 21888242871839275222246405745257275088548364400416034343698203719976755961374, + 534515152220188, + 49294620987681, + 312178596429305, + 21888242871839275222246405745257275088548364400416034343698203817724488288967, + 21888242871839275222246405745257275088548364400416034343698203710344825244977, + 21888242871839275222246405745257275088548364400416034343698204172534904712413, + 11839364242460, + 317256869376254, + 448759934299971, + 456157303016348, + 21888242871839275222246405745257275088548364400416034343698203792488767476733, + 21888242871839275222246405745257275088548364400416034343698204073618835620664, + 21888242871839275222246405745257275088548364400416034343698203790733005163837, + 21888242871839275222246405745257275088548364400416034343698203833053958622458, + 21888242871839275222246405745257275088548364400416034343698203888385782706413, + 173710084790421, + 392977106075994, + 21888242871839275222246405745257275088548364400416034343698203871377553056973, + 21888242871839275222246405745257275088548364400416034343698204126248499227955, + 513412427334520, + 504871053406109, + 60170475938974, + 193590361118819, + 307055098367463, + 21888242871839275222246405745257275088548364400416034343698203951992573713426, + 21888242871839275222246405745257275088548364400416034343698203908699982868883, + 558774707248246, + 56307780634856, + 21888242871839275222246405745257275088548364400416034343698203892282637895261, + 21888242871839275222246405745257275088548364400416034343698203868095659515221, + 21888242871839275222246405745257275088548364400416034343698203708169257415384, + 21888242871839275222246405745257275088548364400416034343698204041803681668307, + 12400601102599, + 192103268508447, + 21888242871839275222246405745257275088548364400416034343698203833305575356842, + 329289434195386, + 343415038085749, + 21888242871839275222246405745257275088548364400416034343698204069500916595916, + 332970557638087, + 21888242871839275222246405745257275088548364400416034343698203654514086787678, + 21888242871839275222246405745257275088548364400416034343698203856445857085421, + 191099376511426, + 21888242871839275222246405745257275088548364400416034343698203704558950561234, + 21888242871839275222246405745257275088548364400416034343698203752875280077761, + 21888242871839275222246405745257275088548364400416034343698203856074945226134, + 37095070985611, + 21888242871839275222246405745257275088548364400416034343698203924389587847480, + 515606210833306, + 345988916119942, + 376875582786539, + 21888242871839275222246405745257275088548364400416034343698203960453023941616, + 21888242871839275222246405745257275088548364400416034343698203918337035560172, + 31860511207800, + 288339230382342, + 21888242871839275222246405745257275088548364400416034343698203881526211812932, + 371080507637559, + 21888242871839275222246405745257275088548364400416034343698203885323429066672, + 21888242871839275222246405745257275088548364400416034343698203984539982334096, + 21888242871839275222246405745257275088548364400416034343698203919687242259644, + 92178030163082, + 242622143339078, + 21888242871839275222246405745257275088548364400416034343698204075480478479734, + 21888242871839275222246405745257275088548364400416034343698204176470537230163, + 451578555834898, + 365370573628196, + 507097178424455, + 175280677737015, + 21888242871839275222246405745257275088548364400416034343698203788349357575358, + 21888242871839275222246405745257275088548364400416034343698204107067009861120, + 264226233194150, + 31935570698834, + 436949598594194, + 321193560020437, + 21888242871839275222246405745257275088548364400416034343698203846485130299539, + 21888242871839275222246405745257275088548364400416034343698203843540248250649, + 42959342830133, + 21888242871839275222246405745257275088548364400416034343698204089383972090111, + 268001460678874, + 21888242871839275222246405745257275088548364400416034343698204039251992022502, + 21888242871839275222246405745257275088548364400416034343698203800033038590378, + 21888242871839275222246405745257275088548364400416034343698203975705158474516, + 21888242871839275222246405745257275088548364400416034343698203964287567301861, + 21888242871839275222246405745257275088548364400416034343698203676458878431649, + 21888242871839275222246405745257275088548364400416034343698204073928217648788, + 105921997871003, + 71006255943830, + 432029046826225, + 247578353309699, + 544782976375455, + 21888242871839275222246405745257275088548364400416034343698204115193745535167, + 206860243317319, + 21888242871839275222246405745257275088548364400416034343698204136058225935788, + 554320974161555, + 516076531419572, + 529003636182383, + 133498532964015, + 21888242871839275222246405745257275088548364400416034343698204067437659582141, + 158807436044838, + 150116305808090, + 396305673599255, + 186666966986698, + 21888242871839275222246405745257275088548364400416034343698204185403142918645, + 21888242871839275222246405745257275088548364400416034343698203731894994188541, + 21888242871839275222246405745257275088548364400416034343698204040655081463983, + 21888242871839275222246405745257275088548364400416034343698203945190873375604, + 525398440471549, + 57612361844299, + 21888242871839275222246405745257275088548364400416034343698203889129832145764, + 412729808598653, + 453191065462539, + 21888242871839275222246405745257275088548364400416034343698204153051885507320, + 521441074405149, + 21888242871839275222246405745257275088548364400416034343698203775994844765157, + 307033089288619, + 21888242871839275222246405745257275088548364400416034343698203975171077940268, + 459865652000468, + 21888242871839275222246405745257275088548364400416034343698203834626660061797, + 21888242871839275222246405745257275088548364400416034343698203691953465924130, + 520160390366502, + 21888242871839275222246405745257275088548364400416034343698204021374202020075, + 21888242871839275222246405745257275088548364400416034343698203816900184861172, + 222442957526026, + 263847077368057, + 21888242871839275222246405745257275088548364400416034343698203984719060358751, + 241425671903952, + 44619313363686, + 21888242871839275222246405745257275088548364400416034343698203820392152382752, + 75045488323641, + 21888242871839275222246405745257275088548364400416034343698204094372814368516, + 146028678168067, + 481096577622648, + 21888242871839275222246405745257275088548364400416034343698204101597691870128, + 541430235134855, + 548429263993198, + 21888242871839275222246405745257275088548364400416034343698203849578964043218, + 66237153437494, + 76517253870311, + 272953206433193, + 55991736122247, + 21888242871839275222246405745257275088548364400416034343698203788076923347764, + 400546854767653, + 21888242871839275222246405745257275088548364400416034343698203806338327035245, + 102226357973174, + 241298035431656, + 438282248524302, + 308786655368726, + 21888242871839275222246405745257275088548364400416034343698203769125009908916, + 392472421060260, + 21888242871839275222246405745257275088548364400416034343698203804900268605103, + 140102931769605, + 448321602033579, + 440780239363002, + 528627569768081, + 21888242871839275222246405745257275088548364400416034343698203803064843800510, + 21888242871839275222246405745257275088548364400416034343698203676511903527500, + 172488385177165, + 182475819694326, + 21888242871839275222246405745257275088548364400416034343698204180854883000772, + 21888242871839275222246405745257275088548364400416034343698204035406778308324, + 21888242871839275222246405745257275088548364400416034343698203866864455210164, + 46927365160964, + 21888242871839275222246405745257275088548364400416034343698203741498615888367, + 21888242871839275222246405745257275088548364400416034343698204080115743458145, + 127886936657911, + 445942436688326, + 133642904981591, + 21888242871839275222246405745257275088548364400416034343698203860778900458713, + 379168810040199, + 21888242871839275222246405745257275088548364400416034343698203669326857790793, + 21888242871839275222246405745257275088548364400416034343698203908763483538367, + 438174327448468, + 21888242871839275222246405745257275088548364400416034343698203797608022787083, + 21888242871839275222246405745257275088548364400416034343698203729956908300000, + 161882826869323, + 9057958199755, + 276221142185130, + 105308687821334, + 251448151769306, + 125182652696576, + 21888242871839275222246405745257275088548364400416034343698203638076236148531, + 468626620373102, + 272959530487393, + 21888242871839275222246405745257275088548364400416034343698203665167739860165, + 21888242871839275222246405745257275088548364400416034343698203802852412321986, + 21888242871839275222246405745257275088548364400416034343698203879968158916872, + 102544914640089, + 26970979892267, + 336426464786060, + 21888242871839275222246405745257275088548364400416034343698203867378650525875, + 21888242871839275222246405745257275088548364400416034343698203883316859197121, + 21888242871839275222246405745257275088548364400416034343698204109318549854250, + 21888242871839275222246405745257275088548364400416034343698203776604931215608, + 423076957245299, + 554159275100622, + 21888242871839275222246405745257275088548364400416034343698203834265083694799, + 449551167402125, + 21888242871839275222246405745257275088548364400416034343698203773976196480284, + 179653462778474, + 420927653116666, + 79320194301443, + 21888242871839275222246405745257275088548364400416034343698203655543004260938, + 21888242871839275222246405745257275088548364400416034343698203821923013714439, + 21888242871839275222246405745257275088548364400416034343698203909656961643287, + 196645981612870, + 268803010766423, + 80876818009516, + 21888242871839275222246405745257275088548364400416034343698203988481997370789, + 18713292291880, + 357298018663929, + 21888242871839275222246405745257275088548364400416034343698203731723882917545, + 21888242871839275222246405745257275088548364400416034343698204074760911165577, + 430540726844952, + 21888242871839275222246405745257275088548364400416034343698203931842076225293, + 504505825904041, + 21888242871839275222246405745257275088548364400416034343698203983074421317696, + 21888242871839275222246405745257275088548364400416034343698203809299130115706, + 21888242871839275222246405745257275088548364400416034343698204103343741862187, + 21888242871839275222246405745257275088548364400416034343698204040456581625592, + 298864743789655, + 21888242871839275222246405745257275088548364400416034343698203919183912157875, + 14188140440213, + 252595149127488, + 205528454910818, + 21888242871839275222246405745257275088548364400416034343698203736196313490680, + 21888242871839275222246405745257275088548364400416034343698203806750467825087, + 21888242871839275222246405745257275088548364400416034343698203962387864767090, + 21888242871839275222246405745257275088548364400416034343698204145581456002510, + 21888242871839275222246405745257275088548364400416034343698203892682644954526, + 21888242871839275222246405745257275088548364400416034343698203962504063554306, + 21888242871839275222246405745257275088548364400416034343698204117794474747633, + 21888242871839275222246405745257275088548364400416034343698204095173064247325, + 21888242871839275222246405745257275088548364400416034343698204098887694961629, + 21888242871839275222246405745257275088548364400416034343698203762655882987356, + 449502274236218, + 21888242871839275222246405745257275088548364400416034343698203831635904339137, + 21888242871839275222246405745257275088548364400416034343698203688973829155431, + 397309346640957, + 545003172346813, + 21888242871839275222246405745257275088548364400416034343698203955606307687355, + 21888242871839275222246405745257275088548364400416034343698203667077512235627, + 21888242871839275222246405745257275088548364400416034343698203656492781383983, + 21888242871839275222246405745257275088548364400416034343698203739387085717271, + 21888242871839275222246405745257275088548364400416034343698204126607886203894, + 21888242871839275222246405745257275088548364400416034343698203625639677685796, + 198377545979072, + 30141398317193, + 21888242871839275222246405745257275088548364400416034343698204006924716921607, + 386565966592036, + 74532507745865, + 410434382016259, + 250124663645352, + 125921529028244, + 62930848751062, + 324787837824782, + 106664569626687, + 21888242871839275222246405745257275088548364400416034343698203799551980127272, + 21888242871839275222246405745257275088548364400416034343698203927485708219343, + 21888242871839275222246405745257275088548364400416034343698203729721557922924, + 438350725215268, + 35981859980709, + 179314344826542, + 21888242871839275222246405745257275088548364400416034343698204040483902922351, + 137677093849893, + 21888242871839275222246405745257275088548364400416034343698203805687891775498, + 21888242871839275222246405745257275088548364400416034343698204005190315590530, + 21888242871839275222246405745257275088548364400416034343698203846662150157680, + 21888242871839275222246405745257275088548364400416034343698203998615123475487, + 21888242871839275222246405745257275088548364400416034343698204095820590682746, + 533411624507896, + 363936243253850, + 477682527201940, + 21888242871839275222246405745257275088548364400416034343698204182601364732061, + 21888242871839275222246405745257275088548364400416034343698203877813878461515, + 21888242871839275222246405745257275088548364400416034343698203721330446230593, + 21888242871839275222246405745257275088548364400416034343698203732280534414833, + 518258225209313, + 86108002578935, + 21888242871839275222246405745257275088548364400416034343698203821269753149348, + 21888242871839275222246405745257275088548364400416034343698203764751935978101, + 300563270236603, + 21888242871839275222246405745257275088548364400416034343698204083161605021216, + 21888242871839275222246405745257275088548364400416034343698203873389006947121, + 21888242871839275222246405745257275088548364400416034343698204057220142972876, + 152710389090054, + 484313502878620, + 537341861466233, + 21888242871839275222246405745257275088548364400416034343698204143512255317677, + 21888242871839275222246405745257275088548364400416034343698203631679423538694, + 21888242871839275222246405745257275088548364400416034343698203990904852020165, + 21888242871839275222246405745257275088548364400416034343698204174142707273699, + 21888242871839275222246405745257275088548364400416034343698204088405449293798, + 21888242871839275222246405745257275088548364400416034343698203786670254674310, + 21888242871839275222246405745257275088548364400416034343698204111960502282397, + 21888242871839275222246405745257275088548364400416034343698203907881931346966, + 541050521512022, + 21888242871839275222246405745257275088548364400416034343698203727010333104451, + 21888242871839275222246405745257275088548364400416034343698203852948746684241, + 407609424343222, + 35247932132274, + 21888242871839275222246405745257275088548364400416034343698204159769445896298, + 490997113657159, + 21888242871839275222246405745257275088548364400416034343698203846808477872937, + 513985884326014, + 21888242871839275222246405745257275088548364400416034343698203800384790278131, + 21888242871839275222246405745257275088548364400416034343698204174933622496915, + 129578858169576, + 494407359502613, + 503171686799322, + 21888242871839275222246405745257275088548364400416034343698204078143253411370, + 21888242871839275222246405745257275088548364400416034343698203748198196626931, + 21888242871839275222246405745257275088548364400416034343698203902592938546700, + 21888242871839275222246405745257275088548364400416034343698203730267814468006, + 390594029901874, + 21888242871839275222246405745257275088548364400416034343698204083059985396092, + 21888242871839275222246405745257275088548364400416034343698204004099691873109, + 21888242871839275222246405745257275088548364400416034343698203698546908602842, + 491569430517888, + 21888242871839275222246405745257275088548364400416034343698203949136123631673, + 414013827975558, + 21888242871839275222246405745257275088548364400416034343698203925988711665776, + 21888242871839275222246405745257275088548364400416034343698204129478899860709, + 21888242871839275222246405745257275088548364400416034343698204075751207762317, + 135313483696673, + 245506894478673, + 21888242871839275222246405745257275088548364400416034343698203722784520235549, + 21888242871839275222246405745257275088548364400416034343698203812749819871692, + 21888242871839275222246405745257275088548364400416034343698204158764705622887, + 21888242871839275222246405745257275088548364400416034343698203722413360353663, + 391365435079256, + 494633531253904, + 21888242871839275222246405745257275088548364400416034343698203710302568297507, + 79099620600413, + 21888242871839275222246405745257275088548364400416034343698203850120983087341, + 218996362567458, + 184937615466500, + 543150679904923, + 47882915808560, + 21888242871839275222246405745257275088548364400416034343698204118045375490703, + 68820549321570, + 535370776238650, + 21888242871839275222246405745257275088548364400416034343698203640842956332441, + 21888242871839275222246405745257275088548364400416034343698203805270187428847, + 21888242871839275222246405745257275088548364400416034343698203687273211396768, + 333723628234956, + 21888242871839275222246405745257275088548364400416034343698203865256050884088, + 529636162611679, + 21888242871839275222246405745257275088548364400416034343698204043234350893974, + 21888242871839275222246405745257275088548364400416034343698203725412325275768, + 74619289327095, + 21888242871839275222246405745257275088548364400416034343698203887348795234451, + 21888242871839275222246405745257275088548364400416034343698203827102802873379, + 192084158280647, + 21888242871839275222246405745257275088548364400416034343698203733712865600095, + 128293196478034, + 96101245635103, + 21888242871839275222246405745257275088548364400416034343698203938536949110913, + 396830724358146, + 88630721723611, + 21888242871839275222246405745257275088548364400416034343698203710986322550488, + 314808243023487, + 21888242871839275222246405745257275088548364400416034343698203661167649267474, + 21888242871839275222246405745257275088548364400416034343698203894565981651374, + 21888242871839275222246405745257275088548364400416034343698204172759410417574, + 21888242871839275222246405745257275088548364400416034343698203725604468282059, + 21888242871839275222246405745257275088548364400416034343698204084165279743593, + 21888242871839275222246405745257275088548364400416034343698203839287821861454, + 289600968078218, + 13336980857416, + 55035636953189, + 551134261675443, + 536592186868646, + 21888242871839275222246405745257275088548364400416034343698203690185221221658, + 21888242871839275222246405745257275088548364400416034343698204054239763436767, + 21888242871839275222246405745257275088548364400416034343698203919842113242973, + 113947377890228, + 263625783342291, + 409080315456402, + 16014811688951, + 66288251241724, + 230369349755947, + 21888242871839275222246405745257275088548364400416034343698203703284423288017, + 23381337149690, + 21888242871839275222246405745257275088548364400416034343698203766462941789530, + 21888242871839275222246405745257275088548364400416034343698204185553432063903, + 21888242871839275222246405745257275088548364400416034343698203932725616833132, + 495081443558794, + 21888242871839275222246405745257275088548364400416034343698203739824254067608, + 21888242871839275222246405745257275088548364400416034343698203735380357655193, + 96634649881772, + 501004708877442, + 191135093838556, + 21888242871839275222246405745257275088548364400416034343698203917455462641825, + 18040607140276, + 491168859428922, + 245029053562822, + 21888242871839275222246405745257275088548364400416034343698203846795582442481, + 386419566299424, + 21888242871839275222246405745257275088548364400416034343698204123236489931626, + 312125410542126, + 21888242871839275222246405745257275088548364400416034343698203847631242895002, + 21888242871839275222246405745257275088548364400416034343698204140670768079640, + 21888242871839275222246405745257275088548364400416034343698204113288509071133, + 21888242871839275222246405745257275088548364400416034343698203663832345637465, + 279120799260536, + 300842878240932, + 21888242871839275222246405745257275088548364400416034343698203939687273928919, + 487195612762432, + 57886232024836, + 42308450594504, + 21888242871839275222246405745257275088548364400416034343698203838185476044198, + 205165507278804, + 21888242871839275222246405745257275088548364400416034343698203957323236134284, + 140426724737846, + 379522636758512, + 21888242871839275222246405745257275088548364400416034343698203705993832534145, + 21888242871839275222246405745257275088548364400416034343698203791062088106140, + 88786130785157, + 528864502006549, + 76278023801517, + 21888242871839275222246405745257275088548364400416034343698203884979487961999, + 259385366330190, + 57078959520314, + 21888242871839275222246405745257275088548364400416034343698203820336876777676, + 21888242871839275222246405745257275088548364400416034343698204085127731813028, + 21888242871839275222246405745257275088548364400416034343698204058901785202868, + 21888242871839275222246405745257275088548364400416034343698204028872522401182, + 21888242871839275222246405745257275088548364400416034343698204030240714521665, + 21888242871839275222246405745257275088548364400416034343698204068945631926818, + 440331491356069, + 21888242871839275222246405745257275088548364400416034343698204148406824909694, + 142315555869410, + 21888242871839275222246405745257275088548364400416034343698204068971805169842, + 299577733376129, + 264540216260994, + 21888242871839275222246405745257275088548364400416034343698203696859997418578, + 431558219373070, + 21888242871839275222246405745257275088548364400416034343698203969347496971527, + 21888242871839275222246405745257275088548364400416034343698204033211137186285, + 458432038618214, + 144728131152444, + 21888242871839275222246405745257275088548364400416034343698204158670347644912, + 402450118956219, + 357885496244257, + 21888242871839275222246405745257275088548364400416034343698203712107600686870, + 38322235746508, + 196040538330836, + 21888242871839275222246405745257275088548364400416034343698203868538082553241, + 21602096332448, + 21888242871839275222246405745257275088548364400416034343698204121338141318963, + 372225288540293, + 21888242871839275222246405745257275088548364400416034343698203782802653622229, + 26516421067855, + 36375942762883, + 21888242871839275222246405745257275088548364400416034343698203920528440346124, + 502297429022463, + 21888242871839275222246405745257275088548364400416034343698203931015344212085, + 483960543888786, + 21888242871839275222246405745257275088548364400416034343698204110231066550058, + 279467015413730, + 21888242871839275222246405745257275088548364400416034343698204033504075670644, + 21888242871839275222246405745257275088548364400416034343698203628166530439264, + 71777700515247, + 21888242871839275222246405745257275088548364400416034343698203668961205030417, + 21888242871839275222246405745257275088548364400416034343698203810506030220794, + 233025492402344, + 173101743975619, + 384202403417851, + 128909432651849, + 417583209245929, + 21888242871839275222246405745257275088548364400416034343698203800969818880762, + 234492468757870, + 288281870956861, + 201944744194252, + 93603429502115, + 16867924538424, + 360256400364369, + 21888242871839275222246405745257275088548364400416034343698204027363484508570, + 21888242871839275222246405745257275088548364400416034343698203776159622807178, + 103053781404444, + 21888242871839275222246405745257275088548364400416034343698203777427821772305, + 21888242871839275222246405745257275088548364400416034343698203983749780308156, + 345970290909444, + 242085310496318, + 21888242871839275222246405745257275088548364400416034343698204068364809910513, + 21888242871839275222246405745257275088548364400416034343698204037704897469262, + 105014000835516, + 411662745784227, + 92799799392050, + 21888242871839275222246405745257275088548364400416034343698203676441922446590, + 21888242871839275222246405745257275088548364400416034343698204052702921681492, + 21888242871839275222246405745257275088548364400416034343698203736628273284537, + 21888242871839275222246405745257275088548364400416034343698203727963588407068, + 21888242871839275222246405745257275088548364400416034343698203966106389985035, + 450295960493410, + 21888242871839275222246405745257275088548364400416034343698204081475340155134, + 21888242871839275222246405745257275088548364400416034343698203770538683564675, + 174788978757849, + 462609982883585, + 21888242871839275222246405745257275088548364400416034343698203988037729553870, + 150366484007452, + 1997233118588, + 336666225335301, + 21888242871839275222246405745257275088548364400416034343698203803393501790146, + 471884399941603, + 395471090414789, + 21888242871839275222246405745257275088548364400416034343698203835096391531841, + 375701485314137, + 478378249233616, + 199043126188274, + 21888242871839275222246405745257275088548364400416034343698203809734525154468, + 234738565632183, + 511820790124228, + 525477530603019, + 21888242871839275222246405745257275088548364400416034343698204103599467733339, + 21888242871839275222246405745257275088548364400416034343698203745456988041574, + 192709703881694, + 21888242871839275222246405745257275088548364400416034343698204002575932517477, + 21888242871839275222246405745257275088548364400416034343698203714022558336566, + 21888242871839275222246405745257275088548364400416034343698204109929231332611, + 21888242871839275222246405745257275088548364400416034343698204020926372947422, + 325979028867247, + 21888242871839275222246405745257275088548364400416034343698204137666113590941, + 253006382551355, + 21888242871839275222246405745257275088548364400416034343698203862678412461664, + 21888242871839275222246405745257275088548364400416034343698204022672863833741, + 201472079265749, + 450510470744242, + 506937530455169, + 77496929688581, + 362510217471506, + 21888242871839275222246405745257275088548364400416034343698204000557688447987, + 21888242871839275222246405745257275088548364400416034343698204059982848084903, + 21888242871839275222246405745257275088548364400416034343698203907247463957199, + 144156854059915, + 469698058103700, + 21888242871839275222246405745257275088548364400416034343698203946170899376065, + 386572627810764, + 21888242871839275222246405745257275088548364400416034343698203804695187597136, + 21888242871839275222246405745257275088548364400416034343698203633988587890516, + 28304262451338, + 21888242871839275222246405745257275088548364400416034343698204018741299554682, + 21888242871839275222246405745257275088548364400416034343698203822436769224128, + 21888242871839275222246405745257275088548364400416034343698204012413980996744, + 21888242871839275222246405745257275088548364400416034343698203950178189229378, + 21888242871839275222246405745257275088548364400416034343698204148840277269727, + 21888242871839275222246405745257275088548364400416034343698204000503217648592, + 21888242871839275222246405745257275088548364400416034343698204006566778983717, + 300590273563729, + 21888242871839275222246405745257275088548364400416034343698204060971307239981, + 336592145954783, + 21888242871839275222246405745257275088548364400416034343698204135954889554976, + 446099140798221, + 374375687262097, + 345020394459935, + 500642661324486, + 21888242871839275222246405745257275088548364400416034343698203768429916712620, + 21888242871839275222246405745257275088548364400416034343698203749821202120790, + 461836358749730, + 92801764965658, + 434285141696859, + 21888242871839275222246405745257275088548364400416034343698203869811083206498, + 21888242871839275222246405745257275088548364400416034343698203857380616098125, + 21888242871839275222246405745257275088548364400416034343698203797000636631396, + 21888242871839275222246405745257275088548364400416034343698203685793929887488, + 246691802507947, + 550018435950888, + 184691779862218, + 480878525297568, + 21888242871839275222246405745257275088548364400416034343698204048328590018996, + 318297655431309, + 21888242871839275222246405745257275088548364400416034343698204099683764350513, + 21888242871839275222246405745257275088548364400416034343698203938766037038816, + 21888242871839275222246405745257275088548364400416034343698204124093268885999, + 139838742520848, + 424860287418159, + 138241190689030, + 395188493224626, + 415001763922965, + 21888242871839275222246405745257275088548364400416034343698203750507276102275, + 127459598967455, + 21888242871839275222246405745257275088548364400416034343698204177070557996395, + 21888242871839275222246405745257275088548364400416034343698203903322185894184, + 81785117141040, + 310139503436399, + 75675420040827, + 409331280111902, + 21888242871839275222246405745257275088548364400416034343698203746313930580118, + 21888242871839275222246405745257275088548364400416034343698203808576962399198, + 21888242871839275222246405745257275088548364400416034343698204074370460777004, + 41560381074008, + 328300907637356, + 495277934707452, + 21888242871839275222246405745257275088548364400416034343698204078055946816647, + 443549389518851, + 21888242871839275222246405745257275088548364400416034343698203804577177998179, + 21888242871839275222246405745257275088548364400416034343698204054384175993596, + 327853485032376, + 313360390197010, + 274457868422975, + 253397969588338, + 104810020522164, + 21888242871839275222246405745257275088548364400416034343698203796215281177015, + 42878460019580, + 21888242871839275222246405745257275088548364400416034343698203932703563154058, + 21888242871839275222246405745257275088548364400416034343698203797835603825810, + 353504833282705, + 85446916194774, + 21888242871839275222246405745257275088548364400416034343698203932703554952755, + 21888242871839275222246405745257275088548364400416034343698203920592653334819, + 417802309889610, + 398773087798102, + 29542007376106, + 124581852261666, + 21888242871839275222246405745257275088548364400416034343698203762194859973708, + 510978247363900, + 21888242871839275222246405745257275088548364400416034343698204063553322913779, + 21888242871839275222246405745257275088548364400416034343698204111329996806386, + 364999042628499, + 229590869892003, + 21888242871839275222246405745257275088548364400416034343698204154968384262158, + 21888242871839275222246405745257275088548364400416034343698204129952109224923, + 21888242871839275222246405745257275088548364400416034343698203974799699655785, + 361279749224867, + 21888242871839275222246405745257275088548364400416034343698203697667106219065, + 254377588709068, + 21888242871839275222246405745257275088548364400416034343698204079752231779565, + 21888242871839275222246405745257275088548364400416034343698204178068592130291, + 21888242871839275222246405745257275088548364400416034343698203774017880800788, + 168313565180452, + 21888242871839275222246405745257275088548364400416034343698204184104950170958, + 21888242871839275222246405745257275088548364400416034343698203986949731737416, + 548475990881742, + 359302123186670, + 21888242871839275222246405745257275088548364400416034343698204063037782184477, + 219060837684796, + 60428030895318, + 21888242871839275222246405745257275088548364400416034343698204124889460601012, + 335758589005690, + 21888242871839275222246405745257275088548364400416034343698204110121520224181, + 275380033722963, + 21888242871839275222246405745257275088548364400416034343698203978963184881067, + 21888242871839275222246405745257275088548364400416034343698203705730071367643, + 21888242871839275222246405745257275088548364400416034343698203970766022606955, + 21888242871839275222246405745257275088548364400416034343698204053599242648005, + 379336695187623, + 21888242871839275222246405745257275088548364400416034343698203957819580789279, + 21888242871839275222246405745257275088548364400416034343698203674216924776439, + 21888242871839275222246405745257275088548364400416034343698204077406430660297, + 21888242871839275222246405745257275088548364400416034343698204012918311719906, + 151907479221522, + 98137046880069, + 345438422395111, + 82971561758557, + 21888242871839275222246405745257275088548364400416034343698204027303321480566, + 21888242871839275222246405745257275088548364400416034343698203856494215971167, + 21888242871839275222246405745257275088548364400416034343698203965087562158373, + 21888242871839275222246405745257275088548364400416034343698203692171524386969, + 278341071496554, + 21888242871839275222246405745257275088548364400416034343698203761786001002428, + 188183486527233, + 21888242871839275222246405745257275088548364400416034343698203635058552244300, + 206105819349095, + 215441352697927, + 21888242871839275222246405745257275088548364400416034343698204035528651781742, + 21888242871839275222246405745257275088548364400416034343698203845855417861022, + 144428632545741, + 21888242871839275222246405745257275088548364400416034343698203808962428295769, + 265491107703785, + 484710282935790, + 21888242871839275222246405745257275088548364400416034343698204121509547576021, + 21888242871839275222246405745257275088548364400416034343698204013172682236849, + 399310032319547, + 168247095895058, + 21888242871839275222246405745257275088548364400416034343698203867334619735284, + 215358688303006, + 233854259992921, + 395524645700738, + 21888242871839275222246405745257275088548364400416034343698203844039680430914, + 500411503350823, + 21888242871839275222246405745257275088548364400416034343698203964368311690509, + 450509873160756, + 104769849325784, + 239897422702844, + 21888242871839275222246405745257275088548364400416034343698204023957671564438, + 21888242871839275222246405745257275088548364400416034343698203943666019159361, + 17458498066508, + 21888242871839275222246405745257275088548364400416034343698204131477778239586, + 300380014785607, + 425439285415000, + 542669006159431, + 489494012686057, + 21888242871839275222246405745257275088548364400416034343698204048868643552154, + 21888242871839275222246405745257275088548364400416034343698203816903412977506, + 413976635210723, + 127954878198090, + 382904288394734, + 497871416929468, + 309183965731947, + 431736938941485, + 21888242871839275222246405745257275088548364400416034343698204174883312024774, + 21888242871839275222246405745257275088548364400416034343698203945884196399710, + 21888242871839275222246405745257275088548364400416034343698204159788797196176, + 304715511053259, + 21888242871839275222246405745257275088548364400416034343698203624253506384668, + 21888242871839275222246405745257275088548364400416034343698204090530820592613, + 121158439820840, + 21888242871839275222246405745257275088548364400416034343698204068220916554704, + 21888242871839275222246405745257275088548364400416034343698203693679770603220, + 474741704006894, + 21888242871839275222246405745257275088548364400416034343698204119957866364128, + 37363840659643, + 21888242871839275222246405745257275088548364400416034343698203910290953572202, + 337021948710935, + 21888242871839275222246405745257275088548364400416034343698203738288030707105, + 78885323048886, + 21888242871839275222246405745257275088548364400416034343698203768758268356371, + 21888242871839275222246405745257275088548364400416034343698203751906948967232, + 449873778933148, + 377532956406059, + 440531671527146, + 21888242871839275222246405745257275088548364400416034343698203834254910884217, + 548505724924491, + 21888242871839275222246405745257275088548364400416034343698204098824453715182, + 21888242871839275222246405745257275088548364400416034343698204060339996242151, + 21888242871839275222246405745257275088548364400416034343698203800252318205070, + 21888242871839275222246405745257275088548364400416034343698203930825205212925, + 21888242871839275222246405745257275088548364400416034343698203647330405425371, + 416242472736833, + 21888242871839275222246405745257275088548364400416034343698203822663210451626, + 232024199846743, + 21888242871839275222246405745257275088548364400416034343698203736053468058822, + 21888242871839275222246405745257275088548364400416034343698204073679451592283, + 101611480659162, + 21888242871839275222246405745257275088548364400416034343698204098049775763944, + 42020539676756, + 556551309644769, + 182163825154745, + 90005327082056, + 529180690783097, + 38824821329240, + 21888242871839275222246405745257275088548364400416034343698203745967152862056, + 449462495319723, + 21888242871839275222246405745257275088548364400416034343698204126901396420867, + 177307768489549, + 277496376545246, + 368585697218926, + 184725039443053, + 66771111889793, + 21888242871839275222246405745257275088548364400416034343698203996269427911425, + 437565832730193, + 21888242871839275222246405745257275088548364400416034343698203631048326496285, + 505453587370439, + 286212970478179, + 21888242871839275222246405745257275088548364400416034343698204168808771303011, + 404930567988026, + 21888242871839275222246405745257275088548364400416034343698203995649514810389, + 491390237238296, + 5104469577373, + 21888242871839275222246405745257275088548364400416034343698203884043067670515, + 21888242871839275222246405745257275088548364400416034343698203704425537858977, + 447714469011984, + 264728020903958, + 481483866105361, + 21888242871839275222246405745257275088548364400416034343698204163754741862639, + 21888242871839275222246405745257275088548364400416034343698203657697058702851, + 330140951444758, + 21888242871839275222246405745257275088548364400416034343698203867228352293996, + 21888242871839275222246405745257275088548364400416034343698203935406962612522, + 21888242871839275222246405745257275088548364400416034343698203845121372573205, + 21888242871839275222246405745257275088548364400416034343698204020108750185014, + 21888242871839275222246405745257275088548364400416034343698203919275396925297, + 21888242871839275222246405745257275088548364400416034343698203766753513438123, + 21888242871839275222246405745257275088548364400416034343698203711025449576218, + 21888242871839275222246405745257275088548364400416034343698203800461115462763, + 21888242871839275222246405745257275088548364400416034343698203808661510074964, + 91896892524204, + 21888242871839275222246405745257275088548364400416034343698203784568393999384, + 21888242871839275222246405745257275088548364400416034343698203688509065451170, + 21888242871839275222246405745257275088548364400416034343698204160696126855213, + 21888242871839275222246405745257275088548364400416034343698203923742624590497, + 326239621388681, + 21888242871839275222246405745257275088548364400416034343698203753044009692779, + 21888242871839275222246405745257275088548364400416034343698203699305627985235, + 21888242871839275222246405745257275088548364400416034343698203936583556688773, + 21888242871839275222246405745257275088548364400416034343698203744789135040724, + 473594187628708, + 21888242871839275222246405745257275088548364400416034343698203984544114079385, + 21888242871839275222246405745257275088548364400416034343698204050831959807268, + 267462221849091, + 500828333112677, + 21888242871839275222246405745257275088548364400416034343698203797010876173741, + 63782279712785, + 21888242871839275222246405745257275088548364400416034343698203796121888021216, + 21888242871839275222246405745257275088548364400416034343698204069233597758731, + 260197650827309, + 21888242871839275222246405745257275088548364400416034343698204044584775310811, + 21888242871839275222246405745257275088548364400416034343698203785959964455558, + 21888242871839275222246405745257275088548364400416034343698203806757013130385, + 21888242871839275222246405745257275088548364400416034343698203787023988257130, + 552320883621490, + 21888242871839275222246405745257275088548364400416034343698203636911606057634, + 21888242871839275222246405745257275088548364400416034343698203906936135787465, + 21888242871839275222246405745257275088548364400416034343698203890453561134319, + 25224771592425, + 21888242871839275222246405745257275088548364400416034343698203851847937903328, + 21888242871839275222246405745257275088548364400416034343698203955811205735714, + 21888242871839275222246405745257275088548364400416034343698203788122481652410, + 21888242871839275222246405745257275088548364400416034343698204018643968056287, + 21888242871839275222246405745257275088548364400416034343698203870703339262632, + 475132999956375, + 21888242871839275222246405745257275088548364400416034343698203734710210641591, + 21888242871839275222246405745257275088548364400416034343698203658563339403206, + 110529587363675, + 529614375945398, + 139134399512672, + 226346863266659, + 210396385728255, + 6565436632240, + 158258753586878, + 478947513142690, + 459576044314608, + 21888242871839275222246405745257275088548364400416034343698203848287412238165, + 559693849517240, + 21888242871839275222246405745257275088548364400416034343698203962728786861595, + 492237416903412, + 486888359252961, + 21888242871839275222246405745257275088548364400416034343698203744112476197773, + 186190005232230, + 17268692762933, + 21888242871839275222246405745257275088548364400416034343698203722459247365361, + 445834705919569, + 21888242871839275222246405745257275088548364400416034343698204002890799982087, + 347791216439886, + 482301411703175, + 21888242871839275222246405745257275088548364400416034343698204060891356755144, + 21888242871839275222246405745257275088548364400416034343698203691216904726658, + 34043274476196, + 485648194031999, + 21888242871839275222246405745257275088548364400416034343698203763615544686469, + 21888242871839275222246405745257275088548364400416034343698203805543243812349, + 255532848150, + 324646667372927, + 21888242871839275222246405745257275088548364400416034343698203760523872890024, + 188894059048232, + 512072816893904, + 21888242871839275222246405745257275088548364400416034343698204046266719446966, + 21888242871839275222246405745257275088548364400416034343698203681774971518545, + 517060436846429, + 21888242871839275222246405745257275088548364400416034343698204078560919871310, + 506016076334230, + 21888242871839275222246405745257275088548364400416034343698203846769955808927, + 21888242871839275222246405745257275088548364400416034343698203727787706116247, + 21888242871839275222246405745257275088548364400416034343698203656309041665738, + 21888242871839275222246405745257275088548364400416034343698203847578918784525, + 21888242871839275222246405745257275088548364400416034343698203951424932795652, + 21888242871839275222246405745257275088548364400416034343698204051641298697938, + 21888242871839275222246405745257275088548364400416034343698204158260405082517, + 21888242871839275222246405745257275088548364400416034343698204175938419299637, + 21888242871839275222246405745257275088548364400416034343698204075516320634325, + 359139851848261, + 21888242871839275222246405745257275088548364400416034343698203956887560743217, + 333499478664272, + 461252592267324, + 21888242871839275222246405745257275088548364400416034343698203870861218540377, + 265193510360971, + 21888242871839275222246405745257275088548364400416034343698203753806796117826, + 34619341888797, + 233293422374169, + 248154240965227, + 21888242871839275222246405745257275088548364400416034343698204084573347440618, + 219107638401345, + 21888242871839275222246405745257275088548364400416034343698203703548674718504, + 21888242871839275222246405745257275088548364400416034343698203663214585270643, + 21888242871839275222246405745257275088548364400416034343698204125870612825062, + 516533130766568, + 484383422480296, + 243330313157841, + 21888242871839275222246405745257275088548364400416034343698204169500959973712, + 261389466579384, + 21888242871839275222246405745257275088548364400416034343698203630871004865461, + 21888242871839275222246405745257275088548364400416034343698203768555986564443, + 21888242871839275222246405745257275088548364400416034343698204167632006386822, + 182949851561622, + 21888242871839275222246405745257275088548364400416034343698203893006598576633, + 254254544309004, + 21888242871839275222246405745257275088548364400416034343698204059562510441901, + 528197703262270, + 486851097223881, + 21888242871839275222246405745257275088548364400416034343698204083559799118019, + 109142109114037, + 21888242871839275222246405745257275088548364400416034343698203842034767105606, + 21888242871839275222246405745257275088548364400416034343698203761259943211954, + 21888242871839275222246405745257275088548364400416034343698203760586459799899, + 291679994366493, + 21888242871839275222246405745257275088548364400416034343698203965319304713463, + 466476865883346, + 21888242871839275222246405745257275088548364400416034343698203701147825599508, + 244296859929717, + 21888242871839275222246405745257275088548364400416034343698204182346253802831, + 21888242871839275222246405745257275088548364400416034343698203678565824888022, + 21888242871839275222246405745257275088548364400416034343698204005507977618967, + 177634411172574, + 21888242871839275222246405745257275088548364400416034343698203940412076370504, + 21888242871839275222246405745257275088548364400416034343698204123258666108532, + 168502785343962, + 203527057247820, + 291844819671032, + 21888242871839275222246405745257275088548364400416034343698203628868646915044, + 21888242871839275222246405745257275088548364400416034343698203708565724681677, + 21888242871839275222246405745257275088548364400416034343698204060078006055839, + 157280588883494, + 21888242871839275222246405745257275088548364400416034343698204129346243759351, + 498368375269306, + 21888242871839275222246405745257275088548364400416034343698203991326400683984, + 21888242871839275222246405745257275088548364400416034343698203961694811013788, + 15866622648600, + 21888242871839275222246405745257275088548364400416034343698203643010801557848, + 21888242871839275222246405745257275088548364400416034343698203626318825921699, + 160711635321057, + 322112854788192, + 21888242871839275222246405745257275088548364400416034343698204174879154156682, + 507109437534089, + 21888242871839275222246405745257275088548364400416034343698204003097891703279, + 21888242871839275222246405745257275088548364400416034343698203893023952152855, + 21888242871839275222246405745257275088548364400416034343698203890170339543459, + 21888242871839275222246405745257275088548364400416034343698204046000882440828, + 21888242871839275222246405745257275088548364400416034343698204093971188507171, + 21888242871839275222246405745257275088548364400416034343698204113729798530696, + 324312449164805, + 310957171852245, + 426376196792501, + 369674013641706, + 21888242871839275222246405745257275088548364400416034343698203981182407692480, + 6206953092631, + 21888242871839275222246405745257275088548364400416034343698204109610413967585, + 21888242871839275222246405745257275088548364400416034343698203857881738255853, + 428709955171906, + 295217542222715, + 480828804677048, + 384512374402540, + 21888242871839275222246405745257275088548364400416034343698204157825274380822, + 337764851233256, + 174121307194869, + 21888242871839275222246405745257275088548364400416034343698203993115369770265, + 21888242871839275222246405745257275088548364400416034343698203996693908653752, + 534974106000761, + 21888242871839275222246405745257275088548364400416034343698204098815465689990, + 21888242871839275222246405745257275088548364400416034343698203981398504112269, + 51823862634833, + 266038060701703, + 280115092980076, + 21888242871839275222246405745257275088548364400416034343698204075019211862106, + 21888242871839275222246405745257275088548364400416034343698204174299129325548, + 14491598072646, + 380454229602143, + 388927625121918, + 395672160120143, + 432339252229435, + 21888242871839275222246405745257275088548364400416034343698203895776015820941, + 489502118604072, + 21888242871839275222246405745257275088548364400416034343698204045583336392248, + 144805665632985, + 21888242871839275222246405745257275088548364400416034343698204038415682589538, + 21888242871839275222246405745257275088548364400416034343698203667250745445684, + 21888242871839275222246405745257275088548364400416034343698203708676382313349, + 21888242871839275222246405745257275088548364400416034343698203822107860390363, + 21888242871839275222246405745257275088548364400416034343698204152451833489141, + 425917094915402, + 21888242871839275222246405745257275088548364400416034343698203968811178445762, + 21888242871839275222246405745257275088548364400416034343698203993179575596543, + 21888242871839275222246405745257275088548364400416034343698204109860873896271, + 21888242871839275222246405745257275088548364400416034343698203643394671811005, + 396997395879153, + 21888242871839275222246405745257275088548364400416034343698204081816879470435, + 21888242871839275222246405745257275088548364400416034343698204177548425631793, + 254248374860169, + 56091128595656, + 145187938697562, + 21888242871839275222246405745257275088548364400416034343698204085532831157913, + 21888242871839275222246405745257275088548364400416034343698203793595932676737, + 162971059154871, + 21888242871839275222246405745257275088548364400416034343698203853260826687083, + 70638459850982, + 157971855681920, + 322777377586706, + 190259015038369, + 21888242871839275222246405745257275088548364400416034343698203869265486069558, + 97585080704189, + 21888242871839275222246405745257275088548364400416034343698203871920614148836, + 511377359645116, + 21888242871839275222246405745257275088548364400416034343698203940275101875622, + 21888242871839275222246405745257275088548364400416034343698203771868145818630, + 7232390359553, + 21888242871839275222246405745257275088548364400416034343698203725046232340705, + 41120237242313, + 21888242871839275222246405745257275088548364400416034343698204090327973725065, + 21888242871839275222246405745257275088548364400416034343698204106202916442373, + 504519092739034, + 199983568757214, + 21888242871839275222246405745257275088548364400416034343698203625640412815328, + 21888242871839275222246405745257275088548364400416034343698203654528533296683, + 126377098003466, + 21888242871839275222246405745257275088548364400416034343698203792200482853704, + 94838059251287, + 21888242871839275222246405745257275088548364400416034343698203978541970739806, + 21888242871839275222246405745257275088548364400416034343698204089625355381143, + 21888242871839275222246405745257275088548364400416034343698203870778354169606, + 21888242871839275222246405745257275088548364400416034343698203919240744358122, + 21888242871839275222246405745257275088548364400416034343698203752339044230283, + 21888242871839275222246405745257275088548364400416034343698204178864117632709, + 21888242871839275222246405745257275088548364400416034343698204178256689856582, + 21888242871839275222246405745257275088548364400416034343698203931605397585300, + 21888242871839275222246405745257275088548364400416034343698203775117720603501, + 21888242871839275222246405745257275088548364400416034343698203918023027239261, + 405704886411246, + 21888242871839275222246405745257275088548364400416034343698203687380969460448, + 21888242871839275222246405745257275088548364400416034343698203706198703605981, + 161797249707517, + 21888242871839275222246405745257275088548364400416034343698204140438369432871, + 272494827302425, + 21888242871839275222246405745257275088548364400416034343698203731500367289121, + 229868584514025, + 21888242871839275222246405745257275088548364400416034343698203666843019645973, + 21888242871839275222246405745257275088548364400416034343698204153489485399614, + 70456988231076, + 21888242871839275222246405745257275088548364400416034343698204079379864742273, + 21888242871839275222246405745257275088548364400416034343698204113025250512782, + 440090789224993, + 78557440159887, + 21888242871839275222246405745257275088548364400416034343698203908554384264768, + 486606173026678, + 21888242871839275222246405745257275088548364400416034343698204124976140352146, + 148549118401288, + 21888242871839275222246405745257275088548364400416034343698204058124450838654, + 21888242871839275222246405745257275088548364400416034343698204169540138690772, + 401753237328945, + 179438506762274, + 233426256475506, + 21888242871839275222246405745257275088548364400416034343698204103704363792216, + 21888242871839275222246405745257275088548364400416034343698203954312204632686, + 21888242871839275222246405745257275088548364400416034343698204053700557425194, + 21888242871839275222246405745257275088548364400416034343698203902551899228175, + 21888242871839275222246405745257275088548364400416034343698203979340221918361, + 21888242871839275222246405745257275088548364400416034343698204046156413924887, + 21888242871839275222246405745257275088548364400416034343698203866593565976215, + 21888242871839275222246405745257275088548364400416034343698204132622236049355, + 21888242871839275222246405745257275088548364400416034343698203923261704385773, + 21888242871839275222246405745257275088548364400416034343698203958629381840569, + 283012027819714, + 455058076339518, + 393031764186624, + 21888242871839275222246405745257275088548364400416034343698204101646610041182, + 21888242871839275222246405745257275088548364400416034343698203940150350589469, + 128254229565224, + 248611165938569, + 480596710899912, + 21888242871839275222246405745257275088548364400416034343698203684663918613015, + 209919384085045, + 333049582245176, + 151609424792160, + 51918785659760, + 21888242871839275222246405745257275088548364400416034343698203630826875011944, + 76360694455706, + 422987255705254, + 206800409119336, + 287704674473803, + 255864844845164, + 295626466040872, + 206826783393332, + 530906139341635, + 53502147168352, + 21888242871839275222246405745257275088548364400416034343698203974013604528477, + 67287264909614, + 21888242871839275222246405745257275088548364400416034343698204033404065349756, + 398476466592530, + 21888242871839275222246405745257275088548364400416034343698203977773779576544, + 21888242871839275222246405745257275088548364400416034343698203931157407218477, + 75862282140687, + 119078405292265, + 175019939990886, + 237708205763205, + 372561530499350, + 183096110790570, + 21888242871839275222246405745257275088548364400416034343698203985620298497631, + 130596877823147, + 21888242871839275222246405745257275088548364400416034343698203649583333830860, + 189468285528952, + 21888242871839275222246405745257275088548364400416034343698203811118688094948, + 21888242871839275222246405745257275088548364400416034343698203660699277379288, + 21888242871839275222246405745257275088548364400416034343698204076191226907151, + 106700188708487, + 21888242871839275222246405745257275088548364400416034343698203942835255090255, + 430843174292009, + 160052800630901, + 428987286115925, + 111505142805293, + 21888242871839275222246405745257275088548364400416034343698204098987023644034, + 21888242871839275222246405745257275088548364400416034343698203832361347416503, + 21888242871839275222246405745257275088548364400416034343698204094354963569100, + 21888242871839275222246405745257275088548364400416034343698203900680017106200, + 21888242871839275222246405745257275088548364400416034343698203757084079961489, + 21888242871839275222246405745257275088548364400416034343698203891182642440280, + 21888242871839275222246405745257275088548364400416034343698203974764349577173, + 149914628227330, + 43375190384823, + 361070406557257, + 21888242871839275222246405745257275088548364400416034343698204062736088664877, + 476161003367139, + 508800179355508, + 21888242871839275222246405745257275088548364400416034343698204040940928390401, + 510321053024579, + 21888242871839275222246405745257275088548364400416034343698203734512061231006, + 526741093754960, + 76986834430341, + 211765614634637, + 21888242871839275222246405745257275088548364400416034343698203827470217245266, + 190136692396237, + 21888242871839275222246405745257275088548364400416034343698203956100448133739, + 45330066005682, + 21888242871839275222246405745257275088548364400416034343698204173685416226269, + 305483034384526, + 21888242871839275222246405745257275088548364400416034343698203994112401239928, + 402218426460917, + 21888242871839275222246405745257275088548364400416034343698203684015656942388, + 21888242871839275222246405745257275088548364400416034343698203758041737581781, + 21888242871839275222246405745257275088548364400416034343698203745331186514334, + 21888242871839275222246405745257275088548364400416034343698203665740553450365, + 157781093558511, + 21888242871839275222246405745257275088548364400416034343698204104064488185040, + 21888242871839275222246405745257275088548364400416034343698204173371207530395, + 4900117712852, + 290620213355740, + 157826046016752, + 21888242871839275222246405745257275088548364400416034343698203919615900332635, + 21888242871839275222246405745257275088548364400416034343698204083015785660282, + 111802687201252, + 21888242871839275222246405745257275088548364400416034343698203807885675765678, + 21888242871839275222246405745257275088548364400416034343698203665011500015845, + 21888242871839275222246405745257275088548364400416034343698203951411915652156, + 474911918173126, + 293724174304309, + 281666948713058, + 157655207868027, + 21888242871839275222246405745257275088548364400416034343698203720115916252605, + 234215395907908, + 21888242871839275222246405745257275088548364400416034343698204134787857085864, + 21888242871839275222246405745257275088548364400416034343698203894280593199407, + 166411709136839, + 72910303267810, + 21888242871839275222246405745257275088548364400416034343698203631088200738332, + 21888242871839275222246405745257275088548364400416034343698203831109206894093, + 50591395148801, + 21888242871839275222246405745257275088548364400416034343698203937067048493654, + 167278251019192, + 21888242871839275222246405745257275088548364400416034343698204050433177291828, + 71855182077474, + 21888242871839275222246405745257275088548364400416034343698203990812081907861, + 21888242871839275222246405745257275088548364400416034343698204152865106624498, + 21888242871839275222246405745257275088548364400416034343698203936139633961520, + 162641689777427, + 21888242871839275222246405745257275088548364400416034343698203737869265968315, + 560471800559902, + 174991536400268, + 304236217281607, + 61986392910090, + 525869189404721, + 21888242871839275222246405745257275088548364400416034343698204173111080922814, + 531524383695669, + 116738483217215, + 21888242871839275222246405745257275088548364400416034343698203738602766322565, + 21888242871839275222246405745257275088548364400416034343698204107901860176721, + 21888242871839275222246405745257275088548364400416034343698203816751143436494, + 21888242871839275222246405745257275088548364400416034343698204054013938656018, + 439381444248541, + 489695377149449, + 279948633651287, + 434680157819503, + 13621278614091, + 21888242871839275222246405745257275088548364400416034343698203881172809474162, + 491548633665153, + 400398259329428, + 301631139246299, + 381879487959012, + 21888242871839275222246405745257275088548364400416034343698203809910171203478, + 364308290841401, + 21888242871839275222246405745257275088548364400416034343698203687615649705158, + 202609943734932, + 517314337989950, + 10663120388276, + 26735947737037, + 408557389366495, + 494880281919077, + 21888242871839275222246405745257275088548364400416034343698203932168483206995, + 206273745495162, + 21888242871839275222246405745257275088548364400416034343698203819273875734405, + 543876985031257, + 21888242871839275222246405745257275088548364400416034343698203749283808726254, + 21888242871839275222246405745257275088548364400416034343698204143681928823570, + 62280595958022, + 421725688856399, + 559768032609128, + 21888242871839275222246405745257275088548364400416034343698204154160747799645, + 248190058253030, + 21888242871839275222246405745257275088548364400416034343698204186400950970562, + 461393416286978, + 384904999244934, + 469861818263859, + 21888242871839275222246405745257275088548364400416034343698203971768915211188, + 21888242871839275222246405745257275088548364400416034343698203840391117325139, + 21888242871839275222246405745257275088548364400416034343698203818967091085737, + 21888242871839275222246405745257275088548364400416034343698204165240459467110, + 346107920303113, + 21888242871839275222246405745257275088548364400416034343698204044956955938091, + 21888242871839275222246405745257275088548364400416034343698203921183971384020, + 21888242871839275222246405745257275088548364400416034343698204081593208655408, + 21888242871839275222246405745257275088548364400416034343698203789155042997106, + 443848576949586, + 21888242871839275222246405745257275088548364400416034343698203883874995167028, + 330408076216732, + 341907783375385, + 21888242871839275222246405745257275088548364400416034343698203830940242657517, + 270552546091278, + 549732094259372, + 21888242871839275222246405745257275088548364400416034343698203692199616647160, + 21888242871839275222246405745257275088548364400416034343698204028785914171370, + 21888242871839275222246405745257275088548364400416034343698203705355487021909, + 21888242871839275222246405745257275088548364400416034343698203828905385903455, + 21888242871839275222246405745257275088548364400416034343698203905826234771293, + 430849843271711, + 559970752714704, + 321097725570238, + 21888242871839275222246405745257275088548364400416034343698204018807018459723, + 300250153260986, + 63173637458175, + 20863157835101, + 21888242871839275222246405745257275088548364400416034343698203903129816511966, + 274021618060767, + 156460541907167, + 21888242871839275222246405745257275088548364400416034343698203670259947344203, + 21888242871839275222246405745257275088548364400416034343698203778733213339154, + 21888242871839275222246405745257275088548364400416034343698204003128935026260, + 21888242871839275222246405745257275088548364400416034343698204159824203421946, + 21888242871839275222246405745257275088548364400416034343698204127924157080576, + 21888242871839275222246405745257275088548364400416034343698203845817499179291, + 21888242871839275222246405745257275088548364400416034343698203735558756496252, + 21888242871839275222246405745257275088548364400416034343698203716654543868937, + 371672066297246, + 21888242871839275222246405745257275088548364400416034343698203969974702629271, + 305173992473722, + 21888242871839275222246405745257275088548364400416034343698203942229722552379, + 301193021167066, + 540960545965943, + 21888242871839275222246405745257275088548364400416034343698203774198784192859, + 21888242871839275222246405745257275088548364400416034343698203977757585917984, + 439899426968189, + 21888242871839275222246405745257275088548364400416034343698204184917441607698, + 21888242871839275222246405745257275088548364400416034343698203732890730508380, + 505592390003122, + 515344488021107, + 21888242871839275222246405745257275088548364400416034343698204009926058143998, + 21888242871839275222246405745257275088548364400416034343698203639792888908115, + 185830040860186, + 215660805845399, + 199495440955736, + 21888242871839275222246405745257275088548364400416034343698204056536963378591, + 363435733364349, + 309127371599832, + 21888242871839275222246405745257275088548364400416034343698203716972763570653, + 21888242871839275222246405745257275088548364400416034343698203876822047245626, + 21888242871839275222246405745257275088548364400416034343698203720430506439873, + 96167048085075, + 21888242871839275222246405745257275088548364400416034343698203995402305970613, + 21888242871839275222246405745257275088548364400416034343698203824226896839958, + 21888242871839275222246405745257275088548364400416034343698203847694349173453, + 21888242871839275222246405745257275088548364400416034343698204007912773323772, + 99371220248298, + 21888242871839275222246405745257275088548364400416034343698203740133492069827, + 389289107907108, + 21888242871839275222246405745257275088548364400416034343698203878264207354207, + 19506179473662, + 21888242871839275222246405745257275088548364400416034343698204032709159464381, + 501314729416362, + 422544663141704, + 21888242871839275222246405745257275088548364400416034343698203691913872113754, + 88210054671552, + 21888242871839275222246405745257275088548364400416034343698203893742075276561, + 21888242871839275222246405745257275088548364400416034343698203878891618921212, + 301162201438965, + 357650068440227, + 21888242871839275222246405745257275088548364400416034343698203865678175189254, + 71424120730755, + 347969145792315, + 350320377886834, + 21888242871839275222246405745257275088548364400416034343698204124462417685597, + 540949901184500, + 377928253663255, + 77389355506622, + 414816843061051, + 21888242871839275222246405745257275088548364400416034343698204155073481537614, + 484892198631447, + 21888242871839275222246405745257275088548364400416034343698204168530489402577, + 45898720489823, + 21888242871839275222246405745257275088548364400416034343698203850110957143421, + 21888242871839275222246405745257275088548364400416034343698203637470402175998, + 21888242871839275222246405745257275088548364400416034343698203727491659189918, + 21888242871839275222246405745257275088548364400416034343698204177267820351382, + 45097329414135, + 270154038537876, + 21888242871839275222246405745257275088548364400416034343698204055836876786828, + 21888242871839275222246405745257275088548364400416034343698203626826851622977, + 21888242871839275222246405745257275088548364400416034343698203887989653773160, + 166664186902257, + 21888242871839275222246405745257275088548364400416034343698204061091630900773, + 21888242871839275222246405745257275088548364400416034343698203987344310445825, + 21888242871839275222246405745257275088548364400416034343698203658628557130371, + 219824368850658, + 220260176988191, + 516446519955613, + 410916680662405, + 141490011242781, + 87983301932486, + 183530091217179, + 291858102802815, + 135142591751731, + 345959229796367, + 21888242871839275222246405745257275088548364400416034343698203694322866214749, + 21888242871839275222246405745257275088548364400416034343698203718255782098355, + 244776785942925, + 26131023493163, + 138307961495912, + 480625204475740, + 73173405474076, + 21888242871839275222246405745257275088548364400416034343698204104029575476960, + 110185920296422, + 21888242871839275222246405745257275088548364400416034343698203956365214043911, + 121602703216459, + 21888242871839275222246405745257275088548364400416034343698203880658677565417, + 21888242871839275222246405745257275088548364400416034343698203923103844016902, + 21888242871839275222246405745257275088548364400416034343698203839429797308619, + 21888242871839275222246405745257275088548364400416034343698204080665257575034, + 21888242871839275222246405745257275088548364400416034343698203955862290884694, + 21888242871839275222246405745257275088548364400416034343698203934672195985744, + 21888242871839275222246405745257275088548364400416034343698203997817611052613, + 282076305563556, + 21888242871839275222246405745257275088548364400416034343698204002813086707876, + 21888242871839275222246405745257275088548364400416034343698204141798864072297, + 21888242871839275222246405745257275088548364400416034343698203986261013714532, + 432708771594220, + 21888242871839275222246405745257275088548364400416034343698203727379754434567, + 21888242871839275222246405745257275088548364400416034343698204118323341242951, + 497959511323236, + 21888242871839275222246405745257275088548364400416034343698204032594331057753, + 368869795179540, + 21888242871839275222246405745257275088548364400416034343698203807485830629627, + 160195933431392, + 21888242871839275222246405745257275088548364400416034343698203996322567413458, + 424482546767050, + 494969845734652, + 21888242871839275222246405745257275088548364400416034343698204147195603867153, + 21888242871839275222246405745257275088548364400416034343698203668182663531940, + 322309307176058, + 398097945851361, + 21888242871839275222246405745257275088548364400416034343698204074852397975509, + 523823785470437, + 21888242871839275222246405745257275088548364400416034343698203837199543168205, + 21888242871839275222246405745257275088548364400416034343698203839230168067202, + 149278742287770, + 21888242871839275222246405745257275088548364400416034343698203679026843939871, + 21888242871839275222246405745257275088548364400416034343698204115077428031145, + 546146884177061, + 21888242871839275222246405745257275088548364400416034343698203943630406727112, + 181729260424148, + 231184267985159, + 21888242871839275222246405745257275088548364400416034343698204051026017430710, + 427213326402149, + 495580539457897, + 21888242871839275222246405745257275088548364400416034343698203654465513670393, + 21888242871839275222246405745257275088548364400416034343698203693624451151118, + 491641013061178, + 21888242871839275222246405745257275088548364400416034343698203672243607955204, + 21888242871839275222246405745257275088548364400416034343698203871248079770423, + 21888242871839275222246405745257275088548364400416034343698203912190908976502, + 21888242871839275222246405745257275088548364400416034343698203750264579322685, + 21888242871839275222246405745257275088548364400416034343698204180844307635702, + 21888242871839275222246405745257275088548364400416034343698204088270566284635, + 194748283513388, + 464312405846051, + 297812187447656, + 21888242871839275222246405745257275088548364400416034343698204093070969297168, + 283368539336170, + 510083372913946, + 285360008501081, + 21888242871839275222246405745257275088548364400416034343698203929715578692994, + 180945878552623, + 21888242871839275222246405745257275088548364400416034343698203876462360727348, + 364458418358073, + 208292683833570, + 21888242871839275222246405745257275088548364400416034343698203971410829388967, + 82881054959401, + 156037060508993, + 21888242871839275222246405745257275088548364400416034343698203904103292711635, + 481857176884685, + 21888242871839275222246405745257275088548364400416034343698203835628426735067, + 37697463735817, + 21888242871839275222246405745257275088548364400416034343698203667715095015188, + 374542459693178, + 21888242871839275222246405745257275088548364400416034343698204044988210472032, + 21888242871839275222246405745257275088548364400416034343698204170605642036302, + 179654683950652, + 252265651112631, + 21888242871839275222246405745257275088548364400416034343698204164835552047770, + 21888242871839275222246405745257275088548364400416034343698204156608581522139, + 21888242871839275222246405745257275088548364400416034343698204115743272424652, + 21888242871839275222246405745257275088548364400416034343698204004146893309843, + 556827052613793, + 21888242871839275222246405745257275088548364400416034343698203646639963101626, + 21888242871839275222246405745257275088548364400416034343698204028750322724956, + 48238426940422, + 21888242871839275222246405745257275088548364400416034343698203644821503150330, + 386200963915688, + 21888242871839275222246405745257275088548364400416034343698204092130581387699, + 470994883078938, + 49390010615991, + 192237143747757, + 435059996965593, + 487204162193709, + 144460539731664, + 21888242871839275222246405745257275088548364400416034343698203653130290415907, + 21888242871839275222246405745257275088548364400416034343698204029560553672477, + 237531132862078, + 117180504116183, + 21888242871839275222246405745257275088548364400416034343698204055044615846108, + 500615181391671, + 58458365933972, + 21888242871839275222246405745257275088548364400416034343698204171669700856612, + 328379624177527, + 21888242871839275222246405745257275088548364400416034343698203679287984586473, + 291864943195149, + 21888242871839275222246405745257275088548364400416034343698203945406145114681, + 21888242871839275222246405745257275088548364400416034343698203724600693965424, + 21888242871839275222246405745257275088548364400416034343698203856455958527319, + 21888242871839275222246405745257275088548364400416034343698203810023621692801, + 21888242871839275222246405745257275088548364400416034343698203740596418350520, + 21888242871839275222246405745257275088548364400416034343698203646375436149987, + 293515733371995, + 21888242871839275222246405745257275088548364400416034343698203836128262460200, + 322507983905089, + 21888242871839275222246405745257275088548364400416034343698203628408584698279, + 269376329649025, + 21888242871839275222246405745257275088548364400416034343698203764897915616301, + 21888242871839275222246405745257275088548364400416034343698203668724748304763, + 21888242871839275222246405745257275088548364400416034343698203862625205411258, + 21888242871839275222246405745257275088548364400416034343698204180042965330288, + 292951852645041, + 21888242871839275222246405745257275088548364400416034343698203919371835274282, + 21888242871839275222246405745257275088548364400416034343698203860475237703933, + 123364091206851, + 21888242871839275222246405745257275088548364400416034343698203763955012062972, + 21888242871839275222246405745257275088548364400416034343698203733591019566872, + 21888242871839275222246405745257275088548364400416034343698203992597302493859, + 21888242871839275222246405745257275088548364400416034343698204172260607672011, + 507122639916092, + 19579035371403, + 21888242871839275222246405745257275088548364400416034343698203704720185108174, + 21888242871839275222246405745257275088548364400416034343698203761034965232349, + 301601897354778, + 21888242871839275222246405745257275088548364400416034343698203976202554716748, + 14278922126953, + 468125512393331, + 21888242871839275222246405745257275088548364400416034343698204066236310014480, + 289929272901674, + 475263533796615, + 499135811577686, + 484160031434576, + 21888242871839275222246405745257275088548364400416034343698203913203456253693, + 21888242871839275222246405745257275088548364400416034343698204019426926495211, + 21888242871839275222246405745257275088548364400416034343698203858833409512348, + 21888242871839275222246405745257275088548364400416034343698203623978282311670, + 21888242871839275222246405745257275088548364400416034343698204171388391140910, + 21888242871839275222246405745257275088548364400416034343698204044884986513812, + 361234309276671, + 21888242871839275222246405745257275088548364400416034343698203672848887712456, + 21888242871839275222246405745257275088548364400416034343698203629735147436947, + 134845980815129, + 153023479800798, + 21888242871839275222246405745257275088548364400416034343698203758313172380561, + 182049316319384, + 21888242871839275222246405745257275088548364400416034343698203866310226902378, + 453782313155220, + 21888242871839275222246405745257275088548364400416034343698204078574057363419, + 533965548053048, + 21888242871839275222246405745257275088548364400416034343698203664694222132561, + 260371690031852, + 369598523579253, + 4505500319113, + 21888242871839275222246405745257275088548364400416034343698203920288569926082, + 370830250017896, + 332380703619106, + 21888242871839275222246405745257275088548364400416034343698203640340081005095, + 162242269740381, + 408820117563475, + 127537271355902, + 21888242871839275222246405745257275088548364400416034343698203744129884577556, + 349067723185598, + 21888242871839275222246405745257275088548364400416034343698203643955671173739, + 21888242871839275222246405745257275088548364400416034343698203964333961944651, + 283200558585991, + 21888242871839275222246405745257275088548364400416034343698204148607033211901, + 124716921736627, + 21888242871839275222246405745257275088548364400416034343698204137938421049839, + 21888242871839275222246405745257275088548364400416034343698203947059163019145, + 466915897104234, + 21888242871839275222246405745257275088548364400416034343698203898454658038591, + 62065531914624, + 21888242871839275222246405745257275088548364400416034343698203717531320896669, + 416602930410815, + 410993403506620, + 21888242871839275222246405745257275088548364400416034343698204023550896426874, + 321661419215789, + 102747092784546, + 53536126018045, + 398984155066995, + 21888242871839275222246405745257275088548364400416034343698203861206638827249, + 540514111772025, + 553357059748895, + 528154367574254, + 106183237152240, + 539640330684708, + 21888242871839275222246405745257275088548364400416034343698203702311411566475, + 21888242871839275222246405745257275088548364400416034343698203764836685756313, + 182847709528605, + 1146976169454, + 21888242871839275222246405745257275088548364400416034343698204045736539311792, + 149213886195891, + 21888242871839275222246405745257275088548364400416034343698204064828261012622, + 21888242871839275222246405745257275088548364400416034343698203831408909557140, + 21888242871839275222246405745257275088548364400416034343698203854036095261787, + 21888242871839275222246405745257275088548364400416034343698204154456133719398, + 495481391789663, + 26428464999566, + 343361894349753, + 21888242871839275222246405745257275088548364400416034343698204100238422154531, + 282576566876644, + 32945810164748, + 342048603174899, + 430893471123187, + 21888242871839275222246405745257275088548364400416034343698204105246881755854, + 21888242871839275222246405745257275088548364400416034343698203973631280124004, + 21888242871839275222246405745257275088548364400416034343698203627897158223672, + ]), + Polynomial::new([ + 21888242871839275222246405745257275088548364400416034343698203976848397061303, + 21888242871839275222246405745257275088548364400416034343698203856703223299034, + 444545169490155, + 21888242871839275222246405745257275088548364400416034343698203721092584455483, + 21888242871839275222246405745257275088548364400416034343698203735934999057467, + 21888242871839275222246405745257275088548364400416034343698203955790092591225, + 112251188889320, + 67291825482021, + 21888242871839275222246405745257275088548364400416034343698203946149681901010, + 258420332137035, + 21888242871839275222246405745257275088548364400416034343698203947097381749927, + 21888242871839275222246405745257275088548364400416034343698204125561968201763, + 21888242871839275222246405745257275088548364400416034343698203873735206414617, + 238667821383616, + 21888242871839275222246405745257275088548364400416034343698204011002218029739, + 21888242871839275222246405745257275088548364400416034343698203672916887040494, + 21888242871839275222246405745257275088548364400416034343698203712728444618737, + 70543164997263, + 181447203983683, + 125140836061496, + 457017060396308, + 343607104127517, + 368579242074992, + 21888242871839275222246405745257275088548364400416034343698203672016916467088, + 166162735958164, + 178696735623688, + 21888242871839275222246405745257275088548364400416034343698203962086853763458, + 21734443281689, + 21888242871839275222246405745257275088548364400416034343698203985728305986139, + 21888242871839275222246405745257275088548364400416034343698203917492893514092, + 548618599631353, + 488802683969648, + 21888242871839275222246405745257275088548364400416034343698203936795183234999, + 474289069608909, + 21888242871839275222246405745257275088548364400416034343698203902149220939255, + 521269293249591, + 21888242871839275222246405745257275088548364400416034343698204114923317687645, + 21888242871839275222246405745257275088548364400416034343698203944644091530233, + 21888242871839275222246405745257275088548364400416034343698204145037886010864, + 472115329158337, + 209862313579539, + 21888242871839275222246405745257275088548364400416034343698204184632342999664, + 21888242871839275222246405745257275088548364400416034343698203740994057544217, + 512745785533409, + 21888242871839275222246405745257275088548364400416034343698203982241578705985, + 501890862474520, + 21888242871839275222246405745257275088548364400416034343698203633300548218437, + 355442555900316, + 21888242871839275222246405745257275088548364400416034343698203963614628118309, + 21888242871839275222246405745257275088548364400416034343698204015907926065931, + 21888242871839275222246405745257275088548364400416034343698203776112372238309, + 462943135975905, + 21888242871839275222246405745257275088548364400416034343698204075334543730013, + 553151661268500, + 433562112028662, + 66802806594343, + 21888242871839275222246405745257275088548364400416034343698203890593812970873, + 21888242871839275222246405745257275088548364400416034343698204042548592378287, + 498225628738167, + 21888242871839275222246405745257275088548364400416034343698203781867834288678, + 21888242871839275222246405745257275088548364400416034343698204119851730487891, + 159199389346586, + 21888242871839275222246405745257275088548364400416034343698203729185527118214, + 21888242871839275222246405745257275088548364400416034343698203878478686624993, + 21888242871839275222246405745257275088548364400416034343698203903191146792565, + 21888242871839275222246405745257275088548364400416034343698203807254813685004, + 21888242871839275222246405745257275088548364400416034343698204098038012202617, + 80860367242987, + 21888242871839275222246405745257275088548364400416034343698204110070301176765, + 32752334592690, + 556732634856969, + 21888242871839275222246405745257275088548364400416034343698203853012936599644, + 486838307948680, + 21888242871839275222246405745257275088548364400416034343698203779401313526587, + 21888242871839275222246405745257275088548364400416034343698203868522720203156, + 50451232307765, + 361307980549134, + 21888242871839275222246405745257275088548364400416034343698203734438278521293, + 21888242871839275222246405745257275088548364400416034343698204038937888700097, + 222909163794325, + 178909477076399, + 21888242871839275222246405745257275088548364400416034343698203632270317627654, + 21888242871839275222246405745257275088548364400416034343698204181214018004403, + 21888242871839275222246405745257275088548364400416034343698204007654408120192, + 275523939168778, + 21888242871839275222246405745257275088548364400416034343698203957735301062179, + 546350977846427, + 21888242871839275222246405745257275088548364400416034343698203667559263902134, + 341603225064678, + 21888242871839275222246405745257275088548364400416034343698203763257292165772, + 510049741503126, + 21888242871839275222246405745257275088548364400416034343698203640063483385671, + 21888242871839275222246405745257275088548364400416034343698203854213706079214, + 21888242871839275222246405745257275088548364400416034343698204159589532060847, + 392762777479915, + 368875164010610, + 21888242871839275222246405745257275088548364400416034343698204040647762697231, + 535269102366040, + 231713529668620, + 21888242871839275222246405745257275088548364400416034343698203952869984936380, + 21888242871839275222246405745257275088548364400416034343698203975871262158382, + 21888242871839275222246405745257275088548364400416034343698204145107558636986, + 21888242871839275222246405745257275088548364400416034343698203692689136118401, + 530366469189258, + 104443989642900, + 169591266471764, + 21888242871839275222246405745257275088548364400416034343698204018214212816915, + 21888242871839275222246405745257275088548364400416034343698204183880430360635, + 101631064260425, + 356438987743732, + 538667662389950, + 469890482544123, + 21888242871839275222246405745257275088548364400416034343698204131044279807604, + 396962294296515, + 371773932207969, + 21888242871839275222246405745257275088548364400416034343698203693230016541132, + 11535568618868, + 257062079556673, + 21888242871839275222246405745257275088548364400416034343698204133356894146858, + 21888242871839275222246405745257275088548364400416034343698203909921056787480, + 21888242871839275222246405745257275088548364400416034343698203658576889016383, + 292424083196075, + 21888242871839275222246405745257275088548364400416034343698203718679412948791, + 21888242871839275222246405745257275088548364400416034343698204182135770377050, + 21888242871839275222246405745257275088548364400416034343698203679247564056141, + 21888242871839275222246405745257275088548364400416034343698203825959417269090, + 21888242871839275222246405745257275088548364400416034343698203919744355512210, + 493584011729438, + 21888242871839275222246405745257275088548364400416034343698203680271885516384, + 28847628947688, + 21888242871839275222246405745257275088548364400416034343698203728082748868647, + 21888242871839275222246405745257275088548364400416034343698203942056715801502, + 21888242871839275222246405745257275088548364400416034343698204159152854724946, + 21888242871839275222246405745257275088548364400416034343698203678660371791512, + 21888242871839275222246405745257275088548364400416034343698203837243643655222, + 142751672581882, + 112655248921641, + 50410711753284, + 21888242871839275222246405745257275088548364400416034343698203861809417371194, + 325380318312999, + 21888242871839275222246405745257275088548364400416034343698204084590434601886, + 193977096371513, + 198281412246378, + 21888242871839275222246405745257275088548364400416034343698203811667123286279, + 68742391415395, + 413117268966005, + 21888242871839275222246405745257275088548364400416034343698203884810144704393, + 520528244010641, + 94002488596992, + 63496948460726, + 382008914483300, + 21888242871839275222246405745257275088548364400416034343698203814434906883812, + 21888242871839275222246405745257275088548364400416034343698203911761223317959, + 191559445545283, + 21888242871839275222246405745257275088548364400416034343698203881022833256812, + 21888242871839275222246405745257275088548364400416034343698203695581838939780, + 134154819992165, + 134007106219622, + 21888242871839275222246405745257275088548364400416034343698203794692480942735, + 114125543322902, + 145706301143945, + 21888242871839275222246405745257275088548364400416034343698204011764444726072, + 21888242871839275222246405745257275088548364400416034343698203922903876723407, + 524611433023635, + 149136912990599, + 535666901746196, + 47649358993095, + 21888242871839275222246405745257275088548364400416034343698203861394470061296, + 91626116552527, + 21888242871839275222246405745257275088548364400416034343698203887359794459753, + 21888242871839275222246405745257275088548364400416034343698203818690342693849, + 368171430864151, + 21888242871839275222246405745257275088548364400416034343698203735787340340868, + 34893074656909, + 21888242871839275222246405745257275088548364400416034343698204119865699669655, + 21888242871839275222246405745257275088548364400416034343698204171976816689588, + 21888242871839275222246405745257275088548364400416034343698203901769444016408, + 48114719911560, + 21888242871839275222246405745257275088548364400416034343698203882377519305114, + 196399191109706, + 241770239134066, + 198503950952500, + 197464343106539, + 21888242871839275222246405745257275088548364400416034343698203959961631253273, + 267750262205394, + 21888242871839275222246405745257275088548364400416034343698203939281509153774, + 447646045407223, + 21888242871839275222246405745257275088548364400416034343698204133472491007242, + 375256044587329, + 21888242871839275222246405745257275088548364400416034343698204006341332044623, + 21888242871839275222246405745257275088548364400416034343698203827686074576585, + 558572279646162, + 21888242871839275222246405745257275088548364400416034343698203781178243009974, + 192208615867286, + 21888242871839275222246405745257275088548364400416034343698203891613638358247, + 21888242871839275222246405745257275088548364400416034343698204169728767073523, + 21888242871839275222246405745257275088548364400416034343698203863084082905123, + 7693444184888, + 21888242871839275222246405745257275088548364400416034343698203721384721041834, + 21888242871839275222246405745257275088548364400416034343698203969704674425443, + 104160242068558, + 157745596412890, + 379689563564602, + 21888242871839275222246405745257275088548364400416034343698203809625676510702, + 557781333356795, + 380885271136804, + 21888242871839275222246405745257275088548364400416034343698204109003821116287, + 21888242871839275222246405745257275088548364400416034343698204100986605181318, + 21888242871839275222246405745257275088548364400416034343698204027725714536251, + 21888242871839275222246405745257275088548364400416034343698203789086147166078, + 21888242871839275222246405745257275088548364400416034343698203717065512052108, + 93120587560519, + 528608281974808, + 228165534329260, + 356481042044826, + 98653332653369, + 21888242871839275222246405745257275088548364400416034343698203837798759637004, + 21888242871839275222246405745257275088548364400416034343698203836601633602084, + 21888242871839275222246405745257275088548364400416034343698204148971187096816, + 507242380160117, + 85746406245296, + 208172666678677, + 21888242871839275222246405745257275088548364400416034343698203907195513444456, + 21888242871839275222246405745257275088548364400416034343698204091285166207418, + 21888242871839275222246405745257275088548364400416034343698203757780039462355, + 21888242871839275222246405745257275088548364400416034343698204156548872963465, + 460963699692060, + 78400319116701, + 416270316244946, + 110394979779318, + 156199074430560, + 334226342905936, + 397567840430278, + 453715009655210, + 144286542406239, + 498698237895834, + 21888242871839275222246405745257275088548364400416034343698203956580427299580, + 362447072960210, + 21888242871839275222246405745257275088548364400416034343698203815138407950566, + 21888242871839275222246405745257275088548364400416034343698203647820331128933, + 21888242871839275222246405745257275088548364400416034343698204063173400480882, + 290017492392212, + 414967596974331, + 447077746829761, + 294762652196140, + 21888242871839275222246405745257275088548364400416034343698203726698534812949, + 479282602704704, + 321246584638117, + 88924015302742, + 81898833108686, + 241603139782642, + 21888242871839275222246405745257275088548364400416034343698203989600574442715, + 21888242871839275222246405745257275088548364400416034343698204104292264335993, + 196206188999490, + 170880384625417, + 21888242871839275222246405745257275088548364400416034343698203874940788158325, + 21888242871839275222246405745257275088548364400416034343698203985570818403438, + 21888242871839275222246405745257275088548364400416034343698203682631404075053, + 21888242871839275222246405745257275088548364400416034343698203901209359931755, + 21888242871839275222246405745257275088548364400416034343698203845176874205281, + 272007054782145, + 181269854933415, + 21888242871839275222246405745257275088548364400416034343698203728682275235717, + 170516095198507, + 21888242871839275222246405745257275088548364400416034343698204164242798281220, + 21888242871839275222246405745257275088548364400416034343698203702751760350618, + 78348633426056, + 307163620492847, + 466258740106309, + 7142486280698, + 21888242871839275222246405745257275088548364400416034343698203814939020424346, + 21888242871839275222246405745257275088548364400416034343698204016375634088845, + 409880133062168, + 116885478557910, + 272357523411221, + 257675814521439, + 267930774320697, + 359052914732540, + 15785993630745, + 21888242871839275222246405745257275088548364400416034343698203672217931258596, + 523016426807564, + 21888242871839275222246405745257275088548364400416034343698204166099105940249, + 21888242871839275222246405745257275088548364400416034343698203634608744899441, + 456413920822650, + 21888242871839275222246405745257275088548364400416034343698203769449043184116, + 21888242871839275222246405745257275088548364400416034343698203737217351882862, + 379314356085387, + 21888242871839275222246405745257275088548364400416034343698203986040452171683, + 86744276164973, + 292638928182270, + 369646089152928, + 239604758032677, + 243470642688860, + 21888242871839275222246405745257275088548364400416034343698203774524228179867, + 21888242871839275222246405745257275088548364400416034343698203946446883623041, + 355997542739413, + 275770261232413, + 64110901199192, + 6932200727703, + 21888242871839275222246405745257275088548364400416034343698203626347106102159, + 21888242871839275222246405745257275088548364400416034343698203913361173282264, + 21888242871839275222246405745257275088548364400416034343698204171282376449509, + 327659912286639, + 499432279077466, + 21888242871839275222246405745257275088548364400416034343698203753686465697864, + 43573805118687, + 326212439280147, + 7997393913522, + 285079692740601, + 263161580762917, + 21888242871839275222246405745257275088548364400416034343698203748258651057646, + 468382873752787, + 21888242871839275222246405745257275088548364400416034343698203984123914323017, + 176471635505895, + 231778712402699, + 237834832480799, + 67445305359413, + 21888242871839275222246405745257275088548364400416034343698203803199333914208, + 53857673630950, + 229309445052193, + 21888242871839275222246405745257275088548364400416034343698204013273098417626, + 318659631985938, + 316034526304917, + 3026791445582, + 274923254616125, + 21888242871839275222246405745257275088548364400416034343698203646892184945327, + 21888242871839275222246405745257275088548364400416034343698203924094109148660, + 61097854282657, + 416011126488475, + 136145682297019, + 21888242871839275222246405745257275088548364400416034343698204026184320856488, + 21888242871839275222246405745257275088548364400416034343698203662640995833098, + 51247918199939, + 185241880551696, + 353519513811499, + 21888242871839275222246405745257275088548364400416034343698204079454302287640, + 235516199496963, + 19468257616613, + 405652407348929, + 21888242871839275222246405745257275088548364400416034343698203662079742469886, + 191920888955205, + 507888044672750, + 96920875132215, + 21888242871839275222246405745257275088548364400416034343698203887858369259106, + 21888242871839275222246405745257275088548364400416034343698203971048198238232, + 21888242871839275222246405745257275088548364400416034343698203908233954905418, + 21888242871839275222246405745257275088548364400416034343698204101035790365302, + 396398460124745, + 21888242871839275222246405745257275088548364400416034343698203863154857078806, + 21888242871839275222246405745257275088548364400416034343698203840223471869321, + 21888242871839275222246405745257275088548364400416034343698203984874092760561, + 21888242871839275222246405745257275088548364400416034343698203918000912868795, + 21888242871839275222246405745257275088548364400416034343698203787675359451002, + 320851888774365, + 21888242871839275222246405745257275088548364400416034343698203829364700728833, + 26334008222167, + 184567058320617, + 154200177389692, + 6921385984749, + 264982947636389, + 552571856441203, + 21888242871839275222246405745257275088548364400416034343698204148628918669313, + 430602011521450, + 255689265945167, + 21888242871839275222246405745257275088548364400416034343698203900228343504044, + 21888242871839275222246405745257275088548364400416034343698204003367643344533, + 426409457457179, + 21888242871839275222246405745257275088548364400416034343698203867065260227291, + 21888242871839275222246405745257275088548364400416034343698203762010409495296, + 21888242871839275222246405745257275088548364400416034343698203825817522440681, + 287713937087898, + 323203238433847, + 545689168067238, + 336532849486582, + 275668547826598, + 21888242871839275222246405745257275088548364400416034343698203896743855666529, + 258965981519612, + 268851468112694, + 538079754638912, + 21888242871839275222246405745257275088548364400416034343698204105241082544926, + 21888242871839275222246405745257275088548364400416034343698204013031789603986, + 21888242871839275222246405745257275088548364400416034343698204025001005625188, + 269922062327464, + 21888242871839275222246405745257275088548364400416034343698203629733976428556, + 554348270871752, + 332345445408510, + 200043520798480, + 80382688538186, + 396132629037627, + 274324117379618, + 21888242871839275222246405745257275088548364400416034343698203652266130236058, + 21291739297486, + 21888242871839275222246405745257275088548364400416034343698204071292060572120, + 21888242871839275222246405745257275088548364400416034343698203647768110254888, + 21888242871839275222246405745257275088548364400416034343698203916486099625207, + 21888242871839275222246405745257275088548364400416034343698203692455611840107, + 21888242871839275222246405745257275088548364400416034343698203782670603702138, + 225148682757036, + 496964168966072, + 21888242871839275222246405745257275088548364400416034343698204088743345717351, + 21888242871839275222246405745257275088548364400416034343698203938338562723518, + 21888242871839275222246405745257275088548364400416034343698203914600779086530, + 461817561536876, + 268319535881780, + 15839048750690, + 21888242871839275222246405745257275088548364400416034343698204055924829909091, + 21888242871839275222246405745257275088548364400416034343698203982859453402617, + 21888242871839275222246405745257275088548364400416034343698204009231961367147, + 513053007801650, + 21888242871839275222246405745257275088548364400416034343698203845272848461301, + 21888242871839275222246405745257275088548364400416034343698203644375357997144, + 129418105929083, + 194997650249150, + 21888242871839275222246405745257275088548364400416034343698204102016953171345, + 265817293755724, + 21888242871839275222246405745257275088548364400416034343698204110570750751913, + 21888242871839275222246405745257275088548364400416034343698203640332549165826, + 299705408618698, + 543479578019446, + 21888242871839275222246405745257275088548364400416034343698203777828415214600, + 21888242871839275222246405745257275088548364400416034343698203899435221634514, + 21888242871839275222246405745257275088548364400416034343698204042786319371684, + 21888242871839275222246405745257275088548364400416034343698204028756805080343, + 21888242871839275222246405745257275088548364400416034343698203882251429790950, + 240165420439039, + 330462010561242, + 521414399967094, + 21888242871839275222246405745257275088548364400416034343698203786971464496653, + 457357833393815, + 75913247212199, + 319401519151058, + 440025685241384, + 21888242871839275222246405745257275088548364400416034343698204003809389225492, + 21888242871839275222246405745257275088548364400416034343698204010015892580723, + 21888242871839275222246405745257275088548364400416034343698203981965843554634, + 390597848003231, + 297637991490686, + 21888242871839275222246405745257275088548364400416034343698204171363475286881, + 21888242871839275222246405745257275088548364400416034343698203826918397719938, + 480428537087834, + 252919136033498, + 312424052527184, + 469203472097691, + 21888242871839275222246405745257275088548364400416034343698203924729369200942, + 21888242871839275222246405745257275088548364400416034343698203760291794891651, + 48339288947642, + 473613865952347, + 21888242871839275222246405745257275088548364400416034343698204037670358396562, + 21888242871839275222246405745257275088548364400416034343698203884171898581657, + 21888242871839275222246405745257275088548364400416034343698204049114203760745, + 91369643701991, + 21888242871839275222246405745257275088548364400416034343698203640231122562644, + 368708402024283, + 21888242871839275222246405745257275088548364400416034343698203674438859252800, + 21888242871839275222246405745257275088548364400416034343698203719219201220899, + 157040700047047, + 21888242871839275222246405745257275088548364400416034343698203637928707573835, + 68337642730200, + 21888242871839275222246405745257275088548364400416034343698203886254677127795, + 346911032143206, + 93620955905877, + 134126828215085, + 410989698724921, + 217841778852397, + 21888242871839275222246405745257275088548364400416034343698203986694061485928, + 21888242871839275222246405745257275088548364400416034343698203856802219557636, + 162894135132834, + 472640658417627, + 47988071952231, + 21888242871839275222246405745257275088548364400416034343698203626341213256696, + 431411357750591, + 543767556962563, + 21888242871839275222246405745257275088548364400416034343698203811393894528141, + 21888242871839275222246405745257275088548364400416034343698203949595431663854, + 275569033989237, + 21888242871839275222246405745257275088548364400416034343698203623714826782489, + 442718560217867, + 554235808681104, + 21888242871839275222246405745257275088548364400416034343698203720974327262081, + 74649024076063, + 21888242871839275222246405745257275088548364400416034343698203727542895733213, + 21888242871839275222246405745257275088548364400416034343698203785402855733501, + 21888242871839275222246405745257275088548364400416034343698203737072672909925, + 21888242871839275222246405745257275088548364400416034343698203908662098985363, + 21888242871839275222246405745257275088548364400416034343698203939366221995960, + 554876704577342, + 21888242871839275222246405745257275088548364400416034343698203653490004341845, + 473706035638801, + 21888242871839275222246405745257275088548364400416034343698203623771119820757, + 21888242871839275222246405745257275088548364400416034343698203674076229910160, + 21888242871839275222246405745257275088548364400416034343698203666840976079317, + 523461836715499, + 21888242871839275222246405745257275088548364400416034343698204015994097906542, + 92213822157627, + 359605965837062, + 21888242871839275222246405745257275088548364400416034343698204027425591845312, + 21888242871839275222246405745257275088548364400416034343698203859212605778574, + 21888242871839275222246405745257275088548364400416034343698204144651679605775, + 21888242871839275222246405745257275088548364400416034343698203929512267163413, + 381090706621966, + 21888242871839275222246405745257275088548364400416034343698203940931785529435, + 184888788536801, + 382415641920625, + 114857978444738, + 21888242871839275222246405745257275088548364400416034343698203745552416484803, + 21888242871839275222246405745257275088548364400416034343698203703696587716087, + 17707509698745, + 21888242871839275222246405745257275088548364400416034343698203937532763319503, + 21888242871839275222246405745257275088548364400416034343698204003913033959644, + 200659247034234, + 21888242871839275222246405745257275088548364400416034343698204086260825552828, + 21888242871839275222246405745257275088548364400416034343698203730552212780075, + 21888242871839275222246405745257275088548364400416034343698204158810964596315, + 331036825489158, + 21888242871839275222246405745257275088548364400416034343698204144998347716738, + 21888242871839275222246405745257275088548364400416034343698203892288080968743, + 21888242871839275222246405745257275088548364400416034343698203912623012508018, + 21888242871839275222246405745257275088548364400416034343698204093614350085533, + 21888242871839275222246405745257275088548364400416034343698203650926744157126, + 317648631850414, + 21888242871839275222246405745257275088548364400416034343698203661914198795089, + 21888242871839275222246405745257275088548364400416034343698203907123111118112, + 21888242871839275222246405745257275088548364400416034343698203872969801854022, + 21888242871839275222246405745257275088548364400416034343698203858689901503219, + 453094239888044, + 453063495732646, + 487137831889882, + 345129210233223, + 213514042239242, + 21888242871839275222246405745257275088548364400416034343698204021442239686412, + 330457087286669, + 21888242871839275222246405745257275088548364400416034343698203782424710175514, + 21888242871839275222246405745257275088548364400416034343698204095680636594874, + 496592113281937, + 349355170595013, + 21888242871839275222246405745257275088548364400416034343698203848659049768905, + 114208907338447, + 21888242871839275222246405745257275088548364400416034343698204044044110855363, + 21888242871839275222246405745257275088548364400416034343698204109069554885912, + 21888242871839275222246405745257275088548364400416034343698204133090223420857, + 21888242871839275222246405745257275088548364400416034343698204165853163369018, + 21888242871839275222246405745257275088548364400416034343698203704542671827216, + 21888242871839275222246405745257275088548364400416034343698203996219717514860, + 21888242871839275222246405745257275088548364400416034343698203905891215377597, + 21888242871839275222246405745257275088548364400416034343698204034394393559739, + 666566843891, + 467708588239217, + 21888242871839275222246405745257275088548364400416034343698203629176579415583, + 21888242871839275222246405745257275088548364400416034343698203654216861566555, + 21888242871839275222246405745257275088548364400416034343698203937082689300773, + 256802583214109, + 52417597505234, + 219688435703375, + 21888242871839275222246405745257275088548364400416034343698203682848410383963, + 21888242871839275222246405745257275088548364400416034343698203928269812638769, + 99163705976619, + 271695512435113, + 273004810415020, + 94381820043986, + 21888242871839275222246405745257275088548364400416034343698204043804436707256, + 21888242871839275222246405745257275088548364400416034343698203803507164437826, + 21888242871839275222246405745257275088548364400416034343698203637090015966451, + 21888242871839275222246405745257275088548364400416034343698203884073954915233, + 369035229178762, + 291002296082652, + 507203619007864, + 422854463793182, + 102374023845519, + 388921897487835, + 21888242871839275222246405745257275088548364400416034343698203714376139332672, + 21888242871839275222246405745257275088548364400416034343698204177243156354140, + 367509383743109, + 319910588509612, + 74631257050527, + 15469335926909, + 134840393478941, + 277669446263812, + 98886766677380, + 209776628656418, + 21888242871839275222246405745257275088548364400416034343698203784255174065806, + 21888242871839275222246405745257275088548364400416034343698204083020577838995, + 21888242871839275222246405745257275088548364400416034343698204169370951363408, + 21888242871839275222246405745257275088548364400416034343698203734717303785566, + 21888242871839275222246405745257275088548364400416034343698204001599990062196, + 155658174074609, + 420166350884857, + 21888242871839275222246405745257275088548364400416034343698203780592640193955, + 444820423064888, + 21888242871839275222246405745257275088548364400416034343698203658734919441330, + 261288547634728, + 21888242871839275222246405745257275088548364400416034343698204067816516383245, + 183088276109303, + 239488120712934, + 177873023644994, + 71973155824966, + 21888242871839275222246405745257275088548364400416034343698203739646898905811, + 167216769346874, + 21888242871839275222246405745257275088548364400416034343698204148165332126845, + 21888242871839275222246405745257275088548364400416034343698203984042550464229, + 21888242871839275222246405745257275088548364400416034343698204073713274058451, + 21888242871839275222246405745257275088548364400416034343698203927003361275719, + 21888242871839275222246405745257275088548364400416034343698203684888871424718, + 256408155194894, + 355186168035397, + 21888242871839275222246405745257275088548364400416034343698203775327134373517, + 21888242871839275222246405745257275088548364400416034343698203952884179995823, + 113531669277436, + 21888242871839275222246405745257275088548364400416034343698204151352343678797, + 21888242871839275222246405745257275088548364400416034343698204141793344367415, + 21888242871839275222246405745257275088548364400416034343698203895421944005086, + 21888242871839275222246405745257275088548364400416034343698203962225460888451, + 21888242871839275222246405745257275088548364400416034343698203937002500513207, + 472069734034136, + 21888242871839275222246405745257275088548364400416034343698203873138978777953, + 467046685353260, + 21888242871839275222246405745257275088548364400416034343698204017478275297054, + 21888242871839275222246405745257275088548364400416034343698203735683205722101, + 21888242871839275222246405745257275088548364400416034343698203856841053446608, + 435791700241988, + 61653870000611, + 21888242871839275222246405745257275088548364400416034343698203983760864290773, + 179628815438444, + 21888242871839275222246405745257275088548364400416034343698203789737973509900, + 142310161726590, + 68101402403777, + 166167518479141, + 82019398715906, + 21888242871839275222246405745257275088548364400416034343698203715565944246505, + 322392484545677, + 223029777891821, + 21888242871839275222246405745257275088548364400416034343698203769515021014111, + 21888242871839275222246405745257275088548364400416034343698204136737671585402, + 21888242871839275222246405745257275088548364400416034343698204038367389476039, + 21888242871839275222246405745257275088548364400416034343698203825621744869940, + 334711661266428, + 478396734641144, + 516412855006631, + 21888242871839275222246405745257275088548364400416034343698204172118683439436, + 21888242871839275222246405745257275088548364400416034343698204131839998155807, + 484371093900310, + 21888242871839275222246405745257275088548364400416034343698204158239845826011, + 21888242871839275222246405745257275088548364400416034343698203644692717644985, + 21888242871839275222246405745257275088548364400416034343698203728203045355452, + 21888242871839275222246405745257275088548364400416034343698204130132409959255, + 21888242871839275222246405745257275088548364400416034343698204129080857325107, + 90574451089707, + 21888242871839275222246405745257275088548364400416034343698203955996338156530, + 92102134148819, + 169679575609740, + 479464081364180, + 29881272163383, + 21888242871839275222246405745257275088548364400416034343698203857393354130384, + 21888242871839275222246405745257275088548364400416034343698204064593527797313, + 21888242871839275222246405745257275088548364400416034343698203965859410048465, + 21888242871839275222246405745257275088548364400416034343698204018314520765256, + 473710832692129, + 437598997575714, + 125332301280456, + 357124779432771, + 205185730136468, + 21888242871839275222246405745257275088548364400416034343698203741301824655298, + 21888242871839275222246405745257275088548364400416034343698203752364403694896, + 294217124102723, + 21888242871839275222246405745257275088548364400416034343698203806208397011909, + 21888242871839275222246405745257275088548364400416034343698204067853114149452, + 21888242871839275222246405745257275088548364400416034343698203846914706654592, + 363574555545018, + 21888242871839275222246405745257275088548364400416034343698203670459617514319, + 48399558331281, + 21888242871839275222246405745257275088548364400416034343698203972900361223534, + 21888242871839275222246405745257275088548364400416034343698203697539554752187, + 21888242871839275222246405745257275088548364400416034343698203939364921105723, + 519813029110478, + 300082313450457, + 44578882376370, + 131529222283259, + 21888242871839275222246405745257275088548364400416034343698203757504095572778, + 561506544490095, + 21888242871839275222246405745257275088548364400416034343698203875716087712706, + 37150226762343, + 21888242871839275222246405745257275088548364400416034343698204106614146323128, + 21888242871839275222246405745257275088548364400416034343698204074852793253442, + 160765476338957, + 437676758565471, + 488123270764895, + 485153923555774, + 51519676783734, + 21888242871839275222246405745257275088548364400416034343698203729216877639350, + 21888242871839275222246405745257275088548364400416034343698204078903532180904, + 21888242871839275222246405745257275088548364400416034343698203889880952919772, + 277483734102349, + 21888242871839275222246405745257275088548364400416034343698204163515292891696, + 524296395469695, + 58775026812066, + 102906851181374, + 370350879788118, + 308334439926089, + 360668170765479, + 21888242871839275222246405745257275088548364400416034343698203663788098751397, + 21888242871839275222246405745257275088548364400416034343698203995190932746829, + 541219640989919, + 418369119084641, + 21888242871839275222246405745257275088548364400416034343698203858236876760819, + 469898641576694, + 95073914067199, + 21888242871839275222246405745257275088548364400416034343698203633081757782086, + 21888242871839275222246405745257275088548364400416034343698203665418102452190, + 21888242871839275222246405745257275088548364400416034343698204104819784895761, + 21888242871839275222246405745257275088548364400416034343698203694977483834109, + 561821361572897, + 21888242871839275222246405745257275088548364400416034343698203778966765097492, + 21888242871839275222246405745257275088548364400416034343698204110479396175492, + 21888242871839275222246405745257275088548364400416034343698204072720365775963, + 219270403693768, + 21888242871839275222246405745257275088548364400416034343698203763978652453745, + 21888242871839275222246405745257275088548364400416034343698204104575258945642, + 92092725403738, + 21888242871839275222246405745257275088548364400416034343698203989598633436475, + 281385458209120, + 465233547244441, + 245439853332256, + 21888242871839275222246405745257275088548364400416034343698203993247140698812, + 45345787916723, + 21888242871839275222246405745257275088548364400416034343698203769061467365937, + 185042765016915, + 21888242871839275222246405745257275088548364400416034343698203920754346577352, + 4210381487538, + 254413709207202, + 166771893341733, + 21888242871839275222246405745257275088548364400416034343698203871137328387504, + 20342062261493, + 21888242871839275222246405745257275088548364400416034343698203904757296217460, + 536581712152154, + 21888242871839275222246405745257275088548364400416034343698203847189625022718, + 233976869607460, + 476543796560368, + 21888242871839275222246405745257275088548364400416034343698204040705837960993, + 561279341451849, + 243663307751057, + 21888242871839275222246405745257275088548364400416034343698204027293682770070, + 428402232335934, + 21888242871839275222246405745257275088548364400416034343698204022603987554316, + 252987756007033, + 21888242871839275222246405745257275088548364400416034343698203716462639108797, + 21888242871839275222246405745257275088548364400416034343698203827697244436220, + 21888242871839275222246405745257275088548364400416034343698203806787012669158, + 165133793940413, + 21888242871839275222246405745257275088548364400416034343698203789457450456217, + 54488887834624, + 21888242871839275222246405745257275088548364400416034343698204067711170527353, + 261044449905013, + 21888242871839275222246405745257275088548364400416034343698203703966745338926, + 68426656195070, + 21888242871839275222246405745257275088548364400416034343698203784286283127383, + 86836768689094, + 21888242871839275222246405745257275088548364400416034343698203733589691987987, + 21888242871839275222246405745257275088548364400416034343698204076708274982036, + 21888242871839275222246405745257275088548364400416034343698204145839379119051, + 21888242871839275222246405745257275088548364400416034343698203836142064150563, + 21888242871839275222246405745257275088548364400416034343698204012326732984462, + 200371105392799, + 416877155344736, + 142336274123005, + 399886566211460, + 267088437659231, + 3300234702028, + 438645239051836, + 16942571041167, + 19300273833506, + 484511968178821, + 21888242871839275222246405745257275088548364400416034343698203815039127157644, + 307792896890626, + 61235130957110, + 21888242871839275222246405745257275088548364400416034343698204101629098547897, + 21888242871839275222246405745257275088548364400416034343698204003070039598296, + 21888242871839275222246405745257275088548364400416034343698204167130116093570, + 532839625843634, + 21888242871839275222246405745257275088548364400416034343698204125074712418483, + 21888242871839275222246405745257275088548364400416034343698204032012490753336, + 127622531594932, + 21888242871839275222246405745257275088548364400416034343698203691807032519326, + 352729884621302, + 506493401135248, + 361122788853457, + 21888242871839275222246405745257275088548364400416034343698203935782998049664, + 21888242871839275222246405745257275088548364400416034343698203741066988943585, + 356814073435207, + 122040541270421, + 267565271598322, + 21888242871839275222246405745257275088548364400416034343698204060383280724840, + 21888242871839275222246405745257275088548364400416034343698203891953883028558, + 285983591870492, + 21888242871839275222246405745257275088548364400416034343698203656259055640544, + 21888242871839275222246405745257275088548364400416034343698204131934405579871, + 21888242871839275222246405745257275088548364400416034343698203930297399649430, + 186248544499712, + 562142966424177, + 21888242871839275222246405745257275088548364400416034343698203757236384168125, + 538655911406563, + 555876250325687, + 177929052674276, + 21888242871839275222246405745257275088548364400416034343698204117172712108504, + 89985410607180, + 21888242871839275222246405745257275088548364400416034343698204077177525342144, + 360491211871662, + 21888242871839275222246405745257275088548364400416034343698203951643997104162, + 359979640924227, + 250253417577832, + 48783451495120, + 21888242871839275222246405745257275088548364400416034343698204124819849287370, + 21888242871839275222246405745257275088548364400416034343698203779826760235050, + 456748202804867, + 281896777551291, + 192610747728653, + 21888242871839275222246405745257275088548364400416034343698203813952349780481, + 21888242871839275222246405745257275088548364400416034343698204141777107286221, + 268110952384394, + 21888242871839275222246405745257275088548364400416034343698204180465873527704, + 10148021788, + 106487258234673, + 510470550098442, + 50427120979485, + 21888242871839275222246405745257275088548364400416034343698203888157864353778, + 21888242871839275222246405745257275088548364400416034343698203633463058826823, + 481977251836006, + 392341089705913, + 21888242871839275222246405745257275088548364400416034343698203649272715879718, + 21888242871839275222246405745257275088548364400416034343698204085170376253009, + 227877121062782, + 242822929646899, + 504210659694210, + 488991273562078, + 343123527493243, + 21888242871839275222246405745257275088548364400416034343698203836480581136686, + 21888242871839275222246405745257275088548364400416034343698204036859835868600, + 21888242871839275222246405745257275088548364400416034343698204011381152833479, + 523750135307756, + 21888242871839275222246405745257275088548364400416034343698203827879072568608, + 21888242871839275222246405745257275088548364400416034343698204123020551994555, + 21888242871839275222246405745257275088548364400416034343698204023396946953762, + 363433158335129, + 21888242871839275222246405745257275088548364400416034343698203882915300280048, + 452314268646352, + 302113581460509, + 21888242871839275222246405745257275088548364400416034343698203950912737921073, + 384246273329417, + 155772396116498, + 94488000106347, + 21888242871839275222246405745257275088548364400416034343698204105467813192658, + 55072296957236, + 21888242871839275222246405745257275088548364400416034343698203782983823245802, + 468383616545517, + 21888242871839275222246405745257275088548364400416034343698204001566074995373, + 21888242871839275222246405745257275088548364400416034343698203999114675333041, + 527110725294892, + 266556566097080, + 366601774698997, + 244684865149939, + 302654572652392, + 321530685120454, + 21888242871839275222246405745257275088548364400416034343698203875691048594546, + 21888242871839275222246405745257275088548364400416034343698203919983702414904, + 21888242871839275222246405745257275088548364400416034343698203695100253669233, + 21888242871839275222246405745257275088548364400416034343698204023957400570896, + 21888242871839275222246405745257275088548364400416034343698204074808379269549, + 324991372040347, + 109316990578325, + 326987758895300, + 21888242871839275222246405745257275088548364400416034343698203678983429592842, + 556201473163690, + 21888242871839275222246405745257275088548364400416034343698204057898172029713, + 383799489700558, + 406887477886881, + 21888242871839275222246405745257275088548364400416034343698203663860388460800, + 21888242871839275222246405745257275088548364400416034343698203623693217785759, + 21888242871839275222246405745257275088548364400416034343698203895489386548014, + 379925393581190, + 420832356474028, + 287657088345363, + 390014008033599, + 428655463394512, + 21888242871839275222246405745257275088548364400416034343698204146678950287165, + 21888242871839275222246405745257275088548364400416034343698203868115461231324, + 275107731806787, + 454561074388020, + 192618367218408, + 80684945964536, + 21888242871839275222246405745257275088548364400416034343698204051701953876991, + 11292546291565, + 21888242871839275222246405745257275088548364400416034343698203982303727408567, + 262628804511883, + 21888242871839275222246405745257275088548364400416034343698203770091509646108, + 154868174538324, + 21888242871839275222246405745257275088548364400416034343698204031679306497876, + 258335494968662, + 21888242871839275222246405745257275088548364400416034343698203780223335483301, + 21888242871839275222246405745257275088548364400416034343698204130225416841383, + 21888242871839275222246405745257275088548364400416034343698204124066612904611, + 21888242871839275222246405745257275088548364400416034343698204162771633918795, + 21888242871839275222246405745257275088548364400416034343698203860929809077408, + 165172097539648, + 228338126047538, + 21888242871839275222246405745257275088548364400416034343698203966472748555952, + 21888242871839275222246405745257275088548364400416034343698204078313479493282, + 21888242871839275222246405745257275088548364400416034343698203629513830761029, + 126393118338642, + 21888242871839275222246405745257275088548364400416034343698204142192167710995, + 439192906623173, + 21888242871839275222246405745257275088548364400416034343698203849425506136973, + 21888242871839275222246405745257275088548364400416034343698203789497332777127, + 44802867741965, + 525175287869760, + 468384402099717, + 252198576361443, + 21888242871839275222246405745257275088548364400416034343698204148171130377271, + 21888242871839275222246405745257275088548364400416034343698203879112818101034, + 21888242871839275222246405745257275088548364400416034343698203816991195398785, + 23643099005798, + 232774864496669, + 508990132531959, + 182941031311446, + 21888242871839275222246405745257275088548364400416034343698203709213791853133, + 21888242871839275222246405745257275088548364400416034343698204140819175420238, + 21888242871839275222246405745257275088548364400416034343698203955799000360515, + 21888242871839275222246405745257275088548364400416034343698203813945190962404, + 21888242871839275222246405745257275088548364400416034343698204123912552681186, + 265971490168286, + 353374379334205, + 21888242871839275222246405745257275088548364400416034343698203935159760409467, + 21888242871839275222246405745257275088548364400416034343698204007875034065235, + 21888242871839275222246405745257275088548364400416034343698203921740321693092, + 21888242871839275222246405745257275088548364400416034343698204171797342740659, + 21888242871839275222246405745257275088548364400416034343698203943298956202131, + 351675611309385, + 21888242871839275222246405745257275088548364400416034343698203885192179139129, + 21888242871839275222246405745257275088548364400416034343698204053907051570770, + 21888242871839275222246405745257275088548364400416034343698203890828621492827, + 366278218344989, + 21888242871839275222246405745257275088548364400416034343698204083505056691819, + 21888242871839275222246405745257275088548364400416034343698203993061540734453, + 21888242871839275222246405745257275088548364400416034343698203806701682998308, + 21888242871839275222246405745257275088548364400416034343698204161869454774121, + 21888242871839275222246405745257275088548364400416034343698203807609478469832, + 8742061560820, + 21888242871839275222246405745257275088548364400416034343698203900322228195212, + 118515178744120, + 21888242871839275222246405745257275088548364400416034343698204098540709732913, + 21888242871839275222246405745257275088548364400416034343698204124160356704039, + 311797418663547, + 21888242871839275222246405745257275088548364400416034343698203829177563173990, + 207389466517085, + 304994636900967, + 448469739026695, + 540440808002741, + 320758739157379, + 285573632243492, + 21888242871839275222246405745257275088548364400416034343698203665390635283445, + 550595286342614, + 21888242871839275222246405745257275088548364400416034343698204064941110685596, + 21888242871839275222246405745257275088548364400416034343698203760460400927990, + 486961095262824, + 8725761953408, + 256297869015188, + 333590949937338, + 21888242871839275222246405745257275088548364400416034343698203643357663206873, + 21888242871839275222246405745257275088548364400416034343698203985472392455901, + 72895724122855, + 21888242871839275222246405745257275088548364400416034343698204174597977587421, + 377899703314305, + 21888242871839275222246405745257275088548364400416034343698203968848839140368, + 21888242871839275222246405745257275088548364400416034343698203808751365268733, + 194976551557201, + 177754477621124, + 57189554662996, + 21888242871839275222246405745257275088548364400416034343698203635215268855095, + 21888242871839275222246405745257275088548364400416034343698203708876105458370, + 221736766428663, + 480554286748917, + 21888242871839275222246405745257275088548364400416034343698204175982885199112, + 475304571274540, + 559443149741824, + 126879600450207, + 21888242871839275222246405745257275088548364400416034343698203635568494030553, + 21888242871839275222246405745257275088548364400416034343698203836087129792584, + 21888242871839275222246405745257275088548364400416034343698204012336834362526, + 21888242871839275222246405745257275088548364400416034343698203754196337699092, + 219116047603064, + 300218586167555, + 537460015437592, + 21888242871839275222246405745257275088548364400416034343698204087423647110965, + 546749658449689, + 424262670934222, + 21888242871839275222246405745257275088548364400416034343698203828067204920919, + 21888242871839275222246405745257275088548364400416034343698203860252935328243, + 100860466022976, + 21888242871839275222246405745257275088548364400416034343698204064854598252228, + 21888242871839275222246405745257275088548364400416034343698203692226743433828, + 505894305254071, + 288220683315632, + 121292348897809, + 21888242871839275222246405745257275088548364400416034343698203656466271777402, + 337881308878843, + 439268729153993, + 21888242871839275222246405745257275088548364400416034343698204164780775539189, + 324033975414508, + 21888242871839275222246405745257275088548364400416034343698204143259599178047, + 219411251995134, + 21888242871839275222246405745257275088548364400416034343698203758294283809597, + 21888242871839275222246405745257275088548364400416034343698203932522085966503, + 21888242871839275222246405745257275088548364400416034343698203694487996480117, + 21888242871839275222246405745257275088548364400416034343698203772318170251613, + 21888242871839275222246405745257275088548364400416034343698204157634671368302, + 21888242871839275222246405745257275088548364400416034343698203876911550082982, + 140890404673370, + 21888242871839275222246405745257275088548364400416034343698204063983851229615, + 339323442350654, + 289865422484841, + 21888242871839275222246405745257275088548364400416034343698203791171517354255, + 38672976527273, + 21888242871839275222246405745257275088548364400416034343698204023379153910220, + 21888242871839275222246405745257275088548364400416034343698203747890222794441, + 21888242871839275222246405745257275088548364400416034343698203752564770844807, + 384183394104685, + 191844764679565, + 21888242871839275222246405745257275088548364400416034343698203982706692299502, + 378493276605570, + 21888242871839275222246405745257275088548364400416034343698203851620913837669, + 21888242871839275222246405745257275088548364400416034343698204100871669521937, + 21888242871839275222246405745257275088548364400416034343698203829985886468022, + 21888242871839275222246405745257275088548364400416034343698204092099231899770, + 21888242871839275222246405745257275088548364400416034343698203687564449804488, + 73963963778345, + 21888242871839275222246405745257275088548364400416034343698203707987698072899, + 21888242871839275222246405745257275088548364400416034343698203768203612788858, + 23140380866806, + 21888242871839275222246405745257275088548364400416034343698203666926211194185, + 88365952521518, + 54734104888964, + 21888242871839275222246405745257275088548364400416034343698203752135559587444, + 21888242871839275222246405745257275088548364400416034343698203743453769072667, + 21888242871839275222246405745257275088548364400416034343698203679033200767181, + 21888242871839275222246405745257275088548364400416034343698203627317576391116, + 530209730552667, + 343141064043521, + 424086712894375, + 19895488984847, + 146012223018305, + 21888242871839275222246405745257275088548364400416034343698203657674419233960, + 74858423995995, + 135149964975463, + 174830961810815, + 439545642633551, + 3182809207174, + 456129227221337, + 72483206466434, + 531373066597459, + 21888242871839275222246405745257275088548364400416034343698203912040708674024, + 21888242871839275222246405745257275088548364400416034343698203908657994003887, + 21888242871839275222246405745257275088548364400416034343698203826159508528279, + 21888242871839275222246405745257275088548364400416034343698203683424988778015, + 21888242871839275222246405745257275088548364400416034343698204083943172066464, + 21888242871839275222246405745257275088548364400416034343698203671529740457841, + 21888242871839275222246405745257275088548364400416034343698204134170965672628, + 21888242871839275222246405745257275088548364400416034343698203763473455896324, + 21888242871839275222246405745257275088548364400416034343698203703960592649811, + 30751884476801, + 523614463825193, + 408488071231339, + 21888242871839275222246405745257275088548364400416034343698204035694728386488, + 21888242871839275222246405745257275088548364400416034343698204172656614659891, + 21888242871839275222246405745257275088548364400416034343698203633784661591297, + 21888242871839275222246405745257275088548364400416034343698204061337267391296, + 21888242871839275222246405745257275088548364400416034343698203897448874728099, + 21888242871839275222246405745257275088548364400416034343698203694845057411593, + 21888242871839275222246405745257275088548364400416034343698203757019580705637, + 21888242871839275222246405745257275088548364400416034343698203994781872787798, + 21888242871839275222246405745257275088548364400416034343698203867674514858886, + 21888242871839275222246405745257275088548364400416034343698204051242539573959, + 489130259403042, + 21888242871839275222246405745257275088548364400416034343698204061202316102663, + 49113938898159, + 434140754940978, + 367707076661657, + 21888242871839275222246405745257275088548364400416034343698203807843772112666, + 21888242871839275222246405745257275088548364400416034343698204091269514884188, + 21888242871839275222246405745257275088548364400416034343698203731107567031567, + 152750631959093, + 21888242871839275222246405745257275088548364400416034343698204038653324252791, + 21888242871839275222246405745257275088548364400416034343698203899072413737482, + 21888242871839275222246405745257275088548364400416034343698203707485990122963, + 204408775815696, + 21888242871839275222246405745257275088548364400416034343698203695561077086627, + 32416432593850, + 21888242871839275222246405745257275088548364400416034343698204097864015062145, + 510471350682569, + 21888242871839275222246405745257275088548364400416034343698204027773286681272, + 427042581461309, + 21888242871839275222246405745257275088548364400416034343698203970002007081255, + 21888242871839275222246405745257275088548364400416034343698204101255303849487, + 463670898958772, + 434664411328107, + 21888242871839275222246405745257275088548364400416034343698204159934106798649, + 495463476672633, + 107787158517414, + 21888242871839275222246405745257275088548364400416034343698204072320995576931, + 21888242871839275222246405745257275088548364400416034343698203944493154480190, + 97227888019596, + 21888242871839275222246405745257275088548364400416034343698203955520264030828, + 21888242871839275222246405745257275088548364400416034343698203864790439315469, + 21888242871839275222246405745257275088548364400416034343698204147816313828866, + 21888242871839275222246405745257275088548364400416034343698203728080445805008, + 21888242871839275222246405745257275088548364400416034343698203962655079171434, + 48570518684883, + 21888242871839275222246405745257275088548364400416034343698203943543139978411, + 445522427252966, + 21888242871839275222246405745257275088548364400416034343698203938565873065391, + 21888242871839275222246405745257275088548364400416034343698204026188902285652, + 374033656701865, + 21888242871839275222246405745257275088548364400416034343698203658062254359569, + 343479772863590, + 528156184048476, + 384004189111889, + 31722884869475, + 488200198843743, + 21888242871839275222246405745257275088548364400416034343698203660381521956087, + 21888242871839275222246405745257275088548364400416034343698203990637475497973, + 239839274908476, + 514289757685699, + 330362945916009, + 516178982086719, + 239819624496449, + 13460989323898, + 431774918792573, + 21888242871839275222246405745257275088548364400416034343698203723971753444083, + 438316174790429, + 375694024133656, + 404423410775589, + 21888242871839275222246405745257275088548364400416034343698203903450935262396, + 21888242871839275222246405745257275088548364400416034343698203935207299552677, + 456497562019480, + 520309778526117, + 21888242871839275222246405745257275088548364400416034343698203745379678483378, + 495714557690810, + 21888242871839275222246405745257275088548364400416034343698203628691632940543, + 21888242871839275222246405745257275088548364400416034343698203947023883726352, + 21888242871839275222246405745257275088548364400416034343698203640145498722091, + 21888242871839275222246405745257275088548364400416034343698203947510040550858, + 125449492742073, + 21888242871839275222246405745257275088548364400416034343698203630263898351016, + 444721265339685, + 65761021570470, + 21888242871839275222246405745257275088548364400416034343698203659911533559677, + 21888242871839275222246405745257275088548364400416034343698203745398563185278, + 311193739452065, + 21888242871839275222246405745257275088548364400416034343698203790542225517433, + 21888242871839275222246405745257275088548364400416034343698204103835177473481, + 545535613996448, + 377364643038613, + 499177165527164, + 21888242871839275222246405745257275088548364400416034343698203654741453290517, + 21888242871839275222246405745257275088548364400416034343698203678340453255217, + 345483986812812, + 21888242871839275222246405745257275088548364400416034343698204144019351946074, + 21888242871839275222246405745257275088548364400416034343698203648795584583052, + 21888242871839275222246405745257275088548364400416034343698203885136064858223, + 21888242871839275222246405745257275088548364400416034343698204071810190968874, + 21888242871839275222246405745257275088548364400416034343698203955950134817321, + 332667429100872, + 4113582284843, + 386365741844962, + 336144196016618, + 203720634624796, + 340724876011556, + 439489559685605, + 389673990628028, + 21888242871839275222246405745257275088548364400416034343698203823976508546198, + 95674019593936, + 21888242871839275222246405745257275088548364400416034343698204159255049352028, + 21888242871839275222246405745257275088548364400416034343698203883911001195271, + 168526546503671, + 517304445681294, + 217816947298182, + 339177423887624, + 184137259683731, + 264990809935823, + 21888242871839275222246405745257275088548364400416034343698203852135852000153, + 342149539818080, + 169478574656298, + 171087623142716, + 82306670581213, + 348707701988737, + 132838111492770, + 21888242871839275222246405745257275088548364400416034343698204018254445681120, + 21888242871839275222246405745257275088548364400416034343698204138438822652273, + 21888242871839275222246405745257275088548364400416034343698203771847631529101, + 165799354472757, + 21888242871839275222246405745257275088548364400416034343698203745219058131506, + 489178473470440, + 213984670966190, + 534183447761532, + 338834370139777, + 21888242871839275222246405745257275088548364400416034343698203862654042162428, + 151889776243738, + 427248814790353, + 99681954725927, + 341676836966121, + 21888242871839275222246405745257275088548364400416034343698203966701916710977, + 21888242871839275222246405745257275088548364400416034343698204145952511091831, + 541236975706054, + 509033443226684, + 21888242871839275222246405745257275088548364400416034343698203994281349541451, + 21888242871839275222246405745257275088548364400416034343698204043639097810349, + 21888242871839275222246405745257275088548364400416034343698203785714409619074, + 454988512370119, + 21888242871839275222246405745257275088548364400416034343698203953825534307985, + 511527436070850, + 21888242871839275222246405745257275088548364400416034343698203747737673805634, + 21888242871839275222246405745257275088548364400416034343698203926192859316447, + 21888242871839275222246405745257275088548364400416034343698204149936538514358, + 21888242871839275222246405745257275088548364400416034343698203699955901682225, + 21680653484574, + 21888242871839275222246405745257275088548364400416034343698203768685993889101, + 26022874221775, + 21888242871839275222246405745257275088548364400416034343698203675062409492992, + 45868412754976, + 12813140418060, + 21888242871839275222246405745257275088548364400416034343698204068090864770583, + 21888242871839275222246405745257275088548364400416034343698203989847148662441, + 349541390920442, + 306973314233256, + 311427973494396, + 21888242871839275222246405745257275088548364400416034343698203980854472203928, + 383226693078688, + 21888242871839275222246405745257275088548364400416034343698203851752117776742, + 21888242871839275222246405745257275088548364400416034343698203749979065972883, + 32333311791683, + 21888242871839275222246405745257275088548364400416034343698203830971147158579, + 156235037868755, + 148885292543110, + 21888242871839275222246405745257275088548364400416034343698203738873359614814, + 81703657481908, + 21888242871839275222246405745257275088548364400416034343698204119174293333696, + 335605068692338, + 378535146254562, + 21888242871839275222246405745257275088548364400416034343698203744999209056709, + 21888242871839275222246405745257275088548364400416034343698203984029506105686, + 21888242871839275222246405745257275088548364400416034343698203769945361789621, + 160775445405943, + 21888242871839275222246405745257275088548364400416034343698204045261159706092, + 21888242871839275222246405745257275088548364400416034343698204056691232726560, + 412214536240304, + 550759407857891, + 21888242871839275222246405745257275088548364400416034343698204002735411807704, + 21888242871839275222246405745257275088548364400416034343698203953749233926598, + 21888242871839275222246405745257275088548364400416034343698204165959572366627, + 21888242871839275222246405745257275088548364400416034343698203894882643010597, + 28606448234534, + 21888242871839275222246405745257275088548364400416034343698203873493718815724, + 21888242871839275222246405745257275088548364400416034343698203891290856629161, + 223015292186684, + 503033978179308, + 225104562356057, + 21888242871839275222246405745257275088548364400416034343698203653966763891418, + 348161149453949, + 301638298389383, + 21888242871839275222246405745257275088548364400416034343698204039931116438767, + 21888242871839275222246405745257275088548364400416034343698204136188791208742, + 46646608637524, + 241102422265549, + 267332357273927, + 495964630630972, + 90732320477936, + 21888242871839275222246405745257275088548364400416034343698203733624735474624, + 21888242871839275222246405745257275088548364400416034343698203706724099069024, + 122481139319745, + 21888242871839275222246405745257275088548364400416034343698204169043867050356, + 105453763654935, + 21888242871839275222246405745257275088548364400416034343698203859807471438496, + 21888242871839275222246405745257275088548364400416034343698204154678186792457, + 21888242871839275222246405745257275088548364400416034343698203957902835928125, + 21888242871839275222246405745257275088548364400416034343698204171649458305095, + 21888242871839275222246405745257275088548364400416034343698204034842550137823, + 21888242871839275222246405745257275088548364400416034343698203651828705433757, + 109403628310974, + 21888242871839275222246405745257275088548364400416034343698204063777705609384, + 21888242871839275222246405745257275088548364400416034343698203816989195822905, + 448864688916536, + 369907730452333, + 420442862484612, + 453496176903376, + 5426752045421, + 21888242871839275222246405745257275088548364400416034343698203856059808536090, + 21888242871839275222246405745257275088548364400416034343698204029774328611616, + 40006954375831, + 58257767458012, + 21888242871839275222246405745257275088548364400416034343698203976589352962258, + 21888242871839275222246405745257275088548364400416034343698204106810570209590, + 21888242871839275222246405745257275088548364400416034343698203889536575696608, + 550772010130142, + 125792850500758, + 21888242871839275222246405745257275088548364400416034343698203701300650715092, + 21888242871839275222246405745257275088548364400416034343698203881101925644554, + 21888242871839275222246405745257275088548364400416034343698203704068976605872, + 21888242871839275222246405745257275088548364400416034343698204053177903335070, + 21888242871839275222246405745257275088548364400416034343698203938161866400362, + 331284051843391, + 21888242871839275222246405745257275088548364400416034343698203980628500429632, + 263936446594600, + 214406673860459, + 21888242871839275222246405745257275088548364400416034343698203975553294972431, + 21888242871839275222246405745257275088548364400416034343698204080641786371863, + 21888242871839275222246405745257275088548364400416034343698203798307658657926, + 26842716665028, + 98627253250657, + 380971192026612, + 21888242871839275222246405745257275088548364400416034343698203697663824724675, + 310122511316490, + 476512716395899, + 261882127293787, + 21888242871839275222246405745257275088548364400416034343698203711351391786673, + 439346307445024, + 21888242871839275222246405745257275088548364400416034343698204121160844309907, + 474055144357651, + 162163152393176, + 20832036504811, + 106681108055193, + 423577064301758, + 312081692609981, + 504641550784967, + 21888242871839275222246405745257275088548364400416034343698203662365469446380, + 417416499311988, + 221910953774572, + 21888242871839275222246405745257275088548364400416034343698204168966515482507, + 64517859591749, + 21888242871839275222246405745257275088548364400416034343698203808579820641244, + 31730700902424, + 353516615520490, + 21888242871839275222246405745257275088548364400416034343698203817452405569099, + 21888242871839275222246405745257275088548364400416034343698203741035199651850, + 21888242871839275222246405745257275088548364400416034343698203830576615585386, + 223806936097276, + 21888242871839275222246405745257275088548364400416034343698203958288248130127, + 21888242871839275222246405745257275088548364400416034343698204051127027399585, + 21888242871839275222246405745257275088548364400416034343698203834797689486419, + 21888242871839275222246405745257275088548364400416034343698203796004345188958, + 21888242871839275222246405745257275088548364400416034343698203783911973925901, + 21888242871839275222246405745257275088548364400416034343698203915008223977449, + 21888242871839275222246405745257275088548364400416034343698203734599959664880, + 21888242871839275222246405745257275088548364400416034343698203647372769233925, + 21888242871839275222246405745257275088548364400416034343698204130849714498293, + 21888242871839275222246405745257275088548364400416034343698203886584894901829, + 21888242871839275222246405745257275088548364400416034343698204065397369047318, + 21888242871839275222246405745257275088548364400416034343698204031645575515569, + 491875943959666, + 21888242871839275222246405745257275088548364400416034343698203921791270742642, + 119370906113102, + 21888242871839275222246405745257275088548364400416034343698203676526438676635, + 21888242871839275222246405745257275088548364400416034343698203826404749139135, + 21888242871839275222246405745257275088548364400416034343698204011091559276292, + 21888242871839275222246405745257275088548364400416034343698204015996258008072, + 21888242871839275222246405745257275088548364400416034343698203718675429306290, + 136219737031264, + 21888242871839275222246405745257275088548364400416034343698203663193232105364, + 21888242871839275222246405745257275088548364400416034343698204180513113141618, + 22596146642987, + 311784565441976, + 21888242871839275222246405745257275088548364400416034343698204181412769488091, + 21888242871839275222246405745257275088548364400416034343698203699611113100966, + 435212536057415, + 468710543296889, + 529313976864616, + 312221304279112, + 292905544864984, + 21888242871839275222246405745257275088548364400416034343698203703793455651121, + 105576219940598, + 409492698293169, + 21888242871839275222246405745257275088548364400416034343698203977826906351234, + 21888242871839275222246405745257275088548364400416034343698203734298812379291, + 368387113813999, + 232052504906084, + 82645259616737, + 21888242871839275222246405745257275088548364400416034343698203847735898050710, + 449238107470881, + 486300690932203, + 21888242871839275222246405745257275088548364400416034343698203814372248797280, + 21888242871839275222246405745257275088548364400416034343698203905003487650712, + 21888242871839275222246405745257275088548364400416034343698203751812987706137, + 154280664639387, + 397674186170974, + 462888208612823, + 141464042271698, + 385076172269204, + 21888242871839275222246405745257275088548364400416034343698203745559905098439, + 21888242871839275222246405745257275088548364400416034343698204033574807809750, + 97124893801242, + 422853153413272, + 309451513569655, + 21888242871839275222246405745257275088548364400416034343698203673840327451215, + 149999590413244, + 21888242871839275222246405745257275088548364400416034343698203801888278467987, + 21888242871839275222246405745257275088548364400416034343698204121353951936005, + 315207407703461, + 307809283902531, + 21888242871839275222246405745257275088548364400416034343698204041469494295753, + 46919630650879, + 89352068468862, + 17779017416374, + 38739209833307, + 21888242871839275222246405745257275088548364400416034343698203984761638168651, + 21888242871839275222246405745257275088548364400416034343698203636775250021806, + 132245801812301, + 21888242871839275222246405745257275088548364400416034343698204017609473090880, + 21888242871839275222246405745257275088548364400416034343698204148554435817910, + 21888242871839275222246405745257275088548364400416034343698203881663472373516, + 21888242871839275222246405745257275088548364400416034343698203790621305988679, + 21888242871839275222246405745257275088548364400416034343698203666140255200311, + 69802968461699, + 21888242871839275222246405745257275088548364400416034343698203769814411968560, + 57938505310613, + 509553093366008, + 42282089880476, + 21888242871839275222246405745257275088548364400416034343698203773592911933792, + 21888242871839275222246405745257275088548364400416034343698203956922776645640, + 21888242871839275222246405745257275088548364400416034343698204113131905194967, + 557494559991485, + 21888242871839275222246405745257275088548364400416034343698204130519841722643, + 21888242871839275222246405745257275088548364400416034343698203839181697084011, + 37723084168846, + 263931562151894, + 21888242871839275222246405745257275088548364400416034343698203838000239886576, + 21888242871839275222246405745257275088548364400416034343698203828808635899043, + 21888242871839275222246405745257275088548364400416034343698204081927599568884, + 118177584573028, + 21888242871839275222246405745257275088548364400416034343698203810401477587569, + 20619984814847, + 21888242871839275222246405745257275088548364400416034343698203939526525223882, + 243673833910886, + 21888242871839275222246405745257275088548364400416034343698204008597581007236, + 21888242871839275222246405745257275088548364400416034343698203746102367531824, + 474193701868416, + 21888242871839275222246405745257275088548364400416034343698204095402732570084, + 166143382347782, + 479242205575617, + 129328353438365, + 21888242871839275222246405745257275088548364400416034343698203788621634699860, + 508094826756383, + 451981816329301, + 290052049415032, + 21888242871839275222246405745257275088548364400416034343698204029210613181571, + 221241541074656, + 21888242871839275222246405745257275088548364400416034343698203979354049328391, + 21888242871839275222246405745257275088548364400416034343698204053533817763101, + 137277235988431, + 21888242871839275222246405745257275088548364400416034343698203860475709228903, + 49226850820608, + 331090597124414, + 313998386512380, + 21888242871839275222246405745257275088548364400416034343698204184920482751941, + 33006304087161, + 21888242871839275222246405745257275088548364400416034343698203631169346493266, + 241777063827778, + 21888242871839275222246405745257275088548364400416034343698203852008952177857, + 21888242871839275222246405745257275088548364400416034343698203941784606928730, + 21888242871839275222246405745257275088548364400416034343698203765502756502958, + 518853831504551, + 449330016249677, + 21888242871839275222246405745257275088548364400416034343698204091900854853925, + 124528818366920, + 21888242871839275222246405745257275088548364400416034343698204149722756177794, + 21888242871839275222246405745257275088548364400416034343698203685966125725846, + 165049150638207, + 21888242871839275222246405745257275088548364400416034343698203998508646877724, + 21888242871839275222246405745257275088548364400416034343698204023911016052593, + 537410496224371, + 106241642620093, + 21888242871839275222246405745257275088548364400416034343698204023455596715602, + 21888242871839275222246405745257275088548364400416034343698203921647246148209, + 219984836531786, + 21888242871839275222246405745257275088548364400416034343698203880416583021801, + 21888242871839275222246405745257275088548364400416034343698203807964446738225, + 21888242871839275222246405745257275088548364400416034343698203660531890041506, + 21888242871839275222246405745257275088548364400416034343698203645874684517159, + 21888242871839275222246405745257275088548364400416034343698203861625412138940, + 21888242871839275222246405745257275088548364400416034343698204146500655515935, + 21888242871839275222246405745257275088548364400416034343698203930338273898075, + 21888242871839275222246405745257275088548364400416034343698203972778201604373, + 210393385031664, + 21888242871839275222246405745257275088548364400416034343698203999462385850411, + 21888242871839275222246405745257275088548364400416034343698203882593392903135, + 21888242871839275222246405745257275088548364400416034343698203700491601587922, + 281692202652184, + 350430753397242, + 21888242871839275222246405745257275088548364400416034343698203901678497142771, + 508043120355415, + 72724568954481, + 21888242871839275222246405745257275088548364400416034343698203696211462020521, + 21888242871839275222246405745257275088548364400416034343698203893447768421347, + 21888242871839275222246405745257275088548364400416034343698203700693738896909, + 231234592056216, + 277995754993126, + 85301057772724, + 56540935855023, + 21888242871839275222246405745257275088548364400416034343698203674892258690889, + 21888242871839275222246405745257275088548364400416034343698203933450137652643, + 455834821650231, + 182527504112451, + 112040854038154, + 365887041468681, + 362030339555870, + 477368630266711, + 267132842202062, + 21888242871839275222246405745257275088548364400416034343698203754959470825559, + 45442796812417, + 21888242871839275222246405745257275088548364400416034343698203829097923197901, + 21888242871839275222246405745257275088548364400416034343698204161583363531389, + 202048249273613, + 21888242871839275222246405745257275088548364400416034343698203741756627178527, + 133541798653335, + 259390975811540, + 16842956118509, + 21888242871839275222246405745257275088548364400416034343698203728871455597041, + 546248689393146, + 21888242871839275222246405745257275088548364400416034343698203743574774084814, + 21888242871839275222246405745257275088548364400416034343698203687358562635126, + 21888242871839275222246405745257275088548364400416034343698203828069319754074, + 361407894509507, + 21888242871839275222246405745257275088548364400416034343698203807500522020973, + 21888242871839275222246405745257275088548364400416034343698203818605685195323, + 220700713216286, + 386310427544074, + 267738919667681, + 21888242871839275222246405745257275088548364400416034343698204107102415412879, + 178413636388151, + 21888242871839275222246405745257275088548364400416034343698203990917513179957, + 21888242871839275222246405745257275088548364400416034343698204030316646601162, + 373227486607541, + 21888242871839275222246405745257275088548364400416034343698203920759218079270, + 501482313179450, + 304179438433215, + 21888242871839275222246405745257275088548364400416034343698204153698804957243, + 446252113680592, + 253955704428948, + 427057497857668, + 314302616924298, + 123460450005344, + 21888242871839275222246405745257275088548364400416034343698204004494349822164, + 519042883942975, + 21888242871839275222246405745257275088548364400416034343698204042872718200315, + 21888242871839275222246405745257275088548364400416034343698203955555999429108, + 35559151612784, + 194848419623397, + 85619255763554, + 21888242871839275222246405745257275088548364400416034343698203924922488461302, + 147098537166747, + 385490585583734, + 77615784545891, + 21888242871839275222246405745257275088548364400416034343698204029664614707781, + 229713682526603, + 21888242871839275222246405745257275088548364400416034343698203651363016867054, + 89970026832657, + 21888242871839275222246405745257275088548364400416034343698203993267121293986, + 254819239934619, + 81601157853329, + 21888242871839275222246405745257275088548364400416034343698203867848826689036, + 21888242871839275222246405745257275088548364400416034343698204129300326167842, + 269713930295704, + 21888242871839275222246405745257275088548364400416034343698203949105192296387, + 284547547531609, + 188331361845984, + 21888242871839275222246405745257275088548364400416034343698203715291394242326, + 21888242871839275222246405745257275088548364400416034343698204052133796099830, + 21888242871839275222246405745257275088548364400416034343698203909422228968099, + 21888242871839275222246405745257275088548364400416034343698203842899503934003, + 244717581552560, + 363197919497756, + 278684084239488, + 21888242871839275222246405745257275088548364400416034343698203798638753629329, + 349708673763451, + 21888242871839275222246405745257275088548364400416034343698203835564727697074, + 21888242871839275222246405745257275088548364400416034343698204044107080056465, + 282240575091223, + 227980030353330, + 51351138450243, + 417045122846429, + 21888242871839275222246405745257275088548364400416034343698204112958814545449, + 21888242871839275222246405745257275088548364400416034343698204166817482983452, + 41349319427967, + 21888242871839275222246405745257275088548364400416034343698204019523081230710, + 21888242871839275222246405745257275088548364400416034343698203857116314216358, + 511580556139364, + 21888242871839275222246405745257275088548364400416034343698204139550567705028, + 480245955432096, + 21888242871839275222246405745257275088548364400416034343698204151257670401569, + 21888242871839275222246405745257275088548364400416034343698203746394523818718, + 5393676416396, + 21888242871839275222246405745257275088548364400416034343698204175015758317491, + 247589069819757, + 21888242871839275222246405745257275088548364400416034343698203767862339873958, + 21888242871839275222246405745257275088548364400416034343698203727622350845059, + 21888242871839275222246405745257275088548364400416034343698203979229883620877, + 106098415029313, + 415764394763949, + 434518237076887, + 21888242871839275222246405745257275088548364400416034343698204098538417197647, + 53468117448378, + 188101085908701, + 21888242871839275222246405745257275088548364400416034343698203694292689295299, + 241985081854998, + 520170398579597, + 21888242871839275222246405745257275088548364400416034343698204041961625609470, + 21888242871839275222246405745257275088548364400416034343698203821542926885450, + 21888242871839275222246405745257275088548364400416034343698203775633971471585, + 21888242871839275222246405745257275088548364400416034343698204131997447072391, + 158631579212767, + 85336918760153, + 21888242871839275222246405745257275088548364400416034343698204067148889750790, + 337628890850281, + 81980699214986, + 21888242871839275222246405745257275088548364400416034343698203959762574694470, + 522511175180494, + 21888242871839275222246405745257275088548364400416034343698204149465198919862, + 21888242871839275222246405745257275088548364400416034343698203627096030119102, + 21888242871839275222246405745257275088548364400416034343698203683283179617565, + 21888242871839275222246405745257275088548364400416034343698204120316587669561, + 21888242871839275222246405745257275088548364400416034343698204029162047047760, + 257037273798268, + 21888242871839275222246405745257275088548364400416034343698203930312352407515, + 21888242871839275222246405745257275088548364400416034343698203908024149086363, + 44519867869102, + 482276368739570, + 21888242871839275222246405745257275088548364400416034343698204117082774388101, + 21888242871839275222246405745257275088548364400416034343698203866948200868897, + 21888242871839275222246405745257275088548364400416034343698204071654431342180, + 466059542948350, + 21888242871839275222246405745257275088548364400416034343698204159169287220565, + 130870248728990, + 21888242871839275222246405745257275088548364400416034343698203661031654255845, + 21888242871839275222246405745257275088548364400416034343698203870330452704457, + 21888242871839275222246405745257275088548364400416034343698203772807066043731, + 21888242871839275222246405745257275088548364400416034343698203866610341487498, + 21888242871839275222246405745257275088548364400416034343698204174943434839286, + 21888242871839275222246405745257275088548364400416034343698203800069988332993, + 533656865066250, + 21888242871839275222246405745257275088548364400416034343698203922126274359605, + 21888242871839275222246405745257275088548364400416034343698203902942438737968, + 341015608109455, + 429733870899091, + 21888242871839275222246405745257275088548364400416034343698203787066158262972, + 21888242871839275222246405745257275088548364400416034343698203801007588415958, + 21888242871839275222246405745257275088548364400416034343698203975355038303135, + 21888242871839275222246405745257275088548364400416034343698204083509852327758, + 21888242871839275222246405745257275088548364400416034343698203858610437521173, + 252972666266351, + 507752413212218, + 201021922526551, + 21888242871839275222246405745257275088548364400416034343698203926134260169612, + 21888242871839275222246405745257275088548364400416034343698203857488013676681, + 21888242871839275222246405745257275088548364400416034343698204151243231297005, + 226541941848265, + 21888242871839275222246405745257275088548364400416034343698203765445969396979, + 147263475129439, + 281697546521219, + 21888242871839275222246405745257275088548364400416034343698203820063197294731, + 159108745298589, + 526640759566003, + 126680427028439, + 21888242871839275222246405745257275088548364400416034343698203997436250928217, + 21888242871839275222246405745257275088548364400416034343698204128630238820374, + 396463764311453, + 21888242871839275222246405745257275088548364400416034343698203655824489945671, + 21888242871839275222246405745257275088548364400416034343698204136939891335056, + 21888242871839275222246405745257275088548364400416034343698204176148915460503, + 21888242871839275222246405745257275088548364400416034343698204066389200949233, + 18691279596041, + 21888242871839275222246405745257275088548364400416034343698203936485090521057, + 313986427821931, + 21888242871839275222246405745257275088548364400416034343698204103206464346660, + 21888242871839275222246405745257275088548364400416034343698203982629289798135, + 126209683821039, + 295605028974104, + 62804006709187, + 21888242871839275222246405745257275088548364400416034343698204063245951242639, + 478972605592092, + 286767302487226, + 322023978996936, + 187619868915673, + 21888242871839275222246405745257275088548364400416034343698203726708237478611, + 236732533320577, + 295755602599784, + 21888242871839275222246405745257275088548364400416034343698204032156931519043, + 21888242871839275222246405745257275088548364400416034343698203678407400423345, + 405112088412124, + 21888242871839275222246405745257275088548364400416034343698203942874423862812, + 436508040582338, + 434165475124459, + 1026311903328, + 49075953464007, + 4739660872797, + 21888242871839275222246405745257275088548364400416034343698203801221362204161, + 21888242871839275222246405745257275088548364400416034343698204043376077172970, + 74120352054174, + 21888242871839275222246405745257275088548364400416034343698203989873607105136, + 21888242871839275222246405745257275088548364400416034343698203690390492865731, + 65366938960118, + 21888242871839275222246405745257275088548364400416034343698203728999462473785, + 21888242871839275222246405745257275088548364400416034343698204061344943502639, + 408517100551200, + 21888242871839275222246405745257275088548364400416034343698203972395750432882, + 21888242871839275222246405745257275088548364400416034343698204168938816181475, + 455482331464684, + 21888242871839275222246405745257275088548364400416034343698203743425134707948, + 21888242871839275222246405745257275088548364400416034343698203923879919315277, + 21888242871839275222246405745257275088548364400416034343698203918451931038557, + 21888242871839275222246405745257275088548364400416034343698204113413179393784, + 21888242871839275222246405745257275088548364400416034343698203979951560913288, + 524536065721935, + 21888242871839275222246405745257275088548364400416034343698204076542547951409, + 21888242871839275222246405745257275088548364400416034343698203917802087072378, + 21888242871839275222246405745257275088548364400416034343698204057213595685013, + 157579904172657, + 21888242871839275222246405745257275088548364400416034343698204114571313612467, + 21888242871839275222246405745257275088548364400416034343698203828574071093976, + 223893560858574, + 21888242871839275222246405745257275088548364400416034343698204127341303899431, + 21888242871839275222246405745257275088548364400416034343698203701699388599917, + 21888242871839275222246405745257275088548364400416034343698203977708027330572, + 21888242871839275222246405745257275088548364400416034343698204161961784254258, + 126242975492060, + 21888242871839275222246405745257275088548364400416034343698203662538933138000, + 21888242871839275222246405745257275088548364400416034343698203631753432403514, + 338596054005254, + 21888242871839275222246405745257275088548364400416034343698203869576682782863, + 340702191684495, + 147222924863248, + 78951777097311, + 118474304203618, + 21888242871839275222246405745257275088548364400416034343698203943618734921834, + 21888242871839275222246405745257275088548364400416034343698203720607646806420, + 21888242871839275222246405745257275088548364400416034343698203754346834579574, + 363489589002411, + 21888242871839275222246405745257275088548364400416034343698204110869874459424, + 255288792055977, + 37309213590899, + 21888242871839275222246405745257275088548364400416034343698203656666476683489, + 253089076430194, + 163969365261479, + 21888242871839275222246405745257275088548364400416034343698203975470281608238, + 529089581273085, + 21888242871839275222246405745257275088548364400416034343698203743362794690727, + 21888242871839275222246405745257275088548364400416034343698204083587697128492, + 397901259573925, + 21888242871839275222246405745257275088548364400416034343698203754372525831405, + 158293511258577, + 21888242871839275222246405745257275088548364400416034343698203723923565125299, + 405616752327774, + 93021300591904, + 21888242871839275222246405745257275088548364400416034343698204055452301177816, + 21888242871839275222246405745257275088548364400416034343698203955742853351535, + 21888242871839275222246405745257275088548364400416034343698204040044242941058, + 519634073568115, + 21888242871839275222246405745257275088548364400416034343698204138919837395755, + 526999041285017, + 21888242871839275222246405745257275088548364400416034343698203945821352954708, + 21888242871839275222246405745257275088548364400416034343698203637781815937625, + 21888242871839275222246405745257275088548364400416034343698203862705374257753, + 460098691023511, + 142411312900846, + 556634145871829, + 252148355012034, + 490288907845220, + 340801408932125, + 21888242871839275222246405745257275088548364400416034343698203856478365487032, + 532655056832846, + 427453591573764, + 109158685624244, + 21888242871839275222246405745257275088548364400416034343698203934190075136493, + 145560460020635, + 243220973829105, + 21888242871839275222246405745257275088548364400416034343698203899126677949462, + 5236631695648, + 21888242871839275222246405745257275088548364400416034343698204155437825897939, + 552970594113976, + 21888242871839275222246405745257275088548364400416034343698204019725463444981, + 21888242871839275222246405745257275088548364400416034343698203998675887668707, + 21888242871839275222246405745257275088548364400416034343698204118675723575234, + 241538866866776, + 21888242871839275222246405745257275088548364400416034343698203941919435071054, + 222236695343188, + 21888242871839275222246405745257275088548364400416034343698203647617542262586, + 21888242871839275222246405745257275088548364400416034343698203974238831545808, + 21888242871839275222246405745257275088548364400416034343698203937403735101268, + 153349967940505, + 114916827839480, + 21888242871839275222246405745257275088548364400416034343698204077035298573514, + 124373180622734, + 239696679247520, + 299374573216079, + 21888242871839275222246405745257275088548364400416034343698203639865604764190, + 21888242871839275222246405745257275088548364400416034343698203905437086601336, + 21888242871839275222246405745257275088548364400416034343698204146956379618555, + 21888242871839275222246405745257275088548364400416034343698203634267285580029, + 21888242871839275222246405745257275088548364400416034343698204103610065295535, + 21888242871839275222246405745257275088548364400416034343698204155775549404020, + 21888242871839275222246405745257275088548364400416034343698203910639015006353, + 528721877403366, + 21888242871839275222246405745257275088548364400416034343698204143238675445475, + 21888242871839275222246405745257275088548364400416034343698203884554526349872, + 21888242871839275222246405745257275088548364400416034343698204035428452843470, + 519754708024792, + 21888242871839275222246405745257275088548364400416034343698203730406283669179, + 21888242871839275222246405745257275088548364400416034343698203670271101569905, + 21888242871839275222246405745257275088548364400416034343698203989848897284168, + 21888242871839275222246405745257275088548364400416034343698204087406838334863, + 152696534087783, + 21888242871839275222246405745257275088548364400416034343698203729195214631667, + 27896835895576, + 13474226779143, + 21888242871839275222246405745257275088548364400416034343698204121749403685965, + 93765378232270, + 9239195107754, + 554766799646070, + 21888242871839275222246405745257275088548364400416034343698203708641173964059, + 553889529157729, + 21888242871839275222246405745257275088548364400416034343698203897784804531597, + 21888242871839275222246405745257275088548364400416034343698203843630570329448, + 21888242871839275222246405745257275088548364400416034343698204141054912600854, + 160005436582902, + 21888242871839275222246405745257275088548364400416034343698203710157280956991, + 320158782259891, + 21888242871839275222246405745257275088548364400416034343698203638686516476633, + 21888242871839275222246405745257275088548364400416034343698204161319361078396, + 21888242871839275222246405745257275088548364400416034343698203846744239988578, + 21888242871839275222246405745257275088548364400416034343698203963004986438892, + 21888242871839275222246405745257275088548364400416034343698203845898855887590, + 194789793563562, + 21888242871839275222246405745257275088548364400416034343698204134939623403907, + 137378095175703, + 336097148543449, + 21888242871839275222246405745257275088548364400416034343698203692540200395874, + 32391081188169, + 21888242871839275222246405745257275088548364400416034343698203857149867620401, + 21888242871839275222246405745257275088548364400416034343698203770661557085985, + 21888242871839275222246405745257275088548364400416034343698203820982152718946, + 21888242871839275222246405745257275088548364400416034343698203704796779899050, + 447630644821383, + 21888242871839275222246405745257275088548364400416034343698203776762591555919, + 21888242871839275222246405745257275088548364400416034343698204097355024626121, + 21888242871839275222246405745257275088548364400416034343698204117031885135551, + 12139992136696, + 21888242871839275222246405745257275088548364400416034343698203986661808805495, + 21888242871839275222246405745257275088548364400416034343698204171739479451076, + 469743101488379, + 21888242871839275222246405745257275088548364400416034343698204148431837945180, + 129490359913511, + 117471958523640, + 21888242871839275222246405745257275088548364400416034343698203632839382402330, + 391271868493241, + 21888242871839275222246405745257275088548364400416034343698203996664532070648, + 21888242871839275222246405745257275088548364400416034343698203868629575560565, + 206113992454890, + 309300119936907, + 21888242871839275222246405745257275088548364400416034343698204050115078636538, + 190300993950940, + 21888242871839275222246405745257275088548364400416034343698203714057127875934, + 21888242871839275222246405745257275088548364400416034343698204043162264884043, + 113575309310924, + 21888242871839275222246405745257275088548364400416034343698204121871734392529, + 283801754442173, + 522065000343276, + 71483970408210, + 305531681097436, + 363591767664307, + 14688230842261, + 392119249473751, + 26690880755532, + 21888242871839275222246405745257275088548364400416034343698204173558944760598, + 26856775450436, + 21888242871839275222246405745257275088548364400416034343698204130797743591517, + 545481989979097, + 438348808745627, + 21888242871839275222246405745257275088548364400416034343698204100788910785752, + 21888242871839275222246405745257275088548364400416034343698204157818939003520, + 358532389546339, + 558065269710342, + 281036082928422, + 21888242871839275222246405745257275088548364400416034343698204008913229883435, + 454554571471999, + 405594371068369, + 340627325625832, + 263660922712871, + 21888242871839275222246405745257275088548364400416034343698203797384415247594, + 282649770389593, + 21888242871839275222246405745257275088548364400416034343698203664819046278660, + 82706430525702, + 21888242871839275222246405745257275088548364400416034343698203742750232487731, + 222853769919430, + 362622697198263, + 21888242871839275222246405745257275088548364400416034343698204081574152591724, + 26828769186657, + 21888242871839275222246405745257275088548364400416034343698203683135276608474, + 108255707437753, + 64628235587494, + 21888242871839275222246405745257275088548364400416034343698204134515301174046, + 268847640747345, + 21888242871839275222246405745257275088548364400416034343698203854536195131277, + 406511929297548, + 21888242871839275222246405745257275088548364400416034343698204134652056253154, + 188179388099126, + 214525729973413, + 21888242871839275222246405745257275088548364400416034343698204106158433382745, + 21888242871839275222246405745257275088548364400416034343698203876214010978473, + 426910286729520, + 21888242871839275222246405745257275088548364400416034343698204133073448802949, + 21888242871839275222246405745257275088548364400416034343698204107004208718234, + 21888242871839275222246405745257275088548364400416034343698204171595480813448, + 21888242871839275222246405745257275088548364400416034343698203936445821491646, + 359069769714449, + 375574650252394, + 506434053229517, + 132036076638056, + 299955674945421, + 21888242871839275222246405745257275088548364400416034343698204152445608290547, + 21888242871839275222246405745257275088548364400416034343698203739202053993697, + 21888242871839275222246405745257275088548364400416034343698204156944035886876, + 21888242871839275222246405745257275088548364400416034343698203950553000634199, + 393182295982516, + 21888242871839275222246405745257275088548364400416034343698204065434792123096, + 477517550273284, + 21888242871839275222246405745257275088548364400416034343698203748150634242609, + 21888242871839275222246405745257275088548364400416034343698203707816056578393, + 527223770159016, + 449841313863608, + 21888242871839275222246405745257275088548364400416034343698203845421475494770, + 21888242871839275222246405745257275088548364400416034343698204024881116353946, + 292765696567101, + 21888242871839275222246405745257275088548364400416034343698203782962583308137, + 332983648746158, + 146996161587571, + 21888242871839275222246405745257275088548364400416034343698203985254624022111, + 21888242871839275222246405745257275088548364400416034343698204180522855248081, + 21888242871839275222246405745257275088548364400416034343698203739099616772718, + 21888242871839275222246405745257275088548364400416034343698204123282497915213, + 21888242871839275222246405745257275088548364400416034343698204005752745220888, + 21888242871839275222246405745257275088548364400416034343698204129879108674385, + 283487898789329, + 540446331382904, + 232516392593610, + 350358412194061, + 503818000853054, + 404749739905080, + 21888242871839275222246405745257275088548364400416034343698204088464990146137, + 21888242871839275222246405745257275088548364400416034343698203707904579842822, + 357939391367697, + 21888242871839275222246405745257275088548364400416034343698203981903180115419, + 21888242871839275222246405745257275088548364400416034343698203637502152805031, + 21888242871839275222246405745257275088548364400416034343698203694149917026484, + 21888242871839275222246405745257275088548364400416034343698204086753199553443, + 28052618867247, + 62264263110729, + 397289664749985, + 83692187756241, + 21888242871839275222246405745257275088548364400416034343698204164334893963354, + 21888242871839275222246405745257275088548364400416034343698203741188610480304, + 21888242871839275222246405745257275088548364400416034343698203739155238366653, + 93473910507879, + 21888242871839275222246405745257275088548364400416034343698204129802491079123, + 21888242871839275222246405745257275088548364400416034343698203968858350188276, + 103016911369760, + 130446575610318, + 390802409809942, + 21888242871839275222246405745257275088548364400416034343698204167812432930995, + 104012477895217, + 21888242871839275222246405745257275088548364400416034343698204104940987864328, + 21888242871839275222246405745257275088548364400416034343698203848236584739763, + 21888242871839275222246405745257275088548364400416034343698204154463980910671, + 266596630050161, + 310657843224865, + 21888242871839275222246405745257275088548364400416034343698204084011218159157, + 21888242871839275222246405745257275088548364400416034343698204176553309823884, + 16644042466186, + 223560641452369, + 346914811341428, + 21888242871839275222246405745257275088548364400416034343698203726853941881166, + 256585968794736, + 21888242871839275222246405745257275088548364400416034343698203637863095334960, + 21888242871839275222246405745257275088548364400416034343698203944232781693979, + 513132771538221, + 21888242871839275222246405745257275088548364400416034343698204013896725432680, + 164272737599994, + 21888242871839275222246405745257275088548364400416034343698203857009550769882, + 21888242871839275222246405745257275088548364400416034343698204012600722125778, + 21888242871839275222246405745257275088548364400416034343698203955355528846798, + 77113785923992, + 21888242871839275222246405745257275088548364400416034343698204078827238515556, + 357560848988083, + 188112534982684, + 503167688728599, + 30421650246053, + 206644178225092, + 475536693701802, + 21888242871839275222246405745257275088548364400416034343698204162134223621336, + 160660230998303, + 542107194697287, + 210645829526429, + 21888242871839275222246405745257275088548364400416034343698203699030156861887, + 21888242871839275222246405745257275088548364400416034343698203815162237134602, + 169615280222723, + 21888242871839275222246405745257275088548364400416034343698204089523659616727, + 379031436384814, + 21888242871839275222246405745257275088548364400416034343698203810275567881074, + 21888242871839275222246405745257275088548364400416034343698204059151361111990, + 21888242871839275222246405745257275088548364400416034343698203889226992491336, + 528167111096248, + 440806227677167, + 271771164682256, + 503609401732229, + 32996529931078, + 21888242871839275222246405745257275088548364400416034343698203688209322653297, + 25196833520891, + 21888242871839275222246405745257275088548364400416034343698204076182471100821, + 21888242871839275222246405745257275088548364400416034343698203654340219762564, + 21888242871839275222246405745257275088548364400416034343698203696074320806711, + 427444961269530, + 21888242871839275222246405745257275088548364400416034343698204014809835750565, + 21888242871839275222246405745257275088548364400416034343698203798977021100759, + 384554837655209, + 21888242871839275222246405745257275088548364400416034343698204039674497107694, + 81878346141133, + 546838187920960, + 509547077519125, + 21888242871839275222246405745257275088548364400416034343698204156416608688746, + 21888242871839275222246405745257275088548364400416034343698203887068491633777, + 329393262351551, + 18767972440044, + 21888242871839275222246405745257275088548364400416034343698203894652787806339, + 21888242871839275222246405745257275088548364400416034343698203656889533082326, + 21888242871839275222246405745257275088548364400416034343698203889809205103139, + 21888242871839275222246405745257275088548364400416034343698204147134097564860, + 21888242871839275222246405745257275088548364400416034343698203660306149968715, + 333306693391182, + 529128262356262, + 290724212569977, + 21888242871839275222246405745257275088548364400416034343698203759406934240474, + 21888242871839275222246405745257275088548364400416034343698203893620052866492, + 21888242871839275222246405745257275088548364400416034343698203829046690844700, + 21888242871839275222246405745257275088548364400416034343698203869769843561952, + 21888242871839275222246405745257275088548364400416034343698203654071767614069, + 21888242871839275222246405745257275088548364400416034343698204065878535393193, + 21888242871839275222246405745257275088548364400416034343698203633559644921096, + 21888242871839275222246405745257275088548364400416034343698204113016397335763, + 21888242871839275222246405745257275088548364400416034343698204098824372365451, + 403146898256329, + 11752905275331, + 461337991326606, + 456886506263020, + 21888242871839275222246405745257275088548364400416034343698204092665986682514, + 500891633602631, + 21888242871839275222246405745257275088548364400416034343698203636339664546901, + 545294853349470, + 268960045746712, + 21888242871839275222246405745257275088548364400416034343698203958301002150220, + 279569412052649, + 21888242871839275222246405745257275088548364400416034343698204052968277820136, + 434221748423013, + 359827357731909, + 10563124670024, + 345156169615638, + 127534129720795, + 21888242871839275222246405745257275088548364400416034343698203924048002885002, + 21888242871839275222246405745257275088548364400416034343698204148974836926174, + 11929252418743, + 305045561684792, + 91984210791357, + 408515225344653, + 312207639552575, + 21888242871839275222246405745257275088548364400416034343698203937276123971426, + 217757339415460, + 21888242871839275222246405745257275088548364400416034343698204025180327714631, + 21888242871839275222246405745257275088548364400416034343698203821908995597259, + 21888242871839275222246405745257275088548364400416034343698203969603680495325, + 21888242871839275222246405745257275088548364400416034343698204063710330954875, + 236720903658781, + 295084270099206, + 412016267872743, + 21888242871839275222246405745257275088548364400416034343698203817780742810313, + 435389752497250, + 21888242871839275222246405745257275088548364400416034343698203637857404166831, + 21888242871839275222246405745257275088548364400416034343698204186498289865224, + 404776358833923, + 178109856926526, + 21888242871839275222246405745257275088548364400416034343698203828034968739022, + 248497176795921, + 129944558267935, + 215134131185959, + 21888242871839275222246405745257275088548364400416034343698203875823986782002, + 21888242871839275222246405745257275088548364400416034343698203848035135734731, + 516839170121118, + 21888242871839275222246405745257275088548364400416034343698203902267304796113, + 21888242871839275222246405745257275088548364400416034343698204154259896767940, + 450025218254658, + 21888242871839275222246405745257275088548364400416034343698203850757695627407, + 21888242871839275222246405745257275088548364400416034343698203884535662405488, + 506721239545744, + 21888242871839275222246405745257275088548364400416034343698204148132068930155, + 21888242871839275222246405745257275088548364400416034343698203775699498100167, + 536243368928363, + 260745938203785, + 73888621546283, + 310683915213846, + 246779385084103, + 21888242871839275222246405745257275088548364400416034343698204028956962135036, + 362233453803877, + 21888242871839275222246405745257275088548364400416034343698203755165229919710, + 131184807860879, + 21888242871839275222246405745257275088548364400416034343698203925260913398560, + 21888242871839275222246405745257275088548364400416034343698203756005490562378, + 246114030919642, + 74131957766719, + 21888242871839275222246405745257275088548364400416034343698203836517474203579, + 137644048053430, + 167896091976461, + 485526763681848, + 250289842591424, + 297726081290917, + 159946726958055, + 99856217067823, + 374138702270883, + 21888242871839275222246405745257275088548364400416034343698203980503157764117, + 256235012599522, + 21888242871839275222246405745257275088548364400416034343698203877554237044085, + 52674657364668, + 21888242871839275222246405745257275088548364400416034343698204126553718058643, + 200758843854073, + 21888242871839275222246405745257275088548364400416034343698203814095381836530, + 21888242871839275222246405745257275088548364400416034343698204177249348730752, + 293108258115952, + 21888242871839275222246405745257275088548364400416034343698203721358750551449, + 21888242871839275222246405745257275088548364400416034343698203844740666081888, + 23451436820182, + 121025635738228, + 21888242871839275222246405745257275088548364400416034343698203887345811491285, + 323640086698578, + 136898756425906, + 91883882932633, + 258167230219669, + 21888242871839275222246405745257275088548364400416034343698204141970459362118, + 21888242871839275222246405745257275088548364400416034343698203850930282801698, + 455446570340094, + 21888242871839275222246405745257275088548364400416034343698203698860513324708, + 489532106470334, + 21888242871839275222246405745257275088548364400416034343698203704779445261203, + 482945942194368, + 340083824002111, + 21888242871839275222246405745257275088548364400416034343698203865618747031628, + 103250898277239, + 487419281034359, + 542250234069003, + 21888242871839275222246405745257275088548364400416034343698203635361652567519, + 21888242871839275222246405745257275088548364400416034343698203666156262283843, + 21888242871839275222246405745257275088548364400416034343698203631120386436758, + 21888242871839275222246405745257275088548364400416034343698204160964753373642, + 21888242871839275222246405745257275088548364400416034343698203935583326128282, + 408537200691197, + 21888242871839275222246405745257275088548364400416034343698203649329833428112, + 21888242871839275222246405745257275088548364400416034343698203642702548562842, + 21888242871839275222246405745257275088548364400416034343698203750090889582806, + 21888242871839275222246405745257275088548364400416034343698204040482499757672, + 98019493129976, + 199281747056704, + 21888242871839275222246405745257275088548364400416034343698204120231718032018, + 21888242871839275222246405745257275088548364400416034343698204120453197098826, + 552868911623415, + 323101145963966, + 21888242871839275222246405745257275088548364400416034343698203641106067631576, + 173834796780354, + 299598588358341, + 21888242871839275222246405745257275088548364400416034343698203903649546363703, + 302398168416115, + 263479068240678, + 520957715875498, + 21550302450617, + 470781773348801, + 21888242871839275222246405745257275088548364400416034343698204172140064426630, + 21888242871839275222246405745257275088548364400416034343698204149491141188797, + 56158147500006, + 21888242871839275222246405745257275088548364400416034343698204087825936541054, + 21888242871839275222246405745257275088548364400416034343698203728299976823640, + 139919510317690, + 21888242871839275222246405745257275088548364400416034343698203766579665121635, + 528846726871220, + 504199046597669, + 214049689138135, + 21888242871839275222246405745257275088548364400416034343698203879659745543965, + 217507662912365, + 384605030948470, + 382235395306620, + 21888242871839275222246405745257275088548364400416034343698203871753246687197, + 12989357491219, + 21888242871839275222246405745257275088548364400416034343698203872476809831250, + 43013300443576, + 21888242871839275222246405745257275088548364400416034343698203892920144289219, + 94451258291811, + 21888242871839275222246405745257275088548364400416034343698203667714604650422, + 21888242871839275222246405745257275088548364400416034343698203646561209642924, + 168763805892606, + 204797490624623, + 21888242871839275222246405745257275088548364400416034343698203700409338686010, + 97423277198706, + 331647639743785, + 422278867279835, + 319273856806449, + 330174614879249, + 399155133628098, + 21888242871839275222246405745257275088548364400416034343698204111979214637743, + 217951083459363, + 454011089516099, + 228784728443392, + 21888242871839275222246405745257275088548364400416034343698203727659904988836, + 21888242871839275222246405745257275088548364400416034343698204102702688068586, + 21888242871839275222246405745257275088548364400416034343698203820284297361980, + 21888242871839275222246405745257275088548364400416034343698203738295100717767, + 328773731693621, + 21888242871839275222246405745257275088548364400416034343698203675935353160349, + 83910776125277, + 21888242871839275222246405745257275088548364400416034343698203892392406336087, + 144854186487939, + 144104050436203, + 304936647589588, + 21888242871839275222246405745257275088548364400416034343698203626340740375102, + 21888242871839275222246405745257275088548364400416034343698203797756246923942, + 21888242871839275222246405745257275088548364400416034343698203900106025634234, + 21888242871839275222246405745257275088548364400416034343698204048319244534778, + 545652215921620, + 21888242871839275222246405745257275088548364400416034343698203791208825777311, + 533508692158375, + 494153309818069, + 449471744554524, + 21888242871839275222246405745257275088548364400416034343698203713237710838552, + 21888242871839275222246405745257275088548364400416034343698204036944819183884, + 21888242871839275222246405745257275088548364400416034343698204169340902426027, + 52223959353554, + 21888242871839275222246405745257275088548364400416034343698203899905029836354, + 21888242871839275222246405745257275088548364400416034343698203956026310085984, + 532250175063210, + 21888242871839275222246405745257275088548364400416034343698204159017951701990, + 395491406220548, + 21888242871839275222246405745257275088548364400416034343698203969533705370828, + 60510402492670, + 357720106759086, + 90592603224730, + 108714848044997, + 21888242871839275222246405745257275088548364400416034343698204062541224650986, + 29184824369290, + 21888242871839275222246405745257275088548364400416034343698203691492558121281, + 21888242871839275222246405745257275088548364400416034343698203724172334343409, + 21888242871839275222246405745257275088548364400416034343698204105090151066145, + 104677594739059, + 21888242871839275222246405745257275088548364400416034343698203964049823341726, + 21888242871839275222246405745257275088548364400416034343698204026799682152743, + 21888242871839275222246405745257275088548364400416034343698203700622301478506, + 168387610987731, + 182950702246943, + 21888242871839275222246405745257275088548364400416034343698204077348403329603, + 21888242871839275222246405745257275088548364400416034343698204112650159907461, + 480902072311294, + 21888242871839275222246405745257275088548364400416034343698203775475083861127, + 21888242871839275222246405745257275088548364400416034343698204097322064279560, + 230681669777403, + 21888242871839275222246405745257275088548364400416034343698204130855931919404, + 21888242871839275222246405745257275088548364400416034343698204063096100583351, + 21888242871839275222246405745257275088548364400416034343698204105527569464330, + 21888242871839275222246405745257275088548364400416034343698203873121559756939, + 362867484599494, + 21888242871839275222246405745257275088548364400416034343698204085464201039711, + 22973810685191, + 503201261562267, + 21888242871839275222246405745257275088548364400416034343698203799987689594221, + 21888242871839275222246405745257275088548364400416034343698203643827317715115, + 284211091220189, + 21888242871839275222246405745257275088548364400416034343698204075273450390687, + 507526129334055, + 362667192840883, + 21888242871839275222246405745257275088548364400416034343698204159176968361629, + 21888242871839275222246405745257275088548364400416034343698204011128755032078, + 21888242871839275222246405745257275088548364400416034343698203777585933634902, + 182822934035872, + 21888242871839275222246405745257275088548364400416034343698203996411029438359, + 149134813256182, + 37844649759731, + 21888242871839275222246405745257275088548364400416034343698204030361932300919, + 472862603789012, + 21888242871839275222246405745257275088548364400416034343698203681993669701033, + 21888242871839275222246405745257275088548364400416034343698204137465455862849, + 284635475479866, + 21888242871839275222246405745257275088548364400416034343698203757465281061877, + 492710186208291, + 363771759692592, + 21888242871839275222246405745257275088548364400416034343698204175913086777769, + 21888242871839275222246405745257275088548364400416034343698204015973853009713, + 21888242871839275222246405745257275088548364400416034343698203887051720328724, + 148522794571841, + 169397276929926, + 268032879005429, + 5581967153067, + 21888242871839275222246405745257275088548364400416034343698204057073697773968, + 21888242871839275222246405745257275088548364400416034343698204045768125850749, + 149781957763629, + 21888242871839275222246405745257275088548364400416034343698203850119161965631, + 21888242871839275222246405745257275088548364400416034343698203740061485141703, + 21888242871839275222246405745257275088548364400416034343698204056589334549102, + 144115133838534, + 21888242871839275222246405745257275088548364400416034343698204122949376044581, + 231381776199358, + 38813542072460, + 21888242871839275222246405745257275088548364400416034343698204066174371838957, + 142677987656704, + 21888242871839275222246405745257275088548364400416034343698203644978339068525, + 364444037630693, + 21888242871839275222246405745257275088548364400416034343698204054698215220938, + 159400950479268, + 21888242871839275222246405745257275088548364400416034343698203740643896093018, + 21888242871839275222246405745257275088548364400416034343698203745878207919905, + 99271998666125, + 301923313786891, + 244605499921422, + 213504366523200, + 58873129572164, + 424401256851160, + 21888242871839275222246405745257275088548364400416034343698203872631816244520, + 397850863414911, + 192559432742321, + 101541062137989, + 139974862221667, + 21888242871839275222246405745257275088548364400416034343698203645997318378309, + 408316748569871, + 62481565180948, + 481916263841442, + 21888242871839275222246405745257275088548364400416034343698204113045447070535, + 21888242871839275222246405745257275088548364400416034343698204056910871807458, + 21888242871839275222246405745257275088548364400416034343698203697974494378972, + 21888242871839275222246405745257275088548364400416034343698203829171417673565, + 21888242871839275222246405745257275088548364400416034343698203955095128727978, + 21888242871839275222246405745257275088548364400416034343698204162200048266231, + 21888242871839275222246405745257275088548364400416034343698204122089167033190, + 21888242871839275222246405745257275088548364400416034343698203864658370028482, + 21888242871839275222246405745257275088548364400416034343698203994776697209356, + 372915617311562, + 467263257360072, + 196012704960216, + 525195486575127, + 21888242871839275222246405745257275088548364400416034343698203858803886149054, + 21888242871839275222246405745257275088548364400416034343698203793487778969698, + 21888242871839275222246405745257275088548364400416034343698203788767888493226, + 21888242871839275222246405745257275088548364400416034343698204077105940411657, + 395294994492093, + 21888242871839275222246405745257275088548364400416034343698204043388332927564, + 21888242871839275222246405745257275088548364400416034343698203999082652111083, + 256183905244311, + 21888242871839275222246405745257275088548364400416034343698203646893572244770, + 168785159855714, + 21888242871839275222246405745257275088548364400416034343698203653004773562038, + 435718014505329, + 21888242871839275222246405745257275088548364400416034343698203870738783846230, + 233632454799090, + 492950989813018, + 21888242871839275222246405745257275088548364400416034343698203998433514836008, + 310358507673427, + 21888242871839275222246405745257275088548364400416034343698204186537993519975, + 442628584104033, + 21888242871839275222246405745257275088548364400416034343698204058880561111216, + 438384362789683, + 389376087200322, + 470544980260949, + 21888242871839275222246405745257275088548364400416034343698203780715527618984, + 21888242871839275222246405745257275088548364400416034343698203707106524370921, + 21888242871839275222246405745257275088548364400416034343698203675200029847230, + 21888242871839275222246405745257275088548364400416034343698204018265433255427, + 326000320277214, + 454641302776003, + 327009731717955, + 205967172931502, + 29460315902975, + 76056392199913, + 21888242871839275222246405745257275088548364400416034343698203830964331390807, + 21888242871839275222246405745257275088548364400416034343698204043053158571127, + 21888242871839275222246405745257275088548364400416034343698203795050760291741, + 302055888311457, + 149253056448642, + 21888242871839275222246405745257275088548364400416034343698203971557152517432, + 356676597330674, + 211675621197410, + 397056484725190, + 83997556060304, + 137295171952525, + 21888242871839275222246405745257275088548364400416034343698203691690313820220, + 60445178808655, + 21888242871839275222246405745257275088548364400416034343698203816968146132271, + 21888242871839275222246405745257275088548364400416034343698204182736840650855, + 21402505721601, + 285019102889882, + 424716626553747, + 311527617727818, + 520349307659973, + 399447944909488, + 436205757829890, + 65001405449581, + 21888242871839275222246405745257275088548364400416034343698203926800846220661, + 21888242871839275222246405745257275088548364400416034343698204014796394003986, + 482818074000986, + 21888242871839275222246405745257275088548364400416034343698203993918088879640, + 453291192432255, + 21888242871839275222246405745257275088548364400416034343698204096806422436071, + 425576475465830, + 21888242871839275222246405745257275088548364400416034343698203774615162701313, + 99314378335788, + 314080761880241, + 21888242871839275222246405745257275088548364400416034343698204059728381927053, + 21888242871839275222246405745257275088548364400416034343698203811857926477585, + 546933099358519, + 494178997292630, + 311491394976049, + 21888242871839275222246405745257275088548364400416034343698203879542187446566, + 21888242871839275222246405745257275088548364400416034343698203821839394263252, + 21888242871839275222246405745257275088548364400416034343698204143200098595699, + 21888242871839275222246405745257275088548364400416034343698204008561320039684, + 21888242871839275222246405745257275088548364400416034343698204001194788730736, + 352034236699030, + 238739498772288, + 447760582106930, + 117011238529628, + 222877680230020, + 534936808458498, + 523267554228855, + 21888242871839275222246405745257275088548364400416034343698204156852822203619, + 360462395432325, + 534084383453084, + 21888242871839275222246405745257275088548364400416034343698203701811268051801, + 21888242871839275222246405745257275088548364400416034343698203842767288291510, + 21888242871839275222246405745257275088548364400416034343698203652636332947562, + 21888242871839275222246405745257275088548364400416034343698203999833953476389, + 21888242871839275222246405745257275088548364400416034343698203979355456059329, + 226962092505018, + 184171946600570, + 522816288660028, + 21888242871839275222246405745257275088548364400416034343698204145933974696951, + 222342372657682, + 433129036253041, + 510841121526782, + 21888242871839275222246405745257275088548364400416034343698204013618808146325, + 21888242871839275222246405745257275088548364400416034343698203833548450274725, + 484303597018212, + 21888242871839275222246405745257275088548364400416034343698203805913351620803, + 21888242871839275222246405745257275088548364400416034343698203984584799884526, + 234472000264182, + 68223291979409, + 312614142403006, + 252586054545114, + 21888242871839275222246405745257275088548364400416034343698204090031644181691, + 8453242057682, + 464807494177629, + 2231274539180, + 21888242871839275222246405745257275088548364400416034343698203945662999403092, + 367747842023233, + 195287279004769, + 364042291998635, + 21888242871839275222246405745257275088548364400416034343698203678390893400028, + 509285423771718, + 201456244374547, + 302246417446563, + 501824972357641, + 21888242871839275222246405745257275088548364400416034343698203674833117931912, + 247918947717428, + 21888242871839275222246405745257275088548364400416034343698204144711232242116, + 21888242871839275222246405745257275088548364400416034343698204046007159949014, + 52140443402356, + 21888242871839275222246405745257275088548364400416034343698203835713344383317, + 21888242871839275222246405745257275088548364400416034343698203849830695151259, + 21888242871839275222246405745257275088548364400416034343698203843907079244983, + 21888242871839275222246405745257275088548364400416034343698203953715212400560, + 7702229124307, + 277629264729976, + 21888242871839275222246405745257275088548364400416034343698203714309006845297, + 267965587099438, + 21888242871839275222246405745257275088548364400416034343698204079737630774297, + 418148496263133, + 557481329642092, + 21888242871839275222246405745257275088548364400416034343698203874368978402858, + 21888242871839275222246405745257275088548364400416034343698203698077476496616, + 21888242871839275222246405745257275088548364400416034343698203805449276539015, + 21888242871839275222246405745257275088548364400416034343698203844184892317953, + 21888242871839275222246405745257275088548364400416034343698203807737446544994, + 21888242871839275222246405745257275088548364400416034343698203934758056780593, + 46778507089253, + 21888242871839275222246405745257275088548364400416034343698203780406540833383, + 21888242871839275222246405745257275088548364400416034343698203883358735664365, + 119225083976398, + 21888242871839275222246405745257275088548364400416034343698203677437365909034, + 21888242871839275222246405745257275088548364400416034343698203938784831313794, + 180297859005232, + 237342421211362, + 21888242871839275222246405745257275088548364400416034343698204126250506757063, + 21888242871839275222246405745257275088548364400416034343698203756367564231346, + 149924933418870, + 236132646234327, + 277276198394627, + 466186824255707, + 316700792586939, + 71884500886453, + 21888242871839275222246405745257275088548364400416034343698204135231514472793, + 221681365442493, + 21888242871839275222246405745257275088548364400416034343698203904038449485587, + 21888242871839275222246405745257275088548364400416034343698203909735825482210, + 21888242871839275222246405745257275088548364400416034343698203668391274943156, + 331713285825440, + 21888242871839275222246405745257275088548364400416034343698204084174994039543, + 21888242871839275222246405745257275088548364400416034343698204018188479086949, + 21888242871839275222246405745257275088548364400416034343698204028750759704305, + 517229335632436, + 21888242871839275222246405745257275088548364400416034343698203971831953630285, + 413219478909091, + 21888242871839275222246405745257275088548364400416034343698203720224224942196, + 527077867658186, + 21888242871839275222246405745257275088548364400416034343698204019293163489981, + 263183078216700, + 140457725037975, + 380527510743860, + 21888242871839275222246405745257275088548364400416034343698203803083738374475, + 400751777330780, + 21888242871839275222246405745257275088548364400416034343698203850788554929340, + 21888242871839275222246405745257275088548364400416034343698203942656923117536, + 21888242871839275222246405745257275088548364400416034343698203681662043861784, + 21888242871839275222246405745257275088548364400416034343698203685062445867741, + 21888242871839275222246405745257275088548364400416034343698204115443831795203, + 486106924538556, + 21888242871839275222246405745257275088548364400416034343698203914795565195128, + 21888242871839275222246405745257275088548364400416034343698203710474733634604, + 21888242871839275222246405745257275088548364400416034343698203994627106435225, + 301959511488461, + 21888242871839275222246405745257275088548364400416034343698204053196089386433, + 113366514324690, + 21888242871839275222246405745257275088548364400416034343698203828371827604179, + 21888242871839275222246405745257275088548364400416034343698204146975875262223, + 21888242871839275222246405745257275088548364400416034343698204030639838898627, + 190165395020816, + 21888242871839275222246405745257275088548364400416034343698204014423015806550, + 21888242871839275222246405745257275088548364400416034343698203852468965739218, + 48473187703752, + 316541886909723, + 455234661439253, + 312572198857187, + 414079475046395, + 21888242871839275222246405745257275088548364400416034343698203885910916162954, + 21888242871839275222246405745257275088548364400416034343698203652012231206397, + 116980634041002, + 52549496349102, + 21888242871839275222246405745257275088548364400416034343698203703497672177120, + 543358574760131, + 474698207298476, + 462058656979361, + 21888242871839275222246405745257275088548364400416034343698204167730455244299, + 21888242871839275222246405745257275088548364400416034343698203805533916512174, + 82430307812841, + 21888242871839275222246405745257275088548364400416034343698203642612931861998, + 95166641775308, + 21888242871839275222246405745257275088548364400416034343698203943910545232642, + 30863663546199, + 21888242871839275222246405745257275088548364400416034343698203667671057121044, + 21888242871839275222246405745257275088548364400416034343698204166357929253342, + 551169825798819, + 21888242871839275222246405745257275088548364400416034343698204179620101278200, + 383077672872140, + 541025256223021, + 391641200230285, + 21888242871839275222246405745257275088548364400416034343698204146385831627799, + 207473395839011, + 144726894291073, + 21888242871839275222246405745257275088548364400416034343698203775172975898681, + 176238581785503, + 21888242871839275222246405745257275088548364400416034343698204159395095728372, + 21888242871839275222246405745257275088548364400416034343698203701336629832992, + 95499770008166, + 21888242871839275222246405745257275088548364400416034343698204053828990842134, + 21888242871839275222246405745257275088548364400416034343698203673830328283164, + 502350241419185, + 403605141433832, + 221059384626193, + 21888242871839275222246405745257275088548364400416034343698203898181078798538, + 497304106383471, + 403012541263564, + 12072981962250, + 252464314801890, + 21888242871839275222246405745257275088548364400416034343698203707774292226577, + 345610905574507, + 492785241728238, + 12603178800267, + 21888242871839275222246405745257275088548364400416034343698203759893197722690, + 21888242871839275222246405745257275088548364400416034343698203767940299164663, + 279610955921734, + 21888242871839275222246405745257275088548364400416034343698203726961196177767, + 6077788013806, + 91201790262876, + 320305289495495, + 554271750746527, + 21888242871839275222246405745257275088548364400416034343698204072581350039411, + 21888242871839275222246405745257275088548364400416034343698204013446686104155, + 304357986170538, + 21888242871839275222246405745257275088548364400416034343698204051148265680819, + 21888242871839275222246405745257275088548364400416034343698203852278659276812, + 21888242871839275222246405745257275088548364400416034343698203875120887430132, + 21888242871839275222246405745257275088548364400416034343698203886279812158720, + 67735426288556, + 21888242871839275222246405745257275088548364400416034343698204067862106932767, + 21888242871839275222246405745257275088548364400416034343698203659706644229370, + 240468049540569, + 88197372862701, + 21888242871839275222246405745257275088548364400416034343698204017375518815305, + 262081475887743, + 21888242871839275222246405745257275088548364400416034343698203836008230191513, + 520453382715903, + 21888242871839275222246405745257275088548364400416034343698204038489437536999, + 21888242871839275222246405745257275088548364400416034343698204158104349712512, + 520652444874937, + 360740466659332, + 21888242871839275222246405745257275088548364400416034343698203990333661186249, + 21888242871839275222246405745257275088548364400416034343698203703709367281690, + 21888242871839275222246405745257275088548364400416034343698203975673567558284, + 21888242871839275222246405745257275088548364400416034343698204127589427170981, + 21888242871839275222246405745257275088548364400416034343698203763504853870599, + 21888242871839275222246405745257275088548364400416034343698203708826397278335, + 21888242871839275222246405745257275088548364400416034343698203711093753139698, + 460518478796541, + 560885680205994, + 331397323237212, + 351752768358262, + 479895765867284, + 21888242871839275222246405745257275088548364400416034343698203838333813911903, + 504271266309380, + 21888242871839275222246405745257275088548364400416034343698203665846666671835, + 21888242871839275222246405745257275088548364400416034343698204109374797072891, + 21888242871839275222246405745257275088548364400416034343698203713432702519373, + 21888242871839275222246405745257275088548364400416034343698203701200575251126, + 240996050756600, + 21888242871839275222246405745257275088548364400416034343698203691664147153818, + 21888242871839275222246405745257275088548364400416034343698204105403674065670, + 21888242871839275222246405745257275088548364400416034343698203809181732089414, + 21888242871839275222246405745257275088548364400416034343698203892711841970939, + 21888242871839275222246405745257275088548364400416034343698203990736537158882, + 21888242871839275222246405745257275088548364400416034343698204108707579734594, + 21888242871839275222246405745257275088548364400416034343698203920459465911720, + 142435903301653, + 5391812599076, + 276588192157921, + 143166927300933, + 82252583136049, + 21888242871839275222246405745257275088548364400416034343698203979095114350546, + 21888242871839275222246405745257275088548364400416034343698204123464096110854, + 21888242871839275222246405745257275088548364400416034343698203679118580917146, + 285621582292004, + 207692631587145, + 497536759792541, + 299985830706726, + 21888242871839275222246405745257275088548364400416034343698204077770061259110, + 21888242871839275222246405745257275088548364400416034343698203646745729568449, + 251947779355681, + 21888242871839275222246405745257275088548364400416034343698203763943659434151, + 58205885169871, + 21888242871839275222246405745257275088548364400416034343698204161299330484982, + 342192396473404, + 199653061639043, + 391635914367886, + 242044275377312, + 21888242871839275222246405745257275088548364400416034343698203868278413269132, + 21888242871839275222246405745257275088548364400416034343698203791696387180793, + 21888242871839275222246405745257275088548364400416034343698204002533694174251, + 114551729878162, + 21888242871839275222246405745257275088548364400416034343698204032384152462009, + 21888242871839275222246405745257275088548364400416034343698203637318267567586, + 21888242871839275222246405745257275088548364400416034343698204038758018937397, + 21888242871839275222246405745257275088548364400416034343698204033609281637993, + 21888242871839275222246405745257275088548364400416034343698203959993790691382, + 195981988560547, + 21888242871839275222246405745257275088548364400416034343698204043228972286174, + 21888242871839275222246405745257275088548364400416034343698203635481363605086, + 24449197973401, + 544678665003405, + 383173895659202, + 21888242871839275222246405745257275088548364400416034343698203859046111634531, + 21888242871839275222246405745257275088548364400416034343698203893300863529542, + 21888242871839275222246405745257275088548364400416034343698203773298320883031, + 461589324225745, + 21888242871839275222246405745257275088548364400416034343698204101561639493720, + 3197894859901, + 3181472372280, + 21888242871839275222246405745257275088548364400416034343698203756507725352680, + 21888242871839275222246405745257275088548364400416034343698203709106122387540, + 162746620736572, + 380152034064025, + 21888242871839275222246405745257275088548364400416034343698204126364540944085, + 21888242871839275222246405745257275088548364400416034343698204182702814163159, + 387799111040524, + 21888242871839275222246405745257275088548364400416034343698203719001912269234, + 403767831529516, + 21888242871839275222246405745257275088548364400416034343698204055284742178286, + 290587663648126, + 285289343307070, + 21888242871839275222246405745257275088548364400416034343698203739584180255836, + 558869804979754, + 330402456724142, + 451220072413832, + 21888242871839275222246405745257275088548364400416034343698204139268925016684, + 390862210634684, + 130557367370278, + 439146248201758, + 21888242871839275222246405745257275088548364400416034343698204180178621427904, + 254278389952894, + 30261115586794, + 21888242871839275222246405745257275088548364400416034343698204065851500146655, + 21888242871839275222246405745257275088548364400416034343698204086233145924088, + 537076436380458, + 165283719442520, + 175921412853293, + 545407101121746, + 377786086425577, + 21888242871839275222246405745257275088548364400416034343698203759864469554245, + 21888242871839275222246405745257275088548364400416034343698203782667695400027, + 268097787186617, + 388489148091151, + 21888242871839275222246405745257275088548364400416034343698203642489950294034, + 21888242871839275222246405745257275088548364400416034343698203840985332761034, + 21888242871839275222246405745257275088548364400416034343698203656468625663116, + 21888242871839275222246405745257275088548364400416034343698204120604941689714, + 467223678587830, + 257242592908111, + 87632776405896, + 199414227118862, + 21888242871839275222246405745257275088548364400416034343698204001472658298511, + 317806400783975, + 21888242871839275222246405745257275088548364400416034343698203946100195298411, + 21888242871839275222246405745257275088548364400416034343698203804133993312171, + 21888242871839275222246405745257275088548364400416034343698204053665407692161, + 515869108180545, + 473913728316006, + 56440823215163, + 21888242871839275222246405745257275088548364400416034343698203805717754417029, + 473461371736820, + 21888242871839275222246405745257275088548364400416034343698203644468277307791, + 433202580455997, + 130088398811235, + 449421214236948, + 515347924155205, + 21888242871839275222246405745257275088548364400416034343698204017469658181944, + 316018649851944, + 21888242871839275222246405745257275088548364400416034343698203699793226303786, + 21888242871839275222246405745257275088548364400416034343698203759956775636827, + 21888242871839275222246405745257275088548364400416034343698203660572211705860, + 60603508162048, + 269532244167272, + 21888242871839275222246405745257275088548364400416034343698203709786662420068, + 21888242871839275222246405745257275088548364400416034343698203866715328869442, + 21888242871839275222246405745257275088548364400416034343698203740618940230447, + 21888242871839275222246405745257275088548364400416034343698203656193159603713, + 161897593737187, + 561732813553317, + 183465896452032, + 21888242871839275222246405745257275088548364400416034343698204006680439449209, + 21888242871839275222246405745257275088548364400416034343698204140688082614330, + 222307396492394, + 21888242871839275222246405745257275088548364400416034343698203647386110101450, + 489179880690557, + 195507300751400, + 21888242871839275222246405745257275088548364400416034343698203849488369100288, + 531032274694680, + 21888242871839275222246405745257275088548364400416034343698203996317250971567, + 407566835415234, + 273354724652465, + 21888242871839275222246405745257275088548364400416034343698203877224357519334, + 21347205694176, + 336405900043143, + 21888242871839275222246405745257275088548364400416034343698203650686098922051, + 21888242871839275222246405745257275088548364400416034343698203775251093049514, + 21888242871839275222246405745257275088548364400416034343698203713338033723381, + 507365744399059, + 150678848648863, + 281220464667417, + 21888242871839275222246405745257275088548364400416034343698204146925514366352, + 21888242871839275222246405745257275088548364400416034343698203868572346369332, + 21888242871839275222246405745257275088548364400416034343698203688377193509426, + 21888242871839275222246405745257275088548364400416034343698203745267131816660, + 21888242871839275222246405745257275088548364400416034343698204149548607592255, + 292142283956042, + 21888242871839275222246405745257275088548364400416034343698203831816740702452, + 21888242871839275222246405745257275088548364400416034343698203845729502335191, + 21888242871839275222246405745257275088548364400416034343698203707801691101020, + 21888242871839275222246405745257275088548364400416034343698203918291639430203, + 48016218120536, + 54798079689506, + 21888242871839275222246405745257275088548364400416034343698203907045346760774, + 94097592391852, + 254195363705556, + 21888242871839275222246405745257275088548364400416034343698203962590211992463, + 479656524607207, + 21888242871839275222246405745257275088548364400416034343698203903165677298013, + 21888242871839275222246405745257275088548364400416034343698204112130143599242, + 21888242871839275222246405745257275088548364400416034343698203995059717479172, + 521848373595004, + 21888242871839275222246405745257275088548364400416034343698203814824797211055, + 352221751521665, + 163136782791198, + 295012680329926, + 21888242871839275222246405745257275088548364400416034343698204120097770679490, + 256718115108015, + 341863953668827, + 21888242871839275222246405745257275088548364400416034343698203864961222680374, + 26688478556829, + 21888242871839275222246405745257275088548364400416034343698204007570477107869, + 21888242871839275222246405745257275088548364400416034343698203653210883306701, + 21888242871839275222246405745257275088548364400416034343698203658148413457701, + 21888242871839275222246405745257275088548364400416034343698204049140151169129, + 444695732516708, + 394139460238394, + 458105659332268, + 216370260153351, + 21888242871839275222246405745257275088548364400416034343698204141122173777390, + 21888242871839275222246405745257275088548364400416034343698204174435025943995, + 21888242871839275222246405745257275088548364400416034343698204014957402829256, + 21888242871839275222246405745257275088548364400416034343698203788737835800326, + 21888242871839275222246405745257275088548364400416034343698203971104258838970, + 21888242871839275222246405745257275088548364400416034343698203982897974641005, + 21888242871839275222246405745257275088548364400416034343698203991685988814606, + 206754956511384, + 21888242871839275222246405745257275088548364400416034343698203911875056607415, + 21888242871839275222246405745257275088548364400416034343698204023749344321016, + 21888242871839275222246405745257275088548364400416034343698203876636733257376, + 21888242871839275222246405745257275088548364400416034343698203802138199839354, + 21888242871839275222246405745257275088548364400416034343698204169456315160763, + 350405933331015, + 478570495833685, + 21888242871839275222246405745257275088548364400416034343698203894840394820201, + 382991712719946, + 21888242871839275222246405745257275088548364400416034343698204170348331422070, + 21888242871839275222246405745257275088548364400416034343698203864843969249389, + 21888242871839275222246405745257275088548364400416034343698204102658550453964, + 149704625974549, + 311954383458433, + 21888242871839275222246405745257275088548364400416034343698204153775023916633, + 135177837388015, + 395954985200291, + 494591808505646, + 464499380071998, + 21888242871839275222246405745257275088548364400416034343698203901056953385664, + 21888242871839275222246405745257275088548364400416034343698203847066913183944, + 359173136504909, + 21888242871839275222246405745257275088548364400416034343698204079111359071136, + 21888242871839275222246405745257275088548364400416034343698203783282174443049, + 450921013762735, + 266568759039922, + 21888242871839275222246405745257275088548364400416034343698203626898748335463, + 21888242871839275222246405745257275088548364400416034343698203839036766496548, + 21888242871839275222246405745257275088548364400416034343698204099406114164456, + 21888242871839275222246405745257275088548364400416034343698203973413218983046, + 21888242871839275222246405745257275088548364400416034343698203668288060960383, + 417817503369962, + 282773787412357, + 21888242871839275222246405745257275088548364400416034343698204181953065987713, + 455119889526390, + 21888242871839275222246405745257275088548364400416034343698203683838848494920, + 21888242871839275222246405745257275088548364400416034343698203687298837381596, + 355658194618048, + 21888242871839275222246405745257275088548364400416034343698203760858521715433, + 21888242871839275222246405745257275088548364400416034343698203693726561890403, + 21888242871839275222246405745257275088548364400416034343698203689189435121899, + 21888242871839275222246405745257275088548364400416034343698203911537882340427, + 124739867071444, + 331898519298035, + 21888242871839275222246405745257275088548364400416034343698203866877976614794, + 365091501379693, + 73749200442811, + 21888242871839275222246405745257275088548364400416034343698203723486493102359, + 40598036438580, + 49611439791240, + 149177015577750, + 168788717501987, + 21888242871839275222246405745257275088548364400416034343698203689867500801633, + 21888242871839275222246405745257275088548364400416034343698203629691652867998, + 21888242871839275222246405745257275088548364400416034343698203676229940084557, + 331206712879548, + 483332183921385, + 84177280982890, + 21888242871839275222246405745257275088548364400416034343698203735278603369402, + 550756393517246, + 481262316489732, + 141529355954347, + 21888242871839275222246405745257275088548364400416034343698204159418180876710, + 21888242871839275222246405745257275088548364400416034343698204061619892941777, + 141682161833007, + 21888242871839275222246405745257275088548364400416034343698203729577589876888, + 295341668362422, + 21888242871839275222246405745257275088548364400416034343698204163024278668474, + 442033349342221, + 21888242871839275222246405745257275088548364400416034343698203705013270987497, + 21888242871839275222246405745257275088548364400416034343698203890659287045879, + 21888242871839275222246405745257275088548364400416034343698203662713014915136, + 291454744544102, + 21888242871839275222246405745257275088548364400416034343698203717129736398059, + 53915258855725, + 21888242871839275222246405745257275088548364400416034343698203977255024345478, + 484005087841101, + 21888242871839275222246405745257275088548364400416034343698203799445874203825, + 562090936880874, + 145136689709842, + 21888242871839275222246405745257275088548364400416034343698204110688634175693, + 139176152586955, + 131425100024290, + 202196410571590, + 21888242871839275222246405745257275088548364400416034343698203787870664893150, + 401366889577018, + 21888242871839275222246405745257275088548364400416034343698204158809689980313, + 21888242871839275222246405745257275088548364400416034343698203791170066368081, + 11113508280962, + 21888242871839275222246405745257275088548364400416034343698203785852881864369, + 352882484651771, + 21888242871839275222246405745257275088548364400416034343698203685736534178433, + 156116834978660, + 21888242871839275222246405745257275088548364400416034343698204120985220790613, + 457134839273738, + 134771456432445, + 404485592745255, + 27551978050630, + 21888242871839275222246405745257275088548364400416034343698203920502975819655, + 21888242871839275222246405745257275088548364400416034343698203712836383622875, + 413132383458609, + 292926879091387, + 21888242871839275222246405745257275088548364400416034343698204062837067668422, + 307967187719988, + 135526883588353, + 221141745700917, + 414895753196579, + 21888242871839275222246405745257275088548364400416034343698203655348355163954, + 21888242871839275222246405745257275088548364400416034343698203777773611342980, + 226371561055943, + 21888242871839275222246405745257275088548364400416034343698203987869245755520, + 21888242871839275222246405745257275088548364400416034343698204022174055525311, + 152017047839582, + 196946196967489, + 21888242871839275222246405745257275088548364400416034343698203709286780584086, + 537590482542613, + 21888242871839275222246405745257275088548364400416034343698204174285283586677, + 21888242871839275222246405745257275088548364400416034343698203653210362534019, + 21888242871839275222246405745257275088548364400416034343698204181919954713986, + 21888242871839275222246405745257275088548364400416034343698203743803508392447, + 21888242871839275222246405745257275088548364400416034343698204000955928551526, + 540298987327168, + 318694264550568, + 21888242871839275222246405745257275088548364400416034343698203923544695737069, + 21888242871839275222246405745257275088548364400416034343698204146633901537618, + 266523123198033, + 21888242871839275222246405745257275088548364400416034343698204111851203342480, + 21888242871839275222246405745257275088548364400416034343698203699016910455992, + 302349774223208, + 21888242871839275222246405745257275088548364400416034343698203721113051834228, + 21888242871839275222246405745257275088548364400416034343698203923149248017252, + 199775878934787, + 191138793949747, + 21888242871839275222246405745257275088548364400416034343698203748379333469726, + 21888242871839275222246405745257275088548364400416034343698203701705013864575, + 21888242871839275222246405745257275088548364400416034343698203768032437163024, + 395206407799757, + 21888242871839275222246405745257275088548364400416034343698204060959169315693, + 21888242871839275222246405745257275088548364400416034343698204098434810001323, + 492046706709420, + 21888242871839275222246405745257275088548364400416034343698204138076184558514, + 170992541467202, + 60929961973107, + 465799408085219, + 146896540226751, + 21888242871839275222246405745257275088548364400416034343698204161358767801877, + 397869109646559, + 419071104975512, + 352244791696705, + 422979415345478, + 537908576550807, + 249512104599881, + 277257292704344, + 56197236413070, + 557297884965121, + 21888242871839275222246405745257275088548364400416034343698203847895590476817, + 488515052843309, + 341256006175571, + 21888242871839275222246405745257275088548364400416034343698204185919246132732, + 282407298133598, + 114801168635002, + 166242688609751, + 325022271476087, + 21888242871839275222246405745257275088548364400416034343698203763117698075313, + 450311685964389, + 21888242871839275222246405745257275088548364400416034343698203990420363481183, + 21888242871839275222246405745257275088548364400416034343698203767506143168620, + 21888242871839275222246405745257275088548364400416034343698204017962074716521, + 21888242871839275222246405745257275088548364400416034343698204034600251313990, + 486094192757307, + 21888242871839275222246405745257275088548364400416034343698203736200305649669, + 21888242871839275222246405745257275088548364400416034343698203939538282718538, + 438473151392640, + 21888242871839275222246405745257275088548364400416034343698203686964241234793, + 21888242871839275222246405745257275088548364400416034343698203846999471791121, + 21888242871839275222246405745257275088548364400416034343698203924607545870311, + 353149937933068, + 430680656803467, + 21888242871839275222246405745257275088548364400416034343698203951030479935929, + 21888242871839275222246405745257275088548364400416034343698203797608134682881, + 530151088307015, + 21888242871839275222246405745257275088548364400416034343698204091043830897284, + 21888242871839275222246405745257275088548364400416034343698203969024500722371, + 21888242871839275222246405745257275088548364400416034343698203851740982159630, + 1445504041807, + 81671081910244, + 453739816015100, + 21888242871839275222246405745257275088548364400416034343698204147033410098626, + 184952711304755, + 21888242871839275222246405745257275088548364400416034343698203766820212447989, + 21888242871839275222246405745257275088548364400416034343698203639253009318076, + 180187653269890, + 21888242871839275222246405745257275088548364400416034343698203844155981901721, + 21888242871839275222246405745257275088548364400416034343698204055823362046650, + 301842230059024, + 21888242871839275222246405745257275088548364400416034343698203768199443390297, + 550895904461021, + 172924991586470, + 21888242871839275222246405745257275088548364400416034343698204151167920908164, + 21888242871839275222246405745257275088548364400416034343698203747325406109771, + 21888242871839275222246405745257275088548364400416034343698203961654179749714, + 21888242871839275222246405745257275088548364400416034343698203872663307437681, + 21888242871839275222246405745257275088548364400416034343698204176199768425496, + 359058530053748, + 15728154953716, + 21888242871839275222246405745257275088548364400416034343698203631402988592588, + 21888242871839275222246405745257275088548364400416034343698203770244584621502, + 21888242871839275222246405745257275088548364400416034343698203747501828356266, + 523358392565398, + 528239252567222, + 21888242871839275222246405745257275088548364400416034343698204124788993424603, + 554530092105199, + 21888242871839275222246405745257275088548364400416034343698203724025304308765, + 16404341433871, + 21888242871839275222246405745257275088548364400416034343698203797569428090470, + 21888242871839275222246405745257275088548364400416034343698203667040796389112, + 283652743920918, + 21888242871839275222246405745257275088548364400416034343698204004612093564345, + 21888242871839275222246405745257275088548364400416034343698203739269010501703, + 157272542788190, + 21888242871839275222246405745257275088548364400416034343698204154500032639326, + 21888242871839275222246405745257275088548364400416034343698204123633195640303, + 379040083167661, + 21888242871839275222246405745257275088548364400416034343698203648369094584045, + 78285180374138, + 21888242871839275222246405745257275088548364400416034343698203783875694322906, + 162550233265323, + 301108449486878, + 21888242871839275222246405745257275088548364400416034343698204000207106639973, + 21888242871839275222246405745257275088548364400416034343698203945141524552766, + 478696948165762, + 432837647927301, + 21888242871839275222246405745257275088548364400416034343698203709715460659968, + 21888242871839275222246405745257275088548364400416034343698204153757214817612, + 263278754827230, + 399194460288395, + 21888242871839275222246405745257275088548364400416034343698203826327278617067, + 185274962640274, + 499815338631092, + 21888242871839275222246405745257275088548364400416034343698203659307775418933, + 370013470766368, + 21888242871839275222246405745257275088548364400416034343698204150279637800076, + 102784425363640, + 21888242871839275222246405745257275088548364400416034343698204068567866841578, + 353816023482044, + 21888242871839275222246405745257275088548364400416034343698204017875275534254, + 16330286701666, + 21888242871839275222246405745257275088548364400416034343698203856823108297755, + 522285048739383, + 21888242871839275222246405745257275088548364400416034343698203795785240157809, + 21888242871839275222246405745257275088548364400416034343698204176327671678921, + 21888242871839275222246405745257275088548364400416034343698203873318661519329, + 86929295272801, + 21888242871839275222246405745257275088548364400416034343698204127778962352087, + 21888242871839275222246405745257275088548364400416034343698203666678045917483, + 21888242871839275222246405745257275088548364400416034343698203726843332675003, + 21888242871839275222246405745257275088548364400416034343698203906560855848553, + 21888242871839275222246405745257275088548364400416034343698203829375058082913, + 21888242871839275222246405745257275088548364400416034343698203669022080348550, + 21888242871839275222246405745257275088548364400416034343698203854041806546245, + 21888242871839275222246405745257275088548364400416034343698203895578585396783, + 21888242871839275222246405745257275088548364400416034343698204074989074045262, + 21888242871839275222246405745257275088548364400416034343698203712492178783266, + 21888242871839275222246405745257275088548364400416034343698203774786912997638, + 21888242871839275222246405745257275088548364400416034343698203876845073806551, + 116310625144084, + 21888242871839275222246405745257275088548364400416034343698203674898103497153, + 504630979321029, + 374648015358346, + 21888242871839275222246405745257275088548364400416034343698204148333229764412, + 337904347951308, + 387156022201493, + 21888242871839275222246405745257275088548364400416034343698203762277072662956, + 87839088840166, + 167702510683332, + 21888242871839275222246405745257275088548364400416034343698203949950339411660, + 364440420250526, + 21888242871839275222246405745257275088548364400416034343698203773899866398587, + 21888242871839275222246405745257275088548364400416034343698203759665810364434, + 21888242871839275222246405745257275088548364400416034343698203875812315705847, + 21888242871839275222246405745257275088548364400416034343698203838501580099966, + 21888242871839275222246405745257275088548364400416034343698204140208628985692, + 21888242871839275222246405745257275088548364400416034343698204004902884352062, + 21888242871839275222246405745257275088548364400416034343698203927917276426914, + 21888242871839275222246405745257275088548364400416034343698204010681208932977, + 183593377299276, + 488384625246839, + 21888242871839275222246405745257275088548364400416034343698203658203732064457, + 201231068088203, + 21888242871839275222246405745257275088548364400416034343698203756913106206958, + 17909278682354, + 21888242871839275222246405745257275088548364400416034343698203690995206212882, + 165738462068857, + 21888242871839275222246405745257275088548364400416034343698203775244319103556, + 21888242871839275222246405745257275088548364400416034343698204125987758005359, + 21888242871839275222246405745257275088548364400416034343698203932282586759462, + 271195828884554, + 21888242871839275222246405745257275088548364400416034343698203964253243932241, + 21888242871839275222246405745257275088548364400416034343698204148904200168237, + 308453943782866, + 21888242871839275222246405745257275088548364400416034343698203686722132255320, + 70002899273321, + 217111156413331, + 548590597669720, + 21888242871839275222246405745257275088548364400416034343698203987036628988419, + 254199437076422, + 502157987364810, + 40419983907213, + 405008949097813, + 371592098175319, + 170673005684544, + 21888242871839275222246405745257275088548364400416034343698203914484680220168, + 270070639234490, + 21888242871839275222246405745257275088548364400416034343698204158146048987353, + 21888242871839275222246405745257275088548364400416034343698203901264935966442, + 21888242871839275222246405745257275088548364400416034343698203877816303333700, + 21888242871839275222246405745257275088548364400416034343698203662428690259165, + 21888242871839275222246405745257275088548364400416034343698203935693085440760, + 21888242871839275222246405745257275088548364400416034343698204033526600764847, + 543021014255515, + 539766116005714, + 21888242871839275222246405745257275088548364400416034343698204127978684070168, + 361221902464488, + 21888242871839275222246405745257275088548364400416034343698203917232579747117, + 157601025604255, + 21888242871839275222246405745257275088548364400416034343698204091655166750371, + 21888242871839275222246405745257275088548364400416034343698203868187894554763, + 21888242871839275222246405745257275088548364400416034343698203933339858929726, + 21888242871839275222246405745257275088548364400416034343698203789586528856897, + 434491930169770, + 49155902886186, + 169444231011870, + 21888242871839275222246405745257275088548364400416034343698203996811769423720, + 539803666297494, + 21888242871839275222246405745257275088548364400416034343698204106203375107296, + 162056383789736, + 21888242871839275222246405745257275088548364400416034343698203630636543026514, + 196597623507230, + 464168480589505, + 351270938659853, + 379357507432931, + 21888242871839275222246405745257275088548364400416034343698204174039975776865, + 369571619533789, + 341129671412993, + 9511009043124, + 21888242871839275222246405745257275088548364400416034343698204110609338633089, + 346473387491991, + 376938368226040, + 402321170049734, + 145730717718139, + 521515616695370, + 21888242871839275222246405745257275088548364400416034343698204100774323033226, + 21888242871839275222246405745257275088548364400416034343698203682497669773147, + 518222429336066, + 21888242871839275222246405745257275088548364400416034343698203799995612350091, + 332320214608259, + 21888242871839275222246405745257275088548364400416034343698204099067175111780, + 206041732183267, + 21888242871839275222246405745257275088548364400416034343698203955367190473041, + 21888242871839275222246405745257275088548364400416034343698204106279816975429, + 21888242871839275222246405745257275088548364400416034343698203815536012236108, + 105054092236861, + 21888242871839275222246405745257275088548364400416034343698204046518032158914, + 21888242871839275222246405745257275088548364400416034343698204028986010171633, + 86749348635088, + 24942471070438, + 21888242871839275222246405745257275088548364400416034343698204035284299854876, + 494100978135166, + 21888242871839275222246405745257275088548364400416034343698203694023430578068, + 203448338549553, + 121488673803991, + 21888242871839275222246405745257275088548364400416034343698203756672217341510, + 21888242871839275222246405745257275088548364400416034343698204124506831478527, + 21888242871839275222246405745257275088548364400416034343698204088292347799692, + 21888242871839275222246405745257275088548364400416034343698204003520698922412, + 343867318069401, + 270227557409311, + 236683859784116, + 163893341064450, + 520049076225598, + 202316388957873, + 21888242871839275222246405745257275088548364400416034343698203807430999160067, + 21888242871839275222246405745257275088548364400416034343698204174622489589638, + 96529319049306, + 229317418778617, + 21888242871839275222246405745257275088548364400416034343698203825742085840798, + 21888242871839275222246405745257275088548364400416034343698203924880949248239, + 21888242871839275222246405745257275088548364400416034343698203740119289724549, + 21888242871839275222246405745257275088548364400416034343698203876492656249645, + 260718169847403, + 299387984893154, + 548708526231566, + 97823573100849, + 21888242871839275222246405745257275088548364400416034343698204073808668990103, + 471289489229757, + 21888242871839275222246405745257275088548364400416034343698203880080361141324, + 21888242871839275222246405745257275088548364400416034343698203680130215913160, + 359461673176527, + 9472413275996, + 556917572683784, + 204078471827387, + 21888242871839275222246405745257275088548364400416034343698203672013388589221, + 21888242871839275222246405745257275088548364400416034343698204004768015666201, + 388005889989839, + 377554248680548, + 146841008687324, + 21888242871839275222246405745257275088548364400416034343698204174781293052776, + 345458183640887, + 21888242871839275222246405745257275088548364400416034343698204081850287868102, + 238720729459021, + 55349031797030, + 403226050066295, + 213355880913216, + 21888242871839275222246405745257275088548364400416034343698203893656392406604, + 21888242871839275222246405745257275088548364400416034343698203937619093383920, + 21888242871839275222246405745257275088548364400416034343698203773382573493294, + 21552692743717, + 21888242871839275222246405745257275088548364400416034343698204037082959131229, + 273129604390306, + 21888242871839275222246405745257275088548364400416034343698203635419307888231, + 21888242871839275222246405745257275088548364400416034343698203904110859915964, + 21888242871839275222246405745257275088548364400416034343698203872080469552871, + 233280424501252, + 21888242871839275222246405745257275088548364400416034343698203937849430663629, + 21888242871839275222246405745257275088548364400416034343698203845717245687290, + 454419256110272, + 21888242871839275222246405745257275088548364400416034343698204157852280858351, + 21888242871839275222246405745257275088548364400416034343698204012439699340200, + 156360205438391, + 168137969990015, + 21888242871839275222246405745257275088548364400416034343698204164324589765110, + 56916162456813, + 21888242871839275222246405745257275088548364400416034343698204119101205361173, + 83876181345448, + 21888242871839275222246405745257275088548364400416034343698203754983266764921, + 57778631871778, + 21888242871839275222246405745257275088548364400416034343698203631339542308416, + 192874542572807, + 21888242871839275222246405745257275088548364400416034343698204024100683908375, + 21888242871839275222246405745257275088548364400416034343698203885213958589542, + 211921194245950, + 21888242871839275222246405745257275088548364400416034343698203709444534932272, + 21888242871839275222246405745257275088548364400416034343698204040067850119510, + 490061242838575, + 21888242871839275222246405745257275088548364400416034343698204164494212098067, + 21888242871839275222246405745257275088548364400416034343698203899910872207601, + 21888242871839275222246405745257275088548364400416034343698203800220551189809, + 342115222540489, + 101122825561732, + 287346687265124, + 21888242871839275222246405745257275088548364400416034343698203713724437958038, + 21888242871839275222246405745257275088548364400416034343698204125960321604755, + 266948402013277, + 21888242871839275222246405745257275088548364400416034343698203891932109369665, + 489905066938115, + 179527922505132, + 21888242871839275222246405745257275088548364400416034343698203625849321253989, + 314856701172041, + 270257658295228, + 362712828952969, + 293406429801049, + 21888242871839275222246405745257275088548364400416034343698203994676283022236, + 21888242871839275222246405745257275088548364400416034343698203769037393293136, + 367768170089312, + 21888242871839275222246405745257275088548364400416034343698203839741751199945, + 21888242871839275222246405745257275088548364400416034343698203957460909516167, + 21888242871839275222246405745257275088548364400416034343698203875341118282374, + 365558155975256, + 21888242871839275222246405745257275088548364400416034343698204014794352502301, + 21888242871839275222246405745257275088548364400416034343698203859920215023181, + 21888242871839275222246405745257275088548364400416034343698203930889701991143, + 21888242871839275222246405745257275088548364400416034343698203857588211126403, + 476853329408296, + 21888242871839275222246405745257275088548364400416034343698204131434236606166, + 115339648984641, + 442261393083240, + 239068203645205, + 21888242871839275222246405745257275088548364400416034343698203963048862205544, + 273817425917292, + 234212804353972, + 21888242871839275222246405745257275088548364400416034343698203876777227020161, + 257147614645952, + 98749904967571, + 21888242871839275222246405745257275088548364400416034343698204053355966536150, + 73993104891476, + 21888242871839275222246405745257275088548364400416034343698204061472510297532, + 21888242871839275222246405745257275088548364400416034343698204065037224931473, + 21888242871839275222246405745257275088548364400416034343698204153020501874788, + 336628834649469, + 514358116091004, + 207006128826689, + 21888242871839275222246405745257275088548364400416034343698204016842260172184, + 67674115614126, + 21888242871839275222246405745257275088548364400416034343698203900060551010141, + 447780965067092, + 100088371618665, + 162826588472821, + 532549271421664, + 393571641796613, + 21123346062180, + 427136550203299, + 453781862001071, + 369211324663360, + 535773186325740, + 258804791139144, + 319235415341717, + 144782666565092, + 21888242871839275222246405745257275088548364400416034343698203716355320643898, + 21888242871839275222246405745257275088548364400416034343698203667688079855445, + 21888242871839275222246405745257275088548364400416034343698204159698295382783, + 399722175579601, + 21888242871839275222246405745257275088548364400416034343698204148630037822916, + 21888242871839275222246405745257275088548364400416034343698203679309620856134, + 21888242871839275222246405745257275088548364400416034343698204060929604755947, + 21888242871839275222246405745257275088548364400416034343698204152277329866202, + 21888242871839275222246405745257275088548364400416034343698203698856086762739, + 21888242871839275222246405745257275088548364400416034343698203865013335816427, + 21888242871839275222246405745257275088548364400416034343698204066671368983735, + 21888242871839275222246405745257275088548364400416034343698203802417179808997, + 21888242871839275222246405745257275088548364400416034343698203778458177741033, + 21888242871839275222246405745257275088548364400416034343698203968813204787128, + 259946127477127, + 21888242871839275222246405745257275088548364400416034343698203779705814457028, + 21888242871839275222246405745257275088548364400416034343698204078788957276475, + 21888242871839275222246405745257275088548364400416034343698204154713750970274, + 21888242871839275222246405745257275088548364400416034343698203701121953292827, + 476164414247061, + 21888242871839275222246405745257275088548364400416034343698203890014900351188, + 21888242871839275222246405745257275088548364400416034343698203745629160345865, + 21888242871839275222246405745257275088548364400416034343698204180896944909136, + 21888242871839275222246405745257275088548364400416034343698203809133316107027, + 21888242871839275222246405745257275088548364400416034343698203760787336268248, + 416559477581933, + 21888242871839275222246405745257275088548364400416034343698204003540810685531, + 21888242871839275222246405745257275088548364400416034343698203775734341637326, + 365940545704445, + 225421292792485, + 21888242871839275222246405745257275088548364400416034343698204049418311491226, + 21888242871839275222246405745257275088548364400416034343698204131653297420820, + 21888242871839275222246405745257275088548364400416034343698203981266747891267, + 21888242871839275222246405745257275088548364400416034343698204027528185217985, + 21888242871839275222246405745257275088548364400416034343698203730385948754550, + 21888242871839275222246405745257275088548364400416034343698203715436823239510, + 423232535736268, + 304982643558744, + 21888242871839275222246405745257275088548364400416034343698204143189483163988, + 456891725130676, + 21888242871839275222246405745257275088548364400416034343698203954023768130505, + 154284589822860, + 21888242871839275222246405745257275088548364400416034343698203905134885232285, + 21888242871839275222246405745257275088548364400416034343698203685791183046019, + 473580924430333, + 21888242871839275222246405745257275088548364400416034343698203964089551279065, + 510112640080177, + 257986182505154, + 444043381501809, + 21888242871839275222246405745257275088548364400416034343698203856492775165922, + 131304052993881, + 21888242871839275222246405745257275088548364400416034343698203977957456179303, + 21888242871839275222246405745257275088548364400416034343698204120442789225014, + 178741840215945, + 21888242871839275222246405745257275088548364400416034343698203885232108052899, + 512349969402519, + 21888242871839275222246405745257275088548364400416034343698204001729500802945, + 21888242871839275222246405745257275088548364400416034343698204063094674251399, + 205528383611807, + 21888242871839275222246405745257275088548364400416034343698203828927161941253, + 16060172567865, + 21888242871839275222246405745257275088548364400416034343698203999746912534593, + 198793478249597, + 21888242871839275222246405745257275088548364400416034343698203891706608013648, + 21888242871839275222246405745257275088548364400416034343698204176676458167949, + 21888242871839275222246405745257275088548364400416034343698204154889179918262, + 210559423921683, + 185525843327897, + 9523101061314, + 21888242871839275222246405745257275088548364400416034343698203645466177349095, + 21888242871839275222246405745257275088548364400416034343698203987569505267943, + 61443100963195, + 293892122906174, + 253887379830221, + 68713508491249, + 21888242871839275222246405745257275088548364400416034343698203751432047528715, + 21888242871839275222246405745257275088548364400416034343698204172406072218546, + 21888242871839275222246405745257275088548364400416034343698203704578196533807, + 21888242871839275222246405745257275088548364400416034343698203774802150795307, + 105858081614786, + 21888242871839275222246405745257275088548364400416034343698203755227203120182, + 189748309886983, + 21888242871839275222246405745257275088548364400416034343698204052844075699881, + 263559901760358, + 21888242871839275222246405745257275088548364400416034343698203917224713028600, + 107676876038888, + 21888242871839275222246405745257275088548364400416034343698203920471424196468, + 21888242871839275222246405745257275088548364400416034343698204092145486879022, + 21888242871839275222246405745257275088548364400416034343698203871472106248250, + 21888242871839275222246405745257275088548364400416034343698203824195059841316, + 21888242871839275222246405745257275088548364400416034343698203958834234104058, + 21888242871839275222246405745257275088548364400416034343698203914215390393615, + 21888242871839275222246405745257275088548364400416034343698204165631729399494, + 21888242871839275222246405745257275088548364400416034343698203885951684998049, + 21888242871839275222246405745257275088548364400416034343698204165006005070748, + 543734509137915, + 452095339840474, + 21888242871839275222246405745257275088548364400416034343698204001083513120857, + 223595693264121, + 552519695097589, + 21888242871839275222246405745257275088548364400416034343698203741002065781614, + 21888242871839275222246405745257275088548364400416034343698203825647917103070, + 21888242871839275222246405745257275088548364400416034343698203924091402505248, + 194103807828051, + 122613944575538, + 308069487866053, + 435324697647257, + 21888242871839275222246405745257275088548364400416034343698204054341980747115, + 539175686311342, + 154088173380034, + 161466836896457, + 21888242871839275222246405745257275088548364400416034343698204011893545078306, + 381436103446294, + 21888242871839275222246405745257275088548364400416034343698203955684173923595, + 21888242871839275222246405745257275088548364400416034343698203757855326056260, + 539669447692085, + 21888242871839275222246405745257275088548364400416034343698203965410026188644, + 21888242871839275222246405745257275088548364400416034343698203789660914130703, + 166435882133811, + 254476199098382, + 551284250860827, + 21888242871839275222246405745257275088548364400416034343698204116896449321342, + 21888242871839275222246405745257275088548364400416034343698203972619736364392, + 353448398524287, + 21888242871839275222246405745257275088548364400416034343698204150028681038791, + 21888242871839275222246405745257275088548364400416034343698203954531132434219, + 21888242871839275222246405745257275088548364400416034343698203980378483781436, + 21888242871839275222246405745257275088548364400416034343698204113969577872210, + 83408704008337, + 451971105755307, + 21888242871839275222246405745257275088548364400416034343698203666509546195706, + 484169809817104, + 218195166470301, + 21888242871839275222246405745257275088548364400416034343698203881714951821915, + 138494545841164, + 21888242871839275222246405745257275088548364400416034343698204110836956277144, + 275696292603099, + 21888242871839275222246405745257275088548364400416034343698204080835959377338, + 21888242871839275222246405745257275088548364400416034343698203638965037257614, + 21888242871839275222246405745257275088548364400416034343698204063996550568338, + 21888242871839275222246405745257275088548364400416034343698204010345846761496, + 246747638127442, + 515130568559511, + 549393545998785, + 25224016164257, + 21888242871839275222246405745257275088548364400416034343698204013781915278812, + 96075448914298, + 5124165056650, + 21888242871839275222246405745257275088548364400416034343698203855111640452869, + 21888242871839275222246405745257275088548364400416034343698204061078299873066, + 456600347959101, + 433043246886961, + 147009914622584, + 121978595769419, + 21888242871839275222246405745257275088548364400416034343698203841851246446553, + 21888242871839275222246405745257275088548364400416034343698204152368462083538, + 21888242871839275222246405745257275088548364400416034343698204160588989346546, + 21888242871839275222246405745257275088548364400416034343698203647586411336693, + 194216148410094, + 21888242871839275222246405745257275088548364400416034343698203722521542674797, + 99221724613454, + 249462276769078, + 196971393848476, + 87422812303041, + 154081267666407, + 315327794029265, + 355575322138954, + 21888242871839275222246405745257275088548364400416034343698204150081176159533, + 21888242871839275222246405745257275088548364400416034343698203647815244886788, + 21888242871839275222246405745257275088548364400416034343698203786763672563207, + 146847429192441, + 399038234855469, + 21888242871839275222246405745257275088548364400416034343698204082502169908144, + 173259400021233, + 65074073664965, + 21888242871839275222246405745257275088548364400416034343698203866419881057487, + 301958569928258, + 21888242871839275222246405745257275088548364400416034343698203774595510046304, + 53050850954019, + 223876108466885, + 21888242871839275222246405745257275088548364400416034343698203751158650412326, + 21888242871839275222246405745257275088548364400416034343698204053601856607235, + 21888242871839275222246405745257275088548364400416034343698203817034665983500, + 21888242871839275222246405745257275088548364400416034343698203687023241624791, + 333462170085570, + 21888242871839275222246405745257275088548364400416034343698203738451127821632, + 21888242871839275222246405745257275088548364400416034343698204056284167639754, + 21888242871839275222246405745257275088548364400416034343698204052321230216350, + 526165128307772, + 21888242871839275222246405745257275088548364400416034343698203900535742356247, + 21888242871839275222246405745257275088548364400416034343698204114914237177443, + 21888242871839275222246405745257275088548364400416034343698204148665701070832, + 280326432352505, + 21888242871839275222246405745257275088548364400416034343698203949864780964030, + 546013307213588, + 21888242871839275222246405745257275088548364400416034343698203961779670176632, + 521684671757646, + 21888242871839275222246405745257275088548364400416034343698203982130984866135, + 21888242871839275222246405745257275088548364400416034343698203804532385499958, + 245476385793917, + 21888242871839275222246405745257275088548364400416034343698204165775403525074, + 21888242871839275222246405745257275088548364400416034343698203703352064459682, + 21888242871839275222246405745257275088548364400416034343698203950630315560222, + 21888242871839275222246405745257275088548364400416034343698204017226062458621, + 311219546884329, + 21888242871839275222246405745257275088548364400416034343698203647597015858278, + 47273416987204, + 7854066731298, + 453396360677781, + 21888242871839275222246405745257275088548364400416034343698203986626334244559, + 90762657547862, + 21888242871839275222246405745257275088548364400416034343698203896512398882389, + 534342680581303, + 21888242871839275222246405745257275088548364400416034343698203970134026377900, + 555732048823091, + 21888242871839275222246405745257275088548364400416034343698203872370713263446, + 21888242871839275222246405745257275088548364400416034343698204095404650255390, + 21888242871839275222246405745257275088548364400416034343698203930964536958338, + 21888242871839275222246405745257275088548364400416034343698204057333027870048, + 21888242871839275222246405745257275088548364400416034343698203701992397637149, + 137972726284005, + 164595973841257, + 21888242871839275222246405745257275088548364400416034343698203806554745600875, + 21888242871839275222246405745257275088548364400416034343698203700040628202728, + 21888242871839275222246405745257275088548364400416034343698203932445732777237, + 276355322398537, + 6738223323889, + 21888242871839275222246405745257275088548364400416034343698203824513056702728, + 21888242871839275222246405745257275088548364400416034343698203993117089747296, + 200912880490466, + 21888242871839275222246405745257275088548364400416034343698203756104799875503, + 21888242871839275222246405745257275088548364400416034343698203798716189040731, + 21888242871839275222246405745257275088548364400416034343698203679677755244700, + 145857501340105, + 412945887685505, + 79263823144154, + 21888242871839275222246405745257275088548364400416034343698203978912087994612, + 21888242871839275222246405745257275088548364400416034343698203869019045508184, + 21888242871839275222246405745257275088548364400416034343698203776998330929355, + 21888242871839275222246405745257275088548364400416034343698204051870365712585, + 21888242871839275222246405745257275088548364400416034343698203804416752824761, + 186295050961618, + 487864726693970, + 21888242871839275222246405745257275088548364400416034343698203800009562393223, + 21888242871839275222246405745257275088548364400416034343698203814024092435412, + 64266958289143, + 397527279537224, + 339319260033908, + 21888242871839275222246405745257275088548364400416034343698203636024721162795, + 21888242871839275222246405745257275088548364400416034343698203726252710666314, + 276582379621648, + 101569733961439, + 21888242871839275222246405745257275088548364400416034343698203852108759715627, + 21888242871839275222246405745257275088548364400416034343698203853970499510680, + 552711821049150, + 332949165328335, + 499185790803444, + 195794564590777, + 21888242871839275222246405745257275088548364400416034343698204164506399172309, + 21888242871839275222246405745257275088548364400416034343698203849832354298374, + 190658430813309, + 16406983200193, + 21888242871839275222246405745257275088548364400416034343698204141295932916514, + 21888242871839275222246405745257275088548364400416034343698203696403113761497, + 84941283913870, + 56168094189263, + 21888242871839275222246405745257275088548364400416034343698203708780796187653, + 21888242871839275222246405745257275088548364400416034343698203962238579036602, + 21888242871839275222246405745257275088548364400416034343698203975499128185171, + 21888242871839275222246405745257275088548364400416034343698204015505586799851, + 21888242871839275222246405745257275088548364400416034343698204058591921360790, + 290687822277571, + 507490610686854, + 21888242871839275222246405745257275088548364400416034343698203664830568809011, + 21888242871839275222246405745257275088548364400416034343698203835586391931611, + 316426378407857, + 297007098310186, + 21888242871839275222246405745257275088548364400416034343698203977368293377203, + 98860432752705, + 90193580188568, + 21888242871839275222246405745257275088548364400416034343698203916605845884208, + 60006365207026, + 21888242871839275222246405745257275088548364400416034343698204031140874662778, + 135360720452312, + 68212288006948, + 21888242871839275222246405745257275088548364400416034343698203686310988712286, + 21888242871839275222246405745257275088548364400416034343698203647728347926499, + 21888242871839275222246405745257275088548364400416034343698203758598776341793, + 497532396910539, + 254093203481910, + 21888242871839275222246405745257275088548364400416034343698203786015309159624, + 64647089520038, + 21888242871839275222246405745257275088548364400416034343698204063914069713306, + 21888242871839275222246405745257275088548364400416034343698203693466641002673, + 85078967504050, + 21888242871839275222246405745257275088548364400416034343698203821864765639649, + 21888242871839275222246405745257275088548364400416034343698203861461169611417, + 21888242871839275222246405745257275088548364400416034343698204133125902927643, + 21888242871839275222246405745257275088548364400416034343698203819765289155706, + 335481751855274, + 21888242871839275222246405745257275088548364400416034343698203979041772086647, + 21888242871839275222246405745257275088548364400416034343698203664363409719745, + 467988403218395, + 21888242871839275222246405745257275088548364400416034343698203713653625817512, + 21888242871839275222246405745257275088548364400416034343698203850500732724040, + 476787584785504, + 409874243801446, + 232229966991284, + 21888242871839275222246405745257275088548364400416034343698203650560121478673, + 21888242871839275222246405745257275088548364400416034343698204130222478046935, + 21888242871839275222246405745257275088548364400416034343698204073637934483628, + 331377948748406, + 183176371899632, + 21888242871839275222246405745257275088548364400416034343698203924402192540284, + 21888242871839275222246405745257275088548364400416034343698203866846845525249, + 21888242871839275222246405745257275088548364400416034343698204111138638500264, + 452376144388973, + 389925386745636, + 21888242871839275222246405745257275088548364400416034343698203666429356553069, + 113246502190660, + 21888242871839275222246405745257275088548364400416034343698203658803912655992, + 265591273755934, + 181657738270253, + 499948979541613, + 271476570161198, + 74944437967674, + 21888242871839275222246405745257275088548364400416034343698204176974069563421, + 198956599369023, + 174273814697336, + 493505517380354, + 21888242871839275222246405745257275088548364400416034343698203997758561176795, + 118860854721604, + 21888242871839275222246405745257275088548364400416034343698203913274598426860, + 388228391913604, + 21888242871839275222246405745257275088548364400416034343698203959618984401905, + 21888242871839275222246405745257275088548364400416034343698204136524986686232, + 21888242871839275222246405745257275088548364400416034343698204060045523377331, + 21888242871839275222246405745257275088548364400416034343698203871667924182119, + 23020001804896, + 21888242871839275222246405745257275088548364400416034343698204100153493920385, + 176317065578020, + 284815169514282, + 144611747400964, + 21888242871839275222246405745257275088548364400416034343698203689625301814965, + 349598309188396, + 21888242871839275222246405745257275088548364400416034343698203843906127305979, + 21888242871839275222246405745257275088548364400416034343698203658358467188852, + 224305533561116, + 21888242871839275222246405745257275088548364400416034343698203720996780184371, + 21888242871839275222246405745257275088548364400416034343698204154548845047254, + 369191906190574, + 442973634761366, + 194325008633358, + 21888242871839275222246405745257275088548364400416034343698203835486892734182, + 21888242871839275222246405745257275088548364400416034343698203674685154892795, + 27080882298777, + 336669592680043, + 155162290794319, + 21888242871839275222246405745257275088548364400416034343698203707019278718353, + 454729870522976, + 142207817082897, + 21888242871839275222246405745257275088548364400416034343698203918406037940096, + 136539816443601, + 131435901690013, + 37001067123124, + 21888242871839275222246405745257275088548364400416034343698204052899077446568, + 21888242871839275222246405745257275088548364400416034343698203823436795500157, + 21888242871839275222246405745257275088548364400416034343698204095912073943536, + 21888242871839275222246405745257275088548364400416034343698203698575998500462, + 125546456736192, + 26032234685239, + 142685715004115, + 21888242871839275222246405745257275088548364400416034343698203954340775063232, + 522214043764637, + 21888242871839275222246405745257275088548364400416034343698204161435171762166, + 21888242871839275222246405745257275088548364400416034343698203955924193921962, + 102979074451356, + 206156150894095, + 21888242871839275222246405745257275088548364400416034343698203940076657785987, + 557742006250090, + 479087127916543, + 21888242871839275222246405745257275088548364400416034343698203868842000587995, + 21888242871839275222246405745257275088548364400416034343698203895358836386329, + 21888242871839275222246405745257275088548364400416034343698203967635603969784, + 170405859649895, + 270957320870670, + 281913875227472, + 21888242871839275222246405745257275088548364400416034343698204169058484047578, + 21888242871839275222246405745257275088548364400416034343698203961187489050986, + 21888242871839275222246405745257275088548364400416034343698204058862712261083, + 239090809120300, + 410086970478790, + 21888242871839275222246405745257275088548364400416034343698204012550990294010, + 21888242871839275222246405745257275088548364400416034343698203995856739415565, + 50320809039528, + 21888242871839275222246405745257275088548364400416034343698203767094539769708, + 21888242871839275222246405745257275088548364400416034343698203690082986682379, + 345380104422389, + 302587093601439, + 21888242871839275222246405745257275088548364400416034343698203799122466364041, + 317101024449327, + 21888242871839275222246405745257275088548364400416034343698203911571865347484, + 21888242871839275222246405745257275088548364400416034343698204178866418086408, + 462611018789157, + 440792861475349, + 21888242871839275222246405745257275088548364400416034343698204016482982874665, + 460076064679509, + 21888242871839275222246405745257275088548364400416034343698203680398411520889, + 21888242871839275222246405745257275088548364400416034343698203829745884961203, + 21888242871839275222246405745257275088548364400416034343698203873143060264477, + 116629702622479, + 21888242871839275222246405745257275088548364400416034343698204154359141553556, + 21888242871839275222246405745257275088548364400416034343698203887404261554302, + 139834952808016, + 315029581398114, + 285829482048967, + 21888242871839275222246405745257275088548364400416034343698203722674212466654, + 21888242871839275222246405745257275088548364400416034343698203820668722294598, + 86238322363840, + 21888242871839275222246405745257275088548364400416034343698203820476728482743, + 21888242871839275222246405745257275088548364400416034343698203708044447880193, + 21888242871839275222246405745257275088548364400416034343698203861845360090774, + 529791323568671, + 89418937780243, + 21888242871839275222246405745257275088548364400416034343698203943937253900747, + 68566485006933, + 21888242871839275222246405745257275088548364400416034343698203886227351059641, + 208519860944598, + 21888242871839275222246405745257275088548364400416034343698203917368744232403, + 296253935259382, + 80556040909356, + 21888242871839275222246405745257275088548364400416034343698204139773518406732, + 21888242871839275222246405745257275088548364400416034343698203885624866117636, + 21888242871839275222246405745257275088548364400416034343698203650642919014408, + 21888242871839275222246405745257275088548364400416034343698203947606560625940, + 21888242871839275222246405745257275088548364400416034343698204157116071326133, + 418338030846069, + 505349273627439, + 21888242871839275222246405745257275088548364400416034343698204081441147992049, + 392601206309429, + 21888242871839275222246405745257275088548364400416034343698204034791807912315, + 21888242871839275222246405745257275088548364400416034343698204035893705362740, + 507027916193716, + 21888242871839275222246405745257275088548364400416034343698203845679333858901, + 202174687982234, + 21888242871839275222246405745257275088548364400416034343698204038642915551660, + 123082504942427, + 21888242871839275222246405745257275088548364400416034343698203787489813775809, + 21888242871839275222246405745257275088548364400416034343698203842970675087799, + 378902188658140, + 541513003418781, + 115882373833837, + 21888242871839275222246405745257275088548364400416034343698203831385885135731, + 270095131133600, + 290174353705404, + 21888242871839275222246405745257275088548364400416034343698203923283390584148, + 370694761351377, + 191567407147900, + 139562036927311, + 284288391674370, + 259011566942117, + 128365518425780, + 21888242871839275222246405745257275088548364400416034343698203994827713685353, + 21888242871839275222246405745257275088548364400416034343698204033186154881512, + 21888242871839275222246405745257275088548364400416034343698204042866342781629, + 264011601964214, + 455206092731611, + 21888242871839275222246405745257275088548364400416034343698204050271267487927, + 326546014542755, + 148527296191374, + 21888242871839275222246405745257275088548364400416034343698203668141813729135, + 180168440297069, + 203203591875407, + 21888242871839275222246405745257275088548364400416034343698203813927110277046, + 263494005607296, + 347584401667100, + 21888242871839275222246405745257275088548364400416034343698204165185972701149, + 65407475893718, + 522933903243437, + 216399054084911, + 523393227168479, + 21888242871839275222246405745257275088548364400416034343698204091911853389237, + 274176930694500, + 539881033881521, + 21888242871839275222246405745257275088548364400416034343698203698658218742635, + 21888242871839275222246405745257275088548364400416034343698203811817060323827, + 182633841470629, + 266005620855602, + 21888242871839275222246405745257275088548364400416034343698203693401025441330, + 21888242871839275222246405745257275088548364400416034343698203701483010576320, + 420417815588645, + 21888242871839275222246405745257275088548364400416034343698204057901793478819, + 21888242871839275222246405745257275088548364400416034343698204050236312031066, + 22203696157522, + 21888242871839275222246405745257275088548364400416034343698203817046869474649, + 21888242871839275222246405745257275088548364400416034343698203626397144412036, + 491858197638693, + 510616923987516, + 21888242871839275222246405745257275088548364400416034343698204007151592538489, + 21888242871839275222246405745257275088548364400416034343698203856697586724855, + 21888242871839275222246405745257275088548364400416034343698203789133020140957, + 289069523433403, + 21888242871839275222246405745257275088548364400416034343698203878513954995988, + 21888242871839275222246405745257275088548364400416034343698203811383121533890, + 21888242871839275222246405745257275088548364400416034343698203624622383618631, + 21888242871839275222246405745257275088548364400416034343698203977223287910002, + 21888242871839275222246405745257275088548364400416034343698204123172682806001, + 140031811303580, + 277542707173498, + 147663543636765, + 21888242871839275222246405745257275088548364400416034343698203686271735874204, + 142506402400550, + 39776182020023, + 465743931128790, + 21888242871839275222246405745257275088548364400416034343698204048491655487871, + 21888242871839275222246405745257275088548364400416034343698203862826957938590, + 21888242871839275222246405745257275088548364400416034343698204008339875393071, + 21888242871839275222246405745257275088548364400416034343698203765465039512974, + 431147060545649, + 495758550701589, + 12746684006365, + 21888242871839275222246405745257275088548364400416034343698204141248785996406, + 21888242871839275222246405745257275088548364400416034343698203745970030152239, + 130425000113452, + 21888242871839275222246405745257275088548364400416034343698203720609896605920, + 21888242871839275222246405745257275088548364400416034343698204030935113928039, + 534464463485134, + 21888242871839275222246405745257275088548364400416034343698203723717753663065, + 535740606238590, + 21888242871839275222246405745257275088548364400416034343698203959441381579117, + 21888242871839275222246405745257275088548364400416034343698204180230393644535, + 21888242871839275222246405745257275088548364400416034343698204007455103264252, + 544450247547185, + 552837245891084, + 492749173927360, + 21888242871839275222246405745257275088548364400416034343698203849386257719654, + 513483137985645, + 21888242871839275222246405745257275088548364400416034343698203803731522608408, + 21888242871839275222246405745257275088548364400416034343698203857906991327844, + 21888242871839275222246405745257275088548364400416034343698203806165333405882, + 21888242871839275222246405745257275088548364400416034343698203887474051252661, + 66349822738745, + 328410720248966, + 293179246717078, + 434899936043233, + 21888242871839275222246405745257275088548364400416034343698203708982787196391, + 181126443371185, + 21888242871839275222246405745257275088548364400416034343698204184521025122823, + 21888242871839275222246405745257275088548364400416034343698204082484068245154, + 21888242871839275222246405745257275088548364400416034343698203832970883453617, + 442305479310841, + 21888242871839275222246405745257275088548364400416034343698203844530608327363, + 21888242871839275222246405745257275088548364400416034343698204016408664293948, + 147843977255720, + 387082739327308, + 341113133804955, + 21888242871839275222246405745257275088548364400416034343698203684851838343688, + 21888242871839275222246405745257275088548364400416034343698203767858542394130, + 330672496097768, + 21888242871839275222246405745257275088548364400416034343698203948195335054658, + 21888242871839275222246405745257275088548364400416034343698203761758081973940, + 21888242871839275222246405745257275088548364400416034343698204118828438011659, + 367932315224494, + 21888242871839275222246405745257275088548364400416034343698203741215903633144, + 21888242871839275222246405745257275088548364400416034343698203945679072631854, + 130216616223646, + 488435424515001, + 153209342139163, + 21888242871839275222246405745257275088548364400416034343698203706459380774328, + 21888242871839275222246405745257275088548364400416034343698203932647924065842, + 374343005401714, + 468940099447598, + 21888242871839275222246405745257275088548364400416034343698203880530599714451, + 74271022990523, + 422777644417681, + 103838974303571, + 70668801118210, + 21888242871839275222246405745257275088548364400416034343698203636373048874621, + 200522547187904, + 237295710612519, + 21888242871839275222246405745257275088548364400416034343698204051315374475729, + 21888242871839275222246405745257275088548364400416034343698203834201634764957, + 139268133834797, + 21888242871839275222246405745257275088548364400416034343698204105437056419557, + 21888242871839275222246405745257275088548364400416034343698203915293709261133, + 21888242871839275222246405745257275088548364400416034343698204124094767574972, + 21888242871839275222246405745257275088548364400416034343698203902775816891997, + 200431095066556, + 21888242871839275222246405745257275088548364400416034343698204159183279530207, + 179702437186003, + 158269872831619, + 492020065909307, + 434061384006320, + 224759412442321, + 21888242871839275222246405745257275088548364400416034343698204062382024793262, + 21888242871839275222246405745257275088548364400416034343698203771935580845731, + 230305900142530, + 363796007535339, + 21888242871839275222246405745257275088548364400416034343698203866921994017276, + 222263259183074, + 21888242871839275222246405745257275088548364400416034343698203982554896253099, + 21888242871839275222246405745257275088548364400416034343698203736193144187668, + 395486687935045, + 21888242871839275222246405745257275088548364400416034343698203964894447219642, + 21888242871839275222246405745257275088548364400416034343698203767425017259886, + 21888242871839275222246405745257275088548364400416034343698203624379152557713, + 76173894696699, + 321391732712756, + 21888242871839275222246405745257275088548364400416034343698203991943662974152, + 21888242871839275222246405745257275088548364400416034343698203989593308413140, + 486947910113762, + 26836288723078, + 156067313994921, + 101283591594754, + 21888242871839275222246405745257275088548364400416034343698203927028140145306, + 505548780443118, + 347278369802334, + 556942559563209, + 21888242871839275222246405745257275088548364400416034343698203813918453759322, + 21888242871839275222246405745257275088548364400416034343698204165983431160608, + 131145252010040, + 536276191907795, + 273064627687512, + 475223949285201, + 21888242871839275222246405745257275088548364400416034343698204005812680375061, + 83479058752885, + 337354141823558, + 21888242871839275222246405745257275088548364400416034343698204026680459786843, + 21888242871839275222246405745257275088548364400416034343698203691871986560222, + 197417558299205, + 118356627009520, + 87893033788725, + 21888242871839275222246405745257275088548364400416034343698203785998182652943, + 228836954395487, + 21888242871839275222246405745257275088548364400416034343698203685509465962181, + 356949512527090, + 21888242871839275222246405745257275088548364400416034343698203732645925332569, + 21888242871839275222246405745257275088548364400416034343698203878323054420172, + 21888242871839275222246405745257275088548364400416034343698204134555820498622, + 397394985781990, + 21888242871839275222246405745257275088548364400416034343698203974196123430426, + 329344069315164, + 503227306330667, + 80434141569730, + 21888242871839275222246405745257275088548364400416034343698204087448157499950, + 21888242871839275222246405745257275088548364400416034343698203963229046787524, + 25202259119160, + 166624365448774, + 37584959317549, + 21888242871839275222246405745257275088548364400416034343698203739249794853544, + 303423107341059, + 21888242871839275222246405745257275088548364400416034343698203723285072981481, + 21888242871839275222246405745257275088548364400416034343698203738199359951638, + 21888242871839275222246405745257275088548364400416034343698203662349009526208, + 34617905768730, + 193992691881849, + 21888242871839275222246405745257275088548364400416034343698203957397868365167, + 21888242871839275222246405745257275088548364400416034343698203773131569596031, + 496181443856502, + 186954808169269, + 90240317005245, + 374674495727490, + 156915753970657, + 522156573476428, + 172586640044579, + 21888242871839275222246405745257275088548364400416034343698203938618259393999, + 21888242871839275222246405745257275088548364400416034343698203964535522818291, + 120681156758249, + 24754888656548, + 398916010594493, + 21888242871839275222246405745257275088548364400416034343698203727530875677534, + 519191158468018, + 21888242871839275222246405745257275088548364400416034343698203674067780188054, + 290417998676715, + 548698970270288, + 21888242871839275222246405745257275088548364400416034343698204008292852805678, + 393484904152622, + 21888242871839275222246405745257275088548364400416034343698203665909570196577, + 21888242871839275222246405745257275088548364400416034343698203938160426846631, + 1395280702943, + 21888242871839275222246405745257275088548364400416034343698203975304525413576, + 21888242871839275222246405745257275088548364400416034343698203962277983411528, + 199758437661800, + 21888242871839275222246405745257275088548364400416034343698203808271972591607, + 21888242871839275222246405745257275088548364400416034343698203899573118265736, + 21888242871839275222246405745257275088548364400416034343698204181803451668418, + 50285074086022, + 4707535507737, + 21888242871839275222246405745257275088548364400416034343698203749305075268416, + 519583240883341, + 243225508919773, + 21888242871839275222246405745257275088548364400416034343698203965750736016327, + 240240811183313, + 110569686852411, + 435774339588670, + 54204839927906, + 21888242871839275222246405745257275088548364400416034343698203822540767494456, + 97614036968934, + 256111501163135, + 21888242871839275222246405745257275088548364400416034343698203955292568853071, + 259407975221896, + 21888242871839275222246405745257275088548364400416034343698204123494198265742, + 405306103389138, + 5558764460758, + 423199452035993, + 483136574911664, + 21888242871839275222246405745257275088548364400416034343698204020472189685565, + 21888242871839275222246405745257275088548364400416034343698203984497046629219, + 13262177019577, + 21888242871839275222246405745257275088548364400416034343698204005931847142366, + 46555275589110, + 186727849767363, + 21888242871839275222246405745257275088548364400416034343698203964985107432810, + 152441333821009, + 145335655193910, + 21888242871839275222246405745257275088548364400416034343698203865590021962553, + 227466148780179, + 21888242871839275222246405745257275088548364400416034343698203938437458492553, + 424059611399204, + 21888242871839275222246405745257275088548364400416034343698203645110714269050, + 21888242871839275222246405745257275088548364400416034343698204020134153582034, + 444645471124303, + 79884070146733, + 21888242871839275222246405745257275088548364400416034343698204082377592827663, + 21888242871839275222246405745257275088548364400416034343698203981084475733506, + 21888242871839275222246405745257275088548364400416034343698203962921618390323, + 146906233206348, + 21888242871839275222246405745257275088548364400416034343698203788976449866982, + 464670399887035, + 21888242871839275222246405745257275088548364400416034343698203893638342636416, + 306346990909438, + 225168754488389, + 21888242871839275222246405745257275088548364400416034343698203970087521399767, + 21888242871839275222246405745257275088548364400416034343698204183571498303622, + 251224657275464, + 183300620926731, + 196697224741107, + 39047787635266, + 21888242871839275222246405745257275088548364400416034343698203731937321550256, + 21888242871839275222246405745257275088548364400416034343698203714551333385817, + 102417087004663, + 359321388994264, + 173443908639770, + 21888242871839275222246405745257275088548364400416034343698203864988490912137, + 95169995300979, + 136709428783111, + 21888242871839275222246405745257275088548364400416034343698203813736971138645, + 21888242871839275222246405745257275088548364400416034343698204073334922023375, + 21888242871839275222246405745257275088548364400416034343698203771275175957453, + 21888242871839275222246405745257275088548364400416034343698204026123339416451, + 21888242871839275222246405745257275088548364400416034343698203661651574016239, + 6030035338330, + 21888242871839275222246405745257275088548364400416034343698204138854312081505, + 21888242871839275222246405745257275088548364400416034343698203738072871763529, + 562551327310874, + 548290188131455, + 21888242871839275222246405745257275088548364400416034343698203939070507171660, + 21888242871839275222246405745257275088548364400416034343698204148495865585506, + 331080648702976, + 1860272194464, + 21888242871839275222246405745257275088548364400416034343698203655206414176911, + 339718394779360, + 21888242871839275222246405745257275088548364400416034343698204096314486296900, + 21888242871839275222246405745257275088548364400416034343698203884945379621507, + 21888242871839275222246405745257275088548364400416034343698204156851846261262, + 472648243764446, + 505992556174940, + 21888242871839275222246405745257275088548364400416034343698204102844820099520, + 21888242871839275222246405745257275088548364400416034343698204096280805386245, + 21888242871839275222246405745257275088548364400416034343698203659095956478570, + 21888242871839275222246405745257275088548364400416034343698203708045929386563, + 71518218529705, + 21888242871839275222246405745257275088548364400416034343698203826670369945735, + 247785906991699, + 164786461070058, + 165417863669330, + 83283887353134, + 21888242871839275222246405745257275088548364400416034343698204028688829081060, + 21888242871839275222246405745257275088548364400416034343698203672629473049770, + 345614282378911, + 21888242871839275222246405745257275088548364400416034343698204131727389917733, + 247471056354006, + 21888242871839275222246405745257275088548364400416034343698203907544367461359, + 21888242871839275222246405745257275088548364400416034343698203995973989290204, + 306100146347707, + 21888242871839275222246405745257275088548364400416034343698203835509639403316, + 21888242871839275222246405745257275088548364400416034343698204120176628809337, + 430992745886629, + 213097674894083, + 21888242871839275222246405745257275088548364400416034343698203912918361904261, + 80241327693092, + 546870508654676, + 21888242871839275222246405745257275088548364400416034343698203766062073081457, + 363346225913912, + 21888242871839275222246405745257275088548364400416034343698203833204526422714, + 21888242871839275222246405745257275088548364400416034343698204103103911780705, + 21888242871839275222246405745257275088548364400416034343698203891209268025532, + 21888242871839275222246405745257275088548364400416034343698204040760726452364, + 462689264398142, + 21888242871839275222246405745257275088548364400416034343698203663745023969297, + 21888242871839275222246405745257275088548364400416034343698203640969709019439, + 550665375017101, + 311557656478713, + 21888242871839275222246405745257275088548364400416034343698203793842808740883, + 281511497834316, + 309792660076909, + 21888242871839275222246405745257275088548364400416034343698203748939968002847, + 25824707089733, + 418535766778237, + 21888242871839275222246405745257275088548364400416034343698203725405342403204, + 185261516619268, + 133724880699045, + 21888242871839275222246405745257275088548364400416034343698204156199115507795, + 21888242871839275222246405745257275088548364400416034343698204169741714300473, + 258440628619517, + 282786000078352, + 21888242871839275222246405745257275088548364400416034343698204011002812933908, + 521107145196821, + 14473576165836, + 21888242871839275222246405745257275088548364400416034343698203921483879637190, + 21888242871839275222246405745257275088548364400416034343698203886917912968492, + 134304352685845, + 227588462838346, + 21888242871839275222246405745257275088548364400416034343698203821855172571655, + 503556827132640, + 228373373564371, + 21888242871839275222246405745257275088548364400416034343698204052826486550281, + 21888242871839275222246405745257275088548364400416034343698204065751020427422, + 144382140739271, + 21888242871839275222246405745257275088548364400416034343698203988679060103802, + 404617783892850, + 21888242871839275222246405745257275088548364400416034343698203637394054545557, + 21888242871839275222246405745257275088548364400416034343698203687894848804183, + 21888242871839275222246405745257275088548364400416034343698203781011093483411, + 417998416350286, + 21888242871839275222246405745257275088548364400416034343698203852417985125893, + 187357783165103, + 475286230331314, + 21888242871839275222246405745257275088548364400416034343698204131859911335355, + 507123951035918, + 387652732091182, + 21888242871839275222246405745257275088548364400416034343698204064596077236606, + 163499253308166, + 21888242871839275222246405745257275088548364400416034343698204086036581027006, + 344468192064573, + 21888242871839275222246405745257275088548364400416034343698203943166312325087, + 21888242871839275222246405745257275088548364400416034343698204171167190596992, + 219747867346759, + 21888242871839275222246405745257275088548364400416034343698203929740187197015, + 21888242871839275222246405745257275088548364400416034343698203864688941886072, + 128838936517680, + 443851668210011, + 21888242871839275222246405745257275088548364400416034343698203801897846827304, + 301320078475810, + 21888242871839275222246405745257275088548364400416034343698204095943279062914, + 284598424722834, + 21888242871839275222246405745257275088548364400416034343698204008487918480296, + 505655755788725, + 21888242871839275222246405745257275088548364400416034343698204115883005126552, + 21888242871839275222246405745257275088548364400416034343698204172386963208671, + 21888242871839275222246405745257275088548364400416034343698204010018244626563, + 21888242871839275222246405745257275088548364400416034343698204120487303792325, + 21888242871839275222246405745257275088548364400416034343698204054084382588019, + 371671356516465, + 21888242871839275222246405745257275088548364400416034343698204022510656707250, + 1809194550316, + 21888242871839275222246405745257275088548364400416034343698203990194088741863, + 201842903420581, + 21888242871839275222246405745257275088548364400416034343698203946685742697107, + 21888242871839275222246405745257275088548364400416034343698204004057540033658, + 561993836256450, + 21888242871839275222246405745257275088548364400416034343698203637591161168648, + 21888242871839275222246405745257275088548364400416034343698204129405625520770, + 21888242871839275222246405745257275088548364400416034343698204161976986383979, + 21888242871839275222246405745257275088548364400416034343698203963557430681099, + 21888242871839275222246405745257275088548364400416034343698203893070997551857, + 21888242871839275222246405745257275088548364400416034343698204051899726339472, + 21888242871839275222246405745257275088548364400416034343698204043142865143201, + 21888242871839275222246405745257275088548364400416034343698204066083024416628, + 329883507477409, + 21888242871839275222246405745257275088548364400416034343698203974955850958429, + 352344394508936, + 447612330570337, + 21888242871839275222246405745257275088548364400416034343698203708385466955457, + 125716390176969, + 264649344642369, + 5625942251523, + 21888242871839275222246405745257275088548364400416034343698203968217599655806, + 21888242871839275222246405745257275088548364400416034343698203873186108529444, + 21888242871839275222246405745257275088548364400416034343698203825080416667793, + 140631735518452, + 21888242871839275222246405745257275088548364400416034343698203722532622986151, + 40818397528183, + 537236859525972, + 21888242871839275222246405745257275088548364400416034343698203861887682015985, + 122697916194363, + 271625149374507, + 164913535998844, + 21888242871839275222246405745257275088548364400416034343698203711127391293800, + 21888242871839275222246405745257275088548364400416034343698204111408376325242, + 21888242871839275222246405745257275088548364400416034343698203663757556735520, + 79301603271190, + 21888242871839275222246405745257275088548364400416034343698203932176699442130, + 230663728819752, + 21888242871839275222246405745257275088548364400416034343698203783279691308528, + 21888242871839275222246405745257275088548364400416034343698203910334524732955, + 506547483122477, + 5057812425520, + 21888242871839275222246405745257275088548364400416034343698203883312811227074, + 416201401931114, + 21888242871839275222246405745257275088548364400416034343698204146000870225198, + 21888242871839275222246405745257275088548364400416034343698203677819339144069, + 21888242871839275222246405745257275088548364400416034343698203947703177307351, + 506332115009661, + 21888242871839275222246405745257275088548364400416034343698203670209409960008, + 128545069038302, + 102136865315254, + 307331985141125, + 235509792435294, + 34031574303217, + 21888242871839275222246405745257275088548364400416034343698204131734437071175, + 21888242871839275222246405745257275088548364400416034343698203889464809877389, + 324277927929408, + 69268573466701, + 477688339589596, + 21888242871839275222246405745257275088548364400416034343698204070972577327436, + 21888242871839275222246405745257275088548364400416034343698203636416876489156, + 21888242871839275222246405745257275088548364400416034343698204138687322331463, + 499953568667639, + 21888242871839275222246405745257275088548364400416034343698203813750953194830, + 21888242871839275222246405745257275088548364400416034343698203925927212232728, + 21888242871839275222246405745257275088548364400416034343698203863071402051459, + 21888242871839275222246405745257275088548364400416034343698203854737547960035, + 21888242871839275222246405745257275088548364400416034343698203803390239004459, + 185264992802729, + 21888242871839275222246405745257275088548364400416034343698203895147234005751, + 429339747998039, + 21888242871839275222246405745257275088548364400416034343698204184405929493677, + 219911521423691, + 362528436960640, + 21888242871839275222246405745257275088548364400416034343698203921084398578953, + 309351874321045, + 21888242871839275222246405745257275088548364400416034343698204116950915942128, + 274178670618284, + 21888242871839275222246405745257275088548364400416034343698203676196556833570, + 21888242871839275222246405745257275088548364400416034343698203637202003665381, + 77249342167920, + 21888242871839275222246405745257275088548364400416034343698204100954096499054, + 21888242871839275222246405745257275088548364400416034343698203771356737799696, + 21888242871839275222246405745257275088548364400416034343698203666404867233194, + 545148978196582, + 21888242871839275222246405745257275088548364400416034343698204046977144901348, + 147360064456212, + 21888242871839275222246405745257275088548364400416034343698203758609344995845, + 316096796770418, + 54454904140738, + 21888242871839275222246405745257275088548364400416034343698203877701724251350, + 517874911575014, + 21888242871839275222246405745257275088548364400416034343698203820794710157263, + 526918984414286, + 431486372850201, + 21888242871839275222246405745257275088548364400416034343698204121976927969928, + 417928929860985, + 462611408812203, + 430235263384710, + 21888242871839275222246405745257275088548364400416034343698204050449725777479, + 547133011426033, + 435591039995172, + 473990285857532, + 21888242871839275222246405745257275088548364400416034343698203812625625053463, + 21888242871839275222246405745257275088548364400416034343698203958361883548111, + 420233496187768, + 224819606494646, + 21888242871839275222246405745257275088548364400416034343698203951142017186789, + 21888242871839275222246405745257275088548364400416034343698203689973121489055, + 21888242871839275222246405745257275088548364400416034343698203721320283351171, + 135611049850268, + 539248564813559, + 21888242871839275222246405745257275088548364400416034343698203929875593728869, + 21888242871839275222246405745257275088548364400416034343698203641639681628044, + 289028933646736, + 535710388990791, + 21888242871839275222246405745257275088548364400416034343698203800081752935252, + 28753243651302, + 242097185103603, + 434670929094994, + 21888242871839275222246405745257275088548364400416034343698203965541233196118, + 21888242871839275222246405745257275088548364400416034343698203874473587621507, + 499570495304117, + 21888242871839275222246405745257275088548364400416034343698203919319304457604, + 345447316879006, + 21888242871839275222246405745257275088548364400416034343698203960596233485465, + 21888242871839275222246405745257275088548364400416034343698203707739327240372, + 23724199507903, + 497975541544311, + 192287793658971, + 192517925546515, + 199715083500996, + 449142498666557, + 21888242871839275222246405745257275088548364400416034343698203837738062663556, + 21888242871839275222246405745257275088548364400416034343698203694177121573709, + 271658902018710, + 528907249931390, + 21888242871839275222246405745257275088548364400416034343698204024904915748921, + 21888242871839275222246405745257275088548364400416034343698203858015873391235, + 21888242871839275222246405745257275088548364400416034343698203978256650097989, + 21888242871839275222246405745257275088548364400416034343698203810671309629444, + 69993669357094, + 389088047453632, + 21888242871839275222246405745257275088548364400416034343698203997754030422005, + 199524981672455, + 21888242871839275222246405745257275088548364400416034343698203740309532712196, + 47767634864180, + 21888242871839275222246405745257275088548364400416034343698203973497194923927, + 5502694052891, + 21888242871839275222246405745257275088548364400416034343698203664844241554838, + 21888242871839275222246405745257275088548364400416034343698204022127546307132, + 246549205838639, + 375247903930644, + 387340272828621, + 413593234428079, + 21888242871839275222246405745257275088548364400416034343698203624314868781319, + 21888242871839275222246405745257275088548364400416034343698203796353278158018, + 279381428256156, + 168343882399569, + 488313079017247, + 333249431510815, + 21888242871839275222246405745257275088548364400416034343698203756405387013316, + 21888242871839275222246405745257275088548364400416034343698203915309629454685, + 21888242871839275222246405745257275088548364400416034343698203978712439324839, + 1934435340749, + 21888242871839275222246405745257275088548364400416034343698204083188196317853, + 21888242871839275222246405745257275088548364400416034343698204068899760320318, + 21888242871839275222246405745257275088548364400416034343698203713242579631434, + 96720678424751, + 26180210699344, + 519021222040099, + 21888242871839275222246405745257275088548364400416034343698203863415297343757, + 21888242871839275222246405745257275088548364400416034343698203690140145190964, + 21888242871839275222246405745257275088548364400416034343698203862686603726528, + 39949624892553, + 8663581354449, + 21888242871839275222246405745257275088548364400416034343698203959962199486238, + 21888242871839275222246405745257275088548364400416034343698203653237199782242, + 21888242871839275222246405745257275088548364400416034343698204156338629597116, + 21888242871839275222246405745257275088548364400416034343698203732607575442476, + 21888242871839275222246405745257275088548364400416034343698203750855537108448, + 21888242871839275222246405745257275088548364400416034343698203904892293529538, + 212636380529567, + 213304448704346, + 21888242871839275222246405745257275088548364400416034343698203700425955279130, + 510127480416008, + 268053597357111, + 196533568350274, + 318798294182549, + 21888242871839275222246405745257275088548364400416034343698203786020310707737, + 243256418478414, + 432317219343124, + 484492134965624, + 21888242871839275222246405745257275088548364400416034343698203823382435620594, + 21888242871839275222246405745257275088548364400416034343698203932114186632281, + 21888242871839275222246405745257275088548364400416034343698203919745891856658, + 21888242871839275222246405745257275088548364400416034343698203792883898808275, + 112010242151269, + 155483171968437, + 121033222869397, + 337089517681839, + 258355647876511, + 21888242871839275222246405745257275088548364400416034343698203863255970992732, + 21888242871839275222246405745257275088548364400416034343698203994211503116550, + 21888242871839275222246405745257275088548364400416034343698203676516180175604, + 21888242871839275222246405745257275088548364400416034343698204092477628596529, + 83579987303916, + 21888242871839275222246405745257275088548364400416034343698204008817929943855, + 48730529273069, + 371137653026381, + 21888242871839275222246405745257275088548364400416034343698204146743376176399, + 21888242871839275222246405745257275088548364400416034343698203897581705961466, + 174269616036056, + 21888242871839275222246405745257275088548364400416034343698203772440147557116, + 21888242871839275222246405745257275088548364400416034343698204092206574963715, + 492595067587944, + 112170021557486, + 73922539551780, + 536116570213956, + 193558072494133, + 277501709537762, + 21888242871839275222246405745257275088548364400416034343698204097990599986297, + 21888242871839275222246405745257275088548364400416034343698204070027942486941, + 64152449664773, + 21888242871839275222246405745257275088548364400416034343698203769987365776913, + 21888242871839275222246405745257275088548364400416034343698204179405730801200, + 21888242871839275222246405745257275088548364400416034343698204063203504102404, + 21888242871839275222246405745257275088548364400416034343698204085837332445175, + 255939187840290, + 104594028274012, + 263717329707944, + 123400368255390, + 21888242871839275222246405745257275088548364400416034343698204058544829491271, + 509503908756256, + 85120659502910, + 510236625738485, + 459046559472761, + 13165011707654, + 21888242871839275222246405745257275088548364400416034343698204084047726444753, + 226459540282689, + 21888242871839275222246405745257275088548364400416034343698203888722271701039, + 431614179502967, + 75267294509742, + 21888242871839275222246405745257275088548364400416034343698204011713372024798, + 288319536243197, + 21888242871839275222246405745257275088548364400416034343698203996199135753809, + 21888242871839275222246405745257275088548364400416034343698203997009632766255, + 224046453718710, + 21888242871839275222246405745257275088548364400416034343698204110507820358018, + 21888242871839275222246405745257275088548364400416034343698204162761126644503, + 170361230068994, + 21888242871839275222246405745257275088548364400416034343698204022086638951442, + 110299970715390, + 21888242871839275222246405745257275088548364400416034343698203967206399252308, + 21888242871839275222246405745257275088548364400416034343698203812980411941435, + 21888242871839275222246405745257275088548364400416034343698204157769346789241, + 90534634073243, + 21888242871839275222246405745257275088548364400416034343698203984586290204878, + 225669017891200, + 24059911845727, + 371482615390864, + 21888242871839275222246405745257275088548364400416034343698203952472997698595, + 21888242871839275222246405745257275088548364400416034343698203653259737762976, + 234137216373730, + 266872967351716, + 168664857848173, + 145625881592984, + 21888242871839275222246405745257275088548364400416034343698203698718372570034, + 393618959075332, + 21888242871839275222246405745257275088548364400416034343698203927954013084897, + 21888242871839275222246405745257275088548364400416034343698203763122236290996, + 531591710172543, + 303566499212030, + 320494911583585, + 322542331682327, + 21888242871839275222246405745257275088548364400416034343698203802134797454047, + 21888242871839275222246405745257275088548364400416034343698203927621559465672, + 21888242871839275222246405745257275088548364400416034343698203971058801124273, + 271149174043714, + 21888242871839275222246405745257275088548364400416034343698203961044043533636, + 21888242871839275222246405745257275088548364400416034343698203712882226399205, + 349147248581399, + 20310136476799, + 562895341193782, + 21888242871839275222246405745257275088548364400416034343698204131257612609427, + 306615709363525, + 21888242871839275222246405745257275088548364400416034343698203830517272046351, + 403358652657532, + 21888242871839275222246405745257275088548364400416034343698203986715355991059, + 21888242871839275222246405745257275088548364400416034343698203791899733680620, + 156149938751890, + 21888242871839275222246405745257275088548364400416034343698203703974069634101, + 21888242871839275222246405745257275088548364400416034343698203793415363790074, + 21888242871839275222246405745257275088548364400416034343698203804453351566820, + 307088479898336, + 21888242871839275222246405745257275088548364400416034343698204069820976554724, + 21888242871839275222246405745257275088548364400416034343698204149901429172646, + 20057275022532, + 382001792806864, + 204399182214367, + 21888242871839275222246405745257275088548364400416034343698203999675574067219, + 21888242871839275222246405745257275088548364400416034343698203967939995287949, + 520372812774918, + 325491387550666, + 21888242871839275222246405745257275088548364400416034343698203887729887785802, + 21888242871839275222246405745257275088548364400416034343698204162669426469198, + 199784617085144, + 518510361438604, + 3868567830420, + 21888242871839275222246405745257275088548364400416034343698203823369659356437, + 21888242871839275222246405745257275088548364400416034343698204170568232010894, + 162099948455267, + 211435949579614, + 17420936442263, + 15705900630236, + 21888242871839275222246405745257275088548364400416034343698203931975545076000, + 21888242871839275222246405745257275088548364400416034343698203765262442735529, + 21888242871839275222246405745257275088548364400416034343698204186196861131083, + 243340241834124, + 55652927908163, + 21888242871839275222246405745257275088548364400416034343698203934014831851310, + 21888242871839275222246405745257275088548364400416034343698203682731646538572, + 21888242871839275222246405745257275088548364400416034343698204165074623454668, + 21888242871839275222246405745257275088548364400416034343698203866818154269199, + 121570413161378, + 21888242871839275222246405745257275088548364400416034343698204086064754780753, + 21888242871839275222246405745257275088548364400416034343698204119167016877967, + 419307762655987, + 349790466547850, + 478972856630709, + 76667248274033, + 379121591663012, + 982518474216, + 296778675749053, + 317090436891998, + 21888242871839275222246405745257275088548364400416034343698204043091345395245, + 21888242871839275222246405745257275088548364400416034343698203977469346540898, + 21888242871839275222246405745257275088548364400416034343698203765839596019972, + 21888242871839275222246405745257275088548364400416034343698204148730961552318, + 22774131025415, + 36602050264324, + 21888242871839275222246405745257275088548364400416034343698203968310022697421, + 41120265653008, + 21888242871839275222246405745257275088548364400416034343698203795116827527442, + 87264500620623, + 279585764639222, + 21888242871839275222246405745257275088548364400416034343698203804481878383889, + 21888242871839275222246405745257275088548364400416034343698204093212568459623, + 102749626485534, + 460384840895923, + 532176775060679, + 21888242871839275222246405745257275088548364400416034343698204118893597803880, + 525816689665573, + 21888242871839275222246405745257275088548364400416034343698204107485942830351, + 353268260917284, + 168662378265367, + 479719130960270, + 21888242871839275222246405745257275088548364400416034343698204010628901889895, + 545349645813843, + 21888242871839275222246405745257275088548364400416034343698203926379347790492, + 549115357252940, + 21888242871839275222246405745257275088548364400416034343698203763296264580917, + 21888242871839275222246405745257275088548364400416034343698203694270062543603, + 62332809362279, + 121694791050220, + 21888242871839275222246405745257275088548364400416034343698203665064659352397, + 273836971637959, + 133123691482319, + 21888242871839275222246405745257275088548364400416034343698203935448013796825, + 229287913774906, + 335517311641392, + 21888242871839275222246405745257275088548364400416034343698203868792984061956, + 230718731867752, + 21888242871839275222246405745257275088548364400416034343698203914391500453605, + 467819608121542, + 21888242871839275222246405745257275088548364400416034343698203768033663528292, + 21888242871839275222246405745257275088548364400416034343698204116842578782112, + 311618917718779, + 21888242871839275222246405745257275088548364400416034343698203955772929664244, + 21888242871839275222246405745257275088548364400416034343698203660549385878806, + 21888242871839275222246405745257275088548364400416034343698203741635458903485, + 174509071239717, + 21888242871839275222246405745257275088548364400416034343698204055915752326866, + 21888242871839275222246405745257275088548364400416034343698204156514569027073, + 21888242871839275222246405745257275088548364400416034343698203990192619071630, + 21888242871839275222246405745257275088548364400416034343698203673681477853390, + 21888242871839275222246405745257275088548364400416034343698203944978583377684, + 21888242871839275222246405745257275088548364400416034343698204117872938109922, + 444705829881741, + 21888242871839275222246405745257275088548364400416034343698204068566189223841, + 21888242871839275222246405745257275088548364400416034343698203738651253365887, + 715187944123, + 474264227438040, + 548816767365883, + 21888242871839275222246405745257275088548364400416034343698203773376633732950, + 380800635886801, + 356793241483348, + 21888242871839275222246405745257275088548364400416034343698203919480469219454, + 279599464631567, + 21888242871839275222246405745257275088548364400416034343698204103593625439171, + 10021060020370, + 394676841369873, + 21888242871839275222246405745257275088548364400416034343698204131138510631839, + 393936091231357, + 370068065891750, + 16716383609021, + 21888242871839275222246405745257275088548364400416034343698203910504707731816, + 21888242871839275222246405745257275088548364400416034343698204098701366180929, + 286189747939987, + 122962278408099, + 21888242871839275222246405745257275088548364400416034343698203796970083543448, + 21888242871839275222246405745257275088548364400416034343698203637922000419949, + 21888242871839275222246405745257275088548364400416034343698203895945102907594, + 210444450226108, + 14453916696616, + 21888242871839275222246405745257275088548364400416034343698203627276311744043, + 21888242871839275222246405745257275088548364400416034343698204057243874562982, + 514450889319172, + 521719209942566, + 314043196259160, + 230438779637795, + 21888242871839275222246405745257275088548364400416034343698203685659416599198, + 21888242871839275222246405745257275088548364400416034343698203828403559611641, + 21888242871839275222246405745257275088548364400416034343698203856781776387076, + 499848142200492, + 137914707508036, + 21888242871839275222246405745257275088548364400416034343698203813595628646426, + 1542005256384, + 21888242871839275222246405745257275088548364400416034343698203870895909805761, + 522761125901512, + 213069455341013, + 21888242871839275222246405745257275088548364400416034343698203641325578601425, + 317911871156864, + 21888242871839275222246405745257275088548364400416034343698203759494404964843, + 21888242871839275222246405745257275088548364400416034343698204115464269246984, + 135833160214526, + 526423853872309, + 375094116097059, + 371114551402002, + 21888242871839275222246405745257275088548364400416034343698203762307775765887, + 451959827630135, + 21888242871839275222246405745257275088548364400416034343698203708433161626565, + 520662645724103, + 192216384664644, + 21888242871839275222246405745257275088548364400416034343698203772557892238600, + 21888242871839275222246405745257275088548364400416034343698203872224499614629, + 21888242871839275222246405745257275088548364400416034343698204053259147972669, + 230428844259751, + 146583421718208, + 247972659406813, + 177674469511753, + 440002705857484, + 21888242871839275222246405745257275088548364400416034343698204163121644400638, + 63822148938992, + 294363737508565, + 241950862736000, + 245524640126462, + 21888242871839275222246405745257275088548364400416034343698204138754761018870, + 552692396965011, + 21888242871839275222246405745257275088548364400416034343698204010258199746046, + 21888242871839275222246405745257275088548364400416034343698204130126431665922, + 21888242871839275222246405745257275088548364400416034343698203872917343847265, + 232984372680265, + 427353039105205, + 247494832548270, + 21888242871839275222246405745257275088548364400416034343698204135939570496026, + 555380040968664, + 437225115129776, + 21888242871839275222246405745257275088548364400416034343698203904446294372332, + 21888242871839275222246405745257275088548364400416034343698204147271644528528, + 21888242871839275222246405745257275088548364400416034343698203935290717345609, + 130336144649846, + 203414495952318, + 21888242871839275222246405745257275088548364400416034343698204076837247641175, + 21888242871839275222246405745257275088548364400416034343698203949018878491468, + 21888242871839275222246405745257275088548364400416034343698204147833098303792, + 74004409384892, + 562212176885695, + 326936068098128, + 32742367884240, + 21888242871839275222246405745257275088548364400416034343698203724622715339131, + 471984362624572, + 54310966106536, + 420466635793799, + 21888242871839275222246405745257275088548364400416034343698203891238472675967, + 21888242871839275222246405745257275088548364400416034343698204011625224707394, + 271325352100810, + 157926316237993, + 97924922902149, + 507258691827818, + 213405025404053, + 21888242871839275222246405745257275088548364400416034343698203754977724896863, + 21888242871839275222246405745257275088548364400416034343698204092316688500546, + 75836491863052, + 21888242871839275222246405745257275088548364400416034343698203682330581853742, + 21888242871839275222246405745257275088548364400416034343698203708197754390751, + 350877898113170, + 138330056370876, + 21888242871839275222246405745257275088548364400416034343698204037873329147288, + 21888242871839275222246405745257275088548364400416034343698203820789964587763, + 190967715108716, + 372787022683814, + 82665530879177, + 21888242871839275222246405745257275088548364400416034343698203789238570495833, + 441671960461673, + 550104684722877, + 29044464864169, + 21888242871839275222246405745257275088548364400416034343698204046143700882077, + 193143633154503, + 497867014577894, + 480111497426429, + 21888242871839275222246405745257275088548364400416034343698204067411067869948, + 385414092186191, + 21888242871839275222246405745257275088548364400416034343698204026274740877113, + 21888242871839275222246405745257275088548364400416034343698203780516565016075, + 21888242871839275222246405745257275088548364400416034343698204126410965725918, + 21888242871839275222246405745257275088548364400416034343698203973656777600814, + 21888242871839275222246405745257275088548364400416034343698203649352071099162, + 21888242871839275222246405745257275088548364400416034343698203867104803684096, + 21888242871839275222246405745257275088548364400416034343698203726072704547133, + 81135210974623, + 21888242871839275222246405745257275088548364400416034343698203685460963648584, + 75168604764885, + 21888242871839275222246405745257275088548364400416034343698203881413922261507, + 143498949404460, + 265167793444793, + 21888242871839275222246405745257275088548364400416034343698203656084552773554, + 510355526077292, + 157599804764046, + 21888242871839275222246405745257275088548364400416034343698204006340283244655, + 21888242871839275222246405745257275088548364400416034343698204089248234903441, + 173284964934591, + 220530971243745, + 304398900597315, + 538361694562373, + 21888242871839275222246405745257275088548364400416034343698203699388747635962, + 21888242871839275222246405745257275088548364400416034343698203643642802705913, + 440508747612917, + 84323093350822, + 185862869038967, + 522094140969693, + 554845657378627, + 21888242871839275222246405745257275088548364400416034343698204147796109168174, + 7316032963702, + 237148245488606, + 21888242871839275222246405745257275088548364400416034343698203841766434506826, + 183364040248973, + 36636268637936, + 21888242871839275222246405745257275088548364400416034343698203813010231489082, + 441324695265411, + 21888242871839275222246405745257275088548364400416034343698203970587770196002, + 21888242871839275222246405745257275088548364400416034343698203908028805601907, + 21888242871839275222246405745257275088548364400416034343698203817771489802269, + 303774936932038, + 21888242871839275222246405745257275088548364400416034343698203800495412824843, + 464108376855696, + 548861569622436, + 21888242871839275222246405745257275088548364400416034343698203630455567637682, + 21888242871839275222246405745257275088548364400416034343698203624944529128261, + 21888242871839275222246405745257275088548364400416034343698203862910184862941, + 501395972736540, + 21888242871839275222246405745257275088548364400416034343698204132554213214566, + 374088506542386, + 234997703914666, + 21888242871839275222246405745257275088548364400416034343698203849718132813822, + 21888242871839275222246405745257275088548364400416034343698203763229939170385, + 21888242871839275222246405745257275088548364400416034343698203704447238116927, + 547669112047031, + 246901714504585, + 142046219853358, + 427425975261700, + 386770191589584, + 21888242871839275222246405745257275088548364400416034343698203784494476677668, + 21888242871839275222246405745257275088548364400416034343698203783659609977826, + 489498475200202, + 21888242871839275222246405745257275088548364400416034343698204144569795009122, + 21888242871839275222246405745257275088548364400416034343698203803635112433658, + 21888242871839275222246405745257275088548364400416034343698203705599234272635, + 21888242871839275222246405745257275088548364400416034343698203689103532800185, + 391349322838076, + 21888242871839275222246405745257275088548364400416034343698204091359708765707, + 71657887542189, + 81025674604022, + 21888242871839275222246405745257275088548364400416034343698204036054918438543, + 24202392992712, + 21888242871839275222246405745257275088548364400416034343698203670233214742196, + 21888242871839275222246405745257275088548364400416034343698203938598331451357, + 449886078656785, + 270510819480550, + 21888242871839275222246405745257275088548364400416034343698203919917361852854, + 467457367503491, + 21888242871839275222246405745257275088548364400416034343698203635621205219659, + 449552874269756, + 21888242871839275222246405745257275088548364400416034343698204181681997337312, + 21888242871839275222246405745257275088548364400416034343698204158767677030404, + 21888242871839275222246405745257275088548364400416034343698204080738489374368, + 21888242871839275222246405745257275088548364400416034343698204134297517281381, + 61174992052666, + 21888242871839275222246405745257275088548364400416034343698204174784568441506, + 21888242871839275222246405745257275088548364400416034343698204118552154622812, + 282670560295996, + 21888242871839275222246405745257275088548364400416034343698203897673789863333, + 21888242871839275222246405745257275088548364400416034343698203736390901541481, + 203406767018837, + 21888242871839275222246405745257275088548364400416034343698204153054490864167, + 21888242871839275222246405745257275088548364400416034343698204048877948728175, + 396610921158846, + 21888242871839275222246405745257275088548364400416034343698204102938713758246, + 21888242871839275222246405745257275088548364400416034343698203663388259906956, + 21888242871839275222246405745257275088548364400416034343698204129147368478095, + 21888242871839275222246405745257275088548364400416034343698204102644505566247, + 140541074070339, + 526429080407069, + 21888242871839275222246405745257275088548364400416034343698203810532502062451, + 21888242871839275222246405745257275088548364400416034343698203644012051745847, + 21888242871839275222246405745257275088548364400416034343698204055785058296380, + 21888242871839275222246405745257275088548364400416034343698203893491770590816, + 21888242871839275222246405745257275088548364400416034343698203978851372020608, + 416503080481323, + 442254646261150, + 21888242871839275222246405745257275088548364400416034343698204104939821108169, + 440931801011072, + 21888242871839275222246405745257275088548364400416034343698203965644303642254, + 21888242871839275222246405745257275088548364400416034343698203836568160070237, + 21888242871839275222246405745257275088548364400416034343698203764903105680983, + 21888242871839275222246405745257275088548364400416034343698203872852094309256, + 436042417789313, + 21888242871839275222246405745257275088548364400416034343698203717578232713497, + 66280742156603, + 21888242871839275222246405745257275088548364400416034343698204175621751345918, + 21888242871839275222246405745257275088548364400416034343698203897524693423541, + 21888242871839275222246405745257275088548364400416034343698203844130242858227, + 217070935520688, + 21888242871839275222246405745257275088548364400416034343698204177856166070657, + 21888242871839275222246405745257275088548364400416034343698204180665149721997, + 387354936469284, + 36720414291210, + 21888242871839275222246405745257275088548364400416034343698203879911953722523, + 559916570220013, + 286100858532145, + 21888242871839275222246405745257275088548364400416034343698203747471236383477, + 21888242871839275222246405745257275088548364400416034343698203893215973311044, + 257353259407414, + 328300422493477, + 216190745271526, + 21888242871839275222246405745257275088548364400416034343698203859291842079288, + 21888242871839275222246405745257275088548364400416034343698204108109862896715, + 21888242871839275222246405745257275088548364400416034343698204159502439714351, + 21888242871839275222246405745257275088548364400416034343698203651764752648338, + 21888242871839275222246405745257275088548364400416034343698203937371109725381, + 21888242871839275222246405745257275088548364400416034343698203741392162737929, + 21888242871839275222246405745257275088548364400416034343698203999523247358874, + 146396901807938, + 482647074741954, + 249902246680359, + 196659352908864, + 21888242871839275222246405745257275088548364400416034343698203987238209955728, + 241992933660681, + 457734404750159, + 21888242871839275222246405745257275088548364400416034343698204074370953012642, + 44562688318717, + 21888242871839275222246405745257275088548364400416034343698204141375245096457, + 21888242871839275222246405745257275088548364400416034343698204179566241698001, + 74249934244721, + 47996897424434, + 278087966026512, + 181748707348996, + 21888242871839275222246405745257275088548364400416034343698204021780890655121, + 184503605372767, + 331658307953313, + 21888242871839275222246405745257275088548364400416034343698204098811916436145, + 21888242871839275222246405745257275088548364400416034343698204117863823701166, + 187590659192408, + 423130243800029, + 21888242871839275222246405745257275088548364400416034343698203927071580569034, + 21888242871839275222246405745257275088548364400416034343698204165238923208431, + 286473478660559, + 239914027806086, + 21888242871839275222246405745257275088548364400416034343698203884732334346968, + 21888242871839275222246405745257275088548364400416034343698203786755364725606, + 560564304815107, + 561048254543357, + 21888242871839275222246405745257275088548364400416034343698204129753509572798, + 355139222659098, + 21888242871839275222246405745257275088548364400416034343698203648502780841671, + 21888242871839275222246405745257275088548364400416034343698204035700609763121, + 21888242871839275222246405745257275088548364400416034343698204163227126240423, + 21888242871839275222246405745257275088548364400416034343698203774574632390911, + 21888242871839275222246405745257275088548364400416034343698203707064371032763, + 75555192366, + 247322880309194, + 12565178995579, + 21888242871839275222246405745257275088548364400416034343698203660591764464431, + 21888242871839275222246405745257275088548364400416034343698203628045163954021, + 527762859660000, + 21888242871839275222246405745257275088548364400416034343698203685509285491195, + 415562031094954, + 213656771738241, + 21888242871839275222246405745257275088548364400416034343698203823614512947330, + 21888242871839275222246405745257275088548364400416034343698203730878772730492, + 87505272170937, + 21888242871839275222246405745257275088548364400416034343698203722799937146202, + 32894475609450, + 21888242871839275222246405745257275088548364400416034343698203999101897809179, + 21888242871839275222246405745257275088548364400416034343698204174692001682848, + 21888242871839275222246405745257275088548364400416034343698203788857301694219, + 21888242871839275222246405745257275088548364400416034343698203781970253993642, + 191732778063829, + 21888242871839275222246405745257275088548364400416034343698204134648273952055, + 179295785872044, + 21888242871839275222246405745257275088548364400416034343698203755401764596172, + 160111880301787, + 8188844948673, + 21888242871839275222246405745257275088548364400416034343698203981976300518703, + 248627465314101, + 83976537655679, + 267761661162195, + 21888242871839275222246405745257275088548364400416034343698203829831887579622, + 21888242871839275222246405745257275088548364400416034343698204180240973671002, + 183650438988691, + 21888242871839275222246405745257275088548364400416034343698203827761295570134, + 245007366324546, + 21888242871839275222246405745257275088548364400416034343698204034952409997179, + 21888242871839275222246405745257275088548364400416034343698204035560084110015, + 21888242871839275222246405745257275088548364400416034343698203629889874422224, + 385755370954685, + 21888242871839275222246405745257275088548364400416034343698204157096164221500, + 21888242871839275222246405745257275088548364400416034343698203986743915019798, + 21888242871839275222246405745257275088548364400416034343698204036988502545756, + 21888242871839275222246405745257275088548364400416034343698204059946527422088, + 423715012747793, + 423106703229091, + 215721717372946, + 21888242871839275222246405745257275088548364400416034343698203853253548731863, + 21888242871839275222246405745257275088548364400416034343698203812441957385767, + 472022465427647, + 21888242871839275222246405745257275088548364400416034343698203790200178766770, + 21888242871839275222246405745257275088548364400416034343698204064666884760202, + 154938610915883, + 399096930740654, + 21888242871839275222246405745257275088548364400416034343698203731402430715601, + 21888242871839275222246405745257275088548364400416034343698204102876100858645, + 21888242871839275222246405745257275088548364400416034343698203992785758822912, + 21888242871839275222246405745257275088548364400416034343698204118749939036438, + 119226155694698, + 21888242871839275222246405745257275088548364400416034343698203801702107078925, + 21888242871839275222246405745257275088548364400416034343698204102728071662095, + 21888242871839275222246405745257275088548364400416034343698203836247316344229, + 497682364594011, + 58703036110669, + 21888242871839275222246405745257275088548364400416034343698203677352633769437, + 21888242871839275222246405745257275088548364400416034343698203820690283971981, + 21888242871839275222246405745257275088548364400416034343698204156712904219791, + 32768821479065, + 397254608371235, + 21888242871839275222246405745257275088548364400416034343698203696588563000235, + 21888242871839275222246405745257275088548364400416034343698203945153430060643, + 74014521976679, + 193619501682044, + 21888242871839275222246405745257275088548364400416034343698204157421432008756, + 21888242871839275222246405745257275088548364400416034343698204052958913847330, + 523694070739988, + 21888242871839275222246405745257275088548364400416034343698204091630674680273, + 21888242871839275222246405745257275088548364400416034343698203978903266848953, + 21888242871839275222246405745257275088548364400416034343698204108317373964807, + 122321489003234, + 21888242871839275222246405745257275088548364400416034343698203839048968120543, + 337530844072573, + 409365986430323, + 21888242871839275222246405745257275088548364400416034343698204152714693604631, + 436561705134810, + 384166147819020, + 79706102083924, + 521773627413802, + 21888242871839275222246405745257275088548364400416034343698204130116948515326, + 21888242871839275222246405745257275088548364400416034343698203790673891458824, + 281184489652573, + 560477492499442, + 21888242871839275222246405745257275088548364400416034343698204105842432583434, + 144732226307142, + 21888242871839275222246405745257275088548364400416034343698203933922354643436, + 21888242871839275222246405745257275088548364400416034343698203851260802468243, + 341556220004953, + 249046610972756, + 195380636559787, + 21888242871839275222246405745257275088548364400416034343698203903749469769635, + 462940350006845, + 482025558470391, + 21888242871839275222246405745257275088548364400416034343698203966708103606088, + 347932237906851, + 118695605997551, + 21888242871839275222246405745257275088548364400416034343698203964636989099790, + 319551318320300, + 21888242871839275222246405745257275088548364400416034343698203766809907565198, + 21888242871839275222246405745257275088548364400416034343698203838914443379843, + 21888242871839275222246405745257275088548364400416034343698204106983363901174, + 529598475390328, + 21888242871839275222246405745257275088548364400416034343698203838179249453464, + 21888242871839275222246405745257275088548364400416034343698204145949949420670, + 302413014195554, + 21888242871839275222246405745257275088548364400416034343698204066701529102489, + 108762335337630, + 255969186121816, + 21888242871839275222246405745257275088548364400416034343698203745537450351062, + 429902267249912, + 21888242871839275222246405745257275088548364400416034343698203747606066310086, + 262398212952864, + 378345103251880, + 21888242871839275222246405745257275088548364400416034343698203817678343138379, + 348067572174163, + 21888242871839275222246405745257275088548364400416034343698204006656809010144, + 21888242871839275222246405745257275088548364400416034343698203918557079489629, + 313884799547321, + 227135178184006, + 21888242871839275222246405745257275088548364400416034343698203856014123590630, + 21888242871839275222246405745257275088548364400416034343698203749257876291785, + 383213015344764, + 53739314133564, + 142843940381270, + 536705506433738, + 110951343848037, + 219369016624810, + 21888242871839275222246405745257275088548364400416034343698203849149960668150, + 21888242871839275222246405745257275088548364400416034343698203869499966397037, + 316624012195762, + 480594299796448, + 21888242871839275222246405745257275088548364400416034343698203852905070687646, + 21888242871839275222246405745257275088548364400416034343698203834699699675198, + 46428842938587, + 55554854373756, + 21888242871839275222246405745257275088548364400416034343698203986367748307018, + 457552055457968, + 494271435062929, + 164022848120618, + 21888242871839275222246405745257275088548364400416034343698204017868762649529, + 444549476642768, + 347217085724495, + 174522251917273, + 104725472992860, + 21888242871839275222246405745257275088548364400416034343698203691343227779052, + 141890070523312, + 21888242871839275222246405745257275088548364400416034343698203893181364928028, + 517207934202783, + 200885663675200, + 433154627815083, + 21888242871839275222246405745257275088548364400416034343698203749470046498984, + 21888242871839275222246405745257275088548364400416034343698203963965624236299, + 21888242871839275222246405745257275088548364400416034343698204012492168599532, + 21888242871839275222246405745257275088548364400416034343698203713738762902156, + 496676318955193, + 559003384848481, + 21888242871839275222246405745257275088548364400416034343698203842861001589386, + 307096773474556, + 21888242871839275222246405745257275088548364400416034343698204036639634723390, + 21888242871839275222246405745257275088548364400416034343698204134670266907964, + 21888242871839275222246405745257275088548364400416034343698203626695989558351, + 21888242871839275222246405745257275088548364400416034343698203763003378759656, + 546359300628693, + 98132252182724, + 21888242871839275222246405745257275088548364400416034343698203768455675005528, + 59236822847985, + 46423044258461, + 21888242871839275222246405745257275088548364400416034343698204101884209391058, + 32120206293107, + 492578352720101, + 267183440094769, + 332164877806986, + 21888242871839275222246405745257275088548364400416034343698204140156946618413, + 378407495082211, + 295853994656918, + 21888242871839275222246405745257275088548364400416034343698203764663997811920, + 21888242871839275222246405745257275088548364400416034343698203799421456448284, + 231091416760281, + 21888242871839275222246405745257275088548364400416034343698204145174741289352, + 21888242871839275222246405745257275088548364400416034343698203909837968979773, + 21888242871839275222246405745257275088548364400416034343698203857585508996428, + 21888242871839275222246405745257275088548364400416034343698203955372305600721, + 21888242871839275222246405745257275088548364400416034343698203790457280640249, + 429253493217737, + 333736989554712, + 344686134369577, + 21888242871839275222246405745257275088548364400416034343698203672212475670773, + 21888242871839275222246405745257275088548364400416034343698204103524591923520, + 21888242871839275222246405745257275088548364400416034343698204169551610624054, + 21888242871839275222246405745257275088548364400416034343698204116232769404311, + 21888242871839275222246405745257275088548364400416034343698203727704567430660, + 21888242871839275222246405745257275088548364400416034343698203889802666969880, + 21888242871839275222246405745257275088548364400416034343698204113518453316578, + 21888242871839275222246405745257275088548364400416034343698204004078919949184, + 143182551099653, + 21888242871839275222246405745257275088548364400416034343698204071558527650640, + 21888242871839275222246405745257275088548364400416034343698203966014240516595, + 175159850392572, + 21888242871839275222246405745257275088548364400416034343698204186553193609691, + 21888242871839275222246405745257275088548364400416034343698203809967030603983, + 221945654331907, + 21888242871839275222246405745257275088548364400416034343698203739834318038756, + 21888242871839275222246405745257275088548364400416034343698204083299803144480, + 263853834860454, + 43069701873727, + 21888242871839275222246405745257275088548364400416034343698203688383370813247, + 455325236584735, + 489978927077022, + 118163888390375, + 140923948861599, + 21888242871839275222246405745257275088548364400416034343698203640859132668715, + 32428568983868, + 21888242871839275222246405745257275088548364400416034343698204085943867098618, + 198670770341587, + 21888242871839275222246405745257275088548364400416034343698203830183948218600, + 21888242871839275222246405745257275088548364400416034343698203929398768845513, + 21888242871839275222246405745257275088548364400416034343698203947215824149921, + 21888242871839275222246405745257275088548364400416034343698204065208997034548, + 324239261283102, + 106025134420912, + 30655872007052, + 58184928806183, + 218997848773144, + 230677092771930, + 481556170191579, + 402474822626789, + 497410790457666, + 119347210320450, + 21888242871839275222246405745257275088548364400416034343698203841092090933037, + 21888242871839275222246405745257275088548364400416034343698204081249791933681, + 21888242871839275222246405745257275088548364400416034343698204024945014598225, + 21888242871839275222246405745257275088548364400416034343698204061766767502057, + 216357031751578, + 21888242871839275222246405745257275088548364400416034343698203659978452158261, + 546018302126253, + 21888242871839275222246405745257275088548364400416034343698203757813957524973, + 21888242871839275222246405745257275088548364400416034343698203646470344851623, + 46465370464350, + 321444409133796, + 77947309169022, + 21888242871839275222246405745257275088548364400416034343698204169226287252219, + 178627496383163, + 21888242871839275222246405745257275088548364400416034343698203760945446488033, + 470572238501852, + 21888242871839275222246405745257275088548364400416034343698203891701130976417, + 21888242871839275222246405745257275088548364400416034343698204057326129712761, + 21888242871839275222246405745257275088548364400416034343698204131303828408252, + 21888242871839275222246405745257275088548364400416034343698203743878168595799, + 36860088965761, + 402099683821239, + 21888242871839275222246405745257275088548364400416034343698204139809794870113, + 301304324893719, + 338329363092116, + 402277523677175, + 501180868003960, + 190354210915091, + 335036299722671, + 2107522496177, + 298120892082185, + 21888242871839275222246405745257275088548364400416034343698203899725702228348, + 21888242871839275222246405745257275088548364400416034343698203672969367488473, + 231652039527115, + 152527961990833, + 27193784511417, + 21888242871839275222246405745257275088548364400416034343698203820369481420188, + 21888242871839275222246405745257275088548364400416034343698203957255254611343, + 138786090050044, + 21888242871839275222246405745257275088548364400416034343698204120492280921486, + 491488819132104, + 21888242871839275222246405745257275088548364400416034343698203890695199808546, + 21888242871839275222246405745257275088548364400416034343698204016437741832088, + 478515955734124, + 442340512526820, + 21888242871839275222246405745257275088548364400416034343698203932834022921288, + 21888242871839275222246405745257275088548364400416034343698203923772595036966, + 337181991388261, + 560096851151315, + 182436522118747, + 252244168255167, + 21888242871839275222246405745257275088548364400416034343698204043194235566841, + 21888242871839275222246405745257275088548364400416034343698203758224901423629, + 21888242871839275222246405745257275088548364400416034343698203996406714462791, + 481130204027882, + 21888242871839275222246405745257275088548364400416034343698203960781873233805, + 21888242871839275222246405745257275088548364400416034343698204152618133191655, + 21888242871839275222246405745257275088548364400416034343698204009565808690067, + 21888242871839275222246405745257275088548364400416034343698203919489959290339, + 146097735245455, + 21888242871839275222246405745257275088548364400416034343698203696902886483235, + 434095124911588, + 21888242871839275222246405745257275088548364400416034343698204036197040504175, + 21888242871839275222246405745257275088548364400416034343698203759942132352499, + 21888242871839275222246405745257275088548364400416034343698203921098543702005, + 21888242871839275222246405745257275088548364400416034343698204008847059695432, + 21888242871839275222246405745257275088548364400416034343698203631724605040589, + 21888242871839275222246405745257275088548364400416034343698203884339026957692, + 21888242871839275222246405745257275088548364400416034343698204071951188849776, + 424573446366687, + 21888242871839275222246405745257275088548364400416034343698203653905532835349, + 21888242871839275222246405745257275088548364400416034343698204110808536178822, + 169085391685711, + 290933101649075, + 408447380592086, + 21888242871839275222246405745257275088548364400416034343698204020451548914427, + 21888242871839275222246405745257275088548364400416034343698204120728593960576, + 231824134023529, + 21888242871839275222246405745257275088548364400416034343698203720597086603120, + 21888242871839275222246405745257275088548364400416034343698203977993589468601, + 514750907299786, + 21888242871839275222246405745257275088548364400416034343698203927129443483001, + 21888242871839275222246405745257275088548364400416034343698203813436461890195, + 21888242871839275222246405745257275088548364400416034343698203996826922665264, + 21888242871839275222246405745257275088548364400416034343698203880455623936726, + 21888242871839275222246405745257275088548364400416034343698203919566237569756, + 21888242871839275222246405745257275088548364400416034343698203651833087690411, + 45928365714132, + 461107765831436, + 21888242871839275222246405745257275088548364400416034343698204070070769953666, + 21888242871839275222246405745257275088548364400416034343698204146628553753293, + 21888242871839275222246405745257275088548364400416034343698203789383814028393, + 21888242871839275222246405745257275088548364400416034343698203934019600830581, + 291402873401069, + 483337880879752, + 21888242871839275222246405745257275088548364400416034343698204046928036309742, + 237910725333216, + 21888242871839275222246405745257275088548364400416034343698203628610312601197, + 21888242871839275222246405745257275088548364400416034343698203893144353495396, + 21888242871839275222246405745257275088548364400416034343698203958150961185105, + 21888242871839275222246405745257275088548364400416034343698203909013099292178, + 508839908240247, + 21888242871839275222246405745257275088548364400416034343698203658793728929759, + 21888242871839275222246405745257275088548364400416034343698203800803339303124, + 21888242871839275222246405745257275088548364400416034343698203666122068080138, + 21888242871839275222246405745257275088548364400416034343698204133417688326627, + 21888242871839275222246405745257275088548364400416034343698204160613587029697, + 21888242871839275222246405745257275088548364400416034343698204005339047406943, + 21888242871839275222246405745257275088548364400416034343698203945631757358413, + 459146166298500, + 524325369559412, + 504248831700007, + 21888242871839275222246405745257275088548364400416034343698203819799711159170, + 21888242871839275222246405745257275088548364400416034343698203738641572415339, + 15433052264545, + 179613950729018, + 21888242871839275222246405745257275088548364400416034343698203997898677186694, + 128935080719527, + 3014591771911, + 21888242871839275222246405745257275088548364400416034343698203739684000243017, + 383027299959596, + 21888242871839275222246405745257275088548364400416034343698204140915056697629, + 21888242871839275222246405745257275088548364400416034343698203681308006681893, + 21888242871839275222246405745257275088548364400416034343698203985889234070789, + 21888242871839275222246405745257275088548364400416034343698203792330923759811, + 21888242871839275222246405745257275088548364400416034343698204063786309586786, + 21888242871839275222246405745257275088548364400416034343698203943921006523276, + 21888242871839275222246405745257275088548364400416034343698204056223602269285, + 21888242871839275222246405745257275088548364400416034343698203952902166778799, + 498077893944898, + 21888242871839275222246405745257275088548364400416034343698203850580327378223, + 368162992650789, + 391270270972022, + 21888242871839275222246405745257275088548364400416034343698203896737008161656, + 21888242871839275222246405745257275088548364400416034343698203746874394924676, + 21888242871839275222246405745257275088548364400416034343698204037527558228012, + 219138987958989, + 326438327018325, + 116003377422483, + 21888242871839275222246405745257275088548364400416034343698203658428431997418, + 21888242871839275222246405745257275088548364400416034343698203981331365675567, + 21888242871839275222246405745257275088548364400416034343698204173176573088626, + 83784012181523, + 72830844479648, + 313363182189862, + 21888242871839275222246405745257275088548364400416034343698203636690203011345, + 57107623646298, + 32464994558021, + 88801615283520, + 33699624502694, + 21888242871839275222246405745257275088548364400416034343698203991465441911392, + 21888242871839275222246405745257275088548364400416034343698203686002764441519, + 21888242871839275222246405745257275088548364400416034343698204090676887192208, + 216691248959966, + 128233641154889, + 333572119592704, + 21888242871839275222246405745257275088548364400416034343698203874343744578506, + 21888242871839275222246405745257275088548364400416034343698203859173805243018, + 455895074169687, + 21888242871839275222246405745257275088548364400416034343698204040546646115697, + 21888242871839275222246405745257275088548364400416034343698203924055410012405, + 21888242871839275222246405745257275088548364400416034343698203682350691759531, + 163261131552179, + 370131252369388, + 21888242871839275222246405745257275088548364400416034343698203713051980566761, + 21888242871839275222246405745257275088548364400416034343698203919390633422522, + 21888242871839275222246405745257275088548364400416034343698203958134161104948, + 152745969200267, + 21888242871839275222246405745257275088548364400416034343698203791082691544996, + 75140371274869, + 21888242871839275222246405745257275088548364400416034343698203775653001189834, + 66913634319098, + 21888242871839275222246405745257275088548364400416034343698203784060638545320, + 364210000697253, + 21888242871839275222246405745257275088548364400416034343698204038712724610761, + 21888242871839275222246405745257275088548364400416034343698203748935428606001, + 311939116415119, + 469787527277942, + 308118405025957, + 21888242871839275222246405745257275088548364400416034343698204168809643551245, + 21888242871839275222246405745257275088548364400416034343698203759444312391169, + 21888242871839275222246405745257275088548364400416034343698203985300896780374, + 21888242871839275222246405745257275088548364400416034343698203804110916400004, + 65303389769141, + 21888242871839275222246405745257275088548364400416034343698203965773432428172, + 221990384246482, + 21888242871839275222246405745257275088548364400416034343698203811245721856086, + 519679695620104, + 535109091978515, + 31100552574371, + 291960260660051, + 21888242871839275222246405745257275088548364400416034343698203745627524091914, + 21888242871839275222246405745257275088548364400416034343698204109709695292104, + 136474806495401, + 21888242871839275222246405745257275088548364400416034343698204184829718856152, + 21888242871839275222246405745257275088548364400416034343698203743847248149738, + 21888242871839275222246405745257275088548364400416034343698203987362119871729, + 21888242871839275222246405745257275088548364400416034343698203878260558164630, + 21888242871839275222246405745257275088548364400416034343698204177271279890252, + 21888242871839275222246405745257275088548364400416034343698204062428603967848, + 21888242871839275222246405745257275088548364400416034343698203767539584499956, + 214435801887416, + 138945354013914, + 247030531690376, + 289980262038888, + 21888242871839275222246405745257275088548364400416034343698204097310662887650, + 202513218745723, + 202536038377045, + 38894727000636, + 478487999992052, + 21888242871839275222246405745257275088548364400416034343698203758983443348270, + 45956684641426, + 404536804798312, + 406965387139964, + 21888242871839275222246405745257275088548364400416034343698203971053746763892, + 410710095410012, + 78362507959001, + 366429541665710, + 21888242871839275222246405745257275088548364400416034343698203731128058712368, + 21888242871839275222246405745257275088548364400416034343698203827598259800735, + 397255218244423, + 21888242871839275222246405745257275088548364400416034343698204172222709619752, + 21888242871839275222246405745257275088548364400416034343698203677685926608755, + 21888242871839275222246405745257275088548364400416034343698203637876063256710, + 378389041778672, + 84525089845651, + 21888242871839275222246405745257275088548364400416034343698203737573072777630, + 101944840248349, + 21888242871839275222246405745257275088548364400416034343698204185424213181142, + 21888242871839275222246405745257275088548364400416034343698203774877935323202, + 372486081570018, + 147587685019971, + 21888242871839275222246405745257275088548364400416034343698203634914026919078, + 21888242871839275222246405745257275088548364400416034343698203869578466946318, + 21888242871839275222246405745257275088548364400416034343698203885530827262943, + 95867938917690, + 432466046759491, + 87451668565393, + 359017718650086, + 196175136287099, + 21888242871839275222246405745257275088548364400416034343698204133475554651472, + 21888242871839275222246405745257275088548364400416034343698203944452352567142, + 21888242871839275222246405745257275088548364400416034343698204052322254828622, + 21888242871839275222246405745257275088548364400416034343698204152185029073027, + 21888242871839275222246405745257275088548364400416034343698204171391951212800, + 8783902698533, + 69312907828330, + 245987858345017, + 245457814420586, + 21888242871839275222246405745257275088548364400416034343698203944470232939534, + 430422322925599, + 21888242871839275222246405745257275088548364400416034343698203752571840579743, + 21888242871839275222246405745257275088548364400416034343698204140178017041911, + 226566514348571, + 21888242871839275222246405745257275088548364400416034343698204137504058819350, + 21888242871839275222246405745257275088548364400416034343698204112189826380722, + 279852114573051, + 112935362028026, + 489543964420490, + 505656085368426, + 21888242871839275222246405745257275088548364400416034343698204045156297686120, + 429161212924311, + 482990216269882, + 512490497781498, + 314042506080179, + 21888242871839275222246405745257275088548364400416034343698204166628262263744, + 21888242871839275222246405745257275088548364400416034343698204026806433377290, + 21888242871839275222246405745257275088548364400416034343698203974001669084642, + 367902830045300, + 365318041868512, + 21888242871839275222246405745257275088548364400416034343698203629782379617750, + 264466288776997, + 226474598613742, + 21888242871839275222246405745257275088548364400416034343698203992482701483074, + 21888242871839275222246405745257275088548364400416034343698204154316775572517, + 21888242871839275222246405745257275088548364400416034343698204159814377970352, + 21888242871839275222246405745257275088548364400416034343698204134298887982461, + 55376571131838, + 21888242871839275222246405745257275088548364400416034343698204167235152424074, + 21888242871839275222246405745257275088548364400416034343698203860559084569168, + 21888242871839275222246405745257275088548364400416034343698204042165549180390, + 21888242871839275222246405745257275088548364400416034343698204023972856111896, + 167613948827631, + 21888242871839275222246405745257275088548364400416034343698204044778398047604, + 21888242871839275222246405745257275088548364400416034343698204102440645545698, + 316801932249808, + 271842771479647, + 21888242871839275222246405745257275088548364400416034343698204053613841349251, + 21888242871839275222246405745257275088548364400416034343698204080912279102510, + 439035701907854, + 21888242871839275222246405745257275088548364400416034343698203910724623781267, + 23374629711514, + 21888242871839275222246405745257275088548364400416034343698203870118335878263, + 313121403922659, + 479649784117099, + 21888242871839275222246405745257275088548364400416034343698203676809198581218, + 21888242871839275222246405745257275088548364400416034343698203714167991480024, + 73535204877949, + 21888242871839275222246405745257275088548364400416034343698203681798403244767, + 82541836715296, + 84270178271986, + 21888242871839275222246405745257275088548364400416034343698203952889447158682, + 21888242871839275222246405745257275088548364400416034343698203956789784252036, + 201577774331788, + 311305996985122, + 309827782599069, + 147972940392191, + 140985576434963, + 449484772261925, + 47247516116629, + 21888242871839275222246405745257275088548364400416034343698203667529702817639, + 502606569868566, + 459398463061434, + 26479897819976, + 405726772007808, + 21888242871839275222246405745257275088548364400416034343698204157475358710104, + 21888242871839275222246405745257275088548364400416034343698203690794230083503, + 21888242871839275222246405745257275088548364400416034343698203936639440126386, + 21888242871839275222246405745257275088548364400416034343698204163263755946791, + 21888242871839275222246405745257275088548364400416034343698204152379381274718, + 21888242871839275222246405745257275088548364400416034343698203732281940122561, + 56650361736176, + 202293913723779, + 21888242871839275222246405745257275088548364400416034343698203960444657171535, + 344639445064232, + 21888242871839275222246405745257275088548364400416034343698203661747426733880, + 38950376803399, + 21888242871839275222246405745257275088548364400416034343698204067622513706264, + 21888242871839275222246405745257275088548364400416034343698204139710701620134, + 21888242871839275222246405745257275088548364400416034343698203995689486111545, + 21888242871839275222246405745257275088548364400416034343698203896931177440993, + 241781296145134, + 21888242871839275222246405745257275088548364400416034343698203938416036963849, + 21888242871839275222246405745257275088548364400416034343698203989723270670910, + 124254657738468, + 230301708285771, + 21888242871839275222246405745257275088548364400416034343698203993218732315283, + 300576535404042, + 21888242871839275222246405745257275088548364400416034343698203731391291396924, + 271746225391263, + 21888242871839275222246405745257275088548364400416034343698203935773882348543, + 21888242871839275222246405745257275088548364400416034343698203758420105684481, + 21888242871839275222246405745257275088548364400416034343698203767975978540630, + 21888242871839275222246405745257275088548364400416034343698203672646128954349, + 498863109937190, + 467152244472496, + 43697162373009, + 21888242871839275222246405745257275088548364400416034343698203961776063603464, + 446529763840250, + 374479288226158, + 60915777159173, + 21888242871839275222246405745257275088548364400416034343698204068867386445258, + 21888242871839275222246405745257275088548364400416034343698203706240564335818, + 21888242871839275222246405745257275088548364400416034343698204058975984399108, + 21888242871839275222246405745257275088548364400416034343698203937713449806940, + 21888242871839275222246405745257275088548364400416034343698203773066796589957, + 21888242871839275222246405745257275088548364400416034343698204107074130744769, + 87254716176243, + 21888242871839275222246405745257275088548364400416034343698204179989255680942, + 35087086057286, + 21888242871839275222246405745257275088548364400416034343698203976523258505208, + 159754944841466, + 126017393655791, + 236109651032676, + 21888242871839275222246405745257275088548364400416034343698203629353476027382, + 21888242871839275222246405745257275088548364400416034343698203798866365223082, + 21888242871839275222246405745257275088548364400416034343698203806145266801382, + 371918105388544, + 21888242871839275222246405745257275088548364400416034343698203657474572008016, + 53932491470682, + 374568177062928, + 21888242871839275222246405745257275088548364400416034343698203682280025698592, + 114883830831403, + 21888242871839275222246405745257275088548364400416034343698204121407140994578, + 39642482459904, + 95278962117151, + 21888242871839275222246405745257275088548364400416034343698203660217501175544, + 21888242871839275222246405745257275088548364400416034343698203967694332380557, + 21888242871839275222246405745257275088548364400416034343698204117141349542679, + 21888242871839275222246405745257275088548364400416034343698204139360317272825, + 21888242871839275222246405745257275088548364400416034343698204070683416191482, + 176010917561995, + 21888242871839275222246405745257275088548364400416034343698204183108180621770, + 23458511579887, + 21888242871839275222246405745257275088548364400416034343698204178583211534421, + 21888242871839275222246405745257275088548364400416034343698203967884961083485, + 295509268060115, + 15204378301026, + 21888242871839275222246405745257275088548364400416034343698203788120814448129, + 21888242871839275222246405745257275088548364400416034343698203839133050755176, + 21888242871839275222246405745257275088548364400416034343698203651419461119084, + 202417651467375, + 21888242871839275222246405745257275088548364400416034343698203943754790490895, + 21888242871839275222246405745257275088548364400416034343698204092795802146302, + 21888242871839275222246405745257275088548364400416034343698203626938743901556, + 256808492778563, + 21888242871839275222246405745257275088548364400416034343698203698197268853950, + 21888242871839275222246405745257275088548364400416034343698203658283403814774, + 220516827712711, + 21888242871839275222246405745257275088548364400416034343698203944219447942946, + 21888242871839275222246405745257275088548364400416034343698203871062687081261, + 84389473205177, + 21888242871839275222246405745257275088548364400416034343698203958194404380451, + 21888242871839275222246405745257275088548364400416034343698203798551050799254, + 257069990744641, + 21888242871839275222246405745257275088548364400416034343698204069536206711420, + 21888242871839275222246405745257275088548364400416034343698203962840258708843, + 21888242871839275222246405745257275088548364400416034343698204150351904079678, + 351713968052012, + 251621908682281, + 427206125244234, + 349560283801819, + 372372928360998, + 21888242871839275222246405745257275088548364400416034343698203996238923693846, + 21888242871839275222246405745257275088548364400416034343698203974262865758658, + 21888242871839275222246405745257275088548364400416034343698203751403823488126, + 479326026148984, + 21888242871839275222246405745257275088548364400416034343698203934058228542015, + 21888242871839275222246405745257275088548364400416034343698203753693032898681, + 21888242871839275222246405745257275088548364400416034343698203824124073409473, + 16827917014945, + 554660500569902, + 543327942141636, + 21888242871839275222246405745257275088548364400416034343698203918541678848308, + 479587025507425, + 498868825063907, + 376329646000352, + 21888242871839275222246405745257275088548364400416034343698204041117397421614, + 21888242871839275222246405745257275088548364400416034343698203662429086430491, + 112420472799209, + 285837525496621, + 21888242871839275222246405745257275088548364400416034343698203941929988384292, + 21888242871839275222246405745257275088548364400416034343698203962153593357181, + 199288396072486, + 288718612063002, + 21888242871839275222246405745257275088548364400416034343698203925988652968172, + 21888242871839275222246405745257275088548364400416034343698203634154778236491, + 83039519571017, + 69298554263121, + 559464410244695, + 293383585622634, + 467625739114082, + 21888242871839275222246405745257275088548364400416034343698203957513052216286, + 22517630803155, + 111297977532715, + 21888242871839275222246405745257275088548364400416034343698203678607718025967, + 525647386391694, + 21888242871839275222246405745257275088548364400416034343698203958898492540812, + 201628393946334, + 284744181131987, + 21888242871839275222246405745257275088548364400416034343698203843375128621776, + 21888242871839275222246405745257275088548364400416034343698204038141336336050, + 344039898266810, + 21888242871839275222246405745257275088548364400416034343698204135220581172392, + 21888242871839275222246405745257275088548364400416034343698204099575424581866, + 21888242871839275222246405745257275088548364400416034343698204036805009843008, + 21888242871839275222246405745257275088548364400416034343698203650033538741298, + 359382440429255, + 290078251510510, + 151165970721136, + 402801931727914, + 239468971508597, + 271373377904150, + 261747477997475, + 21888242871839275222246405745257275088548364400416034343698204138909770750027, + 21888242871839275222246405745257275088548364400416034343698203951770802187261, + 21888242871839275222246405745257275088548364400416034343698204093232290684677, + 26574270540178, + 21888242871839275222246405745257275088548364400416034343698203898448141809812, + 21888242871839275222246405745257275088548364400416034343698204123844834642150, + 21888242871839275222246405745257275088548364400416034343698203934147669294487, + 21888242871839275222246405745257275088548364400416034343698203670867672954988, + 21888242871839275222246405745257275088548364400416034343698204061394887066688, + 124949024706776, + 21888242871839275222246405745257275088548364400416034343698204177653203152822, + 21888242871839275222246405745257275088548364400416034343698203651373242115010, + 224403492787245, + 557766193215153, + 21888242871839275222246405745257275088548364400416034343698203623731591206939, + 21888242871839275222246405745257275088548364400416034343698203908413753442218, + 21888242871839275222246405745257275088548364400416034343698203705020627937793, + 21888242871839275222246405745257275088548364400416034343698204063185323865842, + 153496455880750, + 21888242871839275222246405745257275088548364400416034343698203640828453587230, + 21888242871839275222246405745257275088548364400416034343698204168062783456746, + 340241200584797, + 131633002276688, + 21888242871839275222246405745257275088548364400416034343698203690660441077548, + 49201842311527, + 21888242871839275222246405745257275088548364400416034343698203954987904667621, + 21888242871839275222246405745257275088548364400416034343698204147961509189542, + 539614578162821, + 483147828888565, + 21888242871839275222246405745257275088548364400416034343698204061318276774991, + 21888242871839275222246405745257275088548364400416034343698203808855758674698, + 356993752844027, + 194531742724111, + 21888242871839275222246405745257275088548364400416034343698204066235039703665, + 21888242871839275222246405745257275088548364400416034343698204094663689298920, + 21888242871839275222246405745257275088548364400416034343698203628515820807386, + 21888242871839275222246405745257275088548364400416034343698203801053162487073, + 21888242871839275222246405745257275088548364400416034343698204084803312811337, + 21888242871839275222246405745257275088548364400416034343698203794143939022654, + 336608636717007, + 21888242871839275222246405745257275088548364400416034343698204186565124106119, + 21888242871839275222246405745257275088548364400416034343698204154146401689874, + 21888242871839275222246405745257275088548364400416034343698204180507059172300, + 425549919209961, + 115636220266284, + 303996748576947, + 21888242871839275222246405745257275088548364400416034343698203946347352574072, + 160168165658920, + 96825669542855, + 269830840671115, + 254494730148191, + 89330283715073, + 294303702916595, + 90916985091452, + 21888242871839275222246405745257275088548364400416034343698204015747121498797, + 524598401852178, + 409021095938199, + 214427898890906, + 21888242871839275222246405745257275088548364400416034343698203829615975230589, + 21888242871839275222246405745257275088548364400416034343698203772963635213079, + 29049661581021, + 525175357866220, + 21888242871839275222246405745257275088548364400416034343698203956546872290208, + 21888242871839275222246405745257275088548364400416034343698203700078703674596, + 21888242871839275222246405745257275088548364400416034343698203668117887602136, + 21888242871839275222246405745257275088548364400416034343698204123314277691374, + 536536982868358, + 411202221533350, + 21888242871839275222246405745257275088548364400416034343698204158850228230196, + 517127494941205, + 21888242871839275222246405745257275088548364400416034343698204072438220491821, + 190140016243233, + 192697841497764, + 21888242871839275222246405745257275088548364400416034343698204079673241660306, + 480956304350077, + 21888242871839275222246405745257275088548364400416034343698203646105050775133, + 232974006932716, + 431022176981955, + 21888242871839275222246405745257275088548364400416034343698204121297387221826, + 344203908650058, + 448291872416368, + 198693372496612, + 21888242871839275222246405745257275088548364400416034343698203796905043924404, + 21888242871839275222246405745257275088548364400416034343698203907220456906758, + 444684314061399, + 21888242871839275222246405745257275088548364400416034343698204132065518360001, + 21888242871839275222246405745257275088548364400416034343698203832972509944813, + 123820393003973, + 21888242871839275222246405745257275088548364400416034343698203887044837843408, + 194189699745159, + 138058880433300, + 210641607635468, + 21888242871839275222246405745257275088548364400416034343698204040068169104573, + 451353597915410, + 26370044425461, + 131693636910974, + 400565010050716, + 135868785832311, + 21888242871839275222246405745257275088548364400416034343698203936322134130348, + 466803656126685, + 379240379891692, + 21888242871839275222246405745257275088548364400416034343698204080672953315756, + 21888242871839275222246405745257275088548364400416034343698203809230554343625, + 21888242871839275222246405745257275088548364400416034343698204082744529828582, + 21888242871839275222246405745257275088548364400416034343698204181605378056540, + 21888242871839275222246405745257275088548364400416034343698204165309313905724, + 21888242871839275222246405745257275088548364400416034343698203872113289392634, + 551573654306305, + 21888242871839275222246405745257275088548364400416034343698204056674799507732, + 21888242871839275222246405745257275088548364400416034343698203660523821339484, + 21888242871839275222246405745257275088548364400416034343698203843603263720778, + 21888242871839275222246405745257275088548364400416034343698203960681960123475, + 21888242871839275222246405745257275088548364400416034343698203725687056448907, + 21888242871839275222246405745257275088548364400416034343698203712084730430797, + 501699681552552, + 30992445698765, + 537071776597836, + 21888242871839275222246405745257275088548364400416034343698203872939260175771, + 117286669980770, + 21888242871839275222246405745257275088548364400416034343698204051714383944529, + 21888242871839275222246405745257275088548364400416034343698203950140402579692, + 21888242871839275222246405745257275088548364400416034343698203692880214062849, + 21888242871839275222246405745257275088548364400416034343698203903077592500763, + 21888242871839275222246405745257275088548364400416034343698204135504795768975, + 21888242871839275222246405745257275088548364400416034343698203802676618410434, + 31388981786897, + 231501679791614, + 120426039095929, + 21888242871839275222246405745257275088548364400416034343698204182649185730502, + 21888242871839275222246405745257275088548364400416034343698203973305048458728, + 520692530713436, + 270735377384281, + 21888242871839275222246405745257275088548364400416034343698203772279747241265, + 122589377491050, + 539098727540690, + 360098307266429, + 465198830267694, + 21888242871839275222246405745257275088548364400416034343698204005068190689246, + 400455465933365, + 21888242871839275222246405745257275088548364400416034343698203893889342637214, + 228013837281885, + 21888242871839275222246405745257275088548364400416034343698203809100691233956, + 233350106595098, + 21888242871839275222246405745257275088548364400416034343698203756710788816237, + 290268235578863, + 315128584197701, + 382692583549367, + 21888242871839275222246405745257275088548364400416034343698203813221797419275, + 261040148266093, + 21888242871839275222246405745257275088548364400416034343698204072305974925151, + 33552239814623, + 21888242871839275222246405745257275088548364400416034343698204055628006390931, + 341076255208988, + 172951913681018, + 21888242871839275222246405745257275088548364400416034343698203688556509433935, + 21888242871839275222246405745257275088548364400416034343698203684704093937185, + 353248513079919, + 21888242871839275222246405745257275088548364400416034343698203712225780359367, + 21888242871839275222246405745257275088548364400416034343698203859973017528308, + 505167231984241, + 21888242871839275222246405745257275088548364400416034343698203636958731043225, + 549912625414169, + 553634711805406, + 534963432506759, + 21888242871839275222246405745257275088548364400416034343698203706597049084861, + 78180965293806, + 21888242871839275222246405745257275088548364400416034343698203834198951992222, + 21888242871839275222246405745257275088548364400416034343698203866797504332233, + 311851525111095, + 21888242871839275222246405745257275088548364400416034343698204036957465000052, + 562371903947457, + 174939322623376, + 21888242871839275222246405745257275088548364400416034343698203899666861394601, + 17644707325657, + 315565768575588, + 490839519058873, + 380449423365203, + 21888242871839275222246405745257275088548364400416034343698203664293918074463, + 21888242871839275222246405745257275088548364400416034343698203983456214544766, + 21888242871839275222246405745257275088548364400416034343698203638821585753793, + 21888242871839275222246405745257275088548364400416034343698203770985948706713, + 24471115679338, + 21888242871839275222246405745257275088548364400416034343698203825070196287069, + 21888242871839275222246405745257275088548364400416034343698203995835760506192, + 344046801230661, + 21888242871839275222246405745257275088548364400416034343698203644305205587099, + 35395794284136, + 136626507078578, + 21888242871839275222246405745257275088548364400416034343698204081576521901063, + 21888242871839275222246405745257275088548364400416034343698204048786180889911, + 5249244646662, + 107093053484783, + 394665021130081, + 21888242871839275222246405745257275088548364400416034343698203761598059907032, + 82694461722845, + 526018322391136, + 21888242871839275222246405745257275088548364400416034343698203665781032829855, + 398822603129825, + 21888242871839275222246405745257275088548364400416034343698203950037485368843, + 21888242871839275222246405745257275088548364400416034343698203984049249206252, + 230883304842932, + 21888242871839275222246405745257275088548364400416034343698203784567503382245, + 486914696775135, + 116698697581141, + 21888242871839275222246405745257275088548364400416034343698204009846303315966, + 21888242871839275222246405745257275088548364400416034343698203839512017015736, + 21888242871839275222246405745257275088548364400416034343698203678429206136522, + 21888242871839275222246405745257275088548364400416034343698204063900068953843, + 21888242871839275222246405745257275088548364400416034343698204069108459843181, + 538225241948923, + 212239251504646, + 368140405272293, + 456930735756782, + 9111107652726, + 21888242871839275222246405745257275088548364400416034343698203869459170236591, + 455388888358380, + 21888242871839275222246405745257275088548364400416034343698204066706088384752, + 21888242871839275222246405745257275088548364400416034343698203728616729785868, + 21888242871839275222246405745257275088548364400416034343698203676516558506163, + 21888242871839275222246405745257275088548364400416034343698203658005050300667, + 177804903236762, + 21888242871839275222246405745257275088548364400416034343698203645159902535454, + 21888242871839275222246405745257275088548364400416034343698203668163992849851, + 5568910789068, + 21888242871839275222246405745257275088548364400416034343698203984759194851161, + 291451972095723, + 21888242871839275222246405745257275088548364400416034343698204135298089545511, + 21888242871839275222246405745257275088548364400416034343698203667091823445749, + 21888242871839275222246405745257275088548364400416034343698204053086791700127, + 21888242871839275222246405745257275088548364400416034343698203831468486198145, + 523884596848038, + 555623038918173, + 21888242871839275222246405745257275088548364400416034343698203836886026128566, + 21888242871839275222246405745257275088548364400416034343698203980777397224708, + 37823318317999, + 21888242871839275222246405745257275088548364400416034343698204129889256456615, + 495543915274537, + 355106390777934, + 41779678237740, + 21888242871839275222246405745257275088548364400416034343698203809655258728772, + 452312011967346, + 203984861575965, + 21888242871839275222246405745257275088548364400416034343698204037691002499039, + 313210759463621, + 21888242871839275222246405745257275088548364400416034343698203873704659612835, + 21888242871839275222246405745257275088548364400416034343698203778697017782502, + 21888242871839275222246405745257275088548364400416034343698203957254239056596, + 363096455241877, + 21888242871839275222246405745257275088548364400416034343698204146776025669810, + 21888242871839275222246405745257275088548364400416034343698204046481756530965, + 21888242871839275222246405745257275088548364400416034343698203914442511972707, + 429105961914197, + 5781258342083, + 449684306114132, + 368674628531913, + 205451836906633, + 163151694246765, + 99465204807641, + 479263457540641, + 513510393437639, + 220102711395724, + 21888242871839275222246405745257275088548364400416034343698203755442442371950, + 21888242871839275222246405745257275088548364400416034343698203784903904878159, + 322879209076149, + 21888242871839275222246405745257275088548364400416034343698204098562403575550, + 91209476452809, + 233513700320766, + 21888242871839275222246405745257275088548364400416034343698203956276079707397, + 21888242871839275222246405745257275088548364400416034343698203881041239218500, + 388662999581872, + 459891970065755, + 514819168436876, + 500432019342643, + 74442998272571, + 21888242871839275222246405745257275088548364400416034343698204029030961558897, + 356280435942501, + 21888242871839275222246405745257275088548364400416034343698203814301976089994, + 21888242871839275222246405745257275088548364400416034343698204056404035400573, + 21888242871839275222246405745257275088548364400416034343698204061257100850528, + 88714472364888, + 70487877587266, + 21888242871839275222246405745257275088548364400416034343698203864677074456987, + 21888242871839275222246405745257275088548364400416034343698204052543735880769, + 408426279196562, + 21888242871839275222246405745257275088548364400416034343698204108392240933254, + 361412886824517, + 21888242871839275222246405745257275088548364400416034343698204144812853217281, + 75435096469422, + 392532682245139, + 265410575269032, + 35571934254820, + 543801411462596, + 21888242871839275222246405745257275088548364400416034343698204077437077505116, + 21888242871839275222246405745257275088548364400416034343698204101428112603475, + 21888242871839275222246405745257275088548364400416034343698204120560366165197, + 58542158307518, + 552265770909184, + 425427716396657, + 21888242871839275222246405745257275088548364400416034343698204127230220554664, + 21888242871839275222246405745257275088548364400416034343698203637618639530199, + 21888242871839275222246405745257275088548364400416034343698203906151682540289, + 21888242871839275222246405745257275088548364400416034343698203640164940698264, + 268528105592082, + 374648514034252, + 21888242871839275222246405745257275088548364400416034343698204151147600200046, + 21888242871839275222246405745257275088548364400416034343698203790574768709956, + 21888242871839275222246405745257275088548364400416034343698203989558739382302, + 21888242871839275222246405745257275088548364400416034343698203973659757491704, + 317807283913047, + 21888242871839275222246405745257275088548364400416034343698204003282390594144, + 336067499115813, + 21888242871839275222246405745257275088548364400416034343698204105610801518703, + 21888242871839275222246405745257275088548364400416034343698203630630819225451, + 109023147010089, + 21888242871839275222246405745257275088548364400416034343698203947140287603925, + 281791874133923, + 21888242871839275222246405745257275088548364400416034343698203968347268396367, + 21888242871839275222246405745257275088548364400416034343698203702754880812069, + 21888242871839275222246405745257275088548364400416034343698203716583229130585, + 21888242871839275222246405745257275088548364400416034343698204143076586235468, + 21888242871839275222246405745257275088548364400416034343698204096035066376856, + 296999922784616, + 21888242871839275222246405745257275088548364400416034343698203641161724095869, + 97104401231169, + 21888242871839275222246405745257275088548364400416034343698203663785775287480, + 476592292016234, + 21888242871839275222246405745257275088548364400416034343698204179938819003998, + 21888242871839275222246405745257275088548364400416034343698204091642964060573, + 21888242871839275222246405745257275088548364400416034343698204080770536673720, + 21888242871839275222246405745257275088548364400416034343698203983552241436654, + 218097743698416, + 21888242871839275222246405745257275088548364400416034343698203841571892488903, + 21888242871839275222246405745257275088548364400416034343698204113087453450860, + 21888242871839275222246405745257275088548364400416034343698204013637557681002, + 390292991880684, + 539730482058949, + 21888242871839275222246405745257275088548364400416034343698203970676511581492, + 460024398977547, + 21888242871839275222246405745257275088548364400416034343698203826846414306416, + 21888242871839275222246405745257275088548364400416034343698204154466350279301, + 21888242871839275222246405745257275088548364400416034343698203856591797843775, + 269625259964316, + 66022579225532, + 370654201751796, + 557437739152770, + 560989572319530, + 21888242871839275222246405745257275088548364400416034343698203984916062338895, + 21888242871839275222246405745257275088548364400416034343698203785859188270440, + 350272105045827, + 21888242871839275222246405745257275088548364400416034343698203994274905970754, + 285107155181723, + 21888242871839275222246405745257275088548364400416034343698203715310895642976, + 21888242871839275222246405745257275088548364400416034343698203706051406902663, + 546343936394504, + 21888242871839275222246405745257275088548364400416034343698204174650275352487, + 521230772678429, + 21888242871839275222246405745257275088548364400416034343698204065258870674780, + 343687985655614, + 125474385025331, + 21888242871839275222246405745257275088548364400416034343698203915350194665291, + 363834477151501, + 38128693999972, + 447234722145243, + 491375970001954, + 21888242871839275222246405745257275088548364400416034343698203910088743731490, + 21888242871839275222246405745257275088548364400416034343698203744451722217709, + 21888242871839275222246405745257275088548364400416034343698203661335286158068, + 547540989016780, + 545429315046737, + 21888242871839275222246405745257275088548364400416034343698204179136285195320, + 175785572787594, + 21888242871839275222246405745257275088548364400416034343698203860665814316971, + 258896206396111, + 21888242871839275222246405745257275088548364400416034343698203803909031360314, + 439377689551411, + 21888242871839275222246405745257275088548364400416034343698203714472318614599, + 21888242871839275222246405745257275088548364400416034343698203896587079534409, + 21888242871839275222246405745257275088548364400416034343698203683077375991615, + 306351801520356, + 21888242871839275222246405745257275088548364400416034343698203841177511117990, + 21888242871839275222246405745257275088548364400416034343698203782066618277651, + 21888242871839275222246405745257275088548364400416034343698204079202237719936, + 376483300164026, + 228243486973913, + 21888242871839275222246405745257275088548364400416034343698204052614976995366, + 21888242871839275222246405745257275088548364400416034343698203823879247494374, + 21888242871839275222246405745257275088548364400416034343698204099561269344231, + 21888242871839275222246405745257275088548364400416034343698203707979807997557, + 21888242871839275222246405745257275088548364400416034343698203735851444757329, + 190039325845283, + 21888242871839275222246405745257275088548364400416034343698204060505129729276, + 480990919306776, + 21888242871839275222246405745257275088548364400416034343698204019619826594646, + 207257531033276, + 21888242871839275222246405745257275088548364400416034343698203822739741025986, + 21888242871839275222246405745257275088548364400416034343698203935189663875354, + 21888242871839275222246405745257275088548364400416034343698203973419086355765, + 483645869678824, + 21888242871839275222246405745257275088548364400416034343698203760295299325384, + 21888242871839275222246405745257275088548364400416034343698204115158198597191, + 21888242871839275222246405745257275088548364400416034343698203858257653356723, + 284118422750633, + 174632800873979, + 77996224629988, + 21888242871839275222246405745257275088548364400416034343698204116949831017957, + 21888242871839275222246405745257275088548364400416034343698203640211546034197, + 181561859086247, + 30912184497548, + 21888242871839275222246405745257275088548364400416034343698203662855117986091, + 193259215258210, + 21888242871839275222246405745257275088548364400416034343698203783577338272758, + 21888242871839275222246405745257275088548364400416034343698204103409584643432, + 21888242871839275222246405745257275088548364400416034343698203903282994102133, + 21888242871839275222246405745257275088548364400416034343698204091827828865869, + 21888242871839275222246405745257275088548364400416034343698203754711098676668, + 21888242871839275222246405745257275088548364400416034343698203732459193590552, + 21888242871839275222246405745257275088548364400416034343698203644311760001164, + 457759719070359, + 35323837367880, + 21888242871839275222246405745257275088548364400416034343698204174142860502176, + 21888242871839275222246405745257275088548364400416034343698203864942593331450, + 21888242871839275222246405745257275088548364400416034343698204144251701067302, + 21888242871839275222246405745257275088548364400416034343698203959550448422537, + 391246106936338, + 21888242871839275222246405745257275088548364400416034343698203627405382120802, + 169047903462743, + 21888242871839275222246405745257275088548364400416034343698203997463051435044, + 142139658501622, + 21888242871839275222246405745257275088548364400416034343698203634910163801650, + 21888242871839275222246405745257275088548364400416034343698204004519277565547, + 536004271353142, + 21888242871839275222246405745257275088548364400416034343698203678258461053616, + 21888242871839275222246405745257275088548364400416034343698203674040097423824, + 21888242871839275222246405745257275088548364400416034343698203809106821156509, + 24603339769861, + 68514828054387, + 21888242871839275222246405745257275088548364400416034343698203858245288739372, + 183449476027131, + 21888242871839275222246405745257275088548364400416034343698203983629632401931, + 21888242871839275222246405745257275088548364400416034343698204064949293257988, + 21888242871839275222246405745257275088548364400416034343698203991648519893773, + 21888242871839275222246405745257275088548364400416034343698204156379231454082, + 433591535850276, + 353404735503457, + 21888242871839275222246405745257275088548364400416034343698204174864096031412, + 406081311139982, + 21888242871839275222246405745257275088548364400416034343698203862973978184234, + 21888242871839275222246405745257275088548364400416034343698204126927200669801, + 21888242871839275222246405745257275088548364400416034343698203691473285853808, + 182055508688236, + 21888242871839275222246405745257275088548364400416034343698203654031890019422, + 21888242871839275222246405745257275088548364400416034343698203932680011909734, + 21888242871839275222246405745257275088548364400416034343698203975357299296604, + 158963565219674, + 50349881952768, + 263198866912184, + 410550469344094, + 319744497836620, + 81793918857110, + 55652103901883, + 521083240356142, + 293022504550813, + 21888242871839275222246405745257275088548364400416034343698203719535874950069, + 21888242871839275222246405745257275088548364400416034343698203825102496522825, + 41678834075965, + 21888242871839275222246405745257275088548364400416034343698203681450298630066, + 450116843310050, + 48635330051802, + 201251465824069, + 331534702316464, + 425019517283888, + 192871749439962, + 245016814672578, + 21888242871839275222246405745257275088548364400416034343698203953095780856104, + 21888242871839275222246405745257275088548364400416034343698204014270845995979, + 21888242871839275222246405745257275088548364400416034343698203953370606903568, + 21888242871839275222246405745257275088548364400416034343698203736449952533405, + 21888242871839275222246405745257275088548364400416034343698203974866663269805, + 21888242871839275222246405745257275088548364400416034343698203633084771530021, + 381745125227385, + 135188991169800, + 21888242871839275222246405745257275088548364400416034343698203790527390341304, + 468120058870462, + 21888242871839275222246405745257275088548364400416034343698203964509409864936, + 21888242871839275222246405745257275088548364400416034343698203780068066340503, + 21888242871839275222246405745257275088548364400416034343698203751764944235753, + 21888242871839275222246405745257275088548364400416034343698204071161887352947, + 449818743946202, + 462548078611255, + 21888242871839275222246405745257275088548364400416034343698204136380955434140, + 388718914147914, + 21888242871839275222246405745257275088548364400416034343698204172494323574433, + 408651942163049, + 21888242871839275222246405745257275088548364400416034343698204063948646907682, + 21888242871839275222246405745257275088548364400416034343698203905782685874102, + 21888242871839275222246405745257275088548364400416034343698203888657713818776, + 21888242871839275222246405745257275088548364400416034343698204104466579873980, + 456043919508659, + 472126645523602, + 21888242871839275222246405745257275088548364400416034343698204127043435633956, + 21888242871839275222246405745257275088548364400416034343698203684457388958923, + 398308358964237, + 21888242871839275222246405745257275088548364400416034343698204005120310165938, + 21888242871839275222246405745257275088548364400416034343698204140459663251153, + 382884514491218, + 165204376918318, + 545874212017147, + 21888242871839275222246405745257275088548364400416034343698204138990028091614, + 364696059122921, + 21888242871839275222246405745257275088548364400416034343698203657074141021821, + 229968818387867, + 21888242871839275222246405745257275088548364400416034343698204101373669744426, + 21888242871839275222246405745257275088548364400416034343698203669001433612366, + 21888242871839275222246405745257275088548364400416034343698203755294889037373, + 21888242871839275222246405745257275088548364400416034343698203898057409626671, + 30528610340929, + 46262449141522, + 21888242871839275222246405745257275088548364400416034343698203699534359846969, + 276317592603010, + 559429079850971, + 399557157909421, + 21888242871839275222246405745257275088548364400416034343698204111810188124523, + 210670075285452, + 461687165729444, + 21888242871839275222246405745257275088548364400416034343698204159759045612337, + 21888242871839275222246405745257275088548364400416034343698204064520780931369, + 187547172035096, + 21888242871839275222246405745257275088548364400416034343698203671354095018877, + 194920912612896, + 21888242871839275222246405745257275088548364400416034343698204147523504712157, + 21888242871839275222246405745257275088548364400416034343698203826221385425595, + 21888242871839275222246405745257275088548364400416034343698203628483015613201, + 272386300983381, + 469478944348643, + 182206773727291, + 21888242871839275222246405745257275088548364400416034343698203862262949703124, + 21888242871839275222246405745257275088548364400416034343698203879805301143866, + 21888242871839275222246405745257275088548364400416034343698203975885828987890, + 21888242871839275222246405745257275088548364400416034343698203751182360992648, + 21888242871839275222246405745257275088548364400416034343698203719053034900690, + 51012210685004, + 21888242871839275222246405745257275088548364400416034343698203928057923827392, + 21888242871839275222246405745257275088548364400416034343698203793240831000442, + 21888242871839275222246405745257275088548364400416034343698203944074970323562, + 21888242871839275222246405745257275088548364400416034343698203930332112541034, + 21888242871839275222246405745257275088548364400416034343698203913893237978558, + 21888242871839275222246405745257275088548364400416034343698203912600706869053, + 21888242871839275222246405745257275088548364400416034343698203888792309251695, + 57843612912314, + 21888242871839275222246405745257275088548364400416034343698203849911611629556, + 134211777367858, + 109708156124970, + 465407373340821, + 21888242871839275222246405745257275088548364400416034343698203718823424006542, + 511487192098377, + 21888242871839275222246405745257275088548364400416034343698203820538110858455, + 21888242871839275222246405745257275088548364400416034343698204026398386732477, + 21888242871839275222246405745257275088548364400416034343698203946380160595291, + 255632902962461, + 21888242871839275222246405745257275088548364400416034343698203637985757022100, + 21888242871839275222246405745257275088548364400416034343698204183037558109379, + 329269424919472, + 21888242871839275222246405745257275088548364400416034343698203903399256863345, + 288581921196063, + 374950491517414, + 339885167828092, + 21888242871839275222246405745257275088548364400416034343698203952282560235756, + 166846774065855, + 98088779142810, + 21888242871839275222246405745257275088548364400416034343698203777644966664138, + 95599008845858, + 21888242871839275222246405745257275088548364400416034343698204086767182528053, + 476340300223474, + 104785769803683, + 21888242871839275222246405745257275088548364400416034343698204163434408957726, + 21888242871839275222246405745257275088548364400416034343698203940633060632447, + 224697135023282, + 144643267720925, + 21888242871839275222246405745257275088548364400416034343698203790928355442976, + 527294838845899, + 293553597679252, + 21888242871839275222246405745257275088548364400416034343698203965132389406044, + 21888242871839275222246405745257275088548364400416034343698203869711901746212, + 257978208077542, + 413459638125457, + 372333569970807, + 70227226669959, + 111440791548322, + 21888242871839275222246405745257275088548364400416034343698204099119531783091, + 21888242871839275222246405745257275088548364400416034343698204150045309653182, + 21888242871839275222246405745257275088548364400416034343698204159708306782335, + 443842683289918, + 221026224444564, + 53629938544181, + 21888242871839275222246405745257275088548364400416034343698203853002681844535, + 21888242871839275222246405745257275088548364400416034343698203712544636808772, + 505629061892122, + 21888242871839275222246405745257275088548364400416034343698203783543565113906, + 541479254604466, + 21888242871839275222246405745257275088548364400416034343698203720131858103237, + 21888242871839275222246405745257275088548364400416034343698203753369152061284, + 300549126110239, + 21888242871839275222246405745257275088548364400416034343698204061238259036021, + 21888242871839275222246405745257275088548364400416034343698203646359228158607, + 20427424370012, + 21888242871839275222246405745257275088548364400416034343698203624615710132777, + 21888242871839275222246405745257275088548364400416034343698204078561503286070, + 252305645777929, + 21888242871839275222246405745257275088548364400416034343698203986308788846141, + 21888242871839275222246405745257275088548364400416034343698204072006958327369, + 21888242871839275222246405745257275088548364400416034343698203953109736262395, + 549669320325542, + 360557020698044, + 228478920935186, + 21888242871839275222246405745257275088548364400416034343698203864180862777280, + 100025317995707, + 21888242871839275222246405745257275088548364400416034343698203935012157943672, + 21888242871839275222246405745257275088548364400416034343698203906860301550121, + 99523027974022, + 560444546968414, + 21888242871839275222246405745257275088548364400416034343698203674944498455841, + 465180949982671, + 313438314580853, + 21888242871839275222246405745257275088548364400416034343698204070437425128650, + 21888242871839275222246405745257275088548364400416034343698203968466547921633, + 231150058125206, + 470276640285370, + 35652370864733, + 21888242871839275222246405745257275088548364400416034343698203713295339343531, + 21888242871839275222246405745257275088548364400416034343698203821651402227830, + 91732831899265, + 21888242871839275222246405745257275088548364400416034343698203807235991124289, + 364358774765020, + 431114145776176, + 148502344977745, + 415884771658245, + 21888242871839275222246405745257275088548364400416034343698203826069828236378, + 21888242871839275222246405745257275088548364400416034343698203764199163432817, + 412361295705412, + 21888242871839275222246405745257275088548364400416034343698203721525666928555, + 258227786274442, + 21888242871839275222246405745257275088548364400416034343698203970115436821753, + 21888242871839275222246405745257275088548364400416034343698203818090201154703, + 16942286472100, + 347985603680694, + 445349176808541, + 238576027801234, + 262291700467541, + 21888242871839275222246405745257275088548364400416034343698204156138657907349, + 132274223837113, + 102379863305101, + 21888242871839275222246405745257275088548364400416034343698204014627855151117, + 21888242871839275222246405745257275088548364400416034343698204019622583180351, + 256978623980592, + 21888242871839275222246405745257275088548364400416034343698203713469355868105, + 456293791778618, + 307813166807068, + 21888242871839275222246405745257275088548364400416034343698203946984594076566, + 251373462612576, + 21888242871839275222246405745257275088548364400416034343698203664047274572294, + 21888242871839275222246405745257275088548364400416034343698203690293950631260, + 21888242871839275222246405745257275088548364400416034343698203963506890992957, + 178498670887688, + 21888242871839275222246405745257275088548364400416034343698204042415662318950, + 182410475766950, + 327679100598398, + 21888242871839275222246405745257275088548364400416034343698204093596190849762, + 515839524108657, + 21888242871839275222246405745257275088548364400416034343698203816745987807158, + 202301859436285, + 21888242871839275222246405745257275088548364400416034343698204102393826759789, + 21888242871839275222246405745257275088548364400416034343698203724867055586903, + 21888242871839275222246405745257275088548364400416034343698203737877416526982, + 93937800469632, + 276647053528399, + 21888242871839275222246405745257275088548364400416034343698204048384079790007, + 21888242871839275222246405745257275088548364400416034343698203805331501709740, + 423897707692708, + 220648062203983, + 21888242871839275222246405745257275088548364400416034343698204178921166081102, + 52122882867132, + 21888242871839275222246405745257275088548364400416034343698203843952614731605, + 21888242871839275222246405745257275088548364400416034343698204152984693799173, + 21888242871839275222246405745257275088548364400416034343698204033687394666362, + 21888242871839275222246405745257275088548364400416034343698203949642144536403, + 335256184757342, + 21888242871839275222246405745257275088548364400416034343698204096128215875498, + 21888242871839275222246405745257275088548364400416034343698203965359530216816, + 21888242871839275222246405745257275088548364400416034343698203779171092093839, + 361393512958902, + 383823950426861, + 383246624523158, + 223502313944428, + 21888242871839275222246405745257275088548364400416034343698203785224135970732, + 21888242871839275222246405745257275088548364400416034343698203863844517124889, + 21888242871839275222246405745257275088548364400416034343698204064301948230040, + 363551299829191, + 484378561578854, + 21888242871839275222246405745257275088548364400416034343698203870270028633124, + 344581144301613, + 2021085461047, + 21888242871839275222246405745257275088548364400416034343698203761120337468600, + 391350851703346, + 21888242871839275222246405745257275088548364400416034343698203742956054283211, + 140299953567751, + 21888242871839275222246405745257275088548364400416034343698204019074914514971, + 432085845602453, + 119776505383461, + 24483630639340, + 21888242871839275222246405745257275088548364400416034343698204058990168812273, + 401021326606437, + 21888242871839275222246405745257275088548364400416034343698203631003604068336, + 84610136200950, + 484922998702048, + 304422400719238, + 155228368866368, + 21888242871839275222246405745257275088548364400416034343698203876973040037088, + 365809350448447, + 21888242871839275222246405745257275088548364400416034343698204044487764224042, + 21888242871839275222246405745257275088548364400416034343698204145025849958530, + 21888242871839275222246405745257275088548364400416034343698204004460788653209, + 21888242871839275222246405745257275088548364400416034343698204078048731526220, + 150068463535162, + 21888242871839275222246405745257275088548364400416034343698204012798256273160, + 21888242871839275222246405745257275088548364400416034343698203961384083396019, + 253076792383193, + 21888242871839275222246405745257275088548364400416034343698204128430214848842, + 21888242871839275222246405745257275088548364400416034343698203969474677203147, + 426638869250684, + 445230713420424, + 161817607119401, + 335816648519207, + 21888242871839275222246405745257275088548364400416034343698203840325223713713, + 482957212105813, + 21888242871839275222246405745257275088548364400416034343698203938953543708334, + 21888242871839275222246405745257275088548364400416034343698204064491924289336, + 21888242871839275222246405745257275088548364400416034343698203658131330231602, + 21888242871839275222246405745257275088548364400416034343698203807763872177329, + 469513366359082, + 213647664030592, + 21888242871839275222246405745257275088548364400416034343698203686577510294060, + 21888242871839275222246405745257275088548364400416034343698203923430040762847, + 115634310081570, + 411056634482739, + 21888242871839275222246405745257275088548364400416034343698203705872422865757, + 215850191494820, + 535431160157233, + 536050094631360, + 244525755861509, + 252199086548891, + 21888242871839275222246405745257275088548364400416034343698203820650320810742, + 21888242871839275222246405745257275088548364400416034343698203827774376107789, + 228261651153539, + 132380192922196, + 558682339024679, + 382867021472891, + 209711351327696, + 547108302027802, + 21888242871839275222246405745257275088548364400416034343698203728574122489144, + 21888242871839275222246405745257275088548364400416034343698203954331288694442, + 21888242871839275222246405745257275088548364400416034343698203882917703201518, + 21888242871839275222246405745257275088548364400416034343698203817595979401086, + 21888242871839275222246405745257275088548364400416034343698204023401115005311, + 21888242871839275222246405745257275088548364400416034343698203946385430917353, + 226493528481998, + 21888242871839275222246405745257275088548364400416034343698203800803357468914, + 365404312957036, + 21888242871839275222246405745257275088548364400416034343698203819161379138145, + 21888242871839275222246405745257275088548364400416034343698203909950851665287, + 21888242871839275222246405745257275088548364400416034343698204042416268382057, + 21888242871839275222246405745257275088548364400416034343698203698781520843843, + 357215812067151, + 21888242871839275222246405745257275088548364400416034343698203650614321265222, + 241437000342931, + 21888242871839275222246405745257275088548364400416034343698203963120819752067, + 21888242871839275222246405745257275088548364400416034343698203635603540021681, + 102993429778918, + 21888242871839275222246405745257275088548364400416034343698204017867558780306, + 77886437723977, + 284675564489161, + 537780953407700, + 147108136805562, + 21888242871839275222246405745257275088548364400416034343698203916569412218726, + 181617860653652, + 250815436134359, + 513289901050803, + 21888242871839275222246405745257275088548364400416034343698204083735255770405, + 21888242871839275222246405745257275088548364400416034343698203854511108729683, + 21888242871839275222246405745257275088548364400416034343698203853619389239383, + 21888242871839275222246405745257275088548364400416034343698203666696824510850, + 21888242871839275222246405745257275088548364400416034343698203728615008929639, + 21888242871839275222246405745257275088548364400416034343698204106236292352271, + 298554904238289, + 113788322827419, + 21888242871839275222246405745257275088548364400416034343698204058164535351488, + 21888242871839275222246405745257275088548364400416034343698203904776274128802, + 21888242871839275222246405745257275088548364400416034343698203731758002746532, + 21888242871839275222246405745257275088548364400416034343698203920852176980062, + 506672829698834, + 71817049500722, + 21888242871839275222246405745257275088548364400416034343698203990469984715269, + 67633760402767, + 21888242871839275222246405745257275088548364400416034343698203968460449101631, + 21888242871839275222246405745257275088548364400416034343698203746405944071298, + 482945039500188, + 21888242871839275222246405745257275088548364400416034343698203698494269634200, + 179111097052074, + 49851600722561, + 21888242871839275222246405745257275088548364400416034343698203772829116496995, + 164050265628334, + 330690514718872, + 21888242871839275222246405745257275088548364400416034343698203707050310966684, + 21888242871839275222246405745257275088548364400416034343698204049831919679760, + 21888242871839275222246405745257275088548364400416034343698203849255335204154, + 448277226652601, + 21888242871839275222246405745257275088548364400416034343698203837680399279240, + 90773536295073, + 21888242871839275222246405745257275088548364400416034343698203995064338969597, + 199062866963357, + 157948185946291, + 305123600221078, + 239759895573884, + 163090953408412, + 8322110251824, + 21888242871839275222246405745257275088548364400416034343698204027203217410099, + 514673606180271, + 324225409598347, + 21888242871839275222246405745257275088548364400416034343698204008036569394870, + 529021381377188, + 530804656588273, + 21888242871839275222246405745257275088548364400416034343698203941672941220722, + 21187344630441, + 21888242871839275222246405745257275088548364400416034343698204108991772075290, + 21888242871839275222246405745257275088548364400416034343698204092739813866801, + 21888242871839275222246405745257275088548364400416034343698203909112776516817, + 352932248290516, + 21888242871839275222246405745257275088548364400416034343698203993925137078788, + 25984329936767, + 21888242871839275222246405745257275088548364400416034343698203689839338190263, + 21888242871839275222246405745257275088548364400416034343698203809727732778675, + 21888242871839275222246405745257275088548364400416034343698203674292394460082, + 21888242871839275222246405745257275088548364400416034343698203956034289070797, + 21888242871839275222246405745257275088548364400416034343698203926730325194082, + 21888242871839275222246405745257275088548364400416034343698204119425287727762, + 141738776826865, + 276808037799802, + 21888242871839275222246405745257275088548364400416034343698203973151932399321, + 510106664835098, + 292562516285270, + 561443542508020, + 44635678559815, + 151858671940267, + 21888242871839275222246405745257275088548364400416034343698203958345285986839, + 238740105977988, + 21888242871839275222246405745257275088548364400416034343698203958629923226164, + 21888242871839275222246405745257275088548364400416034343698203821561669116310, + 21888242871839275222246405745257275088548364400416034343698204037843171948991, + 21888242871839275222246405745257275088548364400416034343698204140313533655920, + 85746222154499, + 21888242871839275222246405745257275088548364400416034343698204041477167486929, + 195109869081149, + 21888242871839275222246405745257275088548364400416034343698203718719106534782, + 24744974343533, + 21888242871839275222246405745257275088548364400416034343698203802291141416723, + 503916185815816, + 2671958639450, + 21888242871839275222246405745257275088548364400416034343698203974636517673826, + 21888242871839275222246405745257275088548364400416034343698203665141852353344, + 335928175173884, + 69319305826316, + 21888242871839275222246405745257275088548364400416034343698203870751803867767, + 21888242871839275222246405745257275088548364400416034343698204071036434256853, + 429556273314890, + 287200617102156, + 21888242871839275222246405745257275088548364400416034343698203677191715857663, + 21888242871839275222246405745257275088548364400416034343698203759363765708944, + 438340494623488, + 528448606425723, + 499985919316170, + 21888242871839275222246405745257275088548364400416034343698203996444452593539, + 495276240878184, + 21888242871839275222246405745257275088548364400416034343698203809930538392681, + 21888242871839275222246405745257275088548364400416034343698203752695066653972, + 21888242871839275222246405745257275088548364400416034343698204025292459643141, + 509031584178058, + 531984832443426, + 468163521558201, + 427439304746114, + 21888242871839275222246405745257275088548364400416034343698204044075488692646, + 21888242871839275222246405745257275088548364400416034343698203657218149619379, + 127761281460886, + 469171586343855, + 21888242871839275222246405745257275088548364400416034343698204025713342203911, + 21888242871839275222246405745257275088548364400416034343698203800448257858320, + 61386481373890, + 545567227692682, + 21888242871839275222246405745257275088548364400416034343698203659187736600633, + 403580357165459, + 21888242871839275222246405745257275088548364400416034343698203855738551852991, + 115857351213803, + 301571948405135, + 21888242871839275222246405745257275088548364400416034343698204031647734444611, + 21888242871839275222246405745257275088548364400416034343698204075419194224158, + 21888242871839275222246405745257275088548364400416034343698203878748616593907, + 21888242871839275222246405745257275088548364400416034343698203736897076578974, + 21888242871839275222246405745257275088548364400416034343698204160736767134458, + 21888242871839275222246405745257275088548364400416034343698204053058385813032, + 21888242871839275222246405745257275088548364400416034343698204083775690245533, + 68345831296600, + 154003039832924, + 355615127524635, + 21888242871839275222246405745257275088548364400416034343698203662092281689637, + 51877036009358, + 21888242871839275222246405745257275088548364400416034343698203991955589007869, + 21888242871839275222246405745257275088548364400416034343698203839853178060579, + 21888242871839275222246405745257275088548364400416034343698203669502290834294, + 21888242871839275222246405745257275088548364400416034343698203877206386876715, + 21888242871839275222246405745257275088548364400416034343698203809478704092220, + 21888242871839275222246405745257275088548364400416034343698203937740715587531, + 21888242871839275222246405745257275088548364400416034343698203943567082850099, + 21888242871839275222246405745257275088548364400416034343698203691699059070728, + 177846067475692, + 21888242871839275222246405745257275088548364400416034343698204128780090739898, + 481344536882643, + 419138893686677, + 21888242871839275222246405745257275088548364400416034343698203847454750377018, + 21888242871839275222246405745257275088548364400416034343698203801020467149726, + 40730320902424, + 33551069262552, + 21888242871839275222246405745257275088548364400416034343698203788796643512198, + 21888242871839275222246405745257275088548364400416034343698204035879599175178, + 559691362637787, + 21888242871839275222246405745257275088548364400416034343698203663958441929172, + 21888242871839275222246405745257275088548364400416034343698204147860629170053, + 24559211202461, + 459474211840812, + 21888242871839275222246405745257275088548364400416034343698204141784413341206, + 21888242871839275222246405745257275088548364400416034343698203899876387403632, + 21888242871839275222246405745257275088548364400416034343698203730684862434815, + 21888242871839275222246405745257275088548364400416034343698204005193895620856, + 135415841006482, + 21888242871839275222246405745257275088548364400416034343698204049500753801987, + 514466830994370, + 222608685208820, + 21888242871839275222246405745257275088548364400416034343698204184627693588884, + 21888242871839275222246405745257275088548364400416034343698204118096739142039, + 21888242871839275222246405745257275088548364400416034343698203873155420512249, + 22687115082239, + 21888242871839275222246405745257275088548364400416034343698203628656544321005, + 280659118118401, + 532072431962578, + 21888242871839275222246405745257275088548364400416034343698203769693747371625, + 21888242871839275222246405745257275088548364400416034343698204180634242553874, + 21888242871839275222246405745257275088548364400416034343698204088929451920062, + 21888242871839275222246405745257275088548364400416034343698203792027781730822, + 21888242871839275222246405745257275088548364400416034343698203914939795451837, + 21888242871839275222246405745257275088548364400416034343698203758483911435576, + 346081727919610, + 21888242871839275222246405745257275088548364400416034343698203986650745153940, + 21888242871839275222246405745257275088548364400416034343698203954107963429506, + 10430198378697, + 308183929670254, + 66746734509151, + 21888242871839275222246405745257275088548364400416034343698204005554601610555, + 21888242871839275222246405745257275088548364400416034343698204185932390702122, + 540913271172522, + 437966177345093, + 21888242871839275222246405745257275088548364400416034343698203799148347456498, + 250060240979994, + 388299914852174, + 544197065762217, + 299348573276504, + 192760406482554, + 82000922134939, + 21888242871839275222246405745257275088548364400416034343698204130127785447653, + 21888242871839275222246405745257275088548364400416034343698203897335601073749, + 21888242871839275222246405745257275088548364400416034343698203749065307848788, + 21888242871839275222246405745257275088548364400416034343698203976279969812500, + 203233058354087, + 439898758697931, + 201132373015328, + 21888242871839275222246405745257275088548364400416034343698204070868682909946, + 21888242871839275222246405745257275088548364400416034343698203903086103348701, + 21888242871839275222246405745257275088548364400416034343698203659484573248272, + 278739317121796, + 89341440304479, + 21888242871839275222246405745257275088548364400416034343698203875466839000515, + 261714486097544, + 536751235316422, + 21888242871839275222246405745257275088548364400416034343698203710028929265938, + 21888242871839275222246405745257275088548364400416034343698204031778906959494, + 21888242871839275222246405745257275088548364400416034343698204054530600284642, + 379572200523980, + 297324320856942, + 2993995727469, + 314599746380005, + 21888242871839275222246405745257275088548364400416034343698203927364155802202, + 21888242871839275222246405745257275088548364400416034343698204097438479207643, + 137836765913478, + 21888242871839275222246405745257275088548364400416034343698203969823395045869, + 21888242871839275222246405745257275088548364400416034343698204167248002272044, + 147076488541312, + 21888242871839275222246405745257275088548364400416034343698203910168181154922, + 21888242871839275222246405745257275088548364400416034343698203771604287600668, + 21888242871839275222246405745257275088548364400416034343698203735626998026528, + 297086616654059, + 21888242871839275222246405745257275088548364400416034343698203690345102442862, + 58179020485809, + 249895220956814, + 21888242871839275222246405745257275088548364400416034343698204140677645633303, + 21888242871839275222246405745257275088548364400416034343698204178335777540120, + 243000446845417, + 103714159980737, + 25344340992670, + 21888242871839275222246405745257275088548364400416034343698204018666144984514, + 21888242871839275222246405745257275088548364400416034343698203818956108917479, + 21888242871839275222246405745257275088548364400416034343698203954620662913393, + 348176888170542, + 21888242871839275222246405745257275088548364400416034343698204105761420001388, + 21888242871839275222246405745257275088548364400416034343698203949326735972110, + 21888242871839275222246405745257275088548364400416034343698203924973586402096, + 141431209471278, + 21888242871839275222246405745257275088548364400416034343698203728313571962663, + 221210601995283, + 21888242871839275222246405745257275088548364400416034343698203882832147507722, + 55645093120912, + 284914738884770, + 21888242871839275222246405745257275088548364400416034343698203784817141979835, + 21888242871839275222246405745257275088548364400416034343698203980110796097952, + 21888242871839275222246405745257275088548364400416034343698203665258987630753, + 21888242871839275222246405745257275088548364400416034343698204024480504233611, + 71677232839500, + 21888242871839275222246405745257275088548364400416034343698204155005437903527, + 330968842452043, + 21888242871839275222246405745257275088548364400416034343698204178439931892595, + 21888242871839275222246405745257275088548364400416034343698204165585329298025, + 397566866509430, + 21888242871839275222246405745257275088548364400416034343698203937477232552112, + 21888242871839275222246405745257275088548364400416034343698204043254993426252, + 472584685761401, + 21888242871839275222246405745257275088548364400416034343698203923508826187438, + 234522702125460, + 21888242871839275222246405745257275088548364400416034343698203755952394218544, + 251814471343557, + 21888242871839275222246405745257275088548364400416034343698203793661223158937, + 21888242871839275222246405745257275088548364400416034343698203808562937977655, + 21888242871839275222246405745257275088548364400416034343698203804330169228489, + 271672843061181, + 263761155389970, + 132428584355656, + 368082731725305, + 292951948239939, + 347104770503512, + 21888242871839275222246405745257275088548364400416034343698204131231554457902, + 427985607371709, + 21888242871839275222246405745257275088548364400416034343698204031675339247085, + 21888242871839275222246405745257275088548364400416034343698203937728564500352, + 21888242871839275222246405745257275088548364400416034343698203965237326262997, + 427368700220258, + 116392752737384, + 21888242871839275222246405745257275088548364400416034343698203937130518618906, + 504484364271048, + 21888242871839275222246405745257275088548364400416034343698204121380855861889, + 21888242871839275222246405745257275088548364400416034343698203994003715618882, + 110504540652746, + 302487958875620, + 21888242871839275222246405745257275088548364400416034343698203898891039526583, + 206053679047661, + 21888242871839275222246405745257275088548364400416034343698203751259600849577, + 21888242871839275222246405745257275088548364400416034343698203854014363631782, + 319395319983176, + 21888242871839275222246405745257275088548364400416034343698204051460173895234, + 162577653623882, + 214597868379077, + 21888242871839275222246405745257275088548364400416034343698204153252998064705, + 21888242871839275222246405745257275088548364400416034343698203705756774015413, + 74967288775468, + 373588796040738, + 21888242871839275222246405745257275088548364400416034343698203712241725980176, + 21888242871839275222246405745257275088548364400416034343698203684053423445804, + 174082659717996, + 21888242871839275222246405745257275088548364400416034343698203997267772333899, + 21888242871839275222246405745257275088548364400416034343698203889430935999228, + 21888242871839275222246405745257275088548364400416034343698204076177051551698, + 21888242871839275222246405745257275088548364400416034343698203863713423521014, + 149659244054440, + 21888242871839275222246405745257275088548364400416034343698203686328821035611, + 21888242871839275222246405745257275088548364400416034343698203704315275934549, + 448704201588229, + 150438191089960, + 21888242871839275222246405745257275088548364400416034343698203789209767626027, + 21888242871839275222246405745257275088548364400416034343698204037738208160686, + 105313804422443, + 21888242871839275222246405745257275088548364400416034343698203872087740135200, + 21888242871839275222246405745257275088548364400416034343698203698526984361283, + 21888242871839275222246405745257275088548364400416034343698204019053037879911, + 370151205996896, + 21888242871839275222246405745257275088548364400416034343698203962559258359987, + 21888242871839275222246405745257275088548364400416034343698204101840407554944, + 515856191047972, + 21888242871839275222246405745257275088548364400416034343698203905597659681688, + 496121874983191, + 539988726414726, + 131674606424362, + 526993599060544, + 112800450077821, + 21888242871839275222246405745257275088548364400416034343698204054059522974540, + 21888242871839275222246405745257275088548364400416034343698203913305195567635, + 154787938260529, + 303157456717660, + 488929126736618, + 472506442427335, + 21888242871839275222246405745257275088548364400416034343698204171707701933659, + 195411714843744, + 21888242871839275222246405745257275088548364400416034343698203652198617960869, + 395109993992288, + 77911311084962, + 21888242871839275222246405745257275088548364400416034343698203997690800742980, + 21888242871839275222246405745257275088548364400416034343698204120484249843765, + 268587765301133, + 21888242871839275222246405745257275088548364400416034343698204055582670796407, + 511357381166643, + 132047515891877, + 21888242871839275222246405745257275088548364400416034343698204050864003542168, + 127605274810580, + 21888242871839275222246405745257275088548364400416034343698204059013977114919, + 343400357835097, + 21888242871839275222246405745257275088548364400416034343698204020916651710888, + 172023893994108, + 395540161982863, + 21888242871839275222246405745257275088548364400416034343698204054655729675099, + 21888242871839275222246405745257275088548364400416034343698203818562939883770, + 21888242871839275222246405745257275088548364400416034343698203990407830868707, + 539300230236078, + 21888242871839275222246405745257275088548364400416034343698203713637287191265, + 233046952675431, + 21888242871839275222246405745257275088548364400416034343698203637341946813931, + 417535145554199, + 62430256676811, + 244123712933224, + 272719277495545, + 28516626842101, + 21888242871839275222246405745257275088548364400416034343698203809309790199919, + 21888242871839275222246405745257275088548364400416034343698204064878832805548, + 21888242871839275222246405745257275088548364400416034343698203792944134427788, + 21888242871839275222246405745257275088548364400416034343698203806348355945611, + 226870318380351, + 21888242871839275222246405745257275088548364400416034343698203648601614766335, + 156018250693274, + 21888242871839275222246405745257275088548364400416034343698203898865165758322, + 21888242871839275222246405745257275088548364400416034343698203759266514545909, + 21888242871839275222246405745257275088548364400416034343698204035206962753717, + 54840411629290, + 21888242871839275222246405745257275088548364400416034343698204037054305766727, + 537111442842660, + 21888242871839275222246405745257275088548364400416034343698204005136360771434, + 21888242871839275222246405745257275088548364400416034343698203688535780425530, + 21888242871839275222246405745257275088548364400416034343698204088341829547138, + 21888242871839275222246405745257275088548364400416034343698204037976668964364, + 21888242871839275222246405745257275088548364400416034343698203931607174288826, + 48621099078525, + 21888242871839275222246405745257275088548364400416034343698204058069747632935, + 21888242871839275222246405745257275088548364400416034343698204091646952450259, + 118517778348811, + 21888242871839275222246405745257275088548364400416034343698203924933048479535, + 526973682202783, + 264850343036130, + 21888242871839275222246405745257275088548364400416034343698204181120693787215, + 153806114651854, + 21888242871839275222246405745257275088548364400416034343698203836160894641840, + 275293542655322, + 99662519742573, + 21888242871839275222246405745257275088548364400416034343698203959553878369172, + 21888242871839275222246405745257275088548364400416034343698204017541079407705, + 101285997335773, + 315238415104280, + 276063024124283, + 324022187878189, + 211725821479489, + 21888242871839275222246405745257275088548364400416034343698203941337031115814, + 212693382070944, + 21888242871839275222246405745257275088548364400416034343698203755034217277386, + 21888242871839275222246405745257275088548364400416034343698204116490327551261, + 347934208041854, + 479623639242405, + 203116456044802, + 562420590611595, + 21888242871839275222246405745257275088548364400416034343698203799431850943714, + 21888242871839275222246405745257275088548364400416034343698203993822199231481, + 408750094452951, + 288815540415206, + 517623231672522, + 21888242871839275222246405745257275088548364400416034343698204157902183213334, + 21888242871839275222246405745257275088548364400416034343698203939011630118616, + 456857769252961, + 21888242871839275222246405745257275088548364400416034343698203814080897861253, + 21888242871839275222246405745257275088548364400416034343698203670751756046274, + 44418081927963, + 189352310122298, + 138870851805018, + 5127671537035, + 21888242871839275222246405745257275088548364400416034343698203899144020369038, + 21888242871839275222246405745257275088548364400416034343698203704213048631157, + 387567867635848, + 21888242871839275222246405745257275088548364400416034343698204165746080482417, + 21888242871839275222246405745257275088548364400416034343698203702316759022806, + 21888242871839275222246405745257275088548364400416034343698203838610040675084, + 21888242871839275222246405745257275088548364400416034343698203690683093102538, + 389389152954151, + 148073327998937, + 324876049803652, + 11361095794154, + 29509303518220, + 223909245103736, + 21888242871839275222246405745257275088548364400416034343698203905143289961615, + 274676776798608, + 128890937191526, + 21888242871839275222246405745257275088548364400416034343698203705421471377184, + 208249247996782, + 21888242871839275222246405745257275088548364400416034343698204014976636193543, + 21888242871839275222246405745257275088548364400416034343698204125033255650844, + 21888242871839275222246405745257275088548364400416034343698203725256149083662, + 21888242871839275222246405745257275088548364400416034343698203890000309647891, + 145490492060598, + 21888242871839275222246405745257275088548364400416034343698204179208092930245, + 21888242871839275222246405745257275088548364400416034343698203747685298666441, + 148472932254967, + 21888242871839275222246405745257275088548364400416034343698203946988399326823, + 21888242871839275222246405745257275088548364400416034343698203860098963637930, + 243861802158535, + 21888242871839275222246405745257275088548364400416034343698203942784654366411, + 21888242871839275222246405745257275088548364400416034343698203997057873316357, + 510642096458190, + 279792387663703, + 21888242871839275222246405745257275088548364400416034343698203758802241554612, + 21888242871839275222246405745257275088548364400416034343698203815016976181260, + 21888242871839275222246405745257275088548364400416034343698203769598055199071, + 245739841663148, + 21888242871839275222246405745257275088548364400416034343698203653702496559963, + 21888242871839275222246405745257275088548364400416034343698203932808938898660, + 21888242871839275222246405745257275088548364400416034343698203821739011063523, + 219579146797533, + 21888242871839275222246405745257275088548364400416034343698203852142101055313, + 21888242871839275222246405745257275088548364400416034343698203982853499039384, + 314575834901637, + 56188016902872, + 153853678934829, + 447380230400596, + 21888242871839275222246405745257275088548364400416034343698203820372563424535, + 270612990083194, + 3440800412680, + 548000250444185, + 21888242871839275222246405745257275088548364400416034343698204118521222755384, + 21888242871839275222246405745257275088548364400416034343698203796975832550604, + 151816895816811, + 21888242871839275222246405745257275088548364400416034343698204134091328924645, + 21888242871839275222246405745257275088548364400416034343698203899115781227984, + 21888242871839275222246405745257275088548364400416034343698204026225684941418, + 21888242871839275222246405745257275088548364400416034343698203978576366175253, + 171186079183675, + 21888242871839275222246405745257275088548364400416034343698203675343044229796, + 21888242871839275222246405745257275088548364400416034343698203977795128781982, + 324246225569778, + 21888242871839275222246405745257275088548364400416034343698204117308168144295, + 21888242871839275222246405745257275088548364400416034343698204001124433885262, + 486561805847918, + 26650263389102, + 87596917467729, + 204777522679763, + 536432639658580, + 97645244747362, + 21888242871839275222246405745257275088548364400416034343698203939938341450536, + 36675518075463, + 30366255495831, + 21888242871839275222246405745257275088548364400416034343698204070138044834649, + 21888242871839275222246405745257275088548364400416034343698204146036140063195, + 21888242871839275222246405745257275088548364400416034343698204175896038740718, + 21888242871839275222246405745257275088548364400416034343698204154068905031262, + 391674877968934, + 174017095888979, + 77004915784495, + 450971859939409, + 446711019942485, + 342109973754566, + 21888242871839275222246405745257275088548364400416034343698203770506902238455, + 21888242871839275222246405745257275088548364400416034343698203841178475710647, + 542374491944045, + 20363692982977, + 535887794615247, + 3883806808974, + 477057841486670, + 21888242871839275222246405745257275088548364400416034343698203916122753870559, + 21888242871839275222246405745257275088548364400416034343698203773721648354186, + 336189813570191, + 21888242871839275222246405745257275088548364400416034343698203912897274579746, + 55667534057353, + 95719085372351, + 21888242871839275222246405745257275088548364400416034343698204036859977394905, + 21888242871839275222246405745257275088548364400416034343698204081595825474309, + 133888913126315, + 303895584094591, + 427451956343647, + 78781939735303, + 294560483646639, + 21888242871839275222246405745257275088548364400416034343698203972972346952247, + 21888242871839275222246405745257275088548364400416034343698203855406232547878, + 169082119143539, + 21888242871839275222246405745257275088548364400416034343698204018504399586856, + 21888242871839275222246405745257275088548364400416034343698203893958075875872, + 556336657687797, + 21888242871839275222246405745257275088548364400416034343698203921713005980190, + 21888242871839275222246405745257275088548364400416034343698203914169113248534, + 21888242871839275222246405745257275088548364400416034343698203729349029093456, + 434455642573961, + 137615121993553, + 21888242871839275222246405745257275088548364400416034343698203942111313078915, + 21888242871839275222246405745257275088548364400416034343698203716410034751762, + 363912158350956, + 21888242871839275222246405745257275088548364400416034343698203829057106525647, + 21888242871839275222246405745257275088548364400416034343698204017754416477402, + 176170346711685, + 306923434965641, + 21888242871839275222246405745257275088548364400416034343698204072079663004708, + 21888242871839275222246405745257275088548364400416034343698204101387798170019, + 21888242871839275222246405745257275088548364400416034343698203642316117823572, + 338059550605535, + 21888242871839275222246405745257275088548364400416034343698203709783574829276, + 102265933996897, + 21888242871839275222246405745257275088548364400416034343698203987493485074116, + 435296661249908, + 306080728266207, + 21888242871839275222246405745257275088548364400416034343698204047736452953929, + 21888242871839275222246405745257275088548364400416034343698203919642163689617, + 21888242871839275222246405745257275088548364400416034343698203700991645762964, + 21888242871839275222246405745257275088548364400416034343698204060325271624871, + 178419861706828, + 68875178325515, + 111493439192670, + 21888242871839275222246405745257275088548364400416034343698204132821978590101, + 21888242871839275222246405745257275088548364400416034343698204014131735881543, + 19252121455944, + 21888242871839275222246405745257275088548364400416034343698203956759042033396, + 21888242871839275222246405745257275088548364400416034343698203819203377175265, + 21888242871839275222246405745257275088548364400416034343698203782533506550330, + 46076750150803, + 21888242871839275222246405745257275088548364400416034343698203880680317266631, + 21888242871839275222246405745257275088548364400416034343698204054357844699457, + 21888242871839275222246405745257275088548364400416034343698204107357092517335, + 21888242871839275222246405745257275088548364400416034343698204105618453455203, + 230569329891113, + 21888242871839275222246405745257275088548364400416034343698204109183702987367, + 21888242871839275222246405745257275088548364400416034343698203705604177070221, + 487323730434051, + 10214022356297, + 21888242871839275222246405745257275088548364400416034343698203781769327595094, + 293163770362072, + 329756539840515, + 58593207908553, + 290507594276002, + 21888242871839275222246405745257275088548364400416034343698203688528915395614, + 136976865619220, + 80698545346957, + 21888242871839275222246405745257275088548364400416034343698203914799857957676, + 21888242871839275222246405745257275088548364400416034343698203877080716380864, + 48044686454018, + 134073142139123, + 21888242871839275222246405745257275088548364400416034343698203833636401161705, + 21888242871839275222246405745257275088548364400416034343698203631355631642599, + 21888242871839275222246405745257275088548364400416034343698203660161806610365, + 445636636910881, + 60704059515884, + 21888242871839275222246405745257275088548364400416034343698203877370147384055, + 21888242871839275222246405745257275088548364400416034343698204051055546059364, + 281519948327441, + 21888242871839275222246405745257275088548364400416034343698203866636719839441, + 21888242871839275222246405745257275088548364400416034343698203791957810218598, + 21888242871839275222246405745257275088548364400416034343698204011189592717767, + 480078593824031, + 265527410993501, + 365287589227699, + 157963260682642, + 137233055285474, + 137916491672843, + 246494059991466, + 21888242871839275222246405745257275088548364400416034343698204177043881113440, + 21888242871839275222246405745257275088548364400416034343698203676317020036951, + 21888242871839275222246405745257275088548364400416034343698203743019396522525, + 21888242871839275222246405745257275088548364400416034343698203835395293115688, + 439474731446724, + 167527957636314, + 271933706423069, + 170100672468310, + 517853779898142, + 280945258905808, + 416276069944067, + 484706892934512, + 21888242871839275222246405745257275088548364400416034343698203773437819857660, + 57326464052725, + 21888242871839275222246405745257275088548364400416034343698203736732039400572, + 21888242871839275222246405745257275088548364400416034343698203815224754549919, + 21888242871839275222246405745257275088548364400416034343698203874277491032580, + 21888242871839275222246405745257275088548364400416034343698203987857596851587, + 198291462600587, + 279629310686171, + 39386154052807, + 23972308413681, + 21888242871839275222246405745257275088548364400416034343698203777519253404933, + 26203407694185, + 21888242871839275222246405745257275088548364400416034343698203815437678705621, + 21888242871839275222246405745257275088548364400416034343698203707364694754000, + 455634465280139, + 288149521806640, + 21888242871839275222246405745257275088548364400416034343698203939343550331437, + 362719133544396, + 67872273159459, + 21888242871839275222246405745257275088548364400416034343698204146847236464801, + 468180545725225, + 21888242871839275222246405745257275088548364400416034343698203996461601738064, + 21888242871839275222246405745257275088548364400416034343698203644867712221742, + 21888242871839275222246405745257275088548364400416034343698204183723390061556, + 21888242871839275222246405745257275088548364400416034343698203945560497514050, + 121794105199403, + 21888242871839275222246405745257275088548364400416034343698203685115417604827, + 21888242871839275222246405745257275088548364400416034343698203815482407325246, + 537027481299845, + 21888242871839275222246405745257275088548364400416034343698203961773439877615, + 21888242871839275222246405745257275088548364400416034343698204155895619131376, + 21888242871839275222246405745257275088548364400416034343698203847586185954583, + 21888242871839275222246405745257275088548364400416034343698203755085652197094, + 323556015892814, + 21888242871839275222246405745257275088548364400416034343698203630595489513253, + 21888242871839275222246405745257275088548364400416034343698203674336047156592, + 21888242871839275222246405745257275088548364400416034343698203967753605998607, + 183594092439158, + 21888242871839275222246405745257275088548364400416034343698203641662044260392, + 367461076256157, + 21888242871839275222246405745257275088548364400416034343698203939542266041402, + 535868943705744, + 112092856265251, + 21888242871839275222246405745257275088548364400416034343698204036423086638248, + 254469380122191, + 122667639844053, + 553466248278541, + 439683978618524, + 290977252782137, + 5389035373187, + 107373098574260, + 230230744835714, + 21888242871839275222246405745257275088548364400416034343698203911806997927383, + 21888242871839275222246405745257275088548364400416034343698203986832420322450, + 21888242871839275222246405745257275088548364400416034343698203732053265555125, + 21888242871839275222246405745257275088548364400416034343698203678003046524816, + 21888242871839275222246405745257275088548364400416034343698204172973971519438, + 290649034353711, + 21888242871839275222246405745257275088548364400416034343698204125980677973696, + 21888242871839275222246405745257275088548364400416034343698204175947517128093, + 462998159527174, + 21888242871839275222246405745257275088548364400416034343698203859621231572472, + 21888242871839275222246405745257275088548364400416034343698203799231699946927, + 21888242871839275222246405745257275088548364400416034343698203848202858430467, + 462262161231329, + 25429779862071, + 21888242871839275222246405745257275088548364400416034343698203628364562553611, + 530566805757024, + 561930233648857, + 21888242871839275222246405745257275088548364400416034343698203849697143937238, + 21888242871839275222246405745257275088548364400416034343698204139786203315070, + 443235706789362, + 21888242871839275222246405745257275088548364400416034343698203850582994372819, + 277486503335081, + 21888242871839275222246405745257275088548364400416034343698204012799934811989, + 274704516830462, + 245787272002841, + 21888242871839275222246405745257275088548364400416034343698203703492239117712, + 21888242871839275222246405745257275088548364400416034343698204141989693108611, + 21888242871839275222246405745257275088548364400416034343698204071503153603046, + 281380291871222, + 21888242871839275222246405745257275088548364400416034343698203894100840989811, + 194827518302927, + 315812633067484, + 225070072468262, + 53811389113024, + 216118691771371, + 379718777185694, + 21888242871839275222246405745257275088548364400416034343698204033806504019410, + 21888242871839275222246405745257275088548364400416034343698204131105383089492, + 21888242871839275222246405745257275088548364400416034343698204090683144165305, + 397584491377428, + 21888242871839275222246405745257275088548364400416034343698203765503015424776, + 21888242871839275222246405745257275088548364400416034343698204181025886065576, + 443280445739891, + 201958936461652, + 21888242871839275222246405745257275088548364400416034343698203645164252783670, + 21888242871839275222246405745257275088548364400416034343698203878835724676922, + 508911457759542, + 28493770889747, + 21888242871839275222246405745257275088548364400416034343698203956025512317597, + 536223413902812, + 484793803315263, + 21888242871839275222246405745257275088548364400416034343698203824962814214170, + 95226853577719, + 370543100876084, + 21888242871839275222246405745257275088548364400416034343698203974455794702391, + 101046501822717, + 529584330325969, + 1798715453253, + 21888242871839275222246405745257275088548364400416034343698204161724671908404, + 260635810778080, + 21888242871839275222246405745257275088548364400416034343698203733103731138873, + 113916145480698, + 506555769419922, + 21888242871839275222246405745257275088548364400416034343698203911564763474922, + 527204581208628, + 21888242871839275222246405745257275088548364400416034343698203829330123868774, + 21888242871839275222246405745257275088548364400416034343698203681508319207364, + 37108581111096, + 458059159212393, + 245426483308080, + 208829494706155, + 157467886393194, + 284255435539767, + 115990071757284, + 80351224531704, + 21888242871839275222246405745257275088548364400416034343698203692768564289752, + 21888242871839275222246405745257275088548364400416034343698203674181326630904, + 21888242871839275222246405745257275088548364400416034343698204082376076839071, + 118850377682936, + 21888242871839275222246405745257275088548364400416034343698203931643463233342, + 246429140274942, + 123447308643300, + 21888242871839275222246405745257275088548364400416034343698203718504945883861, + 21888242871839275222246405745257275088548364400416034343698204181902406905587, + 287625792512435, + 21888242871839275222246405745257275088548364400416034343698203925572150961125, + 63759175202645, + 21888242871839275222246405745257275088548364400416034343698204055033467732521, + 21888242871839275222246405745257275088548364400416034343698204014605430528988, + 21888242871839275222246405745257275088548364400416034343698204016604743911581, + 21888242871839275222246405745257275088548364400416034343698204169741487126240, + 483583431205954, + 318322343627515, + 21888242871839275222246405745257275088548364400416034343698203773932615125542, + 21888242871839275222246405745257275088548364400416034343698203778301240233014, + 533103656987402, + 21888242871839275222246405745257275088548364400416034343698204118461333043956, + 367976422589150, + 21888242871839275222246405745257275088548364400416034343698203707637395459424, + 21888242871839275222246405745257275088548364400416034343698203788189818763908, + 151400376190747, + 410186007418875, + 21888242871839275222246405745257275088548364400416034343698203737097439370824, + 21888242871839275222246405745257275088548364400416034343698203687218601942438, + 212056171587516, + 37435260034787, + 556383364949209, + 138503393853695, + 469966810388805, + 21888242871839275222246405745257275088548364400416034343698204027107869543810, + 38930096443928, + 21888242871839275222246405745257275088548364400416034343698203654103785313009, + 389265652676541, + 362934328122594, + 211084290616846, + 21888242871839275222246405745257275088548364400416034343698203975117555485956, + 21888242871839275222246405745257275088548364400416034343698203680919559945559, + 21888242871839275222246405745257275088548364400416034343698204010546861566835, + 21888242871839275222246405745257275088548364400416034343698203800267102618153, + 21888242871839275222246405745257275088548364400416034343698203941357014461262, + 21888242871839275222246405745257275088548364400416034343698203939413071521119, + 21888242871839275222246405745257275088548364400416034343698204136126631435087, + 214687690857055, + 21888242871839275222246405745257275088548364400416034343698203676371340987786, + 180546052089905, + 191859004876471, + 41903709149352, + 543213907107629, + 142724119202238, + 21888242871839275222246405745257275088548364400416034343698203784792342406885, + 21888242871839275222246405745257275088548364400416034343698203666219332945074, + 21888242871839275222246405745257275088548364400416034343698203898292911228648, + 99847845247863, + 21888242871839275222246405745257275088548364400416034343698204030172052484359, + 21888242871839275222246405745257275088548364400416034343698203722508378989233, + 250802167698822, + 74093653550747, + 258208353953222, + 451634490949607, + 120492941006250, + 404160767720084, + 21888242871839275222246405745257275088548364400416034343698204144579169758546, + 21888242871839275222246405745257275088548364400416034343698203718863375117537, + 508957315561504, + 21888242871839275222246405745257275088548364400416034343698204061825433683146, + 185157633537910, + 21888242871839275222246405745257275088548364400416034343698203927401461634016, + 213012182295835, + 97410497993745, + 21888242871839275222246405745257275088548364400416034343698203899528766223752, + 21888242871839275222246405745257275088548364400416034343698203804283147350022, + 21888242871839275222246405745257275088548364400416034343698203755098577343881, + 523907452833335, + 21888242871839275222246405745257275088548364400416034343698204015154066296395, + 104679612585887, + 21888242871839275222246405745257275088548364400416034343698203769484987815531, + 246426290606602, + 482796544711173, + 282613590040403, + 21888242871839275222246405745257275088548364400416034343698203832711818416351, + 21888242871839275222246405745257275088548364400416034343698203870761301916862, + 453705138960298, + 21888242871839275222246405745257275088548364400416034343698203972859133736622, + 21888242871839275222246405745257275088548364400416034343698203736124681770890, + 21888242871839275222246405745257275088548364400416034343698204124285569333415, + 337562027204806, + 1670321764998, + 548992620435749, + 174944364857729, + 21888242871839275222246405745257275088548364400416034343698204024392319054661, + 21888242871839275222246405745257275088548364400416034343698204135777402836374, + 145084108977831, + 204996473650023, + 70020444410740, + 21888242871839275222246405745257275088548364400416034343698203654459443597553, + 426034382441834, + 21888242871839275222246405745257275088548364400416034343698203928919282407450, + 461353093078441, + 21888242871839275222246405745257275088548364400416034343698204029305715021102, + 407528216953638, + 349134524137687, + 21888242871839275222246405745257275088548364400416034343698203771786123120078, + 56747260836553, + 21888242871839275222246405745257275088548364400416034343698203868122069179577, + 220553106427567, + 21888242871839275222246405745257275088548364400416034343698203636365397278132, + 21888242871839275222246405745257275088548364400416034343698203793980774631496, + 150168665654927, + 21888242871839275222246405745257275088548364400416034343698203928301960745306, + 21888242871839275222246405745257275088548364400416034343698203747502646468131, + 21888242871839275222246405745257275088548364400416034343698203892313398533856, + 21888242871839275222246405745257275088548364400416034343698203853670973619027, + 178781049216143, + 322237543787865, + 21888242871839275222246405745257275088548364400416034343698204015844001408997, + 21888242871839275222246405745257275088548364400416034343698204079186517919952, + 21888242871839275222246405745257275088548364400416034343698203942883515939578, + 21888242871839275222246405745257275088548364400416034343698203943000044899084, + 21888242871839275222246405745257275088548364400416034343698204085458975407998, + 355125778753760, + 21888242871839275222246405745257275088548364400416034343698204132115050327039, + 547890167218985, + 21888242871839275222246405745257275088548364400416034343698204087169711236523, + 21888242871839275222246405745257275088548364400416034343698203834206513576729, + 284611511792414, + 109304035554937, + 270143578381825, + 21888242871839275222246405745257275088548364400416034343698203785384012196879, + 386537021962348, + 21888242871839275222246405745257275088548364400416034343698204160927413195627, + 246223007677121, + 472417434757158, + 445709081627978, + 59813859636174, + 154465822339798, + 21888242871839275222246405745257275088548364400416034343698203625642038271896, + 481326677522585, + 21888242871839275222246405745257275088548364400416034343698204001168419551763, + 386835123798147, + 21888242871839275222246405745257275088548364400416034343698204003143611036203, + 21888242871839275222246405745257275088548364400416034343698204061528236319226, + 21888242871839275222246405745257275088548364400416034343698203723192448775277, + 21888242871839275222246405745257275088548364400416034343698203920513925654441, + 21888242871839275222246405745257275088548364400416034343698204161832925138605, + 21888242871839275222246405745257275088548364400416034343698204092343666640537, + 444033090899653, + 29218839272980, + 21888242871839275222246405745257275088548364400416034343698204010985790219149, + 21888242871839275222246405745257275088548364400416034343698204084044929174130, + 21888242871839275222246405745257275088548364400416034343698204017903254070674, + 21888242871839275222246405745257275088548364400416034343698203697153471359517, + 62758576212680, + 506385299322735, + 21888242871839275222246405745257275088548364400416034343698203826390616930198, + 323459118049615, + 271419860507966, + 21888242871839275222246405745257275088548364400416034343698203713464760906927, + 537538958463748, + 21888242871839275222246405745257275088548364400416034343698203937969333743148, + 21888242871839275222246405745257275088548364400416034343698203909527319142108, + 21888242871839275222246405745257275088548364400416034343698203854069577505847, + 284315143834849, + 21888242871839275222246405745257275088548364400416034343698203964619965681516, + 194357495061641, + 21888242871839275222246405745257275088548364400416034343698204186151516862881, + 92055742785513, + 498422674836730, + 477413961167177, + 21888242871839275222246405745257275088548364400416034343698203657068386851642, + 21888242871839275222246405745257275088548364400416034343698203723643637753989, + 21888242871839275222246405745257275088548364400416034343698204082849647782814, + 21888242871839275222246405745257275088548364400416034343698204008719083330129, + 21888242871839275222246405745257275088548364400416034343698203716522264847665, + 21888242871839275222246405745257275088548364400416034343698204043338773361020, + 471313000970637, + 458531387497214, + 561945993180117, + 467709520114574, + 21888242871839275222246405745257275088548364400416034343698203852472569130913, + 406481150513777, + 21888242871839275222246405745257275088548364400416034343698203767655395141918, + 132000918124308, + 21888242871839275222246405745257275088548364400416034343698204186397260215869, + 172182267278371, + 22660650427686, + 267148243873858, + 21888242871839275222246405745257275088548364400416034343698203645590998776674, + 496688880629660, + 369425010378861, + 493136330274330, + 496878801781196, + 386186739081455, + 207921772931413, + 344473348083897, + 21888242871839275222246405745257275088548364400416034343698203980594961750453, + 345295237561513, + 106349183565799, + 229858067988035, + 191879714111510, + 21888242871839275222246405745257275088548364400416034343698203892700053500401, + 484427176534172, + 524267349594811, + 13973808599628, + 557199195590504, + 21888242871839275222246405745257275088548364400416034343698203934139781125545, + 447229805876762, + 196952012886853, + 21888242871839275222246405745257275088548364400416034343698203763979776727389, + 247516087199818, + 500710328602857, + 365195045086293, + 152817850008550, + 398538169409714, + 21888242871839275222246405745257275088548364400416034343698203995323745611634, + 212234333890326, + 21888242871839275222246405745257275088548364400416034343698203894110651624504, + 21888242871839275222246405745257275088548364400416034343698204123834479781601, + 21888242871839275222246405745257275088548364400416034343698203902364187071553, + 21888242871839275222246405745257275088548364400416034343698203969169551794562, + 21888242871839275222246405745257275088548364400416034343698203919100168037870, + 444307706641484, + 206031359651732, + 73091240197627, + 142577021121997, + 253931067590372, + 398808254298753, + 21888242871839275222246405745257275088548364400416034343698203818390379734099, + 21888242871839275222246405745257275088548364400416034343698203822711133850613, + 391819916518345, + 319648912050227, + 378467523009174, + 277972355418171, + 199311583759606, + 549009249284273, + 21888242871839275222246405745257275088548364400416034343698203960690963731953, + 21888242871839275222246405745257275088548364400416034343698204084649257145097, + 418148584686205, + 21888242871839275222246405745257275088548364400416034343698203756547025127363, + 21888242871839275222246405745257275088548364400416034343698203804995507597005, + 212249642843886, + 21888242871839275222246405745257275088548364400416034343698203953111517091454, + 21888242871839275222246405745257275088548364400416034343698203963462517567968, + 21888242871839275222246405745257275088548364400416034343698204063910781433850, + 467019664076938, + 21888242871839275222246405745257275088548364400416034343698204026075319517376, + 21888242871839275222246405745257275088548364400416034343698203761587683877720, + 327484894063521, + 48250108529156, + 21888242871839275222246405745257275088548364400416034343698203631934628303799, + 21888242871839275222246405745257275088548364400416034343698203890436916361745, + 21888242871839275222246405745257275088548364400416034343698204159114623340875, + 21888242871839275222246405745257275088548364400416034343698204169421686013866, + 21888242871839275222246405745257275088548364400416034343698203951777188437573, + 416640326075753, + 21888242871839275222246405745257275088548364400416034343698203722953461228864, + 21888242871839275222246405745257275088548364400416034343698203850819215099542, + 21888242871839275222246405745257275088548364400416034343698203740303732115514, + 21888242871839275222246405745257275088548364400416034343698203954272054985356, + 21888242871839275222246405745257275088548364400416034343698203698101381492898, + 21888242871839275222246405745257275088548364400416034343698204087221708354961, + 234907143418737, + 158525565520260, + 21888242871839275222246405745257275088548364400416034343698203862628805321072, + 275517295454791, + 360280506259971, + 21888242871839275222246405745257275088548364400416034343698204164510298429629, + 21888242871839275222246405745257275088548364400416034343698203679829632905853, + 21888242871839275222246405745257275088548364400416034343698204037807563382603, + 21888242871839275222246405745257275088548364400416034343698204056051178717947, + 162564274159092, + 21888242871839275222246405745257275088548364400416034343698203833909142307351, + 364079625381471, + 187542442802456, + 21888242871839275222246405745257275088548364400416034343698203927440249058750, + 379021063970009, + 256433525188430, + 415849683996857, + 128683492302502, + 21888242871839275222246405745257275088548364400416034343698204178123788424252, + 171997261720042, + 21888242871839275222246405745257275088548364400416034343698203775703574607759, + 192999691136247, + 21888242871839275222246405745257275088548364400416034343698203743698001729890, + 21888242871839275222246405745257275088548364400416034343698203674289940566586, + 21888242871839275222246405745257275088548364400416034343698203675108464554392, + 266418623534303, + 21888242871839275222246405745257275088548364400416034343698203674250690503415, + 21888242871839275222246405745257275088548364400416034343698204015865128356323, + 485237321927449, + 21888242871839275222246405745257275088548364400416034343698203689313936686636, + 21888242871839275222246405745257275088548364400416034343698203926685993379065, + 186925078215438, + 21888242871839275222246405745257275088548364400416034343698203987536879333733, + 21888242871839275222246405745257275088548364400416034343698203769010208073996, + 21888242871839275222246405745257275088548364400416034343698203794983386415154, + 213449993348520, + 279352481528032, + 419851298687820, + 55911701928307, + 21888242871839275222246405745257275088548364400416034343698203951060376014644, + 229214223455104, + 298942075742392, + 21888242871839275222246405745257275088548364400416034343698204182743698146639, + 342471470310026, + 21888242871839275222246405745257275088548364400416034343698203756267533210598, + 21888242871839275222246405745257275088548364400416034343698203712221358947750, + 21888242871839275222246405745257275088548364400416034343698203900375133167562, + 277548391935298, + 21888242871839275222246405745257275088548364400416034343698203626546854557790, + 21888242871839275222246405745257275088548364400416034343698203710045955498566, + 21888242871839275222246405745257275088548364400416034343698204150843312075168, + 470880447937329, + 225522274375410, + 447037491008517, + 193789674532361, + 21888242871839275222246405745257275088548364400416034343698203985827877933103, + 533407362223159, + 21888242871839275222246405745257275088548364400416034343698203995925973156951, + 21888242871839275222246405745257275088548364400416034343698203833880662770464, + 251659651841085, + 21888242871839275222246405745257275088548364400416034343698204096106569119535, + 21888242871839275222246405745257275088548364400416034343698204186191341180922, + 443681873683672, + 416187546640151, + 155259675141615, + 488465255330202, + 21888242871839275222246405745257275088548364400416034343698203792320738959623, + 21888242871839275222246405745257275088548364400416034343698203947422991247324, + 21888242871839275222246405745257275088548364400416034343698203650852739157080, + 21888242871839275222246405745257275088548364400416034343698203689935839618043, + 452055357925068, + 395863145233205, + 21888242871839275222246405745257275088548364400416034343698203684178527652105, + 215266050568593, + 21888242871839275222246405745257275088548364400416034343698203938118823805725, + 257689814333048, + 21888242871839275222246405745257275088548364400416034343698204102277693032914, + 21888242871839275222246405745257275088548364400416034343698203906270643539534, + 88086552790517, + 87785574102410, + 460249607103604, + 190834406896361, + 21888242871839275222246405745257275088548364400416034343698203869754440574407, + 252097149711254, + 21888242871839275222246405745257275088548364400416034343698203975055172948279, + 552166359366982, + 21888242871839275222246405745257275088548364400416034343698203899183773185690, + 21888242871839275222246405745257275088548364400416034343698203841003724779238, + 409928244965100, + 21888242871839275222246405745257275088548364400416034343698203662967568454352, + 250558004742946, + 21888242871839275222246405745257275088548364400416034343698204085203989906861, + 192960894379212, + 487834624476378, + 21888242871839275222246405745257275088548364400416034343698203625704813733051, + 21888242871839275222246405745257275088548364400416034343698204035139009370433, + 21888242871839275222246405745257275088548364400416034343698203976921971732217, + 21888242871839275222246405745257275088548364400416034343698203728614063796056, + 76459430941660, + 191999574060485, + 415334640765148, + 21888242871839275222246405745257275088548364400416034343698203634302595391150, + 21888242871839275222246405745257275088548364400416034343698203699365015926015, + 21888242871839275222246405745257275088548364400416034343698203885148754150844, + 21888242871839275222246405745257275088548364400416034343698203889210696094438, + 21888242871839275222246405745257275088548364400416034343698203869865080795691, + 21888242871839275222246405745257275088548364400416034343698203790967346429886, + 120641854961274, + 482247954637987, + 21888242871839275222246405745257275088548364400416034343698203853701729358794, + 183747359868939, + 21888242871839275222246405745257275088548364400416034343698204083934412211465, + 398505152033063, + 38393794866868, + 21888242871839275222246405745257275088548364400416034343698203734532525816632, + 21888242871839275222246405745257275088548364400416034343698203819575321785487, + 161440466484477, + 390103270719968, + 21888242871839275222246405745257275088548364400416034343698203815818577181583, + 21888242871839275222246405745257275088548364400416034343698204028396608504771, + 21888242871839275222246405745257275088548364400416034343698203724081322176140, + 21888242871839275222246405745257275088548364400416034343698203737174399127165, + 6813289112550, + 349974018943447, + 428446521817659, + 21888242871839275222246405745257275088548364400416034343698204152282324397788, + 21888242871839275222246405745257275088548364400416034343698204060709372861188, + 21888242871839275222246405745257275088548364400416034343698203683143365546226, + 35516387436765, + 412310734894313, + 35781666503441, + 179384632534262, + 283635014985796, + 21888242871839275222246405745257275088548364400416034343698203992509283764454, + 531410132787530, + 367275214431370, + 321274854978147, + 21888242871839275222246405745257275088548364400416034343698203652707701625859, + 106079651987015, + 361638384176179, + 21888242871839275222246405745257275088548364400416034343698203928811841447152, + 21888242871839275222246405745257275088548364400416034343698204028687269425803, + 21888242871839275222246405745257275088548364400416034343698203975039443018388, + 21888242871839275222246405745257275088548364400416034343698203916599652076609, + 67573658606186, + 523555091250660, + 21888242871839275222246405745257275088548364400416034343698203713625717151268, + 485918563774276, + 21888242871839275222246405745257275088548364400416034343698203928094157289652, + 21888242871839275222246405745257275088548364400416034343698203721082378225920, + 350467207052281, + 402208368605512, + 21888242871839275222246405745257275088548364400416034343698204162067071376442, + 323304317103695, + 21888242871839275222246405745257275088548364400416034343698204016554757675432, + 21888242871839275222246405745257275088548364400416034343698203644348608917770, + 150650783656648, + 53563555328858, + 21888242871839275222246405745257275088548364400416034343698203804496650905987, + 92231924128140, + 338279185226384, + 505198186294355, + 21888242871839275222246405745257275088548364400416034343698204080826064353703, + 197779383763953, + 21888242871839275222246405745257275088548364400416034343698203918107908233446, + 364647191105162, + 21888242871839275222246405745257275088548364400416034343698203870187062731413, + 117666191919085, + 466654720634648, + 21888242871839275222246405745257275088548364400416034343698204056164488516097, + 21888242871839275222246405745257275088548364400416034343698204100363033472685, + 21888242871839275222246405745257275088548364400416034343698203710188887736639, + 189700055813946, + 210172942175746, + 282777802962392, + 527425286424793, + 21888242871839275222246405745257275088548364400416034343698204030874712829220, + 21888242871839275222246405745257275088548364400416034343698203694564771662175, + 559079852574, + 21888242871839275222246405745257275088548364400416034343698204105984907301959, + 236230685226867, + 21888242871839275222246405745257275088548364400416034343698203981552391393136, + 49870560959007, + 207280854097597, + 201210651860124, + 116063562501623, + 374526729567005, + 21888242871839275222246405745257275088548364400416034343698203922454979550780, + 21757395658763, + 91088867969902, + 551156366052029, + 349205744850281, + 21888242871839275222246405745257275088548364400416034343698204164756866492288, + 453446802312251, + 21888242871839275222246405745257275088548364400416034343698204043049103363521, + 418874280433885, + 448938271825080, + 21888242871839275222246405745257275088548364400416034343698204143444556573211, + 404602534067362, + 21888242871839275222246405745257275088548364400416034343698204086956613897126, + 489855838908428, + 21888242871839275222246405745257275088548364400416034343698204141155859004594, + 537051493219198, + 21888242871839275222246405745257275088548364400416034343698203667555204357914, + 534325266440990, + 138333995724636, + 182532689754650, + 21888242871839275222246405745257275088548364400416034343698203699566807820770, + 21888242871839275222246405745257275088548364400416034343698204027699061739380, + 79145881326903, + 21888242871839275222246405745257275088548364400416034343698203709153371001758, + 21888242871839275222246405745257275088548364400416034343698203917294384086069, + 4390090748462, + 170544564189479, + 21888242871839275222246405745257275088548364400416034343698203949689467106721, + 430320474288406, + 21888242871839275222246405745257275088548364400416034343698204085013451710150, + 209279117962233, + 38838580664929, + 21888242871839275222246405745257275088548364400416034343698203949768759782189, + 21888242871839275222246405745257275088548364400416034343698203938959804547918, + 21888242871839275222246405745257275088548364400416034343698204127808734770559, + 21888242871839275222246405745257275088548364400416034343698203779922149267471, + 21888242871839275222246405745257275088548364400416034343698204046108564601402, + 344352843503292, + 562667727153351, + 433817721615608, + 344700041658797, + 105113362884165, + 21888242871839275222246405745257275088548364400416034343698203761484843281719, + 21888242871839275222246405745257275088548364400416034343698203934295534279589, + 21888242871839275222246405745257275088548364400416034343698203806664597639088, + 21888242871839275222246405745257275088548364400416034343698203974118027370395, + 21888242871839275222246405745257275088548364400416034343698203743173499031122, + 538613510005441, + 21888242871839275222246405745257275088548364400416034343698203699905144651283, + 277534584980239, + 431363685758883, + 278435257614277, + 21888242871839275222246405745257275088548364400416034343698203653367284337412, + 21888242871839275222246405745257275088548364400416034343698203805911751954832, + 21888242871839275222246405745257275088548364400416034343698203847766097762559, + 21888242871839275222246405745257275088548364400416034343698203809912218812719, + 21888242871839275222246405745257275088548364400416034343698203680726110596643, + 76704316909972, + 454742545871036, + 557704034799501, + 21888242871839275222246405745257275088548364400416034343698204185804667127510, + 404740211755346, + 34809563355788, + 21888242871839275222246405745257275088548364400416034343698203813599894243068, + 403340539308504, + 21888242871839275222246405745257275088548364400416034343698204088392933658572, + 21888242871839275222246405745257275088548364400416034343698204059252600319047, + 459263902915092, + 318935148257783, + 253427523045786, + 21888242871839275222246405745257275088548364400416034343698204141421675353659, + 21888242871839275222246405745257275088548364400416034343698203945034248692363, + 369264996886459, + 59726299822780, + 126073975318146, + 328151272136991, + 21888242871839275222246405745257275088548364400416034343698203904703972295468, + 21888242871839275222246405745257275088548364400416034343698203819293399242596, + 310532957126625, + 421184008975653, + 177218579438640, + 153419543952275, + 211654210567830, + 24317923897898, + 498895982730087, + 253508669540422, + 59001273536213, + 21888242871839275222246405745257275088548364400416034343698203825982231989020, + 21888242871839275222246405745257275088548364400416034343698203970919734802994, + 992720696555, + 90028012947555, + 452553193488439, + 21888242871839275222246405745257275088548364400416034343698203669802284766497, + 303935423750794, + 21888242871839275222246405745257275088548364400416034343698204047788623747041, + 21888242871839275222246405745257275088548364400416034343698203682063639049079, + 325213448469108, + 314921145443948, + 21888242871839275222246405745257275088548364400416034343698203713101507704625, + 171485982758690, + 415184748613626, + 149310856295267, + 21888242871839275222246405745257275088548364400416034343698204148776979868112, + 21888242871839275222246405745257275088548364400416034343698203822303042874441, + 21888242871839275222246405745257275088548364400416034343698204130626533402716, + 21888242871839275222246405745257275088548364400416034343698203762923834676319, + 156893759924056, + 111169384302733, + 21888242871839275222246405745257275088548364400416034343698203681383328526496, + 21888242871839275222246405745257275088548364400416034343698203696358128043922, + 21888242871839275222246405745257275088548364400416034343698203799570596713254, + 21888242871839275222246405745257275088548364400416034343698204073266070022783, + 21888242871839275222246405745257275088548364400416034343698204065857153502543, + 21888242871839275222246405745257275088548364400416034343698204134325403705927, + 21888242871839275222246405745257275088548364400416034343698203859766450694082, + 383584211118497, + 174890556326944, + 415399708266396, + 21888242871839275222246405745257275088548364400416034343698203672913073909238, + 21888242871839275222246405745257275088548364400416034343698204130381737424446, + 312470398442856, + 229351338506615, + 194671708381818, + 538900018676880, + 21888242871839275222246405745257275088548364400416034343698204154545979582360, + 242798956291299, + 456378599401773, + 374481342532818, + 231997367423704, + 6167063998279, + 158601951832614, + 21888242871839275222246405745257275088548364400416034343698203722750443990305, + 21888242871839275222246405745257275088548364400416034343698204160351173611327, + 21888242871839275222246405745257275088548364400416034343698204144173578258336, + 264640482243868, + 355315230364945, + 19717283771422, + 319827562683654, + 411836713300036, + 21888242871839275222246405745257275088548364400416034343698203667623855351893, + 301923909076539, + 21888242871839275222246405745257275088548364400416034343698203724985500211074, + 41494310532620, + 21888242871839275222246405745257275088548364400416034343698203834825251736661, + 21888242871839275222246405745257275088548364400416034343698203806072089214903, + 97851721012857, + 21888242871839275222246405745257275088548364400416034343698203788919055375985, + 21888242871839275222246405745257275088548364400416034343698203831934347498570, + 21888242871839275222246405745257275088548364400416034343698203739619148367875, + 21888242871839275222246405745257275088548364400416034343698203624221793307946, + 21888242871839275222246405745257275088548364400416034343698203878548588562905, + 111878958076094, + 461244378391542, + 21888242871839275222246405745257275088548364400416034343698203875392387192977, + 94238284855726, + 21888242871839275222246405745257275088548364400416034343698203936862343631093, + 21888242871839275222246405745257275088548364400416034343698204054106644255687, + 287347891971571, + 169035411105034, + 21888242871839275222246405745257275088548364400416034343698203867582763281167, + 21888242871839275222246405745257275088548364400416034343698204147622600513043, + 21888242871839275222246405745257275088548364400416034343698203640696795007818, + 21888242871839275222246405745257275088548364400416034343698204169445379576044, + 21888242871839275222246405745257275088548364400416034343698203987336149162884, + 560864458732945, + 351165926325691, + 342776725495356, + 88664532454515, + 502393256202954, + 199438477719493, + 21888242871839275222246405745257275088548364400416034343698203911613705274961, + 21888242871839275222246405745257275088548364400416034343698203777848638537478, + 21888242871839275222246405745257275088548364400416034343698203835009389215739, + 227627433717954, + 21888242871839275222246405745257275088548364400416034343698204182545566483524, + 21888242871839275222246405745257275088548364400416034343698203984737018868610, + 242864000703704, + 21888242871839275222246405745257275088548364400416034343698203752440769599514, + 21888242871839275222246405745257275088548364400416034343698203665194109769025, + 471679247071751, + 21888242871839275222246405745257275088548364400416034343698203991782895429404, + 21888242871839275222246405745257275088548364400416034343698203907549691071704, + 31406234868238, + 21888242871839275222246405745257275088548364400416034343698203676185274461407, + 21888242871839275222246405745257275088548364400416034343698203999391507237645, + 38955974712426, + 21888242871839275222246405745257275088548364400416034343698203639948422976013, + 21888242871839275222246405745257275088548364400416034343698203746446551977148, + 93279415679337, + 21888242871839275222246405745257275088548364400416034343698204083000739167856, + 11370560770880, + 21888242871839275222246405745257275088548364400416034343698203783959234647137, + 21888242871839275222246405745257275088548364400416034343698204001318980389832, + 21888242871839275222246405745257275088548364400416034343698204167129267846897, + 221135028278654, + 483512343762322, + 21888242871839275222246405745257275088548364400416034343698203677970502783843, + 32368799000722, + 21888242871839275222246405745257275088548364400416034343698204049654588500478, + 221813491033845, + 518632290111154, + 21888242871839275222246405745257275088548364400416034343698204160234509342490, + 223649989921568, + 21888242871839275222246405745257275088548364400416034343698204024518852854801, + 21888242871839275222246405745257275088548364400416034343698204016605823910721, + 21888242871839275222246405745257275088548364400416034343698204068007131279023, + 296796987137806, + 139455340146969, + 96885190952919, + 21888242871839275222246405745257275088548364400416034343698204047912558729790, + 285282863636110, + 406633859134882, + 21888242871839275222246405745257275088548364400416034343698203661636580531079, + 21888242871839275222246405745257275088548364400416034343698204166692002692583, + 555310750448097, + 222236752123638, + 418416823120770, + 429320492454595, + 176402299655620, + 206847165594963, + 519519718157682, + 39278343428092, + 180767554025208, + 432741464119574, + 340592340427058, + 360280477861485, + 21888242871839275222246405745257275088548364400416034343698203977688819401526, + 21346526224630, + 433966291259212, + 556266237942760, + 21888242871839275222246405745257275088548364400416034343698204052828652425144, + 49792082101473, + 21888242871839275222246405745257275088548364400416034343698203669672830222451, + 21888242871839275222246405745257275088548364400416034343698203858607690846879, + 21888242871839275222246405745257275088548364400416034343698204027577553143745, + 561922454135852, + 21888242871839275222246405745257275088548364400416034343698203714513331597197, + 21888242871839275222246405745257275088548364400416034343698203676126839426678, + 161931574025805, + 340603872220274, + 506130825071214, + 234989052809302, + 21888242871839275222246405745257275088548364400416034343698203660710318231591, + 21888242871839275222246405745257275088548364400416034343698203925798769190583, + 21888242871839275222246405745257275088548364400416034343698204130405844759814, + 21888242871839275222246405745257275088548364400416034343698203995461059401203, + 386222100535515, + 21888242871839275222246405745257275088548364400416034343698203994408937526198, + 381971543984521, + 21888242871839275222246405745257275088548364400416034343698203937896415315081, + 21888242871839275222246405745257275088548364400416034343698203923012952195031, + 21888242871839275222246405745257275088548364400416034343698204043599946934059, + 266562086333395, + 164839498380940, + 540776668034651, + 21888242871839275222246405745257275088548364400416034343698204123748701310652, + 255139651329744, + 345476675658145, + 21888242871839275222246405745257275088548364400416034343698203963421356460480, + 353274052293111, + 21888242871839275222246405745257275088548364400416034343698203967620787913161, + 270066067695894, + 21888242871839275222246405745257275088548364400416034343698204123799429876683, + 21888242871839275222246405745257275088548364400416034343698203880403774310778, + 21888242871839275222246405745257275088548364400416034343698203803683888946725, + 21888242871839275222246405745257275088548364400416034343698203929288741337485, + 21888242871839275222246405745257275088548364400416034343698203717218558425641, + 483396245663922, + 156445766857814, + 295873334224341, + 172254903205144, + 21888242871839275222246405745257275088548364400416034343698203950613286972372, + 336440110285612, + 21888242871839275222246405745257275088548364400416034343698203720624370439284, + 414048956384075, + 248895822071124, + 498557621790886, + 62691201810493, + 72176624090085, + 21888242871839275222246405745257275088548364400416034343698203929546522339861, + 14150919865231, + 208419476017943, + 21888242871839275222246405745257275088548364400416034343698204086488639908348, + 21888242871839275222246405745257275088548364400416034343698203971508307031808, + 255439917607570, + 21888242871839275222246405745257275088548364400416034343698203714067415657264, + 552503928637079, + 369879032608009, + 499445034465226, + 21888242871839275222246405745257275088548364400416034343698204094702947745718, + 21888242871839275222246405745257275088548364400416034343698203677770609369810, + 119363023614554, + 21888242871839275222246405745257275088548364400416034343698203870849377194098, + 166794472302342, + 247474655859964, + 525605469903061, + 56190871620785, + 125597313104630, + 331876098141920, + 21888242871839275222246405745257275088548364400416034343698203864676655786914, + 21888242871839275222246405745257275088548364400416034343698203801798727533798, + 21888242871839275222246405745257275088548364400416034343698204052210981084785, + 21888242871839275222246405745257275088548364400416034343698204157048241103133, + 21888242871839275222246405745257275088548364400416034343698203955965495460215, + 21888242871839275222246405745257275088548364400416034343698203875147091624930, + 21888242871839275222246405745257275088548364400416034343698203699789272865240, + 21888242871839275222246405745257275088548364400416034343698203813799354299103, + 378245853572311, + 21888242871839275222246405745257275088548364400416034343698204029820230214049, + 210123626281729, + 386015580652458, + 21888242871839275222246405745257275088548364400416034343698204043994152681316, + 21888242871839275222246405745257275088548364400416034343698203900737112739104, + 236542768710226, + 548600033932867, + 160938795431179, + 21888242871839275222246405745257275088548364400416034343698204115008563017622, + 110645186815765, + 176901214958432, + 222456854423248, + 21888242871839275222246405745257275088548364400416034343698204165611364960068, + 21888242871839275222246405745257275088548364400416034343698203999554608139017, + 19457985058, + 21888242871839275222246405745257275088548364400416034343698203802225005047512, + 21888242871839275222246405745257275088548364400416034343698203652702561887289, + 454089158522117, + 21888242871839275222246405745257275088548364400416034343698204012682745075377, + 81242727642426, + 294384994523090, + 220513669418609, + 21888242871839275222246405745257275088548364400416034343698203923679541008384, + 373054265197395, + 21888242871839275222246405745257275088548364400416034343698203875436023557704, + 21888242871839275222246405745257275088548364400416034343698203842938366583139, + 21888242871839275222246405745257275088548364400416034343698204045966132436979, + 21888242871839275222246405745257275088548364400416034343698203784389546069629, + 311998227393338, + 21888242871839275222246405745257275088548364400416034343698203670493725767114, + 300661761003314, + 395904128441032, + 224653450247770, + 352804381001510, + 21888242871839275222246405745257275088548364400416034343698203926500284451140, + 21888242871839275222246405745257275088548364400416034343698203927406448993704, + 89973998950357, + 508748546361757, + 21888242871839275222246405745257275088548364400416034343698203738057340493031, + 21888242871839275222246405745257275088548364400416034343698203852384656051785, + 21888242871839275222246405745257275088548364400416034343698203844266432861347, + 17702034066540, + 516602318042558, + 21888242871839275222246405745257275088548364400416034343698203681729792225157, + 21888242871839275222246405745257275088548364400416034343698203746709500893381, + 21888242871839275222246405745257275088548364400416034343698203961399979320538, + 21888242871839275222246405745257275088548364400416034343698204072607213558658, + 282594268742941, + 21888242871839275222246405745257275088548364400416034343698203741499692398095, + 21888242871839275222246405745257275088548364400416034343698203794621633384282, + 22597983866120, + 423538167031088, + 21888242871839275222246405745257275088548364400416034343698203805043112940642, + 508243458349601, + 66813062133553, + 314415627057304, + 326364982372825, + 353361229644683, + 2242895065046, + 119873534899135, + 299588660563530, + 522340878072362, + 195448764567857, + 387663043465492, + 423408639629099, + 21888242871839275222246405745257275088548364400416034343698204092257655360194, + 21888242871839275222246405745257275088548364400416034343698204102058381378567, + 21888242871839275222246405745257275088548364400416034343698203777459608912537, + 21888242871839275222246405745257275088548364400416034343698203961861129523129, + 184465745455104, + 167349490527143, + 48122892856342, + 229119629435029, + 260182774525011, + 21888242871839275222246405745257275088548364400416034343698204075667749690042, + 187758334190125, + 21888242871839275222246405745257275088548364400416034343698203791674622805063, + 349060305765396, + 21888242871839275222246405745257275088548364400416034343698204045904657589598, + 335098475272897, + 72854709529273, + 21888242871839275222246405745257275088548364400416034343698203836159848803010, + 339583746968277, + 21888242871839275222246405745257275088548364400416034343698204158352167879023, + 508802828516644, + 228490560462875, + 516723254008816, + 482548561201625, + 353407162130046, + 21888242871839275222246405745257275088548364400416034343698204008790857158684, + 186957209514784, + 21888242871839275222246405745257275088548364400416034343698204024448095344218, + 21888242871839275222246405745257275088548364400416034343698204143325366483268, + 21888242871839275222246405745257275088548364400416034343698204080610538624987, + 21888242871839275222246405745257275088548364400416034343698204112952069225563, + 125650838018497, + 479037600252483, + 276169200923681, + 491553543948790, + 550011924468424, + 21888242871839275222246405745257275088548364400416034343698203712521865493323, + 21888242871839275222246405745257275088548364400416034343698204045462627902384, + 21888242871839275222246405745257275088548364400416034343698203965919580809641, + 21888242871839275222246405745257275088548364400416034343698203874350020120564, + 369762855188304, + 453943533249038, + 21888242871839275222246405745257275088548364400416034343698203836673194897460, + 315191514912215, + 21888242871839275222246405745257275088548364400416034343698203873961035123426, + 21888242871839275222246405745257275088548364400416034343698203802397740918896, + 381858035331579, + 425393124189747, + 287832765689738, + 21888242871839275222246405745257275088548364400416034343698204143707909369974, + 21888242871839275222246405745257275088548364400416034343698203710236120884599, + 220147589986358, + 21888242871839275222246405745257275088548364400416034343698203674071789926555, + 275766411605163, + 276279233022262, + 21888242871839275222246405745257275088548364400416034343698203633514087291220, + 330482903639609, + 21888242871839275222246405745257275088548364400416034343698203748659592414610, + 526596175340964, + 326567629590376, + 21888242871839275222246405745257275088548364400416034343698203861672392575488, + 21888242871839275222246405745257275088548364400416034343698203798757695239659, + 21888242871839275222246405745257275088548364400416034343698203652418843255463, + 414537871073700, + 530731197648523, + 49724657722822, + 508942010293338, + 21888242871839275222246405745257275088548364400416034343698203931043545567182, + 358833322771000, + 270836092082433, + 390948003629878, + 21888242871839275222246405745257275088548364400416034343698203713159235253635, + 59516515583021, + 21888242871839275222246405745257275088548364400416034343698203881155810534778, + 21888242871839275222246405745257275088548364400416034343698204134755711526673, + 21888242871839275222246405745257275088548364400416034343698203698683918884544, + 255020613127575, + 21888242871839275222246405745257275088548364400416034343698203670050088826481, + 102791180992875, + 21888242871839275222246405745257275088548364400416034343698203918897186306857, + 21888242871839275222246405745257275088548364400416034343698203956037931079339, + 21888242871839275222246405745257275088548364400416034343698203853257993590434, + 221297727253553, + 409949931549258, + 21888242871839275222246405745257275088548364400416034343698203686300634760963, + 186883294508882, + 21888242871839275222246405745257275088548364400416034343698203982275127558371, + 84361511095250, + 494058500180252, + 99907072115858, + 21888242871839275222246405745257275088548364400416034343698204100323233373221, + 21888242871839275222246405745257275088548364400416034343698203856000204243623, + 21888242871839275222246405745257275088548364400416034343698204085292001617671, + 21888242871839275222246405745257275088548364400416034343698203997545237359999, + 37899150944964, + 21888242871839275222246405745257275088548364400416034343698204060553647076851, + 398138573898956, + 157343425888905, + 21888242871839275222246405745257275088548364400416034343698203900484386636339, + 21888242871839275222246405745257275088548364400416034343698203699492844219111, + 72147308733531, + 21888242871839275222246405745257275088548364400416034343698204145486237262068, + 21888242871839275222246405745257275088548364400416034343698203883755756367426, + 21888242871839275222246405745257275088548364400416034343698203745529177724349, + 34574421868533, + 21888242871839275222246405745257275088548364400416034343698203648592105559576, + 21888242871839275222246405745257275088548364400416034343698204149114033730533, + 176019659921659, + 478655356949676, + 316087473708092, + 21888242871839275222246405745257275088548364400416034343698203669900755130924, + 350924404205618, + 491243465897373, + 21888242871839275222246405745257275088548364400416034343698203930194894010889, + 482248169556402, + 188893546387445, + 21888242871839275222246405745257275088548364400416034343698204123320399232899, + 21888242871839275222246405745257275088548364400416034343698203989932238745882, + 21888242871839275222246405745257275088548364400416034343698203865699055897477, + 293421076483469, + 21888242871839275222246405745257275088548364400416034343698204060444630565624, + 21888242871839275222246405745257275088548364400416034343698203998598656200815, + 222015645059892, + 21888242871839275222246405745257275088548364400416034343698203653313090012517, + 266044875785736, + 21888242871839275222246405745257275088548364400416034343698203736610496639648, + 327911213296762, + 545167842919383, + 489275826455373, + 21888242871839275222246405745257275088548364400416034343698203623728627196323, + 287794540763525, + 21888242871839275222246405745257275088548364400416034343698204097610520546168, + 90556101257900, + 21888242871839275222246405745257275088548364400416034343698203648980242854801, + 143183106213792, + 21888242871839275222246405745257275088548364400416034343698203856898509194084, + 342845072741394, + 51049337180471, + 21888242871839275222246405745257275088548364400416034343698203685547817212957, + 28867640365412, + 21888242871839275222246405745257275088548364400416034343698203713713064070916, + 21888242871839275222246405745257275088548364400416034343698203686034401939020, + 309724886163412, + 53682375721122, + 21888242871839275222246405745257275088548364400416034343698204136802798014675, + 21888242871839275222246405745257275088548364400416034343698203885491748859633, + 513711314380492, + 46680342006205, + 21888242871839275222246405745257275088548364400416034343698203892024227332362, + 21888242871839275222246405745257275088548364400416034343698204166065985017776, + 287282297580502, + 460473252968460, + 310328142541275, + 285836862110318, + 21888242871839275222246405745257275088548364400416034343698203717711535350401, + 192695337829773, + 300067115207227, + 112304626310585, + 21888242871839275222246405745257275088548364400416034343698203846477239441389, + 286455922263687, + 21888242871839275222246405745257275088548364400416034343698204058186616275268, + 21888242871839275222246405745257275088548364400416034343698204030170492530621, + 549899483171999, + 21888242871839275222246405745257275088548364400416034343698203781958607888249, + 21888242871839275222246405745257275088548364400416034343698203634852030472740, + 178244278425656, + 250192857605702, + 206927078788947, + 44748090135259, + 102909395066037, + 254853272284, + 21888242871839275222246405745257275088548364400416034343698203889406125035518, + 21888242871839275222246405745257275088548364400416034343698203956910733302920, + 423478951539774, + 287109870482933, + 21888242871839275222246405745257275088548364400416034343698204154671862114233, + 21888242871839275222246405745257275088548364400416034343698203815212149164826, + 21888242871839275222246405745257275088548364400416034343698203961513998592498, + 21888242871839275222246405745257275088548364400416034343698203855826897328877, + 362219027552568, + 21888242871839275222246405745257275088548364400416034343698203943247614130908, + 91397825647846, + 3345685230973, + 21888242871839275222246405745257275088548364400416034343698203703574864370997, + 21888242871839275222246405745257275088548364400416034343698203787534681715583, + 21888242871839275222246405745257275088548364400416034343698203653709388721915, + 286184414653919, + 21888242871839275222246405745257275088548364400416034343698203924829204079163, + 198877835961047, + 21888242871839275222246405745257275088548364400416034343698203988283992233210, + 146395491142798, + 21888242871839275222246405745257275088548364400416034343698204183241260744504, + 224047706109265, + 21888242871839275222246405745257275088548364400416034343698203701805114353743, + 21888242871839275222246405745257275088548364400416034343698204004279278784558, + 358821660732951, + 543926938396026, + 21888242871839275222246405745257275088548364400416034343698204094117082273797, + 311341053076563, + 298568060960720, + 21888242871839275222246405745257275088548364400416034343698203850197458872435, + 21888242871839275222246405745257275088548364400416034343698203916888985396620, + 21888242871839275222246405745257275088548364400416034343698203987522245646660, + 218035048164821, + 193008799383202, + 21888242871839275222246405745257275088548364400416034343698203831219207607997, + 21888242871839275222246405745257275088548364400416034343698203682161447425257, + 21888242871839275222246405745257275088548364400416034343698204122649034339820, + 21888242871839275222246405745257275088548364400416034343698204066088805283673, + 464035966253479, + 21888242871839275222246405745257275088548364400416034343698203637270483976239, + 21888242871839275222246405745257275088548364400416034343698204052422468981856, + 21888242871839275222246405745257275088548364400416034343698203897776652521675, + 457536359577215, + 139847262931991, + 331510792856963, + 213799028211024, + 497325589623483, + 321442559216114, + 414120973712745, + 21888242871839275222246405745257275088548364400416034343698203638704241652519, + 21888242871839275222246405745257275088548364400416034343698203677279644681518, + 21888242871839275222246405745257275088548364400416034343698203931789193892986, + 21888242871839275222246405745257275088548364400416034343698203893665755164291, + 354875634060698, + 374050101364085, + 21888242871839275222246405745257275088548364400416034343698203904195940162811, + 21888242871839275222246405745257275088548364400416034343698204045322405929416, + 21888242871839275222246405745257275088548364400416034343698204130395974668467, + 466823270122838, + 21888242871839275222246405745257275088548364400416034343698203987064328921124, + 21888242871839275222246405745257275088548364400416034343698204009278440741507, + 21888242871839275222246405745257275088548364400416034343698204026058719310850, + 420805962929017, + 458476704118898, + 184186713203365, + 21888242871839275222246405745257275088548364400416034343698204071723727304506, + 21888242871839275222246405745257275088548364400416034343698204144289074655521, + 210922521055100, + 21888242871839275222246405745257275088548364400416034343698203739919249775066, + 21888242871839275222246405745257275088548364400416034343698203725810177914823, + 21888242871839275222246405745257275088548364400416034343698203810222559195565, + 112351728809815, + 182830242378497, + 21888242871839275222246405745257275088548364400416034343698203807224285200217, + 118148701816263, + 334224505212647, + 260079154126641, + 429237835062626, + 533633762418988, + 21888242871839275222246405745257275088548364400416034343698203849448797555738, + 352439859705464, + 21888242871839275222246405745257275088548364400416034343698204041202353919301, + 378741424223045, + 174040551638605, + 21888242871839275222246405745257275088548364400416034343698204183822309114622, + 461219458769781, + 21888242871839275222246405745257275088548364400416034343698204045233067408515, + 21888242871839275222246405745257275088548364400416034343698204177382130888672, + 21888242871839275222246405745257275088548364400416034343698203878612991809252, + 202285738432475, + 21888242871839275222246405745257275088548364400416034343698203710614494352721, + 21888242871839275222246405745257275088548364400416034343698203857926324740525, + 21888242871839275222246405745257275088548364400416034343698203649951184853572, + 21888242871839275222246405745257275088548364400416034343698203632710857508712, + 21888242871839275222246405745257275088548364400416034343698203760469083189498, + 21888242871839275222246405745257275088548364400416034343698203645761958232711, + 21888242871839275222246405745257275088548364400416034343698203961544409607264, + 21888242871839275222246405745257275088548364400416034343698203713604426831413, + 484689344273132, + 21888242871839275222246405745257275088548364400416034343698204138589653465544, + 21888242871839275222246405745257275088548364400416034343698203980497971855473, + 21888242871839275222246405745257275088548364400416034343698203802392972983779, + 21888242871839275222246405745257275088548364400416034343698204000010566350362, + 21888242871839275222246405745257275088548364400416034343698204141124409089275, + 375186008565999, + 21888242871839275222246405745257275088548364400416034343698203654189881430510, + 21888242871839275222246405745257275088548364400416034343698204072023572504922, + 192289424823163, + 21888242871839275222246405745257275088548364400416034343698204129699526253908, + 21888242871839275222246405745257275088548364400416034343698203955848163672465, + 21888242871839275222246405745257275088548364400416034343698203800657889537362, + 21888242871839275222246405745257275088548364400416034343698204056158807184980, + 368175400750533, + 21888242871839275222246405745257275088548364400416034343698203715972147789621, + 21888242871839275222246405745257275088548364400416034343698204093809051122833, + 21888242871839275222246405745257275088548364400416034343698203831857012414466, + 76645778877952, + 21888242871839275222246405745257275088548364400416034343698203745415318822689, + 21888242871839275222246405745257275088548364400416034343698203743524602132934, + 21888242871839275222246405745257275088548364400416034343698204044988855060574, + 489310372896932, + 21888242871839275222246405745257275088548364400416034343698203857965337638774, + 21888242871839275222246405745257275088548364400416034343698203726185442955208, + 21888242871839275222246405745257275088548364400416034343698203845653338220558, + 21888242871839275222246405745257275088548364400416034343698203841867899275451, + 10520381053529, + 297183557977025, + 499685908367358, + 21888242871839275222246405745257275088548364400416034343698203969871980687593, + 366800264505362, + 245529045170839, + 251706797244335, + 19477611285386, + 21888242871839275222246405745257275088548364400416034343698203868800531702322, + 296095609502974, + 21888242871839275222246405745257275088548364400416034343698204169671035251396, + 21888242871839275222246405745257275088548364400416034343698203789797958739836, + 356437963170308, + 21888242871839275222246405745257275088548364400416034343698203680999575072013, + 21888242871839275222246405745257275088548364400416034343698203888120543391918, + 115201394863549, + 21888242871839275222246405745257275088548364400416034343698203829323699785339, + 21888242871839275222246405745257275088548364400416034343698203851366943066025, + 21888242871839275222246405745257275088548364400416034343698203814450607955321, + 21888242871839275222246405745257275088548364400416034343698204104174315881941, + 332605518364708, + 541659960322597, + 21888242871839275222246405745257275088548364400416034343698203649737164645729, + 131919292501401, + 21888242871839275222246405745257275088548364400416034343698204073769894125023, + 21888242871839275222246405745257275088548364400416034343698204018935209789500, + 21888242871839275222246405745257275088548364400416034343698203745622902036281, + 550594853360375, + 21888242871839275222246405745257275088548364400416034343698203971970598322684, + 321298617460096, + 497063920959053, + 513480614924629, + 21888242871839275222246405745257275088548364400416034343698203857737086796580, + 21888242871839275222246405745257275088548364400416034343698203778512355119758, + 21888242871839275222246405745257275088548364400416034343698204008085104435072, + 21888242871839275222246405745257275088548364400416034343698203672554314022972, + 21888242871839275222246405745257275088548364400416034343698203723253361485763, + 218291514833599, + 241226489344511, + 21888242871839275222246405745257275088548364400416034343698203827912446962802, + 21888242871839275222246405745257275088548364400416034343698203650109940965165, + 21888242871839275222246405745257275088548364400416034343698203826055572009334, + 39937827692989, + 519701294920477, + 443582700590531, + 21888242871839275222246405745257275088548364400416034343698204166341871035648, + 21888242871839275222246405745257275088548364400416034343698203896768248819865, + 396019416186483, + 21888242871839275222246405745257275088548364400416034343698204179568255743556, + 21888242871839275222246405745257275088548364400416034343698203801152413595304, + 21888242871839275222246405745257275088548364400416034343698203864568952373844, + 21888242871839275222246405745257275088548364400416034343698203944193190922882, + 4859555975731, + 21888242871839275222246405745257275088548364400416034343698204088824743652422, + 21888242871839275222246405745257275088548364400416034343698203938894062828397, + 21888242871839275222246405745257275088548364400416034343698204150522726637751, + 344890690819199, + 233876168010493, + 21888242871839275222246405745257275088548364400416034343698203878143590879829, + 181700934070581, + 468659551408487, + 21888242871839275222246405745257275088548364400416034343698203946433789839824, + 158786999714690, + 486353552481635, + 388520013455991, + 349277240372077, + 55235873144123, + 30223971850076, + 380702717456335, + 49241356220400, + 21888242871839275222246405745257275088548364400416034343698204173626839206716, + 454070491700693, + 21888242871839275222246405745257275088548364400416034343698204010155772859504, + 21888242871839275222246405745257275088548364400416034343698203895737185480864, + 18003719175894, + 21888242871839275222246405745257275088548364400416034343698204100706507084478, + 21888242871839275222246405745257275088548364400416034343698203733077498067019, + 169043542916864, + 518234286385270, + 327297895542039, + 21888242871839275222246405745257275088548364400416034343698203840102130446883, + 21888242871839275222246405745257275088548364400416034343698203904872450866275, + 27772197662856, + 186490051133899, + 477040289239233, + 21888242871839275222246405745257275088548364400416034343698204172197774807220, + 382617933498230, + 350732552452076, + 289500803463049, + 21888242871839275222246405745257275088548364400416034343698203849244375743413, + 361373135251608, + 526619243024854, + 482791266825210, + 21888242871839275222246405745257275088548364400416034343698204069906463332552, + 332211238007858, + 480481692914853, + 448206138846759, + 39740110621426, + 21888242871839275222246405745257275088548364400416034343698204035928931115042, + 21888242871839275222246405745257275088548364400416034343698203753964502202172, + 212822633500985, + 21888242871839275222246405745257275088548364400416034343698204064714536801678, + 21888242871839275222246405745257275088548364400416034343698203777222932667875, + 21888242871839275222246405745257275088548364400416034343698203757947874163315, + 21888242871839275222246405745257275088548364400416034343698204076848046773081, + 21888242871839275222246405745257275088548364400416034343698203905043075002722, + 270235082579456, + 21888242871839275222246405745257275088548364400416034343698203958853352945094, + 47318419894028, + 111981212949016, + 42538987664362, + 21888242871839275222246405745257275088548364400416034343698204011126629465164, + 21888242871839275222246405745257275088548364400416034343698203629371244028274, + 21888242871839275222246405745257275088548364400416034343698203709495314268884, + 438367738046099, + 21888242871839275222246405745257275088548364400416034343698203911244759205064, + 299213309213480, + 21888242871839275222246405745257275088548364400416034343698203669730689015907, + 182387151758508, + 21888242871839275222246405745257275088548364400416034343698203895093246234587, + 21888242871839275222246405745257275088548364400416034343698204015528367151256, + 408309530930165, + 21888242871839275222246405745257275088548364400416034343698203950227651086523, + 21888242871839275222246405745257275088548364400416034343698203748023738719467, + 429718409142607, + 21888242871839275222246405745257275088548364400416034343698203623828160996323, + 184584067292412, + 45861701088695, + 306165889485348, + 307076418701923, + 21888242871839275222246405745257275088548364400416034343698203973812214573934, + 119087125907637, + 183593720537028, + 21888242871839275222246405745257275088548364400416034343698204031303500581252, + 21888242871839275222246405745257275088548364400416034343698203822288417783363, + 21888242871839275222246405745257275088548364400416034343698203923519396185149, + 21888242871839275222246405745257275088548364400416034343698203697213712606395, + 21888242871839275222246405745257275088548364400416034343698203954362052509571, + 131364705359318, + 21888242871839275222246405745257275088548364400416034343698203821593689569556, + 73834153455343, + 21888242871839275222246405745257275088548364400416034343698203940433715895236, + 411008433967502, + 21888242871839275222246405745257275088548364400416034343698203818912793320934, + 21888242871839275222246405745257275088548364400416034343698203891393236884124, + 21888242871839275222246405745257275088548364400416034343698203790899455657699, + 21888242871839275222246405745257275088548364400416034343698204032040476672305, + 21888242871839275222246405745257275088548364400416034343698204122022675151535, + 21888242871839275222246405745257275088548364400416034343698204079187596245989, + 21888242871839275222246405745257275088548364400416034343698203777448458181937, + 383671167957400, + 55306804107197, + 21888242871839275222246405745257275088548364400416034343698204104655108519112, + 21888242871839275222246405745257275088548364400416034343698204045969137207402, + 247112030578894, + 21888242871839275222246405745257275088548364400416034343698203723312129682079, + 21888242871839275222246405745257275088548364400416034343698203973550120032166, + 74575815209734, + 331727946746239, + 264124261497821, + 21888242871839275222246405745257275088548364400416034343698203826782024686199, + 120754838068551, + 266969370431838, + 21888242871839275222246405745257275088548364400416034343698203628710948689020, + 401847217030761, + 224399001486483, + 493556767411501, + 21888242871839275222246405745257275088548364400416034343698204138011749424157, + 21888242871839275222246405745257275088548364400416034343698204064393765549504, + 21888242871839275222246405745257275088548364400416034343698204079394971113295, + 500975081154944, + 21888242871839275222246405745257275088548364400416034343698203864043489295714, + 21888242871839275222246405745257275088548364400416034343698204035131559016314, + 349417439058423, + 21888242871839275222246405745257275088548364400416034343698204092323866181902, + 21888242871839275222246405745257275088548364400416034343698203720589119275867, + 170428125677758, + 21888242871839275222246405745257275088548364400416034343698203653697495442859, + 516459216716340, + 18713204532774, + 21888242871839275222246405745257275088548364400416034343698203974330892724184, + 318160761817290, + 475458149334622, + 557055690893616, + 176075556208292, + 21888242871839275222246405745257275088548364400416034343698203832566235019591, + 21111593774681, + 21888242871839275222246405745257275088548364400416034343698203978070740551293, + 21888242871839275222246405745257275088548364400416034343698204007558540225843, + 327149855212940, + 36411734854869, + 21888242871839275222246405745257275088548364400416034343698204055317076595355, + 21888242871839275222246405745257275088548364400416034343698203625432435168094, + 21888242871839275222246405745257275088548364400416034343698204000768665459274, + 21888242871839275222246405745257275088548364400416034343698204053618331280039, + 438344086169618, + 23600450988742, + 21888242871839275222246405745257275088548364400416034343698203664344359507074, + 21888242871839275222246405745257275088548364400416034343698204131963816012900, + 21888242871839275222246405745257275088548364400416034343698203727831117020349, + 21888242871839275222246405745257275088548364400416034343698204172690258090126, + 21888242871839275222246405745257275088548364400416034343698203737207925498186, + 21888242871839275222246405745257275088548364400416034343698203843291847189143, + 365079990456618, + 21888242871839275222246405745257275088548364400416034343698203932488941060110, + 47720308342204, + 21888242871839275222246405745257275088548364400416034343698203687737029099796, + 21888242871839275222246405745257275088548364400416034343698203652359295351184, + 242806549368391, + 433566401122852, + 376193304129300, + 21888242871839275222246405745257275088548364400416034343698203717560036373754, + 21888242871839275222246405745257275088548364400416034343698204161092768313662, + 40342295442072, + 21888242871839275222246405745257275088548364400416034343698203813417457699608, + 243100107076373, + 71374616122629, + 252467170279388, + 296402035061914, + 173173178472387, + 21888242871839275222246405745257275088548364400416034343698203869698492103805, + 21888242871839275222246405745257275088548364400416034343698203775654702613863, + 21888242871839275222246405745257275088548364400416034343698204172906355107582, + 34233188758941, + 21888242871839275222246405745257275088548364400416034343698203963954281320807, + 460808588875393, + 462769216993661, + 31951097087475, + 21888242871839275222246405745257275088548364400416034343698204058803276998586, + 198213464235515, + 21888242871839275222246405745257275088548364400416034343698203666275798816509, + 21888242871839275222246405745257275088548364400416034343698203920567911569747, + 21888242871839275222246405745257275088548364400416034343698204043111796022786, + 252055135371405, + 21888242871839275222246405745257275088548364400416034343698204012511288429677, + 334590045110303, + 21888242871839275222246405745257275088548364400416034343698203847972126541025, + 21888242871839275222246405745257275088548364400416034343698204105152242824170, + 21888242871839275222246405745257275088548364400416034343698203928989614501165, + 21888242871839275222246405745257275088548364400416034343698204061172814762825, + 222260026863499, + 60241887745957, + 197715836603494, + 21888242871839275222246405745257275088548364400416034343698204071126525984694, + 298067078122162, + 21888242871839275222246405745257275088548364400416034343698203907964684105831, + 21888242871839275222246405745257275088548364400416034343698204072246156596915, + 81409143556552, + 225464115737226, + 35434193287488, + 373379791154743, + 275395377278375, + 324403741605108, + 255287328598080, + 323111053792090, + 21888242871839275222246405745257275088548364400416034343698203771613369389433, + 458797775460729, + 35317537112181, + 21888242871839275222246405745257275088548364400416034343698204154391023026976, + 511359386663789, + 21888242871839275222246405745257275088548364400416034343698203872755858687528, + 21888242871839275222246405745257275088548364400416034343698203886619603688502, + 496382496685496, + 21888242871839275222246405745257275088548364400416034343698204127822829383581, + 329098982963013, + 390650488025980, + 497635833354690, + 21888242871839275222246405745257275088548364400416034343698203690319760195770, + 21888242871839275222246405745257275088548364400416034343698203982092687204188, + 483489086434697, + 471932638731400, + 29892474841280, + 181550103477242, + 494679023963625, + 138527009373987, + 280834880312192, + 21888242871839275222246405745257275088548364400416034343698203667664635381088, + 48251596069836, + 409852478445903, + 76621917704394, + 149680119883089, + 21888242871839275222246405745257275088548364400416034343698203762629157606400, + 166646317219889, + 21888242871839275222246405745257275088548364400416034343698203900060925044301, + 21888242871839275222246405745257275088548364400416034343698203980691317494458, + 21888242871839275222246405745257275088548364400416034343698203819887303764148, + 121215858136836, + 21888242871839275222246405745257275088548364400416034343698204094411967066791, + 165794584807102, + 21888242871839275222246405745257275088548364400416034343698203828667235739555, + 175924687764504, + 21888242871839275222246405745257275088548364400416034343698204046699371261363, + 555634449276312, + 21888242871839275222246405745257275088548364400416034343698203941551322647842, + 335431841301849, + 21888242871839275222246405745257275088548364400416034343698203768787237829772, + 21888242871839275222246405745257275088548364400416034343698203707729644382052, + 21888242871839275222246405745257275088548364400416034343698204010032761943158, + 240800716428933, + 215490677723271, + 157506297984814, + 21888242871839275222246405745257275088548364400416034343698203780833845293632, + 87305438631209, + 21888242871839275222246405745257275088548364400416034343698204071744002841442, + 90536061405429, + 21888242871839275222246405745257275088548364400416034343698204088501578683169, + 21888242871839275222246405745257275088548364400416034343698204095949343562651, + 21888242871839275222246405745257275088548364400416034343698204138390928532077, + 154354723169156, + 288397727187615, + 21888242871839275222246405745257275088548364400416034343698203953976256888220, + 21888242871839275222246405745257275088548364400416034343698204127058568250080, + 21888242871839275222246405745257275088548364400416034343698203935791329006828, + 533551400306249, + 21888242871839275222246405745257275088548364400416034343698204143500691405102, + 173985779959288, + 530689396086483, + 528170455678819, + 21888242871839275222246405745257275088548364400416034343698203713239945299966, + 21888242871839275222246405745257275088548364400416034343698203966830314890494, + 21888242871839275222246405745257275088548364400416034343698203710229836235474, + 21888242871839275222246405745257275088548364400416034343698203828548436996038, + 21888242871839275222246405745257275088548364400416034343698203816309699845444, + 534913650436011, + 21888242871839275222246405745257275088548364400416034343698203871525944515796, + 21888242871839275222246405745257275088548364400416034343698203642779479101140, + 21888242871839275222246405745257275088548364400416034343698203848650715550912, + 21888242871839275222246405745257275088548364400416034343698203792464631552031, + 294957950218966, + 5936310910640, + 21888242871839275222246405745257275088548364400416034343698203711528244002538, + 21888242871839275222246405745257275088548364400416034343698204078582028624955, + 21888242871839275222246405745257275088548364400416034343698203805939588224541, + 91547153416618, + 363477246027304, + 443678865000919, + 64558099291131, + 540448444168420, + 231023855496066, + 458036333685801, + 21888242871839275222246405745257275088548364400416034343698203685985412976312, + 21888242871839275222246405745257275088548364400416034343698204098356010792671, + 21888242871839275222246405745257275088548364400416034343698203803867815662589, + 21888242871839275222246405745257275088548364400416034343698203998228886017546, + 73011043039308, + 268387862531727, + 356574878045775, + 21888242871839275222246405745257275088548364400416034343698203805245485382344, + 21888242871839275222246405745257275088548364400416034343698204031147097239457, + 393921178582370, + 428865176355373, + 395134506949418, + 21888242871839275222246405745257275088548364400416034343698204144975929239466, + 21888242871839275222246405745257275088548364400416034343698204085204782061020, + 21888242871839275222246405745257275088548364400416034343698203742398828905275, + 21888242871839275222246405745257275088548364400416034343698203844370061374855, + 170730095307306, + 433357572963910, + 559361607186971, + 454205300175765, + 237892335961451, + 21888242871839275222246405745257275088548364400416034343698203736214376389369, + 244875981363777, + 21888242871839275222246405745257275088548364400416034343698204149668313985790, + 480209149829764, + 18236848674142, + 278770258304571, + 21888242871839275222246405745257275088548364400416034343698203860434046104701, + 338134297636277, + 324901486650727, + 501984612469168, + 21888242871839275222246405745257275088548364400416034343698204154031013705625, + 21888242871839275222246405745257275088548364400416034343698203890859245696166, + 21888242871839275222246405745257275088548364400416034343698203882630666800275, + 265144761122510, + 21888242871839275222246405745257275088548364400416034343698203763133859932895, + 21888242871839275222246405745257275088548364400416034343698204132870372122300, + 512312756360070, + 9256441757446, + 21888242871839275222246405745257275088548364400416034343698204131169481142859, + 425423073216935, + 21888242871839275222246405745257275088548364400416034343698204052665376043607, + 21888242871839275222246405745257275088548364400416034343698203813430363480327, + 106014204433236, + 21888242871839275222246405745257275088548364400416034343698203905052775076106, + 21888242871839275222246405745257275088548364400416034343698203646933979559752, + 145305255389295, + 256711618060064, + 388952428180240, + 21888242871839275222246405745257275088548364400416034343698203676307596926836, + 422254675725443, + 21888242871839275222246405745257275088548364400416034343698203759577460080976, + 516808208527274, + 21888242871839275222246405745257275088548364400416034343698203769537154184295, + 21888242871839275222246405745257275088548364400416034343698203841535012686004, + 278806008365246, + 221042365893548, + 367719150252459, + 89856971521958, + 87626942594778, + 67151978696403, + 21888242871839275222246405745257275088548364400416034343698203887316505791966, + 2004625604125, + 21888242871839275222246405745257275088548364400416034343698203711244204528179, + 29198190185333, + 21888242871839275222246405745257275088548364400416034343698204099486215601463, + 60778404473172, + 21888242871839275222246405745257275088548364400416034343698203682114651680489, + 300946222636079, + 334148285045167, + 21888242871839275222246405745257275088548364400416034343698203782383676853936, + 21888242871839275222246405745257275088548364400416034343698204010416963970747, + 21888242871839275222246405745257275088548364400416034343698203897475378011924, + 21888242871839275222246405745257275088548364400416034343698204067945112763019, + 104439061765780, + 21888242871839275222246405745257275088548364400416034343698203978440472879101, + 404799194201405, + 21888242871839275222246405745257275088548364400416034343698203996527364055949, + 21888242871839275222246405745257275088548364400416034343698203985395144369644, + 21888242871839275222246405745257275088548364400416034343698203949597846454661, + 303789089435635, + 21888242871839275222246405745257275088548364400416034343698203989852959233894, + 170393740027542, + 21888242871839275222246405745257275088548364400416034343698203912913698404728, + 154003664462167, + 190477194681444, + 21888242871839275222246405745257275088548364400416034343698204120115475388344, + 21888242871839275222246405745257275088548364400416034343698203854424967783050, + 21888242871839275222246405745257275088548364400416034343698203681777280547003, + 470719322687598, + 226102359426351, + 21888242871839275222246405745257275088548364400416034343698203904107418067829, + 415059924454842, + 21888242871839275222246405745257275088548364400416034343698203991529516122456, + 10584371137315, + 530449433657009, + 21888242871839275222246405745257275088548364400416034343698204051624106162107, + 64188047722625, + 21888242871839275222246405745257275088548364400416034343698204143194919021358, + 21888242871839275222246405745257275088548364400416034343698203899348512658274, + 348301802294912, + 495728218360371, + 21888242871839275222246405745257275088548364400416034343698203725851165445814, + 21888242871839275222246405745257275088548364400416034343698203687993830442498, + 360316922826195, + 21888242871839275222246405745257275088548364400416034343698203984164491109697, + 21888242871839275222246405745257275088548364400416034343698203717218849224661, + 4861981255153, + 21888242871839275222246405745257275088548364400416034343698203829523572836502, + 203797620639951, + 21888242871839275222246405745257275088548364400416034343698203890503748942862, + 529627375065526, + 227380022168381, + 276702218365503, + 21888242871839275222246405745257275088548364400416034343698203676110464110287, + 507547358118840, + 21888242871839275222246405745257275088548364400416034343698203869032784108567, + 21888242871839275222246405745257275088548364400416034343698203822221284688967, + 267187625939834, + 426246950084493, + 21888242871839275222246405745257275088548364400416034343698203901787769052744, + 85938643043963, + 21888242871839275222246405745257275088548364400416034343698203907393223583348, + 307382033362737, + 21888242871839275222246405745257275088548364400416034343698203904900840609905, + 242721427068495, + 21888242871839275222246405745257275088548364400416034343698204136806494246258, + 545594074192363, + 21888242871839275222246405745257275088548364400416034343698203746906422494214, + 484150196453404, + 133414530869061, + 21888242871839275222246405745257275088548364400416034343698204168357507774435, + 21888242871839275222246405745257275088548364400416034343698204037172740494655, + 403195595019773, + 21888242871839275222246405745257275088548364400416034343698203681774143093392, + 21888242871839275222246405745257275088548364400416034343698204145896666759715, + 21888242871839275222246405745257275088548364400416034343698203707606928251414, + 440623679725626, + 113120178393617, + 21888242871839275222246405745257275088548364400416034343698203723267252911235, + 21888242871839275222246405745257275088548364400416034343698203944978532664277, + 21888242871839275222246405745257275088548364400416034343698203702002300113595, + 266691750695082, + 231953747552602, + 225387247606863, + 467138623365296, + 21888242871839275222246405745257275088548364400416034343698203857715172843918, + 204502758558954, + 21888242871839275222246405745257275088548364400416034343698203757081211418581, + 21888242871839275222246405745257275088548364400416034343698203652330967844549, + 280014864459372, + 21888242871839275222246405745257275088548364400416034343698204119886169023764, + 21888242871839275222246405745257275088548364400416034343698203865813645430139, + 132926766358038, + 482031010259330, + 54559041719583, + 21888242871839275222246405745257275088548364400416034343698203890103980789386, + 307180880872850, + 21888242871839275222246405745257275088548364400416034343698203956299967257817, + 21888242871839275222246405745257275088548364400416034343698203840086416358612, + 250832734248869, + 480562754487057, + 21888242871839275222246405745257275088548364400416034343698204158259733969255, + 21888242871839275222246405745257275088548364400416034343698203831398356638564, + 8159597481062, + 499447639133409, + 494325292981127, + 21888242871839275222246405745257275088548364400416034343698204130787338732570, + 45043076953053, + 46930959094532, + 21888242871839275222246405745257275088548364400416034343698203980714983476544, + 21888242871839275222246405745257275088548364400416034343698203802728301020609, + 21888242871839275222246405745257275088548364400416034343698203687954861851447, + 21888242871839275222246405745257275088548364400416034343698203858704366819029, + 331356555572790, + 415728690828865, + 21888242871839275222246405745257275088548364400416034343698204151533516663078, + 21888242871839275222246405745257275088548364400416034343698203888466346187250, + 236266584947048, + 21888242871839275222246405745257275088548364400416034343698203861496997166934, + 493438084723005, + 21888242871839275222246405745257275088548364400416034343698203983137467402253, + 21888242871839275222246405745257275088548364400416034343698204162661588585869, + 1517451718446, + 21888242871839275222246405745257275088548364400416034343698204161522738578891, + 542098202707058, + 21888242871839275222246405745257275088548364400416034343698203803610738972221, + 315414280754091, + 21888242871839275222246405745257275088548364400416034343698204049807581814519, + 355881699169228, + 21888242871839275222246405745257275088548364400416034343698203939579469334954, + 152766894249514, + 209663427657477, + 21888242871839275222246405745257275088548364400416034343698203776045940030881, + 402820386760472, + 299523331500625, + 85991559702935, + 21888242871839275222246405745257275088548364400416034343698203698635436521484, + 92885677044388, + 21888242871839275222246405745257275088548364400416034343698203720987877894595, + 158280041863019, + 21888242871839275222246405745257275088548364400416034343698204045508977092048, + 382138037996076, + 21888242871839275222246405745257275088548364400416034343698204005613255783024, + 327507924245670, + 473904861328351, + 21888242871839275222246405745257275088548364400416034343698203969094717506431, + 269475739877281, + 487366438993301, + 377875264858502, + 21888242871839275222246405745257275088548364400416034343698204037073859401133, + 283046318714789, + 480097841617430, + 220355232776485, + 21888242871839275222246405745257275088548364400416034343698203668271968950612, + 21888242871839275222246405745257275088548364400416034343698204046657409973067, + 177450559174798, + 17567570577483, + 558310553261400, + 313461556992246, + 21888242871839275222246405745257275088548364400416034343698204073893310331921, + 406497244273414, + 255611019389413, + 517105287390339, + 21888242871839275222246405745257275088548364400416034343698204175265074170381, + 486232000776574, + 2771270899172, + 350299493464005, + 21888242871839275222246405745257275088548364400416034343698203834160060665892, + 354146499487566, + 60504683156979, + 21888242871839275222246405745257275088548364400416034343698203913262594195945, + 18750719240707, + 387047453611219, + 21888242871839275222246405745257275088548364400416034343698203689846767909333, + 21888242871839275222246405745257275088548364400416034343698203816473148367104, + 424050041270944, + 21888242871839275222246405745257275088548364400416034343698204117887348171575, + 21888242871839275222246405745257275088548364400416034343698203645441851015408, + 21888242871839275222246405745257275088548364400416034343698204037966255087401, + 21888242871839275222246405745257275088548364400416034343698204131742589179500, + 241460770261294, + 21888242871839275222246405745257275088548364400416034343698203960122568102644, + 237291294280986, + 310380993162626, + 21888242871839275222246405745257275088548364400416034343698203929661057139682, + 549106219476072, + 135904678125613, + 21888242871839275222246405745257275088548364400416034343698204093387905694731, + 21888242871839275222246405745257275088548364400416034343698203932134422552845, + 21888242871839275222246405745257275088548364400416034343698203809560674539664, + 21888242871839275222246405745257275088548364400416034343698204052547954296629, + 21888242871839275222246405745257275088548364400416034343698204023314936607324, + 38165232826615, + 196293795107994, + 28149094816775, + 286768366090233, + 21888242871839275222246405745257275088548364400416034343698203986475182555467, + 21888242871839275222246405745257275088548364400416034343698203673080523940215, + 508084470400336, + 21888242871839275222246405745257275088548364400416034343698204168166138146842, + 496807878954492, + 21888242871839275222246405745257275088548364400416034343698204043157632352037, + 551046954219977, + 199054494056251, + 2504673526015, + 21888242871839275222246405745257275088548364400416034343698203833468313017254, + 21888242871839275222246405745257275088548364400416034343698203922720361742474, + 457479747068041, + 21888242871839275222246405745257275088548364400416034343698203646500643023073, + 519073200238400, + 21888242871839275222246405745257275088548364400416034343698204124878040167418, + 21888242871839275222246405745257275088548364400416034343698203750769326870284, + 350833495495548, + 21888242871839275222246405745257275088548364400416034343698203883549887928425, + 21888242871839275222246405745257275088548364400416034343698204105231760692455, + 21888242871839275222246405745257275088548364400416034343698204011353801536302, + 131738908534943, + 21888242871839275222246405745257275088548364400416034343698203662596187445824, + 21888242871839275222246405745257275088548364400416034343698203938760825114640, + 21888242871839275222246405745257275088548364400416034343698203637071470417233, + 21888242871839275222246405745257275088548364400416034343698203731335679154762, + 21888242871839275222246405745257275088548364400416034343698203625410352203398, + 36382614924584, + 21888242871839275222246405745257275088548364400416034343698203652619050048190, + 512890038548170, + 21888242871839275222246405745257275088548364400416034343698203815563101825715, + 36472952742392, + 255840321665764, + 142776971240083, + 469784385095009, + 518526931343000, + 21888242871839275222246405745257275088548364400416034343698203724314039118531, + 21888242871839275222246405745257275088548364400416034343698203817889129893266, + 21888242871839275222246405745257275088548364400416034343698203961928829924795, + 21888242871839275222246405745257275088548364400416034343698203922834339329991, + 16297133348507, + 21888242871839275222246405745257275088548364400416034343698203746058726297979, + 21888242871839275222246405745257275088548364400416034343698204072455943789749, + 531959610336312, + 440615510590076, + 82312955481179, + 428683392467345, + 21888242871839275222246405745257275088548364400416034343698204088893311172626, + 193690957782282, + 21888242871839275222246405745257275088548364400416034343698203954918883897667, + 286887434355003, + 65275557601004, + 21888242871839275222246405745257275088548364400416034343698203724661341749437, + 400593381143883, + 433093231327928, + 21888242871839275222246405745257275088548364400416034343698203771464411484255, + 144155287345669, + 21888242871839275222246405745257275088548364400416034343698203677404804787782, + 202920681820967, + 21888242871839275222246405745257275088548364400416034343698203874787006040081, + 77885048076288, + 21888242871839275222246405745257275088548364400416034343698203904398740233141, + 481236348976883, + 259398032285523, + 21888242871839275222246405745257275088548364400416034343698203916545100508049, + 431837306050461, + 23475936667976, + 21888242871839275222246405745257275088548364400416034343698203860723102808833, + 21888242871839275222246405745257275088548364400416034343698203984372595832824, + 21888242871839275222246405745257275088548364400416034343698204132959184867886, + 473012538233825, + 21888242871839275222246405745257275088548364400416034343698204165937658335978, + 445996244115716, + 21888242871839275222246405745257275088548364400416034343698203659821170019183, + 21888242871839275222246405745257275088548364400416034343698203699580457697308, + 322238848604180, + 21888242871839275222246405745257275088548364400416034343698203766305852031695, + 391141461021588, + 126388840082251, + 21888242871839275222246405745257275088548364400416034343698203670116183107244, + 21888242871839275222246405745257275088548364400416034343698204049908040257449, + 21888242871839275222246405745257275088548364400416034343698203987821900254470, + 28522021842916, + 21888242871839275222246405745257275088548364400416034343698203749590976199536, + 21888242871839275222246405745257275088548364400416034343698203921683351435389, + 233300286196328, + 21888242871839275222246405745257275088548364400416034343698204183947339309955, + 63563849780438, + 98487629548248, + 460278263706273, + 21888242871839275222246405745257275088548364400416034343698204044474780863031, + 352094298527988, + 21888242871839275222246405745257275088548364400416034343698203899746709082201, + 21888242871839275222246405745257275088548364400416034343698203778283177659815, + 408208627591513, + 118760900481607, + 442382896384384, + 21888242871839275222246405745257275088548364400416034343698203907156109013623, + 75424463274647, + 272385140654631, + 21888242871839275222246405745257275088548364400416034343698204044819995676528, + 507750762526111, + 21888242871839275222246405745257275088548364400416034343698204114980298707568, + 21888242871839275222246405745257275088548364400416034343698204111071337699239, + 77654865638984, + 82878648291121, + 75418358457118, + 21888242871839275222246405745257275088548364400416034343698203908920953227764, + 21888242871839275222246405745257275088548364400416034343698203649168432796625, + 21888242871839275222246405745257275088548364400416034343698204112187949046776, + 485118993387852, + 21888242871839275222246405745257275088548364400416034343698204036041024591914, + 21888242871839275222246405745257275088548364400416034343698204117081098010862, + 293228247333463, + 402047988279460, + 142609444334534, + 21888242871839275222246405745257275088548364400416034343698203701252381158585, + 21888242871839275222246405745257275088548364400416034343698203893766241912983, + 62474568490692, + 171574443121604, + 21888242871839275222246405745257275088548364400416034343698204168729876169582, + 21888242871839275222246405745257275088548364400416034343698204054748324286965, + 21888242871839275222246405745257275088548364400416034343698203743890979613071, + 21888242871839275222246405745257275088548364400416034343698203721090033135769, + 168672160109102, + 202779297014155, + 21888242871839275222246405745257275088548364400416034343698203870992501542519, + 21888242871839275222246405745257275088548364400416034343698203935049607861664, + 172877551259602, + 445699598401768, + 3057484785733, + 313181678138414, + 84649148789414, + 241215068771831, + 369181056576947, + 36553191752051, + 526137944465697, + 21888242871839275222246405745257275088548364400416034343698203685633080131572, + 21888242871839275222246405745257275088548364400416034343698203970690563741621, + 273353710946684, + 21888242871839275222246405745257275088548364400416034343698204150610528489928, + 21888242871839275222246405745257275088548364400416034343698203845037531331079, + 299057800572536, + 270871745921227, + 446531410008450, + 25656025303407, + 344235947468917, + 541868966956182, + 153392312425704, + 21888242871839275222246405745257275088548364400416034343698203623725138280566, + 21888242871839275222246405745257275088548364400416034343698203710598057656418, + 241568043397413, + 21888242871839275222246405745257275088548364400416034343698203744821049059319, + 436922216752990, + 21888242871839275222246405745257275088548364400416034343698203965218527419725, + 21888242871839275222246405745257275088548364400416034343698203800233517756112, + 93821497963516, + 263786331053132, + 21888242871839275222246405745257275088548364400416034343698203784133544225539, + 21888242871839275222246405745257275088548364400416034343698203938370385591668, + 21888242871839275222246405745257275088548364400416034343698204119398690905635, + 21888242871839275222246405745257275088548364400416034343698203759201442960793, + 422748954619863, + 271200115452967, + 84459062758216, + 113839588202680, + 21888242871839275222246405745257275088548364400416034343698204072858673940782, + 372234481921854, + 483806784398261, + 21888242871839275222246405745257275088548364400416034343698203628413003146449, + 243126801394796, + 21888242871839275222246405745257275088548364400416034343698204132115884487181, + 21888242871839275222246405745257275088548364400416034343698204033496303267846, + 21888242871839275222246405745257275088548364400416034343698204078610002625961, + 202484184893739, + 388666452538306, + 503633559081464, + 21888242871839275222246405745257275088548364400416034343698203630998334037048, + 476662333876919, + 21888242871839275222246405745257275088548364400416034343698204177186017121350, + 316366646985260, + 23022626494202, + 21888242871839275222246405745257275088548364400416034343698203952270553336259, + 74953834529058, + 21888242871839275222246405745257275088548364400416034343698204121896516266240, + 21888242871839275222246405745257275088548364400416034343698203636887570459801, + 21888242871839275222246405745257275088548364400416034343698203982689551060585, + 21888242871839275222246405745257275088548364400416034343698203750646568026195, + 501947279876736, + 208495044665807, + 179475046563598, + 21888242871839275222246405745257275088548364400416034343698203784806020380172, + 21888242871839275222246405745257275088548364400416034343698203723742895815406, + 288180194505551, + 55047600642352, + 21888242871839275222246405745257275088548364400416034343698203960284763776649, + 21888242871839275222246405745257275088548364400416034343698204058314684009875, + 43848009409209, + 21888242871839275222246405745257275088548364400416034343698204148972847460856, + 21888242871839275222246405745257275088548364400416034343698203768113644369073, + 139257807748856, + 182400599631598, + 21888242871839275222246405745257275088548364400416034343698203786400643963139, + 15729447284061, + 21888242871839275222246405745257275088548364400416034343698203984954095927861, + 251976324801812, + 21888242871839275222246405745257275088548364400416034343698203814313971399797, + 21888242871839275222246405745257275088548364400416034343698203634069600740182, + 21888242871839275222246405745257275088548364400416034343698203650910552869923, + 21888242871839275222246405745257275088548364400416034343698204111457739937479, + 65413935244473, + 284313307397939, + 207811405647544, + 371997159267305, + 260047722803147, + 21888242871839275222246405745257275088548364400416034343698204139852573173687, + 21888242871839275222246405745257275088548364400416034343698203790000429863784, + 328201906431304, + 532658984400079, + 293268723473576, + 125776739500531, + 21888242871839275222246405745257275088548364400416034343698203923538254727954, + 21888242871839275222246405745257275088548364400416034343698203756555534039770, + 46888868625375, + 151922213326729, + 549479077892164, + 116914868983224, + 91613842026627, + 458864211302890, + 542178707753414, + 21888242871839275222246405745257275088548364400416034343698203758566961567603, + 129779403734967, + 507681982917618, + 365090924287408, + 16976689875267, + 21888242871839275222246405745257275088548364400416034343698204155613609478974, + 21888242871839275222246405745257275088548364400416034343698203744882689371684, + 60650146579937, + 311598756623117, + 374001487470768, + 21888242871839275222246405745257275088548364400416034343698203899828174650834, + 21888242871839275222246405745257275088548364400416034343698204101317358794965, + 21888242871839275222246405745257275088548364400416034343698203865492067894127, + 21888242871839275222246405745257275088548364400416034343698204076212092960972, + 21888242871839275222246405745257275088548364400416034343698204032949860098622, + 262319501369881, + 12605893271594, + 21888242871839275222246405745257275088548364400416034343698203645597019333669, + 21888242871839275222246405745257275088548364400416034343698203683043929749947, + 21888242871839275222246405745257275088548364400416034343698203993464239176242, + 21888242871839275222246405745257275088548364400416034343698204075623498422785, + 21888242871839275222246405745257275088548364400416034343698204025933229578539, + 544716177983477, + 392045568245537, + 21888242871839275222246405745257275088548364400416034343698204047447938029487, + 21888242871839275222246405745257275088548364400416034343698203738446073298468, + 21888242871839275222246405745257275088548364400416034343698203641743420233972, + 339844273633010, + 21888242871839275222246405745257275088548364400416034343698203774095542457281, + 298064476838923, + 21888242871839275222246405745257275088548364400416034343698204146440282826330, + 21888242871839275222246405745257275088548364400416034343698203667691542747769, + 21888242871839275222246405745257275088548364400416034343698203871545090864850, + 21888242871839275222246405745257275088548364400416034343698204069283686010964, + 507904017848388, + 21888242871839275222246405745257275088548364400416034343698203862310703841237, + 21888242871839275222246405745257275088548364400416034343698204152947093303898, + 21888242871839275222246405745257275088548364400416034343698204122996751539079, + 21888242871839275222246405745257275088548364400416034343698204146850114763220, + 21888242871839275222246405745257275088548364400416034343698204087539135683415, + 54403912581921, + 322741967816289, + 470648037709788, + 45617737419188, + 21888242871839275222246405745257275088548364400416034343698204106303546862231, + 21888242871839275222246405745257275088548364400416034343698203939033905342513, + 84165472654819, + 256550349421224, + 21888242871839275222246405745257275088548364400416034343698204002256595367275, + 21888242871839275222246405745257275088548364400416034343698203884228404614250, + 146707100815516, + 266438470131326, + 390750220442732, + 21888242871839275222246405745257275088548364400416034343698203923021717179483, + 345896947307032, + 499727691555634, + 21888242871839275222246405745257275088548364400416034343698203844807128917396, + 501734855807173, + 184400986968086, + 405674409243012, + 435603635304313, + 21888242871839275222246405745257275088548364400416034343698204007509953952715, + 436905568327061, + 21888242871839275222246405745257275088548364400416034343698204081159598480335, + 21888242871839275222246405745257275088548364400416034343698204003842880562802, + 182537906454339, + 261212080714519, + 21888242871839275222246405745257275088548364400416034343698203978750577257138, + 21888242871839275222246405745257275088548364400416034343698204072108312132015, + 394325858341848, + 70537327041780, + 234058521911985, + 248791252812956, + 402420932125762, + 21888242871839275222246405745257275088548364400416034343698203696490034427251, + 21888242871839275222246405745257275088548364400416034343698203978716721413384, + 291556615850450, + 21888242871839275222246405745257275088548364400416034343698204000031537145170, + 470008150991037, + 181858220054738, + 342466335495883, + 21888242871839275222246405745257275088548364400416034343698204132011183649997, + 21888242871839275222246405745257275088548364400416034343698203971013937270745, + 243235105908857, + 21888242871839275222246405745257275088548364400416034343698204081245059735895, + 21888242871839275222246405745257275088548364400416034343698203803674627776057, + 3650444707124, + 21888242871839275222246405745257275088548364400416034343698204148796560266429, + 391127987167980, + 330309355677706, + 166749562894427, + 10125125483787, + 416429263082828, + 271214752275718, + 494323636016577, + 544763281893865, + 21888242871839275222246405745257275088548364400416034343698203824198519672344, + 258560341778583, + 468121905012220, + 49727126619388, + 19665694854272, + 21888242871839275222246405745257275088548364400416034343698203890308256481474, + 21888242871839275222246405745257275088548364400416034343698203914500233739714, + 284280758719287, + 21888242871839275222246405745257275088548364400416034343698204101820560373596, + 402743582906027, + 21888242871839275222246405745257275088548364400416034343698203782102578411274, + 130808074256846, + 21888242871839275222246405745257275088548364400416034343698203948312602839019, + 10150925770874, + 21888242871839275222246405745257275088548364400416034343698203760693890011447, + 21888242871839275222246405745257275088548364400416034343698204145549844217501, + 272275473572003, + 22887751937132, + 21888242871839275222246405745257275088548364400416034343698203794394904728960, + 21888242871839275222246405745257275088548364400416034343698204001565379913386, + 241820524317920, + 21888242871839275222246405745257275088548364400416034343698203647174567118486, + 6642260434903, + 192624459098235, + 21888242871839275222246405745257275088548364400416034343698203913752103756834, + 294855098397589, + 21888242871839275222246405745257275088548364400416034343698203647423417831437, + 21888242871839275222246405745257275088548364400416034343698203958255834490962, + 131152796050701, + 448263121698565, + 21888242871839275222246405745257275088548364400416034343698203854534815181846, + 21888242871839275222246405745257275088548364400416034343698203929187849576105, + 21888242871839275222246405745257275088548364400416034343698204005675993672924, + 21888242871839275222246405745257275088548364400416034343698204029693266915758, + 506479391079565, + 386062411129073, + 21888242871839275222246405745257275088548364400416034343698204077019797085897, + 176676455145843, + 272860232856035, + 21888242871839275222246405745257275088548364400416034343698204103337148357615, + 21888242871839275222246405745257275088548364400416034343698203893113611765171, + 21888242871839275222246405745257275088548364400416034343698203688605621845305, + 278632627289371, + 21888242871839275222246405745257275088548364400416034343698203833589558777715, + 33641666038406, + 21888242871839275222246405745257275088548364400416034343698203683052217396092, + 201834492630728, + 544738549350700, + 21888242871839275222246405745257275088548364400416034343698203729570260033942, + 339603170993502, + 502439091888775, + 367673539637277, + 21888242871839275222246405745257275088548364400416034343698203888415211799540, + 252544624123369, + 21888242871839275222246405745257275088548364400416034343698203956696175569983, + 358171909733564, + 21888242871839275222246405745257275088548364400416034343698204030773193439295, + 21888242871839275222246405745257275088548364400416034343698203705444927262653, + 106215025169490, + 21888242871839275222246405745257275088548364400416034343698203811243484723352, + 21888242871839275222246405745257275088548364400416034343698203734517650477996, + 21888242871839275222246405745257275088548364400416034343698203876789833046222, + 21888242871839275222246405745257275088548364400416034343698203986742432389558, + 21888242871839275222246405745257275088548364400416034343698203770395389329964, + 144317815727923, + 135926821069849, + 21888242871839275222246405745257275088548364400416034343698203728039516255676, + 21888242871839275222246405745257275088548364400416034343698204146798868199874, + 339008696461179, + 21888242871839275222246405745257275088548364400416034343698203718480237420161, + 201620778327548, + 21888242871839275222246405745257275088548364400416034343698203820909783073938, + 21888242871839275222246405745257275088548364400416034343698203787469592711396, + 21888242871839275222246405745257275088548364400416034343698203741200293066657, + 326178035372549, + 265788787217171, + 21888242871839275222246405745257275088548364400416034343698204128643220045546, + 21888242871839275222246405745257275088548364400416034343698204170923450689102, + 21888242871839275222246405745257275088548364400416034343698203772703927120726, + 59923002518106, + 21888242871839275222246405745257275088548364400416034343698203812556498207081, + 437222838452858, + 414475405139497, + 21888242871839275222246405745257275088548364400416034343698203630070292310599, + 521829753555450, + 105292388159870, + 437387612767928, + 206195384533870, + 224251462037139, + 21888242871839275222246405745257275088548364400416034343698203864141571116654, + 21888242871839275222246405745257275088548364400416034343698204050752926748764, + 21888242871839275222246405745257275088548364400416034343698203848301229024703, + 21888242871839275222246405745257275088548364400416034343698203734255682690403, + 21888242871839275222246405745257275088548364400416034343698204129697089868808, + 21888242871839275222246405745257275088548364400416034343698203775777511046363, + 464962034781804, + 21888242871839275222246405745257275088548364400416034343698204044721976165692, + 21888242871839275222246405745257275088548364400416034343698203628136849347084, + 21888242871839275222246405745257275088548364400416034343698204154464453212331, + 30366008054002, + 21888242871839275222246405745257275088548364400416034343698203891491828733811, + 548257566198515, + 199867238048989, + 21888242871839275222246405745257275088548364400416034343698204112716494355087, + 79039602871327, + 21888242871839275222246405745257275088548364400416034343698204143881212070025, + 175426093638845, + 21888242871839275222246405745257275088548364400416034343698204151776264093592, + 283807653295453, + 537351874592739, + 361951714194138, + 21888242871839275222246405745257275088548364400416034343698204175007186862950, + 240679005791905, + 369275096069482, + 21888242871839275222246405745257275088548364400416034343698203644820820107708, + 300715601886472, + 21888242871839275222246405745257275088548364400416034343698203803952873994183, + 251651901840518, + 21888242871839275222246405745257275088548364400416034343698204069294086269470, + 36919347952400, + 21888242871839275222246405745257275088548364400416034343698203728944632202878, + 21888242871839275222246405745257275088548364400416034343698204162344818612105, + 308918398102566, + 21888242871839275222246405745257275088548364400416034343698203783256748666636, + 21888242871839275222246405745257275088548364400416034343698203986439013874171, + 84104551564700, + 21888242871839275222246405745257275088548364400416034343698203972992912806495, + 101115252626564, + 356126175207758, + 21888242871839275222246405745257275088548364400416034343698203706217952727813, + 21888242871839275222246405745257275088548364400416034343698203641693881119847, + 192124710167997, + 21888242871839275222246405745257275088548364400416034343698203741125201011915, + 21888242871839275222246405745257275088548364400416034343698203663821744797851, + 325572926418990, + 376244821090444, + 474140840029717, + 21888242871839275222246405745257275088548364400416034343698203848223419638064, + 145230180651492, + 286918409052102, + 21888242871839275222246405745257275088548364400416034343698204163951584585079, + 265667981645696, + 21888242871839275222246405745257275088548364400416034343698203699855200224877, + 21888242871839275222246405745257275088548364400416034343698203790716689391651, + 107813223009234, + 330656813356501, + 21888242871839275222246405745257275088548364400416034343698204129796209877528, + 21888242871839275222246405745257275088548364400416034343698204127836720736789, + 21888242871839275222246405745257275088548364400416034343698204026927306126006, + 21888242871839275222246405745257275088548364400416034343698204075013224586159, + 21888242871839275222246405745257275088548364400416034343698204058747374800350, + 364900308699644, + 21888242871839275222246405745257275088548364400416034343698203972707538894706, + 122069190509938, + 21888242871839275222246405745257275088548364400416034343698204004966038053152, + 21888242871839275222246405745257275088548364400416034343698204098419327531245, + 166440975881958, + 21888242871839275222246405745257275088548364400416034343698203670708037715572, + 260491137662612, + 203358572094889, + 85601898009551, + 21888242871839275222246405745257275088548364400416034343698204185569461776106, + 238840050662702, + 21888242871839275222246405745257275088548364400416034343698203916503346742526, + 562319611119137, + 21888242871839275222246405745257275088548364400416034343698204045871465971378, + 21888242871839275222246405745257275088548364400416034343698203787092788625120, + 21888242871839275222246405745257275088548364400416034343698203675592919945570, + 135657418292500, + 18050344658654, + 21888242871839275222246405745257275088548364400416034343698203982939449456655, + 21888242871839275222246405745257275088548364400416034343698203921652323824691, + 386298905691123, + 21888242871839275222246405745257275088548364400416034343698203775137354519602, + 21888242871839275222246405745257275088548364400416034343698204054070936378797, + 21888242871839275222246405745257275088548364400416034343698203850331921038145, + 168769375290333, + 96389771343772, + 21888242871839275222246405745257275088548364400416034343698203636683089329050, + 312020014258625, + 472148684314773, + 161437006651215, + 21888242871839275222246405745257275088548364400416034343698203695607392149801, + 72227357085599, + 307428822866502, + 21888242871839275222246405745257275088548364400416034343698203818517962137564, + 21888242871839275222246405745257275088548364400416034343698204152110737886575, + 1608515938677, + 546491920202842, + 124549076901146, + 166688398877410, + 21888242871839275222246405745257275088548364400416034343698203906798940160368, + 21888242871839275222246405745257275088548364400416034343698204031580022149439, + 21888242871839275222246405745257275088548364400416034343698203892434896708782, + 39554856923835, + 205341257927405, + 535330023136103, + 10896243123969, + 59330991401735, + 21888242871839275222246405745257275088548364400416034343698203754069694933176, + 7207336507857, + 21888242871839275222246405745257275088548364400416034343698203915195874757164, + 21888242871839275222246405745257275088548364400416034343698204007079246897234, + 21888242871839275222246405745257275088548364400416034343698204076361650400220, + 21888242871839275222246405745257275088548364400416034343698204137317909491796, + 548005793906758, + 532946693016151, + 21888242871839275222246405745257275088548364400416034343698203986779449248170, + 21888242871839275222246405745257275088548364400416034343698204013771951686725, + 21888242871839275222246405745257275088548364400416034343698203686509284919412, + 244745878457673, + 553970671149351, + 21888242871839275222246405745257275088548364400416034343698203812487459755250, + 62972306263159, + 149008447599439, + 21888242871839275222246405745257275088548364400416034343698204165255481750352, + 160505590889509, + 122320951972558, + 114207982248679, + 21888242871839275222246405745257275088548364400416034343698203776635523415791, + 21888242871839275222246405745257275088548364400416034343698203753126626016362, + 21888242871839275222246405745257275088548364400416034343698203629853989270243, + 324647949214577, + 21888242871839275222246405745257275088548364400416034343698203623922361716194, + 21888242871839275222246405745257275088548364400416034343698204118407066157005, + 21888242871839275222246405745257275088548364400416034343698203992748487226688, + 21888242871839275222246405745257275088548364400416034343698203960978339461196, + 310393569964878, + 21888242871839275222246405745257275088548364400416034343698203807569569375167, + 21888242871839275222246405745257275088548364400416034343698203666518058931792, + 21888242871839275222246405745257275088548364400416034343698203678471031292571, + 193031078886140, + 21888242871839275222246405745257275088548364400416034343698203968389626449366, + 20688786002146, + 21888242871839275222246405745257275088548364400416034343698203767122242010748, + 257449042773067, + 21888242871839275222246405745257275088548364400416034343698203972799840544551, + 238812264551989, + 21888242871839275222246405745257275088548364400416034343698203653215008084206, + 21888242871839275222246405745257275088548364400416034343698204032326651869910, + 21888242871839275222246405745257275088548364400416034343698203887091740177248, + 183025549904984, + 21888242871839275222246405745257275088548364400416034343698203851953418375531, + 21888242871839275222246405745257275088548364400416034343698203937217946271454, + 21888242871839275222246405745257275088548364400416034343698203839768309439713, + 226723616364701, + 324594549307476, + 473655198843175, + 76143964987948, + 21888242871839275222246405745257275088548364400416034343698203886143556260922, + 54699313603321, + 156037076691538, + 147758459803819, + 174951151815053, + 21888242871839275222246405745257275088548364400416034343698204114960600403571, + 21888242871839275222246405745257275088548364400416034343698204120770901363099, + 21888242871839275222246405745257275088548364400416034343698204181605609700981, + 21888242871839275222246405745257275088548364400416034343698203986923017569527, + 21888242871839275222246405745257275088548364400416034343698203646614433674639, + 21888242871839275222246405745257275088548364400416034343698203694260183423905, + 138620970191327, + 21888242871839275222246405745257275088548364400416034343698203867841827826750, + 21888242871839275222246405745257275088548364400416034343698204125263938270468, + 376192497002124, + 21888242871839275222246405745257275088548364400416034343698203911044040670157, + 21888242871839275222246405745257275088548364400416034343698203935206556807602, + 195014743093893, + 247881150768597, + 160904951951645, + 21888242871839275222246405745257275088548364400416034343698203923683157162751, + 21888242871839275222246405745257275088548364400416034343698203700235217174289, + 319206872813117, + 95784866763767, + 497791522283020, + 21888242871839275222246405745257275088548364400416034343698203800261302310276, + 210497349575409, + 269131068295912, + 349545351819010, + 340068616761244, + 21888242871839275222246405745257275088548364400416034343698203649726843151111, + 451335668314024, + 105276381774556, + 384205766703178, + 551153375430106, + 113502315540398, + 21888242871839275222246405745257275088548364400416034343698204015694149114455, + 21888242871839275222246405745257275088548364400416034343698203679451757203745, + 21888242871839275222246405745257275088548364400416034343698203837629147421146, + 27057984967044, + 21888242871839275222246405745257275088548364400416034343698204107074435000920, + 21888242871839275222246405745257275088548364400416034343698203868093745079871, + 150381856518965, + 21888242871839275222246405745257275088548364400416034343698204070454110886917, + 21888242871839275222246405745257275088548364400416034343698203794571669028048, + 463397216878886, + 229354247361950, + 21888242871839275222246405745257275088548364400416034343698203716245919268118, + 17573923445403, + 180482222054330, + 21888242871839275222246405745257275088548364400416034343698203830739156328658, + 373646478433737, + 510307733952111, + 362687275556223, + 461335860102901, + 398784072487615, + 305871524163518, + 21888242871839275222246405745257275088548364400416034343698204051146600343328, + 21888242871839275222246405745257275088548364400416034343698204105171583516735, + 21888242871839275222246405745257275088548364400416034343698203851453328233123, + 421423799964155, + 269178381453660, + 21888242871839275222246405745257275088548364400416034343698203889801216265603, + 207474055869908, + 21888242871839275222246405745257275088548364400416034343698203647811223164087, + 207668367912062, + 21888242871839275222246405745257275088548364400416034343698203785074793694670, + 21888242871839275222246405745257275088548364400416034343698203906379586677367, + 21888242871839275222246405745257275088548364400416034343698204006245534453675, + 21888242871839275222246405745257275088548364400416034343698203852075917998283, + 321431901144721, + 550655038347826, + 223841402821161, + 11159971692288, + 21888242871839275222246405745257275088548364400416034343698204162318088536378, + 335432478708630, + 21888242871839275222246405745257275088548364400416034343698204125505269578145, + 515610057964774, + 505246517331217, + 463590148110481, + 21888242871839275222246405745257275088548364400416034343698203676626105875576, + 21888242871839275222246405745257275088548364400416034343698204040263452144873, + 21888242871839275222246405745257275088548364400416034343698203654155985773327, + 159513509483393, + 21888242871839275222246405745257275088548364400416034343698203647229243867188, + 21888242871839275222246405745257275088548364400416034343698203664554252127560, + 21888242871839275222246405745257275088548364400416034343698203810518627672343, + 463858730480066, + 527492445100070, + 55730087070949, + 21888242871839275222246405745257275088548364400416034343698204091378828421027, + 368129130000386, + 22542809282132, + 21888242871839275222246405745257275088548364400416034343698203968548071904743, + 21888242871839275222246405745257275088548364400416034343698203960860234986671, + 21888242871839275222246405745257275088548364400416034343698203724424111536826, + 285465901715316, + 413982135517465, + 21888242871839275222246405745257275088548364400416034343698203625739273416927, + 21888242871839275222246405745257275088548364400416034343698203701151438377895, + 21888242871839275222246405745257275088548364400416034343698204145271818063050, + 21888242871839275222246405745257275088548364400416034343698203720475444087511, + 332771760166908, + 499653041527449, + 273843850812101, + 257950382070135, + 21888242871839275222246405745257275088548364400416034343698203972732222932582, + 301167232052134, + 21888242871839275222246405745257275088548364400416034343698204041107403448751, + 391292145787666, + 21888242871839275222246405745257275088548364400416034343698204085773427431696, + 209834667408101, + 258835875258534, + 21888242871839275222246405745257275088548364400416034343698203631743347195849, + 21888242871839275222246405745257275088548364400416034343698204099875542295643, + 21888242871839275222246405745257275088548364400416034343698204006054604156051, + 321518571909663, + 21888242871839275222246405745257275088548364400416034343698204078503449988015, + 21888242871839275222246405745257275088548364400416034343698203893322871347038, + 99977606364949, + 21888242871839275222246405745257275088548364400416034343698204054548596572389, + 125532424152377, + 78327349757858, + 460069571529081, + 331053310171200, + 269432356246995, + 21888242871839275222246405745257275088548364400416034343698203757632803273399, + 21888242871839275222246405745257275088548364400416034343698204046660572928058, + 66722588308150, + 356254351806015, + 221556216346343, + 21888242871839275222246405745257275088548364400416034343698203662678887068893, + 264515082981509, + 328451445800403, + 21888242871839275222246405745257275088548364400416034343698203740036202722517, + 21888242871839275222246405745257275088548364400416034343698203699164485508953, + 21888242871839275222246405745257275088548364400416034343698203759032096599607, + 21888242871839275222246405745257275088548364400416034343698203856674368502453, + 477159053549113, + 221534456881488, + 21888242871839275222246405745257275088548364400416034343698204024681627212335, + 21888242871839275222246405745257275088548364400416034343698203926239288599734, + 506083640834837, + 446925089390723, + 21888242871839275222246405745257275088548364400416034343698203710452330426101, + 21888242871839275222246405745257275088548364400416034343698204079782157839014, + 21888242871839275222246405745257275088548364400416034343698203766353764585290, + 441558988799642, + 377010507783540, + 21888242871839275222246405745257275088548364400416034343698203980587644904659, + 522093375662976, + 21888242871839275222246405745257275088548364400416034343698203671346805401813, + 21888242871839275222246405745257275088548364400416034343698204032326454070609, + 148785105039628, + 301975456600878, + 21888242871839275222246405745257275088548364400416034343698203663537397383385, + 467890266871050, + 21888242871839275222246405745257275088548364400416034343698204073767822212384, + 37207991676624, + 157434145861228, + 21667365772715, + 39323679545907, + 93316929734066, + 21888242871839275222246405745257275088548364400416034343698203798117954679941, + 21888242871839275222246405745257275088548364400416034343698204150235172346262, + 247151786573485, + 21888242871839275222246405745257275088548364400416034343698203687101370013640, + 21888242871839275222246405745257275088548364400416034343698203989348893367503, + 21888242871839275222246405745257275088548364400416034343698203815497088361576, + 21888242871839275222246405745257275088548364400416034343698203794129880101197, + 351961890900151, + 167445998535656, + 246669264938824, + 530481752400845, + 21888242871839275222246405745257275088548364400416034343698203655580489801491, + 21888242871839275222246405745257275088548364400416034343698203671618089716698, + 21888242871839275222246405745257275088548364400416034343698203711388365781072, + 21888242871839275222246405745257275088548364400416034343698204143811637760435, + 21888242871839275222246405745257275088548364400416034343698204161753073516216, + 21888242871839275222246405745257275088548364400416034343698204036499067605832, + 21888242871839275222246405745257275088548364400416034343698204014627116224122, + 56122494422986, + 440482771273666, + 21888242871839275222246405745257275088548364400416034343698203679384433126046, + 21888242871839275222246405745257275088548364400416034343698203811994759874779, + 21888242871839275222246405745257275088548364400416034343698203975035829801002, + 21888242871839275222246405745257275088548364400416034343698203896168220821367, + 328570365995975, + 21888242871839275222246405745257275088548364400416034343698203651803339500478, + 21888242871839275222246405745257275088548364400416034343698203870424930415055, + 369626553601902, + 437813863266933, + 21888242871839275222246405745257275088548364400416034343698203966869458466421, + 21888242871839275222246405745257275088548364400416034343698204008649416416089, + 21888242871839275222246405745257275088548364400416034343698203665886522029430, + 493416372810728, + 21888242871839275222246405745257275088548364400416034343698203734296310627546, + 57453854439580, + 163883043502403, + 410275651716131, + 503365741573075, + 21888242871839275222246405745257275088548364400416034343698204184375072795328, + 21888242871839275222246405745257275088548364400416034343698204116036918438587, + 385526687203186, + 53871692915154, + 358512515617651, + 103268374872369, + 21888242871839275222246405745257275088548364400416034343698204015247652438141, + 21888242871839275222246405745257275088548364400416034343698204119418998912079, + 18431118551197, + 21888242871839275222246405745257275088548364400416034343698203924123820268755, + 230284867717672, + 21888242871839275222246405745257275088548364400416034343698204059011997418343, + 21888242871839275222246405745257275088548364400416034343698204156759364832936, + 21888242871839275222246405745257275088548364400416034343698204135571893846839, + 21888242871839275222246405745257275088548364400416034343698204076776389041620, + 31632909697169, + 228415541192436, + 21888242871839275222246405745257275088548364400416034343698203803447220590129, + 167667186650548, + 21888242871839275222246405745257275088548364400416034343698204068322880435281, + 191832623561346, + 290784306146211, + 21888242871839275222246405745257275088548364400416034343698203924992743760980, + 149493103298848, + 107398851341896, + 560456030138871, + 508650760066612, + 21888242871839275222246405745257275088548364400416034343698203706655105540363, + 21888242871839275222246405745257275088548364400416034343698203980216277998359, + 21888242871839275222246405745257275088548364400416034343698204153371769001705, + 21888242871839275222246405745257275088548364400416034343698203956219440405034, + 21888242871839275222246405745257275088548364400416034343698203697542743800095, + 321934009643301, + 139818895135913, + 453090314389757, + 21888242871839275222246405745257275088548364400416034343698204107268420882514, + 21888242871839275222246405745257275088548364400416034343698204069517051693379, + 176345586495218, + 21888242871839275222246405745257275088548364400416034343698203984711911325730, + 381551911980427, + 317014058350912, + 21888242871839275222246405745257275088548364400416034343698204001970953104129, + 546827529279811, + 21888242871839275222246405745257275088548364400416034343698203743147073819372, + 442066694033635, + 21888242871839275222246405745257275088548364400416034343698203836694315575279, + 21888242871839275222246405745257275088548364400416034343698203893350954836062, + 21888242871839275222246405745257275088548364400416034343698204115891557973257, + 489909917821360, + 21888242871839275222246405745257275088548364400416034343698204080242357239773, + 21888242871839275222246405745257275088548364400416034343698204155974782211341, + 21888242871839275222246405745257275088548364400416034343698203782717939540071, + 521171652818410, + 182162522947295, + 488586963885888, + 446014989720779, + 160807106557722, + 21888242871839275222246405745257275088548364400416034343698204040749487803942, + 21888242871839275222246405745257275088548364400416034343698204130231900586815, + 221154659913356, + 159985360992536, + 312862900388441, + 453476042649557, + 21888242871839275222246405745257275088548364400416034343698204078275236269951, + 21888242871839275222246405745257275088548364400416034343698203701032515264559, + 435283553023679, + 229815503168971, + 326264850201297, + 391145760668443, + 21888242871839275222246405745257275088548364400416034343698203782941417319671, + 230107023702425, + 385821749564566, + 21888242871839275222246405745257275088548364400416034343698203693349560547109, + 21888242871839275222246405745257275088548364400416034343698204142907796643635, + 21888242871839275222246405745257275088548364400416034343698203908506597520834, + 386977345484423, + 115909496821751, + 452341308294794, + 105401192104873, + 351893028065056, + 558325313429360, + 396462376697968, + 21888242871839275222246405745257275088548364400416034343698204072622535494447, + 21888242871839275222246405745257275088548364400416034343698204180999622261313, + 25142475604020, + 466394784693287, + 21888242871839275222246405745257275088548364400416034343698203790275071122766, + 21888242871839275222246405745257275088548364400416034343698204128381562761332, + 186904199286081, + 24694793340978, + 218343173220069, + 251156947203869, + 68020492262593, + 238291476527009, + 21888242871839275222246405745257275088548364400416034343698203642889075648925, + 21888242871839275222246405745257275088548364400416034343698204052749102864841, + 21888242871839275222246405745257275088548364400416034343698203670753925007905, + 18597057546421, + 133646779286365, + 166937918690668, + 21888242871839275222246405745257275088548364400416034343698203929811666273612, + 333357991442788, + 21888242871839275222246405745257275088548364400416034343698203783652494436285, + 21888242871839275222246405745257275088548364400416034343698203946561348510563, + 170457193373781, + 393354668045879, + 258193940442691, + 26516717530991, + 21888242871839275222246405745257275088548364400416034343698204151705408049420, + 21888242871839275222246405745257275088548364400416034343698203994685055714990, + 234474157687361, + 142633927445977, + 382380959460817, + 63207061099178, + 21888242871839275222246405745257275088548364400416034343698204023677828718567, + 294156564785695, + 149196906530404, + 21888242871839275222246405745257275088548364400416034343698203912003611161036, + 196172099833037, + 21888242871839275222246405745257275088548364400416034343698203990293884052736, + 55546751863956, + 526388352322802, + 271247217802614, + 488263739390342, + 145552405956175, + 21888242871839275222246405745257275088548364400416034343698203776149600947906, + 21888242871839275222246405745257275088548364400416034343698203695316812429083, + 541044085518325, + 137069226737436, + 249188166037966, + 21888242871839275222246405745257275088548364400416034343698203937425555692422, + 21888242871839275222246405745257275088548364400416034343698203967646293556526, + 21888242871839275222246405745257275088548364400416034343698203878642970304773, + 344667283040790, + 21888242871839275222246405745257275088548364400416034343698203751748522527547, + 21888242871839275222246405745257275088548364400416034343698204183620061294072, + 21888242871839275222246405745257275088548364400416034343698203760399827667874, + 19665271469455, + 227873264392323, + 21888242871839275222246405745257275088548364400416034343698203948841917746990, + 21888242871839275222246405745257275088548364400416034343698204043606748971505, + 21888242871839275222246405745257275088548364400416034343698203922455617986952, + 177846234633749, + 261265834474369, + 428200087914750, + 404691176728644, + 21888242871839275222246405745257275088548364400416034343698204163531416524101, + 21888242871839275222246405745257275088548364400416034343698204062277202514914, + 21888242871839275222246405745257275088548364400416034343698203696670768724817, + 21888242871839275222246405745257275088548364400416034343698204119386845853576, + 21888242871839275222246405745257275088548364400416034343698203886170842178875, + 492900922921361, + 476978113943619, + 21888242871839275222246405745257275088548364400416034343698203668351072614276, + 21888242871839275222246405745257275088548364400416034343698203668962430211150, + 21888242871839275222246405745257275088548364400416034343698203847246899779114, + 21888242871839275222246405745257275088548364400416034343698204096834618470260, + 317346319292401, + 21888242871839275222246405745257275088548364400416034343698203798006993807526, + 427522726994219, + 21888242871839275222246405745257275088548364400416034343698203849761913437070, + 531061952381983, + 291754047508690, + 21888242871839275222246405745257275088548364400416034343698203902513574198814, + 21888242871839275222246405745257275088548364400416034343698204125685261985875, + 449288260589769, + 21888242871839275222246405745257275088548364400416034343698203698246989553670, + 167184752630098, + 21888242871839275222246405745257275088548364400416034343698203683066759416902, + 166419647778435, + 513450757597511, + 21888242871839275222246405745257275088548364400416034343698204171954034657367, + 21888242871839275222246405745257275088548364400416034343698204031131189693350, + 21888242871839275222246405745257275088548364400416034343698203990967940208799, + 254651518244605, + 21888242871839275222246405745257275088548364400416034343698203866160850713616, + 369363501800617, + 21888242871839275222246405745257275088548364400416034343698204149129111196269, + 402956420325438, + 160173657798116, + 21888242871839275222246405745257275088548364400416034343698203624278419154106, + 46615216756871, + 191859062181490, + 21888242871839275222246405745257275088548364400416034343698204124709665334298, + 21888242871839275222246405745257275088548364400416034343698203996160007267647, + 102710332374088, + 323074943391547, + 21888242871839275222246405745257275088548364400416034343698203880718557224495, + 21888242871839275222246405745257275088548364400416034343698203717736023908209, + 21888242871839275222246405745257275088548364400416034343698204025834658787537, + 21888242871839275222246405745257275088548364400416034343698204110145455210105, + 21888242871839275222246405745257275088548364400416034343698204005229948696534, + 21888242871839275222246405745257275088548364400416034343698203988909746123500, + 2840173986868, + 367048429444943, + 21888242871839275222246405745257275088548364400416034343698204071387814612488, + 21888242871839275222246405745257275088548364400416034343698204090217419310984, + 21888242871839275222246405745257275088548364400416034343698203840464223855459, + 21888242871839275222246405745257275088548364400416034343698203979672143887064, + 21888242871839275222246405745257275088548364400416034343698203763708287666102, + 21888242871839275222246405745257275088548364400416034343698203862632667036324, + 358644987086010, + 509998714840740, + 551824802662360, + 77949002348803, + 21888242871839275222246405745257275088548364400416034343698203786255468328891, + 354462054898613, + 21888242871839275222246405745257275088548364400416034343698203693759008303613, + 21888242871839275222246405745257275088548364400416034343698203833499847494722, + 21888242871839275222246405745257275088548364400416034343698203679261157052032, + 21888242871839275222246405745257275088548364400416034343698203997482572435445, + 78669740907864, + 11886059505419, + 21888242871839275222246405745257275088548364400416034343698203906455454113920, + 21888242871839275222246405745257275088548364400416034343698203635516754484202, + 21888242871839275222246405745257275088548364400416034343698204036291698508247, + 41853169984952, + 21888242871839275222246405745257275088548364400416034343698203727784866558362, + 443814941792006, + 110731009751218, + 21888242871839275222246405745257275088548364400416034343698203991654290253324, + 338392420786022, + 177589564818888, + 21888242871839275222246405745257275088548364400416034343698203809088202806386, + 21888242871839275222246405745257275088548364400416034343698203767532922245155, + 241879376536707, + 21888242871839275222246405745257275088548364400416034343698203962867954575034, + 371061214430261, + 21888242871839275222246405745257275088548364400416034343698203689401606125559, + 21888242871839275222246405745257275088548364400416034343698204071751426075852, + 21888242871839275222246405745257275088548364400416034343698203777832873177121, + 21888242871839275222246405745257275088548364400416034343698203830655719095841, + 21888242871839275222246405745257275088548364400416034343698204131686176492949, + 372047169558953, + 21888242871839275222246405745257275088548364400416034343698203746308976020137, + 21888242871839275222246405745257275088548364400416034343698204173835468816579, + 487728249819199, + 21888242871839275222246405745257275088548364400416034343698203657097198975353, + 21888242871839275222246405745257275088548364400416034343698203924492241719018, + 156968541563156, + 389080550891956, + 189655342376876, + 175445884273455, + 222273759439873, + 21888242871839275222246405745257275088548364400416034343698203995052144764120, + 21888242871839275222246405745257275088548364400416034343698203634558201031291, + 414892028552163, + 534997203438261, + 21888242871839275222246405745257275088548364400416034343698203894927571365389, + 204396655300263, + 242711966918974, + 21888242871839275222246405745257275088548364400416034343698203637774462129828, + 491657004047257, + 21888242871839275222246405745257275088548364400416034343698203972810643936518, + 465582029508319, + 61025370889875, + 21888242871839275222246405745257275088548364400416034343698203648016640796452, + 509188931493756, + 37437235350579, + 196028922145726, + 393436328859561, + 21888242871839275222246405745257275088548364400416034343698203702378983864469, + 21888242871839275222246405745257275088548364400416034343698203890766622883842, + 408278497595095, + 21888242871839275222246405745257275088548364400416034343698203703576395791785, + 133254497262477, + 21888242871839275222246405745257275088548364400416034343698203758642660238462, + 21888242871839275222246405745257275088548364400416034343698203687671027748664, + 552048335173191, + 21888242871839275222246405745257275088548364400416034343698203809453867004864, + 21888242871839275222246405745257275088548364400416034343698203867327237134629, + 348301597923744, + 427753911168532, + 21888242871839275222246405745257275088548364400416034343698204171811376479835, + 21888242871839275222246405745257275088548364400416034343698203994530578151628, + 21888242871839275222246405745257275088548364400416034343698203928099354312951, + 21888242871839275222246405745257275088548364400416034343698203815010392257543, + 21888242871839275222246405745257275088548364400416034343698204049167974030068, + 21888242871839275222246405745257275088548364400416034343698203748126003388365, + 21888242871839275222246405745257275088548364400416034343698203667854235317371, + 21888242871839275222246405745257275088548364400416034343698203822656827116914, + 21888242871839275222246405745257275088548364400416034343698204001161248179265, + 283823916091721, + 21888242871839275222246405745257275088548364400416034343698203950726292743426, + 21888242871839275222246405745257275088548364400416034343698203636714034587368, + 21888242871839275222246405745257275088548364400416034343698204079786392756004, + 21888242871839275222246405745257275088548364400416034343698203843033045281875, + 21888242871839275222246405745257275088548364400416034343698203858335889637403, + 382023609804558, + 21888242871839275222246405745257275088548364400416034343698203783462060577369, + 321562411045982, + 21888242871839275222246405745257275088548364400416034343698203930243570843677, + 21888242871839275222246405745257275088548364400416034343698203778053265897195, + 21888242871839275222246405745257275088548364400416034343698204035318250229562, + 21888242871839275222246405745257275088548364400416034343698203980628474096886, + 21888242871839275222246405745257275088548364400416034343698204121334481312122, + 21888242871839275222246405745257275088548364400416034343698203863269314677019, + 209377892111686, + 21888242871839275222246405745257275088548364400416034343698203949755965713775, + 434880147883109, + 272235911807995, + 21888242871839275222246405745257275088548364400416034343698204037325273354934, + 436531458592871, + 21888242871839275222246405745257275088548364400416034343698203763536293235797, + 455354129126530, + 5477325619490, + 249678162898394, + 69667914616351, + 21888242871839275222246405745257275088548364400416034343698203812502894514629, + 540902990846241, + 209902827349301, + 360246891022862, + 21888242871839275222246405745257275088548364400416034343698203765224999832691, + 21888242871839275222246405745257275088548364400416034343698203838142671409458, + 248373409739967, + 21888242871839275222246405745257275088548364400416034343698203704112741459865, + 388858178544785, + 21888242871839275222246405745257275088548364400416034343698204131010404240381, + 21888242871839275222246405745257275088548364400416034343698204068368852911247, + 140461135084120, + 21888242871839275222246405745257275088548364400416034343698204044187791038852, + 194814759117839, + 21888242871839275222246405745257275088548364400416034343698203738967537189674, + 364093160188151, + 259242555619920, + 416147918685030, + 46334868735555, + 503052619376707, + 21888242871839275222246405745257275088548364400416034343698204178739043782392, + 21888242871839275222246405745257275088548364400416034343698204140906218679360, + 499385008387786, + 117190919283821, + 21888242871839275222246405745257275088548364400416034343698204073039925782320, + 21888242871839275222246405745257275088548364400416034343698203692651951088135, + 21888242871839275222246405745257275088548364400416034343698203667854886612604, + 21888242871839275222246405745257275088548364400416034343698203668013208007545, + 21888242871839275222246405745257275088548364400416034343698203948909043472729, + 21888242871839275222246405745257275088548364400416034343698203638950010645806, + 333976812110321, + 21888242871839275222246405745257275088548364400416034343698204085957828786628, + 15017733327428, + 543189824603659, + 21888242871839275222246405745257275088548364400416034343698204066128439817129, + 21888242871839275222246405745257275088548364400416034343698203840609047068994, + 21888242871839275222246405745257275088548364400416034343698204057765632464284, + 21888242871839275222246405745257275088548364400416034343698203854128298170486, + 407423548656222, + 21888242871839275222246405745257275088548364400416034343698204167616611458817, + 21888242871839275222246405745257275088548364400416034343698203673085682673458, + 21888242871839275222246405745257275088548364400416034343698203927738618202422, + 21888242871839275222246405745257275088548364400416034343698204091513855928076, + 21888242871839275222246405745257275088548364400416034343698203724942235928063, + 404128506458318, + 21888242871839275222246405745257275088548364400416034343698203645703278439249, + 171265350432787, + 21888242871839275222246405745257275088548364400416034343698203905200353267419, + 21888242871839275222246405745257275088548364400416034343698203750877237127637, + 21888242871839275222246405745257275088548364400416034343698203934757139045786, + 180213456728766, + 21888242871839275222246405745257275088548364400416034343698203634817501873936, + 327872390149458, + 21888242871839275222246405745257275088548364400416034343698204140088709386449, + 21888242871839275222246405745257275088548364400416034343698204156752770310952, + 21888242871839275222246405745257275088548364400416034343698204183024312474398, + 554402039164837, + 21888242871839275222246405745257275088548364400416034343698204114933037446006, + 21888242871839275222246405745257275088548364400416034343698204062634356552901, + 68963754197076, + 21888242871839275222246405745257275088548364400416034343698203702812810745830, + 21888242871839275222246405745257275088548364400416034343698203796853633843785, + 143000155426668, + 231299558936399, + 452516548907826, + 21888242871839275222246405745257275088548364400416034343698203855712293964339, + 21888242871839275222246405745257275088548364400416034343698204148602211230794, + 156633763353288, + 222656853197038, + 21888242871839275222246405745257275088548364400416034343698203733886213168181, + 21888242871839275222246405745257275088548364400416034343698204167076918107264, + 238800081659212, + 61243276137514, + 21888242871839275222246405745257275088548364400416034343698203678649320245176, + 21888242871839275222246405745257275088548364400416034343698204051849013832755, + 313920357330832, + 21888242871839275222246405745257275088548364400416034343698203913327950472980, + 181736604251788, + 21888242871839275222246405745257275088548364400416034343698204168772693336540, + 532782213469380, + 21888242871839275222246405745257275088548364400416034343698203963801203006664, + 21888242871839275222246405745257275088548364400416034343698204035645455110856, + 149591154689786, + 21888242871839275222246405745257275088548364400416034343698204154671063990915, + 21888242871839275222246405745257275088548364400416034343698203909124613651506, + 324851552449010, + 21888242871839275222246405745257275088548364400416034343698203914031555646720, + 119150758997112, + 21888242871839275222246405745257275088548364400416034343698203987489505192472, + 167925061493557, + 297270339969902, + 104548893112978, + 558762734887166, + 21888242871839275222246405745257275088548364400416034343698203674187509773683, + 175053272878272, + 302368733982894, + 484134661250861, + 21888242871839275222246405745257275088548364400416034343698204029438328184138, + 21888242871839275222246405745257275088548364400416034343698204127568588624677, + 74514706515946, + 21888242871839275222246405745257275088548364400416034343698203986549193661163, + 457378050161109, + 21888242871839275222246405745257275088548364400416034343698203701318571874952, + 365826683801325, + 21888242871839275222246405745257275088548364400416034343698203703910344459448, + 368546273807798, + 543576430150149, + 21888242871839275222246405745257275088548364400416034343698203761525438883658, + 21888242871839275222246405745257275088548364400416034343698203703740876628476, + 21888242871839275222246405745257275088548364400416034343698203682289095376763, + 158020624523961, + 21888242871839275222246405745257275088548364400416034343698203786441285272522, + 435267523283927, + 21888242871839275222246405745257275088548364400416034343698203712751140471915, + 408490774701225, + 21888242871839275222246405745257275088548364400416034343698203795995529506246, + 347671291252101, + 21888242871839275222246405745257275088548364400416034343698204017396297994972, + 21888242871839275222246405745257275088548364400416034343698203672768633690885, + 119857837214519, + 21888242871839275222246405745257275088548364400416034343698204119954920465283, + 328674073742316, + 125665660859816, + 21888242871839275222246405745257275088548364400416034343698204001596833377663, + 288195241721724, + 21888242871839275222246405745257275088548364400416034343698203657532007465555, + 40157671056359, + 21888242871839275222246405745257275088548364400416034343698204146511781803649, + 21888242871839275222246405745257275088548364400416034343698203841352170580931, + 21888242871839275222246405745257275088548364400416034343698203744183429711894, + 88437231721885, + 204375538099370, + 352405315016964, + 48282067309890, + 396547131130861, + 203499191109905, + 21888242871839275222246405745257275088548364400416034343698203883841693831531, + 21888242871839275222246405745257275088548364400416034343698203944965519411237, + 169297119934866, + 324570733311220, + 21888242871839275222246405745257275088548364400416034343698204000919112425008, + 93342014381, + 21888242871839275222246405745257275088548364400416034343698203813666827922771, + 323349229276549, + 545571991842403, + 21888242871839275222246405745257275088548364400416034343698204036613333336739, + 21888242871839275222246405745257275088548364400416034343698204098510313311046, + 21888242871839275222246405745257275088548364400416034343698203735595115572404, + 21888242871839275222246405745257275088548364400416034343698204038468006380004, + 559221948276146, + 21888242871839275222246405745257275088548364400416034343698203658591226237292, + 21888242871839275222246405745257275088548364400416034343698204049459327352028, + 382551960770794, + 265028126185102, + 21888242871839275222246405745257275088548364400416034343698203789140718952665, + 348597635274690, + 152277185308933, + 375385827909415, + 122892455367302, + 21888242871839275222246405745257275088548364400416034343698203830074689878463, + 21888242871839275222246405745257275088548364400416034343698203744478241590260, + 21888242871839275222246405745257275088548364400416034343698203907643220651158, + 21888242871839275222246405745257275088548364400416034343698203728950848944157, + 626557813356, + 21888242871839275222246405745257275088548364400416034343698204136219535677195, + 21888242871839275222246405745257275088548364400416034343698203977063090097574, + 287393959797355, + 21888242871839275222246405745257275088548364400416034343698203766113278207360, + 341240088223722, + 439815431690913, + 523264803521144, + 21888242871839275222246405745257275088548364400416034343698204125438502175408, + 21888242871839275222246405745257275088548364400416034343698203742932257370168, + 21888242871839275222246405745257275088548364400416034343698204122129576824774, + 32304602415439, + 21888242871839275222246405745257275088548364400416034343698203678219910425321, + 83672359917171, + 21888242871839275222246405745257275088548364400416034343698204176612247014439, + 21888242871839275222246405745257275088548364400416034343698204040826904297908, + 293389268412979, + 21888242871839275222246405745257275088548364400416034343698203687423608567537, + 21888242871839275222246405745257275088548364400416034343698203642297833346403, + 21888242871839275222246405745257275088548364400416034343698204137959056284018, + 101526456057575, + 480498641656230, + 20967936623415, + 173784238723358, + 21888242871839275222246405745257275088548364400416034343698204114889797773978, + 454395493450385, + 104278486987809, + 21888242871839275222246405745257275088548364400416034343698204186364638236089, + 21888242871839275222246405745257275088548364400416034343698203823557149635496, + 21888242871839275222246405745257275088548364400416034343698204110159787358875, + 21888242871839275222246405745257275088548364400416034343698203933460690233436, + 21888242871839275222246405745257275088548364400416034343698203645346210074768, + 378899073211856, + 21888242871839275222246405745257275088548364400416034343698204145042446636924, + 444361891689818, + 450240989796942, + 111468944242263, + 500480283178592, + 37293630955146, + 21888242871839275222246405745257275088548364400416034343698203944351264091122, + 359634324147347, + 21888242871839275222246405745257275088548364400416034343698204020825698255027, + 511725143372292, + 21888242871839275222246405745257275088548364400416034343698203932425389188802, + 21888242871839275222246405745257275088548364400416034343698203649149588930326, + 449854280249455, + 499965017450004, + 550548612545249, + 21888242871839275222246405745257275088548364400416034343698203881426221598976, + 60318976774461, + 21888242871839275222246405745257275088548364400416034343698203960312707348713, + 335611830076378, + 62764715479848, + 21888242871839275222246405745257275088548364400416034343698204044123274312032, + 21888242871839275222246405745257275088548364400416034343698204091525571362083, + 21888242871839275222246405745257275088548364400416034343698203736597663167089, + 21888242871839275222246405745257275088548364400416034343698204186384141117314, + 372467411975780, + 21888242871839275222246405745257275088548364400416034343698203984932953169558, + 21888242871839275222246405745257275088548364400416034343698203822863218888049, + 269910498567676, + 186513152461455, + 21888242871839275222246405745257275088548364400416034343698203835993105182172, + 160538601158886, + 119853808450767, + 21888242871839275222246405745257275088548364400416034343698204122867449047114, + 335864931834817, + 21888242871839275222246405745257275088548364400416034343698203688528069961195, + 21888242871839275222246405745257275088548364400416034343698204181693375345824, + 21888242871839275222246405745257275088548364400416034343698203643269096439279, + 21888242871839275222246405745257275088548364400416034343698203764599782775043, + 247305558066380, + 496849584961780, + 482513857080043, + 580721277014, + 21888242871839275222246405745257275088548364400416034343698203878391104423028, + 21888242871839275222246405745257275088548364400416034343698203639086472210473, + 360302002434955, + 455686071654896, + 378112080397471, + 42903767339978, + 21888242871839275222246405745257275088548364400416034343698203928115895921554, + 537227511857572, + 432168236196761, + 21888242871839275222246405745257275088548364400416034343698204087361845792489, + 21888242871839275222246405745257275088548364400416034343698204163232188862011, + 21888242871839275222246405745257275088548364400416034343698203742482566320636, + 111699094711794, + 17534612782946, + 198379286593551, + 21888242871839275222246405745257275088548364400416034343698203899161013829421, + 409501239131367, + 523795716394091, + 21888242871839275222246405745257275088548364400416034343698203798876632738775, + 189469707486308, + 279516308297728, + 454570637719488, + 150713771639653, + 214192254475851, + 21888242871839275222246405745257275088548364400416034343698203947806554643979, + 21888242871839275222246405745257275088548364400416034343698204157983132500772, + 309354384904332, + 21888242871839275222246405745257275088548364400416034343698203983175523822442, + 209669624999977, + 311908887541382, + 460508918269098, + 21888242871839275222246405745257275088548364400416034343698204077938459548727, + 21888242871839275222246405745257275088548364400416034343698203745732432910596, + 21888242871839275222246405745257275088548364400416034343698203635494656301123, + 238008321672815, + 106877530568384, + 21888242871839275222246405745257275088548364400416034343698203995396188031220, + 23699501931735, + 21888242871839275222246405745257275088548364400416034343698204112095721848464, + 487313323367110, + 21888242871839275222246405745257275088548364400416034343698204095968702384763, + 21888242871839275222246405745257275088548364400416034343698203639043733298246, + 305730671696704, + 21888242871839275222246405745257275088548364400416034343698204064078862759078, + 88976738095339, + 21888242871839275222246405745257275088548364400416034343698203976645832958187, + 286885813732821, + 100956438012173, + 21888242871839275222246405745257275088548364400416034343698203787064840419983, + 438157593197324, + 303651142052349, + 21888242871839275222246405745257275088548364400416034343698203857267675743940, + 21888242871839275222246405745257275088548364400416034343698203922960978816174, + 21888242871839275222246405745257275088548364400416034343698203867251231547192, + 21888242871839275222246405745257275088548364400416034343698203849491982613967, + 21888242871839275222246405745257275088548364400416034343698204117723315914845, + 21888242871839275222246405745257275088548364400416034343698204161235093449421, + 307731826771972, + 21888242871839275222246405745257275088548364400416034343698203945777785463299, + 227995113606840, + 21888242871839275222246405745257275088548364400416034343698204095373333011526, + 21888242871839275222246405745257275088548364400416034343698203865025524943585, + 21888242871839275222246405745257275088548364400416034343698204049802397687984, + 21888242871839275222246405745257275088548364400416034343698203781959013566959, + 458894956119109, + 21888242871839275222246405745257275088548364400416034343698203783374067646317, + 21888242871839275222246405745257275088548364400416034343698203798915047888677, + 21888242871839275222246405745257275088548364400416034343698203660965762194691, + 21888242871839275222246405745257275088548364400416034343698203981024278449123, + 204687696174324, + 16289398857094, + 545586728790130, + 21888242871839275222246405745257275088548364400416034343698203734963487510920, + 21888242871839275222246405745257275088548364400416034343698203710160300841432, + 89599936074706, + 402932689953029, + 21888242871839275222246405745257275088548364400416034343698203902948803373742, + 21888242871839275222246405745257275088548364400416034343698204013582467743045, + 395027338639939, + 21888242871839275222246405745257275088548364400416034343698204024533388751405, + 461402518046247, + 21888242871839275222246405745257275088548364400416034343698203690071720689603, + 21888242871839275222246405745257275088548364400416034343698204090400975387924, + 81462132582331, + 539410230381574, + 21888242871839275222246405745257275088548364400416034343698203931945042830749, + 22684599751105, + 183963529212666, + 21888242871839275222246405745257275088548364400416034343698204006060627089411, + 21888242871839275222246405745257275088548364400416034343698204084647205452459, + 265876920829642, + 398065804646000, + 288721155071445, + 460950930724937, + 122878010173843, + 21888242871839275222246405745257275088548364400416034343698203816319554245247, + 21888242871839275222246405745257275088548364400416034343698204015802693951785, + 391769405802626, + 359599928082930, + 21888242871839275222246405745257275088548364400416034343698203701198305186757, + 21888242871839275222246405745257275088548364400416034343698203885423515229934, + 21888242871839275222246405745257275088548364400416034343698203630485560533419, + 195205647226821, + 514877598356488, + 196222992399944, + 21888242871839275222246405745257275088548364400416034343698204070627388098967, + 358800288503508, + 118048784394822, + 237045010899958, + 193733471678355, + 21888242871839275222246405745257275088548364400416034343698203675036410854204, + 212865028008768, + 21888242871839275222246405745257275088548364400416034343698204057879362499729, + 303701746765679, + 462017193256452, + 21888242871839275222246405745257275088548364400416034343698203806977137609096, + 21888242871839275222246405745257275088548364400416034343698204134494311907831, + 177632438928131, + 21888242871839275222246405745257275088548364400416034343698203629120885414815, + 21888242871839275222246405745257275088548364400416034343698203773663142881736, + 21888242871839275222246405745257275088548364400416034343698203793015347148303, + 21888242871839275222246405745257275088548364400416034343698203668410550232142, + 21888242871839275222246405745257275088548364400416034343698203909069581011790, + 357767067255215, + 21888242871839275222246405745257275088548364400416034343698203760504232998527, + 21888242871839275222246405745257275088548364400416034343698204168861177720026, + 211258484519438, + 21888242871839275222246405745257275088548364400416034343698203835393189585446, + 173017089895027, + 46090495264153, + 21888242871839275222246405745257275088548364400416034343698203937850472894884, + 21888242871839275222246405745257275088548364400416034343698203928270305532413, + 21888242871839275222246405745257275088548364400416034343698204180023107314703, + 198782251223029, + 4425850756308, + 21888242871839275222246405745257275088548364400416034343698203817705830662336, + 21888242871839275222246405745257275088548364400416034343698203625975146624987, + 21888242871839275222246405745257275088548364400416034343698203779289529780910, + 21888242871839275222246405745257275088548364400416034343698204097544596518065, + 530543744571069, + 21888242871839275222246405745257275088548364400416034343698203706159823343847, + 362415740622679, + 2532162616467, + 21888242871839275222246405745257275088548364400416034343698204055104482239032, + 21888242871839275222246405745257275088548364400416034343698203822410328730840, + 170050769256846, + 555194393564284, + 21888242871839275222246405745257275088548364400416034343698203841433554638836, + 408744422026919, + 509741334631788, + 332656579484130, + 21888242871839275222246405745257275088548364400416034343698203856016254165311, + 32590290760214, + 240495126576663, + 21888242871839275222246405745257275088548364400416034343698203864330111408590, + 343961820811079, + 221210917588058, + 21888242871839275222246405745257275088548364400416034343698203789012515883112, + 299914746992516, + 21888242871839275222246405745257275088548364400416034343698203991110346712408, + 543516251261761, + 21888242871839275222246405745257275088548364400416034343698203627916765252186, + 296630128228761, + 21888242871839275222246405745257275088548364400416034343698203658623647736714, + 21888242871839275222246405745257275088548364400416034343698203709056400921971, + 77326189955314, + 103912585817238, + 21888242871839275222246405745257275088548364400416034343698204138196067648574, + 21888242871839275222246405745257275088548364400416034343698204173857496314762, + 323776608698182, + 21888242871839275222246405745257275088548364400416034343698204097961413191997, + 21888242871839275222246405745257275088548364400416034343698204027608312165589, + 21888242871839275222246405745257275088548364400416034343698203814037915137765, + 78238395126803, + 21888242871839275222246405745257275088548364400416034343698204147165085455102, + 324915947132446, + 21888242871839275222246405745257275088548364400416034343698203799016945992090, + 21888242871839275222246405745257275088548364400416034343698204100985762445004, + 21888242871839275222246405745257275088548364400416034343698203814269521382603, + 21888242871839275222246405745257275088548364400416034343698203664722423266695, + 180271181361386, + 277842940518520, + 358924841208922, + 513287583409746, + 163351865557984, + 227322631131316, + 151553800393223, + 21888242871839275222246405745257275088548364400416034343698203994916796248768, + 21888242871839275222246405745257275088548364400416034343698204092026409219707, + 369425902766133, + 267107969952425, + 520243777365503, + 212483144236165, + 21888242871839275222246405745257275088548364400416034343698203922296471850576, + 98264647703042, + 230737766445285, + 144198182129162, + 21888242871839275222246405745257275088548364400416034343698203789879766921807, + 391908075521245, + 52126253432533, + 21888242871839275222246405745257275088548364400416034343698203997835834186669, + 21888242871839275222246405745257275088548364400416034343698203876537553677749, + 381902731604526, + 55034431049185, + 99428339199058, + 21888242871839275222246405745257275088548364400416034343698203700608641809702, + 21888242871839275222246405745257275088548364400416034343698204094267528812851, + 472618198565091, + 21888242871839275222246405745257275088548364400416034343698204013454756963686, + 19495322940778, + 199187194533198, + 21888242871839275222246405745257275088548364400416034343698203747147329532216, + 21888242871839275222246405745257275088548364400416034343698203880662166612490, + 456720992819638, + 183200748791865, + 20962261607569, + 519934708179474, + 45212137700176, + 21888242871839275222246405745257275088548364400416034343698203915044911560788, + 21888242871839275222246405745257275088548364400416034343698204001587049800353, + 21888242871839275222246405745257275088548364400416034343698204154028808019239, + 41949685239083, + 253390401301844, + 353564553462571, + 21888242871839275222246405745257275088548364400416034343698204059973230398338, + 484156525747413, + 21888242871839275222246405745257275088548364400416034343698203888926550906955, + 21888242871839275222246405745257275088548364400416034343698203700610483678344, + 21888242871839275222246405745257275088548364400416034343698204013854607309405, + 21888242871839275222246405745257275088548364400416034343698204124844942961263, + 301547791473349, + 495965804167340, + 301231244492355, + 137644076958765, + 45126743729570, + 21888242871839275222246405745257275088548364400416034343698204024939101960083, + 2733390493005, + 215988927605278, + 21888242871839275222246405745257275088548364400416034343698203626174388144612, + 21888242871839275222246405745257275088548364400416034343698203959777584303986, + 133682273683707, + 21888242871839275222246405745257275088548364400416034343698204095031214309510, + 168290047198312, + 456645581956305, + 21888242871839275222246405745257275088548364400416034343698203639794450247529, + 164796494469738, + 21888242871839275222246405745257275088548364400416034343698204001397894982374, + 448226861526510, + 259389375248860, + 21888242871839275222246405745257275088548364400416034343698204128176102694002, + 359403874992779, + 28442256962922, + 21888242871839275222246405745257275088548364400416034343698203913992453164889, + 342140628162750, + 21888242871839275222246405745257275088548364400416034343698203810514701153611, + 21888242871839275222246405745257275088548364400416034343698203912872033655866, + 107983591473088, + 497306344357076, + 469423710924132, + 21888242871839275222246405745257275088548364400416034343698203822143073104720, + 152353684159778, + 21888242871839275222246405745257275088548364400416034343698203919013538203994, + 21888242871839275222246405745257275088548364400416034343698203951984976458318, + 421873763528581, + 27917744908062, + 21888242871839275222246405745257275088548364400416034343698204138461377007407, + 21888242871839275222246405745257275088548364400416034343698204108735922795201, + 21888242871839275222246405745257275088548364400416034343698203625452017554834, + 381396963241248, + 211424688981641, + 285849347395806, + 411625671028535, + 82559684265133, + 267299266691058, + 21888242871839275222246405745257275088548364400416034343698203778861249795312, + 451842009532068, + 21888242871839275222246405745257275088548364400416034343698203655929146887423, + 419344430224521, + 21888242871839275222246405745257275088548364400416034343698204081975749810715, + 386686356285854, + 538179304264701, + 309840410839898, + 560142841227139, + 324794697074610, + 21888242871839275222246405745257275088548364400416034343698204099282762925508, + 21888242871839275222246405745257275088548364400416034343698203770034886802641, + 21888242871839275222246405745257275088548364400416034343698203987920294149470, + 21888242871839275222246405745257275088548364400416034343698203950217693899421, + 21888242871839275222246405745257275088548364400416034343698203694994600635445, + 21888242871839275222246405745257275088548364400416034343698203995076251504283, + 415652628792108, + 149395318281931, + 21888242871839275222246405745257275088548364400416034343698203806195908666555, + 21888242871839275222246405745257275088548364400416034343698204019164096714907, + 138289666860816, + 21888242871839275222246405745257275088548364400416034343698203885322546121386, + 395759893365165, + 445129586753616, + 506335325272472, + 84017327473680, + 344401427196984, + 348122815773779, + 21888242871839275222246405745257275088548364400416034343698203697702629825615, + 21888242871839275222246405745257275088548364400416034343698204050486883787742, + 21888242871839275222246405745257275088548364400416034343698204010856078231228, + 21888242871839275222246405745257275088548364400416034343698203751916680903515, + 21888242871839275222246405745257275088548364400416034343698204027704830057602, + 276778843323591, + 368062965442587, + 422240630832381, + 21888242871839275222246405745257275088548364400416034343698204166084582737662, + 50725849869549, + 486453581449038, + 21888242871839275222246405745257275088548364400416034343698203796470891551931, + 21888242871839275222246405745257275088548364400416034343698203894655110671937, + 21888242871839275222246405745257275088548364400416034343698203673826373719568, + 21888242871839275222246405745257275088548364400416034343698203801405562723575, + 21888242871839275222246405745257275088548364400416034343698204176794936848524, + 21888242871839275222246405745257275088548364400416034343698203748916867330189, + 374061901611447, + 21888242871839275222246405745257275088548364400416034343698203963857295763863, + 513701660987430, + 21888242871839275222246405745257275088548364400416034343698203854343171385201, + 560678205818829, + 21888242871839275222246405745257275088548364400416034343698203839513958007608, + 21888242871839275222246405745257275088548364400416034343698204078114991560363, + 502955456935656, + 272383287223446, + 475129625636241, + 21888242871839275222246405745257275088548364400416034343698204019027263843610, + 21888242871839275222246405745257275088548364400416034343698203780884389758207, + 21888242871839275222246405745257275088548364400416034343698203975373373161505, + 259642172774813, + 8482269393129, + 57487280348434, + 21888242871839275222246405745257275088548364400416034343698203747884832065681, + 21888242871839275222246405745257275088548364400416034343698203749536959367733, + 161680919367009, + 21888242871839275222246405745257275088548364400416034343698204141712621147631, + 183665669907154, + 21888242871839275222246405745257275088548364400416034343698204038267717379996, + 160280787576047, + 514041744060444, + 21888242871839275222246405745257275088548364400416034343698203906890822491230, + 381195123034991, + 406129828861125, + 520388472653301, + 278636332854867, + 364323153564308, + 21888242871839275222246405745257275088548364400416034343698204068448711072555, + 441717375111275, + 21888242871839275222246405745257275088548364400416034343698204091945340865523, + 21888242871839275222246405745257275088548364400416034343698203642862578023751, + 21888242871839275222246405745257275088548364400416034343698204088346659369058, + 12168478665913, + 250453437258760, + 401437146113211, + 21888242871839275222246405745257275088548364400416034343698203802775239998404, + 21888242871839275222246405745257275088548364400416034343698204058436983563807, + 21888242871839275222246405745257275088548364400416034343698203911387803520521, + 293024969202551, + 395702960395849, + 132637959881582, + 21888242871839275222246405745257275088548364400416034343698203859238694099082, + 434935435873498, + 21888242871839275222246405745257275088548364400416034343698204168462419006681, + 21888242871839275222246405745257275088548364400416034343698204166131015567252, + 313469130669614, + 21888242871839275222246405745257275088548364400416034343698203665953259332321, + 112726710437170, + 21888242871839275222246405745257275088548364400416034343698203989921879561293, + 21888242871839275222246405745257275088548364400416034343698204171373044498151, + 21888242871839275222246405745257275088548364400416034343698203693661461554322, + 315728806065550, + 367081344738764, + 117658062821313, + 526046211740252, + 145282137236327, + 21888242871839275222246405745257275088548364400416034343698204005550548447712, + 21888242871839275222246405745257275088548364400416034343698203715723228827708, + 21888242871839275222246405745257275088548364400416034343698204064991499248094, + 487076507096893, + 534237172506337, + 21888242871839275222246405745257275088548364400416034343698203983258869302505, + 526359468319438, + 105756234856649, + 279473116129684, + 85387215241012, + 21888242871839275222246405745257275088548364400416034343698203895860879882523, + 201265001714444, + 288382971547279, + 21888242871839275222246405745257275088548364400416034343698203799145459679962, + 205224879622412, + 21888242871839275222246405745257275088548364400416034343698203810823116965797, + 21888242871839275222246405745257275088548364400416034343698203907469493209866, + 21888242871839275222246405745257275088548364400416034343698204162385215082320, + 21888242871839275222246405745257275088548364400416034343698203817586916677161, + 21888242871839275222246405745257275088548364400416034343698203704252288132468, + 427429114484972, + 21888242871839275222246405745257275088548364400416034343698203899102822686507, + 21888242871839275222246405745257275088548364400416034343698203757840492805172, + 21888242871839275222246405745257275088548364400416034343698203775035963549278, + 207099566190284, + 21888242871839275222246405745257275088548364400416034343698204062342849139807, + 43520973658536, + 323807640353073, + 297386778207305, + 191020154759035, + 453150007833690, + 21888242871839275222246405745257275088548364400416034343698203918008455635272, + 21888242871839275222246405745257275088548364400416034343698203916309964882493, + 21888242871839275222246405745257275088548364400416034343698203978887384667914, + 21888242871839275222246405745257275088548364400416034343698204114874450587731, + 21888242871839275222246405745257275088548364400416034343698203729006959949194, + 444932769990020, + 37599963419451, + 21888242871839275222246405745257275088548364400416034343698203939387904831224, + 70863628585694, + 21888242871839275222246405745257275088548364400416034343698203845964256193418, + 174892511105322, + 24851748820899, + 86889333042032, + 419459576607483, + 21888242871839275222246405745257275088548364400416034343698203888709332737683, + 21888242871839275222246405745257275088548364400416034343698203935062710657547, + 21888242871839275222246405745257275088548364400416034343698203703899739492909, + 289681030840762, + 21888242871839275222246405745257275088548364400416034343698204173223308692359, + 449034112380576, + 21888242871839275222246405745257275088548364400416034343698203923018920073525, + 21888242871839275222246405745257275088548364400416034343698203790386498543304, + 84985856217997, + 21888242871839275222246405745257275088548364400416034343698203942924403251513, + 21888242871839275222246405745257275088548364400416034343698203676252726119947, + 21888242871839275222246405745257275088548364400416034343698203971541652541755, + 50571878168029, + 263639738133559, + 49225086858333, + 21888242871839275222246405745257275088548364400416034343698203628380529557085, + 21888242871839275222246405745257275088548364400416034343698203908698765119386, + 449921946674605, + 21888242871839275222246405745257275088548364400416034343698203868515622666526, + 23055292483511, + 21888242871839275222246405745257275088548364400416034343698203907127718251952, + 21888242871839275222246405745257275088548364400416034343698203813137894404498, + 211287544962758, + 21888242871839275222246405745257275088548364400416034343698203666203526189807, + 21888242871839275222246405745257275088548364400416034343698204181229148146426, + 96078853800810, + 232053399793278, + 21888242871839275222246405745257275088548364400416034343698203869916521917684, + 21888242871839275222246405745257275088548364400416034343698203740477671152051, + 215728641441174, + 21888242871839275222246405745257275088548364400416034343698203777436158566925, + 21888242871839275222246405745257275088548364400416034343698203946713261157116, + 74048352038775, + 346003433277436, + 21888242871839275222246405745257275088548364400416034343698203717688660213867, + 344558287638958, + 21888242871839275222246405745257275088548364400416034343698204032131178625425, + 327298894944598, + 21888242871839275222246405745257275088548364400416034343698203697018499557116, + 216728552013875, + 21888242871839275222246405745257275088548364400416034343698204167496072689675, + 387589794546879, + 21888242871839275222246405745257275088548364400416034343698204140359227941208, + 327453402263901, + 437066311415292, + 21888242871839275222246405745257275088548364400416034343698203832991771367272, + 451837884118276, + 21888242871839275222246405745257275088548364400416034343698203938102335928202, + 76377053260257, + 140889100319905, + 21888242871839275222246405745257275088548364400416034343698203992518136917017, + 359798092488291, + 404176564500295, + 531858906122148, + 296488936842017, + 385980478829407, + 21888242871839275222246405745257275088548364400416034343698204035429473711341, + 72748020415856, + 223139128436238, + 21888242871839275222246405745257275088548364400416034343698204045099214388199, + 21888242871839275222246405745257275088548364400416034343698203948317731525420, + 103563997313677, + 21888242871839275222246405745257275088548364400416034343698204127129055393463, + 103117313529724, + 21888242871839275222246405745257275088548364400416034343698203857566310507450, + 21888242871839275222246405745257275088548364400416034343698204067840479807238, + 21888242871839275222246405745257275088548364400416034343698203660687144883869, + 21888242871839275222246405745257275088548364400416034343698203722050162422921, + 499639206459772, + 21888242871839275222246405745257275088548364400416034343698203656124674279750, + 528552956758336, + 21888242871839275222246405745257275088548364400416034343698203739719736778489, + 520424018822065, + 234074839262721, + 166607203754042, + 21888242871839275222246405745257275088548364400416034343698204169680525408194, + 417680188463592, + 102706161852133, + 21888242871839275222246405745257275088548364400416034343698204121963407805941, + 21888242871839275222246405745257275088548364400416034343698203901504592610290, + 21888242871839275222246405745257275088548364400416034343698203686190729883341, + 244520471950205, + 21888242871839275222246405745257275088548364400416034343698203989606724898838, + 21888242871839275222246405745257275088548364400416034343698203734932654202703, + 21888242871839275222246405745257275088548364400416034343698203755536330576071, + 21888242871839275222246405745257275088548364400416034343698203774200091409142, + 354925895980572, + 21888242871839275222246405745257275088548364400416034343698203765784855961029, + 512477551884173, + 315412136812392, + 419900890637262, + 21888242871839275222246405745257275088548364400416034343698204178879877080073, + 21888242871839275222246405745257275088548364400416034343698203961603139304742, + 21888242871839275222246405745257275088548364400416034343698204175061452187227, + 21888242871839275222246405745257275088548364400416034343698203999770333510307, + 21888242871839275222246405745257275088548364400416034343698204125568055635839, + 27859126577097, + 466116666425418, + 21888242871839275222246405745257275088548364400416034343698203726299003282592, + 21888242871839275222246405745257275088548364400416034343698203855388357841689, + 21888242871839275222246405745257275088548364400416034343698204068067393896402, + 21888242871839275222246405745257275088548364400416034343698203646818996336937, + 21888242871839275222246405745257275088548364400416034343698203813634809114108, + 236931628486620, + 21888242871839275222246405745257275088548364400416034343698203857487705485162, + 21888242871839275222246405745257275088548364400416034343698203679300085681410, + 131909709210743, + 21888242871839275222246405745257275088548364400416034343698203891748830929494, + 21888242871839275222246405745257275088548364400416034343698203944768561487207, + 541746813791267, + 21888242871839275222246405745257275088548364400416034343698203757653914252583, + 21888242871839275222246405745257275088548364400416034343698204031440569065420, + 21888242871839275222246405745257275088548364400416034343698203640933080916872, + 121165267004738, + 481270574542609, + 490982413002943, + 21888242871839275222246405745257275088548364400416034343698203972847082570826, + 21888242871839275222246405745257275088548364400416034343698203740526119863668, + 215190501210633, + 21888242871839275222246405745257275088548364400416034343698204083906911339971, + 21888242871839275222246405745257275088548364400416034343698203972872049549118, + 21888242871839275222246405745257275088548364400416034343698204168972799039642, + 107859750812262, + 21888242871839275222246405745257275088548364400416034343698203735647167019728, + 21888242871839275222246405745257275088548364400416034343698203936706108722923, + 520313538849970, + 355636845607225, + 483445540195738, + 452210744308019, + 21888242871839275222246405745257275088548364400416034343698204180573572136554, + 21888242871839275222246405745257275088548364400416034343698203947443329563139, + 21888242871839275222246405745257275088548364400416034343698203917506727861504, + 21888242871839275222246405745257275088548364400416034343698203662099389545544, + 21888242871839275222246405745257275088548364400416034343698204173243946435932, + 473920767550179, + 21888242871839275222246405745257275088548364400416034343698203762609613263465, + 78544386908567, + 541037696499929, + 21888242871839275222246405745257275088548364400416034343698204040272640183528, + 21888242871839275222246405745257275088548364400416034343698203755798457896719, + 21888242871839275222246405745257275088548364400416034343698203815370570482354, + 491822069279673, + 21888242871839275222246405745257275088548364400416034343698204000845663012504, + 242534738606859, + 159668444755349, + 21888242871839275222246405745257275088548364400416034343698203810323706551776, + 21888242871839275222246405745257275088548364400416034343698203655986691524775, + 214008689805821, + 21888242871839275222246405745257275088548364400416034343698203895840710066396, + 176637818291784, + 332544327507272, + 447538620913859, + 265886328753462, + 21888242871839275222246405745257275088548364400416034343698203745724201325463, + 558212406490843, + 21888242871839275222246405745257275088548364400416034343698204103538991424922, + 21888242871839275222246405745257275088548364400416034343698204080817828710306, + 21888242871839275222246405745257275088548364400416034343698204164056905132441, + 21888242871839275222246405745257275088548364400416034343698204011980929919559, + 21888242871839275222246405745257275088548364400416034343698203680982172805876, + 21888242871839275222246405745257275088548364400416034343698203862683237656017, + 21888242871839275222246405745257275088548364400416034343698203914594194846264, + 21888242871839275222246405745257275088548364400416034343698204166321721298843, + 21888242871839275222246405745257275088548364400416034343698203652742126161968, + 506875577892869, + 21888242871839275222246405745257275088548364400416034343698204005989609219100, + 21888242871839275222246405745257275088548364400416034343698203922301177239805, + 21888242871839275222246405745257275088548364400416034343698203844438484716240, + 21888242871839275222246405745257275088548364400416034343698203797567733271195, + 61329638962351, + 561506020822494, + 121740201375725, + 47539206337065, + 21888242871839275222246405745257275088548364400416034343698204039676374633578, + 21888242871839275222246405745257275088548364400416034343698203822229202927592, + 21888242871839275222246405745257275088548364400416034343698203840485377635846, + 329083393622598, + 21888242871839275222246405745257275088548364400416034343698203663964341161569, + 455065105611395, + 406885370629214, + 121864539812758, + 21888242871839275222246405745257275088548364400416034343698204119093226928644, + 21888242871839275222246405745257275088548364400416034343698204031495628927132, + 11741042183186, + 222578578431700, + 21888242871839275222246405745257275088548364400416034343698203722155220696920, + 21888242871839275222246405745257275088548364400416034343698203663067361174464, + 244246879037945, + 21888242871839275222246405745257275088548364400416034343698204143137090650476, + 544154722504640, + 447031479267800, + 381590217717748, + 45260927118323, + 334406130881474, + 199118421672630, + 21888242871839275222246405745257275088548364400416034343698203922398130941718, + 561364032233168, + 490999948304324, + 21888242871839275222246405745257275088548364400416034343698203897107648148067, + 21888242871839275222246405745257275088548364400416034343698203959166356602392, + 319312518995735, + 458795859458954, + 21888242871839275222246405745257275088548364400416034343698203825754384451480, + 21888242871839275222246405745257275088548364400416034343698203959811200598927, + 21888242871839275222246405745257275088548364400416034343698203981966811703145, + 514007514922709, + 21888242871839275222246405745257275088548364400416034343698204079200076294557, + 21888242871839275222246405745257275088548364400416034343698203626072235409369, + 21888242871839275222246405745257275088548364400416034343698203855982944261240, + 21888242871839275222246405745257275088548364400416034343698203945228842079086, + 21888242871839275222246405745257275088548364400416034343698204074962946320827, + 21888242871839275222246405745257275088548364400416034343698203742981328998046, + 21888242871839275222246405745257275088548364400416034343698203856078710110049, + 21888242871839275222246405745257275088548364400416034343698203674529189295099, + 335193213274136, + 470517876047457, + 21888242871839275222246405745257275088548364400416034343698203803195375206847, + 21888242871839275222246405745257275088548364400416034343698203996674359768962, + 145734358129685, + 101844018271499, + 143108920821127, + 33984907225567, + 392289497412876, + 148922641732108, + 97546418619979, + 21888242871839275222246405745257275088548364400416034343698204007659726606934, + 506072726256396, + 21888242871839275222246405745257275088548364400416034343698203927298521311904, + 21888242871839275222246405745257275088548364400416034343698204029941850491149, + 21888242871839275222246405745257275088548364400416034343698203683633146371171, + 477762551102879, + 236665686297081, + 21888242871839275222246405745257275088548364400416034343698203691863644843154, + 456141486382910, + 138693645189992, + 21888242871839275222246405745257275088548364400416034343698203955431352712455, + 21888242871839275222246405745257275088548364400416034343698204073550365574692, + 21888242871839275222246405745257275088548364400416034343698203770879574859491, + 21888242871839275222246405745257275088548364400416034343698204023703737234568, + 321340881193586, + 419364585412946, + 484305135281236, + 339944636529230, + 218341255625428, + 324034065485630, + 521892427546764, + 21888242871839275222246405745257275088548364400416034343698203849808195793829, + 21888242871839275222246405745257275088548364400416034343698203641493517013453, + 21888242871839275222246405745257275088548364400416034343698204001842553802566, + 21888242871839275222246405745257275088548364400416034343698203765731300254768, + 21888242871839275222246405745257275088548364400416034343698203998788158462997, + 21888242871839275222246405745257275088548364400416034343698204023890559222727, + 37032812925308, + 39035180288539, + 410983291601478, + 443286089981145, + 21888242871839275222246405745257275088548364400416034343698203736489620731299, + 384185184405502, + 21888242871839275222246405745257275088548364400416034343698204123589836245146, + 446576164279050, + 306385407050297, + 21888242871839275222246405745257275088548364400416034343698203786114406673811, + 21888242871839275222246405745257275088548364400416034343698203955034364080002, + 535754455692208, + 35186546368358, + 68163294130944, + 21888242871839275222246405745257275088548364400416034343698203996849696184261, + 21888242871839275222246405745257275088548364400416034343698203918184426903594, + 561657538053268, + 12390886357914, + 174441028296181, + 21888242871839275222246405745257275088548364400416034343698204074696982059438, + 21888242871839275222246405745257275088548364400416034343698203915269590943891, + 21888242871839275222246405745257275088548364400416034343698204151097637048411, + 473213095551752, + 5060149245085, + 21888242871839275222246405745257275088548364400416034343698204022405953364857, + 304108383309455, + 21888242871839275222246405745257275088548364400416034343698203835288406077071, + 527906627111486, + 21888242871839275222246405745257275088548364400416034343698203673536271565705, + 21888242871839275222246405745257275088548364400416034343698203762325935599610, + 21888242871839275222246405745257275088548364400416034343698203924431558356857, + 21888242871839275222246405745257275088548364400416034343698204018331176151553, + 28893666029951, + 21888242871839275222246405745257275088548364400416034343698203703478709573836, + 21888242871839275222246405745257275088548364400416034343698204028412296993641, + 21888242871839275222246405745257275088548364400416034343698203884055598114654, + 21888242871839275222246405745257275088548364400416034343698203752075007350144, + 60558637350558, + 21888242871839275222246405745257275088548364400416034343698204145946923382275, + 21888242871839275222246405745257275088548364400416034343698203933588507142885, + 21888242871839275222246405745257275088548364400416034343698203831052777857625, + 307133981545229, + 21888242871839275222246405745257275088548364400416034343698203917071396311539, + 540400975705916, + 551351448121846, + 233461517940993, + 21888242871839275222246405745257275088548364400416034343698204003891694793482, + 21888242871839275222246405745257275088548364400416034343698203668413529105199, + 120719621840573, + 21888242871839275222246405745257275088548364400416034343698204098993576991644, + 21888242871839275222246405745257275088548364400416034343698203728099945785727, + 21888242871839275222246405745257275088548364400416034343698204083471430812587, + 368869724582909, + 21888242871839275222246405745257275088548364400416034343698203683279386396163, + 213975534500866, + 299819202452052, + 21888242871839275222246405745257275088548364400416034343698203816057153882630, + 530493750213893, + 455627472921380, + 420625159090068, + 258115436709390, + 21888242871839275222246405745257275088548364400416034343698203873849752310922, + 228985677503503, + 139016230226199, + 173959151696693, + 115977879912695, + 301690406113013, + 21888242871839275222246405745257275088548364400416034343698203727085679260816, + 500074427153226, + 21888242871839275222246405745257275088548364400416034343698204159574827545106, + 21888242871839275222246405745257275088548364400416034343698204109961424500071, + 21888242871839275222246405745257275088548364400416034343698203779733305309949, + 21888242871839275222246405745257275088548364400416034343698204151074350566490, + 21888242871839275222246405745257275088548364400416034343698203888552400564413, + 21888242871839275222246405745257275088548364400416034343698203913095357104386, + 387449006210994, + 118248098829684, + 21888242871839275222246405745257275088548364400416034343698203948519466845178, + 80526556335403, + 21888242871839275222246405745257275088548364400416034343698203768121745896284, + 21888242871839275222246405745257275088548364400416034343698204113453029970206, + 21888242871839275222246405745257275088548364400416034343698203963689188435217, + 21888242871839275222246405745257275088548364400416034343698204015176663488565, + 21888242871839275222246405745257275088548364400416034343698203870436753077233, + 226884720740513, + 348900655311057, + 118066361519131, + 559979477620426, + 21888242871839275222246405745257275088548364400416034343698203907835612770281, + 295061324020002, + 21888242871839275222246405745257275088548364400416034343698204123397254866382, + 21888242871839275222246405745257275088548364400416034343698204172893505681544, + 226825670131367, + 270331719823295, + 21888242871839275222246405745257275088548364400416034343698203986986452847518, + 21888242871839275222246405745257275088548364400416034343698203836917429309490, + 508799904627761, + 21888242871839275222246405745257275088548364400416034343698203624464081515861, + 21888242871839275222246405745257275088548364400416034343698203746492331142873, + 119370431078829, + 295084837404374, + 21888242871839275222246405745257275088548364400416034343698203860676489021054, + 21888242871839275222246405745257275088548364400416034343698204127167702025411, + 21888242871839275222246405745257275088548364400416034343698204077034991036307, + 21888242871839275222246405745257275088548364400416034343698204096141805750278, + 230145561344632, + 21888242871839275222246405745257275088548364400416034343698203811067908173049, + 203871723145597, + 21888242871839275222246405745257275088548364400416034343698204184361969179638, + 289786131579259, + 21888242871839275222246405745257275088548364400416034343698204029581865550602, + 273984380650942, + 471991249676989, + 21888242871839275222246405745257275088548364400416034343698203817799104417680, + 253353555097266, + 21888242871839275222246405745257275088548364400416034343698204104644668183801, + 454063665878369, + 198158250879615, + 21888242871839275222246405745257275088548364400416034343698203862663566633817, + 291899594573886, + 21888242871839275222246405745257275088548364400416034343698203659970327730016, + 425737459440872, + 79221928126195, + 21888242871839275222246405745257275088548364400416034343698203712977469814763, + 21888242871839275222246405745257275088548364400416034343698204002250356460137, + 21888242871839275222246405745257275088548364400416034343698203737083676258169, + 21888242871839275222246405745257275088548364400416034343698204054661523213206, + 69854526637255, + 21888242871839275222246405745257275088548364400416034343698203981692596159214, + 454775398036518, + 21888242871839275222246405745257275088548364400416034343698204005009324910373, + 340306032912973, + 21888242871839275222246405745257275088548364400416034343698204140237032485066, + 76462889969245, + 21888242871839275222246405745257275088548364400416034343698203670171957771644, + 354425363792906, + 295973874103098, + 217574384465387, + 21888242871839275222246405745257275088548364400416034343698203641443127513204, + 21888242871839275222246405745257275088548364400416034343698204022573563044770, + 527436589518694, + 21888242871839275222246405745257275088548364400416034343698204039756171456093, + 336993568411232, + 171901183487910, + 475847314847985, + 21888242871839275222246405745257275088548364400416034343698203836766595659784, + 259955717329884, + 21888242871839275222246405745257275088548364400416034343698203713109971261611, + 21888242871839275222246405745257275088548364400416034343698203962851929246087, + 21888242871839275222246405745257275088548364400416034343698203862294283731421, + 241294734985539, + 152456637615584, + 454228415530866, + 544457395500314, + 425561569617247, + 21888242871839275222246405745257275088548364400416034343698203766329207225769, + 133923533753217, + 21888242871839275222246405745257275088548364400416034343698203629765503961119, + 51327880540125, + 23502488365798, + 308658926409746, + 21888242871839275222246405745257275088548364400416034343698203911309325419232, + 21888242871839275222246405745257275088548364400416034343698203750955130225309, + 488234762838271, + 21888242871839275222246405745257275088548364400416034343698203839957848513762, + 21888242871839275222246405745257275088548364400416034343698203919325343006833, + 201972315100156, + 58111180015581, + 179530133372236, + 101024449154886, + 21888242871839275222246405745257275088548364400416034343698203783669086443653, + 29746925316204, + 382082281112870, + 86163106487748, + 26059644649717, + 168748951723317, + 557506684666700, + 21888242871839275222246405745257275088548364400416034343698203675216918279976, + 21888242871839275222246405745257275088548364400416034343698204119693276699545, + 21888242871839275222246405745257275088548364400416034343698203878425315156240, + 21888242871839275222246405745257275088548364400416034343698203653073094005115, + 547610783482616, + 21888242871839275222246405745257275088548364400416034343698203828718253140220, + 32871917171708, + 21888242871839275222246405745257275088548364400416034343698203786516024239196, + 377841642871383, + 21888242871839275222246405745257275088548364400416034343698203959854893749754, + 21888242871839275222246405745257275088548364400416034343698203746329750509100, + 21888242871839275222246405745257275088548364400416034343698203727384736188599, + 70944118283431, + 21888242871839275222246405745257275088548364400416034343698203799072575042072, + 21888242871839275222246405745257275088548364400416034343698203753643167867725, + 21888242871839275222246405745257275088548364400416034343698204069947223727413, + 135243161828077, + 21888242871839275222246405745257275088548364400416034343698203956612318655820, + 167172094926986, + 486097053220268, + 21888242871839275222246405745257275088548364400416034343698204023853986225304, + 21888242871839275222246405745257275088548364400416034343698203888089967588651, + 38124229834818, + 482990637252273, + 385385373460630, + 21888242871839275222246405745257275088548364400416034343698203751989402174671, + 21888242871839275222246405745257275088548364400416034343698203641606763155485, + 431834070035619, + 67538734857774, + 21888242871839275222246405745257275088548364400416034343698204127246540755511, + 21888242871839275222246405745257275088548364400416034343698203829330250512494, + 21888242871839275222246405745257275088548364400416034343698203929353155581479, + 21888242871839275222246405745257275088548364400416034343698204007071448581012, + 21888242871839275222246405745257275088548364400416034343698203654787805634439, + 482440951219575, + 21888242871839275222246405745257275088548364400416034343698203655673070624296, + 21888242871839275222246405745257275088548364400416034343698203911370461053522, + 437686824869008, + 1551218393240, + 303061443882427, + 527514089659294, + 454679225655371, + 21888242871839275222246405745257275088548364400416034343698203701687434305811, + 21888242871839275222246405745257275088548364400416034343698204154246996861651, + 301775044086032, + 537979119478066, + 126429995549629, + 294292687101525, + 21888242871839275222246405745257275088548364400416034343698203815306728267435, + 459904915041681, + 21888242871839275222246405745257275088548364400416034343698204046822187184000, + 560558754928858, + 21888242871839275222246405745257275088548364400416034343698204057005927752965, + 421252196915996, + 21888242871839275222246405745257275088548364400416034343698204133042870436961, + 400070803492735, + 21888242871839275222246405745257275088548364400416034343698203700668015169542, + 21888242871839275222246405745257275088548364400416034343698204107845261219159, + 21888242871839275222246405745257275088548364400416034343698203650210073325173, + 21888242871839275222246405745257275088548364400416034343698204162039601670077, + 21888242871839275222246405745257275088548364400416034343698204017093586354532, + 21888242871839275222246405745257275088548364400416034343698203958801113790629, + 298489305693267, + 122907378544534, + 109455094782696, + 21888242871839275222246405745257275088548364400416034343698203986944910483013, + 21888242871839275222246405745257275088548364400416034343698203797423902374104, + 208380404753821, + 21888242871839275222246405745257275088548364400416034343698203845533625660631, + 476461630648534, + 115987756293064, + 201650012675322, + 407496160197530, + 31581012113655, + 438144801282744, + 412497029013034, + 21888242871839275222246405745257275088548364400416034343698204092896378293466, + 21888242871839275222246405745257275088548364400416034343698203725445012153349, + 21888242871839275222246405745257275088548364400416034343698204009797771190548, + 402051255098769, + 9941656932215, + 159452970514447, + 21888242871839275222246405745257275088548364400416034343698203659208340820159, + 468568260796635, + 21888242871839275222246405745257275088548364400416034343698204026090838206788, + 21888242871839275222246405745257275088548364400416034343698203963164756113541, + 21888242871839275222246405745257275088548364400416034343698204098621789744018, + 217449955142600, + 298418792032839, + 21888242871839275222246405745257275088548364400416034343698203643281113795597, + 21888242871839275222246405745257275088548364400416034343698203830844444921857, + 21888242871839275222246405745257275088548364400416034343698203787804039968334, + 21888242871839275222246405745257275088548364400416034343698204123720820695460, + 21888242871839275222246405745257275088548364400416034343698204058645011455225, + 21888242871839275222246405745257275088548364400416034343698203789013145405583, + 21888242871839275222246405745257275088548364400416034343698204000811479780909, + 21888242871839275222246405745257275088548364400416034343698203629990843166804, + 380148002428983, + 453545536549020, + 533455188233806, + 398944677524984, + 276108390118877, + 21888242871839275222246405745257275088548364400416034343698204070856060168215, + 385175915070783, + 21888242871839275222246405745257275088548364400416034343698203914657486008435, + 21888242871839275222246405745257275088548364400416034343698203996267661682404, + 21888242871839275222246405745257275088548364400416034343698204172651502723856, + 25309153703441, + 555852955325166, + 21888242871839275222246405745257275088548364400416034343698203944129282000541, + 21888242871839275222246405745257275088548364400416034343698203703293077998920, + 244951164129571, + 21888242871839275222246405745257275088548364400416034343698203913746298533864, + 485666087726932, + 21888242871839275222246405745257275088548364400416034343698203961870724764502, + 21888242871839275222246405745257275088548364400416034343698204035211052827643, + 284318818308866, + 21888242871839275222246405745257275088548364400416034343698204097205000834657, + 21888242871839275222246405745257275088548364400416034343698204173756068046774, + 495082796911305, + 21888242871839275222246405745257275088548364400416034343698204135522086810646, + 21888242871839275222246405745257275088548364400416034343698203699343091134428, + 21888242871839275222246405745257275088548364400416034343698203976272641813537, + 288965863610128, + 4348561717368, + 277113280647004, + 342308227966506, + 488967385601085, + 466963273604524, + 392221075671765, + 21888242871839275222246405745257275088548364400416034343698203909133796506989, + 21888242871839275222246405745257275088548364400416034343698203773717316311186, + 21888242871839275222246405745257275088548364400416034343698203892668641635079, + 379905126533516, + 429259034732173, + 160077345066650, + 359663342591846, + 21888242871839275222246405745257275088548364400416034343698203876897045132090, + 372043828007843, + 22975377736120, + 21888242871839275222246405745257275088548364400416034343698204048614429739659, + 21888242871839275222246405745257275088548364400416034343698203755513561865053, + 381469941228535, + 21888242871839275222246405745257275088548364400416034343698204162422470822923, + 80212044869574, + 21888242871839275222246405745257275088548364400416034343698203784929278919042, + 21888242871839275222246405745257275088548364400416034343698203857316864153276, + 21888242871839275222246405745257275088548364400416034343698203805538300670484, + 21888242871839275222246405745257275088548364400416034343698203750120829472267, + 21888242871839275222246405745257275088548364400416034343698203864149961629453, + 21888242871839275222246405745257275088548364400416034343698203696394313919958, + 21888242871839275222246405745257275088548364400416034343698203934222957167688, + 197072738145908, + 21888242871839275222246405745257275088548364400416034343698203788480525972135, + 21888242871839275222246405745257275088548364400416034343698203928622698213122, + 21888242871839275222246405745257275088548364400416034343698203739349120505195, + 21888242871839275222246405745257275088548364400416034343698203833150036531365, + 45166547328053, + 515056684025840, + 561189895898270, + 325583474966611, + 21888242871839275222246405745257275088548364400416034343698204100225030761044, + 21888242871839275222246405745257275088548364400416034343698203955898005763974, + 21888242871839275222246405745257275088548364400416034343698203779040606961472, + 21888242871839275222246405745257275088548364400416034343698203678169563674249, + 21888242871839275222246405745257275088548364400416034343698204121019200140614, + 404875025462444, + 21888242871839275222246405745257275088548364400416034343698203677556212968551, + 21888242871839275222246405745257275088548364400416034343698204178519257896463, + 125487713193838, + 4740563875175, + 130578542890792, + 500574082956046, + 21888242871839275222246405745257275088548364400416034343698204129971893614947, + 87489690163425, + 21888242871839275222246405745257275088548364400416034343698204029780777410779, + 21888242871839275222246405745257275088548364400416034343698204118319122265810, + 21888242871839275222246405745257275088548364400416034343698203910047833903233, + 21888242871839275222246405745257275088548364400416034343698203905307061670657, + 21888242871839275222246405745257275088548364400416034343698203757340671252112, + 199772887852615, + 21888242871839275222246405745257275088548364400416034343698203983625347241628, + 21888242871839275222246405745257275088548364400416034343698204121689633699338, + 50102739392664, + 422155218477121, + 21888242871839275222246405745257275088548364400416034343698204148078184595007, + 21888242871839275222246405745257275088548364400416034343698203901386381293318, + 21888242871839275222246405745257275088548364400416034343698204080925824177712, + 21888242871839275222246405745257275088548364400416034343698204014342596901585, + 198642922581892, + 489861153891649, + 21888242871839275222246405745257275088548364400416034343698203851015522598199, + 21888242871839275222246405745257275088548364400416034343698203696694964705571, + 21888242871839275222246405745257275088548364400416034343698203978919166939266, + 21888242871839275222246405745257275088548364400416034343698204169707873868345, + 21888242871839275222246405745257275088548364400416034343698203910279208853958, + 21888242871839275222246405745257275088548364400416034343698204038701370033986, + 536281210066200, + 484126629533322, + 21888242871839275222246405745257275088548364400416034343698204030419450709632, + 21888242871839275222246405745257275088548364400416034343698203923064024578508, + 21888242871839275222246405745257275088548364400416034343698204128200416479882, + 353258667877951, + 6770951818165, + 197844819913506, + 514845979781765, + 286555728939796, + 21888242871839275222246405745257275088548364400416034343698203885291559666104, + 463513109459882, + 21888242871839275222246405745257275088548364400416034343698204088932907861400, + 110201916036513, + 21888242871839275222246405745257275088548364400416034343698203820638880485952, + 24580731776320, + 387572021645988, + 481280324780469, + 21888242871839275222246405745257275088548364400416034343698203920030538678835, + 196988305327588, + 549967524949409, + 279344292703755, + 518233464768619, + 416827977004783, + 21888242871839275222246405745257275088548364400416034343698203909305764564587, + 88533409973181, + 165134538071580, + 21888242871839275222246405745257275088548364400416034343698203713471476092911, + 520749756667175, + 21888242871839275222246405745257275088548364400416034343698203785401171738163, + 21888242871839275222246405745257275088548364400416034343698204175379974860448, + 21888242871839275222246405745257275088548364400416034343698203954050433908762, + 56802651321657, + 145156078692364, + 368955154973234, + 158215931145908, + 21888242871839275222246405745257275088548364400416034343698203740124707146510, + 21888242871839275222246405745257275088548364400416034343698204160730794599632, + 419198553895876, + 21888242871839275222246405745257275088548364400416034343698203769416567233741, + 415264838901855, + 21888242871839275222246405745257275088548364400416034343698203781114831875074, + 21888242871839275222246405745257275088548364400416034343698203776892663604940, + 200112196842838, + 21888242871839275222246405745257275088548364400416034343698203828956946944376, + 10360351585528, + 147666082229204, + 206001759326515, + 21888242871839275222246405745257275088548364400416034343698203646051621813902, + 21888242871839275222246405745257275088548364400416034343698203916866201554260, + 21888242871839275222246405745257275088548364400416034343698203623717613253333, + 450819792258732, + 21888242871839275222246405745257275088548364400416034343698203824479795505340, + 392232623386777, + 21888242871839275222246405745257275088548364400416034343698204105654997898583, + 21888242871839275222246405745257275088548364400416034343698203853487255287666, + 561541061540801, + 21888242871839275222246405745257275088548364400416034343698204060664623600740, + 530761830922490, + 21888242871839275222246405745257275088548364400416034343698203710104707333727, + 199108865399949, + 21888242871839275222246405745257275088548364400416034343698204106685654724410, + 21888242871839275222246405745257275088548364400416034343698203920583702037602, + 469613988698263, + 21888242871839275222246405745257275088548364400416034343698203906348808798764, + 21888242871839275222246405745257275088548364400416034343698203888026070176268, + 135650080635029, + 21888242871839275222246405745257275088548364400416034343698203711428981961338, + 21888242871839275222246405745257275088548364400416034343698204131260368622712, + 21888242871839275222246405745257275088548364400416034343698204037353927496936, + 21888242871839275222246405745257275088548364400416034343698203789133612451013, + 21888242871839275222246405745257275088548364400416034343698204068235948346060, + 21888242871839275222246405745257275088548364400416034343698203826001160841313, + 77210404228733, + 21888242871839275222246405745257275088548364400416034343698203898831922418741, + 264861141313400, + 21888242871839275222246405745257275088548364400416034343698204066743212809211, + 133181568977686, + 21888242871839275222246405745257275088548364400416034343698204077665976085896, + 21888242871839275222246405745257275088548364400416034343698203800563779202240, + 21888242871839275222246405745257275088548364400416034343698203698215754559267, + 262826167221324, + 21888242871839275222246405745257275088548364400416034343698203993632843632886, + 320117217757589, + 299186469959752, + 21888242871839275222246405745257275088548364400416034343698204149133200125618, + 235147663596794, + 21888242871839275222246405745257275088548364400416034343698203947983501677640, + 21888242871839275222246405745257275088548364400416034343698203645001230239875, + 230822696301615, + 331860120567485, + 141940559071422, + 413287937513592, + 21888242871839275222246405745257275088548364400416034343698203913508144353712, + 21888242871839275222246405745257275088548364400416034343698203809578294689406, + 501790467664968, + 21888242871839275222246405745257275088548364400416034343698203950972166932427, + 103472299235052, + 21888242871839275222246405745257275088548364400416034343698204040157127120739, + 21888242871839275222246405745257275088548364400416034343698204001974369105341, + 21888242871839275222246405745257275088548364400416034343698203758002454399496, + 375932740489214, + 21888242871839275222246405745257275088548364400416034343698203707527505652798, + 196763040790358, + 21888242871839275222246405745257275088548364400416034343698204047127237806174, + 4872306938368, + 21888242871839275222246405745257275088548364400416034343698203934579960332008, + 21888242871839275222246405745257275088548364400416034343698203802224897067198, + 21888242871839275222246405745257275088548364400416034343698203990811094563889, + 21888242871839275222246405745257275088548364400416034343698204041931146033530, + 21888242871839275222246405745257275088548364400416034343698204152545264873331, + 21888242871839275222246405745257275088548364400416034343698204042272490630960, + 89669490962875, + 255611107180311, + 21888242871839275222246405745257275088548364400416034343698203848005555750786, + 21888242871839275222246405745257275088548364400416034343698203741420490249033, + 21888242871839275222246405745257275088548364400416034343698203712789713996167, + 21888242871839275222246405745257275088548364400416034343698203637868664114133, + 21888242871839275222246405745257275088548364400416034343698204043670637916791, + 8534401800627, + 450814950397305, + 333019792901325, + 21888242871839275222246405745257275088548364400416034343698204091582252234380, + 21888242871839275222246405745257275088548364400416034343698204013331309765018, + 262234722851279, + 307961072539786, + 503455253139841, + 363004421988726, + 21888242871839275222246405745257275088548364400416034343698203812451071633383, + 70776280044961, + 225172724633223, + 74351586111323, + 21888242871839275222246405745257275088548364400416034343698204058585791709728, + 531310810415804, + 21888242871839275222246405745257275088548364400416034343698203976882256412569, + 21888242871839275222246405745257275088548364400416034343698203824969145537735, + 37084868718718, + 185182142935276, + 21888242871839275222246405745257275088548364400416034343698203637107299282387, + 21888242871839275222246405745257275088548364400416034343698204002787462208110, + 423659787717573, + 411900899657598, + 118219199831779, + 21888242871839275222246405745257275088548364400416034343698203663636241050309, + 21888242871839275222246405745257275088548364400416034343698204168081649205592, + 21888242871839275222246405745257275088548364400416034343698203934670669533918, + 378763046172587, + 2950402571305, + 21888242871839275222246405745257275088548364400416034343698203858911438353909, + 244908312128482, + 21888242871839275222246405745257275088548364400416034343698203682634587792420, + 283157118982303, + 45730262321876, + 21888242871839275222246405745257275088548364400416034343698203905151445208023, + 81870299563972, + 278462978687977, + 372037304575811, + 21888242871839275222246405745257275088548364400416034343698203654487942334702, + 21888242871839275222246405745257275088548364400416034343698203935957105336521, + 28190128912151, + 21888242871839275222246405745257275088548364400416034343698203963809228773397, + 21888242871839275222246405745257275088548364400416034343698203839223326022703, + 21888242871839275222246405745257275088548364400416034343698203629121835294341, + 463455609885749, + 145230840547000, + 546157347041643, + 375444567564468, + 21888242871839275222246405745257275088548364400416034343698203628372655599255, + 106792564912899, + 21888242871839275222246405745257275088548364400416034343698203858161401038580, + 461941485400875, + 21888242871839275222246405745257275088548364400416034343698203632664760795615, + 21888242871839275222246405745257275088548364400416034343698203658121719757218, + 516390559017212, + 112985074655226, + 281537761944192, + 248132775802900, + 41568981589499, + 206215091821419, + 21888242871839275222246405745257275088548364400416034343698203633704562197113, + 320145579417779, + 333201734072715, + 21888242871839275222246405745257275088548364400416034343698203982365431597057, + 21888242871839275222246405745257275088548364400416034343698203665430279475207, + 172532015511717, + 476106444321855, + 5961148763391, + 12581622897815, + 21888242871839275222246405745257275088548364400416034343698203939671573011962, + 399079167637242, + 196205618452285, + 21888242871839275222246405745257275088548364400416034343698203754699926027352, + 21888242871839275222246405745257275088548364400416034343698204182767966744341, + 21888242871839275222246405745257275088548364400416034343698203772238837105405, + 21888242871839275222246405745257275088548364400416034343698204035201236840197, + 21888242871839275222246405745257275088548364400416034343698204112967009114348, + 21888242871839275222246405745257275088548364400416034343698203943040193315699, + 154465918906731, + 142029231303970, + 380618961249709, + 21888242871839275222246405745257275088548364400416034343698203750003132950148, + 21888242871839275222246405745257275088548364400416034343698204174067873721071, + 536032350779328, + 21888242871839275222246405745257275088548364400416034343698204186370160840533, + 21888242871839275222246405745257275088548364400416034343698204073431983392845, + 21888242871839275222246405745257275088548364400416034343698203943388642966970, + 21888242871839275222246405745257275088548364400416034343698204167560341573402, + 398885240249489, + 173991421918785, + 370068975219118, + 269164651283863, + 21888242871839275222246405745257275088548364400416034343698203796622639975007, + 306816879167795, + 21888242871839275222246405745257275088548364400416034343698203999445729043963, + 21888242871839275222246405745257275088548364400416034343698204103644652291505, + 21888242871839275222246405745257275088548364400416034343698204138370481087287, + 21888242871839275222246405745257275088548364400416034343698204179397306207054, + 3881862596322, + 50495566382066, + 21888242871839275222246405745257275088548364400416034343698203815709855467965, + 425521225756556, + 493505703153239, + 282210680891211, + 300748292304445, + 231951592119762, + 21888242871839275222246405745257275088548364400416034343698203928156683655192, + 21888242871839275222246405745257275088548364400416034343698203636242541827741, + 558863937751254, + 21888242871839275222246405745257275088548364400416034343698204052772357082612, + 21888242871839275222246405745257275088548364400416034343698204085432358351817, + 21888242871839275222246405745257275088548364400416034343698204085625696427945, + 206128264525785, + 355388371331739, + 106560690833921, + 21888242871839275222246405745257275088548364400416034343698203908962398115711, + 21888242871839275222246405745257275088548364400416034343698203755838935354533, + 418108240144659, + 21888242871839275222246405745257275088548364400416034343698203959052916950897, + 21888242871839275222246405745257275088548364400416034343698204137347863211626, + 21888242871839275222246405745257275088548364400416034343698203659436814303651, + 194971789398716, + 363365962514132, + 319579375693057, + 21888242871839275222246405745257275088548364400416034343698204087921377028030, + 21888242871839275222246405745257275088548364400416034343698203731002526554838, + 364401110452357, + 485858916927878, + 21888242871839275222246405745257275088548364400416034343698203720300138975868, + 248553898269697, + 16666120383382, + 21888242871839275222246405745257275088548364400416034343698204175584840585680, + 21888242871839275222246405745257275088548364400416034343698204182292817766492, + 205221592281286, + 21888242871839275222246405745257275088548364400416034343698203748291213585987, + 21888242871839275222246405745257275088548364400416034343698204104799698802299, + 21888242871839275222246405745257275088548364400416034343698204153986212874462, + 315613475037388, + 21888242871839275222246405745257275088548364400416034343698203849624486801795, + 21888242871839275222246405745257275088548364400416034343698203901204101794559, + 21888242871839275222246405745257275088548364400416034343698203900491679094076, + 116062587022604, + 21888242871839275222246405745257275088548364400416034343698204083290060555214, + 378038421039820, + 21888242871839275222246405745257275088548364400416034343698203663232687057653, + 400086855311746, + 21888242871839275222246405745257275088548364400416034343698203773689659017283, + 59476038071614, + 21888242871839275222246405745257275088548364400416034343698203925420522548817, + 61778289135443, + 84713125575984, + 349568459347334, + 21888242871839275222246405745257275088548364400416034343698203647536706049834, + 457384967345438, + 38537627613740, + 195883991153688, + 551303031741532, + 21888242871839275222246405745257275088548364400416034343698204141760659495009, + 237371846846807, + 216193348646651, + 89128850185254, + 21888242871839275222246405745257275088548364400416034343698204102327297552304, + 323269504926547, + 254838299907579, + 42355183016404, + 21888242871839275222246405745257275088548364400416034343698203969258577364929, + 336849658072107, + 100912779747046, + 369433626839229, + 21888242871839275222246405745257275088548364400416034343698203634936606671028, + 379000550400518, + 21888242871839275222246405745257275088548364400416034343698203826360470033915, + 532173713495945, + 21888242871839275222246405745257275088548364400416034343698204158741045033330, + 21888242871839275222246405745257275088548364400416034343698204045670745581694, + 21888242871839275222246405745257275088548364400416034343698203760090306712573, + 21888242871839275222246405745257275088548364400416034343698203937996216426528, + 58294197470806, + 21888242871839275222246405745257275088548364400416034343698203846148702591834, + 21888242871839275222246405745257275088548364400416034343698204098106068968871, + 21888242871839275222246405745257275088548364400416034343698203734398929307276, + 39067811207916, + 21888242871839275222246405745257275088548364400416034343698203711839519570123, + 209800624810769, + 21888242871839275222246405745257275088548364400416034343698203798675974761557, + 257799327169858, + 21888242871839275222246405745257275088548364400416034343698203995971813852990, + 21888242871839275222246405745257275088548364400416034343698204149395323943580, + 436943109088296, + 21888242871839275222246405745257275088548364400416034343698204045870144947317, + 21888242871839275222246405745257275088548364400416034343698203638341359431154, + 21888242871839275222246405745257275088548364400416034343698203988962272559896, + 422557851225123, + 366839774050698, + 21888242871839275222246405745257275088548364400416034343698203888065515643311, + 21888242871839275222246405745257275088548364400416034343698203856678282931343, + 21888242871839275222246405745257275088548364400416034343698203827821388640267, + 395326475453465, + 21888242871839275222246405745257275088548364400416034343698204039556729848776, + 351856310523718, + 21888242871839275222246405745257275088548364400416034343698203691111764314980, + 208911244751248, + 301499123090013, + 355185334047348, + 21888242871839275222246405745257275088548364400416034343698204144702535257427, + 21888242871839275222246405745257275088548364400416034343698203994372982373561, + 21888242871839275222246405745257275088548364400416034343698204039902838697251, + 21888242871839275222246405745257275088548364400416034343698203702996935107750, + 1400940147379, + 21888242871839275222246405745257275088548364400416034343698204152310615930984, + 21888242871839275222246405745257275088548364400416034343698204036625234156771, + 545040477357905, + 525491242386291, + 21888242871839275222246405745257275088548364400416034343698203941566195286438, + 324646868589369, + 21888242871839275222246405745257275088548364400416034343698204179076206725076, + 267664004703317, + 86809178980427, + 252778390490233, + 288309033320106, + 329709385817336, + 475235330350767, + 21888242871839275222246405745257275088548364400416034343698203716489808204387, + 454230933216038, + 21888242871839275222246405745257275088548364400416034343698203676987698590759, + 69098771094743, + 152570168436309, + 21888242871839275222246405745257275088548364400416034343698203862698932905343, + 21888242871839275222246405745257275088548364400416034343698203751514378082701, + 21888242871839275222246405745257275088548364400416034343698203718266226423275, + 538424103532875, + 491858515550466, + 46831582339894, + 355402446134380, + 21888242871839275222246405745257275088548364400416034343698203813414261383496, + 55996074021334, + 21888242871839275222246405745257275088548364400416034343698203664938031115303, + 70080731955510, + 21888242871839275222246405745257275088548364400416034343698203938372915510117, + 91684496076469, + 21888242871839275222246405745257275088548364400416034343698203669972404640824, + 21888242871839275222246405745257275088548364400416034343698204145525966953300, + 21888242871839275222246405745257275088548364400416034343698204113790364589397, + 289929732849065, + 21888242871839275222246405745257275088548364400416034343698203999302607130226, + 21888242871839275222246405745257275088548364400416034343698204110270432174950, + 79277929661261, + 450234259272207, + 217140492310216, + 21888242871839275222246405745257275088548364400416034343698203660468979559606, + 259912117297691, + 21888242871839275222246405745257275088548364400416034343698203785073127847065, + 301722889846504, + 56432514155585, + 59033816770662, + 525626842359000, + 21888242871839275222246405745257275088548364400416034343698204001137860335588, + 21888242871839275222246405745257275088548364400416034343698203957426296946824, + 18985801902044, + 332778794404883, + 21888242871839275222246405745257275088548364400416034343698204083112512068787, + 21888242871839275222246405745257275088548364400416034343698204122486926447710, + 45308700285209, + 21888242871839275222246405745257275088548364400416034343698203954415660732948, + 553355115270437, + 21888242871839275222246405745257275088548364400416034343698204056503682095148, + 442546695411100, + 350725370618580, + 257510800199099, + 21888242871839275222246405745257275088548364400416034343698204180719207831936, + 21888242871839275222246405745257275088548364400416034343698203668969047282283, + 21888242871839275222246405745257275088548364400416034343698203648366693194142, + 21888242871839275222246405745257275088548364400416034343698203700347956527445, + 21888242871839275222246405745257275088548364400416034343698204109887836154147, + 21888242871839275222246405745257275088548364400416034343698204069522645730358, + 378649229094802, + 21888242871839275222246405745257275088548364400416034343698204001168878272839, + 21888242871839275222246405745257275088548364400416034343698204110235674528983, + 21888242871839275222246405745257275088548364400416034343698203920322628510863, + 258075429133741, + 279767945290098, + 20280697024313, + 83857761464015, + 289455464513060, + 443657276046668, + 216186320125673, + 21888242871839275222246405745257275088548364400416034343698203914296242613448, + 21888242871839275222246405745257275088548364400416034343698203951525469994053, + 21888242871839275222246405745257275088548364400416034343698203829500313815424, + 21888242871839275222246405745257275088548364400416034343698203831766667954574, + 21888242871839275222246405745257275088548364400416034343698203630327573372511, + 21888242871839275222246405745257275088548364400416034343698204166671182672536, + 21888242871839275222246405745257275088548364400416034343698204058062799230249, + 21888242871839275222246405745257275088548364400416034343698203815410088617700, + 21888242871839275222246405745257275088548364400416034343698203702473479587801, + 21888242871839275222246405745257275088548364400416034343698204179777352162631, + 21888242871839275222246405745257275088548364400416034343698203990371764121906, + 546689705737487, + 21888242871839275222246405745257275088548364400416034343698203962939851508916, + 21888242871839275222246405745257275088548364400416034343698203957396713720487, + 217219618229432, + 459311414301301, + 430587498817081, + 392294497248219, + 21888242871839275222246405745257275088548364400416034343698204139440114618168, + 521395795671987, + 21888242871839275222246405745257275088548364400416034343698203733870925797630, + 21888242871839275222246405745257275088548364400416034343698203699977474828336, + 21888242871839275222246405745257275088548364400416034343698204076643430367047, + 341966492324230, + 412627832826738, + 330775918133084, + 233281654025463, + 435874054105870, + 21294393797080, + 21888242871839275222246405745257275088548364400416034343698203808237512781582, + 406543381253728, + 7205811282634, + 21888242871839275222246405745257275088548364400416034343698203780737736128435, + 21888242871839275222246405745257275088548364400416034343698203850300831446352, + 21888242871839275222246405745257275088548364400416034343698204054730675418410, + 465411058645870, + 21888242871839275222246405745257275088548364400416034343698204147972645966394, + 21888242871839275222246405745257275088548364400416034343698203980377877147432, + 365065417889440, + 21888242871839275222246405745257275088548364400416034343698204151739380367283, + 21888242871839275222246405745257275088548364400416034343698203747711844610346, + 152871478099758, + 214696873843117, + 21888242871839275222246405745257275088548364400416034343698203676161890502048, + 450025785196020, + 21888242871839275222246405745257275088548364400416034343698203808164283483575, + 21888242871839275222246405745257275088548364400416034343698203762667939255437, + 21888242871839275222246405745257275088548364400416034343698203934450442667302, + 21888242871839275222246405745257275088548364400416034343698204106158227226895, + 171374111479325, + 78332568506407, + 392049029849465, + 21888242871839275222246405745257275088548364400416034343698203629484023748740, + 228957535446273, + 21888242871839275222246405745257275088548364400416034343698203678083837895753, + 519287067239453, + 279989102012586, + 503907188267308, + 295799452692517, + 161298485906861, + 21888242871839275222246405745257275088548364400416034343698203981553992327479, + 21888242871839275222246405745257275088548364400416034343698203840336403405688, + 30207615622638, + 21888242871839275222246405745257275088548364400416034343698203703303861166944, + 464352761058089, + 69471464372944, + 170561757643965, + 21888242871839275222246405745257275088548364400416034343698203925995190561765, + 21888242871839275222246405745257275088548364400416034343698204119342426365186, + 230043993669956, + 112658792484665, + 378772511394561, + 256633350715806, + 303745390220776, + 21888242871839275222246405745257275088548364400416034343698203908690862385685, + 329028638501755, + 347188346176886, + 331305617034747, + 21888242871839275222246405745257275088548364400416034343698204146516800551612, + 21888242871839275222246405745257275088548364400416034343698203906151437699198, + 21888242871839275222246405745257275088548364400416034343698204169474657514386, + 21888242871839275222246405745257275088548364400416034343698203953193380124317, + 21888242871839275222246405745257275088548364400416034343698204104157739466622, + 549698379250596, + 256414062555340, + 21888242871839275222246405745257275088548364400416034343698203742945928175875, + 355378277053673, + 146283480569375, + 21888242871839275222246405745257275088548364400416034343698203953105372982294, + 21888242871839275222246405745257275088548364400416034343698203739114869330847, + 362948762017622, + 21888242871839275222246405745257275088548364400416034343698203714570844519349, + 21888242871839275222246405745257275088548364400416034343698204095924492625435, + 58189464484921, + 21888242871839275222246405745257275088548364400416034343698203919518711913389, + 435665719612487, + 492062745738591, + 272641280335292, + 21888242871839275222246405745257275088548364400416034343698203990048075340704, + 435846389361853, + 55804714758532, + 21888242871839275222246405745257275088548364400416034343698203787985602617750, + 192937083623751, + 433364500590544, + 21888242871839275222246405745257275088548364400416034343698204006394649381001, + 21888242871839275222246405745257275088548364400416034343698204152454256090994, + 21888242871839275222246405745257275088548364400416034343698203857488078069148, + 81818824826266, + 549527976497338, + 21888242871839275222246405745257275088548364400416034343698203823992623034621, + 21888242871839275222246405745257275088548364400416034343698204153051713538108, + 377835783782195, + 21888242871839275222246405745257275088548364400416034343698203685466367767764, + 21888242871839275222246405745257275088548364400416034343698203967010659610692, + 399753024612044, + 21888242871839275222246405745257275088548364400416034343698204030993063090731, + 158732005320393, + 21888242871839275222246405745257275088548364400416034343698203879251136318430, + 241324219759928, + 21888242871839275222246405745257275088548364400416034343698203819569352055909, + 82684708016404, + 21888242871839275222246405745257275088548364400416034343698204058502947846261, + 212186864214947, + 21888242871839275222246405745257275088548364400416034343698203921137606983723, + 370938607615617, + 21888242871839275222246405745257275088548364400416034343698203813851672848066, + 388135969061703, + 433514710036946, + 21888242871839275222246405745257275088548364400416034343698203806509037872295, + 21888242871839275222246405745257275088548364400416034343698204022411327392107, + 215026435891806, + 368483797095798, + 21888242871839275222246405745257275088548364400416034343698203906785213607604, + 182372693955719, + 522129671927343, + 123921262163344, + 21888242871839275222246405745257275088548364400416034343698203955623193078609, + 280197198546753, + 21888242871839275222246405745257275088548364400416034343698204106915108124663, + 21888242871839275222246405745257275088548364400416034343698204000166417659732, + 21888242871839275222246405745257275088548364400416034343698204017956480069849, + 306461168940630, + 105186778578686, + 21888242871839275222246405745257275088548364400416034343698204141866426063215, + 274405029576580, + 304820610834333, + 497400244120117, + 12516070165753, + 325456474316586, + 295067375902731, + 21888242871839275222246405745257275088548364400416034343698203868504247261629, + 21888242871839275222246405745257275088548364400416034343698203983961776761165, + 21888242871839275222246405745257275088548364400416034343698203842926584436422, + 268015077335048, + 21888242871839275222246405745257275088548364400416034343698204177466112748132, + 21888242871839275222246405745257275088548364400416034343698203872127576326301, + 21888242871839275222246405745257275088548364400416034343698203834875468928737, + 100306315949851, + 21888242871839275222246405745257275088548364400416034343698203749874090123040, + 311526037454726, + 21888242871839275222246405745257275088548364400416034343698203807046959385978, + 515370283996478, + 231737287450222, + 194932740004925, + 21888242871839275222246405745257275088548364400416034343698203808786037879061, + 21888242871839275222246405745257275088548364400416034343698203856561828619415, + 21888242871839275222246405745257275088548364400416034343698204033320693025948, + 355584288052467, + 21888242871839275222246405745257275088548364400416034343698203642017441546812, + 532778371545314, + 21888242871839275222246405745257275088548364400416034343698204036064092106980, + 21888242871839275222246405745257275088548364400416034343698203794263728312529, + 3524805928840, + 21888242871839275222246405745257275088548364400416034343698204087610740683065, + 21888242871839275222246405745257275088548364400416034343698204018208820244295, + 482026269715496, + 21888242871839275222246405745257275088548364400416034343698203924172815763972, + 379738106755803, + 292316516554800, + 21888242871839275222246405745257275088548364400416034343698204073626503420784, + 200731301183014, + 285607050946163, + 174187443189621, + 530385526436681, + 21888242871839275222246405745257275088548364400416034343698204087351817433931, + 161316689526574, + 151984681453761, + 21888242871839275222246405745257275088548364400416034343698204183663765805563, + 21888242871839275222246405745257275088548364400416034343698203847736933418707, + 53154235009616, + 21888242871839275222246405745257275088548364400416034343698204068949400491872, + 294544377204371, + 21888242871839275222246405745257275088548364400416034343698203906641700106485, + 21888242871839275222246405745257275088548364400416034343698203855120810933881, + 21888242871839275222246405745257275088548364400416034343698203792428684023848, + 159893539004584, + 427291385304396, + 21888242871839275222246405745257275088548364400416034343698204023948344092794, + 148130431370864, + 21888242871839275222246405745257275088548364400416034343698203645941146875904, + 209277366699799, + 442523984260047, + 21888242871839275222246405745257275088548364400416034343698203669796951308446, + 21888242871839275222246405745257275088548364400416034343698204109542010697456, + 387759675401355, + 21888242871839275222246405745257275088548364400416034343698203948246980676588, + 21888242871839275222246405745257275088548364400416034343698204107711302681744, + 132333873099309, + 216942699667940, + 350648641717720, + 86927856461286, + 21888242871839275222246405745257275088548364400416034343698203647941235811138, + 21888242871839275222246405745257275088548364400416034343698203742919274191027, + 21888242871839275222246405745257275088548364400416034343698203864662362971533, + 21888242871839275222246405745257275088548364400416034343698203942926387909148, + 21888242871839275222246405745257275088548364400416034343698203778935891882097, + 21888242871839275222246405745257275088548364400416034343698204052400674771383, + 352404068585973, + 279881562649131, + 219651768434367, + 270968317132899, + 369129554103722, + 158013339496762, + 21888242871839275222246405745257275088548364400416034343698203818311210056839, + 21888242871839275222246405745257275088548364400416034343698203869536887933773, + 21888242871839275222246405745257275088548364400416034343698204043796216988886, + 41792083430686, + 21888242871839275222246405745257275088548364400416034343698204060238030278938, + 21888242871839275222246405745257275088548364400416034343698203902148999140928, + 106025854845237, + 21888242871839275222246405745257275088548364400416034343698203869945218483785, + 21888242871839275222246405745257275088548364400416034343698204088039267008449, + 105123969495660, + 17701889944318, + 21888242871839275222246405745257275088548364400416034343698204040660836456213, + 21888242871839275222246405745257275088548364400416034343698203703917119122090, + 21888242871839275222246405745257275088548364400416034343698203745686570972394, + 21888242871839275222246405745257275088548364400416034343698204109598400213905, + 145943045936027, + 21888242871839275222246405745257275088548364400416034343698204133057617293736, + 21888242871839275222246405745257275088548364400416034343698204172217565565787, + 21888242871839275222246405745257275088548364400416034343698203923505305760131, + 330127594607988, + 350583424083029, + 292316187880609, + 21888242871839275222246405745257275088548364400416034343698203629086477039835, + 21888242871839275222246405745257275088548364400416034343698204137037933218701, + 21888242871839275222246405745257275088548364400416034343698203758135572623148, + 21888242871839275222246405745257275088548364400416034343698204066187306171295, + 318077140717217, + 8190684872685, + 179719216119299, + 128804046749607, + 295761204528059, + 21888242871839275222246405745257275088548364400416034343698204127611211101006, + 429985452309841, + 154718159359303, + 21888242871839275222246405745257275088548364400416034343698203673909915977642, + 560290226941869, + 366798342632058, + 352617446741697, + 304689384421676, + 251916117606955, + 21888242871839275222246405745257275088548364400416034343698203724154416987792, + 21888242871839275222246405745257275088548364400416034343698203850939733775045, + 21888242871839275222246405745257275088548364400416034343698203786791611508922, + 179086306946497, + 21888242871839275222246405745257275088548364400416034343698203978617800626777, + 30937482756650, + 186824097414885, + 241430943364754, + 21888242871839275222246405745257275088548364400416034343698203841105143999486, + 475578262441903, + 21888242871839275222246405745257275088548364400416034343698203912015576114021, + 21888242871839275222246405745257275088548364400416034343698203797320056021856, + 21888242871839275222246405745257275088548364400416034343698204150230953952309, + 21888242871839275222246405745257275088548364400416034343698203707864941314233, + 425218654614343, + 178274866276508, + 11804390094388, + 206248219046014, + 21888242871839275222246405745257275088548364400416034343698204080694945082870, + 489658551897521, + 486736994469586, + 451699300697579, + 21888242871839275222246405745257275088548364400416034343698204022118529742747, + 94809677679182, + 42222677902663, + 21888242871839275222246405745257275088548364400416034343698203996867259079350, + 21888242871839275222246405745257275088548364400416034343698204037174746169803, + 21888242871839275222246405745257275088548364400416034343698203717567191412812, + 21888242871839275222246405745257275088548364400416034343698203719966418231367, + 21888242871839275222246405745257275088548364400416034343698204014180791148094, + 21888242871839275222246405745257275088548364400416034343698204014612670319641, + 21888242871839275222246405745257275088548364400416034343698203626139489301944, + 21888242871839275222246405745257275088548364400416034343698203889446258309956, + 21888242871839275222246405745257275088548364400416034343698203848506823968458, + 21888242871839275222246405745257275088548364400416034343698203884005336964687, + 468026231156449, + 21888242871839275222246405745257275088548364400416034343698203771776429306808, + 21888242871839275222246405745257275088548364400416034343698203815333458312444, + 21888242871839275222246405745257275088548364400416034343698203884089600345830, + 21888242871839275222246405745257275088548364400416034343698204149259141505073, + 173969311966115, + 21888242871839275222246405745257275088548364400416034343698203740363677398392, + 21888242871839275222246405745257275088548364400416034343698204026347478038725, + 368207455138980, + 72464257778564, + 21888242871839275222246405745257275088548364400416034343698203816252835182349, + 287878358344272, + 21888242871839275222246405745257275088548364400416034343698204094506499001112, + 21888242871839275222246405745257275088548364400416034343698204059554427519134, + 291732362071286, + 148351217428703, + 61534769546908, + 21888242871839275222246405745257275088548364400416034343698203684513023506758, + 492779965470240, + 539560090446156, + 21888242871839275222246405745257275088548364400416034343698203632643435950800, + 112536910800728, + 397946696068682, + 46992988190223, + 232669769939935, + 189008945213246, + 198239428854558, + 340252815491683, + 21888242871839275222246405745257275088548364400416034343698204029195764686825, + 21888242871839275222246405745257275088548364400416034343698204061475539473295, + 21888242871839275222246405745257275088548364400416034343698204062347452889128, + 21888242871839275222246405745257275088548364400416034343698203837320073897424, + 21888242871839275222246405745257275088548364400416034343698204059819392504200, + 367502151584839, + 21888242871839275222246405745257275088548364400416034343698203980734888531687, + 349349891801747, + 21888242871839275222246405745257275088548364400416034343698203903742819149616, + 466855137770205, + 450961513475049, + 311418642167917, + 364067231527218, + 362463128744053, + 21888242871839275222246405745257275088548364400416034343698204151080112220236, + 21888242871839275222246405745257275088548364400416034343698203960165879133087, + 21888242871839275222246405745257275088548364400416034343698203949995095608627, + 21888242871839275222246405745257275088548364400416034343698204132162028387498, + 21888242871839275222246405745257275088548364400416034343698204086705000725573, + 21888242871839275222246405745257275088548364400416034343698203699383886974298, + 21888242871839275222246405745257275088548364400416034343698204125487890712519, + 21888242871839275222246405745257275088548364400416034343698203956734162444017, + 21888242871839275222246405745257275088548364400416034343698204170222963330330, + 21888242871839275222246405745257275088548364400416034343698204076856009231046, + 110925418079760, + 21888242871839275222246405745257275088548364400416034343698203904983189728473, + 213296796116812, + 150234550946320, + 21888242871839275222246405745257275088548364400416034343698203726815347269648, + 123782078425453, + 444094499806863, + 99138291480764, + 21888242871839275222246405745257275088548364400416034343698204110417279898696, + 424794839573319, + 330381887106443, + 21888242871839275222246405745257275088548364400416034343698204068346068075750, + 314961212571564, + 312839056521793, + 21888242871839275222246405745257275088548364400416034343698203626083996921105, + 177593548238559, + 21888242871839275222246405745257275088548364400416034343698203640954431085379, + 21888242871839275222246405745257275088548364400416034343698203949288128575098, + 53247887509881, + 137424799696682, + 301723004384093, + 21888242871839275222246405745257275088548364400416034343698204024738282938926, + 409574974340418, + 21888242871839275222246405745257275088548364400416034343698203898229921045061, + 56158249989450, + 21888242871839275222246405745257275088548364400416034343698204143580347410601, + 126190011255903, + 21888242871839275222246405745257275088548364400416034343698203939416919433368, + 21888242871839275222246405745257275088548364400416034343698204101193548827138, + 21888242871839275222246405745257275088548364400416034343698203774656586116031, + 21888242871839275222246405745257275088548364400416034343698203871584724914250, + 21888242871839275222246405745257275088548364400416034343698203640300963076465, + 224007949491077, + 21888242871839275222246405745257275088548364400416034343698204124236772397607, + 155531470263056, + 207848214781106, + 21888242871839275222246405745257275088548364400416034343698203897513681213834, + 389517725012224, + 251590147426207, + 21888242871839275222246405745257275088548364400416034343698203955499164149313, + 21888242871839275222246405745257275088548364400416034343698203654602777399744, + 313929200693451, + 21888242871839275222246405745257275088548364400416034343698203941513883312831, + 21888242871839275222246405745257275088548364400416034343698204091237037066100, + 464274112545439, + 21888242871839275222246405745257275088548364400416034343698203967133157197889, + 451813253509334, + 131696407341294, + 21888242871839275222246405745257275088548364400416034343698204069801675349994, + 21888242871839275222246405745257275088548364400416034343698203813692380313072, + 21888242871839275222246405745257275088548364400416034343698203935329767974522, + 21888242871839275222246405745257275088548364400416034343698203822544848492575, + 390273930563372, + 21888242871839275222246405745257275088548364400416034343698204170750154411524, + 21888242871839275222246405745257275088548364400416034343698204163800740637401, + 21888242871839275222246405745257275088548364400416034343698204119243307652595, + 21888242871839275222246405745257275088548364400416034343698203971777085077001, + 74605153115702, + 21888242871839275222246405745257275088548364400416034343698203992742631923820, + 528019543219352, + 5112604775792, + 226232235452035, + 21888242871839275222246405745257275088548364400416034343698203984939713303393, + 21888242871839275222246405745257275088548364400416034343698204176293935543420, + 21888242871839275222246405745257275088548364400416034343698204035401305478540, + 543598646628819, + 21888242871839275222246405745257275088548364400416034343698204186008366899801, + 21888242871839275222246405745257275088548364400416034343698203975912145562116, + 163894056079791, + 287697329275718, + 21888242871839275222246405745257275088548364400416034343698203971610314240124, + 21888242871839275222246405745257275088548364400416034343698203689445892432369, + 21888242871839275222246405745257275088548364400416034343698203970856750454338, + 21888242871839275222246405745257275088548364400416034343698203703342038978531, + 21888242871839275222246405745257275088548364400416034343698203935974870565969, + 21888242871839275222246405745257275088548364400416034343698204074403446467224, + 21888242871839275222246405745257275088548364400416034343698203704787817161855, + 500908979944049, + 21888242871839275222246405745257275088548364400416034343698204011718841160725, + 514036558026701, + 21888242871839275222246405745257275088548364400416034343698203654838705874158, + 298348076709436, + 284733482441381, + 543354018092032, + 21888242871839275222246405745257275088548364400416034343698203955289305114020, + 348145459672634, + 102530049717096, + 441124376348377, + 21888242871839275222246405745257275088548364400416034343698204048244505236217, + 21888242871839275222246405745257275088548364400416034343698203736190511654603, + 11761601657489, + 292482456494471, + 21888242871839275222246405745257275088548364400416034343698203726291432761149, + 21888242871839275222246405745257275088548364400416034343698203789839664002130, + 21888242871839275222246405745257275088548364400416034343698203628428916089876, + 241887933411784, + 422757211803088, + 507139227109619, + 419716887141795, + 145338443352609, + 21888242871839275222246405745257275088548364400416034343698203780735118321287, + 533325027995623, + 507539627268194, + 21888242871839275222246405745257275088548364400416034343698204051069128232698, + 75296575354527, + 132568858144588, + 236652920400908, + 531574370662250, + 376927606062719, + 21888242871839275222246405745257275088548364400416034343698203828943194751526, + 503597762933989, + 523075518467583, + 57234821501785, + 506029154362554, + 21888242871839275222246405745257275088548364400416034343698203639418520294097, + 411168168592345, + 21888242871839275222246405745257275088548364400416034343698203748127359023090, + 21888242871839275222246405745257275088548364400416034343698203649714813538408, + 21888242871839275222246405745257275088548364400416034343698203953788419462818, + 21888242871839275222246405745257275088548364400416034343698204003831941485047, + 21888242871839275222246405745257275088548364400416034343698204078847738266220, + 21888242871839275222246405745257275088548364400416034343698204122256271041465, + 21888242871839275222246405745257275088548364400416034343698204147160070787819, + 482941501847780, + 21888242871839275222246405745257275088548364400416034343698203801590528172682, + 21888242871839275222246405745257275088548364400416034343698203731722528132055, + 21888242871839275222246405745257275088548364400416034343698203642946383501701, + 21888242871839275222246405745257275088548364400416034343698203780465586362725, + 21888242871839275222246405745257275088548364400416034343698204029970701171502, + 21888242871839275222246405745257275088548364400416034343698203874696314394277, + 21888242871839275222246405745257275088548364400416034343698203989027737563729, + 21888242871839275222246405745257275088548364400416034343698204031530051513044, + 21888242871839275222246405745257275088548364400416034343698203992071432071023, + 21888242871839275222246405745257275088548364400416034343698204117460648307701, + 90470948350513, + 463779852930746, + 453993430461717, + 21888242871839275222246405745257275088548364400416034343698203798422550682904, + 448527034888819, + 21888242871839275222246405745257275088548364400416034343698203638026089014515, + 21888242871839275222246405745257275088548364400416034343698204111914707738973, + 21888242871839275222246405745257275088548364400416034343698203874068756557858, + 21888242871839275222246405745257275088548364400416034343698204103409704994942, + 21888242871839275222246405745257275088548364400416034343698203781730527275317, + 374277742618440, + 347345088071103, + 21888242871839275222246405745257275088548364400416034343698204017923343034324, + 21888242871839275222246405745257275088548364400416034343698204019353657952859, + 560182879774220, + 21888242871839275222246405745257275088548364400416034343698204095033783778379, + 21888242871839275222246405745257275088548364400416034343698203661425129930102, + 260145373630911, + 428143458784218, + 21888242871839275222246405745257275088548364400416034343698203718832694822081, + 174142398986141, + 21888242871839275222246405745257275088548364400416034343698203994932351961485, + 21888242871839275222246405745257275088548364400416034343698204154825553024812, + 94096479406573, + 21888242871839275222246405745257275088548364400416034343698203871820819999485, + 21888242871839275222246405745257275088548364400416034343698204136976625660496, + 21888242871839275222246405745257275088548364400416034343698203943631614493756, + 21888242871839275222246405745257275088548364400416034343698203915366872353627, + 21888242871839275222246405745257275088548364400416034343698203985114742066805, + 318884478314454, + 21888242871839275222246405745257275088548364400416034343698204068244725429819, + 21888242871839275222246405745257275088548364400416034343698204139116752753346, + 21888242871839275222246405745257275088548364400416034343698203880619808089636, + 41715447354416, + 154051905417366, + 380216025002293, + 64971460773155, + 21888242871839275222246405745257275088548364400416034343698203846821375908064, + 21888242871839275222246405745257275088548364400416034343698203753706475913747, + 194953828968389, + 21888242871839275222246405745257275088548364400416034343698203986984113734038, + 21888242871839275222246405745257275088548364400416034343698204040863316900195, + 533079254581529, + 21888242871839275222246405745257275088548364400416034343698203910557854582784, + 21888242871839275222246405745257275088548364400416034343698203846194959944211, + 142371570230924, + 479690882323019, + 21888242871839275222246405745257275088548364400416034343698203729626894508358, + 21888242871839275222246405745257275088548364400416034343698204070077467813956, + 21888242871839275222246405745257275088548364400416034343698203629705030044099, + 277120452845184, + 252544195984988, + 543171983828274, + 21888242871839275222246405745257275088548364400416034343698203675391400073221, + 401731670512984, + 21888242871839275222246405745257275088548364400416034343698203810188860470633, + 558658061228249, + 450130780956277, + 21888242871839275222246405745257275088548364400416034343698203736197416100814, + 494462971317276, + 461948766311376, + 6230270430104, + 524472303375008, + 21888242871839275222246405745257275088548364400416034343698203804282666121688, + 21888242871839275222246405745257275088548364400416034343698203902617012810960, + 21888242871839275222246405745257275088548364400416034343698203995318924007198, + 21888242871839275222246405745257275088548364400416034343698203822780714230602, + 77480507936592, + 298198690616739, + 21888242871839275222246405745257275088548364400416034343698204092623547764629, + 21888242871839275222246405745257275088548364400416034343698204103451414411150, + 422775526617658, + 315432174432728, + 150842528899025, + 374418628652755, + 21888242871839275222246405745257275088548364400416034343698203891271828040624, + 21888242871839275222246405745257275088548364400416034343698203751748829490178, + 21888242871839275222246405745257275088548364400416034343698203914390422511127, + 21888242871839275222246405745257275088548364400416034343698203861347937496320, + 396599987412259, + 394800579935204, + 300686276429208, + 21888242871839275222246405745257275088548364400416034343698204183058650336780, + 259396097818930, + 21888242871839275222246405745257275088548364400416034343698203868115258992626, + 382990555457177, + 21888242871839275222246405745257275088548364400416034343698203949397561790788, + 21888242871839275222246405745257275088548364400416034343698203731806630750391, + 232155828017669, + 433154759239511, + 68266702272835, + 431771211347683, + 23886775570369, + 127329357662463, + 164745993523653, + 80532726422294, + 114815576475657, + 21888242871839275222246405745257275088548364400416034343698203784171946687917, + 21888242871839275222246405745257275088548364400416034343698204139050959414909, + 21888242871839275222246405745257275088548364400416034343698203722776179967150, + 21888242871839275222246405745257275088548364400416034343698204046256596218130, + 21888242871839275222246405745257275088548364400416034343698203819292994901656, + 21888242871839275222246405745257275088548364400416034343698204133233879381423, + 413983093211798, + 21888242871839275222246405745257275088548364400416034343698203740692746473226, + 222204676617462, + 21888242871839275222246405745257275088548364400416034343698203675774390713678, + 219593689572235, + 525375648316794, + 21888242871839275222246405745257275088548364400416034343698203794925941110008, + 295881710577494, + 21888242871839275222246405745257275088548364400416034343698203760056112024636, + 322011807142615, + 95986142412511, + 522176158706167, + 143423702651254, + 21888242871839275222246405745257275088548364400416034343698204007485292058665, + 77637215554829, + 21888242871839275222246405745257275088548364400416034343698204086789834579372, + 144574722640352, + 298008124135013, + 21888242871839275222246405745257275088548364400416034343698203675833486680210, + 21888242871839275222246405745257275088548364400416034343698203879891070017440, + 21888242871839275222246405745257275088548364400416034343698203992698073800069, + 21888242871839275222246405745257275088548364400416034343698204081486926041748, + 21888242871839275222246405745257275088548364400416034343698203963760414528429, + 118025771245242, + 21888242871839275222246405745257275088548364400416034343698204143361328066406, + 106397551228935, + 511755393915217, + 1768500349323, + 429624316344803, + 21888242871839275222246405745257275088548364400416034343698203892359498316815, + 126694039191395, + 71619419571805, + 21888242871839275222246405745257275088548364400416034343698203873336859857322, + 21888242871839275222246405745257275088548364400416034343698203947893860930487, + 3844200232328, + 438189594511161, + 21888242871839275222246405745257275088548364400416034343698203913919225520681, + 21888242871839275222246405745257275088548364400416034343698203747478556838092, + 11030748753629, + 21888242871839275222246405745257275088548364400416034343698204046977103485843, + 40603650931818, + 21888242871839275222246405745257275088548364400416034343698204173740075859897, + 21888242871839275222246405745257275088548364400416034343698203947712200156889, + 21888242871839275222246405745257275088548364400416034343698204015740418047326, + 259318725553699, + 21888242871839275222246405745257275088548364400416034343698203827120003243574, + 535955361720774, + 21888242871839275222246405745257275088548364400416034343698203985601655811220, + 262390526147151, + 288175419797125, + 21888242871839275222246405745257275088548364400416034343698204048394343111283, + 21888242871839275222246405745257275088548364400416034343698203885214782965033, + 21888242871839275222246405745257275088548364400416034343698204080353134838066, + 49806836869122, + 21888242871839275222246405745257275088548364400416034343698204178746989043716, + 306629251002830, + 135329727273028, + 21888242871839275222246405745257275088548364400416034343698204041983529185534, + 360695222393277, + 21888242871839275222246405745257275088548364400416034343698203841802842422290, + 301918722889008, + 21888242871839275222246405745257275088548364400416034343698203840367730567369, + 316516349488060, + 145348444553323, + 21888242871839275222246405745257275088548364400416034343698203830950064431478, + 86491045369535, + 21888242871839275222246405745257275088548364400416034343698203834643870211731, + 331107438272789, + 510854950550912, + 21888242871839275222246405745257275088548364400416034343698203968007361446674, + 21888242871839275222246405745257275088548364400416034343698204106512382195075, + 21888242871839275222246405745257275088548364400416034343698203936723111607401, + 21888242871839275222246405745257275088548364400416034343698203909617668217191, + 551552528064054, + 21888242871839275222246405745257275088548364400416034343698203831879407025840, + 21888242871839275222246405745257275088548364400416034343698203668684711102076, + 103881799832865, + 21888242871839275222246405745257275088548364400416034343698203879335213473422, + 21888242871839275222246405745257275088548364400416034343698203917552148726527, + 546057968780755, + 21888242871839275222246405745257275088548364400416034343698204053498457218834, + 21888242871839275222246405745257275088548364400416034343698203888532877890644, + 430332530596416, + 21888242871839275222246405745257275088548364400416034343698204029435028537495, + 515912216710820, + 220516607422005, + 21888242871839275222246405745257275088548364400416034343698203970140122402540, + 25942677484395, + 21888242871839275222246405745257275088548364400416034343698203780264574927520, + 332443805632775, + 21888242871839275222246405745257275088548364400416034343698203920359086082634, + 21888242871839275222246405745257275088548364400416034343698203959878636884916, + 21888242871839275222246405745257275088548364400416034343698204022474593820006, + 21888242871839275222246405745257275088548364400416034343698204116996017449538, + 130722911149161, + 134237390479828, + 21888242871839275222246405745257275088548364400416034343698203763758421499180, + 139197721611463, + 21888242871839275222246405745257275088548364400416034343698204180218976469313, + 546183350625996, + 430421484984402, + 21888242871839275222246405745257275088548364400416034343698203947466437633283, + 21888242871839275222246405745257275088548364400416034343698203900747352071344, + 21888242871839275222246405745257275088548364400416034343698203778904450729212, + 21888242871839275222246405745257275088548364400416034343698203953736551582834, + 239600351473956, + 21888242871839275222246405745257275088548364400416034343698203730316510447802, + 21888242871839275222246405745257275088548364400416034343698203882576405115284, + 335430103452508, + 331715038415223, + 53915623310410, + 21888242871839275222246405745257275088548364400416034343698203973326457639266, + 21888242871839275222246405745257275088548364400416034343698204010469051558234, + 21888242871839275222246405745257275088548364400416034343698204149233588943900, + 122270296217805, + 102982533790667, + 129258389952371, + 21888242871839275222246405745257275088548364400416034343698203796304950545140, + 21888242871839275222246405745257275088548364400416034343698203826254042898979, + 21888242871839275222246405745257275088548364400416034343698204140293249355195, + 21888242871839275222246405745257275088548364400416034343698203841932448751993, + 537063420895147, + 409942045970669, + 21888242871839275222246405745257275088548364400416034343698203992072297238703, + 223793157722910, + 202878490196967, + 446566658951105, + 269360569400320, + 21888242871839275222246405745257275088548364400416034343698203982969418409341, + 25201421458367, + 19869960891263, + 293102489252077, + 21888242871839275222246405745257275088548364400416034343698203705412679981484, + 239042682907759, + 382698713199346, + 21888242871839275222246405745257275088548364400416034343698204084831945798944, + 450221764911777, + 21888242871839275222246405745257275088548364400416034343698203912106253347455, + 297306590803967, + 21888242871839275222246405745257275088548364400416034343698204163222303315394, + 112763043879819, + 21888242871839275222246405745257275088548364400416034343698203955272374245882, + 21888242871839275222246405745257275088548364400416034343698203681900156119415, + 341678508887215, + 132267222840346, + 21888242871839275222246405745257275088548364400416034343698203649648979098249, + 21888242871839275222246405745257275088548364400416034343698203993727372294085, + 352529553871485, + 21888242871839275222246405745257275088548364400416034343698204104310318035412, + 319008471117267, + 21888242871839275222246405745257275088548364400416034343698204005045535465182, + 21888242871839275222246405745257275088548364400416034343698203725115084247955, + 144676567255727, + 560845202994082, + 406476840508204, + 21888242871839275222246405745257275088548364400416034343698203744111946107647, + 240953733696361, + 136167853709852, + 554517825497892, + 21888242871839275222246405745257275088548364400416034343698203910091307597442, + 382873790966370, + 21888242871839275222246405745257275088548364400416034343698204049366846277148, + 466549116745833, + 295069921707593, + 331398529026951, + 21888242871839275222246405745257275088548364400416034343698203958770780337678, + 21888242871839275222246405745257275088548364400416034343698203751192598103545, + 21888242871839275222246405745257275088548364400416034343698203895026779650988, + 21888242871839275222246405745257275088548364400416034343698204176158661257009, + 21888242871839275222246405745257275088548364400416034343698203840120259695049, + 21888242871839275222246405745257275088548364400416034343698203858096959175462, + 21888242871839275222246405745257275088548364400416034343698203680828213005884, + 21888242871839275222246405745257275088548364400416034343698203643116430034334, + 21888242871839275222246405745257275088548364400416034343698203844448649060352, + 21888242871839275222246405745257275088548364400416034343698203971742704578671, + 21888242871839275222246405745257275088548364400416034343698203710906632242741, + 21888242871839275222246405745257275088548364400416034343698203947327766495871, + 514112686343478, + 496555251480303, + 424183768849002, + 21888242871839275222246405745257275088548364400416034343698203959161500634859, + 21888242871839275222246405745257275088548364400416034343698203971755984029161, + 21888242871839275222246405745257275088548364400416034343698203944089949534746, + 184741029424372, + 21888242871839275222246405745257275088548364400416034343698203997140179755303, + 79307252189778, + 21888242871839275222246405745257275088548364400416034343698204120742456135460, + 21888242871839275222246405745257275088548364400416034343698204151558595805532, + 41597983092256, + 96435479159138, + 311588786277686, + 21888242871839275222246405745257275088548364400416034343698203850602561174306, + 21888242871839275222246405745257275088548364400416034343698203820099046455683, + 81293170890889, + 21888242871839275222246405745257275088548364400416034343698203916709964722878, + 470713482361884, + 237232867088387, + 21888242871839275222246405745257275088548364400416034343698203792363468678884, + 21888242871839275222246405745257275088548364400416034343698204012604225839552, + 21888242871839275222246405745257275088548364400416034343698203831539076452840, + 21888242871839275222246405745257275088548364400416034343698203735095611681042, + 493738063892234, + 208799561832528, + 21888242871839275222246405745257275088548364400416034343698203773346542512191, + 408812600579551, + 21888242871839275222246405745257275088548364400416034343698203806247921190779, + 21888242871839275222246405745257275088548364400416034343698203684138658134106, + 309828697706814, + 366625163482510, + 112798552899155, + 21888242871839275222246405745257275088548364400416034343698204076298107854200, + 81566470585151, + 14485605418380, + 367122153984276, + 420663446367073, + 113296464075493, + 476316704828455, + 63758339954997, + 21888242871839275222246405745257275088548364400416034343698204048870783717637, + 400334391806668, + 21888242871839275222246405745257275088548364400416034343698204102777591382523, + 21888242871839275222246405745257275088548364400416034343698203765777120118439, + 59211267086559, + 21888242871839275222246405745257275088548364400416034343698203852024770608885, + 21888242871839275222246405745257275088548364400416034343698203997198464368875, + 21888242871839275222246405745257275088548364400416034343698203917587216195015, + 49962881270922, + 21888242871839275222246405745257275088548364400416034343698204046570945551034, + 21888242871839275222246405745257275088548364400416034343698203932262910315646, + 21888242871839275222246405745257275088548364400416034343698203945361980860074, + 307707285216748, + 21888242871839275222246405745257275088548364400416034343698204101289455811480, + 21888242871839275222246405745257275088548364400416034343698204100190023713816, + 12280384893138, + 457211562883769, + 188898947135585, + 21888242871839275222246405745257275088548364400416034343698204013270296830683, + 21888242871839275222246405745257275088548364400416034343698203894460554554609, + 381624735309551, + 21888242871839275222246405745257275088548364400416034343698203768839016175517, + 21888242871839275222246405745257275088548364400416034343698203761825115882786, + 351089125852616, + 21888242871839275222246405745257275088548364400416034343698204159360698636143, + 48117495045445, + 21888242871839275222246405745257275088548364400416034343698204154665064277462, + 21888242871839275222246405745257275088548364400416034343698203771906352369781, + 21888242871839275222246405745257275088548364400416034343698204024215684329554, + 318183220844003, + 21888242871839275222246405745257275088548364400416034343698203950562441456337, + 21888242871839275222246405745257275088548364400416034343698203913794164522659, + 344134945318955, + 307751120116774, + 135063704345471, + 21888242871839275222246405745257275088548364400416034343698204154660729561534, + 345680905759400, + 21888242871839275222246405745257275088548364400416034343698203819907855730970, + 21888242871839275222246405745257275088548364400416034343698204137296380901798, + 76591074271809, + 521079575233900, + 186855282198567, + 21888242871839275222246405745257275088548364400416034343698203916539604469401, + 21888242871839275222246405745257275088548364400416034343698203806802865946871, + 401441034971034, + 199192530023319, + 21888242871839275222246405745257275088548364400416034343698203630307005765755, + 500629133133633, + 297703703021050, + 21888242871839275222246405745257275088548364400416034343698203786836116686105, + 117379420509700, + 492378456435689, + 83736881521915, + 192648159318130, + 335595793385878, + 21888242871839275222246405745257275088548364400416034343698204011155061083862, + 21888242871839275222246405745257275088548364400416034343698204113744564533511, + 536222566309606, + 225017374740850, + 21888242871839275222246405745257275088548364400416034343698203863217027516734, + 21888242871839275222246405745257275088548364400416034343698203912464320623258, + 21888242871839275222246405745257275088548364400416034343698204065258156186525, + 21888242871839275222246405745257275088548364400416034343698203834024309547498, + 74660010060855, + 21888242871839275222246405745257275088548364400416034343698203721257004562461, + 325696238135497, + 332469580069977, + 354470944968892, + 21888242871839275222246405745257275088548364400416034343698203677698216189976, + 21888242871839275222246405745257275088548364400416034343698203962684272375606, + 559425016528260, + 202385707483012, + 427277580414582, + 524582229439328, + 542971782535120, + 223171754666379, + 21888242871839275222246405745257275088548364400416034343698204172752683040403, + 177703296309031, + 21888242871839275222246405745257275088548364400416034343698203896877806966061, + 21888242871839275222246405745257275088548364400416034343698203900357539296459, + 21888242871839275222246405745257275088548364400416034343698203920805079224740, + 21888242871839275222246405745257275088548364400416034343698203814551632045198, + 21888242871839275222246405745257275088548364400416034343698204139349507288797, + 21888242871839275222246405745257275088548364400416034343698204088612185743999, + 530414057333865, + 21888242871839275222246405745257275088548364400416034343698204137598833763850, + 292719199267527, + 113807749811994, + 21888242871839275222246405745257275088548364400416034343698203646251597588643, + 21888242871839275222246405745257275088548364400416034343698203938494788040600, + 383801000780646, + 139943648690962, + 268717087525123, + 32568304336808, + 21888242871839275222246405745257275088548364400416034343698203637745517297860, + 199802097160814, + 21888242871839275222246405745257275088548364400416034343698203758261946096948, + 21888242871839275222246405745257275088548364400416034343698203823275237962493, + 21888242871839275222246405745257275088548364400416034343698203786689015704031, + 21888242871839275222246405745257275088548364400416034343698203863934281430407, + 170896783154012, + 21888242871839275222246405745257275088548364400416034343698203949526186628691, + 438664327518745, + 21888242871839275222246405745257275088548364400416034343698204169181683854585, + 21888242871839275222246405745257275088548364400416034343698204160428470449458, + 21888242871839275222246405745257275088548364400416034343698203676141828474559, + 21888242871839275222246405745257275088548364400416034343698203625052507021235, + 317793408376412, + 21888242871839275222246405745257275088548364400416034343698204011104081680508, + 186159262226031, + 21888242871839275222246405745257275088548364400416034343698203870592050350046, + 334031306995068, + 205753250369957, + 223766815580140, + 21888242871839275222246405745257275088548364400416034343698203727810010388201, + 21888242871839275222246405745257275088548364400416034343698203903599782033799, + 494066966808989, + 451068452088770, + 365668546940261, + 21888242871839275222246405745257275088548364400416034343698204022172542809031, + 21888242871839275222246405745257275088548364400416034343698204062175960711613, + 433498468724314, + 21888242871839275222246405745257275088548364400416034343698203932045209184750, + 21888242871839275222246405745257275088548364400416034343698203704793029942988, + 21888242871839275222246405745257275088548364400416034343698203890567160966606, + 411667067167403, + 163012955302812, + 202814929431902, + 249981034546053, + 21888242871839275222246405745257275088548364400416034343698203895982676323907, + 429491708864666, + 21888242871839275222246405745257275088548364400416034343698203965183727001549, + 21888242871839275222246405745257275088548364400416034343698203909039659707603, + 21888242871839275222246405745257275088548364400416034343698204160902716021100, + 21888242871839275222246405745257275088548364400416034343698203993123462712553, + 153407929906847, + 306842546505193, + 360988502089163, + 99904525892040, + 75897131337225, + 21888242871839275222246405745257275088548364400416034343698203722537204625523, + 21888242871839275222246405745257275088548364400416034343698203652732449352755, + 137256435214788, + 21888242871839275222246405745257275088548364400416034343698203707451219326852, + 21888242871839275222246405745257275088548364400416034343698203718879316354241, + 21888242871839275222246405745257275088548364400416034343698203753495610660140, + 228191693293652, + 94631911163311, + 240272125888413, + 21888242871839275222246405745257275088548364400416034343698204186539067529997, + 21888242871839275222246405745257275088548364400416034343698203730208236028599, + 531495527349253, + 21888242871839275222246405745257275088548364400416034343698204125826827298871, + 21888242871839275222246405745257275088548364400416034343698203775291393957264, + 21888242871839275222246405745257275088548364400416034343698203953168947946527, + 21888242871839275222246405745257275088548364400416034343698203833730312100079, + 359648473701721, + 21888242871839275222246405745257275088548364400416034343698203848971338526149, + 382775534740252, + 262931873567441, + 374364747918149, + 323535234837212, + 21888242871839275222246405745257275088548364400416034343698203696079202273504, + 335437135732174, + 133836047851373, + 21888242871839275222246405745257275088548364400416034343698204119349561608834, + 416900541961362, + 261656973601423, + 314186253933117, + 465704182079414, + 152392767404848, + 21888242871839275222246405745257275088548364400416034343698203830513157062890, + 21888242871839275222246405745257275088548364400416034343698203674308849768304, + 21888242871839275222246405745257275088548364400416034343698204012271214001028, + 21888242871839275222246405745257275088548364400416034343698203647043703457223, + 21888242871839275222246405745257275088548364400416034343698203649236904978240, + 21888242871839275222246405745257275088548364400416034343698203761901304910882, + 21888242871839275222246405745257275088548364400416034343698203899053572569863, + 21888242871839275222246405745257275088548364400416034343698204139750349802533, + 134901717137467, + 529216641261484, + 140520640937871, + 21888242871839275222246405745257275088548364400416034343698203836531585613217, + 155633042890100, + 370413012127570, + 21888242871839275222246405745257275088548364400416034343698203936528371165441, + 522780165008236, + 21888242871839275222246405745257275088548364400416034343698203790345789389363, + 433947574321801, + 21888242871839275222246405745257275088548364400416034343698203711444551676700, + 21888242871839275222246405745257275088548364400416034343698203726847343352700, + 210900520180329, + 21888242871839275222246405745257275088548364400416034343698203833519106353091, + 515501227099700, + 206432866229935, + 21888242871839275222246405745257275088548364400416034343698203833034202151716, + 21888242871839275222246405745257275088548364400416034343698204011168269740618, + 21888242871839275222246405745257275088548364400416034343698203846853842273040, + 21888242871839275222246405745257275088548364400416034343698204180439202803680, + 21888242871839275222246405745257275088548364400416034343698204158627080485132, + 201433588460304, + 273926115777611, + 21888242871839275222246405745257275088548364400416034343698204150253532883427, + 21888242871839275222246405745257275088548364400416034343698204142699884354150, + 21888242871839275222246405745257275088548364400416034343698204055471224372351, + 21888242871839275222246405745257275088548364400416034343698203829264657906760, + 21888242871839275222246405745257275088548364400416034343698203920946725872295, + 534158569645974, + 21888242871839275222246405745257275088548364400416034343698203813220001537118, + 21888242871839275222246405745257275088548364400416034343698204094019914847384, + 21888242871839275222246405745257275088548364400416034343698204072529789145306, + 21888242871839275222246405745257275088548364400416034343698203843636083426948, + 90211555334131, + 21888242871839275222246405745257275088548364400416034343698203720044384066472, + 434716045938362, + 363024236518651, + 21888242871839275222246405745257275088548364400416034343698203803071746067834, + 21888242871839275222246405745257275088548364400416034343698203812566111093431, + 21888242871839275222246405745257275088548364400416034343698203817211402504730, + 21888242871839275222246405745257275088548364400416034343698203751524368755767, + 443197681388648, + 21888242871839275222246405745257275088548364400416034343698203973789643819789, + 21888242871839275222246405745257275088548364400416034343698203903291108995771, + 21888242871839275222246405745257275088548364400416034343698203883005028542999, + 21888242871839275222246405745257275088548364400416034343698203878799090617091, + 21888242871839275222246405745257275088548364400416034343698203643142738437574, + 313830398182033, + 21888242871839275222246405745257275088548364400416034343698203690581603704392, + 534215393706747, + 47670918104328, + 21888242871839275222246405745257275088548364400416034343698203914017432658602, + 151565052772143, + 383896550313322, + 21888242871839275222246405745257275088548364400416034343698204010097412600999, + 21888242871839275222246405745257275088548364400416034343698203745503836330243, + 491972009518382, + 198975581984295, + 116027701276466, + 434506109753022, + 21888242871839275222246405745257275088548364400416034343698204045176468771291, + 246265070916134, + 107741525059938, + 21888242871839275222246405745257275088548364400416034343698203884138510516832, + 21888242871839275222246405745257275088548364400416034343698203837073174415856, + 21888242871839275222246405745257275088548364400416034343698203632868981661720, + 204329255223037, + 559031276516120, + 562875840163158, + 539486624638916, + 157162048930127, + 345509467398251, + 21888242871839275222246405745257275088548364400416034343698204135767909299767, + 401357000284926, + 21888242871839275222246405745257275088548364400416034343698203873452394999126, + 21888242871839275222246405745257275088548364400416034343698203726531687589097, + 21888242871839275222246405745257275088548364400416034343698203816332689479921, + 248616794061585, + 267934130770262, + 559431788687140, + 11806326412395, + 21453855966240, + 21888242871839275222246405745257275088548364400416034343698204162029297893078, + 21888242871839275222246405745257275088548364400416034343698203624607577668501, + 312993874447626, + 21888242871839275222246405745257275088548364400416034343698203807118247551083, + 224737447759330, + 473568271577388, + 21888242871839275222246405745257275088548364400416034343698203723785711014796, + 299402668275185, + 145581594642292, + 21888242871839275222246405745257275088548364400416034343698204049331953370120, + 21888242871839275222246405745257275088548364400416034343698203831517761023792, + 531687048256316, + 371583812071537, + 21888242871839275222246405745257275088548364400416034343698203703742012224637, + 523739868513580, + 555209423929708, + 396908439854003, + 21888242871839275222246405745257275088548364400416034343698204065607845052037, + 461943275145189, + 21888242871839275222246405745257275088548364400416034343698204048863143032434, + 21888242871839275222246405745257275088548364400416034343698204110614476019812, + 21888242871839275222246405745257275088548364400416034343698203678093400835299, + 21888242871839275222246405745257275088548364400416034343698203672487104500820, + 21888242871839275222246405745257275088548364400416034343698203880305303827547, + 275180338956916, + 43295393176602, + 21888242871839275222246405745257275088548364400416034343698204039951358109536, + 21888242871839275222246405745257275088548364400416034343698203638727546338691, + 21888242871839275222246405745257275088548364400416034343698204016796479076733, + 21888242871839275222246405745257275088548364400416034343698204061877525962467, + 21888242871839275222246405745257275088548364400416034343698203936431845639260, + 21888242871839275222246405745257275088548364400416034343698203979945269898283, + 257608064767783, + 21888242871839275222246405745257275088548364400416034343698204068166887585785, + 21888242871839275222246405745257275088548364400416034343698203662922275700571, + 286810295111394, + 503818807016319, + 21888242871839275222246405745257275088548364400416034343698203902763306926157, + 260732529056938, + 460489753368455, + 196493498432591, + 21888242871839275222246405745257275088548364400416034343698204093884564674634, + 21888242871839275222246405745257275088548364400416034343698203843386377806160, + 8579905604078, + 160375373451193, + 21888242871839275222246405745257275088548364400416034343698203941641783414085, + 391317684636426, + 459363098979030, + 21888242871839275222246405745257275088548364400416034343698204068629345126518, + 21888242871839275222246405745257275088548364400416034343698204077825952616996, + 222748805492922, + 21888242871839275222246405745257275088548364400416034343698203836059059359799, + 21888242871839275222246405745257275088548364400416034343698203781287674777385, + 297357546190090, + 21888242871839275222246405745257275088548364400416034343698204083722059544938, + 21888242871839275222246405745257275088548364400416034343698203761372552301483, + 21888242871839275222246405745257275088548364400416034343698203884730968656710, + 221347002558176, + 21888242871839275222246405745257275088548364400416034343698203996365029940950, + 314966604847088, + 117084975114386, + 21888242871839275222246405745257275088548364400416034343698203817593015754156, + 231754341249468, + 301267213955763, + 21888242871839275222246405745257275088548364400416034343698203626717838305023, + 541349451032149, + 21888242871839275222246405745257275088548364400416034343698204180666114572292, + 21888242871839275222246405745257275088548364400416034343698203833886041327876, + 21888242871839275222246405745257275088548364400416034343698203993372140494348, + 126200985265371, + 21888242871839275222246405745257275088548364400416034343698204010345965742280, + 296725139886347, + 21888242871839275222246405745257275088548364400416034343698203639736566632015, + 265143863094437, + 21888242871839275222246405745257275088548364400416034343698203681205193242158, + 200779255014247, + 21888242871839275222246405745257275088548364400416034343698203699313965304513, + 237797341654749, + 21888242871839275222246405745257275088548364400416034343698203857059047887144, + 339681803103381, + 21888242871839275222246405745257275088548364400416034343698204134242408088931, + 298815659121944, + 142171930104430, + 546377325283684, + 21888242871839275222246405745257275088548364400416034343698204133689671386802, + 21888242871839275222246405745257275088548364400416034343698203665141964517303, + 86336411717189, + 21888242871839275222246405745257275088548364400416034343698204075302430507491, + 21888242871839275222246405745257275088548364400416034343698203838575426123285, + 21888242871839275222246405745257275088548364400416034343698204015459264676787, + 21888242871839275222246405745257275088548364400416034343698204124382523969710, + 41086992492202, + 21888242871839275222246405745257275088548364400416034343698203917162242368545, + 311757756757467, + 161314872774952, + 76671061184881, + 455778807720576, + 391183524191916, + 21888242871839275222246405745257275088548364400416034343698204121038998164050, + 21888242871839275222246405745257275088548364400416034343698204152529543125869, + 121777373024216, + 422653005792848, + 100838634696697, + 21888242871839275222246405745257275088548364400416034343698204020642663447715, + 21888242871839275222246405745257275088548364400416034343698203709475017340619, + 21888242871839275222246405745257275088548364400416034343698204149239335396015, + 21888242871839275222246405745257275088548364400416034343698204127466018840559, + 181008982953325, + 50437196354538, + 427065096881431, + 21888242871839275222246405745257275088548364400416034343698203864909851975105, + 21888242871839275222246405745257275088548364400416034343698204142575927241750, + 21888242871839275222246405745257275088548364400416034343698203965194988591194, + 21888242871839275222246405745257275088548364400416034343698204104825401755639, + 164389364654751, + 21888242871839275222246405745257275088548364400416034343698203954099559958598, + 285066276793075, + 91842832941944, + 297276788614713, + 205605542845548, + 21888242871839275222246405745257275088548364400416034343698204080264705034771, + 371593104714100, + 483579534172258, + 21888242871839275222246405745257275088548364400416034343698204057228023227512, + 450597096403591, + 116226759242922, + 21888242871839275222246405745257275088548364400416034343698203806083002323146, + 195204754863306, + 143798109378233, + 21888242871839275222246405745257275088548364400416034343698203984182581597805, + 21888242871839275222246405745257275088548364400416034343698204139122853516907, + 21888242871839275222246405745257275088548364400416034343698203859647876413768, + 21888242871839275222246405745257275088548364400416034343698203875356091878324, + 21888242871839275222246405745257275088548364400416034343698203978823998836832, + 817621319752, + 21888242871839275222246405745257275088548364400416034343698204118462536984894, + 549172079161502, + 21888242871839275222246405745257275088548364400416034343698204081590061416245, + 21888242871839275222246405745257275088548364400416034343698203739082355238508, + 21888242871839275222246405745257275088548364400416034343698204060631373166368, + 481778215442956, + 490316001381043, + 21888242871839275222246405745257275088548364400416034343698203986461104775653, + 308012134558841, + 21888242871839275222246405745257275088548364400416034343698203918785217273518, + 189632624202719, + 450223014062054, + 15434061853682, + 307960260459375, + 528953972441807, + 338404980397628, + 21888242871839275222246405745257275088548364400416034343698204000521168691186, + 400367958926027, + 393333372668680, + 61390645262668, + 534991947383577, + 72967439690539, + 21888242871839275222246405745257275088548364400416034343698203931535237574175, + 107008918763324, + 21888242871839275222246405745257275088548364400416034343698203764949684633950, + 395930160115319, + 21888242871839275222246405745257275088548364400416034343698203938506032912002, + 21888242871839275222246405745257275088548364400416034343698204125682580577798, + 21888242871839275222246405745257275088548364400416034343698204129673045197602, + 303104552048552, + 19714322476899, + 459633457046327, + 21888242871839275222246405745257275088548364400416034343698204146698017613766, + 90592213342354, + 38335076629738, + 213091893919134, + 21888242871839275222246405745257275088548364400416034343698203709243475282569, + 194528497271192, + 21888242871839275222246405745257275088548364400416034343698203927195303620319, + 21888242871839275222246405745257275088548364400416034343698203920533851493484, + 21888242871839275222246405745257275088548364400416034343698204156333499241821, + 21888242871839275222246405745257275088548364400416034343698203857847310757248, + 21888242871839275222246405745257275088548364400416034343698203969271201906799, + 21888242871839275222246405745257275088548364400416034343698204168016142776384, + 21888242871839275222246405745257275088548364400416034343698203912566014535500, + 301153371472238, + 21888242871839275222246405745257275088548364400416034343698204046095552407200, + 372450154000953, + 21888242871839275222246405745257275088548364400416034343698203921635422195607, + 23626743984267, + 21888242871839275222246405745257275088548364400416034343698203726341883693897, + 150315416693460, + 21888242871839275222246405745257275088548364400416034343698203976992039209427, + 21888242871839275222246405745257275088548364400416034343698203652047507894684, + 21888242871839275222246405745257275088548364400416034343698203794811788530905, + 36851098767905, + 21888242871839275222246405745257275088548364400416034343698203772274911430295, + 21888242871839275222246405745257275088548364400416034343698204002017106302357, + 175001878437892, + 21888242871839275222246405745257275088548364400416034343698203839567285036330, + 21888242871839275222246405745257275088548364400416034343698203839769106603971, + 21888242871839275222246405745257275088548364400416034343698203771786540894514, + 209795235432428, + 21888242871839275222246405745257275088548364400416034343698203764101323520277, + 21888242871839275222246405745257275088548364400416034343698203791487410037455, + 478008234951173, + 21888242871839275222246405745257275088548364400416034343698203831208548520958, + 170074867357498, + 21888242871839275222246405745257275088548364400416034343698203799114861183230, + 152654099264506, + 150351415105679, + 425869270140189, + 8272387434989, + 293363200740712, + 21888242871839275222246405745257275088548364400416034343698203750430414174285, + 453048103582519, + 21888242871839275222246405745257275088548364400416034343698203964589234054194, + 531521352875721, + 476919248377497, + 21888242871839275222246405745257275088548364400416034343698203733048899911576, + 57093609416024, + 21888242871839275222246405745257275088548364400416034343698204169022497859609, + 21888242871839275222246405745257275088548364400416034343698203916889429256269, + 124897891133305, + 21888242871839275222246405745257275088548364400416034343698203926966783001997, + 21888242871839275222246405745257275088548364400416034343698204004026194122865, + 380873712640984, + 21888242871839275222246405745257275088548364400416034343698203947054936178325, + 21888242871839275222246405745257275088548364400416034343698203788392370767681, + 454298025514481, + 217276312147558, + 264485960131138, + 21888242871839275222246405745257275088548364400416034343698204086742262729530, + 96958109217993, + 110965313677953, + 93132406744262, + 242457229658843, + 21888242871839275222246405745257275088548364400416034343698203884341014515249, + 371650562434329, + 21888242871839275222246405745257275088548364400416034343698203949450927432686, + 250527027633917, + 21888242871839275222246405745257275088548364400416034343698203728097840459917, + 21888242871839275222246405745257275088548364400416034343698203803458100156573, + 21888242871839275222246405745257275088548364400416034343698203897457500036537, + 520218259107465, + 21888242871839275222246405745257275088548364400416034343698204077462225260664, + 371888969656094, + 21888242871839275222246405745257275088548364400416034343698203920062668750129, + 343710016992230, + 281764436950281, + 21888242871839275222246405745257275088548364400416034343698203656461486140811, + 52220314016514, + 405237919289182, + 457984820116454, + 21888242871839275222246405745257275088548364400416034343698203756438536732959, + 21888242871839275222246405745257275088548364400416034343698203645075846462209, + 21888242871839275222246405745257275088548364400416034343698204065193945841289, + 21888242871839275222246405745257275088548364400416034343698203971805084798377, + 21888242871839275222246405745257275088548364400416034343698203648587871455218, + 238336414391377, + 369344822310793, + 21888242871839275222246405745257275088548364400416034343698203945486510145445, + 21888242871839275222246405745257275088548364400416034343698204156114558022865, + 94840511108640, + 551873111236725, + 360286480349921, + 483969769454955, + 21888242871839275222246405745257275088548364400416034343698203798515036154808, + 372216147488608, + 418258443718770, + 21888242871839275222246405745257275088548364400416034343698204145540369093171, + 21888242871839275222246405745257275088548364400416034343698203768737321785156, + 409287931537325, + 21888242871839275222246405745257275088548364400416034343698203941641355702193, + 21888242871839275222246405745257275088548364400416034343698203824925621010353, + 21888242871839275222246405745257275088548364400416034343698203867898231826249, + 21888242871839275222246405745257275088548364400416034343698203653058145476723, + 21888242871839275222246405745257275088548364400416034343698204026089748075926, + 21888242871839275222246405745257275088548364400416034343698203891329517449463, + 21888242871839275222246405745257275088548364400416034343698203625522217808868, + 21888242871839275222246405745257275088548364400416034343698203837927524485846, + 110730697933975, + 21888242871839275222246405745257275088548364400416034343698204060376690090957, + 120667094907842, + 21888242871839275222246405745257275088548364400416034343698204117600648945492, + 21888242871839275222246405745257275088548364400416034343698204077548490672855, + 21888242871839275222246405745257275088548364400416034343698203722183981587760, + 245353360093133, + 426676214963508, + 21888242871839275222246405745257275088548364400416034343698204044827855384865, + 21888242871839275222246405745257275088548364400416034343698203727339950610033, + 517592193755879, + 540291383140631, + 277630313406190, + 21888242871839275222246405745257275088548364400416034343698203690688558830329, + 533827416785368, + 530638852743671, + 483275354218515, + 21888242871839275222246405745257275088548364400416034343698204114842540057341, + 422712540808970, + 21888242871839275222246405745257275088548364400416034343698204042844252817293, + 21888242871839275222246405745257275088548364400416034343698203921036751565133, + 21888242871839275222246405745257275088548364400416034343698203743759814388099, + 399959377805558, + 21888242871839275222246405745257275088548364400416034343698203944442088472732, + 451362475318528, + 21888242871839275222246405745257275088548364400416034343698203838885657587246, + 21888242871839275222246405745257275088548364400416034343698203917242985447485, + 404222985764593, + 21888242871839275222246405745257275088548364400416034343698204028302919527174, + 263159375301991, + 220631494300745, + 111609777367498, + 21888242871839275222246405745257275088548364400416034343698204057432067657051, + 406975490629341, + 21888242871839275222246405745257275088548364400416034343698203792334990133569, + 164884823822531, + 252857472574474, + 21888242871839275222246405745257275088548364400416034343698204107728677544463, + 249333359186331, + 551523546880926, + 21888242871839275222246405745257275088548364400416034343698203941181104523264, + 21888242871839275222246405745257275088548364400416034343698204062546911253314, + 497251917256205, + 21888242871839275222246405745257275088548364400416034343698203780753966924729, + 53232476487377, + 296486045237220, + 21888242871839275222246405745257275088548364400416034343698204066783232476969, + 21888242871839275222246405745257275088548364400416034343698203729413384469463, + 23706122738431, + 455695747266498, + 21888242871839275222246405745257275088548364400416034343698204034850640033297, + 21888242871839275222246405745257275088548364400416034343698204129386585424401, + 21888242871839275222246405745257275088548364400416034343698204133911811443116, + 331374633706863, + 21888242871839275222246405745257275088548364400416034343698203799681878219138, + 120385863781024, + 297708118751055, + 21888242871839275222246405745257275088548364400416034343698203760861026687300, + 439345482783779, + 507033670955521, + 234067183873063, + 357799625749085, + 21888242871839275222246405745257275088548364400416034343698204110404008718485, + 68667602586934, + 109013313843985, + 513913207945700, + 113613530151503, + 458828848706734, + 21888242871839275222246405745257275088548364400416034343698203744283541506354, + 297696772683658, + 166662132500662, + 21888242871839275222246405745257275088548364400416034343698204075978783603484, + 21888242871839275222246405745257275088548364400416034343698204157517259093948, + 530854802538706, + 21888242871839275222246405745257275088548364400416034343698204092100503903759, + 532228173699126, + 320786864726511, + 531509739173116, + 21888242871839275222246405745257275088548364400416034343698204165306988532276, + 373992266044078, + 120095978024861, + 21888242871839275222246405745257275088548364400416034343698203685722056650066, + 21888242871839275222246405745257275088548364400416034343698203672650872378440, + 21888242871839275222246405745257275088548364400416034343698204140697631890523, + 21888242871839275222246405745257275088548364400416034343698204025392348238106, + 21888242871839275222246405745257275088548364400416034343698204016415293151761, + 21888242871839275222246405745257275088548364400416034343698203990990736849707, + 107995003192328, + 21888242871839275222246405745257275088548364400416034343698204008487987071972, + 21888242871839275222246405745257275088548364400416034343698203998418887051208, + 21888242871839275222246405745257275088548364400416034343698203847500956742597, + 21888242871839275222246405745257275088548364400416034343698203947301788843825, + 150875973468779, + 21888242871839275222246405745257275088548364400416034343698203992566809702449, + 129315711669703, + 547899533847833, + 248578419279832, + 21888242871839275222246405745257275088548364400416034343698203912724250541471, + 21888242871839275222246405745257275088548364400416034343698203824913044214508, + 559069407838389, + 21888242871839275222246405745257275088548364400416034343698203718120569141261, + 21888242871839275222246405745257275088548364400416034343698204142811131020882, + 21888242871839275222246405745257275088548364400416034343698204078327178308973, + 21888242871839275222246405745257275088548364400416034343698203955542081996798, + 21888242871839275222246405745257275088548364400416034343698204027820153528172, + 441792826367598, + 164857225818071, + 21888242871839275222246405745257275088548364400416034343698203906746055345129, + 263158197271930, + 506210362029693, + 88010619283617, + 21888242871839275222246405745257275088548364400416034343698203657964788663606, + 21888242871839275222246405745257275088548364400416034343698203963648061028279, + 21888242871839275222246405745257275088548364400416034343698203752882121223923, + 309817858023687, + 21888242871839275222246405745257275088548364400416034343698204040294267110477, + 21888242871839275222246405745257275088548364400416034343698203883134572886596, + 507446307786954, + 21888242871839275222246405745257275088548364400416034343698204024100580227345, + 21147906297237, + 21888242871839275222246405745257275088548364400416034343698204012622675705718, + 21888242871839275222246405745257275088548364400416034343698204086214381917844, + 589478370454, + 436809812312060, + 21888242871839275222246405745257275088548364400416034343698203706083201308382, + 21888242871839275222246405745257275088548364400416034343698204154760842633723, + 135267237446691, + 105295184857437, + 433026669280418, + 21888242871839275222246405745257275088548364400416034343698203902305429779939, + 21888242871839275222246405745257275088548364400416034343698204075882762590884, + 21888242871839275222246405745257275088548364400416034343698203689757028248687, + 182003271992767, + 21403972410087, + 478814382761555, + 558507293947586, + 21888242871839275222246405745257275088548364400416034343698203805417189408514, + 62062036292117, + 21888242871839275222246405745257275088548364400416034343698204126460578321369, + 405036150562173, + 21888242871839275222246405745257275088548364400416034343698203942549341145215, + 21888242871839275222246405745257275088548364400416034343698203650219267938113, + 21888242871839275222246405745257275088548364400416034343698203809067192981164, + 32378249304104, + 21888242871839275222246405745257275088548364400416034343698203722207895499390, + 21888242871839275222246405745257275088548364400416034343698203989514006680712, + 21888242871839275222246405745257275088548364400416034343698203742589276542239, + 21888242871839275222246405745257275088548364400416034343698203801726122328649, + 296186605293449, + 134071158296391, + 21888242871839275222246405745257275088548364400416034343698203859888309791152, + 21888242871839275222246405745257275088548364400416034343698203929970217090810, + 21888242871839275222246405745257275088548364400416034343698204007573371110243, + 21888242871839275222246405745257275088548364400416034343698203749638641647942, + 21888242871839275222246405745257275088548364400416034343698203645753424812731, + 21888242871839275222246405745257275088548364400416034343698203811070684202813, + 21888242871839275222246405745257275088548364400416034343698203999120546947252, + 21888242871839275222246405745257275088548364400416034343698203902468601292481, + 21888242871839275222246405745257275088548364400416034343698203712945727868640, + 198409595937497, + 21888242871839275222246405745257275088548364400416034343698204111537782190113, + 179978622337658, + 316332432498361, + 424622588350146, + 21888242871839275222246405745257275088548364400416034343698204068339228614112, + 21888242871839275222246405745257275088548364400416034343698204155289799792688, + 21888242871839275222246405745257275088548364400416034343698203892983049779705, + 256694518195719, + 21888242871839275222246405745257275088548364400416034343698203632754828156411, + 21888242871839275222246405745257275088548364400416034343698203826855580733485, + 273081429542522, + 21888242871839275222246405745257275088548364400416034343698203895876178897510, + 21888242871839275222246405745257275088548364400416034343698203986969436752288, + 21888242871839275222246405745257275088548364400416034343698204080568491324158, + 21888242871839275222246405745257275088548364400416034343698204172556290571453, + 247498987082521, + 487715025318110, + 557066181478605, + 21888242871839275222246405745257275088548364400416034343698203981696281845780, + 553128128983773, + 300301147130884, + 21888242871839275222246405745257275088548364400416034343698203718584896050310, + 334845557891506, + 21888242871839275222246405745257275088548364400416034343698204034758929854770, + 271326097026715, + 21888242871839275222246405745257275088548364400416034343698203996986859643895, + 21888242871839275222246405745257275088548364400416034343698203825163597853930, + 499375135315369, + 21888242871839275222246405745257275088548364400416034343698204014442772962401, + 549781592012414, + 21888242871839275222246405745257275088548364400416034343698203895891727848249, + 77626455263534, + 507199605989774, + 195462218732304, + 21888242871839275222246405745257275088548364400416034343698203682379736009377, + 235172263234746, + 281881071412236, + 21888242871839275222246405745257275088548364400416034343698203928344824323209, + 147309653420878, + 526312938586182, + 445368552005996, + 21888242871839275222246405745257275088548364400416034343698203979339060234053, + 136052459783811, + 438758732382424, + 306009921330215, + 21888242871839275222246405745257275088548364400416034343698203985262157237650, + 21888242871839275222246405745257275088548364400416034343698204009109499029575, + 106817120442378, + 371011131263559, + 21888242871839275222246405745257275088548364400416034343698203991847770613825, + 21888242871839275222246405745257275088548364400416034343698203627915058040827, + 444784937991399, + 221450234054095, + 21888242871839275222246405745257275088548364400416034343698203999072938371285, + 12472117504474, + 555302867601351, + 21888242871839275222246405745257275088548364400416034343698203767423040226274, + 21888242871839275222246405745257275088548364400416034343698204081377180748043, + 21888242871839275222246405745257275088548364400416034343698203900165928215292, + 561364934826001, + 375970470023776, + 21888242871839275222246405745257275088548364400416034343698203646873548840717, + 21888242871839275222246405745257275088548364400416034343698203905672267032556, + 44838948930421, + 21888242871839275222246405745257275088548364400416034343698203631812385447502, + 299987311160301, + 155701428507877, + 107919447420666, + 289764159055135, + 8650069338110, + 514216344987624, + 21888242871839275222246405745257275088548364400416034343698203673873728768929, + 21681473140674, + 315865540080897, + 21888242871839275222246405745257275088548364400416034343698203840404468744561, + 250499548509027, + 21888242871839275222246405745257275088548364400416034343698203905621285477787, + 21888242871839275222246405745257275088548364400416034343698203959930191633026, + 21888242871839275222246405745257275088548364400416034343698203855054531138165, + 21888242871839275222246405745257275088548364400416034343698204111597748673357, + 91149250975621, + 104333034127376, + 21888242871839275222246405745257275088548364400416034343698203895942376872143, + 21888242871839275222246405745257275088548364400416034343698204032722716323059, + 288004339343831, + 21888242871839275222246405745257275088548364400416034343698203732020183026338, + 410991177849954, + 21888242871839275222246405745257275088548364400416034343698203701595965163700, + 178684939928813, + 421462248324666, + 21888242871839275222246405745257275088548364400416034343698203949098020167181, + 544498084747140, + 224005539447039, + 21888242871839275222246405745257275088548364400416034343698203741257926898448, + 372719481960569, + 490550449768752, + 479904499837478, + 78070502254892, + 437683938589608, + 21888242871839275222246405745257275088548364400416034343698203735526074523541, + 21888242871839275222246405745257275088548364400416034343698204184577001137723, + 270166023402429, + 259385247911426, + 21888242871839275222246405745257275088548364400416034343698203665517955745827, + 32335640916292, + 21888242871839275222246405745257275088548364400416034343698204100365073909536, + 177129297489320, + 21888242871839275222246405745257275088548364400416034343698204150773482222529, + 21888242871839275222246405745257275088548364400416034343698203830797835322867, + 95280905382224, + 74843842394167, + 21888242871839275222246405745257275088548364400416034343698203784093960865240, + 21888242871839275222246405745257275088548364400416034343698203798937027339358, + 498919787061899, + 205208397008789, + 514417290050622, + 348826134414107, + 197061878647670, + 180476632475207, + 537090412206154, + 21888242871839275222246405745257275088548364400416034343698203847553652624039, + 21888242871839275222246405745257275088548364400416034343698203652099653632098, + 21888242871839275222246405745257275088548364400416034343698204110573454314519, + 21888242871839275222246405745257275088548364400416034343698203837071400230084, + 57590596562537, + 21888242871839275222246405745257275088548364400416034343698203679691597229972, + 395874468776019, + 21888242871839275222246405745257275088548364400416034343698204028398826265800, + 21888242871839275222246405745257275088548364400416034343698203877783753191574, + 21888242871839275222246405745257275088548364400416034343698204174189117333011, + 239583035167160, + 21888242871839275222246405745257275088548364400416034343698204123362859883445, + 525760120674007, + 483488894527414, + 549259527200022, + 21888242871839275222246405745257275088548364400416034343698203990997382905775, + 21888242871839275222246405745257275088548364400416034343698203688908856972528, + 21888242871839275222246405745257275088548364400416034343698204069099498088062, + 113207994314149, + 21888242871839275222246405745257275088548364400416034343698204023203337880274, + 222907660982888, + 21888242871839275222246405745257275088548364400416034343698203979047433654811, + 21888242871839275222246405745257275088548364400416034343698204078510947578453, + 111014697938371, + 499561407029506, + 21888242871839275222246405745257275088548364400416034343698203893275210849803, + 21888242871839275222246405745257275088548364400416034343698204037828161139977, + 33025170514388, + 265660986866761, + 21888242871839275222246405745257275088548364400416034343698204008136468742230, + 304673548240636, + 21888242871839275222246405745257275088548364400416034343698204012133954185448, + 21888242871839275222246405745257275088548364400416034343698204170446846768568, + 213344455001346, + 530943402068801, + 21888242871839275222246405745257275088548364400416034343698203866399534951408, + 557730869030697, + 69521089713357, + 417590197826124, + 196129946067837, + 373870540670872, + 390290776425557, + 21888242871839275222246405745257275088548364400416034343698203781303006026732, + 511118136839085, + 21888242871839275222246405745257275088548364400416034343698203785696707167583, + 93991322857724, + 156676331304525, + 362898483028542, + 498327564603883, + 314916187913184, + 511873635253185, + 506945187823282, + 220668885487795, + 453535347920620, + 480588061931686, + 47569876719701, + 389049586926698, + 21888242871839275222246405745257275088548364400416034343698203855566596931225, + 21888242871839275222246405745257275088548364400416034343698203955574020004393, + 21888242871839275222246405745257275088548364400416034343698204006083295051531, + 21888242871839275222246405745257275088548364400416034343698203774971711996506, + 21888242871839275222246405745257275088548364400416034343698203866957600427879, + 270887862811017, + 307811046593457, + 137823938961078, + 21888242871839275222246405745257275088548364400416034343698203978576456211036, + 21888242871839275222246405745257275088548364400416034343698203966896316307427, + 21888242871839275222246405745257275088548364400416034343698204122504861498070, + 495560963215146, + 21888242871839275222246405745257275088548364400416034343698203724691115629176, + 21888242871839275222246405745257275088548364400416034343698203856661828331799, + 21888242871839275222246405745257275088548364400416034343698203976121091628783, + 426932393183581, + 413727683228961, + 140438299747004, + 21888242871839275222246405745257275088548364400416034343698204126246209802871, + 21888242871839275222246405745257275088548364400416034343698203863325831822943, + 21888242871839275222246405745257275088548364400416034343698203889026877134060, + 405864927774981, + 225561610576530, + 552582423972974, + 21888242871839275222246405745257275088548364400416034343698203920807980226618, + 21888242871839275222246405745257275088548364400416034343698204148568411941986, + 286892680563008, + 21888242871839275222246405745257275088548364400416034343698203889535126012308, + 471525842186744, + 21888242871839275222246405745257275088548364400416034343698203733797031904533, + 503352920618656, + 2428878069517, + 21888242871839275222246405745257275088548364400416034343698203676437823290436, + 21888242871839275222246405745257275088548364400416034343698203701489079661289, + 21888242871839275222246405745257275088548364400416034343698203755952220096332, + 21888242871839275222246405745257275088548364400416034343698204071380809180290, + 27608482367014, + 21888242871839275222246405745257275088548364400416034343698203992090669461712, + 21888242871839275222246405745257275088548364400416034343698203904767160719019, + 323743083475704, + 57366866096470, + 383462779290573, + 491738464280261, + 547200763709081, + 436209431380116, + 73030903494927, + 278030674282145, + 126881596368342, + 21888242871839275222246405745257275088548364400416034343698204032518114631330, + 21888242871839275222246405745257275088548364400416034343698204101207510508076, + 191367948765932, + 21888242871839275222246405745257275088548364400416034343698203941228735062613, + 21888242871839275222246405745257275088548364400416034343698204105515742415309, + 53689953709123, + 21888242871839275222246405745257275088548364400416034343698203724688252815833, + 21888242871839275222246405745257275088548364400416034343698204020728399316459, + 21888242871839275222246405745257275088548364400416034343698203969803524985804, + 21888242871839275222246405745257275088548364400416034343698203709356114394943, + 1784183499202, + 124075446296370, + 21888242871839275222246405745257275088548364400416034343698203995662945399351, + 114069341763332, + 21888242871839275222246405745257275088548364400416034343698203953712124325818, + 220695263119721, + 21888242871839275222246405745257275088548364400416034343698204007791087938768, + 21888242871839275222246405745257275088548364400416034343698203747137990276707, + 21888242871839275222246405745257275088548364400416034343698204130018365746589, + 99760937092045, + 416437711651284, + 111298132725633, + 492872058343674, + 8555859547331, + 370864280059350, + 21888242871839275222246405745257275088548364400416034343698203805983497084778, + 21888242871839275222246405745257275088548364400416034343698203923957540457463, + 21888242871839275222246405745257275088548364400416034343698203906548572179468, + 21888242871839275222246405745257275088548364400416034343698203637394900486998, + 506843648842534, + 21888242871839275222246405745257275088548364400416034343698204135772865074962, + 483480051436836, + 21888242871839275222246405745257275088548364400416034343698203732082200141528, + 528543551240196, + 408525855056886, + 21888242871839275222246405745257275088548364400416034343698203711401655824662, + 21888242871839275222246405745257275088548364400416034343698203803944828006595, + 21888242871839275222246405745257275088548364400416034343698203841140948351139, + 215019564738662, + 267757062164907, + 350337646792764, + 309037242490804, + 21888242871839275222246405745257275088548364400416034343698204164793447018422, + 97700592220352, + 120350600706222, + 304707604488432, + 138133225050540, + 453725514184396, + 21888242871839275222246405745257275088548364400416034343698203707380803065584, + 21888242871839275222246405745257275088548364400416034343698204093327766041051, + 21888242871839275222246405745257275088548364400416034343698204034347417407558, + 223300678083144, + 21888242871839275222246405745257275088548364400416034343698204128988448528833, + 21888242871839275222246405745257275088548364400416034343698203978203235183329, + 514632533991655, + 4490907927667, + 21888242871839275222246405745257275088548364400416034343698203695764143137092, + 51762889307109, + 21888242871839275222246405745257275088548364400416034343698204156525724735942, + 21888242871839275222246405745257275088548364400416034343698203652864004367088, + 21888242871839275222246405745257275088548364400416034343698203696122106247179, + 21888242871839275222246405745257275088548364400416034343698203965998355176463, + 21888242871839275222246405745257275088548364400416034343698203738031662371287, + 456349526136695, + 35546343012027, + 21888242871839275222246405745257275088548364400416034343698204013202908460911, + 21888242871839275222246405745257275088548364400416034343698203928600662612264, + 496745137584233, + 558143021218317, + 21888242871839275222246405745257275088548364400416034343698204099932780677841, + 21888242871839275222246405745257275088548364400416034343698203632324146025559, + 461834138583232, + 21888242871839275222246405745257275088548364400416034343698203695249999643069, + 422236241981054, + 220712275489797, + 51247409839403, + 21888242871839275222246405745257275088548364400416034343698203739170416262609, + 21888242871839275222246405745257275088548364400416034343698203918611750892691, + 177927505394170, + 511057561078231, + 21888242871839275222246405745257275088548364400416034343698203886898767796847, + 418761135653442, + 21888242871839275222246405745257275088548364400416034343698203887510537524862, + 21888242871839275222246405745257275088548364400416034343698203638436147467477, + 21888242871839275222246405745257275088548364400416034343698203705716499614287, + 131257928297264, + 333688538344739, + 21888242871839275222246405745257275088548364400416034343698204035687787296621, + 230962144633166, + 78904493201772, + 368299771131702, + 21888242871839275222246405745257275088548364400416034343698203819211311139400, + 21888242871839275222246405745257275088548364400416034343698203763218450279373, + 350443704734621, + 21888242871839275222246405745257275088548364400416034343698204170719718435204, + 365463388272777, + 21888242871839275222246405745257275088548364400416034343698204171571203931422, + 21888242871839275222246405745257275088548364400416034343698203760016488316093, + 21888242871839275222246405745257275088548364400416034343698203653415453262040, + 21888242871839275222246405745257275088548364400416034343698204063180153445062, + 151145505757, + 21888242871839275222246405745257275088548364400416034343698204052825449465931, + 425242189024637, + 36235657380696, + 21888242871839275222246405745257275088548364400416034343698203952359678204221, + 21888242871839275222246405745257275088548364400416034343698203956121720497580, + 21888242871839275222246405745257275088548364400416034343698203839168960611402, + 21888242871839275222246405745257275088548364400416034343698203951379796877008, + 264889068961366, + 21888242871839275222246405745257275088548364400416034343698203915699117819941, + 491337226393009, + 21888242871839275222246405745257275088548364400416034343698203815007221872773, + 293139717596145, + 198589080049401, + 21888242871839275222246405745257275088548364400416034343698203878607482037997, + 21888242871839275222246405745257275088548364400416034343698204000974394950800, + 371882019331022, + 545430893904196, + 21888242871839275222246405745257275088548364400416034343698204128374208406155, + 137498526780283, + 21888242871839275222246405745257275088548364400416034343698204125396044023344, + 551768493090712, + 21888242871839275222246405745257275088548364400416034343698203999457588399811, + 21888242871839275222246405745257275088548364400416034343698204055491693976884, + 436832383143769, + 21888242871839275222246405745257275088548364400416034343698203945911035740350, + 111805404117082, + 21888242871839275222246405745257275088548364400416034343698203958847890191492, + 521385477248114, + 46120397743258, + 21888242871839275222246405745257275088548364400416034343698203712788734156574, + 21888242871839275222246405745257275088548364400416034343698203683834735846596, + 21888242871839275222246405745257275088548364400416034343698204070014791649472, + 333952165741972, + 21888242871839275222246405745257275088548364400416034343698203823288082339985, + 532286306040729, + 527318059394580, + 486575871266620, + 207022687476917, + 258610264335094, + 262856706805789, + 287619349777827, + 21888242871839275222246405745257275088548364400416034343698203832591134908330, + 21888242871839275222246405745257275088548364400416034343698203997327717819675, + 21888242871839275222246405745257275088548364400416034343698203851506540892032, + 290192744097877, + 21888242871839275222246405745257275088548364400416034343698203959601069832017, + 21888242871839275222246405745257275088548364400416034343698203634711405620832, + 206234377883964, + 463894526917194, + 21888242871839275222246405745257275088548364400416034343698204152990991666032, + 21888242871839275222246405745257275088548364400416034343698203920373062330477, + 293725222621060, + 21888242871839275222246405745257275088548364400416034343698204028267823888829, + 270973581811524, + 21888242871839275222246405745257275088548364400416034343698203768127557962259, + 538679011035181, + 216694861977580, + 21888242871839275222246405745257275088548364400416034343698203732487864041034, + 21888242871839275222246405745257275088548364400416034343698203803117283088629, + 21888242871839275222246405745257275088548364400416034343698203912442344229344, + 29387740846805, + 36520274067599, + 252485758787806, + 197640891322329, + 559211367154634, + 400925621517677, + 180832288525393, + 21888242871839275222246405745257275088548364400416034343698203663617046434293, + 147656778118667, + 21888242871839275222246405745257275088548364400416034343698203787386314799729, + 471964006646660, + 327280937276014, + 223553884624752, + 14792324740039, + 21888242871839275222246405745257275088548364400416034343698204087493450717990, + 333999038686617, + 21183230900410, + 21888242871839275222246405745257275088548364400416034343698203800637408260050, + 39379460709224, + 366516073542866, + 220860504614900, + 200502782587414, + 21888242871839275222246405745257275088548364400416034343698203919828682882731, + 21888242871839275222246405745257275088548364400416034343698203824535639190234, + 400537029906132, + 21888242871839275222246405745257275088548364400416034343698203855552997642985, + 21888242871839275222246405745257275088548364400416034343698203693859779702764, + 414190104140212, + 21888242871839275222246405745257275088548364400416034343698203897738951113350, + 21888242871839275222246405745257275088548364400416034343698203703636496773466, + 21888242871839275222246405745257275088548364400416034343698203907058717832515, + 21888242871839275222246405745257275088548364400416034343698203749062062167975, + 21888242871839275222246405745257275088548364400416034343698204044553724531057, + 152919545240136, + 21888242871839275222246405745257275088548364400416034343698204067810558392289, + 21888242871839275222246405745257275088548364400416034343698204118418113344394, + 422750258764736, + 123363610571163, + 21888242871839275222246405745257275088548364400416034343698204000032341451072, + 112919750359407, + 320656075340901, + 21888242871839275222246405745257275088548364400416034343698204132627334362249, + 21888242871839275222246405745257275088548364400416034343698203780891369128228, + 273284844549412, + 21888242871839275222246405745257275088548364400416034343698204055217987465002, + 522865663050570, + 303466103710237, + 524197558824628, + 21888242871839275222246405745257275088548364400416034343698203756501040277020, + 159017621458573, + 21888242871839275222246405745257275088548364400416034343698204009748392042079, + 21888242871839275222246405745257275088548364400416034343698203627534539573513, + 21888242871839275222246405745257275088548364400416034343698203921260864008886, + 400921946848395, + 2001702644098, + 21888242871839275222246405745257275088548364400416034343698203954372054539926, + 309847851560398, + 21888242871839275222246405745257275088548364400416034343698203823236978902333, + 21888242871839275222246405745257275088548364400416034343698203863219698030604, + 21888242871839275222246405745257275088548364400416034343698203869683179945091, + 21888242871839275222246405745257275088548364400416034343698203643413349633140, + 21888242871839275222246405745257275088548364400416034343698203700535345304346, + 412286745529818, + 214441405713480, + 166168176365349, + 337205192754196, + 263975998268989, + 476649491253881, + 232505651753636, + 105807653333737, + 353880634312414, + 21888242871839275222246405745257275088548364400416034343698203738460666812208, + 266545335563082, + 380673599385139, + 435267217957283, + 113577048782201, + 460479614429879, + 8471800675576, + 21888242871839275222246405745257275088548364400416034343698203670889578270670, + 230131004038782, + 21888242871839275222246405745257275088548364400416034343698204186542808390679, + 267158219905175, + 21888242871839275222246405745257275088548364400416034343698204032305265643205, + 21888242871839275222246405745257275088548364400416034343698203856997807143911, + 21888242871839275222246405745257275088548364400416034343698203838763728424495, + 539327217563353, + 541334488494906, + 503403646285589, + 21888242871839275222246405745257275088548364400416034343698203643823452227636, + 451734179291902, + 66047517536617, + 21888242871839275222246405745257275088548364400416034343698204039044433977687, + 329177989997589, + 21888242871839275222246405745257275088548364400416034343698203843512906931295, + 283411297168744, + 555969020083560, + 459826968660976, + 427639760794597, + 37903870746023, + 221097190836740, + 54028252150950, + 21888242871839275222246405745257275088548364400416034343698204054192371806507, + 21888242871839275222246405745257275088548364400416034343698203645000173478539, + 230260143127512, + 183855578464011, + 58217870766025, + 260131217064689, + 234811068195230, + 405525934247595, + 21888242871839275222246405745257275088548364400416034343698203844107203280767, + 483085120351729, + 352691037067493, + 21888242871839275222246405745257275088548364400416034343698203925030615162562, + 539352018935364, + 541815982478056, + 440152921177374, + 562819562546235, + 2644173103142, + 21888242871839275222246405745257275088548364400416034343698203858184982593865, + 320133914516549, + 21888242871839275222246405745257275088548364400416034343698203851844177138832, + 397649833718457, + 108660701610389, + 21888242871839275222246405745257275088548364400416034343698204086977054204153, + 21888242871839275222246405745257275088548364400416034343698204160647504634008, + 126035015071555, + 204819261178144, + 21888242871839275222246405745257275088548364400416034343698203889022834916602, + 21888242871839275222246405745257275088548364400416034343698203769698716786894, + 78423011025104, + 21888242871839275222246405745257275088548364400416034343698204049180406429610, + 21888242871839275222246405745257275088548364400416034343698203931710575942508, + 367515410846015, + 21888242871839275222246405745257275088548364400416034343698204082196667211922, + 21888242871839275222246405745257275088548364400416034343698204051740230208024, + 21888242871839275222246405745257275088548364400416034343698203749928021831240, + 5764157283487, + 21888242871839275222246405745257275088548364400416034343698204175417191402883, + 21888242871839275222246405745257275088548364400416034343698203924689730273994, + 21888242871839275222246405745257275088548364400416034343698203938979076457782, + 27253909860821, + 255356588737211, + 21888242871839275222246405745257275088548364400416034343698203924902864269044, + 21888242871839275222246405745257275088548364400416034343698203968996035144941, + 159397253235733, + 518936138995278, + 21888242871839275222246405745257275088548364400416034343698204048168566042877, + 432738808584056, + 466734708137675, + 21888242871839275222246405745257275088548364400416034343698203726323765463749, + 21888242871839275222246405745257275088548364400416034343698204177184631618442, + 21888242871839275222246405745257275088548364400416034343698203749362959775569, + 21888242871839275222246405745257275088548364400416034343698203737552147157569, + 556854164846179, + 81324985376823, + 21888242871839275222246405745257275088548364400416034343698203848045904766534, + 174292826108682, + 21888242871839275222246405745257275088548364400416034343698203669520631630445, + 21888242871839275222246405745257275088548364400416034343698204003682856156936, + 389464013876066, + 73134054273541, + 21888242871839275222246405745257275088548364400416034343698203948506162700064, + 21888242871839275222246405745257275088548364400416034343698204174127053616612, + 21888242871839275222246405745257275088548364400416034343698203751585361466968, + 181554894706165, + 21888242871839275222246405745257275088548364400416034343698204180936390405409, + 200440071559458, + 97154335651010, + 122855689058803, + 21888242871839275222246405745257275088548364400416034343698204125009348839042, + 314923507719117, + 21888242871839275222246405745257275088548364400416034343698203768442448296181, + 21888242871839275222246405745257275088548364400416034343698203828487832247248, + 21888242871839275222246405745257275088548364400416034343698203749267758673266, + 21888242871839275222246405745257275088548364400416034343698203665388939822481, + 21888242871839275222246405745257275088548364400416034343698204177424905727634, + 21888242871839275222246405745257275088548364400416034343698203915214149871347, + 380943586421166, + 21888242871839275222246405745257275088548364400416034343698203925341640295311, + 21888242871839275222246405745257275088548364400416034343698204082026460744921, + 21888242871839275222246405745257275088548364400416034343698203898859724518081, + 389454800994251, + 124114303938634, + 21888242871839275222246405745257275088548364400416034343698203937545576604055, + 21888242871839275222246405745257275088548364400416034343698203651120636100166, + 21888242871839275222246405745257275088548364400416034343698203717033466463467, + 21888242871839275222246405745257275088548364400416034343698204178425409095097, + 22662533772648, + 21888242871839275222246405745257275088548364400416034343698203653787883062249, + 21888242871839275222246405745257275088548364400416034343698204000956539150797, + 21888242871839275222246405745257275088548364400416034343698204138523080478422, + 21888242871839275222246405745257275088548364400416034343698204007180203613418, + 415498456809619, + 443144591051643, + 21888242871839275222246405745257275088548364400416034343698203939898955460791, + 90418968973996, + 21888242871839275222246405745257275088548364400416034343698204000237036134341, + 143543813116268, + 21888242871839275222246405745257275088548364400416034343698203705741412437350, + 26641204309883, + 21888242871839275222246405745257275088548364400416034343698203660887138102115, + 134638858184057, + 275226883340528, + 21888242871839275222246405745257275088548364400416034343698204121195814638155, + 21888242871839275222246405745257275088548364400416034343698203647495372003317, + 21888242871839275222246405745257275088548364400416034343698203865792102127830, + 21888242871839275222246405745257275088548364400416034343698203898122602655905, + 21888242871839275222246405745257275088548364400416034343698203699470284987218, + 21888242871839275222246405745257275088548364400416034343698203948430792131799, + 232959108893435, + 21888242871839275222246405745257275088548364400416034343698203936877376637885, + 543099601120607, + 21888242871839275222246405745257275088548364400416034343698204151754504914818, + 243805307999423, + 21888242871839275222246405745257275088548364400416034343698203702709920769343, + 21888242871839275222246405745257275088548364400416034343698203780655836736943, + 128485051560791, + 21888242871839275222246405745257275088548364400416034343698203810727591941685, + 21888242871839275222246405745257275088548364400416034343698203895878942994211, + 21888242871839275222246405745257275088548364400416034343698203721827399899053, + 21888242871839275222246405745257275088548364400416034343698204101718835219264, + 103814670439970, + 21888242871839275222246405745257275088548364400416034343698203978778654079138, + 21888242871839275222246405745257275088548364400416034343698203736462124463613, + 396659180298553, + 169123346896703, + 21888242871839275222246405745257275088548364400416034343698203696082076408190, + 21888242871839275222246405745257275088548364400416034343698204139343355287811, + 23298803441533, + 107233543321891, + 250314217009698, + 21888242871839275222246405745257275088548364400416034343698203764430691418930, + 21888242871839275222246405745257275088548364400416034343698203676373536126709, + 31207975244865, + 178218079095747, + 554169304868841, + 21888242871839275222246405745257275088548364400416034343698203802534026606743, + 21888242871839275222246405745257275088548364400416034343698203710609971107961, + 311635228297388, + 291302147918105, + 497489760669468, + 407405953035213, + 58640926209489, + 21888242871839275222246405745257275088548364400416034343698204070502677943700, + 279660549248297, + 47514033204064, + 20047229100552, + 208895316398048, + 21888242871839275222246405745257275088548364400416034343698203677442134878400, + 537491067994274, + 21888242871839275222246405745257275088548364400416034343698204092102306755990, + 8511918309623, + 21888242871839275222246405745257275088548364400416034343698204013092127169630, + 21888242871839275222246405745257275088548364400416034343698203984934479683091, + 452048364559412, + 21888242871839275222246405745257275088548364400416034343698203640593724046687, + 21888242871839275222246405745257275088548364400416034343698204026449487943333, + 211094323473334, + 462673634863074, + 465807864606319, + 419278686162193, + 21888242871839275222246405745257275088548364400416034343698203901051416505872, + 21888242871839275222246405745257275088548364400416034343698204174817952490536, + 21888242871839275222246405745257275088548364400416034343698203897487228666721, + 21888242871839275222246405745257275088548364400416034343698204048723485137067, + 21888242871839275222246405745257275088548364400416034343698203886868980656714, + 21888242871839275222246405745257275088548364400416034343698203739579538440089, + 21888242871839275222246405745257275088548364400416034343698203843890398534539, + 101550704936843, + 21888242871839275222246405745257275088548364400416034343698204032927580994849, + 505239967913119, + 21888242871839275222246405745257275088548364400416034343698203737021848516039, + 21888242871839275222246405745257275088548364400416034343698204008598952574586, + 21888242871839275222246405745257275088548364400416034343698203659141912341471, + 21888242871839275222246405745257275088548364400416034343698203973499313100098, + 200211274124274, + 517980145114932, + 23652820828803, + 21888242871839275222246405745257275088548364400416034343698203715241201839444, + 21888242871839275222246405745257275088548364400416034343698203866045709241343, + 258784063204537, + 21888242871839275222246405745257275088548364400416034343698204107674245480348, + 21888242871839275222246405745257275088548364400416034343698203695148363273846, + 423526412710740, + 75789936481318, + 397252796916142, + 21888242871839275222246405745257275088548364400416034343698203794264189834489, + 21888242871839275222246405745257275088548364400416034343698203713917306296720, + 196386002691340, + 21888242871839275222246405745257275088548364400416034343698203899061377944492, + 551206531018811, + 21888242871839275222246405745257275088548364400416034343698203726176818928504, + 342189245054588, + 392058975750921, + 21888242871839275222246405745257275088548364400416034343698203764013099263284, + 21888242871839275222246405745257275088548364400416034343698203768980271101077, + 89762197070668, + 21888242871839275222246405745257275088548364400416034343698203770482650616549, + 475731865244067, + 354872574109211, + 181231796866214, + 21888242871839275222246405745257275088548364400416034343698203856538074068661, + 21888242871839275222246405745257275088548364400416034343698204134988504646416, + 21888242871839275222246405745257275088548364400416034343698204089162866587938, + 21888242871839275222246405745257275088548364400416034343698203784269134139230, + 21888242871839275222246405745257275088548364400416034343698203965459090032380, + 21888242871839275222246405745257275088548364400416034343698203754314907622185, + 21888242871839275222246405745257275088548364400416034343698204154619479546474, + 526255262248292, + 389046773679007, + 21888242871839275222246405745257275088548364400416034343698204147653284617925, + 168259117979040, + 157318893085057, + 21888242871839275222246405745257275088548364400416034343698204170090471945172, + 479438884371083, + 189584779854568, + 97046243245168, + 75262624125926, + 21888242871839275222246405745257275088548364400416034343698203957014703555150, + 21888242871839275222246405745257275088548364400416034343698203696033630919285, + 21888242871839275222246405745257275088548364400416034343698204174721343995292, + 243889017161984, + 21888242871839275222246405745257275088548364400416034343698204091919846993168, + 272670508731406, + 21888242871839275222246405745257275088548364400416034343698204019361311095304, + 114534716109153, + 476446165725542, + 351402201300429, + 21888242871839275222246405745257275088548364400416034343698203883128300547104, + 21888242871839275222246405745257275088548364400416034343698203795301462967068, + 109960013691355, + 21888242871839275222246405745257275088548364400416034343698203681160839642351, + 21888242871839275222246405745257275088548364400416034343698204132546227637603, + 21888242871839275222246405745257275088548364400416034343698203762598235746433, + 329505731300852, + 503419757969681, + 21888242871839275222246405745257275088548364400416034343698203684197551796357, + 21888242871839275222246405745257275088548364400416034343698203689416130492645, + 21888242871839275222246405745257275088548364400416034343698203879752769512201, + 21888242871839275222246405745257275088548364400416034343698203921997184716910, + 109353140865568, + 82807175645061, + 21888242871839275222246405745257275088548364400416034343698204014256783469511, + 535217615015220, + 21888242871839275222246405745257275088548364400416034343698204087974982256726, + 228589295991292, + 115351499377220, + 458054932862601, + 21888242871839275222246405745257275088548364400416034343698203720774848357965, + 340437866181583, + 357922537793784, + 418786078771048, + 21888242871839275222246405745257275088548364400416034343698203784767203304509, + 21888242871839275222246405745257275088548364400416034343698204129349961526757, + 21888242871839275222246405745257275088548364400416034343698203728237365913201, + 21888242871839275222246405745257275088548364400416034343698204049303450109334, + 21888242871839275222246405745257275088548364400416034343698203890145755743143, + 21888242871839275222246405745257275088548364400416034343698203947750520929950, + 119690655104612, + 21888242871839275222246405745257275088548364400416034343698203911976915137204, + 78164312725512, + 21888242871839275222246405745257275088548364400416034343698203853758394380788, + 21888242871839275222246405745257275088548364400416034343698203657431965274164, + 155427346440565, + 21888242871839275222246405745257275088548364400416034343698204176071002282166, + 21888242871839275222246405745257275088548364400416034343698204035257918628270, + 108780823995429, + 21888242871839275222246405745257275088548364400416034343698204186375158638171, + 97929616320769, + 21888242871839275222246405745257275088548364400416034343698203905805157963731, + 370241256762756, + 21888242871839275222246405745257275088548364400416034343698203863517427848133, + 21888242871839275222246405745257275088548364400416034343698203713827710845296, + 21888242871839275222246405745257275088548364400416034343698203806007324694823, + 21888242871839275222246405745257275088548364400416034343698203650024649156166, + 21888242871839275222246405745257275088548364400416034343698203910649379204584, + 541429318130765, + 21888242871839275222246405745257275088548364400416034343698203646674170150312, + 21888242871839275222246405745257275088548364400416034343698204135670200233864, + 412820652797612, + 21888242871839275222246405745257275088548364400416034343698204181113092941275, + 141115608075763, + 362999791577877, + 21888242871839275222246405745257275088548364400416034343698204033855187152706, + 21888242871839275222246405745257275088548364400416034343698203702419047810355, + 361095797707573, + 21888242871839275222246405745257275088548364400416034343698204059582730330343, + 69873221331282, + 21888242871839275222246405745257275088548364400416034343698204159914689763407, + 21888242871839275222246405745257275088548364400416034343698204030491808644576, + 212538904148407, + 10243634072415, + 21888242871839275222246405745257275088548364400416034343698203705484597685487, + 21888242871839275222246405745257275088548364400416034343698203749263573483871, + 21888242871839275222246405745257275088548364400416034343698203907503209123204, + 21888242871839275222246405745257275088548364400416034343698203882650317239740, + 144550371539339, + 21888242871839275222246405745257275088548364400416034343698204133377660969322, + 21888242871839275222246405745257275088548364400416034343698203718617569454928, + 21888242871839275222246405745257275088548364400416034343698203671815567307295, + 532703851256547, + 21888242871839275222246405745257275088548364400416034343698203852986157440483, + 110891195763749, + 21888242871839275222246405745257275088548364400416034343698204125465828877246, + 21888242871839275222246405745257275088548364400416034343698203825484786217803, + 397565542349199, + 21888242871839275222246405745257275088548364400416034343698203901970752955159, + 414638093744698, + 21888242871839275222246405745257275088548364400416034343698203694298037511281, + 21888242871839275222246405745257275088548364400416034343698203684705388744025, + 21888242871839275222246405745257275088548364400416034343698203824222194445733, + 21888242871839275222246405745257275088548364400416034343698203933873424608153, + 21888242871839275222246405745257275088548364400416034343698203931889924608833, + 19694330277094, + 436683664072817, + 21888242871839275222246405745257275088548364400416034343698203913231368658569, + 513049692460994, + 21888242871839275222246405745257275088548364400416034343698203785881201477508, + 21888242871839275222246405745257275088548364400416034343698203758671650447136, + 446596090712470, + 21888242871839275222246405745257275088548364400416034343698204094357649656709, + 21888242871839275222246405745257275088548364400416034343698203855476629814828, + 305466401991190, + 21888242871839275222246405745257275088548364400416034343698203879932237162944, + 336910337971577, + 21888242871839275222246405745257275088548364400416034343698204034929564970072, + 98948014892889, + 21888242871839275222246405745257275088548364400416034343698204175922965945516, + 21888242871839275222246405745257275088548364400416034343698203899997421831454, + 21888242871839275222246405745257275088548364400416034343698203906388374876214, + 21888242871839275222246405745257275088548364400416034343698204102511251214909, + 21888242871839275222246405745257275088548364400416034343698204063863612739442, + 189171198383148, + 21888242871839275222246405745257275088548364400416034343698203756416465283177, + 139236751815650, + 24939515520381, + 21888242871839275222246405745257275088548364400416034343698203675199888960067, + 258363178480300, + 21888242871839275222246405745257275088548364400416034343698204162651245522781, + 358474449265046, + 417593627850674, + 292862005710247, + 21888242871839275222246405745257275088548364400416034343698204031064337160487, + 21888242871839275222246405745257275088548364400416034343698204132863022234327, + 21888242871839275222246405745257275088548364400416034343698204124234601707006, + 400982245388977, + 11218321243249, + 355980360254994, + 493396574768862, + 21888242871839275222246405745257275088548364400416034343698204156467889062605, + 21888242871839275222246405745257275088548364400416034343698203790017714198699, + 231699586489154, + 21888242871839275222246405745257275088548364400416034343698203945593601590616, + 135039675320026, + 546108193505239, + 21888242871839275222246405745257275088548364400416034343698204107292044221394, + 103458916209102, + 21888242871839275222246405745257275088548364400416034343698203823151275978756, + 516761654121104, + 21888242871839275222246405745257275088548364400416034343698203804233003505987, + 21888242871839275222246405745257275088548364400416034343698203852279048251255, + 21888242871839275222246405745257275088548364400416034343698203987776549520444, + 21888242871839275222246405745257275088548364400416034343698203705634996883051, + 178468878527240, + 21888242871839275222246405745257275088548364400416034343698203965109594187080, + 21888242871839275222246405745257275088548364400416034343698203818786227297711, + 21888242871839275222246405745257275088548364400416034343698204035168283908765, + 21888242871839275222246405745257275088548364400416034343698204058244303232866, + 21888242871839275222246405745257275088548364400416034343698203861147720069467, + 21888242871839275222246405745257275088548364400416034343698204161236908237572, + 420807281720426, + 21888242871839275222246405745257275088548364400416034343698204092980273195424, + 489732631664787, + 372251152655157, + 58145508644804, + 21888242871839275222246405745257275088548364400416034343698204005220368416088, + 21888242871839275222246405745257275088548364400416034343698203891957328400000, + 21888242871839275222246405745257275088548364400416034343698203873861080856130, + 21888242871839275222246405745257275088548364400416034343698204171362711675942, + 98652055317390, + 21888242871839275222246405745257275088548364400416034343698203866810736266651, + 21888242871839275222246405745257275088548364400416034343698203666709293939789, + 217202447522695, + 73459903428582, + 396586850814829, + 21888242871839275222246405745257275088548364400416034343698203691612398677421, + 21888242871839275222246405745257275088548364400416034343698203755627930290689, + 21888242871839275222246405745257275088548364400416034343698204126341451495324, + 21888242871839275222246405745257275088548364400416034343698204098378584920784, + 21888242871839275222246405745257275088548364400416034343698203843397798221712, + 21888242871839275222246405745257275088548364400416034343698203900333227053549, + 259947041417896, + 388141740499100, + 162781068016546, + 21888242871839275222246405745257275088548364400416034343698203711056305036178, + 21888242871839275222246405745257275088548364400416034343698204143842931296267, + 432002853095208, + 382331740876906, + 315381745544900, + 462946576053479, + 117662829635243, + 21888242871839275222246405745257275088548364400416034343698203665673496878337, + 21888242871839275222246405745257275088548364400416034343698203713663594561200, + 370720535814236, + 313488717676243, + 239321973253870, + 273109365114704, + 21888242871839275222246405745257275088548364400416034343698203708030529355146, + 83018650534338, + 21888242871839275222246405745257275088548364400416034343698204127721007370629, + 21888242871839275222246405745257275088548364400416034343698203866194616309976, + 73595911352485, + 21888242871839275222246405745257275088548364400416034343698203919701637401968, + 21888242871839275222246405745257275088548364400416034343698203654653781559697, + 21888242871839275222246405745257275088548364400416034343698204061929308254310, + 151598344908447, + 540013415539665, + 190961737635578, + 21888242871839275222246405745257275088548364400416034343698203652258332384217, + 448489521056296, + 21888242871839275222246405745257275088548364400416034343698203901151186872159, + 548980014475120, + 21888242871839275222246405745257275088548364400416034343698204098334350042007, + 82296896908600, + 21888242871839275222246405745257275088548364400416034343698203807281731067983, + 21888242871839275222246405745257275088548364400416034343698203705213831284038, + 382514717133246, + 149545085704593, + 320189496082623, + 69762518600209, + 554927626830097, + 21888242871839275222246405745257275088548364400416034343698204110261933182058, + 276056523276626, + 21888242871839275222246405745257275088548364400416034343698204069396837336859, + 81424026534870, + 51437790792881, + 21888242871839275222246405745257275088548364400416034343698203879483833409100, + 21888242871839275222246405745257275088548364400416034343698204179899081667571, + 34414563603530, + 21888242871839275222246405745257275088548364400416034343698203638047745206758, + 21888242871839275222246405745257275088548364400416034343698204048436653549162, + 421849218646380, + 441489546665021, + 21888242871839275222246405745257275088548364400416034343698204183771586531753, + 203553299096512, + 346565843783748, + 335633060088, + 449821977122121, + 21888242871839275222246405745257275088548364400416034343698204013351968497985, + 21888242871839275222246405745257275088548364400416034343698203649614323164420, + 21888242871839275222246405745257275088548364400416034343698203988137890987192, + 79437715792658, + 371046969738733, + 95569071745278, + 255813889783231, + 132644012183211, + 108648486873844, + 907564254806, + 21888242871839275222246405745257275088548364400416034343698203728594954346345, + 45862189682705, + 21888242871839275222246405745257275088548364400416034343698204059554051228115, + 31363299589895, + 351946840174205, + 348456639788925, + 422387958664454, + 14497356236324, + 165778149491408, + 505383605064455, + 21888242871839275222246405745257275088548364400416034343698203859007906571724, + 104504947303873, + 84596164062777, + 244240463914347, + 21888242871839275222246405745257275088548364400416034343698204063511678016360, + 267386790831614, + 21888242871839275222246405745257275088548364400416034343698203789484510717692, + 21888242871839275222246405745257275088548364400416034343698204026806731568391, + 76287306435286, + 167410256553159, + 21888242871839275222246405745257275088548364400416034343698204175732196699136, + 436106029165926, + 209427844991182, + 21888242871839275222246405745257275088548364400416034343698203681569680419659, + 242985737959155, + 21888242871839275222246405745257275088548364400416034343698203629438047271697, + 21760219223175, + 21888242871839275222246405745257275088548364400416034343698203907925301270920, + 21888242871839275222246405745257275088548364400416034343698203643043767281221, + 224347210593830, + 30657569132770, + 272415682459844, + 21888242871839275222246405745257275088548364400416034343698203946179262632152, + 253163978366278, + 547402340887370, + 460560599450483, + 21888242871839275222246405745257275088548364400416034343698203845639975775387, + 395367472294437, + 21888242871839275222246405745257275088548364400416034343698203821357237856488, + 21888242871839275222246405745257275088548364400416034343698203882430724241259, + 559543918805199, + 21888242871839275222246405745257275088548364400416034343698203799579091806944, + 552366785702893, + 21888242871839275222246405745257275088548364400416034343698204163654367313980, + 21888242871839275222246405745257275088548364400416034343698203736135457120385, + 21888242871839275222246405745257275088548364400416034343698204080768362461139, + 136867745987218, + 21888242871839275222246405745257275088548364400416034343698204158259846941848, + 480786936423257, + 21888242871839275222246405745257275088548364400416034343698203676184140870739, + 21888242871839275222246405745257275088548364400416034343698204064556672150217, + 135590417030489, + 302004172643850, + 21888242871839275222246405745257275088548364400416034343698203888556870768168, + 21888242871839275222246405745257275088548364400416034343698204071279410208537, + 21888242871839275222246405745257275088548364400416034343698203649754435180649, + 21888242871839275222246405745257275088548364400416034343698203647385909686614, + 4545450363957, + 21888242871839275222246405745257275088548364400416034343698203733015412479161, + 551345977959705, + 159099812186414, + 21888242871839275222246405745257275088548364400416034343698203637537915193694, + 21888242871839275222246405745257275088548364400416034343698204142459111209600, + 265399592187151, + 102516464379681, + 21888242871839275222246405745257275088548364400416034343698203661566687576485, + 424490484092373, + 11411614298805, + 452850450229757, + 325156399698085, + 467212355490239, + 107919047984487, + 21888242871839275222246405745257275088548364400416034343698203669494681567170, + 21888242871839275222246405745257275088548364400416034343698203796232722708980, + 560994125739095, + 539935388020881, + 21888242871839275222246405745257275088548364400416034343698203814680037182820, + 95859850718683, + 21888242871839275222246405745257275088548364400416034343698203654335920815424, + 21888242871839275222246405745257275088548364400416034343698204101204520074925, + 21888242871839275222246405745257275088548364400416034343698203912884244922157, + 21888242871839275222246405745257275088548364400416034343698203841198271694944, + 12922886827188, + 428548834267465, + 21888242871839275222246405745257275088548364400416034343698203838919029270954, + 21888242871839275222246405745257275088548364400416034343698203757168755646508, + 93536344751383, + 313910101746954, + 21888242871839275222246405745257275088548364400416034343698204180752755055931, + 299744527770317, + 469322472795433, + 21888242871839275222246405745257275088548364400416034343698203653963752993398, + 448661698855424, + 237819765962679, + 21888242871839275222246405745257275088548364400416034343698203960527124349877, + 21888242871839275222246405745257275088548364400416034343698203945832775585047, + 496233232770012, + 21888242871839275222246405745257275088548364400416034343698203752493444896212, + 230109932900168, + 21888242871839275222246405745257275088548364400416034343698203900940436419101, + 13154642143127, + 21888242871839275222246405745257275088548364400416034343698204028410462803948, + 405200627677137, + 21888242871839275222246405745257275088548364400416034343698203896097563254846, + 434252280817037, + 21888242871839275222246405745257275088548364400416034343698203745139689543590, + 244376031651752, + 187118198404951, + 21888242871839275222246405745257275088548364400416034343698203840432060631338, + 489079124405551, + 21888242871839275222246405745257275088548364400416034343698203842683374398304, + 76230659960837, + 21888242871839275222246405745257275088548364400416034343698204154079103580826, + 483461300307686, + 296276313303106, + 559802504398585, + 396615701738060, + 21888242871839275222246405745257275088548364400416034343698204042303641781271, + 219590503176634, + 467356629402459, + 344563952997410, + 21888242871839275222246405745257275088548364400416034343698203824489779353231, + 21888242871839275222246405745257275088548364400416034343698204085385850629646, + 70881105457359, + 21888242871839275222246405745257275088548364400416034343698204103676479166333, + 323809881413765, + 508101971415517, + 542729458316161, + 278539057653036, + 21888242871839275222246405745257275088548364400416034343698203708125040669906, + 434251911485872, + 21888242871839275222246405745257275088548364400416034343698203765076227147913, + 21888242871839275222246405745257275088548364400416034343698204009928242331905, + 21888242871839275222246405745257275088548364400416034343698203885519659777523, + 177762528980357, + 547176284765942, + 21888242871839275222246405745257275088548364400416034343698203955131479854165, + 21888242871839275222246405745257275088548364400416034343698203867034777781397, + 514537233969889, + 118880959663838, + 97482634389363, + 21888242871839275222246405745257275088548364400416034343698204175229703586164, + 303172413938518, + 21888242871839275222246405745257275088548364400416034343698204077853286624791, + 21888242871839275222246405745257275088548364400416034343698204024751546422169, + 34431696958575, + 413502569622028, + 228120426982600, + 160287080314065, + 206823066243305, + 21888242871839275222246405745257275088548364400416034343698203914052873297882, + 21888242871839275222246405745257275088548364400416034343698203770599423789766, + 127542233674727, + 21888242871839275222246405745257275088548364400416034343698204176350427640655, + 21888242871839275222246405745257275088548364400416034343698203854708521552026, + 21888242871839275222246405745257275088548364400416034343698203883225594899631, + 294589512292892, + 526678007363710, + 7480321204258, + 487346219095213, + 525293476856472, + 21888242871839275222246405745257275088548364400416034343698204066000302975995, + 21888242871839275222246405745257275088548364400416034343698204004203103852809, + 21888242871839275222246405745257275088548364400416034343698203983140402679727, + 21888242871839275222246405745257275088548364400416034343698204005534568175286, + 21888242871839275222246405745257275088548364400416034343698203858849328927017, + 442088326149293, + 29960603549030, + 120402505416718, + 175747303884673, + 164008074725131, + 21888242871839275222246405745257275088548364400416034343698204116502412638871, + 47580669090334, + 21888242871839275222246405745257275088548364400416034343698203728378306843664, + 377182442701045, + 21888242871839275222246405745257275088548364400416034343698204137782861329820, + 21888242871839275222246405745257275088548364400416034343698203911455541629197, + 21888242871839275222246405745257275088548364400416034343698203761277619519263, + 21888242871839275222246405745257275088548364400416034343698204149381676687928, + 21888242871839275222246405745257275088548364400416034343698203698376080488287, + 301846152785548, + 21888242871839275222246405745257275088548364400416034343698203784699716797891, + 187829142827737, + 61642290761596, + 21888242871839275222246405745257275088548364400416034343698203961465697988334, + 229527632554221, + 323411198839425, + 491857031375450, + 21888242871839275222246405745257275088548364400416034343698203715688258438396, + 441151877241124, + 108516439669649, + 517008628322754, + 21888242871839275222246405745257275088548364400416034343698204062787624852800, + 21888242871839275222246405745257275088548364400416034343698203746415135653422, + 21888242871839275222246405745257275088548364400416034343698203977803422410895, + 456243437983519, + 21888242871839275222246405745257275088548364400416034343698203629969734031370, + 150923076377628, + 407003537399068, + 21888242871839275222246405745257275088548364400416034343698203981676704352687, + 21888242871839275222246405745257275088548364400416034343698203708475123202481, + 21888242871839275222246405745257275088548364400416034343698203726945880846426, + 494418063054105, + 21888242871839275222246405745257275088548364400416034343698204044264273160722, + 21888242871839275222246405745257275088548364400416034343698203856409617945314, + 294400114482122, + 51683083403332, + 21888242871839275222246405745257275088548364400416034343698204024778656420834, + 363002395785184, + 289373560408288, + 49512187410038, + 21888242871839275222246405745257275088548364400416034343698204035504940718548, + 161240714915131, + 21888242871839275222246405745257275088548364400416034343698203829180099118270, + 21888242871839275222246405745257275088548364400416034343698203674308017058438, + 21888242871839275222246405745257275088548364400416034343698203763913258791528, + 21888242871839275222246405745257275088548364400416034343698203950809394738538, + 21888242871839275222246405745257275088548364400416034343698203767087587463421, + 446495252085485, + 68903049492800, + 21888242871839275222246405745257275088548364400416034343698203694834522178686, + 538032658009133, + 281299739067367, + 504773153562693, + 235770301863596, + 313000009662215, + 21888242871839275222246405745257275088548364400416034343698203883577814930484, + 526283450855366, + 21888242871839275222246405745257275088548364400416034343698203697440442389026, + 21888242871839275222246405745257275088548364400416034343698203697941409210338, + 21888242871839275222246405745257275088548364400416034343698203747228477657469, + 21888242871839275222246405745257275088548364400416034343698203661109168251939, + 21888242871839275222246405745257275088548364400416034343698203711731384837175, + 21888242871839275222246405745257275088548364400416034343698203905972412625738, + 142893955449948, + 248756244644587, + 464861294596934, + 21888242871839275222246405745257275088548364400416034343698203905574183104394, + 192902540236778, + 21888242871839275222246405745257275088548364400416034343698203971416230817203, + 21888242871839275222246405745257275088548364400416034343698203707487941956944, + 21888242871839275222246405745257275088548364400416034343698203774279545703569, + 21888242871839275222246405745257275088548364400416034343698203933316300921695, + 106304432914037, + 39234526477257, + 331393221207108, + 136771992856705, + 300484125418779, + 199738749805473, + 21888242871839275222246405745257275088548364400416034343698204137715966345173, + 230276092447939, + 21888242871839275222246405745257275088548364400416034343698203800675724318334, + 21888242871839275222246405745257275088548364400416034343698204138574701093543, + 308995553372558, + 21888242871839275222246405745257275088548364400416034343698203659444905080976, + 21888242871839275222246405745257275088548364400416034343698203863561325808332, + 335831897565375, + 21888242871839275222246405745257275088548364400416034343698204079031456170221, + 390327533425376, + 21888242871839275222246405745257275088548364400416034343698204086515624296307, + 21888242871839275222246405745257275088548364400416034343698203748495482476657, + 390753590064404, + 120539900410210, + 21888242871839275222246405745257275088548364400416034343698203724283462360931, + 515487558983651, + 21888242871839275222246405745257275088548364400416034343698203915008017462463, + 83108430702052, + 21888242871839275222246405745257275088548364400416034343698204125591020581682, + 43967977664630, + 21888242871839275222246405745257275088548364400416034343698204145441380801626, + 21888242871839275222246405745257275088548364400416034343698203899563676768449, + 21888242871839275222246405745257275088548364400416034343698203979555557272633, + 21888242871839275222246405745257275088548364400416034343698204092126466591472, + 364584790017679, + 21888242871839275222246405745257275088548364400416034343698203744228825016622, + 61057161815283, + 21888242871839275222246405745257275088548364400416034343698204162567511783173, + 21888242871839275222246405745257275088548364400416034343698203921131969623303, + 504913879058186, + 322545551793660, + 127210478525444, + 29134314404145, + 346624920904322, + 21888242871839275222246405745257275088548364400416034343698203860680282622871, + 21888242871839275222246405745257275088548364400416034343698203837602748855582, + 21888242871839275222246405745257275088548364400416034343698203950450842102430, + 21888242871839275222246405745257275088548364400416034343698203704327575904465, + 21888242871839275222246405745257275088548364400416034343698203670966712363241, + 21888242871839275222246405745257275088548364400416034343698203714435716244447, + 21888242871839275222246405745257275088548364400416034343698204034990022459260, + 388048930480848, + 473315682403877, + 21888242871839275222246405745257275088548364400416034343698203849048908300282, + 337261757368808, + 21888242871839275222246405745257275088548364400416034343698203745971426865518, + 17994649751985, + 21888242871839275222246405745257275088548364400416034343698204023390204826746, + 21888242871839275222246405745257275088548364400416034343698204162744712917719, + 63695033988199, + 354609024794916, + 21888242871839275222246405745257275088548364400416034343698203657536807815849, + 250116822461975, + 358661347509669, + 390427109208438, + 440119752960340, + 523028677734807, + 556995663693632, + 21888242871839275222246405745257275088548364400416034343698203741715257683083, + 284320023345583, + 21888242871839275222246405745257275088548364400416034343698204070131334603870, + 230636783101788, + 297839003059268, + 194758827670863, + 304120671749057, + 21888242871839275222246405745257275088548364400416034343698204080020432102737, + 420068360506149, + 21888242871839275222246405745257275088548364400416034343698204046275843920285, + 408277388719513, + 21888242871839275222246405745257275088548364400416034343698203913602406761414, + 246375828180815, + 110316528034792, + 216046825398230, + 21888242871839275222246405745257275088548364400416034343698204007237100907568, + 21888242871839275222246405745257275088548364400416034343698203878555883814932, + 241191131808128, + 398205669543377, + 21888242871839275222246405745257275088548364400416034343698203950345851587043, + 21888242871839275222246405745257275088548364400416034343698204002070722982651, + 21888242871839275222246405745257275088548364400416034343698204033236010705225, + 391671012224852, + 424820618086774, + 21888242871839275222246405745257275088548364400416034343698204011819293753791, + 21888242871839275222246405745257275088548364400416034343698203746230953270560, + 399207047519106, + 21888242871839275222246405745257275088548364400416034343698204167668265639616, + 151153988800249, + 287314872296287, + 169856324535193, + 21888242871839275222246405745257275088548364400416034343698203997689170100959, + 111015501127334, + 31818288014302, + 39800102776250, + 21888242871839275222246405745257275088548364400416034343698204033584739081138, + 21888242871839275222246405745257275088548364400416034343698204102344422796970, + 8652941097248, + 21888242871839275222246405745257275088548364400416034343698203994343592545471, + 21888242871839275222246405745257275088548364400416034343698203888598669581656, + 21888242871839275222246405745257275088548364400416034343698204030626215797012, + 10460269178241, + 21888242871839275222246405745257275088548364400416034343698203706535787251129, + 21888242871839275222246405745257275088548364400416034343698203697660260624475, + 338798979646780, + 330194899773357, + 21888242871839275222246405745257275088548364400416034343698203762633070569438, + 256035562210469, + 21888242871839275222246405745257275088548364400416034343698203670704425476475, + 416123978932833, + 497480659873040, + 21888242871839275222246405745257275088548364400416034343698203964922633490937, + 21888242871839275222246405745257275088548364400416034343698203890591007268165, + 364267834290954, + 21888242871839275222246405745257275088548364400416034343698203827688434372700, + 21888242871839275222246405745257275088548364400416034343698204131261824732162, + 7138437901215, + 21888242871839275222246405745257275088548364400416034343698203924277542558261, + 524162395896104, + 21888242871839275222246405745257275088548364400416034343698204017837999125273, + 21888242871839275222246405745257275088548364400416034343698204010039406272319, + 21888242871839275222246405745257275088548364400416034343698204033034802823798, + 321977398421423, + 21888242871839275222246405745257275088548364400416034343698203707210877821802, + 53585026809638, + 477551616176295, + 351284197503217, + 21888242871839275222246405745257275088548364400416034343698203989889686497177, + 451206972575891, + 21888242871839275222246405745257275088548364400416034343698203731212820771558, + 21888242871839275222246405745257275088548364400416034343698204152729129965563, + 21888242871839275222246405745257275088548364400416034343698203632664700470663, + 21888242871839275222246405745257275088548364400416034343698204030405274846243, + 478716661069145, + 233323678625920, + 21888242871839275222246405745257275088548364400416034343698203932345327455532, + 97503874673855, + 136445406778387, + 109855844876132, + 287960975549329, + 21888242871839275222246405745257275088548364400416034343698203880559121962874, + 21888242871839275222246405745257275088548364400416034343698204170829467243230, + 335554929383077, + 256851054321239, + 21888242871839275222246405745257275088548364400416034343698203860665569693111, + 21888242871839275222246405745257275088548364400416034343698203647313294010291, + 220983404078084, + 413466461661971, + 21888242871839275222246405745257275088548364400416034343698204047884688641473, + 21888242871839275222246405745257275088548364400416034343698203708042937009136, + 124882803763891, + 32735865243072, + 21888242871839275222246405745257275088548364400416034343698203822414622156287, + 150776605808255, + 21888242871839275222246405745257275088548364400416034343698203635789808569885, + 242854595067340, + 93454542012263, + 21888242871839275222246405745257275088548364400416034343698203799379308506700, + 21888242871839275222246405745257275088548364400416034343698203802446912782190, + 21888242871839275222246405745257275088548364400416034343698204017792717333876, + 21888242871839275222246405745257275088548364400416034343698204115676987620455, + 241753670513594, + 431586226926874, + 60935170698839, + 21888242871839275222246405745257275088548364400416034343698204131361784529954, + 154747682909680, + 21888242871839275222246405745257275088548364400416034343698203868375738530548, + 446904245385169, + 52583066144162, + 21888242871839275222246405745257275088548364400416034343698204062648913966054, + 21888242871839275222246405745257275088548364400416034343698203851213591482197, + 21888242871839275222246405745257275088548364400416034343698203682746282894989, + 208373547102677, + 451618873680056, + 294135557078099, + 76810795835179, + 450078243218143, + 21888242871839275222246405745257275088548364400416034343698203757653248799511, + 21888242871839275222246405745257275088548364400416034343698203792234261053397, + 373951495224526, + 233816476802274, + 225132932088686, + 21888242871839275222246405745257275088548364400416034343698204169421618716257, + 21888242871839275222246405745257275088548364400416034343698204008023471545890, + 186880912738491, + 21888242871839275222246405745257275088548364400416034343698203749244829987252, + 21888242871839275222246405745257275088548364400416034343698203995192675135682, + 178386608167858, + 222128984088126, + 21888242871839275222246405745257275088548364400416034343698203848784959140791, + 21888242871839275222246405745257275088548364400416034343698204050007513557458, + 460791341168360, + 232317314463016, + 21888242871839275222246405745257275088548364400416034343698203819854631833114, + 21888242871839275222246405745257275088548364400416034343698203855875514981689, + 11441972667789, + 21888242871839275222246405745257275088548364400416034343698203731891406485575, + 51312817552759, + 21888242871839275222246405745257275088548364400416034343698203834407259428619, + 21888242871839275222246405745257275088548364400416034343698203857292162202884, + 192669794109149, + 128927759033277, + 21888242871839275222246405745257275088548364400416034343698203644395695332782, + 21888242871839275222246405745257275088548364400416034343698204051568210765389, + 21888242871839275222246405745257275088548364400416034343698203704842962287096, + 126956978251700, + 21888242871839275222246405745257275088548364400416034343698203854618009230811, + 21888242871839275222246405745257275088548364400416034343698204118063195967139, + 164327384817521, + 461516715422244, + 384915723841524, + 21888242871839275222246405745257275088548364400416034343698203741822076610187, + 300808343939201, + 21888242871839275222246405745257275088548364400416034343698204063768496255654, + 68749579153410, + 21888242871839275222246405745257275088548364400416034343698203646998425379689, + 21888242871839275222246405745257275088548364400416034343698204037761263417479, + 21888242871839275222246405745257275088548364400416034343698204036325205528753, + 162728047999169, + 209809462514448, + 21888242871839275222246405745257275088548364400416034343698203895049129543680, + 483617477910916, + 22996756474595, + 193567960180010, + 21888242871839275222246405745257275088548364400416034343698204165592794657895, + 21888242871839275222246405745257275088548364400416034343698203736438316352835, + 316252311305387, + 197802173124794, + 21888242871839275222246405745257275088548364400416034343698203732724503670403, + 525136215586698, + 21888242871839275222246405745257275088548364400416034343698203898714020725957, + 21888242871839275222246405745257275088548364400416034343698204066118064399870, + 513490540032304, + 21888242871839275222246405745257275088548364400416034343698203810690248421780, + 250277253378375, + 21888242871839275222246405745257275088548364400416034343698203805333221419152, + 338291598943401, + 376049198980618, + 21888242871839275222246405745257275088548364400416034343698203624728978209253, + 21888242871839275222246405745257275088548364400416034343698203857255409990456, + 102574655132418, + 21888242871839275222246405745257275088548364400416034343698203977554823252696, + 21888242871839275222246405745257275088548364400416034343698204083200166328500, + 21888242871839275222246405745257275088548364400416034343698204178026782251667, + 178168227931417, + 21888242871839275222246405745257275088548364400416034343698203762669904946462, + 55854899950668, + 245050231018093, + 21888242871839275222246405745257275088548364400416034343698204053702522001675, + 21888242871839275222246405745257275088548364400416034343698204137621311778664, + 21888242871839275222246405745257275088548364400416034343698203711063958833369, + 21888242871839275222246405745257275088548364400416034343698203718933598953050, + 235873029926651, + 21888242871839275222246405745257275088548364400416034343698203871434296234517, + 21888242871839275222246405745257275088548364400416034343698204033125592396826, + 21888242871839275222246405745257275088548364400416034343698203885927018580829, + 21888242871839275222246405745257275088548364400416034343698204006452620531081, + 223515211667797, + 21888242871839275222246405745257275088548364400416034343698203948477144048739, + 21888242871839275222246405745257275088548364400416034343698203684608946693462, + 289659270013385, + 231827028430328, + 21888242871839275222246405745257275088548364400416034343698204097911506757141, + 327555912390751, + 4244378348092, + 21888242871839275222246405745257275088548364400416034343698203695686619098885, + 338993395476259, + 113522669743983, + 21888242871839275222246405745257275088548364400416034343698204033722897723238, + 43589585533573, + 400509888416645, + 21888242871839275222246405745257275088548364400416034343698203805876375502519, + 236077065503778, + 262548544811189, + 21888242871839275222246405745257275088548364400416034343698203816539081410371, + 21888242871839275222246405745257275088548364400416034343698204044686959154259, + 333001434485478, + 359531456979071, + 21888242871839275222246405745257275088548364400416034343698203821392385208411, + 21888242871839275222246405745257275088548364400416034343698203862114328201711, + 387504006267526, + 21888242871839275222246405745257275088548364400416034343698204004580754667371, + 21888242871839275222246405745257275088548364400416034343698203964923441429878, + 280434829874543, + 21888242871839275222246405745257275088548364400416034343698204077375254454893, + 543280113548521, + 269126957904988, + 531261885947148, + 213029104158387, + 21888242871839275222246405745257275088548364400416034343698203725053695346098, + 252850128800922, + 21888242871839275222246405745257275088548364400416034343698204096951954807459, + 21888242871839275222246405745257275088548364400416034343698203705350156805765, + 21888242871839275222246405745257275088548364400416034343698204049899195044665, + 492610938781440, + 444132935976059, + 559259995902629, + 509132696128283, + 21888242871839275222246405745257275088548364400416034343698203718438194198913, + 21888242871839275222246405745257275088548364400416034343698203876045696530566, + 299891562770844, + 61796420573669, + 70271600379988, + 394782146709465, + 21888242871839275222246405745257275088548364400416034343698203898869894956769, + 72488009683240, + 21888242871839275222246405745257275088548364400416034343698203728181834088081, + 21888242871839275222246405745257275088548364400416034343698204159648158836084, + 189798457621003, + 298629226878350, + 157396720806873, + 178694451385137, + 21888242871839275222246405745257275088548364400416034343698203713408545112317, + 21888242871839275222246405745257275088548364400416034343698204086813647748640, + 21888242871839275222246405745257275088548364400416034343698204172991091992671, + 21888242871839275222246405745257275088548364400416034343698204034874154889029, + 21888242871839275222246405745257275088548364400416034343698204064003478052972, + 207702194792011, + 199713278340330, + 21888242871839275222246405745257275088548364400416034343698203946770953856082, + 132939327160488, + 21888242871839275222246405745257275088548364400416034343698204062566479026533, + 534926497212264, + 1271187756160, + 21888242871839275222246405745257275088548364400416034343698203932297176931001, + 21888242871839275222246405745257275088548364400416034343698203681438011814240, + 21888242871839275222246405745257275088548364400416034343698203630496648677927, + 383776966519710, + 98508738288442, + 21888242871839275222246405745257275088548364400416034343698204002396675519773, + 279933756816559, + 21888242871839275222246405745257275088548364400416034343698203690831411131424, + 469056222368906, + 365793062980329, + 21888242871839275222246405745257275088548364400416034343698203629631174716196, + 21888242871839275222246405745257275088548364400416034343698203867884035538786, + 29036726261215, + 483517662724988, + 21888242871839275222246405745257275088548364400416034343698203649408680660360, + 153592283609814, + 21888242871839275222246405745257275088548364400416034343698203635196654659437, + 97270459993744, + 21888242871839275222246405745257275088548364400416034343698203750295920205444, + 133394848443544, + 513401879316597, + 82948223599442, + 521678514832771, + 77695553722560, + 21888242871839275222246405745257275088548364400416034343698204120553128944406, + 157320579407644, + 21888242871839275222246405745257275088548364400416034343698204094782789129100, + 21888242871839275222246405745257275088548364400416034343698203714103265491880, + 505653406593399, + 21888242871839275222246405745257275088548364400416034343698203964462925306377, + 21888242871839275222246405745257275088548364400416034343698203952805453762076, + 21888242871839275222246405745257275088548364400416034343698204162037325755612, + 21888242871839275222246405745257275088548364400416034343698203660564424063957, + 44968756930406, + 21888242871839275222246405745257275088548364400416034343698203873689003344486, + 362163043719633, + 16811004560482, + 493621527626537, + 32190478033545, + 308272537864308, + 562446786734802, + 508641555818855, + 21888242871839275222246405745257275088548364400416034343698203880885715871821, + 21888242871839275222246405745257275088548364400416034343698203659517182309557, + 5428584033801, + 24888218876636, + 331348209718964, + 155663540994233, + 421609045893120, + 238680066681069, + 21888242871839275222246405745257275088548364400416034343698203726835323005951, + 21888242871839275222246405745257275088548364400416034343698204084969930866532, + 139320806350967, + 21888242871839275222246405745257275088548364400416034343698203718299559074082, + 303282590026896, + 376468786382844, + 495571631208343, + 281985253550763, + 21888242871839275222246405745257275088548364400416034343698203688087114028931, + 118410804123522, + 21888242871839275222246405745257275088548364400416034343698203867135562184033, + 272913843741469, + 30413388429180, + 21888242871839275222246405745257275088548364400416034343698204076872484859261, + 507599570449086, + 21888242871839275222246405745257275088548364400416034343698203951686402913268, + 21888242871839275222246405745257275088548364400416034343698203882144829780394, + 466052739755972, + 21888242871839275222246405745257275088548364400416034343698203773541081079980, + 84785666934217, + 21888242871839275222246405745257275088548364400416034343698204154717833018253, + 79850670215792, + 21888242871839275222246405745257275088548364400416034343698204007886232163977, + 282787661499892, + 457264673690283, + 21888242871839275222246405745257275088548364400416034343698204067523996262041, + 119261326563711, + 21888242871839275222246405745257275088548364400416034343698204043462072482587, + 21888242871839275222246405745257275088548364400416034343698204155727362905964, + 103933832892292, + 212813826094023, + 21888242871839275222246405745257275088548364400416034343698203805992980499382, + 112412165142711, + 403960556724349, + 545580752993116, + 253681853392436, + 451424585934239, + 21888242871839275222246405745257275088548364400416034343698203942850120921281, + 281490125447124, + 21888242871839275222246405745257275088548364400416034343698203931396159942637, + 21888242871839275222246405745257275088548364400416034343698204016256879071568, + 107976544449578, + 188797564724959, + 330843830452527, + 21888242871839275222246405745257275088548364400416034343698203987417657997554, + 21888242871839275222246405745257275088548364400416034343698203754463944751012, + 558619420239889, + 425664002609679, + 21888242871839275222246405745257275088548364400416034343698203946347606888426, + 516159880392612, + 21888242871839275222246405745257275088548364400416034343698204081062794671667, + 21888242871839275222246405745257275088548364400416034343698204110014212830994, + 21888242871839275222246405745257275088548364400416034343698203831041247779097, + 21888242871839275222246405745257275088548364400416034343698203971659535223211, + 106864879073844, + 68816298410486, + 27478576607778, + 168179586128856, + 170537593075397, + 21888242871839275222246405745257275088548364400416034343698204117064358754392, + 21888242871839275222246405745257275088548364400416034343698203631238766320821, + 21888242871839275222246405745257275088548364400416034343698203675367855485570, + 383243058868, + 21888242871839275222246405745257275088548364400416034343698204169576004356498, + 426656754433164, + 21888242871839275222246405745257275088548364400416034343698203768168967786382, + 445296414307358, + 21888242871839275222246405745257275088548364400416034343698203876833469487771, + 251642822124989, + 21888242871839275222246405745257275088548364400416034343698203990269044091737, + 21888242871839275222246405745257275088548364400416034343698204116812614790283, + 512430584524891, + 229620702739191, + 21888242871839275222246405745257275088548364400416034343698204158223722888973, + 180140331979221, + 94852158562082, + 21888242871839275222246405745257275088548364400416034343698203799154286490678, + 152430313920184, + 21888242871839275222246405745257275088548364400416034343698203682901119846471, + 21888242871839275222246405745257275088548364400416034343698203693665235226500, + 21888242871839275222246405745257275088548364400416034343698204033318311302431, + 178179124805536, + 486942334325009, + 21888242871839275222246405745257275088548364400416034343698203641567838082159, + 316543530945860, + 21888242871839275222246405745257275088548364400416034343698203942386819796879, + 99129645927726, + 196173988539716, + 171445855721828, + 21888242871839275222246405745257275088548364400416034343698203963500684100659, + 21888242871839275222246405745257275088548364400416034343698204039988563765664, + 51617184956420, + 21888242871839275222246405745257275088548364400416034343698203909516789551258, + 137292710797821, + 21888242871839275222246405745257275088548364400416034343698204019496108300931, + 21888242871839275222246405745257275088548364400416034343698203962351498089873, + 561950030461074, + 401794812401123, + 294071640601822, + 167526816625948, + 21888242871839275222246405745257275088548364400416034343698203678841281440823, + 21888242871839275222246405745257275088548364400416034343698203928230759602063, + 500465765436363, + 149489222642128, + 21888242871839275222246405745257275088548364400416034343698204076075029709747, + 220803766498966, + 21888242871839275222246405745257275088548364400416034343698203956417132172631, + 4119338660500, + 21888242871839275222246405745257275088548364400416034343698203768082137627285, + 81734040256075, + 21888242871839275222246405745257275088548364400416034343698203799917534516092, + 182992005664694, + 21888242871839275222246405745257275088548364400416034343698203624906192035485, + 57721323330604, + 21888242871839275222246405745257275088548364400416034343698203773346764545577, + 277447142017740, + 204318023508508, + 408370882709508, + 21888242871839275222246405745257275088548364400416034343698204154983488631310, + 61635416930583, + 297878769146078, + 68164020228732, + 21888242871839275222246405745257275088548364400416034343698203759197519869272, + 21888242871839275222246405745257275088548364400416034343698203658566586995142, + 21888242871839275222246405745257275088548364400416034343698203744494159810070, + 21888242871839275222246405745257275088548364400416034343698203800200093633691, + 224385966928245, + 21888242871839275222246405745257275088548364400416034343698203792803512766900, + 21888242871839275222246405745257275088548364400416034343698203703732175420008, + 313485114006689, + 21888242871839275222246405745257275088548364400416034343698203873675546942522, + 93005594932916, + 21888242871839275222246405745257275088548364400416034343698203899452880958614, + 390065450587578, + 300405592437419, + 331061811458852, + 21888242871839275222246405745257275088548364400416034343698203798569030127472, + 244032718767133, + 439931507823651, + 21888242871839275222246405745257275088548364400416034343698204045615442103015, + 453433302988953, + 234819030404567, + 47448441078475, + 221200221921152, + 21888242871839275222246405745257275088548364400416034343698204116507220151690, + 504910792728494, + 21888242871839275222246405745257275088548364400416034343698204115991237962314, + 21888242871839275222246405745257275088548364400416034343698203765100831159381, + 21888242871839275222246405745257275088548364400416034343698203740122675510957, + 21888242871839275222246405745257275088548364400416034343698203981889526125146, + 211677328482722, + 21888242871839275222246405745257275088548364400416034343698203676821198523492, + 21888242871839275222246405745257275088548364400416034343698203918015522048104, + 14754224586293, + 21888242871839275222246405745257275088548364400416034343698204028007405665450, + 32437917407452, + 420213866251048, + 187084276562873, + 355468264011147, + 161238927238634, + 21888242871839275222246405745257275088548364400416034343698204137994935006350, + 21888242871839275222246405745257275088548364400416034343698203630085321734767, + 511214522817763, + 21888242871839275222246405745257275088548364400416034343698204118318288021361, + 21888242871839275222246405745257275088548364400416034343698204185638627587423, + 203108073262558, + 21888242871839275222246405745257275088548364400416034343698204082626855395966, + 21888242871839275222246405745257275088548364400416034343698203780334144578716, + 521843785992900, + 501361090226300, + 21888242871839275222246405745257275088548364400416034343698203758603006309524, + 92764200415966, + 21888242871839275222246405745257275088548364400416034343698203833485969510908, + 181630385269715, + 516801944666513, + 408906022066034, + 21888242871839275222246405745257275088548364400416034343698203984354089739435, + 86963297144560, + 534642716302178, + 21888242871839275222246405745257275088548364400416034343698203760891127821695, + 359130465599827, + 21888242871839275222246405745257275088548364400416034343698203693607895447978, + 64759191082121, + 21888242871839275222246405745257275088548364400416034343698203842438151661193, + 88717728060543, + 443256981420740, + 21888242871839275222246405745257275088548364400416034343698203840267786509471, + 323920158488860, + 21888242871839275222246405745257275088548364400416034343698204022338421205614, + 21888242871839275222246405745257275088548364400416034343698203671903213273080, + 21888242871839275222246405745257275088548364400416034343698203779285247789917, + 21888242871839275222246405745257275088548364400416034343698203898502584469380, + 21888242871839275222246405745257275088548364400416034343698204087374858490650, + 21888242871839275222246405745257275088548364400416034343698203637112095482665, + 258650429345542, + 51665292434857, + 195984268243839, + 21888242871839275222246405745257275088548364400416034343698203884894989952236, + 21888242871839275222246405745257275088548364400416034343698204143510406877790, + 21888242871839275222246405745257275088548364400416034343698203744904028558391, + 21888242871839275222246405745257275088548364400416034343698203827138673905730, + 21888242871839275222246405745257275088548364400416034343698203995917649188004, + 21888242871839275222246405745257275088548364400416034343698204033506561794788, + 465256866314912, + 21888242871839275222246405745257275088548364400416034343698203767243520695451, + 21888242871839275222246405745257275088548364400416034343698203944110986327458, + 21888242871839275222246405745257275088548364400416034343698204136977306420652, + 21888242871839275222246405745257275088548364400416034343698203662085398807231, + 458156174752043, + 21888242871839275222246405745257275088548364400416034343698203940450798580521, + 21888242871839275222246405745257275088548364400416034343698203745454996306739, + 21888242871839275222246405745257275088548364400416034343698203763993279604195, + 21888242871839275222246405745257275088548364400416034343698204071163181376367, + 21888242871839275222246405745257275088548364400416034343698203822469061217597, + 373865196709477, + 21888242871839275222246405745257275088548364400416034343698203632419129251572, + 21888242871839275222246405745257275088548364400416034343698203818781791766826, + 21888242871839275222246405745257275088548364400416034343698203954579154746661, + 21888242871839275222246405745257275088548364400416034343698203690847976512766, + 102324115132544, + 91906125400717, + 21888242871839275222246405745257275088548364400416034343698204112005719085396, + 345844958957664, + 288621372953466, + 78373408656085, + 211473655184171, + 396714435660661, + 225035292907927, + 21888242871839275222246405745257275088548364400416034343698203830003680354021, + 21888242871839275222246405745257275088548364400416034343698203898577829860243, + 21888242871839275222246405745257275088548364400416034343698204051050966459615, + 67699656414730, + 21888242871839275222246405745257275088548364400416034343698203933798615198906, + 21888242871839275222246405745257275088548364400416034343698203922828076146572, + 332056907167080, + 249040668081206, + 21888242871839275222246405745257275088548364400416034343698203858468852342521, + 21888242871839275222246405745257275088548364400416034343698204014153285495759, + 21888242871839275222246405745257275088548364400416034343698203909857594676285, + 519759457974435, + 475211316445312, + 439887135506111, + 389815128564899, + 106596835201085, + 21888242871839275222246405745257275088548364400416034343698203688639017602524, + 280556870165103, + 88878569541349, + 21888242871839275222246405745257275088548364400416034343698203993577537089860, + 134056308435999, + 222948267809677, + 178485582080846, + 470966605036017, + 57284938624884, + 61212498807636, + 87151205138775, + 429622226348795, + 117421958638363, + 21888242871839275222246405745257275088548364400416034343698204046578961916733, + 475035164410253, + 402463233714209, + 21888242871839275222246405745257275088548364400416034343698204057512076237088, + 21888242871839275222246405745257275088548364400416034343698203929061780725703, + 482060051620698, + 487902184165071, + 21888242871839275222246405745257275088548364400416034343698203992464939679761, + 478787656345867, + 134029146567914, + 21888242871839275222246405745257275088548364400416034343698203821602023921876, + 21888242871839275222246405745257275088548364400416034343698203984351785909666, + 21888242871839275222246405745257275088548364400416034343698203894072765444727, + 21888242871839275222246405745257275088548364400416034343698204029697319998355, + 21888242871839275222246405745257275088548364400416034343698203822416294948494, + 21888242871839275222246405745257275088548364400416034343698204169310423586629, + 208621441637801, + 21888242871839275222246405745257275088548364400416034343698204097734962821985, + 21888242871839275222246405745257275088548364400416034343698203658485450651275, + 21888242871839275222246405745257275088548364400416034343698203635101566808343, + 425368729285953, + 21888242871839275222246405745257275088548364400416034343698203661777513050055, + 21888242871839275222246405745257275088548364400416034343698203771872412807747, + 21888242871839275222246405745257275088548364400416034343698203846684392028256, + 21888242871839275222246405745257275088548364400416034343698203993099658897769, + 21888242871839275222246405745257275088548364400416034343698203705318416677054, + 21888242871839275222246405745257275088548364400416034343698204043721332342483, + 282271393818489, + 21888242871839275222246405745257275088548364400416034343698204181817236765974, + 510152881882753, + 21888242871839275222246405745257275088548364400416034343698203896989707591684, + 486034602699016, + 21888242871839275222246405745257275088548364400416034343698204042168988901460, + 21888242871839275222246405745257275088548364400416034343698204126209253677335, + 21888242871839275222246405745257275088548364400416034343698203853380345525645, + 397949419289232, + 452601004622228, + 21888242871839275222246405745257275088548364400416034343698204161286200027857, + 4399044158806, + 484081430890496, + 21888242871839275222246405745257275088548364400416034343698204041932717498265, + 21888242871839275222246405745257275088548364400416034343698204087165177290176, + 511367757703820, + 21888242871839275222246405745257275088548364400416034343698203913986358264254, + 21888242871839275222246405745257275088548364400416034343698204057629168581438, + 21888242871839275222246405745257275088548364400416034343698203705486574281895, + 21888242871839275222246405745257275088548364400416034343698204095144830407242, + 131544444181492, + 461743232131779, + 325702231896438, + 68655510162938, + 141228142964872, + 540397278724129, + 21888242871839275222246405745257275088548364400416034343698204163052766987971, + 54800017487430, + 21888242871839275222246405745257275088548364400416034343698204080773330609695, + 388442238337724, + 21888242871839275222246405745257275088548364400416034343698203934686814177121, + 119493102350423, + 441419732163880, + 21888242871839275222246405745257275088548364400416034343698204057418899921109, + 332184857513097, + 364450079846419, + 21888242871839275222246405745257275088548364400416034343698203881069996569977, + 28690592300543, + 21888242871839275222246405745257275088548364400416034343698203877804526946897, + 223352345214086, + 21888242871839275222246405745257275088548364400416034343698203931233615077428, + 21888242871839275222246405745257275088548364400416034343698203701926961683981, + 191195388841120, + 148910906202193, + 292881124589385, + 21888242871839275222246405745257275088548364400416034343698203747704566613480, + 92116039685768, + 57475613070091, + 43199723013999, + 385843385074349, + 520135919336338, + 326740873980442, + 73583319544059, + 21888242871839275222246405745257275088548364400416034343698204180695190807521, + 273921344447459, + 21888242871839275222246405745257275088548364400416034343698203981713034864627, + 21888242871839275222246405745257275088548364400416034343698203751552380091969, + 3286223473222, + 21888242871839275222246405745257275088548364400416034343698203841711113319789, + 90365087116031, + 21888242871839275222246405745257275088548364400416034343698204089461767028846, + 23102557747630, + 21888242871839275222246405745257275088548364400416034343698203785459332465118, + 552027363452583, + 60804413899857, + 464203648538609, + 21888242871839275222246405745257275088548364400416034343698203961428254349718, + 310624247654715, + 21888242871839275222246405745257275088548364400416034343698204128527577655286, + 21888242871839275222246405745257275088548364400416034343698203789625746244634, + 190827126794965, + 21888242871839275222246405745257275088548364400416034343698204120920171950977, + 203019404148807, + 21888242871839275222246405745257275088548364400416034343698203776918601089540, + 21888242871839275222246405745257275088548364400416034343698203792392990622910, + 445886126472583, + 21888242871839275222246405745257275088548364400416034343698204121075201526359, + 453757701075356, + 149331578898655, + 21888242871839275222246405745257275088548364400416034343698203739845896833654, + 335694395291745, + 550929670999940, + 129326635874130, + 9365473825758, + 21888242871839275222246405745257275088548364400416034343698203843587474768685, + 532458491914232, + 431715628229641, + 483534990995906, + 21888242871839275222246405745257275088548364400416034343698204124371643735063, + 21888242871839275222246405745257275088548364400416034343698203822699087971795, + 21888242871839275222246405745257275088548364400416034343698203824051073192838, + 21888242871839275222246405745257275088548364400416034343698203896871373531479, + 308690387403576, + 21888242871839275222246405745257275088548364400416034343698204065397202512250, + 21888242871839275222246405745257275088548364400416034343698203672420393844182, + 21888242871839275222246405745257275088548364400416034343698203958415506583408, + 21888242871839275222246405745257275088548364400416034343698203659723041604493, + 21888242871839275222246405745257275088548364400416034343698204023952466674527, + 21888242871839275222246405745257275088548364400416034343698203793615602977467, + 93383803026337, + 210466465573389, + 107227308797483, + 503715802807708, + 21888242871839275222246405745257275088548364400416034343698203643457666753203, + 21888242871839275222246405745257275088548364400416034343698203820681407923353, + 527364686431151, + 21888242871839275222246405745257275088548364400416034343698203810097473963670, + 197877902249002, + 21888242871839275222246405745257275088548364400416034343698203846708433389649, + 21888242871839275222246405745257275088548364400416034343698204077776620988188, + 417647307015057, + 21888242871839275222246405745257275088548364400416034343698203951547696248069, + 21888242871839275222246405745257275088548364400416034343698204182482952806145, + 21888242871839275222246405745257275088548364400416034343698203764868448008522, + 21888242871839275222246405745257275088548364400416034343698203990927088779249, + 71272818114002, + 21888242871839275222246405745257275088548364400416034343698204163818165185433, + 292772426339274, + 21888242871839275222246405745257275088548364400416034343698203994707749862259, + 260640422088301, + 48054964124688, + 187557543994781, + 312090394442680, + 396386193814234, + 21888242871839275222246405745257275088548364400416034343698203952442323560231, + 492918361586076, + 21888242871839275222246405745257275088548364400416034343698204071303727476052, + 21888242871839275222246405745257275088548364400416034343698204049227419127869, + 2198729835034, + 21888242871839275222246405745257275088548364400416034343698203644003164749959, + 21888242871839275222246405745257275088548364400416034343698203828543070336574, + 21888242871839275222246405745257275088548364400416034343698204014281372166740, + 289844566346393, + 21888242871839275222246405745257275088548364400416034343698204122315886785408, + 494021188490523, + 21888242871839275222246405745257275088548364400416034343698203737220319315875, + 244536142628001, + 21888242871839275222246405745257275088548364400416034343698203858248932952651, + 250340315762884, + 364959325652320, + 179015381738905, + 353805002926731, + 21888242871839275222246405745257275088548364400416034343698203879340625508495, + 169209225624460, + 21888242871839275222246405745257275088548364400416034343698203839390162290062, + 21888242871839275222246405745257275088548364400416034343698204016830697043178, + 60316278081818, + 55021921496100, + 545156565135185, + 21888242871839275222246405745257275088548364400416034343698203869311892714131, + 285597647570778, + 21888242871839275222246405745257275088548364400416034343698203839721122080529, + 32414704524055, + 484830597962003, + 480480134799251, + 506452293009017, + 21888242871839275222246405745257275088548364400416034343698204181658653662193, + 58708501471094, + 21888242871839275222246405745257275088548364400416034343698204173255790451402, + 21888242871839275222246405745257275088548364400416034343698203839805302062954, + 307944898084876, + 21888242871839275222246405745257275088548364400416034343698204158523491667268, + 170736185567046, + 190174082008592, + 86949652817993, + 21888242871839275222246405745257275088548364400416034343698203903857416887703, + 21888242871839275222246405745257275088548364400416034343698203866280702809934, + 486638239663786, + 21888242871839275222246405745257275088548364400416034343698204156720870392680, + 21888242871839275222246405745257275088548364400416034343698203849395236152880, + 21888242871839275222246405745257275088548364400416034343698203892980535392649, + 548563560622611, + 21888242871839275222246405745257275088548364400416034343698203927630895899870, + 290994053791673, + 21888242871839275222246405745257275088548364400416034343698203989626688603244, + 337534605694784, + 21888242871839275222246405745257275088548364400416034343698203933148738789458, + 21888242871839275222246405745257275088548364400416034343698203780743473016102, + 21888242871839275222246405745257275088548364400416034343698203636348308140721, + 21888242871839275222246405745257275088548364400416034343698204170043585631723, + 21888242871839275222246405745257275088548364400416034343698203835832854101475, + 191764144709683, + 12833227585987, + 21888242871839275222246405745257275088548364400416034343698203693737305260985, + 21888242871839275222246405745257275088548364400416034343698203670638674249743, + 193955985883426, + 21888242871839275222246405745257275088548364400416034343698204126178377108655, + 18182567421798, + 99623267584239, + 21888242871839275222246405745257275088548364400416034343698203787716848433145, + 21888242871839275222246405745257275088548364400416034343698203760769766792379, + 21888242871839275222246405745257275088548364400416034343698203869493967655587, + 21888242871839275222246405745257275088548364400416034343698204174183602743827, + 21888242871839275222246405745257275088548364400416034343698204051182777036653, + 21888242871839275222246405745257275088548364400416034343698203814086555896313, + 21888242871839275222246405745257275088548364400416034343698204065863332885068, + 21888242871839275222246405745257275088548364400416034343698204125447031829247, + 216581977237597, + 177789867436712, + 163734427004798, + 21888242871839275222246405745257275088548364400416034343698203846088060470007, + 21888242871839275222246405745257275088548364400416034343698203716707209749934, + 21888242871839275222246405745257275088548364400416034343698204040951703433934, + 183586558148716, + 21888242871839275222246405745257275088548364400416034343698203853865435881166, + 240996032537828, + 21888242871839275222246405745257275088548364400416034343698203936414940253789, + 557746647299070, + 21888242871839275222246405745257275088548364400416034343698203922726212932611, + 540734593015725, + 353431306832489, + 21888242871839275222246405745257275088548364400416034343698203877989083288414, + 21888242871839275222246405745257275088548364400416034343698204126735359079358, + 21888242871839275222246405745257275088548364400416034343698204155878457126874, + 235319615209969, + 21888242871839275222246405745257275088548364400416034343698203951730244729063, + 21888242871839275222246405745257275088548364400416034343698203847908539630247, + 21888242871839275222246405745257275088548364400416034343698203841477789145360, + 437897236893651, + 21888242871839275222246405745257275088548364400416034343698203780262268481289, + 21888242871839275222246405745257275088548364400416034343698203988117457124462, + 21888242871839275222246405745257275088548364400416034343698203669122716424470, + 21888242871839275222246405745257275088548364400416034343698204036707820819497, + 21888242871839275222246405745257275088548364400416034343698203974346009223517, + 217656931120497, + 21888242871839275222246405745257275088548364400416034343698204165834889457436, + 470079619526002, + 21888242871839275222246405745257275088548364400416034343698203850739426007690, + 180797045673233, + 320076310542873, + 21888242871839275222246405745257275088548364400416034343698203965145528415146, + 22541020308120, + 21888242871839275222246405745257275088548364400416034343698203743899619685200, + 301235811065463, + 330701813872331, + 224475105864008, + 21888242871839275222246405745257275088548364400416034343698203710513855178251, + 222919625051958, + 452109281663103, + 21888242871839275222246405745257275088548364400416034343698204025738870850725, + 454922306282387, + 421815281930853, + 21888242871839275222246405745257275088548364400416034343698204151046465454785, + 372941955269525, + 312078153071932, + 21888242871839275222246405745257275088548364400416034343698203997476334631556, + 37901938779515, + 141509541937745, + 21888242871839275222246405745257275088548364400416034343698203845240507144027, + 21888242871839275222246405745257275088548364400416034343698203690904354425462, + 186295610573006, + 322332107576755, + 21888242871839275222246405745257275088548364400416034343698203886942002657628, + 21888242871839275222246405745257275088548364400416034343698203710640380371094, + 21888242871839275222246405745257275088548364400416034343698203987125911863433, + 21888242871839275222246405745257275088548364400416034343698203843620053825148, + 521757944367548, + 406022986705258, + 21888242871839275222246405745257275088548364400416034343698203993636320596159, + 21888242871839275222246405745257275088548364400416034343698203751396673472842, + 205509720759932, + 426301101854344, + 21888242871839275222246405745257275088548364400416034343698204182148376379765, + 527486305877150, + 125961223773177, + 336842596391697, + 541970221344631, + 21888242871839275222246405745257275088548364400416034343698203923775154618633, + 21888242871839275222246405745257275088548364400416034343698203769211946686777, + 52488596166128, + 21888242871839275222246405745257275088548364400416034343698204112613951352909, + 21888242871839275222246405745257275088548364400416034343698203772720824148376, + 21888242871839275222246405745257275088548364400416034343698203946943060405905, + 21888242871839275222246405745257275088548364400416034343698203952436348027531, + 158717459670170, + 500981230047867, + 21888242871839275222246405745257275088548364400416034343698203991295261969863, + 479064054219070, + 50972351740058, + 21888242871839275222246405745257275088548364400416034343698203876359027029088, + 297139936798880, + 21888242871839275222246405745257275088548364400416034343698203983613861931981, + 21888242871839275222246405745257275088548364400416034343698203799980409212695, + 296841300758795, + 451083925713996, + 411958891092479, + 118820440699808, + 466285124009041, + 21888242871839275222246405745257275088548364400416034343698203865805317231937, + 363553464562783, + 349110174290570, + 462429071590420, + 83766440699292, + 21888242871839275222246405745257275088548364400416034343698203677681358683820, + 475287540229005, + 33998061743762, + 385236254562759, + 543561726231883, + 244262897629941, + 21888242871839275222246405745257275088548364400416034343698203687377890406147, + 22431359036553, + 181465434163537, + 21888242871839275222246405745257275088548364400416034343698203751359146362469, + 394575362861312, + 21888242871839275222246405745257275088548364400416034343698203995825707523839, + 21888242871839275222246405745257275088548364400416034343698204102978641447177, + 21888242871839275222246405745257275088548364400416034343698204000731541863570, + 21888242871839275222246405745257275088548364400416034343698203668770463431808, + 21888242871839275222246405745257275088548364400416034343698203906422789072855, + 512262545899385, + 180675928638551, + 21888242871839275222246405745257275088548364400416034343698203857868605216777, + 218195273877750, + 21888242871839275222246405745257275088548364400416034343698203967760233625250, + 21888242871839275222246405745257275088548364400416034343698203728055121679880, + 21888242871839275222246405745257275088548364400416034343698204155707232779227, + 190299165837310, + 229284643482854, + 283179366716160, + 447430421615633, + 111026583910270, + 21888242871839275222246405745257275088548364400416034343698203706714039322231, + 444828733083493, + 543514457829308, + 21888242871839275222246405745257275088548364400416034343698203901693031040274, + 96458712273123, + 178585201470486, + 21888242871839275222246405745257275088548364400416034343698203656465839025100, + 66963716059715, + 21888242871839275222246405745257275088548364400416034343698203809869222412760, + 21888242871839275222246405745257275088548364400416034343698203840122608270857, + 21888242871839275222246405745257275088548364400416034343698203817767137204927, + 21888242871839275222246405745257275088548364400416034343698203625433944387944, + 378855838484070, + 87311200300863, + 21888242871839275222246405745257275088548364400416034343698204145331620168011, + 21888242871839275222246405745257275088548364400416034343698203850600307072663, + 21888242871839275222246405745257275088548364400416034343698203885561943820658, + 21888242871839275222246405745257275088548364400416034343698204056245819567160, + 21888242871839275222246405745257275088548364400416034343698203923881768472382, + 21888242871839275222246405745257275088548364400416034343698203976296425182244, + 308141184092936, + 21888242871839275222246405745257275088548364400416034343698204087544151879303, + 21888242871839275222246405745257275088548364400416034343698204134069699845353, + 21888242871839275222246405745257275088548364400416034343698203970372439173049, + 226976135530426, + 87254633675611, + 21888242871839275222246405745257275088548364400416034343698203893748030278081, + 257484112966526, + 269501014736744, + 362942988278244, + 76518628677833, + 21888242871839275222246405745257275088548364400416034343698204079136943857463, + 400200703681460, + 21888242871839275222246405745257275088548364400416034343698203704763629909147, + 523305262009002, + 21888242871839275222246405745257275088548364400416034343698204161707653568802, + 21888242871839275222246405745257275088548364400416034343698203849869064907028, + 452458039079079, + 21888242871839275222246405745257275088548364400416034343698203831012004341552, + 288237186659642, + 539570419949791, + 21888242871839275222246405745257275088548364400416034343698204109236644035308, + 370971828819510, + 364837436345429, + 79895504752174, + 164472729104852, + 462914736303919, + 21888242871839275222246405745257275088548364400416034343698203910640227664071, + 21888242871839275222246405745257275088548364400416034343698204090159100359028, + 21888242871839275222246405745257275088548364400416034343698203713985515821133, + 248462255975781, + 104228225158056, + 21888242871839275222246405745257275088548364400416034343698203930855449297811, + 497794895156459, + 21888242871839275222246405745257275088548364400416034343698203745431850215208, + 552016340217388, + 21888242871839275222246405745257275088548364400416034343698204127267281490987, + 21888242871839275222246405745257275088548364400416034343698204136530939137461, + 21888242871839275222246405745257275088548364400416034343698203830068157275688, + 447905427272262, + 21888242871839275222246405745257275088548364400416034343698203829285910590977, + 21888242871839275222246405745257275088548364400416034343698203983135738645088, + 170065890308443, + 21888242871839275222246405745257275088548364400416034343698204175705037891434, + 179994443848276, + 21888242871839275222246405745257275088548364400416034343698203859773998258651, + 21888242871839275222246405745257275088548364400416034343698203691294291630924, + 21888242871839275222246405745257275088548364400416034343698204109711221762614, + 21888242871839275222246405745257275088548364400416034343698203750473236356664, + 21888242871839275222246405745257275088548364400416034343698203648450403793165, + 21888242871839275222246405745257275088548364400416034343698203671797426817245, + 132017220291816, + 21888242871839275222246405745257275088548364400416034343698203847378693943153, + 129824075442677, + 21888242871839275222246405745257275088548364400416034343698203981811043673623, + 85952107111670, + 251104207589186, + 21888242871839275222246405745257275088548364400416034343698204152947290978928, + 254195454759641, + 21888242871839275222246405745257275088548364400416034343698203677157418544824, + 342491637291252, + 160052829522708, + 21888242871839275222246405745257275088548364400416034343698203736564934688769, + 21888242871839275222246405745257275088548364400416034343698203717408300689502, + 21888242871839275222246405745257275088548364400416034343698203821891325856174, + 21888242871839275222246405745257275088548364400416034343698204172402143004482, + 153489023220131, + 44244878232345, + 21888242871839275222246405745257275088548364400416034343698204063006718654866, + 182172986462097, + 48056907689963, + 183957566113502, + 9931535718289, + 69009521674801, + 536856015313546, + 21888242871839275222246405745257275088548364400416034343698203996661549668369, + 21888242871839275222246405745257275088548364400416034343698203830880263399715, + 54198506401230, + 81327764180223, + 21888242871839275222246405745257275088548364400416034343698203947633630406939, + 21888242871839275222246405745257275088548364400416034343698204164450432967982, + 21888242871839275222246405745257275088548364400416034343698203688963965433003, + 21888242871839275222246405745257275088548364400416034343698203959377621931969, + 21888242871839275222246405745257275088548364400416034343698203965203700233764, + 156215386094784, + 116990066009172, + 151527591039874, + 164920978208568, + 78284796467674, + 187771126675559, + 190454576917084, + 322786839503029, + 21888242871839275222246405745257275088548364400416034343698203866885016200885, + 21888242871839275222246405745257275088548364400416034343698204019791361148054, + 21888242871839275222246405745257275088548364400416034343698204039723321396105, + 394765899136986, + 21888242871839275222246405745257275088548364400416034343698203652024912686301, + 21888242871839275222246405745257275088548364400416034343698203727097918002305, + 355313242668312, + 21888242871839275222246405745257275088548364400416034343698203912068605369184, + 21888242871839275222246405745257275088548364400416034343698204176349687926858, + 21888242871839275222246405745257275088548364400416034343698204162476445515821, + 188361822874961, + 353104160465364, + 336492968861021, + 21888242871839275222246405745257275088548364400416034343698204035157687738557, + 21888242871839275222246405745257275088548364400416034343698204090361528743641, + 480044146394732, + 80060661227235, + 241827152409878, + 21888242871839275222246405745257275088548364400416034343698203923028447009637, + 96014178271520, + 21888242871839275222246405745257275088548364400416034343698203854213662074084, + 342078121223027, + 21888242871839275222246405745257275088548364400416034343698203685544067509376, + 167453495522646, + 269368345092145, + 21888242871839275222246405745257275088548364400416034343698203766270473338748, + 21888242871839275222246405745257275088548364400416034343698204073933153738247, + 21888242871839275222246405745257275088548364400416034343698203875751906677305, + 374108547292556, + 21888242871839275222246405745257275088548364400416034343698203857548820772203, + 21888242871839275222246405745257275088548364400416034343698203846986509951525, + 527095824970096, + 21888242871839275222246405745257275088548364400416034343698203849764318756199, + 21888242871839275222246405745257275088548364400416034343698203681723088421963, + 356581631373858, + 38835696627344, + 21888242871839275222246405745257275088548364400416034343698203987448914331825, + 554596218156816, + 26709630625698, + 21888242871839275222246405745257275088548364400416034343698204022806565497388, + 105883822495543, + 21888242871839275222246405745257275088548364400416034343698203827602454830719, + 21888242871839275222246405745257275088548364400416034343698204082562640189855, + 21888242871839275222246405745257275088548364400416034343698203730153854948452, + 19583086881517, + 21888242871839275222246405745257275088548364400416034343698203980216398847126, + 21888242871839275222246405745257275088548364400416034343698203843277477318452, + 183417202467394, + 10608163751292, + 21888242871839275222246405745257275088548364400416034343698203998746403947234, + 421017213621750, + 21888242871839275222246405745257275088548364400416034343698203789641783782995, + 430616752499079, + 21888242871839275222246405745257275088548364400416034343698203752465761914367, + 21888242871839275222246405745257275088548364400416034343698203999980902095400, + 58941479626815, + 429920166231901, + 21888242871839275222246405745257275088548364400416034343698204017195737866582, + 71898310852055, + 509911083644851, + 21888242871839275222246405745257275088548364400416034343698203972633502375309, + 21888242871839275222246405745257275088548364400416034343698203903258145452212, + 480587595163197, + 69401235046325, + 305868219781599, + 21888242871839275222246405745257275088548364400416034343698204031716988726697, + 290559272657624, + 103393955264157, + 243475685393700, + 304747070782156, + 135894020866038, + 21888242871839275222246405745257275088548364400416034343698203978653586985704, + 21888242871839275222246405745257275088548364400416034343698204041113760183302, + 21888242871839275222246405745257275088548364400416034343698203967613752721292, + 21888242871839275222246405745257275088548364400416034343698203699445125850720, + 257136152011769, + 21888242871839275222246405745257275088548364400416034343698204008701886332822, + 21888242871839275222246405745257275088548364400416034343698204039028807196834, + 244133148620429, + 54396656874854, + 231812171033068, + 21888242871839275222246405745257275088548364400416034343698203911004495382127, + 21888242871839275222246405745257275088548364400416034343698204059312676208012, + 118179848874316, + 21888242871839275222246405745257275088548364400416034343698204072669536730379, + 394719562233107, + 509609489114109, + 228310938790780, + 21888242871839275222246405745257275088548364400416034343698203919543907235736, + 21888242871839275222246405745257275088548364400416034343698203712810550130241, + 21888242871839275222246405745257275088548364400416034343698203958009758374535, + 21888242871839275222246405745257275088548364400416034343698204119983313108016, + 217951603279352, + 81379069758465, + 92042211043994, + 21888242871839275222246405745257275088548364400416034343698203786370681266841, + 205583160575120, + 21888242871839275222246405745257275088548364400416034343698203992928984045140, + 446770450010194, + 144450578074067, + 21888242871839275222246405745257275088548364400416034343698203803004034565181, + 21888242871839275222246405745257275088548364400416034343698203756494045067588, + 239999070078164, + 21888242871839275222246405745257275088548364400416034343698203910285673469212, + 183436321916373, + 21888242871839275222246405745257275088548364400416034343698203945072630294822, + 21888242871839275222246405745257275088548364400416034343698203631739906200490, + 21888242871839275222246405745257275088548364400416034343698203928118565383786, + 21888242871839275222246405745257275088548364400416034343698203688604526505495, + 106657734663577, + 408647072107885, + 21888242871839275222246405745257275088548364400416034343698204107027822372900, + 21888242871839275222246405745257275088548364400416034343698204083432265453342, + 21888242871839275222246405745257275088548364400416034343698203857510333702399, + 460623513824045, + 21888242871839275222246405745257275088548364400416034343698203852064934715914, + 21888242871839275222246405745257275088548364400416034343698204045241767303297, + 23168643616179, + 21888242871839275222246405745257275088548364400416034343698203856810796959800, + 212168637218300, + 21888242871839275222246405745257275088548364400416034343698203717009830223930, + 21888242871839275222246405745257275088548364400416034343698203750910417491120, + 21888242871839275222246405745257275088548364400416034343698203812702497808622, + 35208728792035, + 21888242871839275222246405745257275088548364400416034343698203922147272504979, + 21888242871839275222246405745257275088548364400416034343698203836647890347087, + 21888242871839275222246405745257275088548364400416034343698203669961073234831, + 21888242871839275222246405745257275088548364400416034343698204156065429778246, + 501944637230262, + 350143696826081, + 21888242871839275222246405745257275088548364400416034343698203877927639811840, + 21888242871839275222246405745257275088548364400416034343698203944578942852191, + 21888242871839275222246405745257275088548364400416034343698204078315594222621, + 26421819094334, + 21888242871839275222246405745257275088548364400416034343698203977868619479770, + 21888242871839275222246405745257275088548364400416034343698204010771051060262, + 21888242871839275222246405745257275088548364400416034343698203977673827102321, + 356661727354972, + 61391892616528, + 21888242871839275222246405745257275088548364400416034343698204055615462629047, + 21888242871839275222246405745257275088548364400416034343698203629304481161112, + 21888242871839275222246405745257275088548364400416034343698203966269757341356, + 386283948065351, + 21888242871839275222246405745257275088548364400416034343698204013696339553117, + 21888242871839275222246405745257275088548364400416034343698204145437266431592, + 295726379793450, + 21888242871839275222246405745257275088548364400416034343698203827127375807402, + 434904498255070, + 28736297655664, + 6605906581953, + 265424179133712, + 139959474288465, + 21888242871839275222246405745257275088548364400416034343698203714395382565350, + 21888242871839275222246405745257275088548364400416034343698204008536634751387, + 132122717774952, + 21888242871839275222246405745257275088548364400416034343698203846546929615566, + 230095192075985, + 554536957221086, + 21888242871839275222246405745257275088548364400416034343698203733384588608580, + 177763131506990, + 152001391693307, + 129788109493302, + 21888242871839275222246405745257275088548364400416034343698203899714348726982, + 234274072522461, + 38554417360628, + 21888242871839275222246405745257275088548364400416034343698204142938275123295, + 331741888827862, + 208285908519518, + 236636314377039, + 21888242871839275222246405745257275088548364400416034343698203783469516922032, + 335447187146472, + 21888242871839275222246405745257275088548364400416034343698203686982842788203, + 21888242871839275222246405745257275088548364400416034343698203834397572074399, + 436754439393714, + 21888242871839275222246405745257275088548364400416034343698203884808965077029, + 519161143552049, + 21888242871839275222246405745257275088548364400416034343698203746163246920998, + 283110027345025, + 21888242871839275222246405745257275088548364400416034343698204018326786902658, + 547300117003083, + 415663172216113, + 21888242871839275222246405745257275088548364400416034343698203706400680618918, + 445842433195936, + 21888242871839275222246405745257275088548364400416034343698203942237471781988, + 21888242871839275222246405745257275088548364400416034343698203796535327151381, + 21888242871839275222246405745257275088548364400416034343698203834755457480030, + 18101867358058, + 21888242871839275222246405745257275088548364400416034343698203642986476394730, + 502041615155136, + 363534033836657, + 435356561024053, + 366687395259983, + 21888242871839275222246405745257275088548364400416034343698203627266112302717, + 21888242871839275222246405745257275088548364400416034343698204169597434554278, + 316429567251016, + 480141008398369, + 21888242871839275222246405745257275088548364400416034343698203840593653940494, + 21888242871839275222246405745257275088548364400416034343698203987496305562501, + 21888242871839275222246405745257275088548364400416034343698203697157485660356, + 328916728896969, + 88980993038323, + 403616343813841, + 21888242871839275222246405745257275088548364400416034343698203639986316416305, + 21888242871839275222246405745257275088548364400416034343698203687663335098144, + 208359694840285, + 21888242871839275222246405745257275088548364400416034343698204086898305168316, + 72135253953665, + 21888242871839275222246405745257275088548364400416034343698203709270069026298, + 21888242871839275222246405745257275088548364400416034343698203874627608907527, + 152868575429784, + 21888242871839275222246405745257275088548364400416034343698204068207952191783, + 21888242871839275222246405745257275088548364400416034343698203739714917406701, + 295091782566654, + 14106190531660, + 98602627106377, + 21888242871839275222246405745257275088548364400416034343698204076295318176508, + 39957479131510, + 21888242871839275222246405745257275088548364400416034343698204041831460093398, + 499644776267112, + 21888242871839275222246405745257275088548364400416034343698203634442108384637, + 21888242871839275222246405745257275088548364400416034343698204142283324430524, + 75040123174180, + 21888242871839275222246405745257275088548364400416034343698203740046084405042, + 21888242871839275222246405745257275088548364400416034343698204064274004766183, + 21888242871839275222246405745257275088548364400416034343698203942681021892885, + 21888242871839275222246405745257275088548364400416034343698203726684076342401, + 21888242871839275222246405745257275088548364400416034343698203704319780227911, + 199600450298168, + 21888242871839275222246405745257275088548364400416034343698203934891310813455, + 21888242871839275222246405745257275088548364400416034343698203876904887332692, + 556354697810149, + 21888242871839275222246405745257275088548364400416034343698203885328709719675, + 21888242871839275222246405745257275088548364400416034343698204163750293272394, + 21888242871839275222246405745257275088548364400416034343698204039494697406783, + 233987206400871, + 21888242871839275222246405745257275088548364400416034343698203637624590566734, + 3023523038153, + 252252367530728, + 222723038390793, + 21888242871839275222246405745257275088548364400416034343698204089100864750011, + 405300349858210, + 80216864283281, + 484887749257831, + 220964845476524, + 21888242871839275222246405745257275088548364400416034343698204036550485656169, + 21888242871839275222246405745257275088548364400416034343698204002999607437935, + 21888242871839275222246405745257275088548364400416034343698204174908937848070, + 21888242871839275222246405745257275088548364400416034343698203867446029161601, + 175322429796540, + 328287828489892, + 263250593955020, + 510946113735598, + 157490934808019, + 139241491967195, + 156062598070252, + 21888242871839275222246405745257275088548364400416034343698203739480189374265, + 21888242871839275222246405745257275088548364400416034343698203762064292645411, + 408237135695822, + 21888242871839275222246405745257275088548364400416034343698204103784908145235, + 156642143762663, + 21888242871839275222246405745257275088548364400416034343698203853470560329539, + 315317629771561, + 21888242871839275222246405745257275088548364400416034343698203719259298680723, + 21888242871839275222246405745257275088548364400416034343698203996569957165166, + 21888242871839275222246405745257275088548364400416034343698204097420229635264, + 27180541758567, + 21888242871839275222246405745257275088548364400416034343698204069532319358467, + 21888242871839275222246405745257275088548364400416034343698204153549790067820, + 21888242871839275222246405745257275088548364400416034343698203736446612127697, + 289961701028756, + 21888242871839275222246405745257275088548364400416034343698203890225926494443, + 21888242871839275222246405745257275088548364400416034343698204172171659558799, + 21888242871839275222246405745257275088548364400416034343698204042212669746238, + 256998482700171, + 479202792958009, + 21888242871839275222246405745257275088548364400416034343698203832150043065209, + 21888242871839275222246405745257275088548364400416034343698203778312849457272, + 562679545954534, + 21888242871839275222246405745257275088548364400416034343698203649354180261305, + 491015095499231, + 368799603182163, + 81069732865528, + 253151633709601, + 21888242871839275222246405745257275088548364400416034343698204115228502767268, + 154902737321926, + 451592213402307, + 21888242871839275222246405745257275088548364400416034343698204088779897441810, + 21888242871839275222246405745257275088548364400416034343698203758122918385830, + 534062774694545, + 21888242871839275222246405745257275088548364400416034343698204023534141258150, + 288973845714491, + 21888242871839275222246405745257275088548364400416034343698203635142335898909, + 21888242871839275222246405745257275088548364400416034343698204000265581520957, + 21888242871839275222246405745257275088548364400416034343698203779085481637454, + 351931703743046, + 315200062490780, + 21888242871839275222246405745257275088548364400416034343698203777463990929569, + 132415050011577, + 21888242871839275222246405745257275088548364400416034343698203626948244540344, + 102074820224719, + 314318943616643, + 486918014540597, + 21888242871839275222246405745257275088548364400416034343698203665034592104004, + 110687578888358, + 394840817254605, + 143304808961236, + 152761415004228, + 21888242871839275222246405745257275088548364400416034343698203636054866938935, + 21888242871839275222246405745257275088548364400416034343698203869684726531366, + 496769072543995, + 19052788809187, + 389116491541041, + 21888242871839275222246405745257275088548364400416034343698204143613991165998, + 378687325534457, + 94356434564013, + 439996152294283, + 171284233820053, + 21888242871839275222246405745257275088548364400416034343698203731100749611108, + 21888242871839275222246405745257275088548364400416034343698204004909624264151, + 250203192684865, + 107329156789531, + 21888242871839275222246405745257275088548364400416034343698204089882635194205, + 295008347410113, + 21888242871839275222246405745257275088548364400416034343698203763277975497932, + 21888242871839275222246405745257275088548364400416034343698204084140164870777, + 21888242871839275222246405745257275088548364400416034343698203862192305544348, + 556859245885580, + 48420928223027, + 21888242871839275222246405745257275088548364400416034343698203671057520927561, + 543886018333260, + 231490246021276, + 291511631308972, + 331025405253267, + 21888242871839275222246405745257275088548364400416034343698203678843133318398, + 269797138161805, + 306085452966421, + 21888242871839275222246405745257275088548364400416034343698203989415160726209, + 352864096240264, + 136405978717396, + 21888242871839275222246405745257275088548364400416034343698203981643935139280, + 35432797581349, + 258546153566548, + 516889720199537, + 12379631002834, + 269660437400847, + 21888242871839275222246405745257275088548364400416034343698203694815312261315, + 528274445324673, + 21888242871839275222246405745257275088548364400416034343698203900089974058617, + 445190733527926, + 549602042292335, + 21888242871839275222246405745257275088548364400416034343698204062157399251399, + 21888242871839275222246405745257275088548364400416034343698203904148431710277, + 21888242871839275222246405745257275088548364400416034343698204166224975205433, + 460617057319668, + 347361253334324, + 21888242871839275222246405745257275088548364400416034343698204117488392229668, + 21888242871839275222246405745257275088548364400416034343698203876621369601965, + 21888242871839275222246405745257275088548364400416034343698203850321925966353, + 551988542648215, + 21888242871839275222246405745257275088548364400416034343698204043134857687635, + 404247140573960, + 21888242871839275222246405745257275088548364400416034343698204131815236619306, + 21888242871839275222246405745257275088548364400416034343698204153530742943942, + 21888242871839275222246405745257275088548364400416034343698203865610130089377, + 21888242871839275222246405745257275088548364400416034343698203973830077296067, + 359350154297888, + 21888242871839275222246405745257275088548364400416034343698203966403016997308, + 60299224811568, + 21888242871839275222246405745257275088548364400416034343698203826743379372266, + 61812177168797, + 146998455275596, + 21888242871839275222246405745257275088548364400416034343698203773241343984279, + 21888242871839275222246405745257275088548364400416034343698204125364683498696, + 268405138624022, + 21888242871839275222246405745257275088548364400416034343698203782960414585359, + 21888242871839275222246405745257275088548364400416034343698203868491882752366, + 499545479034881, + 395740572941010, + 21888242871839275222246405745257275088548364400416034343698203879635705452271, + 368545692251223, + 21888242871839275222246405745257275088548364400416034343698204005034470303066, + 361497828767463, + 21888242871839275222246405745257275088548364400416034343698203691479820886472, + 21888242871839275222246405745257275088548364400416034343698203769509245542570, + 160498041895536, + 21888242871839275222246405745257275088548364400416034343698203698385970844551, + 516707170692951, + 549109160514474, + 78539197424493, + 210725126918843, + 21888242871839275222246405745257275088548364400416034343698203838168623073588, + 21888242871839275222246405745257275088548364400416034343698204016461489231485, + 21888242871839275222246405745257275088548364400416034343698204137392191199993, + 21888242871839275222246405745257275088548364400416034343698204121440773179520, + 21888242871839275222246405745257275088548364400416034343698203953432683340424, + 542231683188089, + 21888242871839275222246405745257275088548364400416034343698203705773561242479, + 466376329900571, + 21888242871839275222246405745257275088548364400416034343698203776886614864010, + 292636259486490, + 21888242871839275222246405745257275088548364400416034343698203711675836170866, + 239162529358411, + 21888242871839275222246405745257275088548364400416034343698204070926008022624, + 373140855356363, + 21888242871839275222246405745257275088548364400416034343698203808402007467720, + 487664860076432, + 21888242871839275222246405745257275088548364400416034343698203786248256029981, + 272841289713027, + 21888242871839275222246405745257275088548364400416034343698203997362446859401, + 21888242871839275222246405745257275088548364400416034343698204023516454308636, + 197751892437442, + 491063053337122, + 21888242871839275222246405745257275088548364400416034343698203980623951792595, + 21888242871839275222246405745257275088548364400416034343698203745670378432902, + 233521073448252, + 546743595728914, + 21888242871839275222246405745257275088548364400416034343698204057209599630042, + 21888242871839275222246405745257275088548364400416034343698203782473368734246, + 21888242871839275222246405745257275088548364400416034343698203737105830700561, + 21888242871839275222246405745257275088548364400416034343698203725306631715681, + 21888242871839275222246405745257275088548364400416034343698204080094085812911, + 21888242871839275222246405745257275088548364400416034343698204026858058916296, + 21888242871839275222246405745257275088548364400416034343698203897826223370133, + 21888242871839275222246405745257275088548364400416034343698203723526388817347, + 21888242871839275222246405745257275088548364400416034343698203767177149346657, + 152644173200115, + 21888242871839275222246405745257275088548364400416034343698203968808804838470, + 396945411017299, + 212164717776821, + 131580814243726, + 409143586816351, + 282272204761395, + 117337582565728, + 396690889715802, + 458016929956493, + 21888242871839275222246405745257275088548364400416034343698203751833980935920, + 387421544462526, + 537122589637003, + 166816273667532, + 21888242871839275222246405745257275088548364400416034343698203886574896025082, + 55422035429822, + 21888242871839275222246405745257275088548364400416034343698203699489023338277, + 524551757932312, + 21888242871839275222246405745257275088548364400416034343698203892298497992263, + 487360078611378, + 21888242871839275222246405745257275088548364400416034343698203791217561898365, + 21888242871839275222246405745257275088548364400416034343698203801920238319008, + 501336321537445, + 21888242871839275222246405745257275088548364400416034343698203749523300180917, + 168102783699384, + 139427435096732, + 279685679685045, + 21888242871839275222246405745257275088548364400416034343698203990859042675698, + 488014821194664, + 21888242871839275222246405745257275088548364400416034343698203885692068254149, + 243520283261681, + 109213565751185, + 124070732261438, + 21888242871839275222246405745257275088548364400416034343698203821840342554786, + 21888242871839275222246405745257275088548364400416034343698204014771796921791, + 347810965521153, + 21888242871839275222246405745257275088548364400416034343698203876619066071323, + 498354349160773, + 359116465031431, + 21888242871839275222246405745257275088548364400416034343698203858610957340513, + 327585792966241, + 21888242871839275222246405745257275088548364400416034343698203784245075177204, + 21888242871839275222246405745257275088548364400416034343698203695299208825909, + 21888242871839275222246405745257275088548364400416034343698204061022371161394, + 52027600314404, + 21888242871839275222246405745257275088548364400416034343698203803454473375521, + 21888242871839275222246405745257275088548364400416034343698203674449347870186, + 485885796530494, + 21888242871839275222246405745257275088548364400416034343698203843540227239766, + 3334540341599, + 21888242871839275222246405745257275088548364400416034343698203755233420796108, + 21888242871839275222246405745257275088548364400416034343698203949714130984809, + 9299844143160, + 15800665689575, + 21888242871839275222246405745257275088548364400416034343698204110844172591338, + 289820517690016, + 21888242871839275222246405745257275088548364400416034343698204050198086594541, + 21888242871839275222246405745257275088548364400416034343698203743989532699963, + 405169365066250, + 148153946755931, + 21888242871839275222246405745257275088548364400416034343698203933049821844990, + 21888242871839275222246405745257275088548364400416034343698203787983908779653, + 21888242871839275222246405745257275088548364400416034343698204063795990640318, + 190494369186541, + 80181094178926, + 67558519509576, + 21888242871839275222246405745257275088548364400416034343698204031657539104098, + 21888242871839275222246405745257275088548364400416034343698203833391068168753, + 341930692813178, + 364759788995125, + 21888242871839275222246405745257275088548364400416034343698204050746418103434, + 21888242871839275222246405745257275088548364400416034343698203998057682627874, + 21888242871839275222246405745257275088548364400416034343698204097759684972840, + 490297705279052, + 493522458884061, + 424794221722312, + 233539387252801, + 450053255310083, + 3839154718378, + 21888242871839275222246405745257275088548364400416034343698204146399293351230, + 147605251065710, + 376462403231944, + 264040228663430, + 21888242871839275222246405745257275088548364400416034343698203853514999762258, + 326840421737367, + 21888242871839275222246405745257275088548364400416034343698203935343857959109, + 232875725726234, + 8662895064570, + 21888242871839275222246405745257275088548364400416034343698203815539858916593, + 21888242871839275222246405745257275088548364400416034343698203890349675793285, + 21888242871839275222246405745257275088548364400416034343698204064307162160007, + 191985272337316, + 21888242871839275222246405745257275088548364400416034343698203897910827202661, + 21888242871839275222246405745257275088548364400416034343698203949242019145938, + 21888242871839275222246405745257275088548364400416034343698203954155681340785, + 21888242871839275222246405745257275088548364400416034343698203651985794571722, + 329762466889333, + 313233026766256, + 21888242871839275222246405745257275088548364400416034343698204106357169634350, + 21888242871839275222246405745257275088548364400416034343698203838902383832077, + 500845277506094, + 21888242871839275222246405745257275088548364400416034343698203720076098822666, + 19913480185489, + 169868629121287, + 21888242871839275222246405745257275088548364400416034343698203657614436819821, + 21888242871839275222246405745257275088548364400416034343698203730498492740635, + 21888242871839275222246405745257275088548364400416034343698203681998939697945, + 342734562664798, + 21888242871839275222246405745257275088548364400416034343698204184261193893883, + 167373414749472, + 21888242871839275222246405745257275088548364400416034343698203896561616300053, + 21888242871839275222246405745257275088548364400416034343698203928853771597418, + 344419375014694, + 21888242871839275222246405745257275088548364400416034343698203808095553031943, + 464738061142460, + 41558011061663, + 409609238745390, + 21888242871839275222246405745257275088548364400416034343698203885262322562923, + 21888242871839275222246405745257275088548364400416034343698203715774125068427, + 21888242871839275222246405745257275088548364400416034343698203795282369178786, + 422011531570033, + 461866996694683, + 418663222442479, + 468479008752911, + 21888242871839275222246405745257275088548364400416034343698204091053563376114, + 410901430218489, + 87090946376480, + 436442322150310, + 21888242871839275222246405745257275088548364400416034343698203833070813614066, + 21888242871839275222246405745257275088548364400416034343698204143523776784785, + 21888242871839275222246405745257275088548364400416034343698203827808199955572, + 60649153786987, + 21888242871839275222246405745257275088548364400416034343698203633136218321104, + 21888242871839275222246405745257275088548364400416034343698204125736958959734, + 480145977897251, + 513150706560802, + 21888242871839275222246405745257275088548364400416034343698204037991181582402, + 68985204232657, + 54812812089854, + 509765104182287, + 21888242871839275222246405745257275088548364400416034343698203706851672227786, + 179737629579287, + 21888242871839275222246405745257275088548364400416034343698203711988118761022, + 157355750694209, + 459646508762583, + 79285948616043, + 483305847694234, + 21888242871839275222246405745257275088548364400416034343698203982060111309884, + 21888242871839275222246405745257275088548364400416034343698204161851641648161, + 21888242871839275222246405745257275088548364400416034343698204017483905292470, + 21888242871839275222246405745257275088548364400416034343698203800119574680331, + 21888242871839275222246405745257275088548364400416034343698203828257066519320, + 122306499693553, + 76500734841243, + 468045351716783, + 21888242871839275222246405745257275088548364400416034343698204129069386618994, + 501106230023159, + 21888242871839275222246405745257275088548364400416034343698204066293758178556, + 284087488156323, + 58392726023749, + 533439907848073, + 21888242871839275222246405745257275088548364400416034343698203712665652889758, + 176882777040354, + 21888242871839275222246405745257275088548364400416034343698204180182343499731, + 21888242871839275222246405745257275088548364400416034343698204093282994800848, + 70612669927486, + 37776220279786, + 21888242871839275222246405745257275088548364400416034343698204067885075468587, + 21888242871839275222246405745257275088548364400416034343698203962997666507129, + 560398830784332, + 541308695187819, + 21888242871839275222246405745257275088548364400416034343698203653410594741249, + 33966792842721, + 298941462290756, + 21888242871839275222246405745257275088548364400416034343698203704640183664948, + 21888242871839275222246405745257275088548364400416034343698203776334657828687, + 21888242871839275222246405745257275088548364400416034343698203965007276465166, + 36644735367399, + 21888242871839275222246405745257275088548364400416034343698203783289556414886, + 368160279873225, + 197808973190587, + 21888242871839275222246405745257275088548364400416034343698204162030375735825, + 21888242871839275222246405745257275088548364400416034343698203927033839983851, + 21888242871839275222246405745257275088548364400416034343698203675919242029888, + 21888242871839275222246405745257275088548364400416034343698203871742672436282, + 403686980596736, + 21888242871839275222246405745257275088548364400416034343698203624201833774797, + 46649815837420, + 21888242871839275222246405745257275088548364400416034343698203988658771691747, + 538953634541160, + 21888242871839275222246405745257275088548364400416034343698204166659275033591, + 21888242871839275222246405745257275088548364400416034343698203977580420744382, + 549529944152988, + 21888242871839275222246405745257275088548364400416034343698203969308069383441, + 21888242871839275222246405745257275088548364400416034343698203632442421961357, + 21888242871839275222246405745257275088548364400416034343698204041574594785998, + 35600614794891, + 520691999096198, + 287761861113984, + 21888242871839275222246405745257275088548364400416034343698203952002733036680, + 169527495451998, + 373727510501171, + 21888242871839275222246405745257275088548364400416034343698204150517289791590, + 180532676342471, + 21888242871839275222246405745257275088548364400416034343698203994399644178937, + 21888242871839275222246405745257275088548364400416034343698203994938836554909, + 22205659410212, + 133369336932711, + 21888242871839275222246405745257275088548364400416034343698204021687940547598, + 223976713369474, + 21888242871839275222246405745257275088548364400416034343698203964318972054074, + 21888242871839275222246405745257275088548364400416034343698203880428066695016, + 21888242871839275222246405745257275088548364400416034343698203628650058772908, + 21888242871839275222246405745257275088548364400416034343698204060150089430164, + 21888242871839275222246405745257275088548364400416034343698203706075160320727, + 21888242871839275222246405745257275088548364400416034343698204062785480030293, + 118815836581580, + 21888242871839275222246405745257275088548364400416034343698203722290460747064, + 251773447032233, + 255092391330320, + 21888242871839275222246405745257275088548364400416034343698204160956239101204, + 21888242871839275222246405745257275088548364400416034343698203831382409834248, + 21888242871839275222246405745257275088548364400416034343698203892464904705367, + 84124585693587, + 21888242871839275222246405745257275088548364400416034343698203700761251498044, + 21888242871839275222246405745257275088548364400416034343698204080214448232229, + 72529578256503, + 266383250695847, + 561693166383019, + 495430670061089, + 23143348673070, + 440050620347175, + 21888242871839275222246405745257275088548364400416034343698204059361374808447, + 21888242871839275222246405745257275088548364400416034343698204120105089334372, + 21888242871839275222246405745257275088548364400416034343698203719449354823504, + 21888242871839275222246405745257275088548364400416034343698204106646173883450, + 520714721613563, + 528873446150003, + 21888242871839275222246405745257275088548364400416034343698203784549958472565, + 21888242871839275222246405745257275088548364400416034343698204027195550118630, + 139311081264668, + 20787478064294, + 288199493276829, + 21888242871839275222246405745257275088548364400416034343698204027855356467684, + 137909647276781, + 52356854533121, + 562085317995626, + 21888242871839275222246405745257275088548364400416034343698203661833099712017, + 21888242871839275222246405745257275088548364400416034343698204135424904050906, + 508187405476263, + 241202459370986, + 21888242871839275222246405745257275088548364400416034343698204019087542609568, + 21888242871839275222246405745257275088548364400416034343698204107105673526389, + 21888242871839275222246405745257275088548364400416034343698203951441097465673, + 268264355529220, + 21888242871839275222246405745257275088548364400416034343698204058652413420573, + 6326655517270, + 21888242871839275222246405745257275088548364400416034343698203690293853229592, + 21888242871839275222246405745257275088548364400416034343698203989573103434359, + 348214291223855, + 21888242871839275222246405745257275088548364400416034343698203763384313688395, + 26041572724116, + 21888242871839275222246405745257275088548364400416034343698203923873470121219, + 21888242871839275222246405745257275088548364400416034343698203836448249644649, + 21888242871839275222246405745257275088548364400416034343698203650382516048179, + 179597045933649, + 334679587519890, + 21888242871839275222246405745257275088548364400416034343698204142331160386601, + 21888242871839275222246405745257275088548364400416034343698203788711846453362, + 110655892791628, + 21888242871839275222246405745257275088548364400416034343698203872169990336206, + 531584686004464, + 21888242871839275222246405745257275088548364400416034343698203896988764743206, + 21888242871839275222246405745257275088548364400416034343698204130675623752280, + 21888242871839275222246405745257275088548364400416034343698203721556698308833, + 416900134400406, + 344550500936359, + 201275907587796, + 21888242871839275222246405745257275088548364400416034343698203965775262016843, + 120983470152231, + 21888242871839275222246405745257275088548364400416034343698204006679547173263, + 21888242871839275222246405745257275088548364400416034343698203687675365755420, + 122720030404668, + 274600364898123, + 21888242871839275222246405745257275088548364400416034343698204151992610252613, + 21888242871839275222246405745257275088548364400416034343698204167623040413770, + 21888242871839275222246405745257275088548364400416034343698203691052541615097, + 501317829879225, + 171420688123381, + 21888242871839275222246405745257275088548364400416034343698204071202145037788, + 21888242871839275222246405745257275088548364400416034343698203780362623667044, + 21888242871839275222246405745257275088548364400416034343698204163766285963841, + 21888242871839275222246405745257275088548364400416034343698203810532058813380, + 21888242871839275222246405745257275088548364400416034343698203981140311702885, + 381122973039467, + 21888242871839275222246405745257275088548364400416034343698204036572457889726, + 258350749580714, + 11289040427675, + 21888242871839275222246405745257275088548364400416034343698203878571397891746, + 119785563417964, + 439471621622823, + 21888242871839275222246405745257275088548364400416034343698203717674090392898, + 530295995107375, + 129813450365837, + 21888242871839275222246405745257275088548364400416034343698203635210321137643, + 408357208847479, + 476097428028692, + 21888242871839275222246405745257275088548364400416034343698204123291284042146, + 440506944360157, + 420354168358120, + 185346477446167, + 12695799413894, + 462436499584623, + 21888242871839275222246405745257275088548364400416034343698203635466061909974, + 21888242871839275222246405745257275088548364400416034343698203800212004461335, + 21888242871839275222246405745257275088548364400416034343698203802917567954500, + 298700563011068, + 13195367701294, + 7912812716708, + 62241428155556, + 434728184635772, + 21888242871839275222246405745257275088548364400416034343698203675725419329020, + 457009089792571, + 185179566857981, + 21888242871839275222246405745257275088548364400416034343698203626620146507759, + 541283218236964, + 389707874320708, + 21888242871839275222246405745257275088548364400416034343698204104649363720061, + 393287732961966, + 21888242871839275222246405745257275088548364400416034343698203901265956415655, + 430892144108405, + 21888242871839275222246405745257275088548364400416034343698204034194361348659, + 332813935069051, + 250436263848878, + 21888242871839275222246405745257275088548364400416034343698204135350804144301, + 28902100849196, + 21888242871839275222246405745257275088548364400416034343698203779072981747906, + 21888242871839275222246405745257275088548364400416034343698203748042006334935, + 423393653578438, + 21888242871839275222246405745257275088548364400416034343698204080653957706738, + 12353718465333, + 21888242871839275222246405745257275088548364400416034343698203699531401062514, + 21888242871839275222246405745257275088548364400416034343698204165481764651964, + 21888242871839275222246405745257275088548364400416034343698203990336845037351, + 173724852012206, + 21888242871839275222246405745257275088548364400416034343698203830894648013048, + 21888242871839275222246405745257275088548364400416034343698204107206468645336, + 21888242871839275222246405745257275088548364400416034343698203769369515440801, + 432879098357613, + 21888242871839275222246405745257275088548364400416034343698204049476308103571, + 497742099309160, + 25457154897965, + 21888242871839275222246405745257275088548364400416034343698204118858015461066, + 444045612904266, + 100387556287237, + 21888242871839275222246405745257275088548364400416034343698203949559022546682, + 21888242871839275222246405745257275088548364400416034343698203665848405977966, + 532803017358102, + 515110585435799, + 21888242871839275222246405745257275088548364400416034343698203663560803039429, + 90348135678339, + 221751408666117, + 21888242871839275222246405745257275088548364400416034343698203764357070550205, + 21888242871839275222246405745257275088548364400416034343698204176461093636186, + 21888242871839275222246405745257275088548364400416034343698203949333532908594, + 113340318355446, + 21888242871839275222246405745257275088548364400416034343698203722892941507971, + 21888242871839275222246405745257275088548364400416034343698204007807210395363, + 234966221012331, + 21888242871839275222246405745257275088548364400416034343698203809732920655504, + 511824276811611, + 279287079124360, + 21888242871839275222246405745257275088548364400416034343698203778175752749965, + 21888242871839275222246405745257275088548364400416034343698203725563545516539, + 21888242871839275222246405745257275088548364400416034343698203778036149791054, + 184614032087515, + 506591403631569, + 21888242871839275222246405745257275088548364400416034343698204102896067213519, + 21888242871839275222246405745257275088548364400416034343698203864542577742296, + 407382815056559, + 21888242871839275222246405745257275088548364400416034343698203898597872941401, + 21888242871839275222246405745257275088548364400416034343698204158718380267064, + 56176034513912, + 282358368086033, + 31257893334829, + 522150634131700, + 244952183609990, + 21888242871839275222246405745257275088548364400416034343698203729874034020622, + 364632286505213, + 55735773498578, + 464494080642081, + 21888242871839275222246405745257275088548364400416034343698203836224963602964, + 21888242871839275222246405745257275088548364400416034343698203845136242066658, + 21888242871839275222246405745257275088548364400416034343698203919583937114512, + 21888242871839275222246405745257275088548364400416034343698204152679336205247, + 363834854404289, + 207906325693427, + 21888242871839275222246405745257275088548364400416034343698204119655213421658, + 73643310425262, + 368420659290318, + 463765133492404, + 21239260216824, + 21888242871839275222246405745257275088548364400416034343698204104974964401587, + 21888242871839275222246405745257275088548364400416034343698204034868831420662, + 21888242871839275222246405745257275088548364400416034343698204014989544751600, + 149995882192379, + 70693397168219, + 21888242871839275222246405745257275088548364400416034343698203727682658825743, + 21888242871839275222246405745257275088548364400416034343698203947723752995010, + 329155830726522, + 401379737812629, + 21888242871839275222246405745257275088548364400416034343698204067334959234378, + 132880116412943, + 314623904393961, + 498193532538081, + 410748644282722, + 42858649562624, + 21888242871839275222246405745257275088548364400416034343698203991576245792091, + 21888242871839275222246405745257275088548364400416034343698203917171971197649, + 293290043947622, + 21888242871839275222246405745257275088548364400416034343698203913093311216068, + 515694709844772, + 296603355688500, + 21888242871839275222246405745257275088548364400416034343698204149143548130241, + 21888242871839275222246405745257275088548364400416034343698203690092098414692, + 21888242871839275222246405745257275088548364400416034343698204003059761618356, + 21888242871839275222246405745257275088548364400416034343698204175375567250560, + 21888242871839275222246405745257275088548364400416034343698204114886203165467, + 21888242871839275222246405745257275088548364400416034343698203716159587961860, + 19663636949380, + 402208796958856, + 21888242871839275222246405745257275088548364400416034343698203652702926872807, + 203454401953241, + 36259365640704, + 406995606037926, + 21888242871839275222246405745257275088548364400416034343698204005839551864479, + 10120246741875, + 21888242871839275222246405745257275088548364400416034343698204057605092874154, + 21888242871839275222246405745257275088548364400416034343698203708323452887333, + 21888242871839275222246405745257275088548364400416034343698203949947862303367, + 21888242871839275222246405745257275088548364400416034343698204071952681946624, + 130550056435806, + 21888242871839275222246405745257275088548364400416034343698203755904949826123, + 545040918228177, + 21888242871839275222246405745257275088548364400416034343698204112180026071106, + 306331487253895, + 277150671956007, + 79587297605534, + 21888242871839275222246405745257275088548364400416034343698204080785678919467, + 21888242871839275222246405745257275088548364400416034343698204057788943179643, + 418574429903210, + 21888242871839275222246405745257275088548364400416034343698203849325506361708, + 21888242871839275222246405745257275088548364400416034343698204052789461057334, + 43025367044391, + 183152866455483, + 21888242871839275222246405745257275088548364400416034343698203954388181889511, + 21888242871839275222246405745257275088548364400416034343698203741364204688020, + 204156239777540, + 21888242871839275222246405745257275088548364400416034343698204136161982507223, + 67514655067644, + 21888242871839275222246405745257275088548364400416034343698203881498746966842, + 21888242871839275222246405745257275088548364400416034343698204133009602727154, + 21888242871839275222246405745257275088548364400416034343698204125164507673871, + 147037546315978, + 21888242871839275222246405745257275088548364400416034343698204121010800882969, + 97409571483135, + 528546188208845, + 21888242871839275222246405745257275088548364400416034343698204103539970480836, + 290460411510180, + 21888242871839275222246405745257275088548364400416034343698204039852717524854, + 443815378911226, + 308945288783533, + 113672943287734, + 436664932823635, + 174394099323521, + 21888242871839275222246405745257275088548364400416034343698204054539070633135, + 432380517604311, + 21888242871839275222246405745257275088548364400416034343698203868375320298895, + 185232842302956, + 126505475294915, + 487013128016333, + 360746602946753, + 196766734947435, + 21888242871839275222246405745257275088548364400416034343698203744750247414064, + 125988705576051, + 367047419736332, + 21888242871839275222246405745257275088548364400416034343698204166930620468350, + 21888242871839275222246405745257275088548364400416034343698204157206158249130, + 6668194492166, + 21888242871839275222246405745257275088548364400416034343698203899135554877758, + 479754406049543, + 21888242871839275222246405745257275088548364400416034343698203655834199921058, + 354512855148008, + 69132558038227, + 376428938856372, + 414367589639788, + 219822746649292, + 21888242871839275222246405745257275088548364400416034343698204025804011397996, + 554441006115516, + 515776535878713, + 21888242871839275222246405745257275088548364400416034343698204076252956871050, + 129137970453227, + 21888242871839275222246405745257275088548364400416034343698204078207765138797, + 554670562709571, + 21888242871839275222246405745257275088548364400416034343698203673739906778618, + 21888242871839275222246405745257275088548364400416034343698203658677102651411, + 278618752723990, + 549733461423655, + 77034805240617, + 21888242871839275222246405745257275088548364400416034343698203966512582468769, + 531064564099544, + 21888242871839275222246405745257275088548364400416034343698203991990214261339, + 271786978098172, + 21888242871839275222246405745257275088548364400416034343698203953275160863821, + 442017134667448, + 347992778417816, + 561490619245054, + 186245217317265, + 457919774367662, + 658576114848, + 21888242871839275222246405745257275088548364400416034343698204136671590908114, + 21888242871839275222246405745257275088548364400416034343698204043072537073832, + 363404821793892, + 164910007348430, + 152421169440591, + 21888242871839275222246405745257275088548364400416034343698203657490145949798, + 32762967168938, + 21888242871839275222246405745257275088548364400416034343698203946151729987371, + 242688031164305, + 431029895887472, + 151332890457856, + 21888242871839275222246405745257275088548364400416034343698204042314132697940, + 5552239011308, + 21888242871839275222246405745257275088548364400416034343698204108256118805984, + 21888242871839275222246405745257275088548364400416034343698203816784139286285, + 223822779168986, + 255529784065198, + 494734688649826, + 21888242871839275222246405745257275088548364400416034343698204139665215204654, + 21888242871839275222246405745257275088548364400416034343698204058802023035157, + 21888242871839275222246405745257275088548364400416034343698203736601943473677, + 21888242871839275222246405745257275088548364400416034343698203843616191328323, + 224716264951227, + 237383361608186, + 21888242871839275222246405745257275088548364400416034343698203987867917565208, + 21888242871839275222246405745257275088548364400416034343698203672610761060110, + 433875597498692, + 21888242871839275222246405745257275088548364400416034343698203993041031112693, + 377020548394716, + 70029235018831, + 74681542101171, + 543308942187116, + 177965601502713, + 117386164301567, + 13238623968825, + 552395858810696, + 21888242871839275222246405745257275088548364400416034343698203923153312448165, + 21888242871839275222246405745257275088548364400416034343698204052527261335381, + 531696703871625, + 21888242871839275222246405745257275088548364400416034343698204035667154836630, + 21888242871839275222246405745257275088548364400416034343698203943359717611487, + 126402156541857, + 21888242871839275222246405745257275088548364400416034343698203692166173521268, + 59905487584967, + 47508643080133, + 406630270789249, + 21888242871839275222246405745257275088548364400416034343698203915772346620206, + 21888242871839275222246405745257275088548364400416034343698204099719736277058, + 96199972346073, + 337739687109046, + ]), + Polynomial::new([ + 21888242871839275222246405745257275088548364400416034343698203963495342108540, + 267793469687009, + 21888242871839275222246405745257275088548364400416034343698203624113211455476, + 21888242871839275222246405745257275088548364400416034343698203848501134050739, + 21888242871839275222246405745257275088548364400416034343698204155166013046649, + 4755266208150, + 82083127130760, + 459624561309285, + 21888242871839275222246405745257275088548364400416034343698203782700121510727, + 21888242871839275222246405745257275088548364400416034343698204145625582698022, + 21888242871839275222246405745257275088548364400416034343698204154544688588587, + 373622727701811, + 21888242871839275222246405745257275088548364400416034343698203766176977709733, + 192476481033448, + 21888242871839275222246405745257275088548364400416034343698204110266055747189, + 160782897793973, + 21888242871839275222246405745257275088548364400416034343698203740270076597443, + 21888242871839275222246405745257275088548364400416034343698203645753167235275, + 21888242871839275222246405745257275088548364400416034343698204006522880098509, + 21888242871839275222246405745257275088548364400416034343698203976253817941087, + 502729740455467, + 245085784649475, + 21888242871839275222246405745257275088548364400416034343698203704428471406069, + 21888242871839275222246405745257275088548364400416034343698203842979364566225, + 21888242871839275222246405745257275088548364400416034343698203777214031564496, + 350871292255110, + 21888242871839275222246405745257275088548364400416034343698203670064243000412, + 21888242871839275222246405745257275088548364400416034343698203701673795912159, + 21888242871839275222246405745257275088548364400416034343698203766020319537411, + 21888242871839275222246405745257275088548364400416034343698203945797892908384, + 21888242871839275222246405745257275088548364400416034343698203813271666616144, + 139907046346703, + 101649288523027, + 21888242871839275222246405745257275088548364400416034343698203831632636613243, + 166198397943819, + 316420432096040, + 21888242871839275222246405745257275088548364400416034343698204105813245112519, + 291442589925534, + 21888242871839275222246405745257275088548364400416034343698203762596628075162, + 262937835438958, + 124129160261396, + 518387987951623, + 21888242871839275222246405745257275088548364400416034343698203713969027216899, + 171747274867515, + 21888242871839275222246405745257275088548364400416034343698203879108477624349, + 21888242871839275222246405745257275088548364400416034343698203895329264637901, + 21888242871839275222246405745257275088548364400416034343698204168060217794551, + 21888242871839275222246405745257275088548364400416034343698204012642474297675, + 323971016957932, + 436433070394543, + 21888242871839275222246405745257275088548364400416034343698203928029515359817, + 21888242871839275222246405745257275088548364400416034343698204057456825914673, + 314378770904034, + 392762884083681, + 228898303158812, + 299167131363640, + 314367656723920, + 21888242871839275222246405745257275088548364400416034343698203739608407083985, + 57121020403400, + 25790740737939, + 225899854160846, + 233400084642120, + 21888242871839275222246405745257275088548364400416034343698203727938774640596, + 333033800936499, + 78786723766643, + 21888242871839275222246405745257275088548364400416034343698203685402926202421, + 21888242871839275222246405745257275088548364400416034343698204118335518718805, + 54213576403619, + 21888242871839275222246405745257275088548364400416034343698203632616767356975, + 135631061078351, + 491067139730732, + 97475959722622, + 518546746300154, + 21888242871839275222246405745257275088548364400416034343698204034154094963147, + 130835912662911, + 21888242871839275222246405745257275088548364400416034343698203934323405800887, + 21888242871839275222246405745257275088548364400416034343698203945267247218348, + 93390927997043, + 21888242871839275222246405745257275088548364400416034343698203731709967430938, + 270436371446955, + 21888242871839275222246405745257275088548364400416034343698203634860228140630, + 336613573572684, + 389580567279392, + 21888242871839275222246405745257275088548364400416034343698204163902832412703, + 21888242871839275222246405745257275088548364400416034343698204138206813724337, + 21888242871839275222246405745257275088548364400416034343698204144928169466539, + 65783814020070, + 182178173619768, + 21888242871839275222246405745257275088548364400416034343698204165609203066841, + 21888242871839275222246405745257275088548364400416034343698204051890858651816, + 68357228583290, + 549231547092914, + 21888242871839275222246405745257275088548364400416034343698204051031740421549, + 21888242871839275222246405745257275088548364400416034343698204085970811236657, + 21888242871839275222246405745257275088548364400416034343698203888077223184887, + 224563292562303, + 168229677246845, + 21888242871839275222246405745257275088548364400416034343698203736014124885456, + 21888242871839275222246405745257275088548364400416034343698203949336058306561, + 21888242871839275222246405745257275088548364400416034343698204170534721469362, + 428527630910175, + 21888242871839275222246405745257275088548364400416034343698203943884263125465, + 306257251409276, + 21888242871839275222246405745257275088548364400416034343698203773167608609289, + 493317429417173, + 448391426399296, + 444336355226083, + 102961563369685, + 21888242871839275222246405745257275088548364400416034343698203878361431039282, + 273948428606970, + 13868051279963, + 21888242871839275222246405745257275088548364400416034343698204154249596855141, + 21888242871839275222246405745257275088548364400416034343698203660472676512858, + 21888242871839275222246405745257275088548364400416034343698203810387792156640, + 168946612859615, + 21888242871839275222246405745257275088548364400416034343698204106401090794413, + 506029071442332, + 533055030762331, + 21888242871839275222246405745257275088548364400416034343698203912328161290888, + 21888242871839275222246405745257275088548364400416034343698204109255788694209, + 91977418988629, + 21888242871839275222246405745257275088548364400416034343698204018320669695795, + 335966900424051, + 145896996934764, + 21888242871839275222246405745257275088548364400416034343698203811080021613478, + 397599638198886, + 121718723324045, + 21888242871839275222246405745257275088548364400416034343698204119556225110534, + 184192812006154, + 83137760700198, + 21888242871839275222246405745257275088548364400416034343698203784238677202501, + 66918453689680, + 21888242871839275222246405745257275088548364400416034343698204157035043329208, + 297199751606446, + 21888242871839275222246405745257275088548364400416034343698204131358195626432, + 283227308331, + 21888242871839275222246405745257275088548364400416034343698204167142989293538, + 9037336614349, + 21888242871839275222246405745257275088548364400416034343698203756689935319400, + 179056346776272, + 548374581516257, + 21888242871839275222246405745257275088548364400416034343698203875630218286281, + 255776770342058, + 21888242871839275222246405745257275088548364400416034343698203776497547122205, + 4617647631739, + 238605029457333, + 21888242871839275222246405745257275088548364400416034343698203952083276823179, + 533193758591627, + 21888242871839275222246405745257275088548364400416034343698203715592015838658, + 197326762981843, + 453743175541259, + 138860797271208, + 379507868361616, + 21888242871839275222246405745257275088548364400416034343698203806801619500057, + 21888242871839275222246405745257275088548364400416034343698203703545268735336, + 21888242871839275222246405745257275088548364400416034343698203987326264849815, + 421799529060870, + 21888242871839275222246405745257275088548364400416034343698204184079722191466, + 268367707572349, + 21888242871839275222246405745257275088548364400416034343698203707352096924709, + 301723288651296, + 21888242871839275222246405745257275088548364400416034343698204121431235877450, + 21888242871839275222246405745257275088548364400416034343698204071235062422144, + 63802564739943, + 21888242871839275222246405745257275088548364400416034343698203937642964482502, + 201387482733293, + 34829137875572, + 352651551848979, + 21888242871839275222246405745257275088548364400416034343698203911888353013287, + 21888242871839275222246405745257275088548364400416034343698203660182599684624, + 21888242871839275222246405745257275088548364400416034343698204175788516282490, + 21888242871839275222246405745257275088548364400416034343698204087858362508679, + 21888242871839275222246405745257275088548364400416034343698203656686475040266, + 21888242871839275222246405745257275088548364400416034343698204168268844388208, + 378237383761579, + 21888242871839275222246405745257275088548364400416034343698204082937235410117, + 31724151350225, + 21888242871839275222246405745257275088548364400416034343698204083050277409567, + 21888242871839275222246405745257275088548364400416034343698203651331285683274, + 21888242871839275222246405745257275088548364400416034343698203852965770094713, + 21888242871839275222246405745257275088548364400416034343698203845667417403203, + 21888242871839275222246405745257275088548364400416034343698203866865342466834, + 21888242871839275222246405745257275088548364400416034343698203845311881989218, + 21888242871839275222246405745257275088548364400416034343698204081935822785404, + 21888242871839275222246405745257275088548364400416034343698203659330516020932, + 21888242871839275222246405745257275088548364400416034343698203649569902556159, + 21888242871839275222246405745257275088548364400416034343698203641107609182987, + 156805746373684, + 21888242871839275222246405745257275088548364400416034343698203892590146029133, + 166692043837719, + 21888242871839275222246405745257275088548364400416034343698204004340187662211, + 351631707151990, + 21888242871839275222246405745257275088548364400416034343698203841095259446781, + 21888242871839275222246405745257275088548364400416034343698204007705818493563, + 21888242871839275222246405745257275088548364400416034343698203854810212429642, + 21888242871839275222246405745257275088548364400416034343698204058311618895896, + 21888242871839275222246405745257275088548364400416034343698203864522741251975, + 21888242871839275222246405745257275088548364400416034343698203891489408085024, + 530103556251830, + 21888242871839275222246405745257275088548364400416034343698203792638069056986, + 69761871043407, + 232029684280743, + 21888242871839275222246405745257275088548364400416034343698203803747045745587, + 163580873711392, + 21888242871839275222246405745257275088548364400416034343698204120063508160343, + 133651105102383, + 105621569666801, + 21888242871839275222246405745257275088548364400416034343698203947708653846095, + 32092373078819, + 127550045917666, + 21888242871839275222246405745257275088548364400416034343698203690602133607957, + 21888242871839275222246405745257275088548364400416034343698203719860405975545, + 142676044783955, + 21888242871839275222246405745257275088548364400416034343698204016574966611870, + 484463477619765, + 384602379397424, + 21888242871839275222246405745257275088548364400416034343698204067402460469924, + 258351456428183, + 21888242871839275222246405745257275088548364400416034343698203718028688881654, + 21888242871839275222246405745257275088548364400416034343698204027813686571391, + 483852550192205, + 200800205548135, + 386242876448707, + 21888242871839275222246405745257275088548364400416034343698204041566739705031, + 21888242871839275222246405745257275088548364400416034343698203867449368573072, + 21888242871839275222246405745257275088548364400416034343698204153384361447468, + 65868009726326, + 21888242871839275222246405745257275088548364400416034343698203630790539484419, + 338253528743487, + 21888242871839275222246405745257275088548364400416034343698203651821385877190, + 250538074771802, + 38294070159142, + 21888242871839275222246405745257275088548364400416034343698203954232105875323, + 21888242871839275222246405745257275088548364400416034343698204155919140262312, + 554773388439473, + 21888242871839275222246405745257275088548364400416034343698203754398419608468, + 491352192793744, + 21888242871839275222246405745257275088548364400416034343698203896057158755386, + 21888242871839275222246405745257275088548364400416034343698203770107786613174, + 21888242871839275222246405745257275088548364400416034343698203637004920674959, + 422287708455552, + 21888242871839275222246405745257275088548364400416034343698203818531470124357, + 21888242871839275222246405745257275088548364400416034343698203796366504356729, + 393438105296157, + 391530625532101, + 21888242871839275222246405745257275088548364400416034343698204040336562830287, + 496166601662210, + 21888242871839275222246405745257275088548364400416034343698203918602500530136, + 365867715859589, + 21888242871839275222246405745257275088548364400416034343698203811004307059233, + 160911583867019, + 229990174214251, + 21888242871839275222246405745257275088548364400416034343698203795080128983993, + 352033956169277, + 21888242871839275222246405745257275088548364400416034343698203662382978168658, + 21888242871839275222246405745257275088548364400416034343698204024646014474265, + 384940288272598, + 380561878206229, + 21888242871839275222246405745257275088548364400416034343698203832673516038504, + 21888242871839275222246405745257275088548364400416034343698204138757877797847, + 21888242871839275222246405745257275088548364400416034343698204164448241232984, + 21888242871839275222246405745257275088548364400416034343698203657280172294674, + 146743333542154, + 175181871712028, + 21888242871839275222246405745257275088548364400416034343698203986896263243870, + 21888242871839275222246405745257275088548364400416034343698203874406880738571, + 21888242871839275222246405745257275088548364400416034343698204015777219494652, + 21888242871839275222246405745257275088548364400416034343698203641028004541912, + 21888242871839275222246405745257275088548364400416034343698203701070488214778, + 212483266994972, + 21888242871839275222246405745257275088548364400416034343698204002631360228893, + 30363969443400, + 188647203898580, + 139542043092563, + 21269979356535, + 387933094198131, + 527446096940904, + 271282617362745, + 2589995755615, + 21888242871839275222246405745257275088548364400416034343698204111359270651149, + 21888242871839275222246405745257275088548364400416034343698203737719369508287, + 110263173955863, + 21888242871839275222246405745257275088548364400416034343698203912649534365791, + 76843851794032, + 21888242871839275222246405745257275088548364400416034343698203682118338600131, + 462095899078904, + 262519701788767, + 21888242871839275222246405745257275088548364400416034343698203839406686052268, + 21888242871839275222246405745257275088548364400416034343698203740382239085738, + 21888242871839275222246405745257275088548364400416034343698203766186550418308, + 21888242871839275222246405745257275088548364400416034343698204080133261519867, + 21888242871839275222246405745257275088548364400416034343698204104893479254629, + 21888242871839275222246405745257275088548364400416034343698203745159935741551, + 21888242871839275222246405745257275088548364400416034343698204069105730873738, + 21888242871839275222246405745257275088548364400416034343698203686467410858624, + 492732906035984, + 367978001588969, + 239308815188805, + 21888242871839275222246405745257275088548364400416034343698203683449286535872, + 162355156797662, + 61721563705194, + 191290828533458, + 130943030978739, + 260498741516826, + 21888242871839275222246405745257275088548364400416034343698203752346444657313, + 343615031266777, + 21888242871839275222246405745257275088548364400416034343698203645963806779664, + 21888242871839275222246405745257275088548364400416034343698204164144405126984, + 21888242871839275222246405745257275088548364400416034343698204042283321689988, + 21888242871839275222246405745257275088548364400416034343698203986269548130233, + 21888242871839275222246405745257275088548364400416034343698203637399642184484, + 21888242871839275222246405745257275088548364400416034343698203631500962388196, + 21888242871839275222246405745257275088548364400416034343698204071856702222230, + 21888242871839275222246405745257275088548364400416034343698203690261170864639, + 97955154233001, + 351786600780370, + 103423394692962, + 21888242871839275222246405745257275088548364400416034343698204110414410773895, + 21888242871839275222246405745257275088548364400416034343698204111001757399340, + 121439590568522, + 21888242871839275222246405745257275088548364400416034343698203877533547135415, + 21888242871839275222246405745257275088548364400416034343698203894933187761377, + 40778648282942, + 52476190153134, + 345681488694451, + 251279076301018, + 21888242871839275222246405745257275088548364400416034343698204053879921396353, + 21888242871839275222246405745257275088548364400416034343698204036659458058115, + 21888242871839275222246405745257275088548364400416034343698203940163676512995, + 21888242871839275222246405745257275088548364400416034343698203652492984626423, + 21888242871839275222246405745257275088548364400416034343698203686970689380051, + 378791219704283, + 202596271869618, + 121962818852222, + 57869227718980, + 49247288473334, + 21888242871839275222246405745257275088548364400416034343698204001374127877750, + 21888242871839275222246405745257275088548364400416034343698203839543842689783, + 330551466235977, + 21888242871839275222246405745257275088548364400416034343698203875010091449605, + 102906497341892, + 95328907076804, + 101182832481481, + 21888242871839275222246405745257275088548364400416034343698204146747722309729, + 335298107518187, + 21888242871839275222246405745257275088548364400416034343698203947074626229218, + 405213735110850, + 174141629177345, + 21888242871839275222246405745257275088548364400416034343698204153251213612440, + 21888242871839275222246405745257275088548364400416034343698203893724717023621, + 21888242871839275222246405745257275088548364400416034343698203969256952742030, + 61062579153191, + 96132863708418, + 21888242871839275222246405745257275088548364400416034343698203819928813011392, + 21888242871839275222246405745257275088548364400416034343698203841851874049020, + 402395709948111, + 440897529648999, + 21888242871839275222246405745257275088548364400416034343698203655835716100599, + 392693104858846, + 503273694848662, + 21888242871839275222246405745257275088548364400416034343698204025158964302405, + 21888242871839275222246405745257275088548364400416034343698204157674562980473, + 217294024736628, + 69397028168897, + 21888242871839275222246405745257275088548364400416034343698203668475650511651, + 21888242871839275222246405745257275088548364400416034343698204156656986835460, + 21888242871839275222246405745257275088548364400416034343698203748810166926280, + 344332567105105, + 21888242871839275222246405745257275088548364400416034343698203644462082587529, + 121473142175721, + 394608224791242, + 181095820749304, + 338636980261803, + 21888242871839275222246405745257275088548364400416034343698204126939646537410, + 122514602321849, + 21888242871839275222246405745257275088548364400416034343698204137711871602941, + 21888242871839275222246405745257275088548364400416034343698203881219618418930, + 21888242871839275222246405745257275088548364400416034343698203829637054304402, + 530750792512705, + 21888242871839275222246405745257275088548364400416034343698204077123656806750, + 425293339753398, + 21888242871839275222246405745257275088548364400416034343698203876283896685132, + 21888242871839275222246405745257275088548364400416034343698203860239088938993, + 363762968886175, + 319864619267676, + 407362731948694, + 408554776809983, + 21888242871839275222246405745257275088548364400416034343698203789487469051098, + 21888242871839275222246405745257275088548364400416034343698203883425832752264, + 21888242871839275222246405745257275088548364400416034343698203696729737292307, + 399771884763200, + 21888242871839275222246405745257275088548364400416034343698203853949814574162, + 21888242871839275222246405745257275088548364400416034343698204000985042951735, + 21888242871839275222246405745257275088548364400416034343698204070750413516817, + 21888242871839275222246405745257275088548364400416034343698203801485208277755, + 484438042690350, + 249763545172384, + 238019962190204, + 21888242871839275222246405745257275088548364400416034343698204098370021029440, + 480790203155843, + 333906317856199, + 184272836877665, + 21888242871839275222246405745257275088548364400416034343698203751297078096607, + 21888242871839275222246405745257275088548364400416034343698203911823891518793, + 45974869760327, + 21888242871839275222246405745257275088548364400416034343698204020095385922450, + 36679170187090, + 263571738668563, + 21888242871839275222246405745257275088548364400416034343698203829940214281680, + 21888242871839275222246405745257275088548364400416034343698203738390296179892, + 21888242871839275222246405745257275088548364400416034343698203831557343594320, + 21888242871839275222246405745257275088548364400416034343698203709356524221167, + 465640023204421, + 505022213302004, + 295694850879375, + 21888242871839275222246405745257275088548364400416034343698203849299124245635, + 21888242871839275222246405745257275088548364400416034343698203729335725920664, + 21888242871839275222246405745257275088548364400416034343698203671187084175650, + 291255703674587, + 171542039389529, + 21888242871839275222246405745257275088548364400416034343698203977966813192960, + 310088055861270, + 305785721831048, + 21888242871839275222246405745257275088548364400416034343698203729735179714994, + 382380314523870, + 21888242871839275222246405745257275088548364400416034343698203826697521522790, + 302284101626353, + 447036169997741, + 131310905342738, + 389224526235724, + 429483894670217, + 21888242871839275222246405745257275088548364400416034343698203748291345980478, + 425424595670574, + 511281989058638, + 9843624497183, + 272506088994132, + 21888242871839275222246405745257275088548364400416034343698204014069283877641, + 21888242871839275222246405745257275088548364400416034343698203781294776473939, + 21888242871839275222246405745257275088548364400416034343698204181743309152423, + 21888242871839275222246405745257275088548364400416034343698203858705469550042, + 554706385396683, + 35991087869329, + 21888242871839275222246405745257275088548364400416034343698203777355883640288, + 396559417396807, + 442291749723019, + 482708018154811, + 21888242871839275222246405745257275088548364400416034343698203888622306517402, + 512585710488280, + 21888242871839275222246405745257275088548364400416034343698203840778050240192, + 21888242871839275222246405745257275088548364400416034343698204086455922637908, + 21888242871839275222246405745257275088548364400416034343698204080424930032795, + 21888242871839275222246405745257275088548364400416034343698203752518016755003, + 113279184509045, + 236177007488931, + 552696000803306, + 305675713983895, + 21888242871839275222246405745257275088548364400416034343698203886515788679140, + 102579167963949, + 281653131123155, + 191385839805574, + 21888242871839275222246405745257275088548364400416034343698204048501243220870, + 21888242871839275222246405745257275088548364400416034343698204122681127410575, + 21888242871839275222246405745257275088548364400416034343698204129962617777034, + 21888242871839275222246405745257275088548364400416034343698203767122393365726, + 80933212284674, + 195437933832510, + 87598175369565, + 21888242871839275222246405745257275088548364400416034343698203655407229009738, + 1856587232499, + 21888242871839275222246405745257275088548364400416034343698203923035480138313, + 21888242871839275222246405745257275088548364400416034343698203666897465319847, + 21888242871839275222246405745257275088548364400416034343698203876418567228419, + 21888242871839275222246405745257275088548364400416034343698204128436294319382, + 21888242871839275222246405745257275088548364400416034343698203708301249423871, + 21888242871839275222246405745257275088548364400416034343698203684408986367515, + 21888242871839275222246405745257275088548364400416034343698203809614123696409, + 293317828698744, + 21888242871839275222246405745257275088548364400416034343698204174899049967722, + 21888242871839275222246405745257275088548364400416034343698204069242096168041, + 548708539754362, + 21888242871839275222246405745257275088548364400416034343698204019165736830317, + 21888242871839275222246405745257275088548364400416034343698204060286562217627, + 156700307766858, + 21888242871839275222246405745257275088548364400416034343698203644524682609250, + 161403648702874, + 426240506023178, + 21888242871839275222246405745257275088548364400416034343698203661532867634283, + 21888242871839275222246405745257275088548364400416034343698204088326621985203, + 21888242871839275222246405745257275088548364400416034343698203933707378141244, + 168199768025545, + 22269301473614, + 21888242871839275222246405745257275088548364400416034343698203810551678848337, + 21888242871839275222246405745257275088548364400416034343698203899289809698803, + 352219202586724, + 21888242871839275222246405745257275088548364400416034343698204169134581210521, + 21888242871839275222246405745257275088548364400416034343698204053479110975965, + 63537242073082, + 21888242871839275222246405745257275088548364400416034343698203855302582671208, + 21888242871839275222246405745257275088548364400416034343698203846032779756477, + 21888242871839275222246405745257275088548364400416034343698204053320298778099, + 21888242871839275222246405745257275088548364400416034343698203904329646045985, + 21888242871839275222246405745257275088548364400416034343698204081191508278914, + 371771683642521, + 364954335748056, + 21888242871839275222246405745257275088548364400416034343698204132304878729860, + 447529389406712, + 372013989035754, + 143574138299009, + 21888242871839275222246405745257275088548364400416034343698204122404752983732, + 21888242871839275222246405745257275088548364400416034343698203824644833537257, + 21888242871839275222246405745257275088548364400416034343698204001154129869695, + 130852973607278, + 220229103247840, + 21888242871839275222246405745257275088548364400416034343698204185787240328346, + 21888242871839275222246405745257275088548364400416034343698203696811497318549, + 21888242871839275222246405745257275088548364400416034343698203764711073268674, + 124024126634824, + 21888242871839275222246405745257275088548364400416034343698203730931481051998, + 433675533227581, + 21888242871839275222246405745257275088548364400416034343698203949245567187832, + 21888242871839275222246405745257275088548364400416034343698203957836681455937, + 21888242871839275222246405745257275088548364400416034343698204186279692235625, + 219316966743562, + 21888242871839275222246405745257275088548364400416034343698203922113181311681, + 77420547091608, + 21888242871839275222246405745257275088548364400416034343698203739844119482594, + 400412076674653, + 520279664047677, + 211354236629026, + 486769617162059, + 21888242871839275222246405745257275088548364400416034343698203664542150241032, + 21888242871839275222246405745257275088548364400416034343698203699637775046098, + 21888242871839275222246405745257275088548364400416034343698203988013390013167, + 21888242871839275222246405745257275088548364400416034343698203970135936648138, + 163347592097585, + 304231236254538, + 195904807754622, + 21888242871839275222246405745257275088548364400416034343698203837971457235293, + 340188851273702, + 186992043776669, + 306270335567302, + 21888242871839275222246405745257275088548364400416034343698203686578472397987, + 165981537286759, + 547327102488205, + 336362292666327, + 551475430522039, + 21888242871839275222246405745257275088548364400416034343698204130242302530521, + 21888242871839275222246405745257275088548364400416034343698204095581948045124, + 21888242871839275222246405745257275088548364400416034343698204126763673701610, + 178105853224326, + 21888242871839275222246405745257275088548364400416034343698203753520310540428, + 31625143816632, + 109556786124571, + 21888242871839275222246405745257275088548364400416034343698204074305971566461, + 21888242871839275222246405745257275088548364400416034343698203625163945424028, + 21888242871839275222246405745257275088548364400416034343698203692035400532833, + 21888242871839275222246405745257275088548364400416034343698203862065570315236, + 21888242871839275222246405745257275088548364400416034343698204014950317035502, + 93140382601347, + 468046520830031, + 21888242871839275222246405745257275088548364400416034343698204083364601782865, + 327027258147133, + 21888242871839275222246405745257275088548364400416034343698203853741527135510, + 21888242871839275222246405745257275088548364400416034343698203768219759260583, + 165505042100295, + 300691120333779, + 262951533854227, + 337676315446190, + 21888242871839275222246405745257275088548364400416034343698203877796931968678, + 200883389806937, + 402397488089971, + 215940125529313, + 21888242871839275222246405745257275088548364400416034343698204017084232673700, + 21888242871839275222246405745257275088548364400416034343698203680486341777763, + 21888242871839275222246405745257275088548364400416034343698203933747658432691, + 21888242871839275222246405745257275088548364400416034343698203816446216049216, + 418840210697410, + 21888242871839275222246405745257275088548364400416034343698204178892968129056, + 243493602342348, + 426132168695686, + 21888242871839275222246405745257275088548364400416034343698203839686852372702, + 346631774459543, + 21888242871839275222246405745257275088548364400416034343698204144622943975885, + 187752405535796, + 21888242871839275222246405745257275088548364400416034343698203726356398865128, + 21888242871839275222246405745257275088548364400416034343698203868659518597832, + 21888242871839275222246405745257275088548364400416034343698203908254804978326, + 21888242871839275222246405745257275088548364400416034343698203945313692591197, + 409521707450042, + 21888242871839275222246405745257275088548364400416034343698203678712606270107, + 21888242871839275222246405745257275088548364400416034343698203719545816878830, + 21888242871839275222246405745257275088548364400416034343698204132428193011530, + 80244741357869, + 21888242871839275222246405745257275088548364400416034343698203824953428470790, + 162845547575981, + 280345706549992, + 176910141809853, + 177729630280780, + 514799634298186, + 311025381691400, + 209855812533490, + 46143012287687, + 462582639813454, + 231053272149969, + 21888242871839275222246405745257275088548364400416034343698203908566076782780, + 398814902956319, + 11038048358827, + 31365130755199, + 292462570306948, + 145129349711508, + 375331283714318, + 9355294047498, + 45351938996534, + 21888242871839275222246405745257275088548364400416034343698204143751813126258, + 21888242871839275222246405745257275088548364400416034343698203741330161705139, + 21888242871839275222246405745257275088548364400416034343698204087976544732787, + 21888242871839275222246405745257275088548364400416034343698204048637499824369, + 21888242871839275222246405745257275088548364400416034343698203889622981135320, + 490887345853226, + 551752381135249, + 21888242871839275222246405745257275088548364400416034343698203939376524040813, + 53690234415856, + 362893883730722, + 243538319165145, + 21888242871839275222246405745257275088548364400416034343698204163817024020864, + 21888242871839275222246405745257275088548364400416034343698203914201518374988, + 21888242871839275222246405745257275088548364400416034343698203755643911640974, + 21888242871839275222246405745257275088548364400416034343698204108015406042918, + 21888242871839275222246405745257275088548364400416034343698203669100083324333, + 32388393992401, + 21888242871839275222246405745257275088548364400416034343698204018049706736447, + 9154600317726, + 24379048883776, + 507602742467183, + 85321462111222, + 329457381469826, + 21888242871839275222246405745257275088548364400416034343698204169604472712227, + 21888242871839275222246405745257275088548364400416034343698203667669189634828, + 478115749650757, + 21888242871839275222246405745257275088548364400416034343698204173199615501961, + 30568946575892, + 252534081771799, + 185595117899357, + 21888242871839275222246405745257275088548364400416034343698204095120731328661, + 21888242871839275222246405745257275088548364400416034343698204119871927085158, + 544895870089970, + 134440520907295, + 361688319443630, + 21888242871839275222246405745257275088548364400416034343698203684222004633528, + 21888242871839275222246405745257275088548364400416034343698204143250139899018, + 249016417000699, + 21888242871839275222246405745257275088548364400416034343698203652809914866893, + 21888242871839275222246405745257275088548364400416034343698203763415174123690, + 21888242871839275222246405745257275088548364400416034343698204070600309897415, + 411725509012251, + 175577569589862, + 37506496282785, + 21888242871839275222246405745257275088548364400416034343698203761770363480919, + 21888242871839275222246405745257275088548364400416034343698204095406816728922, + 140256632694406, + 399278330027491, + 496831368245190, + 133562983408724, + 21888242871839275222246405745257275088548364400416034343698204007993192728522, + 251722877812841, + 21888242871839275222246405745257275088548364400416034343698203767114833517211, + 139919427844217, + 21888242871839275222246405745257275088548364400416034343698204088265967168342, + 21888242871839275222246405745257275088548364400416034343698203809918444836380, + 21888242871839275222246405745257275088548364400416034343698203803461204765489, + 21888242871839275222246405745257275088548364400416034343698203755042347006265, + 21888242871839275222246405745257275088548364400416034343698203980616546169923, + 341874987192348, + 379759794788511, + 21888242871839275222246405745257275088548364400416034343698203864829078624570, + 21888242871839275222246405745257275088548364400416034343698203977483506281146, + 115964966574203, + 21888242871839275222246405745257275088548364400416034343698203924363757649122, + 159673247781300, + 21888242871839275222246405745257275088548364400416034343698203722207350742448, + 210692360281336, + 21888242871839275222246405745257275088548364400416034343698204139892383209920, + 288893210440950, + 21888242871839275222246405745257275088548364400416034343698203975715899494341, + 118039820080537, + 423715666982826, + 21888242871839275222246405745257275088548364400416034343698203916085447300911, + 21888242871839275222246405745257275088548364400416034343698203694034277600396, + 21888242871839275222246405745257275088548364400416034343698203962436975511263, + 21888242871839275222246405745257275088548364400416034343698203653560074301102, + 456954302902441, + 21888242871839275222246405745257275088548364400416034343698204185607229884062, + 21888242871839275222246405745257275088548364400416034343698203685627785073303, + 188629509399693, + 205850382426363, + 66974366173644, + 402504144994325, + 21888242871839275222246405745257275088548364400416034343698204101330750962077, + 443050323586139, + 21888242871839275222246405745257275088548364400416034343698204107903453707540, + 115271143607747, + 21888242871839275222246405745257275088548364400416034343698203663097684197420, + 119675956054993, + 495119027259157, + 305199084551298, + 220864956549506, + 375552509861609, + 21888242871839275222246405745257275088548364400416034343698204036505301890524, + 455376329333295, + 21888242871839275222246405745257275088548364400416034343698203983159291184618, + 21888242871839275222246405745257275088548364400416034343698204120629008994889, + 21888242871839275222246405745257275088548364400416034343698203654770966467552, + 92101121669004, + 21888242871839275222246405745257275088548364400416034343698204094089797793705, + 197500500310896, + 21888242871839275222246405745257275088548364400416034343698203893993568894424, + 21888242871839275222246405745257275088548364400416034343698203833251466601236, + 21888242871839275222246405745257275088548364400416034343698203716561012736510, + 24967427050809, + 469103428852269, + 21888242871839275222246405745257275088548364400416034343698203958139183300850, + 21888242871839275222246405745257275088548364400416034343698203903989417997596, + 128390579753208, + 21888242871839275222246405745257275088548364400416034343698203829134854192049, + 440196257020147, + 31142559492783, + 21888242871839275222246405745257275088548364400416034343698204052478821516172, + 145701970875064, + 21888242871839275222246405745257275088548364400416034343698203796439444677060, + 21888242871839275222246405745257275088548364400416034343698203744872149183202, + 16669263649811, + 353227224517078, + 21888242871839275222246405745257275088548364400416034343698203650670256314482, + 21888242871839275222246405745257275088548364400416034343698203851199989544135, + 21888242871839275222246405745257275088548364400416034343698203871485565112794, + 65066460285751, + 325424157580956, + 46587240178127, + 21888242871839275222246405745257275088548364400416034343698203822263421971149, + 50043289221708, + 21888242871839275222246405745257275088548364400416034343698203964194506923779, + 21888242871839275222246405745257275088548364400416034343698204121004685688917, + 171700615511582, + 168568090160784, + 547421250270021, + 21888242871839275222246405745257275088548364400416034343698204021357819445439, + 21888242871839275222246405745257275088548364400416034343698203983191003700253, + 370198170174821, + 21888242871839275222246405745257275088548364400416034343698204143907186438453, + 354516995924202, + 410234513380228, + 66912505129956, + 21888242871839275222246405745257275088548364400416034343698204166299934149797, + 21888242871839275222246405745257275088548364400416034343698203743503774202683, + 21888242871839275222246405745257275088548364400416034343698203944588316824641, + 77573680684190, + 21888242871839275222246405745257275088548364400416034343698203753999662960855, + 545225772299143, + 172581571941813, + 219735431057736, + 187355360255344, + 305960025799909, + 21888242871839275222246405745257275088548364400416034343698204000243648263713, + 165285749639735, + 21888242871839275222246405745257275088548364400416034343698204018516877652586, + 334077793366206, + 551893916823907, + 21888242871839275222246405745257275088548364400416034343698203946551451715237, + 21888242871839275222246405745257275088548364400416034343698203780396435246808, + 225353319017656, + 167732406992428, + 21888242871839275222246405745257275088548364400416034343698203822531808220905, + 720641500876, + 168736734160429, + 21888242871839275222246405745257275088548364400416034343698203631540279347778, + 21888242871839275222246405745257275088548364400416034343698203891890865392515, + 21888242871839275222246405745257275088548364400416034343698203835857445436608, + 232852709902898, + 21888242871839275222246405745257275088548364400416034343698204051087554367943, + 252237916425261, + 445457574037290, + 253874169428926, + 184281398503484, + 233292084173008, + 21888242871839275222246405745257275088548364400416034343698204037868966740244, + 130083465196894, + 21888242871839275222246405745257275088548364400416034343698203909933590972068, + 21888242871839275222246405745257275088548364400416034343698204124980263758213, + 21888242871839275222246405745257275088548364400416034343698203932984961625918, + 255941363733272, + 231199701777300, + 77533958709779, + 482017881721118, + 21888242871839275222246405745257275088548364400416034343698204112322990044323, + 21888242871839275222246405745257275088548364400416034343698203644865575666123, + 357262959998770, + 24629409418615, + 21888242871839275222246405745257275088548364400416034343698203934319252925160, + 21888242871839275222246405745257275088548364400416034343698203792932444571706, + 21888242871839275222246405745257275088548364400416034343698204174976729387408, + 239627979194228, + 21888242871839275222246405745257275088548364400416034343698204099884983614963, + 360258386682838, + 21888242871839275222246405745257275088548364400416034343698203973820919606184, + 328059384578702, + 21888242871839275222246405745257275088548364400416034343698203824398743108202, + 21888242871839275222246405745257275088548364400416034343698204012704787018916, + 381677874353840, + 374496122034093, + 146421523384738, + 516567762493335, + 21888242871839275222246405745257275088548364400416034343698203688246055760799, + 21888242871839275222246405745257275088548364400416034343698204038836371213941, + 21888242871839275222246405745257275088548364400416034343698203664487930316581, + 21888242871839275222246405745257275088548364400416034343698204148961499557890, + 21888242871839275222246405745257275088548364400416034343698204147223744290014, + 366220487252294, + 21888242871839275222246405745257275088548364400416034343698204033315723608306, + 21888242871839275222246405745257275088548364400416034343698203923114643426701, + 276762767021937, + 294238324663046, + 78772415861542, + 21888242871839275222246405745257275088548364400416034343698203653011369122855, + 21888242871839275222246405745257275088548364400416034343698203733997290168757, + 535613108676364, + 21888242871839275222246405745257275088548364400416034343698204125013851801887, + 21888242871839275222246405745257275088548364400416034343698204032643544235155, + 17547125891056, + 264451850248212, + 379902954532631, + 387171038798523, + 21888242871839275222246405745257275088548364400416034343698203674321471393025, + 21888242871839275222246405745257275088548364400416034343698203722945801376031, + 312641278853690, + 21888242871839275222246405745257275088548364400416034343698203777148106269273, + 21888242871839275222246405745257275088548364400416034343698203647337463100320, + 21888242871839275222246405745257275088548364400416034343698203646317722479956, + 106729217624573, + 346278241634815, + 159643750362300, + 56891480796723, + 531179330083269, + 235048801826525, + 231665822236389, + 21888242871839275222246405745257275088548364400416034343698203993989717850346, + 21888242871839275222246405745257275088548364400416034343698203853098996482808, + 21888242871839275222246405745257275088548364400416034343698203753165698020659, + 21888242871839275222246405745257275088548364400416034343698203625659877434453, + 21888242871839275222246405745257275088548364400416034343698203801469300009216, + 472278025149336, + 155466202446196, + 21888242871839275222246405745257275088548364400416034343698204151608079703834, + 67117578578785, + 271069066738918, + 303138504594543, + 21888242871839275222246405745257275088548364400416034343698204168212790429659, + 176356275547483, + 435152097605937, + 38927345776099, + 63773000919007, + 21888242871839275222246405745257275088548364400416034343698203984868799748775, + 21888242871839275222246405745257275088548364400416034343698203874766610607947, + 25989532403850, + 524629993905378, + 21888242871839275222246405745257275088548364400416034343698204166149168842828, + 21888242871839275222246405745257275088548364400416034343698203674446725026564, + 339891343735959, + 21888242871839275222246405745257275088548364400416034343698204126084235518014, + 167307693617121, + 552723005865765, + 21888242871839275222246405745257275088548364400416034343698204163777034586469, + 389728183737638, + 21888242871839275222246405745257275088548364400416034343698203961598916772295, + 21888242871839275222246405745257275088548364400416034343698204077068632958135, + 484136239523435, + 21888242871839275222246405745257275088548364400416034343698203739353743661520, + 379078512526579, + 332973718151197, + 21888242871839275222246405745257275088548364400416034343698204042388978381631, + 367900895572862, + 21888242871839275222246405745257275088548364400416034343698204169524206828657, + 505902431820585, + 21888242871839275222246405745257275088548364400416034343698204073139498455882, + 21888242871839275222246405745257275088548364400416034343698203824805091258948, + 367155952471142, + 21888242871839275222246405745257275088548364400416034343698203726084252436881, + 21888242871839275222246405745257275088548364400416034343698203743392097044282, + 21888242871839275222246405745257275088548364400416034343698203827402949231132, + 21888242871839275222246405745257275088548364400416034343698204113502436188976, + 106256946566214, + 21888242871839275222246405745257275088548364400416034343698204024933900657663, + 21888242871839275222246405745257275088548364400416034343698203987957958638992, + 111720422094685, + 287533235636347, + 263138782571887, + 263164063227779, + 21888242871839275222246405745257275088548364400416034343698204109340326183387, + 21888242871839275222246405745257275088548364400416034343698203654678070001759, + 21888242871839275222246405745257275088548364400416034343698203696341186357942, + 21888242871839275222246405745257275088548364400416034343698203943559673729644, + 227079858153850, + 305271115515539, + 21888242871839275222246405745257275088548364400416034343698203868097836472786, + 351550350464080, + 282288053268636, + 543061072741908, + 525268293377827, + 35548141356923, + 117191033754497, + 288462533781322, + 21888242871839275222246405745257275088548364400416034343698203762628314231254, + 21888242871839275222246405745257275088548364400416034343698203751802198981358, + 21888242871839275222246405745257275088548364400416034343698203665592907766888, + 21888242871839275222246405745257275088548364400416034343698204186064246097285, + 401999546145975, + 21888242871839275222246405745257275088548364400416034343698203943010587492465, + 21888242871839275222246405745257275088548364400416034343698203702555521937353, + 14497660551631, + 110954032374257, + 260456522027734, + 55240762565690, + 21888242871839275222246405745257275088548364400416034343698203661240035615616, + 438652430199469, + 256277611682493, + 21888242871839275222246405745257275088548364400416034343698204076310319779706, + 509216177573446, + 21888242871839275222246405745257275088548364400416034343698204071803954204232, + 214822159551354, + 92643136037479, + 350783836967208, + 143129181420448, + 21888242871839275222246405745257275088548364400416034343698204011365290180340, + 21888242871839275222246405745257275088548364400416034343698203992561590992299, + 103712239931956, + 379240176241625, + 554655590287641, + 21888242871839275222246405745257275088548364400416034343698203744645858191486, + 21888242871839275222246405745257275088548364400416034343698203740857539545506, + 21888242871839275222246405745257275088548364400416034343698204166772730301148, + 21888242871839275222246405745257275088548364400416034343698204138882557753125, + 118087299532567, + 60956993465109, + 205338433360932, + 21888242871839275222246405745257275088548364400416034343698203651921066407365, + 21888242871839275222246405745257275088548364400416034343698204131262541431502, + 466628377586164, + 21888242871839275222246405745257275088548364400416034343698204148909433455306, + 21888242871839275222246405745257275088548364400416034343698203826307709342432, + 13247272186684, + 21888242871839275222246405745257275088548364400416034343698203689002054542215, + 21888242871839275222246405745257275088548364400416034343698204106549645470909, + 21888242871839275222246405745257275088548364400416034343698204179532975543132, + 21888242871839275222246405745257275088548364400416034343698203821146081149159, + 41293894112429, + 21888242871839275222246405745257275088548364400416034343698204067615456956625, + 21888242871839275222246405745257275088548364400416034343698204004586646655080, + 21888242871839275222246405745257275088548364400416034343698203850517504927466, + 338900722559510, + 364099208418915, + 21888242871839275222246405745257275088548364400416034343698204144285842802577, + 313680553644707, + 275748715557291, + 489486981556390, + 21888242871839275222246405745257275088548364400416034343698204055169066968531, + 411406280137848, + 21888242871839275222246405745257275088548364400416034343698203987670721936350, + 21888242871839275222246405745257275088548364400416034343698203879475402055297, + 58994539762776, + 21888242871839275222246405745257275088548364400416034343698204095253380707783, + 268291138579902, + 21888242871839275222246405745257275088548364400416034343698204044563888248511, + 21888242871839275222246405745257275088548364400416034343698204069759550715827, + 217148242555507, + 21888242871839275222246405745257275088548364400416034343698204077947653564573, + 295671745435834, + 499339333174889, + 21888242871839275222246405745257275088548364400416034343698204049013871450985, + 21888242871839275222246405745257275088548364400416034343698203782337488412566, + 21888242871839275222246405745257275088548364400416034343698203826900012956440, + 21888242871839275222246405745257275088548364400416034343698204034712040916254, + 398690768658215, + 21888242871839275222246405745257275088548364400416034343698203633081422247530, + 519207374942547, + 21888242871839275222246405745257275088548364400416034343698204034597157451465, + 12726548593257, + 21888242871839275222246405745257275088548364400416034343698203944972040131102, + 153600630878306, + 21888242871839275222246405745257275088548364400416034343698203847486116683833, + 21888242871839275222246405745257275088548364400416034343698203981844377535090, + 21888242871839275222246405745257275088548364400416034343698203696706496898456, + 316715931121580, + 21888242871839275222246405745257275088548364400416034343698203663274846894024, + 21888242871839275222246405745257275088548364400416034343698203646568533534816, + 522070712986531, + 109439515856064, + 378773312317862, + 21888242871839275222246405745257275088548364400416034343698203774969167946829, + 279043662146962, + 444966745494678, + 373116743196733, + 465074852230971, + 21888242871839275222246405745257275088548364400416034343698204183110919092545, + 250407491926424, + 386858139674712, + 21888242871839275222246405745257275088548364400416034343698204023597742645427, + 21888242871839275222246405745257275088548364400416034343698203830139540622449, + 479130456592870, + 46298501721748, + 21888242871839275222246405745257275088548364400416034343698203749282738688792, + 151240876717569, + 185031244432004, + 21888242871839275222246405745257275088548364400416034343698203665125565768958, + 203840214569311, + 382289396068086, + 21888242871839275222246405745257275088548364400416034343698203645022149128791, + 21888242871839275222246405745257275088548364400416034343698203660729911381065, + 398392959743987, + 155814998863024, + 21888242871839275222246405745257275088548364400416034343698204112661669908685, + 21888242871839275222246405745257275088548364400416034343698203921490457726895, + 209195090246589, + 546917769433167, + 82316776099631, + 91695858132792, + 535490051879266, + 21888242871839275222246405745257275088548364400416034343698204135161829437095, + 557663601598264, + 21888242871839275222246405745257275088548364400416034343698204115188365336180, + 350920937041339, + 475721718766255, + 21888242871839275222246405745257275088548364400416034343698203664147688849681, + 401915460357506, + 352762427767366, + 21888242871839275222246405745257275088548364400416034343698204142812906401957, + 101612359374759, + 21888242871839275222246405745257275088548364400416034343698204097380546859770, + 250178285470733, + 21888242871839275222246405745257275088548364400416034343698204096720374031022, + 21888242871839275222246405745257275088548364400416034343698203924069599304746, + 21888242871839275222246405745257275088548364400416034343698203722210542771893, + 174850132774093, + 191100449583375, + 21888242871839275222246405745257275088548364400416034343698204128448358849898, + 21888242871839275222246405745257275088548364400416034343698204044844100719344, + 8153859596077, + 334397488534129, + 54599475288524, + 534794555824060, + 21888242871839275222246405745257275088548364400416034343698203775515506669464, + 21888242871839275222246405745257275088548364400416034343698203758243439068166, + 21888242871839275222246405745257275088548364400416034343698204144292353611008, + 21888242871839275222246405745257275088548364400416034343698203991279759786579, + 21888242871839275222246405745257275088548364400416034343698204057916775874311, + 271924510220711, + 21888242871839275222246405745257275088548364400416034343698203863175772510413, + 21888242871839275222246405745257275088548364400416034343698204000319409336982, + 266184872784109, + 21888242871839275222246405745257275088548364400416034343698204009754000728706, + 21888242871839275222246405745257275088548364400416034343698203719952578536029, + 21888242871839275222246405745257275088548364400416034343698203910629270730397, + 36504679423790, + 422169952745105, + 21888242871839275222246405745257275088548364400416034343698203855898018589013, + 75474068894103, + 30184054362176, + 24556216428693, + 191504438162264, + 417172284286588, + 553345407620368, + 106008374008806, + 21888242871839275222246405745257275088548364400416034343698203640085099095366, + 21888242871839275222246405745257275088548364400416034343698203854435024407580, + 120258560458186, + 6559161353210, + 21888242871839275222246405745257275088548364400416034343698203849686689293463, + 259869436703137, + 21888242871839275222246405745257275088548364400416034343698203664617726144454, + 21888242871839275222246405745257275088548364400416034343698204184688278611986, + 21888242871839275222246405745257275088548364400416034343698203957605364742369, + 21888242871839275222246405745257275088548364400416034343698204141991610769347, + 254962244966157, + 21888242871839275222246405745257275088548364400416034343698203693602143162515, + 21888242871839275222246405745257275088548364400416034343698203833994616147106, + 21888242871839275222246405745257275088548364400416034343698204145173522720363, + 208505458001336, + 68518949907911, + 282039259757623, + 181650477846340, + 31605160953236, + 21888242871839275222246405745257275088548364400416034343698204151249143165619, + 15355560085530, + 21888242871839275222246405745257275088548364400416034343698203736290376162513, + 179760084849601, + 106719451605010, + 21888242871839275222246405745257275088548364400416034343698204100040030662891, + 21888242871839275222246405745257275088548364400416034343698203737754320663759, + 362638744141134, + 481283824643912, + 21888242871839275222246405745257275088548364400416034343698203839211721030377, + 21888242871839275222246405745257275088548364400416034343698203721335493368040, + 353655541946010, + 18721871265596, + 325185747153261, + 109860792934739, + 21888242871839275222246405745257275088548364400416034343698203863415015281909, + 32139751794403, + 310325325388133, + 21888242871839275222246405745257275088548364400416034343698204154440762910065, + 425859715925754, + 513149154428824, + 348902432677879, + 511070659694942, + 21888242871839275222246405745257275088548364400416034343698203662086979636195, + 21888242871839275222246405745257275088548364400416034343698203695621390561787, + 21888242871839275222246405745257275088548364400416034343698204103967462144947, + 80038865743937, + 55479246475198, + 21888242871839275222246405745257275088548364400416034343698204146748685398134, + 21888242871839275222246405745257275088548364400416034343698204157348076015696, + 21888242871839275222246405745257275088548364400416034343698203863279577727026, + 506429098924429, + 21888242871839275222246405745257275088548364400416034343698203993822376941291, + 53263719373342, + 140427614181251, + 249350519392400, + 499477346634856, + 339722983846330, + 21888242871839275222246405745257275088548364400416034343698203881193419430871, + 455454583366665, + 369284983784179, + 441084073592416, + 300857094776768, + 21888242871839275222246405745257275088548364400416034343698204020049847578439, + 185250498833278, + 21888242871839275222246405745257275088548364400416034343698203837994553781009, + 431689646437741, + 535119056564555, + 371130501842330, + 151872368561674, + 21888242871839275222246405745257275088548364400416034343698204151308596790530, + 21888242871839275222246405745257275088548364400416034343698203933295645078270, + 21888242871839275222246405745257275088548364400416034343698204026221624751084, + 21888242871839275222246405745257275088548364400416034343698203667533816908842, + 21888242871839275222246405745257275088548364400416034343698203812681969900575, + 21888242871839275222246405745257275088548364400416034343698203908087686027871, + 21888242871839275222246405745257275088548364400416034343698204091781679531139, + 306894774103929, + 21888242871839275222246405745257275088548364400416034343698203625768795433809, + 21888242871839275222246405745257275088548364400416034343698203985983693052660, + 21888242871839275222246405745257275088548364400416034343698203889732401846266, + 242726991148528, + 78778899794186, + 21888242871839275222246405745257275088548364400416034343698203631216485762604, + 21888242871839275222246405745257275088548364400416034343698203972251422318029, + 8140128150537, + 131569106012906, + 74450843712416, + 256952653830347, + 491648541259329, + 21888242871839275222246405745257275088548364400416034343698203653780519779204, + 431522779243186, + 21888242871839275222246405745257275088548364400416034343698204107962490541118, + 281840766702057, + 21888242871839275222246405745257275088548364400416034343698203626940314854422, + 21888242871839275222246405745257275088548364400416034343698203640783447069519, + 426522696860941, + 284072142169294, + 21888242871839275222246405745257275088548364400416034343698204038311860171419, + 21888242871839275222246405745257275088548364400416034343698203953027144748895, + 21888242871839275222246405745257275088548364400416034343698203987418144338915, + 427829949764619, + 21888242871839275222246405745257275088548364400416034343698204145295334147959, + 507052185783878, + 21888242871839275222246405745257275088548364400416034343698203678513167913404, + 21888242871839275222246405745257275088548364400416034343698204117227848615855, + 21888242871839275222246405745257275088548364400416034343698203720554441096484, + 21888242871839275222246405745257275088548364400416034343698203664097514553256, + 21888242871839275222246405745257275088548364400416034343698203868224344724679, + 21888242871839275222246405745257275088548364400416034343698204144551411961964, + 21888242871839275222246405745257275088548364400416034343698203685620148076532, + 21888242871839275222246405745257275088548364400416034343698203978664187864544, + 21888242871839275222246405745257275088548364400416034343698203686337999714096, + 21888242871839275222246405745257275088548364400416034343698204004784538687650, + 21888242871839275222246405745257275088548364400416034343698203847548784197686, + 510918598501697, + 21888242871839275222246405745257275088548364400416034343698204093584191209440, + 536516218122674, + 420300893488403, + 21888242871839275222246405745257275088548364400416034343698204136559269510010, + 146102893167145, + 73120288785779, + 21888242871839275222246405745257275088548364400416034343698203794007686736925, + 319474442021026, + 21888242871839275222246405745257275088548364400416034343698203880218105458307, + 54331765197150, + 21888242871839275222246405745257275088548364400416034343698204128337661791508, + 551746939608472, + 21888242871839275222246405745257275088548364400416034343698204135305509406287, + 27960257374713, + 408044514120485, + 72094480084745, + 4509165311034, + 21888242871839275222246405745257275088548364400416034343698203916222321639576, + 540344667190859, + 21888242871839275222246405745257275088548364400416034343698204099551630198391, + 473696016795226, + 21888242871839275222246405745257275088548364400416034343698204165338616116278, + 181978923627997, + 30310924630578, + 341256322798533, + 21888242871839275222246405745257275088548364400416034343698203910945709064246, + 49394938973630, + 21888242871839275222246405745257275088548364400416034343698203798039093681618, + 21888242871839275222246405745257275088548364400416034343698203903740711146133, + 21888242871839275222246405745257275088548364400416034343698203891258139280566, + 21888242871839275222246405745257275088548364400416034343698203703678869779803, + 21888242871839275222246405745257275088548364400416034343698203686294353944013, + 21888242871839275222246405745257275088548364400416034343698203940454111679430, + 135688623808973, + 260415853817389, + 21888242871839275222246405745257275088548364400416034343698203687039379384706, + 338914421285632, + 163990206202543, + 205865675092373, + 508558505733996, + 168257112344024, + 261981879974690, + 21888242871839275222246405745257275088548364400416034343698203938303193498707, + 21888242871839275222246405745257275088548364400416034343698203632509525089990, + 368225621664573, + 491331071769360, + 21888242871839275222246405745257275088548364400416034343698203673584416764873, + 118719390207192, + 446203257940218, + 387454466630030, + 288375800321747, + 280756207727279, + 14715755704676, + 59520511348365, + 21888242871839275222246405745257275088548364400416034343698204039962880750877, + 551773727800598, + 21888242871839275222246405745257275088548364400416034343698203754001256785558, + 21888242871839275222246405745257275088548364400416034343698203983177775352772, + 21888242871839275222246405745257275088548364400416034343698204029714486685645, + 279977390357391, + 7831677180822, + 108401179430342, + 21888242871839275222246405745257275088548364400416034343698203678265609390201, + 21888242871839275222246405745257275088548364400416034343698203637241932738780, + 21888242871839275222246405745257275088548364400416034343698203916216182411720, + 285582921783490, + 557554839419075, + 366271994931949, + 20251453168609, + 459956698821397, + 242030026575284, + 376441379603206, + 21888242871839275222246405745257275088548364400416034343698204040424202977812, + 353005897639203, + 21888242871839275222246405745257275088548364400416034343698203768890408743242, + 21888242871839275222246405745257275088548364400416034343698204149650340586079, + 270086915248174, + 21888242871839275222246405745257275088548364400416034343698204169605413433961, + 70896676190079, + 21888242871839275222246405745257275088548364400416034343698203658064230498869, + 44503276532349, + 21888242871839275222246405745257275088548364400416034343698204185262819421004, + 21888242871839275222246405745257275088548364400416034343698203665550441218709, + 389547891394922, + 390967820788076, + 408063873703764, + 8085457228392, + 3241161419168, + 107496487418950, + 21888242871839275222246405745257275088548364400416034343698203799057833805557, + 485600384333107, + 55669575184594, + 493884029177939, + 555593096600901, + 21888242871839275222246405745257275088548364400416034343698204127363135470874, + 260366537165376, + 21888242871839275222246405745257275088548364400416034343698204006012968603361, + 21888242871839275222246405745257275088548364400416034343698203851457640264227, + 231094631446213, + 21888242871839275222246405745257275088548364400416034343698203640981835370089, + 21888242871839275222246405745257275088548364400416034343698203951734467167233, + 21888242871839275222246405745257275088548364400416034343698203747684103153985, + 175732506031793, + 350683159880079, + 21888242871839275222246405745257275088548364400416034343698204154891625216191, + 409557300442508, + 495673807988029, + 243574841939065, + 21888242871839275222246405745257275088548364400416034343698203868660341198532, + 21888242871839275222246405745257275088548364400416034343698203809605478518143, + 21888242871839275222246405745257275088548364400416034343698203903175502814547, + 21888242871839275222246405745257275088548364400416034343698203877285873033963, + 21888242871839275222246405745257275088548364400416034343698203974537024743222, + 21888242871839275222246405745257275088548364400416034343698204001367623351807, + 233333592702944, + 120588794492659, + 21888242871839275222246405745257275088548364400416034343698203758014492455315, + 21888242871839275222246405745257275088548364400416034343698203740436977806056, + 248533930651538, + 21888242871839275222246405745257275088548364400416034343698203741799570892997, + 21888242871839275222246405745257275088548364400416034343698204034703340999779, + 359706271130726, + 292909745051442, + 21888242871839275222246405745257275088548364400416034343698204159693790859050, + 21888242871839275222246405745257275088548364400416034343698204121901765257734, + 21888242871839275222246405745257275088548364400416034343698204087563359131772, + 21888242871839275222246405745257275088548364400416034343698204025552028003798, + 34817899222544, + 21888242871839275222246405745257275088548364400416034343698203672248338155024, + 214180123717821, + 21888242871839275222246405745257275088548364400416034343698203749870138975068, + 21888242871839275222246405745257275088548364400416034343698204095451858752523, + 194292729225079, + 21888242871839275222246405745257275088548364400416034343698203968808383667493, + 21888242871839275222246405745257275088548364400416034343698204000876807909014, + 21888242871839275222246405745257275088548364400416034343698203855535280871748, + 21888242871839275222246405745257275088548364400416034343698204058707146869676, + 21888242871839275222246405745257275088548364400416034343698203786064515431217, + 294431410222830, + 21888242871839275222246405745257275088548364400416034343698204007481587858218, + 128780800832833, + 356756635035837, + 43063820907909, + 21888242871839275222246405745257275088548364400416034343698203946548086610382, + 543366981927761, + 21888242871839275222246405745257275088548364400416034343698203771731143802732, + 21888242871839275222246405745257275088548364400416034343698203663555785432559, + 21888242871839275222246405745257275088548364400416034343698203680466902315989, + 21888242871839275222246405745257275088548364400416034343698203972322944934148, + 21888242871839275222246405745257275088548364400416034343698204073889715724037, + 136691926859385, + 21888242871839275222246405745257275088548364400416034343698204154579924703590, + 21888242871839275222246405745257275088548364400416034343698203915339765219590, + 21888242871839275222246405745257275088548364400416034343698203708456519883187, + 21888242871839275222246405745257275088548364400416034343698203790576255606012, + 495582311322593, + 393939042212192, + 21888242871839275222246405745257275088548364400416034343698203651787868770234, + 339938051535557, + 418766722364271, + 519086176098441, + 21888242871839275222246405745257275088548364400416034343698203931124727101490, + 80467760794371, + 226409712503356, + 21888242871839275222246405745257275088548364400416034343698203925180010487711, + 13557412380900, + 21888242871839275222246405745257275088548364400416034343698203784515957353355, + 243903931414475, + 408078086520255, + 21888242871839275222246405745257275088548364400416034343698204023751560871800, + 21888242871839275222246405745257275088548364400416034343698204135778024804570, + 512078661923472, + 21888242871839275222246405745257275088548364400416034343698204023079262776708, + 270571695169839, + 21888242871839275222246405745257275088548364400416034343698204156712692025632, + 21888242871839275222246405745257275088548364400416034343698204157872095182502, + 21888242871839275222246405745257275088548364400416034343698203910775065451720, + 21888242871839275222246405745257275088548364400416034343698203819692502715775, + 21888242871839275222246405745257275088548364400416034343698203970463653506058, + 64515621865192, + 326127089832200, + 465498071413624, + 21888242871839275222246405745257275088548364400416034343698203920022751126866, + 21888242871839275222246405745257275088548364400416034343698203678038640143238, + 21888242871839275222246405745257275088548364400416034343698203961561247732437, + 190645857073378, + 21888242871839275222246405745257275088548364400416034343698203681287564328142, + 21888242871839275222246405745257275088548364400416034343698204038990307072584, + 21888242871839275222246405745257275088548364400416034343698203972095312371423, + 303020628191861, + 62128263494584, + 90800085164105, + 21888242871839275222246405745257275088548364400416034343698203625753927732717, + 21888242871839275222246405745257275088548364400416034343698203990861090173043, + 21888242871839275222246405745257275088548364400416034343698203752670780721056, + 21888242871839275222246405745257275088548364400416034343698203961782866203194, + 397776826047593, + 21888242871839275222246405745257275088548364400416034343698204140786280414793, + 355751723159437, + 21888242871839275222246405745257275088548364400416034343698203631024358114293, + 21888242871839275222246405745257275088548364400416034343698204094863348652545, + 360345730427818, + 415122025270957, + 21888242871839275222246405745257275088548364400416034343698203678982869422608, + 477372632302386, + 482412594421889, + 21888242871839275222246405745257275088548364400416034343698204095210719234390, + 21888242871839275222246405745257275088548364400416034343698203684615325732080, + 1930064874031, + 159240234399718, + 244537614384960, + 246049683413334, + 21888242871839275222246405745257275088548364400416034343698203957288935826459, + 21888242871839275222246405745257275088548364400416034343698203948500128275938, + 396166194916381, + 21888242871839275222246405745257275088548364400416034343698203919277222720557, + 21888242871839275222246405745257275088548364400416034343698204102848004195193, + 21888242871839275222246405745257275088548364400416034343698204114730320905945, + 214835117033238, + 21888242871839275222246405745257275088548364400416034343698203720825413680773, + 21888242871839275222246405745257275088548364400416034343698204041296048928184, + 21888242871839275222246405745257275088548364400416034343698204146015324597282, + 203871423806548, + 410925327872932, + 21888242871839275222246405745257275088548364400416034343698203736958129816655, + 42609100526307, + 404180523144776, + 212954966749469, + 21888242871839275222246405745257275088548364400416034343698203872656226670057, + 79376443115740, + 231798619841491, + 21888242871839275222246405745257275088548364400416034343698203839474362724617, + 21888242871839275222246405745257275088548364400416034343698203743688705292903, + 21888242871839275222246405745257275088548364400416034343698203827314478169925, + 21888242871839275222246405745257275088548364400416034343698203718320087120933, + 484694379245767, + 290240763351871, + 370124622244823, + 543067217809872, + 21888242871839275222246405745257275088548364400416034343698204155840084905914, + 386912348700474, + 84323698146970, + 218582639071118, + 21888242871839275222246405745257275088548364400416034343698204124749258217936, + 21888242871839275222246405745257275088548364400416034343698203813576542226781, + 381809319722815, + 21888242871839275222246405745257275088548364400416034343698203906602663655407, + 21888242871839275222246405745257275088548364400416034343698203951340404182032, + 355178984565574, + 21888242871839275222246405745257275088548364400416034343698203818587069174428, + 157182033870043, + 412317965676582, + 104062995876986, + 21888242871839275222246405745257275088548364400416034343698204076055092919596, + 21888242871839275222246405745257275088548364400416034343698204125204127245303, + 21888242871839275222246405745257275088548364400416034343698203959254481397843, + 186112101569619, + 405406636739320, + 211364864738119, + 21888242871839275222246405745257275088548364400416034343698204062846050852763, + 21888242871839275222246405745257275088548364400416034343698203672596675223168, + 380758519031696, + 21888242871839275222246405745257275088548364400416034343698203787077182709661, + 218998837070575, + 21888242871839275222246405745257275088548364400416034343698204035520218051997, + 21888242871839275222246405745257275088548364400416034343698203889353509409974, + 21888242871839275222246405745257275088548364400416034343698204138874244387638, + 21888242871839275222246405745257275088548364400416034343698203963798004809296, + 21888242871839275222246405745257275088548364400416034343698204008249089668474, + 239125256735394, + 21888242871839275222246405745257275088548364400416034343698204123913931747369, + 21888242871839275222246405745257275088548364400416034343698204154767100590462, + 40047766372839, + 215371553081864, + 21888242871839275222246405745257275088548364400416034343698204003716366592776, + 299065848946888, + 21888242871839275222246405745257275088548364400416034343698204118683232361323, + 353716652979952, + 21888242871839275222246405745257275088548364400416034343698204129360151123764, + 21888242871839275222246405745257275088548364400416034343698204104068781680686, + 21888242871839275222246405745257275088548364400416034343698203668306999068583, + 429298904948112, + 21888242871839275222246405745257275088548364400416034343698204110071773877914, + 21888242871839275222246405745257275088548364400416034343698204186418257260320, + 271423825135979, + 21888242871839275222246405745257275088548364400416034343698203821064381636879, + 65629874929052, + 21888242871839275222246405745257275088548364400416034343698203648592550515900, + 196182799313333, + 164970511851887, + 21888242871839275222246405745257275088548364400416034343698203819188993320658, + 21888242871839275222246405745257275088548364400416034343698204163137124204745, + 21888242871839275222246405745257275088548364400416034343698203911752629365028, + 21888242871839275222246405745257275088548364400416034343698203694758151687206, + 365180619172164, + 41310884282716, + 500977439056260, + 253599485261926, + 38777446772762, + 20486515234105, + 503336306508961, + 21888242871839275222246405745257275088548364400416034343698203768136333272677, + 370930769164035, + 16343308026788, + 496968649060723, + 21888242871839275222246405745257275088548364400416034343698203840924496137025, + 409048827092828, + 21888242871839275222246405745257275088548364400416034343698204039351683141004, + 21888242871839275222246405745257275088548364400416034343698203777136950172402, + 21888242871839275222246405745257275088548364400416034343698203747559156853117, + 21888242871839275222246405745257275088548364400416034343698203792905634562412, + 136259355621439, + 21888242871839275222246405745257275088548364400416034343698204154326838879360, + 21888242871839275222246405745257275088548364400416034343698203752365720029172, + 228225993487165, + 422436349125788, + 424138527916379, + 21888242871839275222246405745257275088548364400416034343698203789735843092650, + 417596272951226, + 21888242871839275222246405745257275088548364400416034343698203965511931869027, + 543204264417096, + 515447701749965, + 21888242871839275222246405745257275088548364400416034343698203821268758283308, + 492105449139727, + 225328731046375, + 64542970786343, + 136189589884570, + 65719173247917, + 173389392287841, + 21888242871839275222246405745257275088548364400416034343698204175028131703892, + 246186596163038, + 301491851362797, + 21888242871839275222246405745257275088548364400416034343698203703274027447048, + 21888242871839275222246405745257275088548364400416034343698203950163874960448, + 21888242871839275222246405745257275088548364400416034343698203681848424611491, + 21888242871839275222246405745257275088548364400416034343698203929908484008426, + 38212280651571, + 394109031926809, + 21888242871839275222246405745257275088548364400416034343698204091951249613820, + 21888242871839275222246405745257275088548364400416034343698204070130758591679, + 21888242871839275222246405745257275088548364400416034343698203835473990642788, + 21888242871839275222246405745257275088548364400416034343698203707679442499360, + 230797846677801, + 21888242871839275222246405745257275088548364400416034343698203886367176530957, + 21888242871839275222246405745257275088548364400416034343698203710957009755475, + 83366381894608, + 21888242871839275222246405745257275088548364400416034343698203715678434746919, + 300583800319638, + 21888242871839275222246405745257275088548364400416034343698204077725502030274, + 128016642836119, + 21888242871839275222246405745257275088548364400416034343698204102306849252570, + 21888242871839275222246405745257275088548364400416034343698204077408149196247, + 21888242871839275222246405745257275088548364400416034343698204149668233897391, + 401431444347390, + 21888242871839275222246405745257275088548364400416034343698203795315758033649, + 21888242871839275222246405745257275088548364400416034343698203683438047675191, + 142438133986650, + 386958755546905, + 21888242871839275222246405745257275088548364400416034343698203984707464794811, + 21888242871839275222246405745257275088548364400416034343698204090970889508945, + 21888242871839275222246405745257275088548364400416034343698203940317984068988, + 21888242871839275222246405745257275088548364400416034343698203626552062881613, + 21888242871839275222246405745257275088548364400416034343698203678861676186609, + 187309796746438, + 330462217693871, + 554653109074435, + 21888242871839275222246405745257275088548364400416034343698203639206712552022, + 279409084630060, + 21888242871839275222246405745257275088548364400416034343698203814293019446463, + 21888242871839275222246405745257275088548364400416034343698204096562032024735, + 99165895816634, + 21888242871839275222246405745257275088548364400416034343698204054999708293228, + 404691658053742, + 390221121035232, + 21888242871839275222246405745257275088548364400416034343698203633498354073604, + 179038364287129, + 21888242871839275222246405745257275088548364400416034343698204118106448351634, + 21888242871839275222246405745257275088548364400416034343698203637894991589386, + 477305096365028, + 21888242871839275222246405745257275088548364400416034343698204023631163012718, + 26853120071805, + 539078019029627, + 21888242871839275222246405745257275088548364400416034343698203861056587673907, + 95840016118612, + 21888242871839275222246405745257275088548364400416034343698204095324876945401, + 21888242871839275222246405745257275088548364400416034343698203758606435987319, + 264963885932119, + 21888242871839275222246405745257275088548364400416034343698203950057526825193, + 21888242871839275222246405745257275088548364400416034343698204170849781451454, + 368982627727761, + 69529095613199, + 21888242871839275222246405745257275088548364400416034343698203934244654832461, + 21888242871839275222246405745257275088548364400416034343698203664378706733480, + 389207610585392, + 21888242871839275222246405745257275088548364400416034343698204185225088006750, + 21888242871839275222246405745257275088548364400416034343698203937876157567642, + 551093422731475, + 21888242871839275222246405745257275088548364400416034343698203716090821541821, + 238968159623932, + 534307919470054, + 21888242871839275222246405745257275088548364400416034343698204131177663931694, + 113384951098239, + 21888242871839275222246405745257275088548364400416034343698204069376432614928, + 21888242871839275222246405745257275088548364400416034343698203651462066493795, + 376653830123718, + 21888242871839275222246405745257275088548364400416034343698204020356065636823, + 23759179233582, + 543716707520166, + 340158468214950, + 60809400562744, + 106454877289987, + 21888242871839275222246405745257275088548364400416034343698204052832639874874, + 243436040715464, + 21888242871839275222246405745257275088548364400416034343698203628973158957753, + 150862614416232, + 37998839177116, + 188041934599057, + 239845898071268, + 21888242871839275222246405745257275088548364400416034343698203746309137941677, + 202611934057103, + 23385598817555, + 21888242871839275222246405745257275088548364400416034343698203759827771473671, + 21888242871839275222246405745257275088548364400416034343698204074400979808074, + 21888242871839275222246405745257275088548364400416034343698203924730087559347, + 21888242871839275222246405745257275088548364400416034343698204021517401788220, + 152652757724413, + 149091828397334, + 21888242871839275222246405745257275088548364400416034343698204006427874660897, + 333176614607106, + 463760396726610, + 32955242833173, + 21888242871839275222246405745257275088548364400416034343698204008185661817838, + 310446628863632, + 180901880545136, + 21888242871839275222246405745257275088548364400416034343698203705841745179404, + 159687819584963, + 410407463002198, + 21888242871839275222246405745257275088548364400416034343698203967443448774833, + 244611409249503, + 379877730557675, + 430124693959411, + 399316123935715, + 21888242871839275222246405745257275088548364400416034343698203958455702024275, + 129843528913033, + 21888242871839275222246405745257275088548364400416034343698203858897703783996, + 21888242871839275222246405745257275088548364400416034343698204062178245934516, + 228422818596142, + 298604419295891, + 411986309917137, + 21888242871839275222246405745257275088548364400416034343698203971829719578066, + 245166947028610, + 21888242871839275222246405745257275088548364400416034343698203801321624499325, + 21888242871839275222246405745257275088548364400416034343698203893264580000976, + 21888242871839275222246405745257275088548364400416034343698204015594910347258, + 21888242871839275222246405745257275088548364400416034343698204175957650338365, + 21888242871839275222246405745257275088548364400416034343698204009100969850843, + 104004937866461, + 21888242871839275222246405745257275088548364400416034343698203992298871000334, + 21888242871839275222246405745257275088548364400416034343698203997025408100178, + 21888242871839275222246405745257275088548364400416034343698204124523460578767, + 21888242871839275222246405745257275088548364400416034343698204139651116615822, + 228129610751945, + 21888242871839275222246405745257275088548364400416034343698204156896740120978, + 21888242871839275222246405745257275088548364400416034343698203966225959245884, + 21888242871839275222246405745257275088548364400416034343698203961733725687667, + 21888242871839275222246405745257275088548364400416034343698203751545324403324, + 21888242871839275222246405745257275088548364400416034343698203951064665083036, + 303151454432175, + 21888242871839275222246405745257275088548364400416034343698203962004210921386, + 79207254759608, + 91166472922438, + 364881718914487, + 21888242871839275222246405745257275088548364400416034343698203916777101006719, + 142773348358564, + 220945797686309, + 21888242871839275222246405745257275088548364400416034343698203935018594062478, + 21888242871839275222246405745257275088548364400416034343698203793583158767770, + 163613172116543, + 21888242871839275222246405745257275088548364400416034343698204163766144522562, + 126274721155532, + 21888242871839275222246405745257275088548364400416034343698204081855702829727, + 21888242871839275222246405745257275088548364400416034343698203956035093362780, + 341830981841980, + 467844461041391, + 425177683372780, + 439817263697101, + 21888242871839275222246405745257275088548364400416034343698203762667347448431, + 39097480906833, + 21888242871839275222246405745257275088548364400416034343698203864736733357661, + 21888242871839275222246405745257275088548364400416034343698203642154859171591, + 92222366483731, + 21888242871839275222246405745257275088548364400416034343698203893172834263011, + 83676010635455, + 42478506432840, + 21888242871839275222246405745257275088548364400416034343698203718344573213557, + 51456927977308, + 302210244876392, + 115085401888672, + 523991257331446, + 166676345419841, + 21888242871839275222246405745257275088548364400416034343698203702874146113411, + 21888242871839275222246405745257275088548364400416034343698203816132634850374, + 21888242871839275222246405745257275088548364400416034343698204130795354203412, + 461815859644547, + 528672257301081, + 452655385091640, + 21888242871839275222246405745257275088548364400416034343698203995969384898726, + 57554926604930, + 168237998603714, + 21888242871839275222246405745257275088548364400416034343698204133186558175156, + 545230484575250, + 349474648247019, + 21888242871839275222246405745257275088548364400416034343698203869067736977290, + 411893656421004, + 492160321931198, + 249760259147015, + 410232192929532, + 21888242871839275222246405745257275088548364400416034343698203837073576952756, + 397845763339405, + 21888242871839275222246405745257275088548364400416034343698203929048218578531, + 21888242871839275222246405745257275088548364400416034343698203757640565661308, + 21888242871839275222246405745257275088548364400416034343698203842339594643247, + 21888242871839275222246405745257275088548364400416034343698203716610815199699, + 21888242871839275222246405745257275088548364400416034343698203832149282815143, + 422647406199498, + 21888242871839275222246405745257275088548364400416034343698203714845511223104, + 315141776136193, + 272269980708131, + 249521381059068, + 464146950136338, + 84043322164899, + 21888242871839275222246405745257275088548364400416034343698203674207193674965, + 21888242871839275222246405745257275088548364400416034343698203997401921243628, + 21888242871839275222246405745257275088548364400416034343698203767218707673632, + 368717461223378, + 21888242871839275222246405745257275088548364400416034343698204119290385791363, + 21888242871839275222246405745257275088548364400416034343698203755178829330629, + 17597545665556, + 531959549241827, + 21888242871839275222246405745257275088548364400416034343698203643910842769192, + 21888242871839275222246405745257275088548364400416034343698203666647975199667, + 21888242871839275222246405745257275088548364400416034343698204060591238600766, + 182402006517005, + 462345506971542, + 21888242871839275222246405745257275088548364400416034343698203924347677661156, + 21888242871839275222246405745257275088548364400416034343698204028236258594984, + 269676629357959, + 258962102931807, + 133597341073357, + 224007329567171, + 216697204339887, + 521639894710206, + 21888242871839275222246405745257275088548364400416034343698203904495057519466, + 561260159901330, + 22650090387551, + 21888242871839275222246405745257275088548364400416034343698203774209279038389, + 21888242871839275222246405745257275088548364400416034343698203840064950053996, + 21888242871839275222246405745257275088548364400416034343698203971651560644946, + 90791960821304, + 510286953455688, + 313796150315540, + 21888242871839275222246405745257275088548364400416034343698204164061183310917, + 21888242871839275222246405745257275088548364400416034343698204046386598403785, + 385667746337371, + 47829677194081, + 21888242871839275222246405745257275088548364400416034343698203764728027438100, + 434493251996814, + 21888242871839275222246405745257275088548364400416034343698203634939138350962, + 224495668818392, + 21888242871839275222246405745257275088548364400416034343698204048450955938272, + 21888242871839275222246405745257275088548364400416034343698204006625101880199, + 108541579508905, + 378683068738984, + 21888242871839275222246405745257275088548364400416034343698204170238619036909, + 21888242871839275222246405745257275088548364400416034343698204161469792590065, + 21385707030146, + 21888242871839275222246405745257275088548364400416034343698203672699330126177, + 21888242871839275222246405745257275088548364400416034343698204005803271716894, + 550194537140591, + 36324719509196, + 5816972119568, + 21888242871839275222246405745257275088548364400416034343698203765150757195656, + 280636054259549, + 49040159730417, + 136369507895672, + 21888242871839275222246405745257275088548364400416034343698204086383594362677, + 21888242871839275222246405745257275088548364400416034343698204121953306076260, + 21888242871839275222246405745257275088548364400416034343698203687713283881906, + 199985660954793, + 422161523287726, + 508057796023415, + 21888242871839275222246405745257275088548364400416034343698203924064515581231, + 21888242871839275222246405745257275088548364400416034343698203876142704263750, + 133483498187876, + 21888242871839275222246405745257275088548364400416034343698203781894995041445, + 181972513408612, + 418138891639564, + 341988212583380, + 125299806234650, + 145806421937024, + 21888242871839275222246405745257275088548364400416034343698203639230206597639, + 304150494290944, + 274462758280968, + 21888242871839275222246405745257275088548364400416034343698203660806402718071, + 165993185987288, + 21888242871839275222246405745257275088548364400416034343698203696713826283028, + 21888242871839275222246405745257275088548364400416034343698203974986066266550, + 447242820972671, + 21888242871839275222246405745257275088548364400416034343698203842985185456065, + 21888242871839275222246405745257275088548364400416034343698203974278752958174, + 289724673149793, + 21888242871839275222246405745257275088548364400416034343698203763395489506226, + 21888242871839275222246405745257275088548364400416034343698204135019768939912, + 121954752357107, + 21888242871839275222246405745257275088548364400416034343698203663105315472800, + 177169158994780, + 21888242871839275222246405745257275088548364400416034343698204136929709256189, + 22080671717924, + 38361970425236, + 496523281626772, + 21888242871839275222246405745257275088548364400416034343698204063021619642082, + 181419248750298, + 21888242871839275222246405745257275088548364400416034343698203927525013317389, + 438038380476508, + 40828950592447, + 289505400821342, + 508928267006435, + 62241746964798, + 21888242871839275222246405745257275088548364400416034343698204054669243842385, + 21888242871839275222246405745257275088548364400416034343698203764948884537219, + 21888242871839275222246405745257275088548364400416034343698204142177312014171, + 418174207217662, + 80599659699012, + 318928465284424, + 439257136785905, + 144000042247983, + 464149548517209, + 411646115893634, + 288914511361860, + 21888242871839275222246405745257275088548364400416034343698203652582924080115, + 21888242871839275222246405745257275088548364400416034343698203924810650616667, + 84163460577094, + 221996869674670, + 96629723280358, + 210272881799194, + 500891582517477, + 450487105187109, + 21888242871839275222246405745257275088548364400416034343698203663199748733564, + 21888242871839275222246405745257275088548364400416034343698204026808554252267, + 236945061614190, + 269894096606770, + 21888242871839275222246405745257275088548364400416034343698203976950593099379, + 202313530110282, + 21888242871839275222246405745257275088548364400416034343698204046645608646315, + 408431318286234, + 320330536200664, + 121882999530664, + 543339064019323, + 429021068409692, + 173932565126682, + 21888242871839275222246405745257275088548364400416034343698204044335923622993, + 392244000911450, + 283329972959621, + 558894866533245, + 404111088198954, + 371647724652058, + 30391681466827, + 21888242871839275222246405745257275088548364400416034343698204155270295117023, + 21888242871839275222246405745257275088548364400416034343698204112687774289998, + 21888242871839275222246405745257275088548364400416034343698204001636070880147, + 21888242871839275222246405745257275088548364400416034343698203902791797047878, + 438952841718869, + 21888242871839275222246405745257275088548364400416034343698203803945480988275, + 160597265231351, + 21888242871839275222246405745257275088548364400416034343698203631157058461270, + 21888242871839275222246405745257275088548364400416034343698204060651040120531, + 21888242871839275222246405745257275088548364400416034343698203955983849123985, + 220156595921621, + 367330468708158, + 111236997922692, + 21888242871839275222246405745257275088548364400416034343698203768602445746885, + 466111768376795, + 21888242871839275222246405745257275088548364400416034343698203908192311161101, + 182640738531563, + 21888242871839275222246405745257275088548364400416034343698203659074090202853, + 21888242871839275222246405745257275088548364400416034343698204147353186309063, + 21888242871839275222246405745257275088548364400416034343698203634498311411537, + 40959961040510, + 21888242871839275222246405745257275088548364400416034343698203682732828335198, + 309688750041149, + 21888242871839275222246405745257275088548364400416034343698203646363129079193, + 95773694576754, + 495529921984662, + 492557030146060, + 21888242871839275222246405745257275088548364400416034343698203841485248796121, + 21888242871839275222246405745257275088548364400416034343698204008429604194376, + 21888242871839275222246405745257275088548364400416034343698204066337817675995, + 199052626390532, + 270633401797357, + 21888242871839275222246405745257275088548364400416034343698203697583503304103, + 21888242871839275222246405745257275088548364400416034343698204117764451819636, + 21888242871839275222246405745257275088548364400416034343698203767217612644794, + 378910378272489, + 292386392950085, + 21888242871839275222246405745257275088548364400416034343698203834277709200879, + 46589082228523, + 21888242871839275222246405745257275088548364400416034343698204118286579501600, + 146789937153445, + 21888242871839275222246405745257275088548364400416034343698203670163257137056, + 12986803123897, + 21888242871839275222246405745257275088548364400416034343698203713729635652881, + 189677553547130, + 369581128549357, + 489559430836951, + 213445276268053, + 189232740777323, + 78928797760701, + 21888242871839275222246405745257275088548364400416034343698203686186769953029, + 282562499176090, + 21888242871839275222246405745257275088548364400416034343698204062436117474900, + 21888242871839275222246405745257275088548364400416034343698203961624535777700, + 21888242871839275222246405745257275088548364400416034343698203707148614420044, + 21888242871839275222246405745257275088548364400416034343698204050643173154440, + 21888242871839275222246405745257275088548364400416034343698203910337802992053, + 9944471839028, + 21888242871839275222246405745257275088548364400416034343698203949642495016644, + 21888242871839275222246405745257275088548364400416034343698203663211144975296, + 21888242871839275222246405745257275088548364400416034343698203661364181759599, + 21888242871839275222246405745257275088548364400416034343698203748104897280255, + 313669116668903, + 284679803983399, + 323274323303593, + 21888242871839275222246405745257275088548364400416034343698204034046740507394, + 421034468471353, + 21888242871839275222246405745257275088548364400416034343698203982575389740840, + 21888242871839275222246405745257275088548364400416034343698203793751055419562, + 21888242871839275222246405745257275088548364400416034343698203945581504160682, + 390602283165415, + 21888242871839275222246405745257275088548364400416034343698204043702020258734, + 21888242871839275222246405745257275088548364400416034343698204109999331478760, + 21888242871839275222246405745257275088548364400416034343698203875493319599322, + 53540385434737, + 554240689603442, + 21888242871839275222246405745257275088548364400416034343698204142567077458828, + 552002370834566, + 21888242871839275222246405745257275088548364400416034343698204053791775278163, + 422440496952779, + 21888242871839275222246405745257275088548364400416034343698203941025766391778, + 97372785912294, + 21888242871839275222246405745257275088548364400416034343698204066781587435656, + 21888242871839275222246405745257275088548364400416034343698204103096066456595, + 427576777136425, + 42702456456806, + 21888242871839275222246405745257275088548364400416034343698204047447124454384, + 204991224017455, + 21888242871839275222246405745257275088548364400416034343698203705100634261943, + 21888242871839275222246405745257275088548364400416034343698204151109303128759, + 21888242871839275222246405745257275088548364400416034343698203714726370071733, + 282165641930240, + 329089624086961, + 404451481105006, + 355665971876526, + 389306111675211, + 21888242871839275222246405745257275088548364400416034343698204105430537182412, + 21888242871839275222246405745257275088548364400416034343698204152315078729675, + 179289863433580, + 21888242871839275222246405745257275088548364400416034343698203821458721181152, + 506962870204153, + 21888242871839275222246405745257275088548364400416034343698203726125129318487, + 54898178551937, + 21888242871839275222246405745257275088548364400416034343698204027668681475531, + 21888242871839275222246405745257275088548364400416034343698203750187732346297, + 21888242871839275222246405745257275088548364400416034343698204055212869942454, + 167711229671396, + 313646097088918, + 132072351773666, + 346715470989472, + 546054707390776, + 268920523663856, + 246730890856478, + 552921429729084, + 285886792728932, + 21888242871839275222246405745257275088548364400416034343698203917529500615650, + 21888242871839275222246405745257275088548364400416034343698203699735399130902, + 21888242871839275222246405745257275088548364400416034343698203949208597914201, + 152526976308765, + 21888242871839275222246405745257275088548364400416034343698203744266613983681, + 21888242871839275222246405745257275088548364400416034343698203953773984235376, + 334200692396244, + 21888242871839275222246405745257275088548364400416034343698203750857329918941, + 123717457011021, + 92944613517311, + 342288456273674, + 94483221233751, + 363232282143168, + 120798626239957, + 191244381317474, + 334192536574805, + 199568651063623, + 21888242871839275222246405745257275088548364400416034343698203788888523367875, + 562479990449601, + 21888242871839275222246405745257275088548364400416034343698203806109662617766, + 269994355562429, + 279060678518646, + 36827978280143, + 340476972655175, + 207182032997769, + 484478236708484, + 330858712637395, + 286032163605028, + 466166909545189, + 21888242871839275222246405745257275088548364400416034343698203648658980427570, + 526888375197920, + 7107153466355, + 42441325802972, + 78608018952900, + 21888242871839275222246405745257275088548364400416034343698203714863730583081, + 21888242871839275222246405745257275088548364400416034343698203903093296461199, + 353503258528606, + 21888242871839275222246405745257275088548364400416034343698203853212420264009, + 97798332116009, + 400544282018625, + 21888242871839275222246405745257275088548364400416034343698203848357322669073, + 21888242871839275222246405745257275088548364400416034343698203998621746688247, + 21888242871839275222246405745257275088548364400416034343698203776805136386966, + 21888242871839275222246405745257275088548364400416034343698203737664654543178, + 534127116065735, + 21888242871839275222246405745257275088548364400416034343698204152156812009720, + 334472180491913, + 21888242871839275222246405745257275088548364400416034343698203630340146569503, + 21888242871839275222246405745257275088548364400416034343698203692589367845900, + 384897355172041, + 288332169905186, + 198198743894673, + 21888242871839275222246405745257275088548364400416034343698203970375494985592, + 21888242871839275222246405745257275088548364400416034343698204028060607923937, + 21888242871839275222246405745257275088548364400416034343698203796711717863252, + 21888242871839275222246405745257275088548364400416034343698203983255662823125, + 21888242871839275222246405745257275088548364400416034343698203638747563566201, + 222345474124152, + 21888242871839275222246405745257275088548364400416034343698204099183526892082, + 73507270649101, + 21888242871839275222246405745257275088548364400416034343698203709114762342094, + 21888242871839275222246405745257275088548364400416034343698203856966925087242, + 261226594585375, + 21888242871839275222246405745257275088548364400416034343698204036739531464244, + 475905595985708, + 21888242871839275222246405745257275088548364400416034343698203764065792563991, + 21888242871839275222246405745257275088548364400416034343698204083575832204736, + 21888242871839275222246405745257275088548364400416034343698203639196831292217, + 378304586084674, + 45575231945394, + 21888242871839275222246405745257275088548364400416034343698203912349235835730, + 21888242871839275222246405745257275088548364400416034343698203979525059920918, + 85845083298447, + 21888242871839275222246405745257275088548364400416034343698203892754734638393, + 234422030931419, + 260136165389843, + 96855249124739, + 21888242871839275222246405745257275088548364400416034343698203718133186589908, + 70230413931406, + 178030242108447, + 21888242871839275222246405745257275088548364400416034343698203889404549295446, + 382725597801129, + 14814380285140, + 81713769360555, + 21888242871839275222246405745257275088548364400416034343698203956258889501999, + 21888242871839275222246405745257275088548364400416034343698203799179055366270, + 273436163641179, + 249815441426063, + 144679834688250, + 183046049511898, + 246048349541988, + 21888242871839275222246405745257275088548364400416034343698204021602245033591, + 21888242871839275222246405745257275088548364400416034343698203845321020933060, + 468857506431154, + 372076858567661, + 21888242871839275222246405745257275088548364400416034343698203714234579529112, + 21888242871839275222246405745257275088548364400416034343698204031914316660043, + 512228480362475, + 114552382127133, + 139295223388908, + 21888242871839275222246405745257275088548364400416034343698203635777095665505, + 21888242871839275222246405745257275088548364400416034343698203911478843040375, + 21888242871839275222246405745257275088548364400416034343698203942056163158113, + 116277422474445, + 21888242871839275222246405745257275088548364400416034343698203988638617663284, + 21888242871839275222246405745257275088548364400416034343698203916925068903047, + 21888242871839275222246405745257275088548364400416034343698203955215363562201, + 186364029042135, + 21888242871839275222246405745257275088548364400416034343698203889285765100841, + 38535259152704, + 21888242871839275222246405745257275088548364400416034343698203727685707766431, + 21888242871839275222246405745257275088548364400416034343698203907491015395871, + 44473643269050, + 513951020858763, + 45171268895187, + 264453271440758, + 21888242871839275222246405745257275088548364400416034343698203715617586897999, + 21888242871839275222246405745257275088548364400416034343698204024141072967003, + 21888242871839275222246405745257275088548364400416034343698204050812316010733, + 21888242871839275222246405745257275088548364400416034343698203953313492669513, + 21888242871839275222246405745257275088548364400416034343698204128033563417690, + 265008822049985, + 249869980285198, + 246586863511085, + 396786699801039, + 359687021290757, + 524208111020392, + 38487373431727, + 73373006498854, + 21888242871839275222246405745257275088548364400416034343698204107274830205859, + 129124762903025, + 151097758953350, + 21888242871839275222246405745257275088548364400416034343698203782610678646385, + 236985350382931, + 512655155800262, + 191689392608462, + 528464377440028, + 347330401116887, + 32286272694408, + 21888242871839275222246405745257275088548364400416034343698204095747538070414, + 267355037785757, + 496237529696081, + 337111815844192, + 21888242871839275222246405745257275088548364400416034343698204115619209432452, + 67876774621059, + 21888242871839275222246405745257275088548364400416034343698203971700269543571, + 21888242871839275222246405745257275088548364400416034343698203902485705434263, + 465450892743671, + 516004104100995, + 21888242871839275222246405745257275088548364400416034343698203729280392798167, + 21888242871839275222246405745257275088548364400416034343698203882032967586265, + 21888242871839275222246405745257275088548364400416034343698204079112594928820, + 192200207938098, + 205050495761895, + 461374601641628, + 459203220254066, + 21888242871839275222246405745257275088548364400416034343698203861052080411708, + 21888242871839275222246405745257275088548364400416034343698204116817739693780, + 16025151461245, + 466774818234304, + 21888242871839275222246405745257275088548364400416034343698204047315841691230, + 197663222529650, + 21888242871839275222246405745257275088548364400416034343698203920116674458858, + 516405829525475, + 491831745295206, + 21888242871839275222246405745257275088548364400416034343698203641658591019946, + 21888242871839275222246405745257275088548364400416034343698203791928938300225, + 21888242871839275222246405745257275088548364400416034343698203726364137772499, + 120483962136926, + 21888242871839275222246405745257275088548364400416034343698203945459477449443, + 177131021178952, + 21888242871839275222246405745257275088548364400416034343698204052228432793191, + 21888242871839275222246405745257275088548364400416034343698203667271836542053, + 21888242871839275222246405745257275088548364400416034343698203662885762669629, + 16153655457610, + 284281416695983, + 451439634483578, + 21888242871839275222246405745257275088548364400416034343698203658956369361170, + 126836250116553, + 21888242871839275222246405745257275088548364400416034343698203842928032235561, + 21888242871839275222246405745257275088548364400416034343698203795058732852488, + 513953779319034, + 21888242871839275222246405745257275088548364400416034343698203923580947669846, + 21888242871839275222246405745257275088548364400416034343698203957826755643539, + 207978521270837, + 376438448527744, + 220035579743534, + 21888242871839275222246405745257275088548364400416034343698203677438741672699, + 271053474270172, + 299312684521452, + 21888242871839275222246405745257275088548364400416034343698203820858699632167, + 21888242871839275222246405745257275088548364400416034343698203654133467889137, + 370528936887564, + 21888242871839275222246405745257275088548364400416034343698203757178972925064, + 187198194918115, + 58561041708350, + 21888242871839275222246405745257275088548364400416034343698204136707351896418, + 21888242871839275222246405745257275088548364400416034343698204124964420478613, + 233415892733158, + 333162967842768, + 164208263657833, + 21888242871839275222246405745257275088548364400416034343698203681496331716088, + 21888242871839275222246405745257275088548364400416034343698204087170414328894, + 21888242871839275222246405745257275088548364400416034343698204141792958923560, + 21888242871839275222246405745257275088548364400416034343698203763559140808192, + 201744702795961, + 127171326395172, + 21888242871839275222246405745257275088548364400416034343698203767046088680701, + 438022141354480, + 21888242871839275222246405745257275088548364400416034343698203908864692242747, + 513094273228889, + 21888242871839275222246405745257275088548364400416034343698203854552249068675, + 21888242871839275222246405745257275088548364400416034343698203830034670352688, + 365627514359494, + 21888242871839275222246405745257275088548364400416034343698204143165728754246, + 174975405457958, + 21888242871839275222246405745257275088548364400416034343698203703175836886246, + 21888242871839275222246405745257275088548364400416034343698204113831617114890, + 21888242871839275222246405745257275088548364400416034343698203706017573182401, + 110921008205698, + 21888242871839275222246405745257275088548364400416034343698203966063816167048, + 265973051982991, + 152255335032729, + 99858534228560, + 376769969739757, + 21888242871839275222246405745257275088548364400416034343698203838911703135413, + 254839305470410, + 21888242871839275222246405745257275088548364400416034343698203945094355376197, + 21888242871839275222246405745257275088548364400416034343698204021517876687876, + 85996727854369, + 158400337807458, + 21888242871839275222246405745257275088548364400416034343698203932311472312456, + 21888242871839275222246405745257275088548364400416034343698204023211689291761, + 21888242871839275222246405745257275088548364400416034343698204046227826484642, + 21888242871839275222246405745257275088548364400416034343698204007930618526995, + 14207550446038, + 398057336431199, + 21888242871839275222246405745257275088548364400416034343698203655635882839276, + 362796314450976, + 520987499641863, + 21888242871839275222246405745257275088548364400416034343698204131048932691968, + 21888242871839275222246405745257275088548364400416034343698203631119299794539, + 285244324406916, + 74760484713794, + 474775557944753, + 207541335143219, + 129378770757657, + 237114639917923, + 21888242871839275222246405745257275088548364400416034343698203925077794899933, + 419014467112619, + 183519356867361, + 228315697753019, + 356141550140585, + 21888242871839275222246405745257275088548364400416034343698203870818320473420, + 286609513596745, + 386071383573755, + 21888242871839275222246405745257275088548364400416034343698203827017823344731, + 85595578273013, + 148300684141246, + 83617469311839, + 279337554713377, + 21888242871839275222246405745257275088548364400416034343698203994571383924722, + 520994649771211, + 21888242871839275222246405745257275088548364400416034343698204010633924676981, + 21888242871839275222246405745257275088548364400416034343698203770086538121034, + 450640148569738, + 427663220104200, + 21888242871839275222246405745257275088548364400416034343698204075282689923859, + 435104251910169, + 21888242871839275222246405745257275088548364400416034343698203842992238507090, + 521788218744977, + 74230146179880, + 21888242871839275222246405745257275088548364400416034343698203977287374139899, + 21888242871839275222246405745257275088548364400416034343698203634916099672558, + 21888242871839275222246405745257275088548364400416034343698204093737785295072, + 21888242871839275222246405745257275088548364400416034343698203996479415546901, + 480025998363588, + 267853960724654, + 147568793740006, + 536919874055077, + 553174162122748, + 21888242871839275222246405745257275088548364400416034343698203640658813239265, + 21888242871839275222246405745257275088548364400416034343698203851304212081068, + 414041671455671, + 50371302331288, + 21888242871839275222246405745257275088548364400416034343698203869257660002676, + 21888242871839275222246405745257275088548364400416034343698203747413492037525, + 469477941462374, + 342807499850088, + 516763425124205, + 151630206424676, + 21888242871839275222246405745257275088548364400416034343698204075399767789237, + 148675801292880, + 265338846190282, + 283347695657749, + 21888242871839275222246405745257275088548364400416034343698204124823502585176, + 21888242871839275222246405745257275088548364400416034343698203626132924091272, + 491282949174263, + 24437364634472, + 21888242871839275222246405745257275088548364400416034343698203731635030948241, + 21888242871839275222246405745257275088548364400416034343698203848147497588316, + 21888242871839275222246405745257275088548364400416034343698204009467979003326, + 21888242871839275222246405745257275088548364400416034343698203648551953161918, + 398266480067508, + 10115731819607, + 290719364347380, + 485160819076266, + 524314573324686, + 323682657727261, + 241848869049705, + 21888242871839275222246405745257275088548364400416034343698204009902219666930, + 21888242871839275222246405745257275088548364400416034343698203649868844260441, + 3130365070789, + 499631224531489, + 21888242871839275222246405745257275088548364400416034343698203761712141325008, + 21888242871839275222246405745257275088548364400416034343698204163933963925431, + 21888242871839275222246405745257275088548364400416034343698203790187318352111, + 431554173184926, + 293402640825126, + 21888242871839275222246405745257275088548364400416034343698203718722585697239, + 3377839365108, + 21888242871839275222246405745257275088548364400416034343698204180326380326376, + 429557729309893, + 21888242871839275222246405745257275088548364400416034343698204126593640227843, + 12485775188900, + 182936535166720, + 21888242871839275222246405745257275088548364400416034343698204119217469094173, + 77150274154847, + 397675269254793, + 106524843615227, + 69706000256107, + 21888242871839275222246405745257275088548364400416034343698203822644985161446, + 255969823960893, + 48549319747822, + 21888242871839275222246405745257275088548364400416034343698204037368260241338, + 21888242871839275222246405745257275088548364400416034343698203897770086458230, + 365080161463045, + 21888242871839275222246405745257275088548364400416034343698203632090272029602, + 21888242871839275222246405745257275088548364400416034343698203760187120165277, + 21888242871839275222246405745257275088548364400416034343698203820468418695096, + 150829976823177, + 77748320945323, + 21888242871839275222246405745257275088548364400416034343698203727454532365613, + 21888242871839275222246405745257275088548364400416034343698203737916524754938, + 21888242871839275222246405745257275088548364400416034343698203702747105788886, + 21888242871839275222246405745257275088548364400416034343698204104571680353268, + 21888242871839275222246405745257275088548364400416034343698203933033330172245, + 21888242871839275222246405745257275088548364400416034343698203751268627519148, + 393175689019022, + 134037383483008, + 21888242871839275222246405745257275088548364400416034343698203828460842143273, + 35742570456134, + 21888242871839275222246405745257275088548364400416034343698203801741695813093, + 21888242871839275222246405745257275088548364400416034343698204050984265974180, + 439783037192541, + 448655545335378, + 21888242871839275222246405745257275088548364400416034343698203655998586218238, + 21888242871839275222246405745257275088548364400416034343698204082944425427121, + 21888242871839275222246405745257275088548364400416034343698204030819291390786, + 21888242871839275222246405745257275088548364400416034343698203648358835154371, + 114028637942967, + 21888242871839275222246405745257275088548364400416034343698203638004945419094, + 21888242871839275222246405745257275088548364400416034343698204048397478456974, + 21888242871839275222246405745257275088548364400416034343698203730544346691129, + 557579709139672, + 34932030901680, + 21888242871839275222246405745257275088548364400416034343698203777872431759236, + 474616811282757, + 21888242871839275222246405745257275088548364400416034343698203653573193025026, + 21888242871839275222246405745257275088548364400416034343698203676739520325079, + 21888242871839275222246405745257275088548364400416034343698203760412515674447, + 301273641556760, + 365770289745350, + 172262698150711, + 21888242871839275222246405745257275088548364400416034343698203911256957331728, + 21888242871839275222246405745257275088548364400416034343698203930045184913011, + 21888242871839275222246405745257275088548364400416034343698203949285077077456, + 449972191224521, + 312744562422998, + 463535495994956, + 229274188747381, + 356938142897327, + 205579036063302, + 341210306048223, + 340673547219670, + 33668262330935, + 238079985384487, + 21888242871839275222246405745257275088548364400416034343698203678944881688905, + 341504688703364, + 21888242871839275222246405745257275088548364400416034343698204015258345982475, + 546059542865523, + 523443328299551, + 21888242871839275222246405745257275088548364400416034343698203727508553582974, + 449835743554049, + 435750765497829, + 21888242871839275222246405745257275088548364400416034343698204114800040628096, + 375017883349873, + 21888242871839275222246405745257275088548364400416034343698204026407671853036, + 21888242871839275222246405745257275088548364400416034343698204114894736328275, + 21888242871839275222246405745257275088548364400416034343698204175260888873421, + 166231403202750, + 369455655132567, + 21888242871839275222246405745257275088548364400416034343698203663218707049809, + 411514703053285, + 21888242871839275222246405745257275088548364400416034343698204161118722224817, + 331535847882216, + 475230520371602, + 21888242871839275222246405745257275088548364400416034343698204158663843032500, + 42798342492698, + 351132140560540, + 394303053445472, + 458588275800499, + 21888242871839275222246405745257275088548364400416034343698203980049400018678, + 21888242871839275222246405745257275088548364400416034343698203880103103696592, + 21888242871839275222246405745257275088548364400416034343698203812457029313041, + 21888242871839275222246405745257275088548364400416034343698203669889945412122, + 21888242871839275222246405745257275088548364400416034343698203874570436137996, + 519912680082004, + 51958889707198, + 21888242871839275222246405745257275088548364400416034343698203820282407746413, + 21888242871839275222246405745257275088548364400416034343698203907569017930815, + 21888242871839275222246405745257275088548364400416034343698203913999540028952, + 445683835705647, + 109915012519202, + 21888242871839275222246405745257275088548364400416034343698203760342144804542, + 21888242871839275222246405745257275088548364400416034343698203885769929114482, + 316698946514328, + 21888242871839275222246405745257275088548364400416034343698203936106802618389, + 21888242871839275222246405745257275088548364400416034343698203928916800958658, + 46320987347003, + 21888242871839275222246405745257275088548364400416034343698204072473742425051, + 93884075486136, + 523604486518690, + 296929366733636, + 21888242871839275222246405745257275088548364400416034343698203640081858825389, + 21888242871839275222246405745257275088548364400416034343698203778669543381971, + 345637059705942, + 539408406077955, + 21888242871839275222246405745257275088548364400416034343698204125103841830300, + 101747753984042, + 21888242871839275222246405745257275088548364400416034343698203669534344392282, + 21888242871839275222246405745257275088548364400416034343698203717565931794004, + 350532465452171, + 217560651747227, + 185473191346192, + 21888242871839275222246405745257275088548364400416034343698204157841992153581, + 84440210845403, + 431354995568554, + 21888242871839275222246405745257275088548364400416034343698203965194145103680, + 21888242871839275222246405745257275088548364400416034343698204115270115144218, + 21888242871839275222246405745257275088548364400416034343698204113208857286753, + 166446193408614, + 21888242871839275222246405745257275088548364400416034343698204062093732321292, + 501430072078405, + 21888242871839275222246405745257275088548364400416034343698203806835532142780, + 522743834554140, + 494073692495339, + 3719392789594, + 21888242871839275222246405745257275088548364400416034343698203982355432719463, + 21888242871839275222246405745257275088548364400416034343698203855992099488908, + 21888242871839275222246405745257275088548364400416034343698203830586162882806, + 21888242871839275222246405745257275088548364400416034343698203844951706186242, + 21888242871839275222246405745257275088548364400416034343698204109570679406096, + 21888242871839275222246405745257275088548364400416034343698203686682920989457, + 330078120853395, + 193527975118964, + 21888242871839275222246405745257275088548364400416034343698204129332487609592, + 37965957891519, + 21888242871839275222246405745257275088548364400416034343698203972582870487059, + 21888242871839275222246405745257275088548364400416034343698204180935688587990, + 5393660445031, + 21888242871839275222246405745257275088548364400416034343698204029978440239078, + 21888242871839275222246405745257275088548364400416034343698204111711330558230, + 21888242871839275222246405745257275088548364400416034343698204059825817425155, + 21888242871839275222246405745257275088548364400416034343698203711654578173043, + 21888242871839275222246405745257275088548364400416034343698203966810806458972, + 21888242871839275222246405745257275088548364400416034343698203826872719898931, + 304775162519655, + 21888242871839275222246405745257275088548364400416034343698204002784004034023, + 66847949890201, + 21888242871839275222246405745257275088548364400416034343698203846782551972224, + 311537521562654, + 176951302842380, + 21888242871839275222246405745257275088548364400416034343698204150761728876885, + 21888242871839275222246405745257275088548364400416034343698203788813486746679, + 21888242871839275222246405745257275088548364400416034343698203684983484757167, + 21888242871839275222246405745257275088548364400416034343698203828551190626971, + 183770290107769, + 222030156551135, + 21888242871839275222246405745257275088548364400416034343698203693383119894026, + 287887705920338, + 256460509656653, + 421924366072760, + 21888242871839275222246405745257275088548364400416034343698204031138681410486, + 215988638645221, + 21888242871839275222246405745257275088548364400416034343698203755667494409658, + 21888242871839275222246405745257275088548364400416034343698203667142227954259, + 239923752432096, + 528281761612990, + 62490480500769, + 21888242871839275222246405745257275088548364400416034343698203747610029302020, + 446867814257683, + 319438142185340, + 21888242871839275222246405745257275088548364400416034343698203881280771741171, + 21888242871839275222246405745257275088548364400416034343698203840437289793817, + 528434799685519, + 316232536168023, + 21888242871839275222246405745257275088548364400416034343698204040445603073479, + 21888242871839275222246405745257275088548364400416034343698203943644417929281, + 363396028236704, + 86904052393332, + 433947141618424, + 295290933256310, + 21888242871839275222246405745257275088548364400416034343698204110727164460287, + 21888242871839275222246405745257275088548364400416034343698203895598840008571, + 21888242871839275222246405745257275088548364400416034343698203984930801060094, + 21888242871839275222246405745257275088548364400416034343698203893906443302656, + 21888242871839275222246405745257275088548364400416034343698203743225250789360, + 91071988680148, + 21888242871839275222246405745257275088548364400416034343698204011428748062161, + 21888242871839275222246405745257275088548364400416034343698203852089942826267, + 21888242871839275222246405745257275088548364400416034343698204176521205217137, + 396567591629729, + 21888242871839275222246405745257275088548364400416034343698204110728008308768, + 224229888107723, + 426789608953826, + 21888242871839275222246405745257275088548364400416034343698204155921478569898, + 421955168538313, + 21888242871839275222246405745257275088548364400416034343698203945105423338629, + 21888242871839275222246405745257275088548364400416034343698204027910637295828, + 501826368259759, + 519211473598766, + 269861483225283, + 21888242871839275222246405745257275088548364400416034343698203990142782984656, + 433290036252215, + 289117857027727, + 103496242392371, + 213856306585633, + 21888242871839275222246405745257275088548364400416034343698203914941895799739, + 21888242871839275222246405745257275088548364400416034343698204024726142158764, + 192941659879754, + 514760780643453, + 127150728932315, + 21888242871839275222246405745257275088548364400416034343698204154357038633682, + 21888242871839275222246405745257275088548364400416034343698203681330765829363, + 509136440811235, + 21888242871839275222246405745257275088548364400416034343698204146845405011968, + 348903801780962, + 424774434268993, + 21888242871839275222246405745257275088548364400416034343698204058788842899353, + 21888242871839275222246405745257275088548364400416034343698204137565413853057, + 74831812469641, + 892302944054, + 21888242871839275222246405745257275088548364400416034343698203768092732357165, + 247209334170739, + 21888242871839275222246405745257275088548364400416034343698203904500701985813, + 21888242871839275222246405745257275088548364400416034343698204089770654726989, + 21888242871839275222246405745257275088548364400416034343698203646230379670352, + 21888242871839275222246405745257275088548364400416034343698203729474105440668, + 27843482421647, + 39982272368817, + 380069189867610, + 21888242871839275222246405745257275088548364400416034343698203791911772796713, + 21888242871839275222246405745257275088548364400416034343698204130262597112741, + 556450134008080, + 45877740897446, + 193666081767515, + 327670941276491, + 67557341848775, + 163944705772766, + 136234812147423, + 23419827603141, + 520286756679069, + 479074114615317, + 21888242871839275222246405745257275088548364400416034343698204168890532972020, + 488205008433209, + 330158654684558, + 21888242871839275222246405745257275088548364400416034343698203649464692566860, + 21888242871839275222246405745257275088548364400416034343698203994441979122742, + 21888242871839275222246405745257275088548364400416034343698203882051332050689, + 152051618761109, + 259586377276622, + 54895444191229, + 21888242871839275222246405745257275088548364400416034343698203629064139854892, + 21888242871839275222246405745257275088548364400416034343698203728731403723332, + 535577678524433, + 21888242871839275222246405745257275088548364400416034343698203861134212094374, + 21888242871839275222246405745257275088548364400416034343698203922779937035597, + 280744351209485, + 235900359135282, + 21888242871839275222246405745257275088548364400416034343698203674564738192052, + 112844691968336, + 21888242871839275222246405745257275088548364400416034343698203862979712607898, + 521434684638144, + 11320724424084, + 154994551638201, + 443888493825285, + 21888242871839275222246405745257275088548364400416034343698203866126126893103, + 21888242871839275222246405745257275088548364400416034343698204101907431940104, + 21888242871839275222246405745257275088548364400416034343698204065182683346975, + 59459533813832, + 21888242871839275222246405745257275088548364400416034343698203809754608433659, + 21888242871839275222246405745257275088548364400416034343698203660843827796613, + 21888242871839275222246405745257275088548364400416034343698203782946924284337, + 352191636374278, + 21888242871839275222246405745257275088548364400416034343698203832132248368846, + 427609722654805, + 21888242871839275222246405745257275088548364400416034343698204046867923124257, + 477296937986892, + 47184794741576, + 21888242871839275222246405745257275088548364400416034343698203645424700719988, + 441555798077575, + 125541194220162, + 21888242871839275222246405745257275088548364400416034343698203824970808873472, + 234308167447942, + 21888242871839275222246405745257275088548364400416034343698203966636019834067, + 21888242871839275222246405745257275088548364400416034343698204060518280660241, + 21888242871839275222246405745257275088548364400416034343698203704508984982197, + 21888242871839275222246405745257275088548364400416034343698203635071387535769, + 47388693404488, + 18944143445541, + 21888242871839275222246405745257275088548364400416034343698203735440348853032, + 21888242871839275222246405745257275088548364400416034343698203900970793667048, + 416519658813398, + 21888242871839275222246405745257275088548364400416034343698203747450611581066, + 504292389636527, + 481381577952895, + 47737502588253, + 25932844131486, + 210998950556168, + 21888242871839275222246405745257275088548364400416034343698203676870483432756, + 21888242871839275222246405745257275088548364400416034343698203860245943699617, + 21888242871839275222246405745257275088548364400416034343698203647149946665762, + 71879825625774, + 30561950246370, + 304082966119636, + 21888242871839275222246405745257275088548364400416034343698204033219921277445, + 21888242871839275222246405745257275088548364400416034343698204049529344413506, + 560767140107018, + 440398602626594, + 77255454237395, + 224158788954071, + 21888242871839275222246405745257275088548364400416034343698204134848111855742, + 21888242871839275222246405745257275088548364400416034343698203861746196195238, + 143663104484241, + 21888242871839275222246405745257275088548364400416034343698203992913087380873, + 556976572317346, + 21888242871839275222246405745257275088548364400416034343698204072996670194221, + 299533605375563, + 21888242871839275222246405745257275088548364400416034343698204049893323061006, + 21888242871839275222246405745257275088548364400416034343698203919904600291314, + 21888242871839275222246405745257275088548364400416034343698203697718329242279, + 4452055434410, + 119455372261426, + 113621952531295, + 82075573337473, + 21888242871839275222246405745257275088548364400416034343698203819503692569807, + 21888242871839275222246405745257275088548364400416034343698203678444452021009, + 393852359518757, + 509916972216681, + 21888242871839275222246405745257275088548364400416034343698203689320707545521, + 21888242871839275222246405745257275088548364400416034343698203703023276327000, + 21888242871839275222246405745257275088548364400416034343698203818862577344779, + 179236084431757, + 492024679844131, + 21888242871839275222246405745257275088548364400416034343698204044115697341089, + 139502867820558, + 21888242871839275222246405745257275088548364400416034343698203773551139240972, + 21888242871839275222246405745257275088548364400416034343698203905931331243540, + 21888242871839275222246405745257275088548364400416034343698203747326551500451, + 21888242871839275222246405745257275088548364400416034343698203934430245581037, + 263287688622628, + 521304601510882, + 21888242871839275222246405745257275088548364400416034343698203957098228757784, + 89195499035076, + 120660826062772, + 397202870783595, + 21888242871839275222246405745257275088548364400416034343698203711526130248601, + 21888242871839275222246405745257275088548364400416034343698204036572533061859, + 21888242871839275222246405745257275088548364400416034343698203672509932016707, + 496737252884777, + 21888242871839275222246405745257275088548364400416034343698203726099999441360, + 21888242871839275222246405745257275088548364400416034343698204008531893079628, + 21888242871839275222246405745257275088548364400416034343698204027996624853302, + 60420260945901, + 312022207978752, + 21888242871839275222246405745257275088548364400416034343698204028060301419473, + 40652025719732, + 530285187866930, + 21888242871839275222246405745257275088548364400416034343698203887551566834125, + 21888242871839275222246405745257275088548364400416034343698203939734105418342, + 21888242871839275222246405745257275088548364400416034343698203761760527236489, + 21888242871839275222246405745257275088548364400416034343698203639625367571470, + 526393831439058, + 21888242871839275222246405745257275088548364400416034343698204091084508343387, + 21888242871839275222246405745257275088548364400416034343698203693218317969401, + 136885029001399, + 464785409931731, + 503037937422684, + 21888242871839275222246405745257275088548364400416034343698203928914460887637, + 267210516841594, + 21888242871839275222246405745257275088548364400416034343698203901020280505214, + 407693235148757, + 231862893107407, + 21888242871839275222246405745257275088548364400416034343698203798420836943211, + 21888242871839275222246405745257275088548364400416034343698203945502728382903, + 558935674672965, + 490043117892077, + 21888242871839275222246405745257275088548364400416034343698204161599442423217, + 233216010279606, + 21888242871839275222246405745257275088548364400416034343698204105070429062440, + 21888242871839275222246405745257275088548364400416034343698204138851096443820, + 46388737021661, + 267639487750370, + 21888242871839275222246405745257275088548364400416034343698203640659031794844, + 21888242871839275222246405745257275088548364400416034343698203969006566401656, + 21888242871839275222246405745257275088548364400416034343698204137008334307919, + 537691697422302, + 21888242871839275222246405745257275088548364400416034343698203776856900750460, + 356083460671785, + 163857172348520, + 465952817418722, + 21888242871839275222246405745257275088548364400416034343698203994120396913458, + 302113642771337, + 21888242871839275222246405745257275088548364400416034343698203717647906802483, + 379406848530787, + 293994115353137, + 41202884880125, + 85398205219102, + 21888242871839275222246405745257275088548364400416034343698204009039679799497, + 21888242871839275222246405745257275088548364400416034343698203668182078402311, + 21888242871839275222246405745257275088548364400416034343698203697773619317976, + 164572121893470, + 561892742654780, + 227123557223346, + 21888242871839275222246405745257275088548364400416034343698203917265453910685, + 21888242871839275222246405745257275088548364400416034343698203760798778531034, + 178311369811334, + 343241399854948, + 21888242871839275222246405745257275088548364400416034343698203720921638955783, + 381387452001754, + 205487763537796, + 21888242871839275222246405745257275088548364400416034343698203832123953237051, + 21888242871839275222246405745257275088548364400416034343698203948676798858209, + 510268206621810, + 21888242871839275222246405745257275088548364400416034343698203629593727984836, + 21888242871839275222246405745257275088548364400416034343698203977188958832951, + 157626271793288, + 21888242871839275222246405745257275088548364400416034343698203781523366456323, + 21888242871839275222246405745257275088548364400416034343698204140749362870938, + 500942179851683, + 21888242871839275222246405745257275088548364400416034343698204112783036510118, + 479737596235756, + 533649000164608, + 235331075428883, + 21888242871839275222246405745257275088548364400416034343698204154520263950538, + 21888242871839275222246405745257275088548364400416034343698203650645069618865, + 21888242871839275222246405745257275088548364400416034343698203887047109391984, + 21888242871839275222246405745257275088548364400416034343698204131192041800029, + 21888242871839275222246405745257275088548364400416034343698203900757724078257, + 21888242871839275222246405745257275088548364400416034343698204163395274463813, + 21888242871839275222246405745257275088548364400416034343698203949488268174711, + 21888242871839275222246405745257275088548364400416034343698203883422816805037, + 377908495741096, + 417276123734821, + 21888242871839275222246405745257275088548364400416034343698203658144776699609, + 551340399941958, + 553995239100698, + 21888242871839275222246405745257275088548364400416034343698203825604913278875, + 103542093852025, + 67824173683310, + 21888242871839275222246405745257275088548364400416034343698204003314002634878, + 263375769474696, + 423357634234312, + 454310194642081, + 459039407596345, + 21888242871839275222246405745257275088548364400416034343698203784123579057539, + 351784669012896, + 21888242871839275222246405745257275088548364400416034343698203867090074014639, + 179434762104359, + 21888242871839275222246405745257275088548364400416034343698203908660347434687, + 82034726267099, + 431001902919577, + 298692993191922, + 480289361595407, + 21888242871839275222246405745257275088548364400416034343698203730955325043781, + 21888242871839275222246405745257275088548364400416034343698204116230690669886, + 528373167669544, + 21888242871839275222246405745257275088548364400416034343698203916401156048529, + 21888242871839275222246405745257275088548364400416034343698203779916876297878, + 167017549991844, + 21888242871839275222246405745257275088548364400416034343698203706045407997859, + 21888242871839275222246405745257275088548364400416034343698203966739615331758, + 21888242871839275222246405745257275088548364400416034343698204106475174136266, + 62564304036813, + 332420977515105, + 98567258870753, + 21888242871839275222246405745257275088548364400416034343698204184258896344398, + 475939786495167, + 21888242871839275222246405745257275088548364400416034343698203828439206341219, + 218297415014216, + 21888242871839275222246405745257275088548364400416034343698203699932328445288, + 397355095005661, + 535710100388408, + 140856670489357, + 21888242871839275222246405745257275088548364400416034343698204114523518686709, + 234298358204543, + 21888242871839275222246405745257275088548364400416034343698204109676477252201, + 299310859716853, + 222825205607126, + 21888242871839275222246405745257275088548364400416034343698203777650404816934, + 21888242871839275222246405745257275088548364400416034343698204149774516370442, + 21888242871839275222246405745257275088548364400416034343698204129517794899751, + 21888242871839275222246405745257275088548364400416034343698203712714118575121, + 278587457190062, + 21888242871839275222246405745257275088548364400416034343698203691356530566485, + 21888242871839275222246405745257275088548364400416034343698203682389962946059, + 21888242871839275222246405745257275088548364400416034343698204081867828994928, + 21888242871839275222246405745257275088548364400416034343698203879262111502408, + 21888242871839275222246405745257275088548364400416034343698203999036478942913, + 21888242871839275222246405745257275088548364400416034343698203830315858970959, + 21888242871839275222246405745257275088548364400416034343698204154617764520975, + 21888242871839275222246405745257275088548364400416034343698203965790550451493, + 21888242871839275222246405745257275088548364400416034343698203752262133906872, + 21888242871839275222246405745257275088548364400416034343698204040301021439691, + 463504083490893, + 21888242871839275222246405745257275088548364400416034343698203912948812720661, + 186244804530812, + 299159626406562, + 350388564892772, + 56378706589091, + 284634396797374, + 205420402299788, + 208763746883304, + 530356335691251, + 484080716642682, + 21888242871839275222246405745257275088548364400416034343698203688114719415873, + 21888242871839275222246405745257275088548364400416034343698204104012663516812, + 21888242871839275222246405745257275088548364400416034343698203660279254973970, + 473832757599031, + 129006276857400, + 484174207516884, + 261303921130906, + 126812444647305, + 541457420682467, + 157544911000058, + 276858784991133, + 21888242871839275222246405745257275088548364400416034343698204113310572127619, + 149849755604473, + 21888242871839275222246405745257275088548364400416034343698203629815699059970, + 75013581181648, + 21888242871839275222246405745257275088548364400416034343698203828226922083028, + 331143390314756, + 21888242871839275222246405745257275088548364400416034343698203912059775568381, + 213004145317245, + 21888242871839275222246405745257275088548364400416034343698203842634057278876, + 21888242871839275222246405745257275088548364400416034343698204073103305502595, + 21888242871839275222246405745257275088548364400416034343698204062651016323618, + 264177473420867, + 188465924121807, + 21888242871839275222246405745257275088548364400416034343698203975487789433455, + 21888242871839275222246405745257275088548364400416034343698204177020107803529, + 128537778229545, + 141503083933890, + 21888242871839275222246405745257275088548364400416034343698204151204133174673, + 21888242871839275222246405745257275088548364400416034343698203805724484687332, + 21888242871839275222246405745257275088548364400416034343698203719930325662077, + 21888242871839275222246405745257275088548364400416034343698203823563678608452, + 21888242871839275222246405745257275088548364400416034343698203879574457348137, + 21888242871839275222246405745257275088548364400416034343698203631546483601394, + 21888242871839275222246405745257275088548364400416034343698203856237583883560, + 202525886830901, + 21888242871839275222246405745257275088548364400416034343698203884285842109173, + 21888242871839275222246405745257275088548364400416034343698203895968169080806, + 21888242871839275222246405745257275088548364400416034343698204147493377321587, + 260369425418164, + 21888242871839275222246405745257275088548364400416034343698203766648367358439, + 423580012208881, + 21888242871839275222246405745257275088548364400416034343698204159495182223271, + 454859299148651, + 57150288689987, + 311099409089785, + 21888242871839275222246405745257275088548364400416034343698203927348557216563, + 21888242871839275222246405745257275088548364400416034343698204098497543984078, + 553548734813724, + 205692297749058, + 37434733982437, + 21888242871839275222246405745257275088548364400416034343698204012018693771374, + 21888242871839275222246405745257275088548364400416034343698203731845205208280, + 71707294343552, + 398609176556007, + 21888242871839275222246405745257275088548364400416034343698204047062402147356, + 21888242871839275222246405745257275088548364400416034343698204134676769339614, + 295067672513162, + 379264037505866, + 111484500252136, + 409912209657672, + 404997071021539, + 189036180393834, + 21888242871839275222246405745257275088548364400416034343698203635464941618512, + 21888242871839275222246405745257275088548364400416034343698203918194839092965, + 448577153842275, + 21888242871839275222246405745257275088548364400416034343698203649035457996971, + 561580576235309, + 21888242871839275222246405745257275088548364400416034343698203800237496495896, + 121792033815611, + 21888242871839275222246405745257275088548364400416034343698203931323273544469, + 551421895827799, + 310255748309285, + 21888242871839275222246405745257275088548364400416034343698203832054338581872, + 21888242871839275222246405745257275088548364400416034343698204140508523138817, + 21888242871839275222246405745257275088548364400416034343698203678347428786989, + 84857398565426, + 21888242871839275222246405745257275088548364400416034343698203980346854177704, + 73746810524318, + 201200644131545, + 21888242871839275222246405745257275088548364400416034343698203891143455773473, + 21888242871839275222246405745257275088548364400416034343698203736549334247278, + 525375249860535, + 171744563393108, + 160058207875193, + 21888242871839275222246405745257275088548364400416034343698203867223568542791, + 21888242871839275222246405745257275088548364400416034343698203679743026107385, + 254312141436128, + 21888242871839275222246405745257275088548364400416034343698203640969408474046, + 21888242871839275222246405745257275088548364400416034343698203999845236528662, + 185560011809236, + 292998018703314, + 495963441175695, + 313770671586545, + 303247065260862, + 326531215671668, + 536450387077505, + 21888242871839275222246405745257275088548364400416034343698203638276661242023, + 21888242871839275222246405745257275088548364400416034343698203768346965091597, + 133984282015820, + 352531305812089, + 21888242871839275222246405745257275088548364400416034343698204087077863785756, + 476914748906312, + 21888242871839275222246405745257275088548364400416034343698203806825396576729, + 21888242871839275222246405745257275088548364400416034343698204164269025795146, + 185817158574403, + 13204602055238, + 192147160772989, + 21888242871839275222246405745257275088548364400416034343698203635590285790885, + 189200624025228, + 35599073342021, + 406125077927575, + 21888242871839275222246405745257275088548364400416034343698204135819313133419, + 338228087673799, + 21888242871839275222246405745257275088548364400416034343698203790161349639608, + 420361572247166, + 478096482180598, + 21888242871839275222246405745257275088548364400416034343698204066769435918623, + 436083364199735, + 21888242871839275222246405745257275088548364400416034343698203935480438651256, + 215607282283951, + 21888242871839275222246405745257275088548364400416034343698203715336895527141, + 21888242871839275222246405745257275088548364400416034343698204026929987363870, + 21888242871839275222246405745257275088548364400416034343698203734645842992682, + 21888242871839275222246405745257275088548364400416034343698203718498638227086, + 21888242871839275222246405745257275088548364400416034343698204032806023599355, + 21888242871839275222246405745257275088548364400416034343698203996497219959137, + 152122364193873, + 21888242871839275222246405745257275088548364400416034343698203730496514133139, + 165029531853230, + 294591651067040, + 186578915755796, + 21888242871839275222246405745257275088548364400416034343698203793967032753834, + 498401319207661, + 310754403092239, + 479454015217445, + 529440321063673, + 21888242871839275222246405745257275088548364400416034343698203993769799027462, + 21888242871839275222246405745257275088548364400416034343698204096920008913254, + 99492430454983, + 267669876917893, + 368813387702610, + 21888242871839275222246405745257275088548364400416034343698203950273692984160, + 21888242871839275222246405745257275088548364400416034343698203970146058619503, + 132234648084178, + 21888242871839275222246405745257275088548364400416034343698203906457003650897, + 554166936201602, + 55434473297584, + 434178193215542, + 21888242871839275222246405745257275088548364400416034343698203632019866760494, + 166841294940905, + 499440258416342, + 511277157982491, + 21888242871839275222246405745257275088548364400416034343698204022693031798702, + 542190519717203, + 21888242871839275222246405745257275088548364400416034343698203786683321285278, + 21888242871839275222246405745257275088548364400416034343698203994224843513503, + 424287065983598, + 168901597960972, + 193648281419331, + 21888242871839275222246405745257275088548364400416034343698203873108909597270, + 21888242871839275222246405745257275088548364400416034343698204084860287695554, + 164573150181655, + 254215527849393, + 21888242871839275222246405745257275088548364400416034343698203931440791327268, + 496970025596043, + 21888242871839275222246405745257275088548364400416034343698203904610819151889, + 21888242871839275222246405745257275088548364400416034343698204035800495235251, + 21888242871839275222246405745257275088548364400416034343698203956287768103086, + 293883603258904, + 21888242871839275222246405745257275088548364400416034343698204120862095762335, + 21888242871839275222246405745257275088548364400416034343698203750793819188617, + 69222717185372, + 21888242871839275222246405745257275088548364400416034343698203863182304655186, + 140847659164317, + 21888242871839275222246405745257275088548364400416034343698203902297499585452, + 312219096589750, + 490102645601617, + 492913714791076, + 20433981725867, + 449091431068070, + 449003213890764, + 21888242871839275222246405745257275088548364400416034343698203843655840750513, + 305338740705300, + 21888242871839275222246405745257275088548364400416034343698203789120857969370, + 21888242871839275222246405745257275088548364400416034343698204159059828419524, + 139945954557259, + 21888242871839275222246405745257275088548364400416034343698203673748366603666, + 549389579226919, + 21888242871839275222246405745257275088548364400416034343698203743742447953864, + 21888242871839275222246405745257275088548364400416034343698203825992349174370, + 438099354066723, + 21888242871839275222246405745257275088548364400416034343698203902381400334635, + 21888242871839275222246405745257275088548364400416034343698204020860376392053, + 89221117512524, + 128841315864945, + 21888242871839275222246405745257275088548364400416034343698204150569160037783, + 21888242871839275222246405745257275088548364400416034343698204105100365288878, + 21888242871839275222246405745257275088548364400416034343698203769341459140246, + 240911916955519, + 2673696289890, + 202609680636687, + 21888242871839275222246405745257275088548364400416034343698203908261987830993, + 364853109358003, + 21888242871839275222246405745257275088548364400416034343698203774441058583266, + 303228908402196, + 21888242871839275222246405745257275088548364400416034343698203758503829701031, + 21888242871839275222246405745257275088548364400416034343698204080101574357017, + 300242403036693, + 178036665403242, + 21888242871839275222246405745257275088548364400416034343698204131140157366078, + 221253804856509, + 21888242871839275222246405745257275088548364400416034343698203656351306816442, + 209759988390552, + 174674677735048, + 21888242871839275222246405745257275088548364400416034343698203705874627106437, + 21888242871839275222246405745257275088548364400416034343698203842395175735243, + 21888242871839275222246405745257275088548364400416034343698203962461024124405, + 120402853804685, + 21888242871839275222246405745257275088548364400416034343698204128189533796568, + 136265580619995, + 21888242871839275222246405745257275088548364400416034343698204032202905860770, + 21888242871839275222246405745257275088548364400416034343698204176279524163269, + 21888242871839275222246405745257275088548364400416034343698203768825520813735, + 364178039107286, + 1356582893607, + 21888242871839275222246405745257275088548364400416034343698203749198594698880, + 310387643491611, + 21888242871839275222246405745257275088548364400416034343698203673945692482684, + 366206817012554, + 21888242871839275222246405745257275088548364400416034343698204118648709083658, + 172794727985365, + 21888242871839275222246405745257275088548364400416034343698204030683119351134, + 21888242871839275222246405745257275088548364400416034343698203975267775556894, + 40419526026850, + 39070485044337, + 187223889083220, + 72511992154499, + 21888242871839275222246405745257275088548364400416034343698203928090080327989, + 234798269742943, + 220786076944803, + 408431987709410, + 79872490983893, + 47137963106900, + 21888242871839275222246405745257275088548364400416034343698203963626370814085, + 21888242871839275222246405745257275088548364400416034343698204076749699704551, + 49508579682204, + 132562286371996, + 270209962180264, + 244218151943723, + 21888242871839275222246405745257275088548364400416034343698204159017174287347, + 107937542682258, + 21888242871839275222246405745257275088548364400416034343698203791007403106652, + 21888242871839275222246405745257275088548364400416034343698204134024630999903, + 553469955509880, + 21888242871839275222246405745257275088548364400416034343698204104059145633118, + 472235947793146, + 21888242871839275222246405745257275088548364400416034343698203719320144213589, + 13459229579635, + 482745226136076, + 286013987325941, + 21888242871839275222246405745257275088548364400416034343698203967563701767111, + 398521828205282, + 234827593756359, + 21888242871839275222246405745257275088548364400416034343698203665634150123109, + 239909534944994, + 91892960674232, + 199972148984927, + 294699009540666, + 21888242871839275222246405745257275088548364400416034343698203988040375785217, + 366176732305295, + 21888242871839275222246405745257275088548364400416034343698204186079156129298, + 160630496952433, + 21888242871839275222246405745257275088548364400416034343698204022326979671038, + 21888242871839275222246405745257275088548364400416034343698203857831751615945, + 21888242871839275222246405745257275088548364400416034343698203758591809043561, + 21888242871839275222246405745257275088548364400416034343698203671147099373371, + 21888242871839275222246405745257275088548364400416034343698204117471525981425, + 21888242871839275222246405745257275088548364400416034343698203724589008934501, + 21888242871839275222246405745257275088548364400416034343698204022334788725646, + 440707389230241, + 21888242871839275222246405745257275088548364400416034343698203775892664291293, + 139357637064964, + 315184873980567, + 21888242871839275222246405745257275088548364400416034343698203675300114511142, + 21888242871839275222246405745257275088548364400416034343698203742702187863870, + 313076784388190, + 21888242871839275222246405745257275088548364400416034343698203931360236324490, + 339809559282988, + 505897259799078, + 21888242871839275222246405745257275088548364400416034343698203926642451433361, + 21888242871839275222246405745257275088548364400416034343698203801923168900344, + 445287713139365, + 461384225739844, + 21888242871839275222246405745257275088548364400416034343698204147823154017794, + 179673125622414, + 277564460341777, + 502119600408604, + 21888242871839275222246405745257275088548364400416034343698203998743035318483, + 21888242871839275222246405745257275088548364400416034343698203765488886794160, + 21888242871839275222246405745257275088548364400416034343698203881006730857171, + 35566788905052, + 162059199112202, + 21888242871839275222246405745257275088548364400416034343698203761511250212751, + 191376797662993, + 483225351643527, + 21888242871839275222246405745257275088548364400416034343698204030241348463522, + 21888242871839275222246405745257275088548364400416034343698203968722492382776, + 21888242871839275222246405745257275088548364400416034343698204169993031812264, + 297019322087247, + 21888242871839275222246405745257275088548364400416034343698203794647943516374, + 66869870825848, + 207194139434685, + 21888242871839275222246405745257275088548364400416034343698204092887746060475, + 21888242871839275222246405745257275088548364400416034343698203967179683638859, + 21888242871839275222246405745257275088548364400416034343698203788512307681044, + 21888242871839275222246405745257275088548364400416034343698203983587967077361, + 21888242871839275222246405745257275088548364400416034343698203944184626470355, + 21888242871839275222246405745257275088548364400416034343698203870648867960106, + 21888242871839275222246405745257275088548364400416034343698203936976933544123, + 21888242871839275222246405745257275088548364400416034343698204162807148577351, + 526683616725833, + 21888242871839275222246405745257275088548364400416034343698204165916050588114, + 548981551430183, + 185893722010234, + 21888242871839275222246405745257275088548364400416034343698203684979252182206, + 149226956177914, + 21888242871839275222246405745257275088548364400416034343698203749988763445127, + 21888242871839275222246405745257275088548364400416034343698204112859876232828, + 21888242871839275222246405745257275088548364400416034343698203650110488113956, + 179776189489486, + 21888242871839275222246405745257275088548364400416034343698203805488409892063, + 21888242871839275222246405745257275088548364400416034343698204179266273923716, + 21888242871839275222246405745257275088548364400416034343698203720445819400952, + 21888242871839275222246405745257275088548364400416034343698203934420882851878, + 378226559131230, + 507556487143643, + 21888242871839275222246405745257275088548364400416034343698204085279209866737, + 21888242871839275222246405745257275088548364400416034343698203778292458653157, + 21888242871839275222246405745257275088548364400416034343698203828955798016208, + 21888242871839275222246405745257275088548364400416034343698204028833740787145, + 519670515726538, + 452723096417371, + 214530177456004, + 559996399516984, + 326174080366847, + 21888242871839275222246405745257275088548364400416034343698204164175941936852, + 339736108671726, + 21888242871839275222246405745257275088548364400416034343698204176317742740519, + 21888242871839275222246405745257275088548364400416034343698204122894542866427, + 552139666987369, + 197212434999988, + 21888242871839275222246405745257275088548364400416034343698204025928119942441, + 21888242871839275222246405745257275088548364400416034343698204090151210905227, + 21888242871839275222246405745257275088548364400416034343698203796439185281496, + 21888242871839275222246405745257275088548364400416034343698204018187137001058, + 21888242871839275222246405745257275088548364400416034343698204077182770199299, + 527292432400149, + 21888242871839275222246405745257275088548364400416034343698204129245509547378, + 21888242871839275222246405745257275088548364400416034343698203915805107196066, + 21888242871839275222246405745257275088548364400416034343698203955925800166171, + 253976385111435, + 21888242871839275222246405745257275088548364400416034343698203650424166753781, + 21888242871839275222246405745257275088548364400416034343698203879937724517829, + 21888242871839275222246405745257275088548364400416034343698203808966786884497, + 171777217989090, + 168495625678732, + 533010585483832, + 107612980738708, + 126215218246802, + 484195711435912, + 21888242871839275222246405745257275088548364400416034343698203757424945939563, + 74840900797474, + 269948359105196, + 21888242871839275222246405745257275088548364400416034343698203992108120242602, + 13495853665806, + 21888242871839275222246405745257275088548364400416034343698204185746343687790, + 421456245816685, + 139547193665375, + 21888242871839275222246405745257275088548364400416034343698204070978067789285, + 381491782203993, + 21888242871839275222246405745257275088548364400416034343698204048164253612328, + 178318874782682, + 349032250403143, + 201936982457994, + 21888242871839275222246405745257275088548364400416034343698204154838865628985, + 21888242871839275222246405745257275088548364400416034343698203952982464947523, + 21888242871839275222246405745257275088548364400416034343698204146074911313194, + 187862624878566, + 21888242871839275222246405745257275088548364400416034343698204136069834390353, + 34055143593026, + 257779813401405, + 556694628041625, + 21888242871839275222246405745257275088548364400416034343698203817417579764877, + 26628666805680, + 266341789812829, + 510141258091884, + 21888242871839275222246405745257275088548364400416034343698203785657538410395, + 10184227879121, + 21888242871839275222246405745257275088548364400416034343698203739843296226018, + 21888242871839275222246405745257275088548364400416034343698203891481953981017, + 21888242871839275222246405745257275088548364400416034343698203925615609501204, + 137289689149403, + 21888242871839275222246405745257275088548364400416034343698203775939654651542, + 21888242871839275222246405745257275088548364400416034343698204151782630562601, + 21888242871839275222246405745257275088548364400416034343698203644596059712305, + 21888242871839275222246405745257275088548364400416034343698203624747745585254, + 471274636824778, + 21888242871839275222246405745257275088548364400416034343698203686639473610329, + 126926557354284, + 129731459667234, + 501824748403885, + 361860297730854, + 441499700453162, + 21888242871839275222246405745257275088548364400416034343698203877817944840885, + 290694654146897, + 21888242871839275222246405745257275088548364400416034343698203950176049730919, + 21888242871839275222246405745257275088548364400416034343698203992637665597491, + 284792683225647, + 321331087613302, + 338915669218988, + 21888242871839275222246405745257275088548364400416034343698203878346163583550, + 426957525956154, + 325695983017508, + 295638189299400, + 21888242871839275222246405745257275088548364400416034343698203924917774261055, + 98477796468612, + 21888242871839275222246405745257275088548364400416034343698203761208413787614, + 21888242871839275222246405745257275088548364400416034343698203742754003606654, + 177224020621702, + 21888242871839275222246405745257275088548364400416034343698204108348349706235, + 300038522026569, + 224087797940127, + 21888242871839275222246405745257275088548364400416034343698203636453320967630, + 496309061904147, + 21888242871839275222246405745257275088548364400416034343698204072795452003677, + 21888242871839275222246405745257275088548364400416034343698203685357558639328, + 49285295296115, + 446389086161769, + 30599737210640, + 43093757088160, + 21888242871839275222246405745257275088548364400416034343698203643008727463217, + 21888242871839275222246405745257275088548364400416034343698204063514936878081, + 380135632771533, + 21888242871839275222246405745257275088548364400416034343698203891114916257762, + 21888242871839275222246405745257275088548364400416034343698203645360425310164, + 21888242871839275222246405745257275088548364400416034343698204109657110505624, + 23530783878677, + 453639114526245, + 396890581035192, + 295477163925295, + 21888242871839275222246405745257275088548364400416034343698203967963798672394, + 21888242871839275222246405745257275088548364400416034343698204083655977610275, + 166164966657201, + 21888242871839275222246405745257275088548364400416034343698203930708503833560, + 548675290868446, + 483695174244793, + 491424058582499, + 21888242871839275222246405745257275088548364400416034343698204045407629161286, + 21888242871839275222246405745257275088548364400416034343698203822500918356943, + 183650452778325, + 21888242871839275222246405745257275088548364400416034343698204186562442331349, + 334360625702172, + 409503289769451, + 423649074483995, + 192721324509302, + 47278484866832, + 21888242871839275222246405745257275088548364400416034343698203624489969730107, + 345959989732887, + 420551167858349, + 557771860336432, + 21888242871839275222246405745257275088548364400416034343698204146891144333222, + 21888242871839275222246405745257275088548364400416034343698204089213601147736, + 21888242871839275222246405745257275088548364400416034343698203816415430789125, + 195413966534021, + 21888242871839275222246405745257275088548364400416034343698203658577709421287, + 21888242871839275222246405745257275088548364400416034343698203681051405049349, + 34435279552721, + 229961936094201, + 21888242871839275222246405745257275088548364400416034343698203831206125375973, + 252771509188240, + 21888242871839275222246405745257275088548364400416034343698204043655368326684, + 171696075938515, + 87176622353562, + 21888242871839275222246405745257275088548364400416034343698203777729799792483, + 434074265930242, + 479823504345816, + 384243228903304, + 455709120242589, + 393251494968191, + 21888242871839275222246405745257275088548364400416034343698204069409116476112, + 29751173067907, + 307292613742715, + 21888242871839275222246405745257275088548364400416034343698204066260101748794, + 21888242871839275222246405745257275088548364400416034343698203867364480644320, + 21888242871839275222246405745257275088548364400416034343698204155603092509939, + 21888242871839275222246405745257275088548364400416034343698204167726294539458, + 193992844422174, + 427208671789320, + 21888242871839275222246405745257275088548364400416034343698204083424590771430, + 369458859707684, + 21888242871839275222246405745257275088548364400416034343698203778107312525207, + 313711464444435, + 355643621853238, + 364136680362061, + 437025737367672, + 21888242871839275222246405745257275088548364400416034343698203949013154335742, + 21888242871839275222246405745257275088548364400416034343698203910577218489275, + 365303735386134, + 492225707729929, + 40833794582347, + 306104904094738, + 21888242871839275222246405745257275088548364400416034343698204004732372257641, + 21888242871839275222246405745257275088548364400416034343698203972898692492604, + 101014858947981, + 252516946373151, + 29635663226826, + 21888242871839275222246405745257275088548364400416034343698203668442502639709, + 21888242871839275222246405745257275088548364400416034343698203682283113411348, + 21888242871839275222246405745257275088548364400416034343698203872822552793474, + 40245605973103, + 396034939105245, + 21888242871839275222246405745257275088548364400416034343698203916929891796628, + 305587387603514, + 21888242871839275222246405745257275088548364400416034343698203772407325923007, + 361616272519369, + 21888242871839275222246405745257275088548364400416034343698203716342710716455, + 21888242871839275222246405745257275088548364400416034343698204107613842516143, + 294515306856235, + 39100491615045, + 559439827854314, + 21888242871839275222246405745257275088548364400416034343698203763480976720389, + 21888242871839275222246405745257275088548364400416034343698203996898859436715, + 21888242871839275222246405745257275088548364400416034343698203845675655565090, + 452895112284820, + 21888242871839275222246405745257275088548364400416034343698203783814157602590, + 491948607128879, + 21888242871839275222246405745257275088548364400416034343698203821793587939312, + 21888242871839275222246405745257275088548364400416034343698203857749101791466, + 21888242871839275222246405745257275088548364400416034343698203714930047668437, + 21888242871839275222246405745257275088548364400416034343698203939818188572999, + 21888242871839275222246405745257275088548364400416034343698204132328659853676, + 299755571455614, + 21888242871839275222246405745257275088548364400416034343698203771690848799642, + 21888242871839275222246405745257275088548364400416034343698203732659288427978, + 508330299973327, + 337991434309526, + 21888242871839275222246405745257275088548364400416034343698203720714528308601, + 21888242871839275222246405745257275088548364400416034343698203687046305152534, + 21888242871839275222246405745257275088548364400416034343698203740327376789364, + 127002804492802, + 21888242871839275222246405745257275088548364400416034343698204029210989974115, + 450326475740872, + 21888242871839275222246405745257275088548364400416034343698203762480642291987, + 21888242871839275222246405745257275088548364400416034343698203797642254551086, + 442452732864768, + 466341836555449, + 396970676842825, + 21888242871839275222246405745257275088548364400416034343698204060646207116346, + 21888242871839275222246405745257275088548364400416034343698204016581930175715, + 21888242871839275222246405745257275088548364400416034343698203691773064480018, + 21888242871839275222246405745257275088548364400416034343698203916183986940919, + 235149457152840, + 21888242871839275222246405745257275088548364400416034343698203677924898810670, + 123335791938165, + 160237577610449, + 198536555244490, + 21888242871839275222246405745257275088548364400416034343698203885118135672672, + 149052132671553, + 21888242871839275222246405745257275088548364400416034343698203920751183060769, + 337571125476637, + 21888242871839275222246405745257275088548364400416034343698203752153738668738, + 21888242871839275222246405745257275088548364400416034343698203890017842127275, + 21888242871839275222246405745257275088548364400416034343698204147527141884946, + 85734186499132, + 499328874994762, + 39037797072284, + 21888242871839275222246405745257275088548364400416034343698203809718160930324, + 21888242871839275222246405745257275088548364400416034343698203715505042996318, + 21888242871839275222246405745257275088548364400416034343698203652241063457656, + 561434093962488, + 237710152408405, + 238406318603123, + 21888242871839275222246405745257275088548364400416034343698203743088908100353, + 21888242871839275222246405745257275088548364400416034343698203694238217031874, + 479593552773060, + 533645332258614, + 298086398812019, + 21888242871839275222246405745257275088548364400416034343698204184728856116044, + 96823395228917, + 21888242871839275222246405745257275088548364400416034343698203886443414133145, + 523709299517736, + 508866857822080, + 21888242871839275222246405745257275088548364400416034343698203923310334848353, + 241914130267371, + 21888242871839275222246405745257275088548364400416034343698203696607241638458, + 21888242871839275222246405745257275088548364400416034343698203637268478229487, + 21888242871839275222246405745257275088548364400416034343698203664504997114683, + 515828472422367, + 21888242871839275222246405745257275088548364400416034343698203827242443627045, + 21888242871839275222246405745257275088548364400416034343698203948493111590889, + 21888242871839275222246405745257275088548364400416034343698203794100072617207, + 21888242871839275222246405745257275088548364400416034343698204004755084091694, + 21888242871839275222246405745257275088548364400416034343698203898452943821377, + 232014408312572, + 21888242871839275222246405745257275088548364400416034343698204016332525439818, + 300189052866831, + 16315422890578, + 527569149389537, + 500634919466769, + 21888242871839275222246405745257275088548364400416034343698204106123198661764, + 21888242871839275222246405745257275088548364400416034343698203797706929311272, + 225357910439809, + 327567396690872, + 21888242871839275222246405745257275088548364400416034343698203636130491403078, + 444457909283168, + 21888242871839275222246405745257275088548364400416034343698203773298198349533, + 391609106119596, + 21888242871839275222246405745257275088548364400416034343698204129208687775918, + 112316003700470, + 126441665782288, + 21888242871839275222246405745257275088548364400416034343698204144695802566444, + 21888242871839275222246405745257275088548364400416034343698204041423421429226, + 497654656982876, + 21888242871839275222246405745257275088548364400416034343698204056902436247358, + 186559446791856, + 405178231871357, + 21888242871839275222246405745257275088548364400416034343698203950918591294755, + 513450203568536, + 21888242871839275222246405745257275088548364400416034343698204151468199670315, + 123910087264923, + 478314195395733, + 21888242871839275222246405745257275088548364400416034343698203878081154968530, + 480812305410724, + 21888242871839275222246405745257275088548364400416034343698203895395721383418, + 374158245381133, + 346957678144056, + 21888242871839275222246405745257275088548364400416034343698203955078060909284, + 39808191426077, + 91024259597885, + 362866140876498, + 340245860789489, + 4442772795167, + 396488996144429, + 21888242871839275222246405745257275088548364400416034343698203837891804196680, + 364602121736896, + 397527002060043, + 21888242871839275222246405745257275088548364400416034343698204116531137922119, + 233500439122752, + 328220390956493, + 229144286994527, + 21888242871839275222246405745257275088548364400416034343698203814429547856829, + 21888242871839275222246405745257275088548364400416034343698203645988580354546, + 483327356253460, + 21888242871839275222246405745257275088548364400416034343698203680926900061527, + 21888242871839275222246405745257275088548364400416034343698204059653899307825, + 176449850281864, + 505261238391056, + 21888242871839275222246405745257275088548364400416034343698203876386725118864, + 533334697428761, + 233724870998136, + 319992754264919, + 21888242871839275222246405745257275088548364400416034343698203824255748714794, + 368129625401650, + 21888242871839275222246405745257275088548364400416034343698203919620493420811, + 47972814055110, + 21888242871839275222246405745257275088548364400416034343698204023755011846880, + 21888242871839275222246405745257275088548364400416034343698204186050923968785, + 182719947613284, + 506996874671162, + 21888242871839275222246405745257275088548364400416034343698203846407815127503, + 278954110609638, + 21888242871839275222246405745257275088548364400416034343698203775257243788053, + 21888242871839275222246405745257275088548364400416034343698204092524836492393, + 475326518768842, + 239180785662786, + 477275209065775, + 21888242871839275222246405745257275088548364400416034343698203769631531442233, + 114107377727759, + 381089461582332, + 518620864526670, + 21888242871839275222246405745257275088548364400416034343698204089514626062668, + 21888242871839275222246405745257275088548364400416034343698203728647217016172, + 21888242871839275222246405745257275088548364400416034343698204168151690270807, + 356433334634235, + 482669239202161, + 21888242871839275222246405745257275088548364400416034343698204078458073186948, + 540555629917144, + 218472642071237, + 125680705867440, + 493879053814320, + 21888242871839275222246405745257275088548364400416034343698203983181691482708, + 21888242871839275222246405745257275088548364400416034343698203825944724831211, + 21888242871839275222246405745257275088548364400416034343698204038369606160952, + 21888242871839275222246405745257275088548364400416034343698203940264291930880, + 334309698530437, + 21888242871839275222246405745257275088548364400416034343698204111554378076795, + 140033240619157, + 21888242871839275222246405745257275088548364400416034343698203804516486566484, + 56809084468973, + 21888242871839275222246405745257275088548364400416034343698203864266348075529, + 21888242871839275222246405745257275088548364400416034343698203816196047219520, + 21888242871839275222246405745257275088548364400416034343698203830781844792834, + 240552244834392, + 21888242871839275222246405745257275088548364400416034343698203724032176895374, + 21888242871839275222246405745257275088548364400416034343698203744312513649390, + 209030352339773, + 21888242871839275222246405745257275088548364400416034343698203860002739706470, + 21888242871839275222246405745257275088548364400416034343698203743383780967006, + 345455698728255, + 21888242871839275222246405745257275088548364400416034343698204129597968167692, + 21888242871839275222246405745257275088548364400416034343698204012847559471075, + 21888242871839275222246405745257275088548364400416034343698204172095259931059, + 523960736971276, + 21888242871839275222246405745257275088548364400416034343698204008886352467693, + 21888242871839275222246405745257275088548364400416034343698203900538467902374, + 21888242871839275222246405745257275088548364400416034343698203968863222562789, + 514991983526645, + 412236971482005, + 361416560418129, + 422262975947110, + 32165026601953, + 21888242871839275222246405745257275088548364400416034343698203850469934415450, + 518023283885585, + 21888242871839275222246405745257275088548364400416034343698203770512114217760, + 526392236425227, + 21888242871839275222246405745257275088548364400416034343698203821904466029612, + 21888242871839275222246405745257275088548364400416034343698203933781926306084, + 21888242871839275222246405745257275088548364400416034343698203714749947624846, + 126840711913769, + 21888242871839275222246405745257275088548364400416034343698203668505390713134, + 367838913808432, + 21888242871839275222246405745257275088548364400416034343698203772919801100805, + 433339740602021, + 254757771616308, + 21888242871839275222246405745257275088548364400416034343698203912446212677308, + 187960768413309, + 47807037863959, + 21888242871839275222246405745257275088548364400416034343698203685069033099646, + 21888242871839275222246405745257275088548364400416034343698204153590302367179, + 538550203943696, + 21888242871839275222246405745257275088548364400416034343698203790657720575966, + 363971760727348, + 21888242871839275222246405745257275088548364400416034343698203636952658851391, + 21888242871839275222246405745257275088548364400416034343698203672695081457708, + 83873780682278, + 21888242871839275222246405745257275088548364400416034343698204170402397501312, + 426817306821968, + 21888242871839275222246405745257275088548364400416034343698204163478598778074, + 21888242871839275222246405745257275088548364400416034343698204117650127242920, + 395874124623187, + 437075002681152, + 21888242871839275222246405745257275088548364400416034343698203719178263285960, + 21888242871839275222246405745257275088548364400416034343698204184628523016518, + 338415938043245, + 531404010768905, + 260786297671010, + 21888242871839275222246405745257275088548364400416034343698204005102591695002, + 345007611160651, + 6366437874502, + 63207218496647, + 21888242871839275222246405745257275088548364400416034343698203990520982646779, + 21888242871839275222246405745257275088548364400416034343698203949853672634310, + 21888242871839275222246405745257275088548364400416034343698203754284480908360, + 21888242871839275222246405745257275088548364400416034343698204140995284420633, + 21888242871839275222246405745257275088548364400416034343698204036774135972613, + 359734050854593, + 21888242871839275222246405745257275088548364400416034343698204164522517205301, + 361505179528302, + 87046525422438, + 21888242871839275222246405745257275088548364400416034343698203832137230398819, + 489861402704074, + 24974853660660, + 139521087580432, + 436917753904163, + 21888242871839275222246405745257275088548364400416034343698204107795286723128, + 21888242871839275222246405745257275088548364400416034343698204123408661876634, + 249380693551080, + 540433796163778, + 376887717851029, + 427773503673415, + 21888242871839275222246405745257275088548364400416034343698203996185221707079, + 242115991898782, + 30724526060424, + 281294779908558, + 21888242871839275222246405745257275088548364400416034343698204126806073083665, + 21888242871839275222246405745257275088548364400416034343698203773516398035164, + 21888242871839275222246405745257275088548364400416034343698203848724366231857, + 21888242871839275222246405745257275088548364400416034343698203805005167856104, + 21888242871839275222246405745257275088548364400416034343698203719402469564436, + 21888242871839275222246405745257275088548364400416034343698203910366099632980, + 353952179908788, + 316189123624357, + 21888242871839275222246405745257275088548364400416034343698204134705754814422, + 66904334233379, + 21888242871839275222246405745257275088548364400416034343698203745730090578704, + 21888242871839275222246405745257275088548364400416034343698204126053964189209, + 318666935843631, + 73173331278841, + 21888242871839275222246405745257275088548364400416034343698203672492713503958, + 12430519510541, + 21888242871839275222246405745257275088548364400416034343698203866455207290637, + 306074786997288, + 407175300921319, + 21888242871839275222246405745257275088548364400416034343698204012877845728126, + 21888242871839275222246405745257275088548364400416034343698204049483314833533, + 21888242871839275222246405745257275088548364400416034343698204183845046231640, + 473091372909072, + 489386275613223, + 21888242871839275222246405745257275088548364400416034343698204043575462551217, + 302577012029363, + 21888242871839275222246405745257275088548364400416034343698203885658322560788, + 370268889417202, + 211017740214721, + 21888242871839275222246405745257275088548364400416034343698203971204694583852, + 21888242871839275222246405745257275088548364400416034343698204090741653021214, + 326080607793429, + 393702933076108, + 253220326887252, + 21888242871839275222246405745257275088548364400416034343698203668795767958418, + 21888242871839275222246405745257275088548364400416034343698204175482465937537, + 21888242871839275222246405745257275088548364400416034343698203752205787047099, + 208932738215655, + 202964614727731, + 21888242871839275222246405745257275088548364400416034343698204036742950246385, + 21888242871839275222246405745257275088548364400416034343698203816188322656632, + 277024421985262, + 21888242871839275222246405745257275088548364400416034343698203653816596453004, + 21888242871839275222246405745257275088548364400416034343698203844963615168448, + 472785426544074, + 88450111271961, + 198662611761446, + 21888242871839275222246405745257275088548364400416034343698203726078836763013, + 21888242871839275222246405745257275088548364400416034343698203851351678208514, + 21888242871839275222246405745257275088548364400416034343698204142103332022151, + 214138775797654, + 503621536251905, + 21888242871839275222246405745257275088548364400416034343698203824496110141240, + 527170974988861, + 21888242871839275222246405745257275088548364400416034343698204110673414917227, + 21888242871839275222246405745257275088548364400416034343698204113338872087600, + 365160692076959, + 21888242871839275222246405745257275088548364400416034343698203630815465851333, + 494457497416331, + 470292076680371, + 21888242871839275222246405745257275088548364400416034343698203782555693783212, + 422217297113190, + 21888242871839275222246405745257275088548364400416034343698203887449387436239, + 21888242871839275222246405745257275088548364400416034343698203915809936365249, + 21888242871839275222246405745257275088548364400416034343698203959495096191583, + 21888242871839275222246405745257275088548364400416034343698203823106770514797, + 21888242871839275222246405745257275088548364400416034343698203903506444087856, + 274778287527528, + 77512967829238, + 360374880436254, + 329294362011742, + 21888242871839275222246405745257275088548364400416034343698204037448352251328, + 21888242871839275222246405745257275088548364400416034343698204096787087184714, + 286167702618112, + 21888242871839275222246405745257275088548364400416034343698203649006264629698, + 426273807948450, + 21888242871839275222246405745257275088548364400416034343698203805646462078538, + 316920308534296, + 60241283302508, + 21888242871839275222246405745257275088548364400416034343698203649433816856945, + 158494318254784, + 21888242871839275222246405745257275088548364400416034343698204143675024177720, + 21888242871839275222246405745257275088548364400416034343698204126331042752265, + 21888242871839275222246405745257275088548364400416034343698204050541114129569, + 455686220006749, + 21888242871839275222246405745257275088548364400416034343698204173204253140162, + 21888242871839275222246405745257275088548364400416034343698204106914249285592, + 21888242871839275222246405745257275088548364400416034343698203704529701631048, + 495414396201540, + 512230779577950, + 373712979515891, + 367231118055786, + 21888242871839275222246405745257275088548364400416034343698203830110340678808, + 21888242871839275222246405745257275088548364400416034343698203896763274441826, + 21888242871839275222246405745257275088548364400416034343698203689266733669716, + 21888242871839275222246405745257275088548364400416034343698203697472261054497, + 21888242871839275222246405745257275088548364400416034343698204002141317624202, + 303663920355149, + 21888242871839275222246405745257275088548364400416034343698203892071521683231, + 21888242871839275222246405745257275088548364400416034343698203898047747107288, + 21888242871839275222246405745257275088548364400416034343698203962516278715653, + 147330039749750, + 21888242871839275222246405745257275088548364400416034343698203695433466839564, + 21888242871839275222246405745257275088548364400416034343698203960282801579074, + 272033054600343, + 21888242871839275222246405745257275088548364400416034343698204172085947084172, + 21888242871839275222246405745257275088548364400416034343698204045795735474976, + 21888242871839275222246405745257275088548364400416034343698203836576113970925, + 21888242871839275222246405745257275088548364400416034343698204039154558188539, + 21888242871839275222246405745257275088548364400416034343698203694812322167165, + 402416466266218, + 102330056807392, + 21888242871839275222246405745257275088548364400416034343698203875781681432032, + 21888242871839275222246405745257275088548364400416034343698204062634651324925, + 21888242871839275222246405745257275088548364400416034343698203656664613635042, + 398865645105800, + 21888242871839275222246405745257275088548364400416034343698203933706162780103, + 556533026808647, + 21888242871839275222246405745257275088548364400416034343698204006396289836934, + 289184394917230, + 27495493452968, + 21888242871839275222246405745257275088548364400416034343698204181149426239421, + 21888242871839275222246405745257275088548364400416034343698203885170292577983, + 484447579581225, + 456312400753256, + 320631368069158, + 355004587015788, + 198710187303201, + 21888242871839275222246405745257275088548364400416034343698203794754729501928, + 491343423194405, + 284952395330754, + 48819674800699, + 21888242871839275222246405745257275088548364400416034343698203781932809169195, + 92848664721787, + 375975675111302, + 325081332335044, + 240719832669550, + 504543723505777, + 226652489800534, + 21888242871839275222246405745257275088548364400416034343698203636538899106190, + 21888242871839275222246405745257275088548364400416034343698204080421587689369, + 551867414442420, + 21888242871839275222246405745257275088548364400416034343698203994817579207364, + 155473645650579, + 114615037988336, + 21888242871839275222246405745257275088548364400416034343698204161914980873588, + 21888242871839275222246405745257275088548364400416034343698204026643014290655, + 21888242871839275222246405745257275088548364400416034343698203720774213236831, + 448958535025733, + 21888242871839275222246405745257275088548364400416034343698203974638815048320, + 21888242871839275222246405745257275088548364400416034343698204117805125800671, + 516207783694113, + 4784079868543, + 413594498715930, + 490783208556295, + 21888242871839275222246405745257275088548364400416034343698203651877493288381, + 21888242871839275222246405745257275088548364400416034343698204149307218496737, + 21888242871839275222246405745257275088548364400416034343698204110876531447020, + 262930755779570, + 86675003320226, + 21888242871839275222246405745257275088548364400416034343698204065903637450354, + 262976947500920, + 21888242871839275222246405745257275088548364400416034343698203811777277450666, + 474374670497489, + 320370057142801, + 21888242871839275222246405745257275088548364400416034343698204117139610639699, + 84481256401040, + 21888242871839275222246405745257275088548364400416034343698204044005689340868, + 196949295023619, + 144517978969883, + 218242156136382, + 154688622681397, + 21888242871839275222246405745257275088548364400416034343698203708503094257305, + 21888242871839275222246405745257275088548364400416034343698203938046225250551, + 222455649009425, + 533801281397292, + 21888242871839275222246405745257275088548364400416034343698203870312968127939, + 57459196568341, + 61397494647341, + 21888242871839275222246405745257275088548364400416034343698203891991152085410, + 21888242871839275222246405745257275088548364400416034343698204153864248406586, + 190130811070289, + 21888242871839275222246405745257275088548364400416034343698204087646789223491, + 21888242871839275222246405745257275088548364400416034343698204163694659613807, + 141658392989470, + 336229262109738, + 21888242871839275222246405745257275088548364400416034343698204109084318949202, + 21888242871839275222246405745257275088548364400416034343698203931835556300412, + 457960245389851, + 209554468482126, + 261010791136408, + 521625145598494, + 21888242871839275222246405745257275088548364400416034343698204046575882681857, + 21888242871839275222246405745257275088548364400416034343698203898685557180418, + 20348565936589, + 21888242871839275222246405745257275088548364400416034343698203713328283765975, + 21888242871839275222246405745257275088548364400416034343698204099125766846317, + 98391125263871, + 21888242871839275222246405745257275088548364400416034343698203828124415952789, + 21888242871839275222246405745257275088548364400416034343698203997159681499118, + 21888242871839275222246405745257275088548364400416034343698204138066903974785, + 21888242871839275222246405745257275088548364400416034343698203721911470118985, + 21888242871839275222246405745257275088548364400416034343698204117282796447937, + 437552229866505, + 21888242871839275222246405745257275088548364400416034343698204139613210450208, + 339067288948241, + 21888242871839275222246405745257275088548364400416034343698204118340922015052, + 21888242871839275222246405745257275088548364400416034343698203910059068674945, + 288355342141931, + 21888242871839275222246405745257275088548364400416034343698203877207417733273, + 136516121462855, + 116529354678389, + 21888242871839275222246405745257275088548364400416034343698203830380891028579, + 21888242871839275222246405745257275088548364400416034343698204137791502529333, + 372754886625134, + 64002997683001, + 21888242871839275222246405745257275088548364400416034343698204114115840089574, + 21888242871839275222246405745257275088548364400416034343698203877408013874173, + 446566497536857, + 349846854828842, + 21888242871839275222246405745257275088548364400416034343698204131135008818311, + 440806511546510, + 21888242871839275222246405745257275088548364400416034343698203711334958474392, + 21888242871839275222246405745257275088548364400416034343698203949561242590595, + 206004937450926, + 21888242871839275222246405745257275088548364400416034343698203996281940609753, + 21888242871839275222246405745257275088548364400416034343698203736976192275583, + 21888242871839275222246405745257275088548364400416034343698204067279924735237, + 21888242871839275222246405745257275088548364400416034343698204138637699183223, + 21888242871839275222246405745257275088548364400416034343698204175926663442990, + 399711656024997, + 21888242871839275222246405745257275088548364400416034343698203709482230918089, + 558345632838639, + 21888242871839275222246405745257275088548364400416034343698204176056250644877, + 97571391981441, + 21888242871839275222246405745257275088548364400416034343698203814756759591503, + 513895465649826, + 21888242871839275222246405745257275088548364400416034343698203671862415807097, + 21888242871839275222246405745257275088548364400416034343698203743332478990215, + 21888242871839275222246405745257275088548364400416034343698203816373615552838, + 214302112295178, + 21888242871839275222246405745257275088548364400416034343698203897668006686104, + 21888242871839275222246405745257275088548364400416034343698203806420083299319, + 134581112958687, + 177995099237827, + 21888242871839275222246405745257275088548364400416034343698203692589125633457, + 238317688399071, + 5317922272768, + 21888242871839275222246405745257275088548364400416034343698203731805179545225, + 320077596848628, + 21888242871839275222246405745257275088548364400416034343698204177483598847252, + 21888242871839275222246405745257275088548364400416034343698204119941279143714, + 463783062308308, + 21888242871839275222246405745257275088548364400416034343698204112195424235851, + 21888242871839275222246405745257275088548364400416034343698203886655635160789, + 21888242871839275222246405745257275088548364400416034343698204127239501569685, + 21888242871839275222246405745257275088548364400416034343698204032855584044880, + 21888242871839275222246405745257275088548364400416034343698203658924300870128, + 150857146770218, + 99430900918878, + 239441828980102, + 21888242871839275222246405745257275088548364400416034343698203745277431300946, + 259157760119532, + 21888242871839275222246405745257275088548364400416034343698203811816383895420, + 21888242871839275222246405745257275088548364400416034343698203643514186537649, + 35468878268270, + 21888242871839275222246405745257275088548364400416034343698203747789413643947, + 398251119089512, + 178426963460844, + 488577127564622, + 21888242871839275222246405745257275088548364400416034343698203672431537046624, + 531267358082553, + 46649518243730, + 193603683985041, + 201884305029610, + 504210011596106, + 77482392582043, + 30314822780165, + 169653548312864, + 256711078138123, + 447477799126606, + 99924464421570, + 479639815115258, + 215081617279901, + 373606571369542, + 21888242871839275222246405745257275088548364400416034343698203853198597604843, + 264710086635798, + 477344412308466, + 302519474255525, + 212260591852381, + 378230150242962, + 424991699874845, + 153856960587370, + 21888242871839275222246405745257275088548364400416034343698204049194510268314, + 21888242871839275222246405745257275088548364400416034343698204005957772828396, + 388816312536915, + 383896643501373, + 21888242871839275222246405745257275088548364400416034343698204131257495232800, + 21888242871839275222246405745257275088548364400416034343698204097065355249983, + 21888242871839275222246405745257275088548364400416034343698203986341383925619, + 21888242871839275222246405745257275088548364400416034343698204182883749299685, + 545102765587643, + 64943682086679, + 281045008012757, + 556419694657750, + 21888242871839275222246405745257275088548364400416034343698203653916623320850, + 466529612397903, + 317165813954876, + 346236190509153, + 21888242871839275222246405745257275088548364400416034343698203995467022115504, + 385563192663599, + 358475602295909, + 39621451175273, + 142640641749550, + 21888242871839275222246405745257275088548364400416034343698203988409800183850, + 429234321699067, + 84634130885101, + 222974761499739, + 21888242871839275222246405745257275088548364400416034343698203832399379630690, + 21888242871839275222246405745257275088548364400416034343698203689445268357573, + 21888242871839275222246405745257275088548364400416034343698203701862697025904, + 325595824702990, + 21888242871839275222246405745257275088548364400416034343698203761453015915365, + 21888242871839275222246405745257275088548364400416034343698204122229973455778, + 21888242871839275222246405745257275088548364400416034343698203813625927758244, + 21888242871839275222246405745257275088548364400416034343698203654562108021156, + 21888242871839275222246405745257275088548364400416034343698203913386827780800, + 362020847524778, + 21888242871839275222246405745257275088548364400416034343698203692690283907342, + 4008572607735, + 21888242871839275222246405745257275088548364400416034343698203806518315319825, + 459701747097078, + 21888242871839275222246405745257275088548364400416034343698203906031471056424, + 21888242871839275222246405745257275088548364400416034343698203800559613055978, + 21888242871839275222246405745257275088548364400416034343698203743555755442063, + 346175483154867, + 194469292225327, + 21888242871839275222246405745257275088548364400416034343698203642514544716043, + 43511076309441, + 21888242871839275222246405745257275088548364400416034343698203944712730479082, + 21888242871839275222246405745257275088548364400416034343698204109143984144551, + 142372006638949, + 21888242871839275222246405745257275088548364400416034343698203871565065256503, + 21888242871839275222246405745257275088548364400416034343698203934097925490745, + 21888242871839275222246405745257275088548364400416034343698203940303673044379, + 21888242871839275222246405745257275088548364400416034343698203768240011316935, + 21888242871839275222246405745257275088548364400416034343698203672577461799628, + 21888242871839275222246405745257275088548364400416034343698204096196550785984, + 118919668749023, + 35493556807330, + 473726290560300, + 486570925326864, + 266033690368644, + 21888242871839275222246405745257275088548364400416034343698203731836857721327, + 344629287186256, + 21888242871839275222246405745257275088548364400416034343698204137166551711280, + 21888242871839275222246405745257275088548364400416034343698203847559424139969, + 21888242871839275222246405745257275088548364400416034343698204174200328962131, + 243898763510779, + 539514676676217, + 21888242871839275222246405745257275088548364400416034343698204142085652775737, + 21888242871839275222246405745257275088548364400416034343698203821387141804116, + 21888242871839275222246405745257275088548364400416034343698203919454638308445, + 21888242871839275222246405745257275088548364400416034343698203920735450041281, + 21888242871839275222246405745257275088548364400416034343698203855036981281675, + 370780601661499, + 21888242871839275222246405745257275088548364400416034343698204109830931961224, + 21888242871839275222246405745257275088548364400416034343698203789566894504911, + 21888242871839275222246405745257275088548364400416034343698203984679679439022, + 550789446806733, + 21888242871839275222246405745257275088548364400416034343698203834557033004761, + 1312343241171, + 21888242871839275222246405745257275088548364400416034343698203708597947378486, + 21888242871839275222246405745257275088548364400416034343698203774840852074334, + 21888242871839275222246405745257275088548364400416034343698204102062688857357, + 21888242871839275222246405745257275088548364400416034343698204057129511658462, + 21888242871839275222246405745257275088548364400416034343698203972842246116200, + 21888242871839275222246405745257275088548364400416034343698204008056286347712, + 256021106883806, + 472646893631281, + 21888242871839275222246405745257275088548364400416034343698203977147958630392, + 140338986555653, + 21888242871839275222246405745257275088548364400416034343698204015544220745533, + 21888242871839275222246405745257275088548364400416034343698203943313100002476, + 194619043807636, + 21888242871839275222246405745257275088548364400416034343698203850249812412795, + 21888242871839275222246405745257275088548364400416034343698204158906466355370, + 21888242871839275222246405745257275088548364400416034343698203983110901380501, + 60374074063423, + 222257113858544, + 405992540976907, + 21888242871839275222246405745257275088548364400416034343698203839847520678080, + 21888242871839275222246405745257275088548364400416034343698204154784143489169, + 374282142960323, + 356130994697792, + 21888242871839275222246405745257275088548364400416034343698203779124130523845, + 21888242871839275222246405745257275088548364400416034343698203768314469185704, + 21888242871839275222246405745257275088548364400416034343698203863629731726594, + 21888242871839275222246405745257275088548364400416034343698203677781345283114, + 21888242871839275222246405745257275088548364400416034343698204056247027396673, + 21888242871839275222246405745257275088548364400416034343698204163589423419664, + 21888242871839275222246405745257275088548364400416034343698204047328506120961, + 21888242871839275222246405745257275088548364400416034343698203974618574908049, + 21888242871839275222246405745257275088548364400416034343698204040706486159202, + 517021914197323, + 188336524752370, + 21888242871839275222246405745257275088548364400416034343698203681563422077285, + 485606849411905, + 441015393621278, + 323389612781129, + 21888242871839275222246405745257275088548364400416034343698203990586117253150, + 21888242871839275222246405745257275088548364400416034343698204098890929404161, + 323721835441839, + 21888242871839275222246405745257275088548364400416034343698203643539274603342, + 399578874905297, + 497681190423540, + 462793771880828, + 21888242871839275222246405745257275088548364400416034343698203669237819796162, + 369237593559043, + 21888242871839275222246405745257275088548364400416034343698204018176889077361, + 268047439841698, + 21888242871839275222246405745257275088548364400416034343698203696237382981667, + 165590370872530, + 401384350123189, + 21888242871839275222246405745257275088548364400416034343698203875773041005495, + 322744865023932, + 106534664892177, + 21888242871839275222246405745257275088548364400416034343698203778613333705572, + 21888242871839275222246405745257275088548364400416034343698203812885873144782, + 64137015511388, + 498558316078419, + 222880999525040, + 541414349496031, + 21888242871839275222246405745257275088548364400416034343698203692315171772096, + 24242245844543, + 21888242871839275222246405745257275088548364400416034343698203898862838197221, + 21888242871839275222246405745257275088548364400416034343698203987555589412973, + 394307347337740, + 251364817483963, + 326478789579360, + 455178203520406, + 325459633867974, + 21888242871839275222246405745257275088548364400416034343698203696624637263716, + 325059547817689, + 258837265887053, + 242517296687619, + 21888242871839275222246405745257275088548364400416034343698203871782346387381, + 286166159387788, + 21888242871839275222246405745257275088548364400416034343698204121287561322529, + 265577116397867, + 21888242871839275222246405745257275088548364400416034343698203944797278463072, + 21888242871839275222246405745257275088548364400416034343698203772273877032605, + 177250815210367, + 234031176458977, + 21888242871839275222246405745257275088548364400416034343698204016621878046082, + 475325465471633, + 21888242871839275222246405745257275088548364400416034343698204065138375213515, + 21888242871839275222246405745257275088548364400416034343698204105138997928482, + 478970070291830, + 21888242871839275222246405745257275088548364400416034343698203862452801738496, + 371315471338970, + 359128610001648, + 181173285759073, + 120491709644870, + 21888242871839275222246405745257275088548364400416034343698203651391079279686, + 21888242871839275222246405745257275088548364400416034343698203818339550524885, + 21888242871839275222246405745257275088548364400416034343698203831713024234013, + 21888242871839275222246405745257275088548364400416034343698204057126667412035, + 21888242871839275222246405745257275088548364400416034343698203970127068621121, + 165370691976341, + 517759633179879, + 80175259430803, + 344700558783095, + 422252194375832, + 21888242871839275222246405745257275088548364400416034343698204052560402435706, + 21888242871839275222246405745257275088548364400416034343698204166023539618792, + 285828275353785, + 21888242871839275222246405745257275088548364400416034343698203905696663728606, + 21888242871839275222246405745257275088548364400416034343698203774289961688625, + 21888242871839275222246405745257275088548364400416034343698203767609537958361, + 241363363381286, + 41623832831685, + 21888242871839275222246405745257275088548364400416034343698203639655554088840, + 279703127307389, + 535058193599757, + 21888242871839275222246405745257275088548364400416034343698203953162565240786, + 21888242871839275222246405745257275088548364400416034343698203690425821527800, + 21888242871839275222246405745257275088548364400416034343698203843933508652070, + 68055768755127, + 21888242871839275222246405745257275088548364400416034343698204152329575959674, + 21888242871839275222246405745257275088548364400416034343698204167086742830056, + 21888242871839275222246405745257275088548364400416034343698204124568399392843, + 21888242871839275222246405745257275088548364400416034343698203963360574914998, + 21888242871839275222246405745257275088548364400416034343698203947509987502372, + 53781492726982, + 21888242871839275222246405745257275088548364400416034343698203962633921855269, + 21888242871839275222246405745257275088548364400416034343698204148978807773742, + 313282816089231, + 21888242871839275222246405745257275088548364400416034343698203653556752466127, + 21888242871839275222246405745257275088548364400416034343698203632674615346597, + 479451703941597, + 21888242871839275222246405745257275088548364400416034343698203901700978590588, + 21888242871839275222246405745257275088548364400416034343698203923439797913475, + 21888242871839275222246405745257275088548364400416034343698203790020725608966, + 231400467695962, + 21888242871839275222246405745257275088548364400416034343698203890819820112350, + 21888242871839275222246405745257275088548364400416034343698203813335287236975, + 21888242871839275222246405745257275088548364400416034343698204115124187623780, + 313998121513555, + 21888242871839275222246405745257275088548364400416034343698203806925300194491, + 140682122422459, + 221952517710829, + 52484115833922, + 21888242871839275222246405745257275088548364400416034343698204170125946450271, + 21888242871839275222246405745257275088548364400416034343698203693893316461694, + 21888242871839275222246405745257275088548364400416034343698203684633819979085, + 297672694410825, + 21888242871839275222246405745257275088548364400416034343698204116560978351249, + 21888242871839275222246405745257275088548364400416034343698203658228509916211, + 21888242871839275222246405745257275088548364400416034343698203670232887544196, + 192778803635138, + 507040717949449, + 21888242871839275222246405745257275088548364400416034343698203894836292801831, + 21888242871839275222246405745257275088548364400416034343698203745931374717513, + 349710799275655, + 255697393889282, + 78358167272169, + 21888242871839275222246405745257275088548364400416034343698204024792893154100, + 21888242871839275222246405745257275088548364400416034343698203894190635268414, + 141756199007350, + 21888242871839275222246405745257275088548364400416034343698204004117228870550, + 21888242871839275222246405745257275088548364400416034343698203771248473191408, + 148583381062807, + 21888242871839275222246405745257275088548364400416034343698203798722692523448, + 21888242871839275222246405745257275088548364400416034343698204129371867601700, + 21888242871839275222246405745257275088548364400416034343698203904291088096347, + 155168224007447, + 406690783399933, + 21888242871839275222246405745257275088548364400416034343698204070411280450576, + 233633251674869, + 42073207805701, + 202269108779292, + 21888242871839275222246405745257275088548364400416034343698203746826017273241, + 21888242871839275222246405745257275088548364400416034343698203933546410175406, + 21888242871839275222246405745257275088548364400416034343698203706872031943223, + 21888242871839275222246405745257275088548364400416034343698203914408864391393, + 126164406628787, + 208579601123946, + 540691360213351, + 21888242871839275222246405745257275088548364400416034343698204162026505172954, + 542122488839019, + 21888242871839275222246405745257275088548364400416034343698203992762567979318, + 21888242871839275222246405745257275088548364400416034343698204180094476338705, + 554562360987063, + 383007168795074, + 526538043950397, + 354811469434324, + 21888242871839275222246405745257275088548364400416034343698203869058726893971, + 481092705226305, + 387813704842697, + 297879166114889, + 21888242871839275222246405745257275088548364400416034343698204068802296002293, + 303784110289851, + 148353626691271, + 21888242871839275222246405745257275088548364400416034343698203761819535004078, + 118813661010662, + 21888242871839275222246405745257275088548364400416034343698203686739318756495, + 407345798956887, + 21888242871839275222246405745257275088548364400416034343698203906407044445540, + 559930749591288, + 21888242871839275222246405745257275088548364400416034343698203820741700852122, + 192489780376464, + 557014468271381, + 21888242871839275222246405745257275088548364400416034343698203645774541161946, + 21888242871839275222246405745257275088548364400416034343698204141803114308933, + 21888242871839275222246405745257275088548364400416034343698203877029484684577, + 21888242871839275222246405745257275088548364400416034343698204156001514237714, + 205497525594173, + 24217552539692, + 21888242871839275222246405745257275088548364400416034343698203773646349661344, + 368072328708119, + 242082431664674, + 21888242871839275222246405745257275088548364400416034343698203651185227100356, + 21888242871839275222246405745257275088548364400416034343698203707850672508241, + 117999857748947, + 21888242871839275222246405745257275088548364400416034343698203971010358795311, + 205501524727122, + 21888242871839275222246405745257275088548364400416034343698203968461974836518, + 21888242871839275222246405745257275088548364400416034343698203804178944774362, + 21888242871839275222246405745257275088548364400416034343698203773693951399381, + 239735529777816, + 21888242871839275222246405745257275088548364400416034343698203697575808284350, + 71943329541579, + 21888242871839275222246405745257275088548364400416034343698203817012097025641, + 17564022654925, + 264527529180153, + 225798432562995, + 41034851751763, + 21888242871839275222246405745257275088548364400416034343698203927434432742195, + 158604159560642, + 321255687280745, + 21888242871839275222246405745257275088548364400416034343698204059804784079337, + 21888242871839275222246405745257275088548364400416034343698203693348371474424, + 133183953358860, + 21888242871839275222246405745257275088548364400416034343698204152580376159493, + 21888242871839275222246405745257275088548364400416034343698203779958038883213, + 364864861286395, + 393297376209774, + 209891382380948, + 21888242871839275222246405745257275088548364400416034343698203963131278403267, + 21888242871839275222246405745257275088548364400416034343698204127453108506500, + 21888242871839275222246405745257275088548364400416034343698203906058862848804, + 21888242871839275222246405745257275088548364400416034343698203644129425535731, + 247312881282347, + 454040890474779, + 389472140930565, + 188470018624987, + 456191455619502, + 21888242871839275222246405745257275088548364400416034343698204092913784822245, + 220154549634236, + 195013821111914, + 364578045489182, + 21888242871839275222246405745257275088548364400416034343698203638394890768273, + 21888242871839275222246405745257275088548364400416034343698203867006514826509, + 21888242871839275222246405745257275088548364400416034343698204127383464310454, + 21888242871839275222246405745257275088548364400416034343698203836307804362349, + 558316958337602, + 21888242871839275222246405745257275088548364400416034343698203958651966583884, + 460345739323495, + 320673990571830, + 21888242871839275222246405745257275088548364400416034343698203881366478185168, + 316199899731431, + 29887475463620, + 21888242871839275222246405745257275088548364400416034343698204139356491945693, + 381947699481079, + 21888242871839275222246405745257275088548364400416034343698203713711357595424, + 276844685337208, + 43112174506707, + 133832368759188, + 113679372498832, + 21888242871839275222246405745257275088548364400416034343698203682329281278175, + 21888242871839275222246405745257275088548364400416034343698204022071663870453, + 21888242871839275222246405745257275088548364400416034343698203949146371695083, + 21888242871839275222246405745257275088548364400416034343698203950224981746688, + 238764900506586, + 27346771878110, + 424559966390827, + 22062361650523, + 331950735776693, + 417630247064593, + 21888242871839275222246405745257275088548364400416034343698204184967540605029, + 21888242871839275222246405745257275088548364400416034343698203988542705827620, + 246305771364426, + 21888242871839275222246405745257275088548364400416034343698203963819780123263, + 403943524664582, + 21888242871839275222246405745257275088548364400416034343698203967654737154714, + 21888242871839275222246405745257275088548364400416034343698203995444998473326, + 331025561199743, + 473706111201093, + 550717426658334, + 21888242871839275222246405745257275088548364400416034343698203915237006892076, + 21888242871839275222246405745257275088548364400416034343698204092588716719023, + 226539500711800, + 21888242871839275222246405745257275088548364400416034343698204065556891730813, + 78750846685518, + 164697430150291, + 523806582708945, + 21888242871839275222246405745257275088548364400416034343698203804248001661150, + 510516674180729, + 21888242871839275222246405745257275088548364400416034343698203862657815493469, + 21888242871839275222246405745257275088548364400416034343698203898343832937383, + 21888242871839275222246405745257275088548364400416034343698203743271628940764, + 21888242871839275222246405745257275088548364400416034343698203997045075802376, + 395629055030804, + 42345956890674, + 21888242871839275222246405745257275088548364400416034343698203755904539390029, + 21888242871839275222246405745257275088548364400416034343698203689418734798122, + 21888242871839275222246405745257275088548364400416034343698203809087370075188, + 21888242871839275222246405745257275088548364400416034343698204106152894819836, + 21888242871839275222246405745257275088548364400416034343698203770019818222496, + 21888242871839275222246405745257275088548364400416034343698203688105127474136, + 428251630968428, + 210489134905604, + 526544482767355, + 21888242871839275222246405745257275088548364400416034343698203980286506360368, + 125387174400471, + 21888242871839275222246405745257275088548364400416034343698203681790800350718, + 21888242871839275222246405745257275088548364400416034343698203796854639323092, + 511536520025290, + 21888242871839275222246405745257275088548364400416034343698203868736591128876, + 113729841719194, + 21888242871839275222246405745257275088548364400416034343698204094933198461584, + 21888242871839275222246405745257275088548364400416034343698203959052481903545, + 455066108792871, + 21888242871839275222246405745257275088548364400416034343698203773570346408449, + 537175200438896, + 440981935617066, + 206388218996192, + 361681164651198, + 21888242871839275222246405745257275088548364400416034343698204019772523495800, + 21888242871839275222246405745257275088548364400416034343698204136139423576770, + 108957751033705, + 121687565530126, + 21888242871839275222246405745257275088548364400416034343698203728183818505541, + 21888242871839275222246405745257275088548364400416034343698203870816573430285, + 363288189761540, + 12882646745975, + 182855534776202, + 21888242871839275222246405745257275088548364400416034343698204100534652021574, + 538376311870814, + 21888242871839275222246405745257275088548364400416034343698204170307287516329, + 553897943492329, + 554713490151980, + 21888242871839275222246405745257275088548364400416034343698203659491237812928, + 270932011368405, + 21888242871839275222246405745257275088548364400416034343698203977432168036444, + 227547205899571, + 21888242871839275222246405745257275088548364400416034343698203701987910182644, + 21888242871839275222246405745257275088548364400416034343698204119824336142332, + 21888242871839275222246405745257275088548364400416034343698203859858132242224, + 21888242871839275222246405745257275088548364400416034343698203898309159635705, + 281501301254872, + 21888242871839275222246405745257275088548364400416034343698203765473933350180, + 21888242871839275222246405745257275088548364400416034343698203954113592950173, + 327498661390131, + 21888242871839275222246405745257275088548364400416034343698203747874103771791, + 21888242871839275222246405745257275088548364400416034343698204106392521967710, + 21888242871839275222246405745257275088548364400416034343698203856428857168552, + 21888242871839275222246405745257275088548364400416034343698204029025466290367, + 52847891594492, + 415710746399702, + 279530675494147, + 224687035165912, + 21888242871839275222246405745257275088548364400416034343698204014899264991912, + 210867954510166, + 21888242871839275222246405745257275088548364400416034343698204078204900570770, + 400369687264015, + 21888242871839275222246405745257275088548364400416034343698203634823616842826, + 21888242871839275222246405745257275088548364400416034343698203884087229938758, + 21888242871839275222246405745257275088548364400416034343698203808644106433651, + 136373953262717, + 21888242871839275222246405745257275088548364400416034343698203693926190338487, + 21888242871839275222246405745257275088548364400416034343698203766418605005670, + 201069696700867, + 34619088464872, + 531620867113990, + 200630062816747, + 501900616801170, + 367150914124423, + 454088184719744, + 240166233945411, + 110856692605620, + 21888242871839275222246405745257275088548364400416034343698203660467564140002, + 21888242871839275222246405745257275088548364400416034343698203829232920917466, + 139150209780572, + 122377973263195, + 21888242871839275222246405745257275088548364400416034343698204179534262992173, + 102673621422283, + 122403531480693, + 141322144973505, + 433037890208129, + 425280972835158, + 150377854380217, + 347399499451085, + 169889249786832, + 412886748044854, + 86658229630143, + 21888242871839275222246405745257275088548364400416034343698203653497085354422, + 21888242871839275222246405745257275088548364400416034343698204127804693909754, + 21888242871839275222246405745257275088548364400416034343698203813801111152972, + 414278888171889, + 340987393176552, + 21888242871839275222246405745257275088548364400416034343698204149534412436746, + 355621857713600, + 382184235640249, + 127010603738440, + 520645387641723, + 21888242871839275222246405745257275088548364400416034343698203737196788569772, + 268773163004761, + 249546802983890, + 21888242871839275222246405745257275088548364400416034343698203639771411483879, + 428357416043118, + 21888242871839275222246405745257275088548364400416034343698203971295159258782, + 21888242871839275222246405745257275088548364400416034343698203698806588098951, + 21888242871839275222246405745257275088548364400416034343698203644061729590806, + 21888242871839275222246405745257275088548364400416034343698203661538345854873, + 21888242871839275222246405745257275088548364400416034343698204162199700067033, + 21888242871839275222246405745257275088548364400416034343698203732895165094051, + 322050880217565, + 21888242871839275222246405745257275088548364400416034343698203975731643517753, + 281476703720114, + 18117120782369, + 252888934450864, + 450701715704896, + 175419807413402, + 21888242871839275222246405745257275088548364400416034343698204070293641611507, + 260122446894450, + 136044500155783, + 21888242871839275222246405745257275088548364400416034343698203803984455192124, + 21888242871839275222246405745257275088548364400416034343698203984833856539693, + 21888242871839275222246405745257275088548364400416034343698204092764581950008, + 21888242871839275222246405745257275088548364400416034343698203714077266488625, + 21888242871839275222246405745257275088548364400416034343698203720047944012426, + 21888242871839275222246405745257275088548364400416034343698203773732142798288, + 531501081738822, + 21888242871839275222246405745257275088548364400416034343698203691565225064818, + 21888242871839275222246405745257275088548364400416034343698203739563811395492, + 21888242871839275222246405745257275088548364400416034343698203893622825774326, + 290822563145111, + 108960001828964, + 71940122309670, + 347922402962569, + 21888242871839275222246405745257275088548364400416034343698203843866707334597, + 292707067428256, + 543811316817736, + 54115092439804, + 21888242871839275222246405745257275088548364400416034343698203918687696932845, + 125994543098802, + 500229736787, + 339085739346604, + 286782296512005, + 21888242871839275222246405745257275088548364400416034343698204046504208366948, + 21888242871839275222246405745257275088548364400416034343698203872785980929483, + 21888242871839275222246405745257275088548364400416034343698203891146045038440, + 238020850436050, + 372339047805418, + 21888242871839275222246405745257275088548364400416034343698204056278127286549, + 21888242871839275222246405745257275088548364400416034343698204092149716602271, + 21888242871839275222246405745257275088548364400416034343698204100906224503371, + 21888242871839275222246405745257275088548364400416034343698203718808871729680, + 21888242871839275222246405745257275088548364400416034343698203811352434203164, + 21888242871839275222246405745257275088548364400416034343698203629659212914536, + 311474846890686, + 21888242871839275222246405745257275088548364400416034343698203643601677833952, + 537220935956826, + 435963317802853, + 21888242871839275222246405745257275088548364400416034343698203780688816691540, + 380385822053565, + 21888242871839275222246405745257275088548364400416034343698204113658382334434, + 321599974963358, + 498630466798712, + 520605228983005, + 419430840696461, + 21888242871839275222246405745257275088548364400416034343698204174683947379673, + 21888242871839275222246405745257275088548364400416034343698203877373430064445, + 21888242871839275222246405745257275088548364400416034343698203784020067410265, + 379667553743112, + 431756013894188, + 398880354273032, + 258844458559106, + 21888242871839275222246405745257275088548364400416034343698203654503983423833, + 21888242871839275222246405745257275088548364400416034343698203857459527501237, + 21888242871839275222246405745257275088548364400416034343698203979981249446939, + 21888242871839275222246405745257275088548364400416034343698203966870192514058, + 439856650222688, + 181815482810912, + 71919007200532, + 546162303340921, + 482117680888875, + 21888242871839275222246405745257275088548364400416034343698204126720060250916, + 21888242871839275222246405745257275088548364400416034343698204015286879710685, + 425153098496519, + 21888242871839275222246405745257275088548364400416034343698203747782714667161, + 21888242871839275222246405745257275088548364400416034343698203663125541353818, + 21888242871839275222246405745257275088548364400416034343698204124181931929700, + 21888242871839275222246405745257275088548364400416034343698203950629507664933, + 21888242871839275222246405745257275088548364400416034343698203678171279434940, + 534728118559027, + 21888242871839275222246405745257275088548364400416034343698203773094216915669, + 64482500891665, + 21888242871839275222246405745257275088548364400416034343698203940816511949970, + 111521779831430, + 21888242871839275222246405745257275088548364400416034343698203829469938255504, + 21888242871839275222246405745257275088548364400416034343698204104792969802811, + 21888242871839275222246405745257275088548364400416034343698203981186980387869, + 66545883577545, + 82000904636774, + 21888242871839275222246405745257275088548364400416034343698203920529051294857, + 558246442485814, + 21888242871839275222246405745257275088548364400416034343698203853121571178610, + 21888242871839275222246405745257275088548364400416034343698203824325931806277, + 324038628105699, + 21888242871839275222246405745257275088548364400416034343698204171559891146999, + 407884571148188, + 280342348716793, + 77774032252311, + 21888242871839275222246405745257275088548364400416034343698204085590938522108, + 30207615085450, + 518711945766587, + 4690075861407, + 21888242871839275222246405745257275088548364400416034343698204004534523015204, + 465926810615817, + 550478516712203, + 21888242871839275222246405745257275088548364400416034343698203686628169021112, + 21888242871839275222246405745257275088548364400416034343698203659232921109307, + 94762290517873, + 160762192959996, + 21888242871839275222246405745257275088548364400416034343698203854106425090378, + 21888242871839275222246405745257275088548364400416034343698204056287434576205, + 169070906772808, + 119284430099545, + 21888242871839275222246405745257275088548364400416034343698204067410844740957, + 21888242871839275222246405745257275088548364400416034343698203676993302302270, + 412044042804324, + 59150103426037, + 292095793541413, + 444167215098157, + 539327887185490, + 21888242871839275222246405745257275088548364400416034343698203992088747786553, + 21888242871839275222246405745257275088548364400416034343698204037826811089117, + 21888242871839275222246405745257275088548364400416034343698203647567480636685, + 540182877254434, + 21888242871839275222246405745257275088548364400416034343698204177498229551541, + 21888242871839275222246405745257275088548364400416034343698203777449664402934, + 396621479643280, + 338867041836934, + 216452527405722, + 21888242871839275222246405745257275088548364400416034343698203742990892952535, + 21888242871839275222246405745257275088548364400416034343698204049504146129538, + 104796037392225, + 254189489409707, + 182207522160797, + 21888242871839275222246405745257275088548364400416034343698203967928324501900, + 76106594787573, + 86997718096519, + 21888242871839275222246405745257275088548364400416034343698204160931137249633, + 21888242871839275222246405745257275088548364400416034343698204145983273322746, + 54584315554191, + 21888242871839275222246405745257275088548364400416034343698203684853989680028, + 523907889103424, + 21888242871839275222246405745257275088548364400416034343698203954588321986751, + 261338216069412, + 537314451480853, + 21888242871839275222246405745257275088548364400416034343698203859414165310344, + 123896265798996, + 21888242871839275222246405745257275088548364400416034343698203916837268732421, + 21888242871839275222246405745257275088548364400416034343698204039932061312468, + 158279066575519, + 21888242871839275222246405745257275088548364400416034343698203689897337332412, + 21888242871839275222246405745257275088548364400416034343698203835672119120834, + 21888242871839275222246405745257275088548364400416034343698203888848976683514, + 311270452754482, + 300732632748435, + 21888242871839275222246405745257275088548364400416034343698204100826532047482, + 21888242871839275222246405745257275088548364400416034343698204173945290910509, + 21888242871839275222246405745257275088548364400416034343698203989559143625004, + 491373370458549, + 135251813766107, + 66184014162592, + 21888242871839275222246405745257275088548364400416034343698204150632555965010, + 21888242871839275222246405745257275088548364400416034343698204016584566837134, + 220107137290808, + 203763482731646, + 21888242871839275222246405745257275088548364400416034343698204074163695511180, + 529227617777299, + 326503984992097, + 384430089303223, + 334918064936626, + 21888242871839275222246405745257275088548364400416034343698204067313568721131, + 21888242871839275222246405745257275088548364400416034343698203831094862927683, + 21888242871839275222246405745257275088548364400416034343698204010576576837193, + 21888242871839275222246405745257275088548364400416034343698203630159965229382, + 515799911348838, + 21888242871839275222246405745257275088548364400416034343698204016052523528695, + 21888242871839275222246405745257275088548364400416034343698203791833632890905, + 21888242871839275222246405745257275088548364400416034343698203806749549706196, + 21888242871839275222246405745257275088548364400416034343698204014215204237647, + 327700099337365, + 104836138855030, + 21888242871839275222246405745257275088548364400416034343698203721515169044932, + 21888242871839275222246405745257275088548364400416034343698203955188619789516, + 268047213531245, + 450526370619234, + 21888242871839275222246405745257275088548364400416034343698204150266112128858, + 99841278915500, + 331659336661952, + 21888242871839275222246405745257275088548364400416034343698203780981900649796, + 529447544015498, + 21888242871839275222246405745257275088548364400416034343698204001434958192021, + 21888242871839275222246405745257275088548364400416034343698203903607983914579, + 21888242871839275222246405745257275088548364400416034343698203841168946893811, + 21888242871839275222246405745257275088548364400416034343698203832312601333344, + 203873213349987, + 21888242871839275222246405745257275088548364400416034343698203658753189683158, + 511611097852682, + 542348408021376, + 21888242871839275222246405745257275088548364400416034343698203872356857620290, + 76764110894592, + 328250772055002, + 21888242871839275222246405745257275088548364400416034343698204042634857049492, + 98570369076047, + 21888242871839275222246405745257275088548364400416034343698203805236756231294, + 561511240556634, + 476198493551335, + 21888242871839275222246405745257275088548364400416034343698203807636713138986, + 21888242871839275222246405745257275088548364400416034343698203631075617275055, + 46430177802422, + 21888242871839275222246405745257275088548364400416034343698203692616103231027, + 21888242871839275222246405745257275088548364400416034343698203971307419077294, + 316631387835547, + 21888242871839275222246405745257275088548364400416034343698204179428225770522, + 156031741328017, + 430993093962920, + 21888242871839275222246405745257275088548364400416034343698203828500039247321, + 259727625811426, + 344117202286934, + 21888242871839275222246405745257275088548364400416034343698204120763311296977, + 21888242871839275222246405745257275088548364400416034343698203700303889566409, + 115866418392740, + 65372009163593, + 295640490994742, + 21888242871839275222246405745257275088548364400416034343698203715852301555037, + 142250873679988, + 101935869789343, + 21888242871839275222246405745257275088548364400416034343698203793024663094472, + 21888242871839275222246405745257275088548364400416034343698204033553243404082, + 90066591438319, + 21888242871839275222246405745257275088548364400416034343698204154248804188817, + 396804892226663, + 21888242871839275222246405745257275088548364400416034343698203922294065529031, + 275182005600813, + 13336337640295, + 241347054097048, + 21888242871839275222246405745257275088548364400416034343698203774806816338264, + 21888242871839275222246405745257275088548364400416034343698203640732630165360, + 21888242871839275222246405745257275088548364400416034343698203944044057387361, + 238805128953013, + 59644611127085, + 21888242871839275222246405745257275088548364400416034343698203995627124474073, + 82941592771796, + 500995639468998, + 118567239253523, + 28493585026887, + 427584184989014, + 390884563938742, + 522455221337140, + 21888242871839275222246405745257275088548364400416034343698203783168695069374, + 21888242871839275222246405745257275088548364400416034343698203716254831477408, + 21888242871839275222246405745257275088548364400416034343698203867568281120874, + 21888242871839275222246405745257275088548364400416034343698203979557589698630, + 420001827318082, + 21888242871839275222246405745257275088548364400416034343698203981774095425387, + 459588931000582, + 21888242871839275222246405745257275088548364400416034343698203983886789215620, + 462966127747095, + 275627343146718, + 21888242871839275222246405745257275088548364400416034343698204138718053757223, + 403990250732048, + 21888242871839275222246405745257275088548364400416034343698204102448639801276, + 437883438864603, + 59329247572804, + 21888242871839275222246405745257275088548364400416034343698203877201944231387, + 21888242871839275222246405745257275088548364400416034343698203675414967943583, + 206749280501640, + 467990512649041, + 21888242871839275222246405745257275088548364400416034343698203824860925118264, + 427642857551038, + 21888242871839275222246405745257275088548364400416034343698203741483427819981, + 21888242871839275222246405745257275088548364400416034343698203846893542088099, + 21888242871839275222246405745257275088548364400416034343698204089385718192355, + 245104780813734, + 21888242871839275222246405745257275088548364400416034343698204044004808676494, + 21888242871839275222246405745257275088548364400416034343698204132777174867001, + 32235526850509, + 21888242871839275222246405745257275088548364400416034343698203796319909784070, + 21888242871839275222246405745257275088548364400416034343698203654111852668711, + 76608691737931, + 21888242871839275222246405745257275088548364400416034343698203754727057738862, + 21888242871839275222246405745257275088548364400416034343698203832224077644688, + 21888242871839275222246405745257275088548364400416034343698203692031026721880, + 21888242871839275222246405745257275088548364400416034343698203758243705789146, + 17359442319609, + 21888242871839275222246405745257275088548364400416034343698204129793802619838, + 21888242871839275222246405745257275088548364400416034343698203926412896981113, + 443915777109829, + 21888242871839275222246405745257275088548364400416034343698203791489632302944, + 21888242871839275222246405745257275088548364400416034343698203865838528679745, + 21888242871839275222246405745257275088548364400416034343698204068877884604009, + 21888242871839275222246405745257275088548364400416034343698204162847182967594, + 406014131632824, + 416304276892479, + 398189475574401, + 21888242871839275222246405745257275088548364400416034343698203633421337051788, + 310028420324025, + 549208171683972, + 21888242871839275222246405745257275088548364400416034343698204153013916977145, + 21888242871839275222246405745257275088548364400416034343698204121345896775419, + 447452228478659, + 21888242871839275222246405745257275088548364400416034343698203636954419481969, + 21888242871839275222246405745257275088548364400416034343698203860935765439499, + 21888242871839275222246405745257275088548364400416034343698203985244090597198, + 21888242871839275222246405745257275088548364400416034343698203696697021836989, + 478978931963645, + 92407238575504, + 292017787048893, + 46957260229142, + 21888242871839275222246405745257275088548364400416034343698204026770013629327, + 33728891967434, + 21888242871839275222246405745257275088548364400416034343698203794971081354966, + 21888242871839275222246405745257275088548364400416034343698204087585227993639, + 21888242871839275222246405745257275088548364400416034343698204003983957610476, + 48355546653165, + 202493287148389, + 21888242871839275222246405745257275088548364400416034343698203745687803740970, + 21888242871839275222246405745257275088548364400416034343698203861579228277711, + 21888242871839275222246405745257275088548364400416034343698204182726644832154, + 21888242871839275222246405745257275088548364400416034343698203758348140021255, + 21888242871839275222246405745257275088548364400416034343698203953646595411008, + 21888242871839275222246405745257275088548364400416034343698203734569753561829, + 3028688956458, + 21888242871839275222246405745257275088548364400416034343698204173346056440602, + 500809882357175, + 21888242871839275222246405745257275088548364400416034343698204091857857739705, + 21888242871839275222246405745257275088548364400416034343698203862531253953183, + 282734891127140, + 21888242871839275222246405745257275088548364400416034343698204080885454863780, + 21888242871839275222246405745257275088548364400416034343698203629540024910461, + 359716095900640, + 21888242871839275222246405745257275088548364400416034343698203697640284895545, + 388385147563857, + 12755764319341, + 23507852665322, + 21888242871839275222246405745257275088548364400416034343698204167494740054072, + 21888242871839275222246405745257275088548364400416034343698204010893123183188, + 21888242871839275222246405745257275088548364400416034343698204007825661123447, + 155856797914906, + 21888242871839275222246405745257275088548364400416034343698203781443449148768, + 21888242871839275222246405745257275088548364400416034343698203696873104231349, + 339058047949548, + 21888242871839275222246405745257275088548364400416034343698203937541406368596, + 535949183975905, + 21888242871839275222246405745257275088548364400416034343698203847570069932391, + 21888242871839275222246405745257275088548364400416034343698203793719208132024, + 210360865604458, + 12773796409229, + 59565184221859, + 21888242871839275222246405745257275088548364400416034343698203825136746285329, + 3584217291571, + 21888242871839275222246405745257275088548364400416034343698203845494232322562, + 37116215890207, + 318510425183392, + 21888242871839275222246405745257275088548364400416034343698204079666122097326, + 365892336422135, + 21888242871839275222246405745257275088548364400416034343698204113356530511461, + 21888242871839275222246405745257275088548364400416034343698204091475500329926, + 300914951316253, + 185608381954817, + 21888242871839275222246405745257275088548364400416034343698204144904572683406, + 21888242871839275222246405745257275088548364400416034343698204006583686998358, + 456587016567617, + 21888242871839275222246405745257275088548364400416034343698203741822061639403, + 38080911567502, + 21888242871839275222246405745257275088548364400416034343698204155048489925194, + 21888242871839275222246405745257275088548364400416034343698204180283543297860, + 353970493254323, + 280323356196284, + 513732102419737, + 85519171420919, + 21888242871839275222246405745257275088548364400416034343698204083436284238650, + 21888242871839275222246405745257275088548364400416034343698203853716516449479, + 443690199094010, + 445409021330612, + 439120918763707, + 453347556938188, + 21888242871839275222246405745257275088548364400416034343698203924024398291427, + 422384869633349, + 21888242871839275222246405745257275088548364400416034343698203869595659640216, + 375461888036966, + 227028326595661, + 444031678637080, + 192720397363850, + 469718686761721, + 508616683897402, + 21888242871839275222246405745257275088548364400416034343698204096527090719334, + 21888242871839275222246405745257275088548364400416034343698204180998704663602, + 21888242871839275222246405745257275088548364400416034343698203877210892282295, + 30348704273328, + 251620638786474, + 339477479979846, + 527895962761914, + 472370468374133, + 244552675007552, + 193028676138696, + 368046117840411, + 21888242871839275222246405745257275088548364400416034343698203972304114278475, + 210353524876981, + 248600284624905, + 21888242871839275222246405745257275088548364400416034343698204130256570264510, + 21888242871839275222246405745257275088548364400416034343698203952023932720744, + 188212342188374, + 21888242871839275222246405745257275088548364400416034343698204094892701641533, + 21888242871839275222246405745257275088548364400416034343698204171589832650505, + 373269489179506, + 21888242871839275222246405745257275088548364400416034343698203716925989437282, + 21888242871839275222246405745257275088548364400416034343698203698974561692605, + 21888242871839275222246405745257275088548364400416034343698204064647533142294, + 258769636782663, + 21888242871839275222246405745257275088548364400416034343698204165818117840043, + 413148548624881, + 21888242871839275222246405745257275088548364400416034343698204069056077338606, + 126214505113320, + 202728901108119, + 186091083378398, + 339755747953380, + 19705232764268, + 21888242871839275222246405745257275088548364400416034343698203729653165485617, + 498089546353824, + 327306236625268, + 333282632264309, + 500382088233820, + 393058053764553, + 21888242871839275222246405745257275088548364400416034343698203681409299868819, + 21888242871839275222246405745257275088548364400416034343698204146624831462268, + 361926325635566, + 21888242871839275222246405745257275088548364400416034343698203644751712582459, + 477549643158576, + 129292638940772, + 218107882238498, + 12706480132072, + 176669559747156, + 176185549900417, + 464872988169146, + 366398454980843, + 189581230269507, + 100420550688229, + 21888242871839275222246405745257275088548364400416034343698203916462011817855, + 158571123066015, + 21888242871839275222246405745257275088548364400416034343698204032472699212133, + 21888242871839275222246405745257275088548364400416034343698203817348166418721, + 118387191061217, + 21888242871839275222246405745257275088548364400416034343698204041561383327598, + 338585245002349, + 170200189089999, + 214907323343411, + 21888242871839275222246405745257275088548364400416034343698204070039514581509, + 82211182508273, + 79226510042501, + 417057528612373, + 21888242871839275222246405745257275088548364400416034343698203636100558552865, + 21888242871839275222246405745257275088548364400416034343698204125870885505344, + 386325480811016, + 507186267763275, + 552028811475700, + 21888242871839275222246405745257275088548364400416034343698203782109892557876, + 21888242871839275222246405745257275088548364400416034343698204114811429183012, + 21888242871839275222246405745257275088548364400416034343698203864487954958252, + 21888242871839275222246405745257275088548364400416034343698203967485511099033, + 489921363873917, + 21888242871839275222246405745257275088548364400416034343698203888385642026708, + 21888242871839275222246405745257275088548364400416034343698204074501939947280, + 265047041316958, + 539675844759642, + 21888242871839275222246405745257275088548364400416034343698203853947835112021, + 231944696293173, + 21888242871839275222246405745257275088548364400416034343698203726543368723744, + 21888242871839275222246405745257275088548364400416034343698203788029555045287, + 522391216023814, + 141562606278074, + 21888242871839275222246405745257275088548364400416034343698203768097018592312, + 261217583082922, + 259876046597667, + 22123748534779, + 306867797521693, + 21888242871839275222246405745257275088548364400416034343698203763170832078060, + 179611044070329, + 208429845803465, + 220740057242975, + 479599926514608, + 247732799016357, + 21888242871839275222246405745257275088548364400416034343698203866103111404071, + 21888242871839275222246405745257275088548364400416034343698203883412882075772, + 321077086691157, + 21888242871839275222246405745257275088548364400416034343698203876246116328058, + 21888242871839275222246405745257275088548364400416034343698203884264021665078, + 543560529181727, + 338839495884488, + 272130386045756, + 540468859426134, + 430625532739828, + 423499677873474, + 21888242871839275222246405745257275088548364400416034343698203625511217631792, + 21888242871839275222246405745257275088548364400416034343698204185248562228025, + 321257367197481, + 21888242871839275222246405745257275088548364400416034343698203924515920516518, + 21888242871839275222246405745257275088548364400416034343698203973681588183420, + 21888242871839275222246405745257275088548364400416034343698203981950735532366, + 21888242871839275222246405745257275088548364400416034343698203820488324455974, + 187497868545325, + 389854108948890, + 21888242871839275222246405745257275088548364400416034343698203775914048347675, + 159345331651695, + 220026745798185, + 218335969179956, + 21888242871839275222246405745257275088548364400416034343698203776068030261554, + 21888242871839275222246405745257275088548364400416034343698203773017137411302, + 192321327246045, + 21888242871839275222246405745257275088548364400416034343698203949574465737619, + 21888242871839275222246405745257275088548364400416034343698204080761121149275, + 21888242871839275222246405745257275088548364400416034343698203866235467481727, + 21888242871839275222246405745257275088548364400416034343698203666623732260751, + 21888242871839275222246405745257275088548364400416034343698203636901200112177, + 21888242871839275222246405745257275088548364400416034343698203836321387895076, + 21888242871839275222246405745257275088548364400416034343698203797554393506574, + 189626558291990, + 118418747775951, + 122499948845621, + 193655876914114, + 492173259156027, + 38668769084910, + 410538013373821, + 21888242871839275222246405745257275088548364400416034343698204077272980523332, + 21888242871839275222246405745257275088548364400416034343698203697903376219866, + 21888242871839275222246405745257275088548364400416034343698204076471458827401, + 21888242871839275222246405745257275088548364400416034343698204123823140163471, + 21888242871839275222246405745257275088548364400416034343698203993564741351903, + 524656946220411, + 495449649911904, + 225269272078079, + 21888242871839275222246405745257275088548364400416034343698203979176735228768, + 164624836788843, + 21888242871839275222246405745257275088548364400416034343698203624522370026758, + 21888242871839275222246405745257275088548364400416034343698203781411678629592, + 21888242871839275222246405745257275088548364400416034343698203974297089727231, + 35831934419637, + 21888242871839275222246405745257275088548364400416034343698203623767864427066, + 277462312221691, + 377318352659569, + 245097206747039, + 559959959553276, + 21888242871839275222246405745257275088548364400416034343698204063351536826681, + 21888242871839275222246405745257275088548364400416034343698204013919858867862, + 204731256932398, + 21888242871839275222246405745257275088548364400416034343698203796113397685314, + 21888242871839275222246405745257275088548364400416034343698204056181911752095, + 8452051060479, + 21888242871839275222246405745257275088548364400416034343698204008105942892231, + 533837959524458, + 362481048847384, + 419311089567382, + 21888242871839275222246405745257275088548364400416034343698203961219392605598, + 21888242871839275222246405745257275088548364400416034343698204163828457683841, + 547834537381587, + 21888242871839275222246405745257275088548364400416034343698203821420009851977, + 25711992697331, + 298699094611018, + 217935478661195, + 560656254419101, + 484224596852990, + 561364064516451, + 21888242871839275222246405745257275088548364400416034343698203657246981495282, + 175768746208272, + 355915065539080, + 21888242871839275222246405745257275088548364400416034343698203825496520286318, + 21888242871839275222246405745257275088548364400416034343698203827245043950841, + 515552755262089, + 29171912255273, + 367650759055322, + 36977658607637, + 249657242277932, + 436817903746036, + 81942943234737, + 21888242871839275222246405745257275088548364400416034343698203889932266874717, + 21888242871839275222246405745257275088548364400416034343698204065418315713885, + 169874021893873, + 21888242871839275222246405745257275088548364400416034343698203839198498132537, + 21888242871839275222246405745257275088548364400416034343698203886517562605761, + 21888242871839275222246405745257275088548364400416034343698204144986129714773, + 109162415956812, + 554159684846761, + 21888242871839275222246405745257275088548364400416034343698204119938337137762, + 21888242871839275222246405745257275088548364400416034343698203636832090357508, + 38640508703164, + 8304060673097, + 21888242871839275222246405745257275088548364400416034343698204055543090687028, + 441264075269352, + 21888242871839275222246405745257275088548364400416034343698204016071029483342, + 21888242871839275222246405745257275088548364400416034343698203626845798013312, + 21888242871839275222246405745257275088548364400416034343698203921843620800104, + 21888242871839275222246405745257275088548364400416034343698203889999001221115, + 21888242871839275222246405745257275088548364400416034343698203970594728374917, + 29099401404728, + 21888242871839275222246405745257275088548364400416034343698203740466869814615, + 37114267316839, + 21888242871839275222246405745257275088548364400416034343698204147862311526493, + 21888242871839275222246405745257275088548364400416034343698203657147547747621, + 21888242871839275222246405745257275088548364400416034343698204152853468092474, + 340551902174394, + 21888242871839275222246405745257275088548364400416034343698203810284744555550, + 21888242871839275222246405745257275088548364400416034343698204174847725566160, + 21888242871839275222246405745257275088548364400416034343698203834316636560375, + 92691227644442, + 21888242871839275222246405745257275088548364400416034343698203765503237900645, + 21888242871839275222246405745257275088548364400416034343698204026650513791286, + 268761189683292, + 402535032564460, + 21888242871839275222246405745257275088548364400416034343698203771665168531804, + 21888242871839275222246405745257275088548364400416034343698204119476208885544, + 21888242871839275222246405745257275088548364400416034343698203719323084193435, + 21888242871839275222246405745257275088548364400416034343698204112200873358338, + 556126082163994, + 40385108326240, + 21888242871839275222246405745257275088548364400416034343698204076569458735258, + 289857298529187, + 438534991496478, + 270827044280707, + 21888242871839275222246405745257275088548364400416034343698203923256290258738, + 21888242871839275222246405745257275088548364400416034343698203776267419435355, + 81326761397114, + 21888242871839275222246405745257275088548364400416034343698203766236371236782, + 388946855121070, + 21888242871839275222246405745257275088548364400416034343698204086528823019656, + 114649712153951, + 21888242871839275222246405745257275088548364400416034343698203675235673508284, + 21888242871839275222246405745257275088548364400416034343698203861946140197634, + 112800403950488, + 517661358665621, + 21888242871839275222246405745257275088548364400416034343698204119245562128159, + 21888242871839275222246405745257275088548364400416034343698203934754136667843, + 110051662714102, + 444163783608079, + 21888242871839275222246405745257275088548364400416034343698203804660928807792, + 353165969055897, + 266560276335415, + 513163453352331, + 21888242871839275222246405745257275088548364400416034343698203717256991155205, + 141245964396389, + 441551114417055, + 479640725691549, + 21888242871839275222246405745257275088548364400416034343698204019040163894301, + 523260625286748, + 21888242871839275222246405745257275088548364400416034343698204048664454102358, + 107777845456969, + 21888242871839275222246405745257275088548364400416034343698203766659199884522, + 21888242871839275222246405745257275088548364400416034343698204175778751211210, + 36914409144026, + 268779462325025, + 21888242871839275222246405745257275088548364400416034343698203875094956169541, + 546619993214251, + 405886416647951, + 157845278941030, + 21888242871839275222246405745257275088548364400416034343698204144780221316095, + 509705489427516, + 21888242871839275222246405745257275088548364400416034343698204139507154136461, + 21888242871839275222246405745257275088548364400416034343698203851045267575787, + 21888242871839275222246405745257275088548364400416034343698203727681193102769, + 21888242871839275222246405745257275088548364400416034343698203681042914294628, + 355738291892979, + 97873770236794, + 21888242871839275222246405745257275088548364400416034343698203866495592382703, + 552716726141871, + 21888242871839275222246405745257275088548364400416034343698203932367227048793, + 21888242871839275222246405745257275088548364400416034343698203929362011402197, + 21888242871839275222246405745257275088548364400416034343698204031100045283423, + 57857617735559, + 21888242871839275222246405745257275088548364400416034343698203859946546183344, + 260407183857433, + 242339153912104, + 21888242871839275222246405745257275088548364400416034343698203814239868974849, + 21888242871839275222246405745257275088548364400416034343698204072046078303833, + 21888242871839275222246405745257275088548364400416034343698203893567262894141, + 24369570091060, + 343159327217055, + 21888242871839275222246405745257275088548364400416034343698203701256697301318, + 21888242871839275222246405745257275088548364400416034343698204180555912928988, + 200444995174413, + 21888242871839275222246405745257275088548364400416034343698203636574668847241, + 21888242871839275222246405745257275088548364400416034343698203808249793582090, + 21888242871839275222246405745257275088548364400416034343698204099622415309680, + 114058211187591, + 21888242871839275222246405745257275088548364400416034343698203967579539213655, + 21888242871839275222246405745257275088548364400416034343698203670956860000348, + 413031765065656, + 21888242871839275222246405745257275088548364400416034343698204045430375791902, + 396598963711087, + 21888242871839275222246405745257275088548364400416034343698203866920983973589, + 523014482383646, + 21888242871839275222246405745257275088548364400416034343698203857053969259049, + 21888242871839275222246405745257275088548364400416034343698204054558404134471, + 385413993675057, + 474479630734124, + 27044333973221, + 519052220842408, + 21888242871839275222246405745257275088548364400416034343698203880888649807594, + 21888242871839275222246405745257275088548364400416034343698203951051901305067, + 21888242871839275222246405745257275088548364400416034343698204103775457368022, + 21888242871839275222246405745257275088548364400416034343698204042157721922912, + 21888242871839275222246405745257275088548364400416034343698204029789087783764, + 21888242871839275222246405745257275088548364400416034343698203786073013724348, + 57783760924019, + 21888242871839275222246405745257275088548364400416034343698203639662885698363, + 21888242871839275222246405745257275088548364400416034343698203850743407605859, + 21888242871839275222246405745257275088548364400416034343698203903745293436534, + 59648456806711, + 21888242871839275222246405745257275088548364400416034343698204179452765403240, + 21888242871839275222246405745257275088548364400416034343698203800573634000974, + 21888242871839275222246405745257275088548364400416034343698203716244573328297, + 21888242871839275222246405745257275088548364400416034343698203718740771394072, + 21888242871839275222246405745257275088548364400416034343698203797910729424036, + 21888242871839275222246405745257275088548364400416034343698204163987298597004, + 287115868479618, + 554013433621218, + 21888242871839275222246405745257275088548364400416034343698204132744076685379, + 21888242871839275222246405745257275088548364400416034343698203818705145992716, + 510218913277723, + 141113017143810, + 21888242871839275222246405745257275088548364400416034343698204093595931000234, + 21888242871839275222246405745257275088548364400416034343698203800814465539700, + 21888242871839275222246405745257275088548364400416034343698204033640665380034, + 21888242871839275222246405745257275088548364400416034343698204145917121252979, + 113633716027634, + 393017181705370, + 21888242871839275222246405745257275088548364400416034343698203643971008759662, + 72598367534565, + 206182528231555, + 21888242871839275222246405745257275088548364400416034343698204123090842117862, + 134669499513343, + 21888242871839275222246405745257275088548364400416034343698204097892406414923, + 308340200928252, + 21888242871839275222246405745257275088548364400416034343698204054927360036320, + 236990337017508, + 21888242871839275222246405745257275088548364400416034343698203920486253634653, + 21888242871839275222246405745257275088548364400416034343698203799359660851195, + 21888242871839275222246405745257275088548364400416034343698203732231162071772, + 21888242871839275222246405745257275088548364400416034343698203969988902572799, + 50168785158377, + 21888242871839275222246405745257275088548364400416034343698204146677366180809, + 21888242871839275222246405745257275088548364400416034343698203849496016491443, + 526533282330239, + 21888242871839275222246405745257275088548364400416034343698203705862582837407, + 295157613075717, + 132350029978335, + 21888242871839275222246405745257275088548364400416034343698203872144589573241, + 21888242871839275222246405745257275088548364400416034343698203770455782594602, + 21888242871839275222246405745257275088548364400416034343698203687950949198361, + 21888242871839275222246405745257275088548364400416034343698204149790188315863, + 301855310656530, + 322035645794751, + 21888242871839275222246405745257275088548364400416034343698203910245838734886, + 21888242871839275222246405745257275088548364400416034343698204168423233251229, + 21888242871839275222246405745257275088548364400416034343698203724461845041037, + 250423468661702, + 138664891408383, + 21888242871839275222246405745257275088548364400416034343698204106686329731773, + 507510099442869, + 21888242871839275222246405745257275088548364400416034343698203637748041294788, + 229092583883087, + 25806285976579, + 295723380976765, + 199162909411921, + 468593367168819, + 21888242871839275222246405745257275088548364400416034343698203723057367873837, + 277467393672773, + 21888242871839275222246405745257275088548364400416034343698203678949494949552, + 21888242871839275222246405745257275088548364400416034343698204014818933178337, + 121279533133864, + 21888242871839275222246405745257275088548364400416034343698203814357919473229, + 339014743033108, + 21888242871839275222246405745257275088548364400416034343698203862080386381517, + 126325422270528, + 396064012681213, + 21888242871839275222246405745257275088548364400416034343698204001306504518141, + 21888242871839275222246405745257275088548364400416034343698204130984242405869, + 21888242871839275222246405745257275088548364400416034343698203910643950265370, + 209213645381836, + 21888242871839275222246405745257275088548364400416034343698203920957128723679, + 21888242871839275222246405745257275088548364400416034343698203641564586433322, + 286821375043521, + 336594164046477, + 21888242871839275222246405745257275088548364400416034343698204048326535524039, + 21888242871839275222246405745257275088548364400416034343698203702582698586129, + 538438017904448, + 21888242871839275222246405745257275088548364400416034343698203719121173292764, + 368437953089102, + 75904485232972, + 398925367351356, + 200246348943117, + 21888242871839275222246405745257275088548364400416034343698204001401182293144, + 129611845110076, + 368914797112860, + 21888242871839275222246405745257275088548364400416034343698203847110165897470, + 21888242871839275222246405745257275088548364400416034343698203885273731893358, + 21888242871839275222246405745257275088548364400416034343698203911508191819280, + 21888242871839275222246405745257275088548364400416034343698204036314959927152, + 146987028441348, + 21888242871839275222246405745257275088548364400416034343698204178637101234183, + 282033618583171, + 21888242871839275222246405745257275088548364400416034343698204021594470920098, + 21888242871839275222246405745257275088548364400416034343698203977911684080152, + 44717247902763, + 37614933985178, + 139152250650038, + 21888242871839275222246405745257275088548364400416034343698203903082971154805, + 310626501690368, + 452504488526124, + 375087889812744, + 21888242871839275222246405745257275088548364400416034343698203891586308327090, + 57961300354209, + 21888242871839275222246405745257275088548364400416034343698203822375597141044, + 21888242871839275222246405745257275088548364400416034343698203685690045565132, + 423221447467070, + 93026518879447, + 21888242871839275222246405745257275088548364400416034343698203785516565358524, + 217722913014828, + 254015251915798, + 512844618979215, + 21888242871839275222246405745257275088548364400416034343698203746002121916994, + 21888242871839275222246405745257275088548364400416034343698203966519039419914, + 93176662436411, + 347134746811713, + 21888242871839275222246405745257275088548364400416034343698203742577023260924, + 21888242871839275222246405745257275088548364400416034343698203649765847286037, + 463032890772638, + 457958218124785, + 21888242871839275222246405745257275088548364400416034343698203672494184091792, + 21888242871839275222246405745257275088548364400416034343698204007685719894601, + 21888242871839275222246405745257275088548364400416034343698203803620836222278, + 21888242871839275222246405745257275088548364400416034343698204073633168226201, + 21888242871839275222246405745257275088548364400416034343698204167593049271634, + 21888242871839275222246405745257275088548364400416034343698203649720301470411, + 21888242871839275222246405745257275088548364400416034343698203721932415760407, + 247233778659438, + 21888242871839275222246405745257275088548364400416034343698203812855696907617, + 190375326133465, + 408632663282237, + 21888242871839275222246405745257275088548364400416034343698204073229776329484, + 464674277959276, + 21888242871839275222246405745257275088548364400416034343698203749020208156265, + 417369086808634, + 468714969873957, + 21888242871839275222246405745257275088548364400416034343698203734650557597018, + 401531167298824, + 245892999571446, + 190746253126316, + 391754679081154, + 539508720699805, + 37395629088919, + 21888242871839275222246405745257275088548364400416034343698204038165505662362, + 21888242871839275222246405745257275088548364400416034343698203738658487275958, + 21888242871839275222246405745257275088548364400416034343698203736721638322302, + 198030271261351, + 404298272385597, + 21888242871839275222246405745257275088548364400416034343698204094982190438785, + 554628998896767, + 174482971503110, + 21888242871839275222246405745257275088548364400416034343698204030114260318849, + 21888242871839275222246405745257275088548364400416034343698203664985447932371, + 198785198793430, + 21888242871839275222246405745257275088548364400416034343698203895701424639787, + 250086523495003, + 21888242871839275222246405745257275088548364400416034343698203914776675688793, + 203747460534806, + 9077520767153, + 140004316965023, + 21888242871839275222246405745257275088548364400416034343698204098849583414447, + 21888242871839275222246405745257275088548364400416034343698203797230447689561, + 21888242871839275222246405745257275088548364400416034343698204085072129079951, + 264052942583680, + 21888242871839275222246405745257275088548364400416034343698203832513067579457, + 21888242871839275222246405745257275088548364400416034343698204115098563763930, + 289493380363654, + 10566169429987, + 220261744130193, + 176448406913364, + 220380973388728, + 21888242871839275222246405745257275088548364400416034343698203971458370471750, + 6554837391942, + 385306838072078, + 21888242871839275222246405745257275088548364400416034343698203978245601869777, + 21888242871839275222246405745257275088548364400416034343698203961521852821878, + 21888242871839275222246405745257275088548364400416034343698203949543267679644, + 285520289362999, + 548918512411848, + 344361517581418, + 21888242871839275222246405745257275088548364400416034343698203738190335943118, + 21888242871839275222246405745257275088548364400416034343698204068646552380166, + 545168523675898, + 97179668202300, + 155055256150218, + 21888242871839275222246405745257275088548364400416034343698203862671133214544, + 21888242871839275222246405745257275088548364400416034343698203671389192197826, + 21888242871839275222246405745257275088548364400416034343698204093324140551234, + 3925294288809, + 21888242871839275222246405745257275088548364400416034343698204005331290726759, + 21888242871839275222246405745257275088548364400416034343698204099716746718467, + 21888242871839275222246405745257275088548364400416034343698203896250536003548, + 161770373909686, + 280932732071323, + 21888242871839275222246405745257275088548364400416034343698203985045489659401, + 515239777625573, + 444178476641800, + 21888242871839275222246405745257275088548364400416034343698203904358509081748, + 21888242871839275222246405745257275088548364400416034343698203705316596517178, + 533090212371728, + 357236541851035, + 383844610822754, + 21888242871839275222246405745257275088548364400416034343698203847037080865817, + 111968193437436, + 73929711508968, + 239931151160520, + 21888242871839275222246405745257275088548364400416034343698203857090477870924, + 21888242871839275222246405745257275088548364400416034343698204099294542970143, + 21888242871839275222246405745257275088548364400416034343698203765761594865707, + 422773433076284, + 150625932322607, + 4769146925894, + 343939243638162, + 21888242871839275222246405745257275088548364400416034343698204138955809642569, + 21888242871839275222246405745257275088548364400416034343698203873989053651292, + 100139697708464, + 21888242871839275222246405745257275088548364400416034343698203882105076515903, + 404109307768770, + 94494461747977, + 1890185122789, + 143642641081328, + 328739099927238, + 548861778688434, + 443987082146354, + 21888242871839275222246405745257275088548364400416034343698203968634813407525, + 21888242871839275222246405745257275088548364400416034343698204086516564816997, + 403315608282645, + 21888242871839275222246405745257275088548364400416034343698203762521002724768, + 21888242871839275222246405745257275088548364400416034343698203891204335582426, + 21888242871839275222246405745257275088548364400416034343698204021622247440621, + 216234809799580, + 21888242871839275222246405745257275088548364400416034343698203725853095336702, + 169669965446436, + 173964471799407, + 425988026160934, + 21888242871839275222246405745257275088548364400416034343698203771458292093458, + 21888242871839275222246405745257275088548364400416034343698203863721728698315, + 21888242871839275222246405745257275088548364400416034343698203632608453612852, + 433058171347047, + 227340350044118, + 21888242871839275222246405745257275088548364400416034343698203957786927533425, + 259638371651049, + 21888242871839275222246405745257275088548364400416034343698203731719632928461, + 136983545452345, + 309691200153309, + 21888242871839275222246405745257275088548364400416034343698203809914884417336, + 21888242871839275222246405745257275088548364400416034343698204000915651934390, + 67485862169712, + 21888242871839275222246405745257275088548364400416034343698204066754048769286, + 21888242871839275222246405745257275088548364400416034343698204108525757622696, + 21888242871839275222246405745257275088548364400416034343698203801714482389736, + 49360985087341, + 21888242871839275222246405745257275088548364400416034343698204008963199187982, + 21888242871839275222246405745257275088548364400416034343698204177331493269201, + 21888242871839275222246405745257275088548364400416034343698203812090334353072, + 21888242871839275222246405745257275088548364400416034343698203791313891056053, + 21888242871839275222246405745257275088548364400416034343698203693726110212970, + 21888242871839275222246405745257275088548364400416034343698203773780229267484, + 21888242871839275222246405745257275088548364400416034343698203774274586549759, + 21888242871839275222246405745257275088548364400416034343698203690278244654325, + 298488686239584, + 21888242871839275222246405745257275088548364400416034343698203626015759602521, + 546068782532052, + 81505737214399, + 21888242871839275222246405745257275088548364400416034343698203870455686527392, + 70040160058472, + 21888242871839275222246405745257275088548364400416034343698203784503619025971, + 448455466362445, + 21888242871839275222246405745257275088548364400416034343698203699797487072390, + 419863039719387, + 406997025585752, + 21888242871839275222246405745257275088548364400416034343698203784090678455660, + 21888242871839275222246405745257275088548364400416034343698203719761644139315, + 21888242871839275222246405745257275088548364400416034343698203624670971811838, + 86248919064918, + 21888242871839275222246405745257275088548364400416034343698203893776916567378, + 21888242871839275222246405745257275088548364400416034343698204169965843004049, + 434831752497014, + 21888242871839275222246405745257275088548364400416034343698203978725436685632, + 21888242871839275222246405745257275088548364400416034343698203948756518128091, + 21888242871839275222246405745257275088548364400416034343698204017830150685814, + 21888242871839275222246405745257275088548364400416034343698203764211966511379, + 301680103719461, + 21888242871839275222246405745257275088548364400416034343698204050324930507207, + 21888242871839275222246405745257275088548364400416034343698203771496059205909, + 251532711543226, + 21888242871839275222246405745257275088548364400416034343698203678912155251910, + 21888242871839275222246405745257275088548364400416034343698203870733579877531, + 62453480862015, + 487566053168342, + 21888242871839275222246405745257275088548364400416034343698204007233851820322, + 21888242871839275222246405745257275088548364400416034343698203795899327849864, + 499944394222136, + 21888242871839275222246405745257275088548364400416034343698204121809806691672, + 521398127693437, + 558816648092968, + 21888242871839275222246405745257275088548364400416034343698203979314560510684, + 127520134408857, + 21888242871839275222246405745257275088548364400416034343698203696816171370468, + 72887659030187, + 21888242871839275222246405745257275088548364400416034343698203644635237719879, + 314591928438105, + 535899377078159, + 110258982887483, + 553205975341408, + 21888242871839275222246405745257275088548364400416034343698204103948794159619, + 21888242871839275222246405745257275088548364400416034343698203715796902111613, + 230154176265674, + 199826514089330, + 341539864272640, + 21888242871839275222246405745257275088548364400416034343698204136248310933752, + 6063556725427, + 247222311614434, + 21888242871839275222246405745257275088548364400416034343698204083088601860912, + 533058764057552, + 21888242871839275222246405745257275088548364400416034343698203821291499071905, + 21888242871839275222246405745257275088548364400416034343698203782791912304656, + 133673749528628, + 182323419217419, + 21888242871839275222246405745257275088548364400416034343698203946380731644765, + 378008152780245, + 21888242871839275222246405745257275088548364400416034343698204065793809854566, + 21888242871839275222246405745257275088548364400416034343698204049234409037514, + 21888242871839275222246405745257275088548364400416034343698204117806958144094, + 6718585570865, + 125770285207233, + 323467401138756, + 550185522457261, + 430533519952153, + 21888242871839275222246405745257275088548364400416034343698204085357258444842, + 21888242871839275222246405745257275088548364400416034343698204002184074615244, + 428034332147739, + 108751068655107, + 95855588636897, + 21888242871839275222246405745257275088548364400416034343698203945370501641872, + 59391050750527, + 21888242871839275222246405745257275088548364400416034343698203865149893624623, + 21888242871839275222246405745257275088548364400416034343698203707395844075720, + 417731552785686, + 21888242871839275222246405745257275088548364400416034343698203624547767053913, + 21888242871839275222246405745257275088548364400416034343698203961259257225936, + 326671964700062, + 21888242871839275222246405745257275088548364400416034343698204179936623023749, + 172344250114743, + 399265251817707, + 332848322216230, + 21888242871839275222246405745257275088548364400416034343698203894211299545491, + 192948068971601, + 21888242871839275222246405745257275088548364400416034343698204097339666066454, + 440884864235779, + 21888242871839275222246405745257275088548364400416034343698203624528999354989, + 21888242871839275222246405745257275088548364400416034343698204153416824685533, + 183332551941182, + 21888242871839275222246405745257275088548364400416034343698204077428891887954, + 101723215714086, + 21888242871839275222246405745257275088548364400416034343698203903460965404186, + 133299777104621, + 21888242871839275222246405745257275088548364400416034343698203827679418403560, + 21888242871839275222246405745257275088548364400416034343698204147883571865984, + 350576622306794, + 547677399872170, + 465602124802862, + 468603400325829, + 21888242871839275222246405745257275088548364400416034343698204157825733447770, + 403084552735576, + 218146812147230, + 21694321589691, + 132221278978253, + 21888242871839275222246405745257275088548364400416034343698203632335891243162, + 542032574190805, + 21888242871839275222246405745257275088548364400416034343698203750582078996247, + 21888242871839275222246405745257275088548364400416034343698204084641688700701, + 21888242871839275222246405745257275088548364400416034343698203657040716951961, + 21888242871839275222246405745257275088548364400416034343698203719710885301702, + 21888242871839275222246405745257275088548364400416034343698204082374338132912, + 56794557426355, + 327264287856542, + 21888242871839275222246405745257275088548364400416034343698203797240822013248, + 21888242871839275222246405745257275088548364400416034343698203691922798292371, + 9586976499863, + 21888242871839275222246405745257275088548364400416034343698204034482445600593, + 12719364964644, + 21888242871839275222246405745257275088548364400416034343698204102190308837872, + 21888242871839275222246405745257275088548364400416034343698203800484586560018, + 36775719557794, + 478357771794111, + 116781223419922, + 21888242871839275222246405745257275088548364400416034343698204141164071818985, + 21888242871839275222246405745257275088548364400416034343698203731230058142947, + 524027201773812, + 236704150472883, + 21888242871839275222246405745257275088548364400416034343698203691045763766169, + 312784883121814, + 21888242871839275222246405745257275088548364400416034343698203943599767128499, + 21888242871839275222246405745257275088548364400416034343698203792088423599245, + 21888242871839275222246405745257275088548364400416034343698204147556440910050, + 312048029432184, + 7774332793308, + 338884516564442, + 21888242871839275222246405745257275088548364400416034343698204124101538903697, + 21888242871839275222246405745257275088548364400416034343698204159132502113781, + 459706370068616, + 194212023643032, + 21888242871839275222246405745257275088548364400416034343698204044815066125198, + 200885758597484, + 104127984546005, + 21888242871839275222246405745257275088548364400416034343698204143860917549043, + 344456035559923, + 21888242871839275222246405745257275088548364400416034343698203891170960359735, + 21888242871839275222246405745257275088548364400416034343698203839679948766430, + 21888242871839275222246405745257275088548364400416034343698203907147052598935, + 21888242871839275222246405745257275088548364400416034343698203799495252613802, + 21888242871839275222246405745257275088548364400416034343698204144088345378468, + 21888242871839275222246405745257275088548364400416034343698204154604380133170, + 21888242871839275222246405745257275088548364400416034343698203781444394504984, + 216634827185400, + 21888242871839275222246405745257275088548364400416034343698203839047064273551, + 159556452108282, + 85016107032526, + 151145401898792, + 21888242871839275222246405745257275088548364400416034343698203717220132828251, + 90863651458874, + 21888242871839275222246405745257275088548364400416034343698203708148857276255, + 21888242871839275222246405745257275088548364400416034343698204144477960645669, + 21888242871839275222246405745257275088548364400416034343698204087261589722307, + 293179075875598, + 21888242871839275222246405745257275088548364400416034343698203894318469442567, + 121717683945632, + 21888242871839275222246405745257275088548364400416034343698203677643482643501, + 250521551678965, + 21888242871839275222246405745257275088548364400416034343698203682633668948901, + 413369606546118, + 326451295464209, + 21888242871839275222246405745257275088548364400416034343698203697119958216795, + 21888242871839275222246405745257275088548364400416034343698203895714916187244, + 21888242871839275222246405745257275088548364400416034343698203904265314320439, + 21888242871839275222246405745257275088548364400416034343698203874093383502134, + 464438489163418, + 348733178205223, + 21888242871839275222246405745257275088548364400416034343698204034795916756232, + 356831116691037, + 21888242871839275222246405745257275088548364400416034343698203953499347516491, + 545890091512014, + 21888242871839275222246405745257275088548364400416034343698203679486708497146, + 188092671286634, + 32247967494749, + 339481863054115, + 21888242871839275222246405745257275088548364400416034343698203714725075136695, + 92220978687086, + 512661190922462, + 21888242871839275222246405745257275088548364400416034343698203917554638760208, + 21888242871839275222246405745257275088548364400416034343698204142998903486891, + 202625360875929, + 464373211101975, + 408825949127309, + 21888242871839275222246405745257275088548364400416034343698203696303890437906, + 438419806363279, + 63310436631129, + 21888242871839275222246405745257275088548364400416034343698204000449365869609, + 36466643954206, + 248719673877705, + 21888242871839275222246405745257275088548364400416034343698204113157233957059, + 550975506893182, + 553557861234975, + 21888242871839275222246405745257275088548364400416034343698203789629376699560, + 21888242871839275222246405745257275088548364400416034343698204025746056213610, + 21888242871839275222246405745257275088548364400416034343698204120603572520439, + 261728538779507, + 46343037515505, + 282516629502964, + 21888242871839275222246405745257275088548364400416034343698203834582615858128, + 457700558407330, + 222606135667884, + 409095730244550, + 277528500929013, + 21888242871839275222246405745257275088548364400416034343698204037252786229665, + 21888242871839275222246405745257275088548364400416034343698204043006939219817, + 21888242871839275222246405745257275088548364400416034343698203745938563862442, + 21888242871839275222246405745257275088548364400416034343698204128806685425694, + 189870155438209, + 21888242871839275222246405745257275088548364400416034343698203839033708090055, + 299737863186984, + 21888242871839275222246405745257275088548364400416034343698203874814063014210, + 445547471215360, + 21888242871839275222246405745257275088548364400416034343698203690738020494741, + 21888242871839275222246405745257275088548364400416034343698203813352141735858, + 21888242871839275222246405745257275088548364400416034343698203695245142796766, + 250613678189159, + 21888242871839275222246405745257275088548364400416034343698203942596297353407, + 53359881422039, + 245141673233712, + 21888242871839275222246405745257275088548364400416034343698203748660166508626, + 269709940835894, + 21888242871839275222246405745257275088548364400416034343698203862935063204228, + 110283898193663, + 21888242871839275222246405745257275088548364400416034343698204104941800982176, + 21888242871839275222246405745257275088548364400416034343698203647365456173776, + 21888242871839275222246405745257275088548364400416034343698204034132806973975, + 301433039679529, + 21888242871839275222246405745257275088548364400416034343698203948599809277003, + 21888242871839275222246405745257275088548364400416034343698203701346722357642, + 125321796204763, + 525370910471680, + 21888242871839275222246405745257275088548364400416034343698203697380310455502, + 76919529544274, + 513675402002603, + 21888242871839275222246405745257275088548364400416034343698203918562294442329, + 101198759719239, + 241328381234981, + 345239375756420, + 21888242871839275222246405745257275088548364400416034343698204121868067796880, + 144368108203726, + 310790916574451, + 21888242871839275222246405745257275088548364400416034343698203990373277557315, + 135576497554594, + 217669027991025, + 379375373147697, + 498587846543454, + 21888242871839275222246405745257275088548364400416034343698204172390812801471, + 20689505735704, + 352069108518778, + 21888242871839275222246405745257275088548364400416034343698203837485885708831, + 324980619735711, + 254218824128739, + 21888242871839275222246405745257275088548364400416034343698204141723479544461, + 21888242871839275222246405745257275088548364400416034343698203994950952904741, + 432002464488847, + 561962262749615, + 21888242871839275222246405745257275088548364400416034343698203654226945153922, + 21888242871839275222246405745257275088548364400416034343698203754971132757547, + 501183292686580, + 392905967835362, + 511654261253379, + 21888242871839275222246405745257275088548364400416034343698203650390418389602, + 33669853073187, + 204444933540183, + 21888242871839275222246405745257275088548364400416034343698203871138959425032, + 302911966956771, + 21888242871839275222246405745257275088548364400416034343698204026439892310352, + 21888242871839275222246405745257275088548364400416034343698204166421737079329, + 21888242871839275222246405745257275088548364400416034343698204088706428565542, + 21888242871839275222246405745257275088548364400416034343698203940164162474229, + 21888242871839275222246405745257275088548364400416034343698204165271510709787, + 453045465608917, + 21888242871839275222246405745257275088548364400416034343698204075986006356231, + 21888242871839275222246405745257275088548364400416034343698203688852049691875, + 504207921573085, + 21888242871839275222246405745257275088548364400416034343698203757733638964972, + 21888242871839275222246405745257275088548364400416034343698203973330584162967, + 21888242871839275222246405745257275088548364400416034343698203846382240737466, + 179168401029980, + 268937224181738, + 21888242871839275222246405745257275088548364400416034343698204067752863699715, + 21333388646376, + 21888242871839275222246405745257275088548364400416034343698203931705557904084, + 92423902407308, + 21888242871839275222246405745257275088548364400416034343698203746288524995361, + 21888242871839275222246405745257275088548364400416034343698204114333548471309, + 144427547192030, + 21888242871839275222246405745257275088548364400416034343698203696843540649728, + 556622367344761, + 548197387224363, + 292378584140343, + 21888242871839275222246405745257275088548364400416034343698204010189201507719, + 116125114214056, + 375439618508013, + 130248045094947, + 343604952856129, + 214279647690522, + 21888242871839275222246405745257275088548364400416034343698203835984521999393, + 21888242871839275222246405745257275088548364400416034343698203818390263048480, + 244058982632383, + 21888242871839275222246405745257275088548364400416034343698203869950062744437, + 388562496320621, + 111527600990893, + 81529507292784, + 21888242871839275222246405745257275088548364400416034343698203764373709948244, + 394234058743087, + 21888242871839275222246405745257275088548364400416034343698203736254154196756, + 21888242871839275222246405745257275088548364400416034343698203663017433589143, + 548604976140343, + 507308857827937, + 21888242871839275222246405745257275088548364400416034343698203880060866564566, + 21888242871839275222246405745257275088548364400416034343698203927418957266512, + 108175246289695, + 21888242871839275222246405745257275088548364400416034343698203667879813915619, + 293902374313638, + 21888242871839275222246405745257275088548364400416034343698204018421008011843, + 57794810963247, + 355308374887595, + 21888242871839275222246405745257275088548364400416034343698204106066756280232, + 42889279105544, + 476619639541841, + 301534825285023, + 21888242871839275222246405745257275088548364400416034343698203732495555791599, + 361370921529554, + 77925818656743, + 21888242871839275222246405745257275088548364400416034343698204087964842006686, + 21888242871839275222246405745257275088548364400416034343698203964745468907406, + 21888242871839275222246405745257275088548364400416034343698203660185875207388, + 21888242871839275222246405745257275088548364400416034343698204176061758459008, + 476063631921148, + 50740752026137, + 21888242871839275222246405745257275088548364400416034343698204104991088142101, + 309047526888715, + 54273868760458, + 21888242871839275222246405745257275088548364400416034343698203698569231155897, + 21888242871839275222246405745257275088548364400416034343698204016279292132824, + 21888242871839275222246405745257275088548364400416034343698203888683062664427, + 21888242871839275222246405745257275088548364400416034343698204133765877645667, + 21888242871839275222246405745257275088548364400416034343698203683426710498649, + 21888242871839275222246405745257275088548364400416034343698203999746918025086, + 21888242871839275222246405745257275088548364400416034343698204010142907365130, + 21888242871839275222246405745257275088548364400416034343698203765919443503516, + 125956849337633, + 21888242871839275222246405745257275088548364400416034343698204129183253499097, + 21888242871839275222246405745257275088548364400416034343698203741905764842758, + 21888242871839275222246405745257275088548364400416034343698203887788624662821, + 240024687451574, + 21888242871839275222246405745257275088548364400416034343698204029717824088999, + 155174824922277, + 21888242871839275222246405745257275088548364400416034343698203731321727849870, + 21888242871839275222246405745257275088548364400416034343698204020255292086187, + 367392544869057, + 347907327556054, + 21888242871839275222246405745257275088548364400416034343698203632362453365682, + 21888242871839275222246405745257275088548364400416034343698203810344667683332, + 21888242871839275222246405745257275088548364400416034343698203666903808026787, + 21888242871839275222246405745257275088548364400416034343698203812170193090638, + 21888242871839275222246405745257275088548364400416034343698203837610840032717, + 21888242871839275222246405745257275088548364400416034343698203758332279019508, + 502374530487708, + 255842800235356, + 260353863273530, + 292645669550169, + 21888242871839275222246405745257275088548364400416034343698203744952075236189, + 168516733475994, + 111465101010292, + 21888242871839275222246405745257275088548364400416034343698203953914455645627, + 21888242871839275222246405745257275088548364400416034343698203763821635995978, + 21888242871839275222246405745257275088548364400416034343698203813987880569030, + 81234514142371, + 21888242871839275222246405745257275088548364400416034343698203934977223359380, + 97809536420621, + 21888242871839275222246405745257275088548364400416034343698203862867323373133, + 60539991244782, + 180978593709660, + 343700900393184, + 4669792585742, + 21888242871839275222246405745257275088548364400416034343698203839272056598789, + 21888242871839275222246405745257275088548364400416034343698203738078092233654, + 21888242871839275222246405745257275088548364400416034343698204134031211902904, + 76044392657243, + 21888242871839275222246405745257275088548364400416034343698203785725440975347, + 340968867208755, + 21888242871839275222246405745257275088548364400416034343698203833852129199227, + 21888242871839275222246405745257275088548364400416034343698203714578513032733, + 21888242871839275222246405745257275088548364400416034343698203940254673735674, + 21888242871839275222246405745257275088548364400416034343698203645504095161608, + 477363579162684, + 21888242871839275222246405745257275088548364400416034343698203800991926609786, + 21888242871839275222246405745257275088548364400416034343698204063939760955060, + 21888242871839275222246405745257275088548364400416034343698203813322307883959, + 256399751946281, + 21888242871839275222246405745257275088548364400416034343698203670282197192085, + 318541192118527, + 21888242871839275222246405745257275088548364400416034343698203928661621487807, + 21888242871839275222246405745257275088548364400416034343698203724336857595042, + 21888242871839275222246405745257275088548364400416034343698203977826523710866, + 21888242871839275222246405745257275088548364400416034343698203827717123268973, + 21888242871839275222246405745257275088548364400416034343698203846446073991200, + 129559457489100, + 237567152778903, + 21888242871839275222246405745257275088548364400416034343698204123284209116240, + 528502540676812, + 438315714279160, + 294148683725099, + 126523290656865, + 21888242871839275222246405745257275088548364400416034343698203952736022362352, + 21888242871839275222246405745257275088548364400416034343698203897339948509489, + 21888242871839275222246405745257275088548364400416034343698204109910975969451, + 409720148541240, + 21888242871839275222246405745257275088548364400416034343698203715774324497258, + 507521322701505, + 21888242871839275222246405745257275088548364400416034343698203657731405308503, + 153537568241985, + 21888242871839275222246405745257275088548364400416034343698203866985650084572, + 21888242871839275222246405745257275088548364400416034343698203686815443313388, + 232477059638103, + 21888242871839275222246405745257275088548364400416034343698204047115823703543, + 21888242871839275222246405745257275088548364400416034343698204059279116937080, + 21888242871839275222246405745257275088548364400416034343698203948912802297521, + 529172426910918, + 84360098689544, + 39177232448906, + 494113159342928, + 21888242871839275222246405745257275088548364400416034343698203871401112685145, + 21888242871839275222246405745257275088548364400416034343698203641192677158690, + 442350032182444, + 201575867280454, + 21888242871839275222246405745257275088548364400416034343698203989779673656689, + 21888242871839275222246405745257275088548364400416034343698203646292255808910, + 21888242871839275222246405745257275088548364400416034343698203853057294525381, + 268460945423233, + 21888242871839275222246405745257275088548364400416034343698203798569903517857, + 21888242871839275222246405745257275088548364400416034343698203693560295470947, + 21888242871839275222246405745257275088548364400416034343698204098788736260163, + 21888242871839275222246405745257275088548364400416034343698203843025845943634, + 279015562054031, + 21888242871839275222246405745257275088548364400416034343698204122490936350534, + 21888242871839275222246405745257275088548364400416034343698204035102167982722, + 356765518267044, + 21888242871839275222246405745257275088548364400416034343698203681234172360975, + 21888242871839275222246405745257275088548364400416034343698204133163168456345, + 21888242871839275222246405745257275088548364400416034343698203959717223995527, + 511229047947716, + 185909801744699, + 431597922141999, + 21888242871839275222246405745257275088548364400416034343698204040781129535855, + 21888242871839275222246405745257275088548364400416034343698203775510936965848, + 21888242871839275222246405745257275088548364400416034343698204029353946379269, + 123030320652835, + 21888242871839275222246405745257275088548364400416034343698203726544777653908, + 21888242871839275222246405745257275088548364400416034343698203668920934749964, + 59013404259157, + 87033222156149, + 104997199657518, + 21888242871839275222246405745257275088548364400416034343698203938772871833266, + 546996459858623, + 21888242871839275222246405745257275088548364400416034343698203645033701633883, + 191468028533163, + 16707295826195, + 21888242871839275222246405745257275088548364400416034343698203723191202145211, + 21888242871839275222246405745257275088548364400416034343698203918931247624244, + 21888242871839275222246405745257275088548364400416034343698204175354592978780, + 296382048233078, + 432125437292849, + 35513948487909, + 374207822468450, + 524150787899529, + 342851259893884, + 21888242871839275222246405745257275088548364400416034343698203646605747262781, + 439378583019787, + 21888242871839275222246405745257275088548364400416034343698203847283863245780, + 114417663187198, + 105587680173665, + 52302020628585, + 49914014846965, + 21888242871839275222246405745257275088548364400416034343698203656665009022114, + 317368481960467, + 123653907459333, + 134462210570813, + 192783516733644, + 474970803883949, + 21888242871839275222246405745257275088548364400416034343698203770428667313374, + 58606516783562, + 517719474222991, + 21888242871839275222246405745257275088548364400416034343698203712410099765058, + 27553087014979, + 428079487308273, + 21888242871839275222246405745257275088548364400416034343698204078366981289083, + 21888242871839275222246405745257275088548364400416034343698204073351822122911, + 164199289316395, + 21888242871839275222246405745257275088548364400416034343698203896112305807419, + 122419514054914, + 21888242871839275222246405745257275088548364400416034343698204112974426817818, + 21888242871839275222246405745257275088548364400416034343698203672468608579067, + 21888242871839275222246405745257275088548364400416034343698203965226814970900, + 21888242871839275222246405745257275088548364400416034343698203731132725938922, + 8469218307452, + 176126746048426, + 131225585433119, + 21888242871839275222246405745257275088548364400416034343698204095047496385654, + 21888242871839275222246405745257275088548364400416034343698203711380129663214, + 21888242871839275222246405745257275088548364400416034343698203819623016987861, + 367294509093504, + 21888242871839275222246405745257275088548364400416034343698203627462225756784, + 21888242871839275222246405745257275088548364400416034343698203804142618774422, + 21888242871839275222246405745257275088548364400416034343698203858775678588893, + 451665071346058, + 21888242871839275222246405745257275088548364400416034343698204007096784272586, + 106724763418075, + 21888242871839275222246405745257275088548364400416034343698204141575664613829, + 234633224782424, + 255505808563924, + 21888242871839275222246405745257275088548364400416034343698204057855790824379, + 187525192599233, + 87748148779499, + 385883717033595, + 211112948036352, + 421294092627661, + 21888242871839275222246405745257275088548364400416034343698204078988984601362, + 21888242871839275222246405745257275088548364400416034343698204105698834210863, + 21888242871839275222246405745257275088548364400416034343698204184213850721431, + 21888242871839275222246405745257275088548364400416034343698203796475644725967, + 206520348990185, + 21888242871839275222246405745257275088548364400416034343698203902485078776020, + 239992930773914, + 21888242871839275222246405745257275088548364400416034343698203754228423258624, + 21888242871839275222246405745257275088548364400416034343698204185147658189920, + 113950327417623, + 69772615854596, + 464775013915489, + 24166805623299, + 483035126974165, + 21888242871839275222246405745257275088548364400416034343698203844200064471271, + 263126511809538, + 144625080399625, + 2174122849561, + 47582776722348, + 517503606598845, + 161709382199527, + 21888242871839275222246405745257275088548364400416034343698204010773049371562, + 21888242871839275222246405745257275088548364400416034343698203897759163437672, + 21888242871839275222246405745257275088548364400416034343698204035940885315615, + 181242952397883, + 155578545284523, + 232621585768435, + 488083081531442, + 252823796172332, + 21888242871839275222246405745257275088548364400416034343698203882238078858405, + 21888242871839275222246405745257275088548364400416034343698204085834046462839, + 21888242871839275222246405745257275088548364400416034343698204050269408165028, + 21888242871839275222246405745257275088548364400416034343698203967039090293440, + 37043633271784, + 21888242871839275222246405745257275088548364400416034343698204140099777284069, + 21888242871839275222246405745257275088548364400416034343698203706802334172786, + 223606831459654, + 229476811193335, + 21888242871839275222246405745257275088548364400416034343698203663349288343298, + 21888242871839275222246405745257275088548364400416034343698203988180406528842, + 472453964466936, + 21888242871839275222246405745257275088548364400416034343698203977766246880394, + 14648129909642, + 15060447154597, + 21888242871839275222246405745257275088548364400416034343698204117946680310338, + 244026264583807, + 21888242871839275222246405745257275088548364400416034343698203682084695363578, + 444949791730978, + 21888242871839275222246405745257275088548364400416034343698203987917260895013, + 21888242871839275222246405745257275088548364400416034343698203761836319082805, + 433263663808884, + 21888242871839275222246405745257275088548364400416034343698204063921793369949, + 21888242871839275222246405745257275088548364400416034343698203951990988776486, + 168233091328466, + 182018878478492, + 246473840331823, + 160710080838892, + 233358644848106, + 449803616051602, + 21888242871839275222246405745257275088548364400416034343698203840506457807603, + 21888242871839275222246405745257275088548364400416034343698203823786361797405, + 402314924464603, + 21888242871839275222246405745257275088548364400416034343698204036541241391190, + 135900955715367, + 232141621327103, + 21888242871839275222246405745257275088548364400416034343698203785199027664892, + 247106776515627, + 318728330714515, + 21888242871839275222246405745257275088548364400416034343698203736944246887655, + 21888242871839275222246405745257275088548364400416034343698203791536703779388, + 145057115491134, + 130151027430189, + 21888242871839275222246405745257275088548364400416034343698204082171505452317, + 396873130293160, + 21888242871839275222246405745257275088548364400416034343698203663405017390922, + 373755112102498, + 21888242871839275222246405745257275088548364400416034343698203733384505517413, + 506385556217257, + 6519275501958, + 21888242871839275222246405745257275088548364400416034343698203985081349299082, + 21888242871839275222246405745257275088548364400416034343698203965538800230558, + 21888242871839275222246405745257275088548364400416034343698203885702497360267, + 13887271021845, + 21888242871839275222246405745257275088548364400416034343698203717194827698361, + 45672164294144, + 216166608889244, + 21888242871839275222246405745257275088548364400416034343698204102220446561629, + 513051737567619, + 419134597388174, + 21888242871839275222246405745257275088548364400416034343698204074200530084401, + 133915486642952, + 535277480870780, + 21888242871839275222246405745257275088548364400416034343698203911099358058338, + 21888242871839275222246405745257275088548364400416034343698203883334139380457, + 21888242871839275222246405745257275088548364400416034343698203787598187808898, + 21888242871839275222246405745257275088548364400416034343698203664256433720240, + 21888242871839275222246405745257275088548364400416034343698203954581265269358, + 21888242871839275222246405745257275088548364400416034343698203881900847481002, + 21888242871839275222246405745257275088548364400416034343698203997534331498736, + 401857965068015, + 21888242871839275222246405745257275088548364400416034343698204048228268421859, + 21888242871839275222246405745257275088548364400416034343698204138068296330435, + 21888242871839275222246405745257275088548364400416034343698203926995072690235, + 21888242871839275222246405745257275088548364400416034343698203713501699352683, + 21888242871839275222246405745257275088548364400416034343698203795273991052143, + 21888242871839275222246405745257275088548364400416034343698204133138915144570, + 304933173176180, + 21888242871839275222246405745257275088548364400416034343698203647911701706302, + 21888242871839275222246405745257275088548364400416034343698203967676412678060, + 21888242871839275222246405745257275088548364400416034343698204076645749483576, + 21888242871839275222246405745257275088548364400416034343698203975519036695541, + 305822939411639, + 21888242871839275222246405745257275088548364400416034343698203700227461618595, + 258174589534213, + 155733055137563, + 21888242871839275222246405745257275088548364400416034343698204130140146174673, + 21888242871839275222246405745257275088548364400416034343698203914866768478791, + 21888242871839275222246405745257275088548364400416034343698204042032166234528, + 413770540498086, + 21888242871839275222246405745257275088548364400416034343698203837085254308163, + 21888242871839275222246405745257275088548364400416034343698203663422432495334, + 385291152600528, + 21888242871839275222246405745257275088548364400416034343698203659969611054519, + 21888242871839275222246405745257275088548364400416034343698203823940836369334, + 255751202125897, + 21888242871839275222246405745257275088548364400416034343698203711405804893861, + 256690261194349, + 21888242871839275222246405745257275088548364400416034343698203726439059362041, + 173101723541908, + 113354058988425, + 115747933373232, + 177823223452343, + 487816017908595, + 295714611051151, + 21888242871839275222246405745257275088548364400416034343698204069457175508272, + 350734389465433, + 21888242871839275222246405745257275088548364400416034343698204171829756518513, + 21888242871839275222246405745257275088548364400416034343698204150676405936659, + 359507503750573, + 292739207881604, + 427467930697823, + 21888242871839275222246405745257275088548364400416034343698204154076654348735, + 21888242871839275222246405745257275088548364400416034343698203825825941899458, + 21888242871839275222246405745257275088548364400416034343698204131145275525879, + 21888242871839275222246405745257275088548364400416034343698203641692304150407, + 133424361999171, + 376378926976664, + 465989343054917, + 20334564097618, + 18299537850959, + 21888242871839275222246405745257275088548364400416034343698203899040376612181, + 21888242871839275222246405745257275088548364400416034343698203856771312494132, + 21888242871839275222246405745257275088548364400416034343698203627480370943898, + 85163719595770, + 45706565674893, + 21888242871839275222246405745257275088548364400416034343698203896536840259885, + 530148497012826, + 21888242871839275222246405745257275088548364400416034343698203950675888801879, + 21888242871839275222246405745257275088548364400416034343698203850569785225040, + 21888242871839275222246405745257275088548364400416034343698204163225892927652, + 21888242871839275222246405745257275088548364400416034343698203925905058681786, + 232130406818527, + 36454636706248, + 83602786026411, + 345498012618349, + 21888242871839275222246405745257275088548364400416034343698203650432924359171, + 399927276655787, + 21888242871839275222246405745257275088548364400416034343698204062913689240997, + 21888242871839275222246405745257275088548364400416034343698203797213730578934, + 145972483319511, + 170764181632159, + 463195034289383, + 511063030122542, + 21888242871839275222246405745257275088548364400416034343698204165903347880629, + 21888242871839275222246405745257275088548364400416034343698203753755338304670, + 21888242871839275222246405745257275088548364400416034343698203904030895818773, + 5918456226945, + 426893919659262, + 21888242871839275222246405745257275088548364400416034343698203853718308225477, + 368102998985090, + 338258871469960, + 391706764061144, + 21888242871839275222246405745257275088548364400416034343698203644060936025609, + 21888242871839275222246405745257275088548364400416034343698203772871769795198, + 9552542978914, + 216741330317903, + 21888242871839275222246405745257275088548364400416034343698203818529116274230, + 426617905901358, + 21888242871839275222246405745257275088548364400416034343698203919905193461576, + 21888242871839275222246405745257275088548364400416034343698204005640924313131, + 399551221015479, + 21888242871839275222246405745257275088548364400416034343698203664749690301731, + 21888242871839275222246405745257275088548364400416034343698203727132841096719, + 199581218477682, + 35931628986285, + 21888242871839275222246405745257275088548364400416034343698203709508280799285, + 21888242871839275222246405745257275088548364400416034343698203881070223659871, + 556180130101397, + 21888242871839275222246405745257275088548364400416034343698203719293540656050, + 21888242871839275222246405745257275088548364400416034343698204160482676957980, + 21888242871839275222246405745257275088548364400416034343698203822773005868086, + 21888242871839275222246405745257275088548364400416034343698203910168009736981, + 21888242871839275222246405745257275088548364400416034343698204045436141770714, + 21888242871839275222246405745257275088548364400416034343698203965557776619503, + 417997610387704, + 31883715284589, + 371344235588667, + 341777429367552, + 21888242871839275222246405745257275088548364400416034343698203811127737066841, + 500849302382678, + 417982292484485, + 21888242871839275222246405745257275088548364400416034343698204057910114987903, + 343276833477135, + 21888242871839275222246405745257275088548364400416034343698203851556392369489, + 21888242871839275222246405745257275088548364400416034343698204022266419009088, + 21888242871839275222246405745257275088548364400416034343698204093201752270581, + 21888242871839275222246405745257275088548364400416034343698203757246938895496, + 21888242871839275222246405745257275088548364400416034343698203695501458776221, + 81799844467698, + 21888242871839275222246405745257275088548364400416034343698204023157809614681, + 21888242871839275222246405745257275088548364400416034343698203981539604379391, + 21888242871839275222246405745257275088548364400416034343698203634450818615264, + 386738011722942, + 409892812514703, + 501172326203463, + 21888242871839275222246405745257275088548364400416034343698204135101823573884, + 21888242871839275222246405745257275088548364400416034343698203849078461995365, + 360906723782545, + 276024838556551, + 21888242871839275222246405745257275088548364400416034343698203924634446423038, + 21888242871839275222246405745257275088548364400416034343698203817273129601694, + 21888242871839275222246405745257275088548364400416034343698204108318415563027, + 21888242871839275222246405745257275088548364400416034343698203765277539604743, + 21888242871839275222246405745257275088548364400416034343698204145712124329028, + 332399950776727, + 21888242871839275222246405745257275088548364400416034343698203673681542125727, + 21888242871839275222246405745257275088548364400416034343698204051383782589982, + 396638028774206, + 21888242871839275222246405745257275088548364400416034343698204141244768889021, + 8890749344110, + 18279353943769, + 405730744111082, + 21888242871839275222246405745257275088548364400416034343698203948589071148560, + 431370966119406, + 192500417734467, + 512310490073662, + 21888242871839275222246405745257275088548364400416034343698203795548878037436, + 550313407787198, + 444263931178435, + 21888242871839275222246405745257275088548364400416034343698203942498682656495, + 231867263894627, + 21888242871839275222246405745257275088548364400416034343698203643641244025644, + 21888242871839275222246405745257275088548364400416034343698203978143378513449, + 102545362773286, + 21888242871839275222246405745257275088548364400416034343698204072817105578915, + 553778140306164, + 314430696620436, + 194334991952750, + 155791443937245, + 21888242871839275222246405745257275088548364400416034343698203818812008569747, + 457895703961506, + 21888242871839275222246405745257275088548364400416034343698204053153312492842, + 21888242871839275222246405745257275088548364400416034343698203990805703268866, + 62209339271114, + 328505377497330, + 21888242871839275222246405745257275088548364400416034343698203915334639032330, + 240634958741267, + 479064271979263, + 288279317946387, + 21888242871839275222246405745257275088548364400416034343698204121065362096823, + 310681311507510, + 21888242871839275222246405745257275088548364400416034343698203862832065280991, + 21888242871839275222246405745257275088548364400416034343698203944740906263124, + 267686357120970, + 539045585634836, + 233941670986676, + 234711894920151, + 21888242871839275222246405745257275088548364400416034343698203717087073589266, + 21888242871839275222246405745257275088548364400416034343698203697954083245130, + 21888242871839275222246405745257275088548364400416034343698204147813136918403, + 21888242871839275222246405745257275088548364400416034343698203632948166353333, + 21888242871839275222246405745257275088548364400416034343698203708607450570311, + 123606877848916, + 499701461018560, + 462022780034082, + 346754832172078, + 21888242871839275222246405745257275088548364400416034343698204128374304265168, + 21888242871839275222246405745257275088548364400416034343698204116427188324340, + 109542698275239, + 21888242871839275222246405745257275088548364400416034343698203773046447393406, + 551196230591174, + 500583268274452, + 21888242871839275222246405745257275088548364400416034343698204174137802222163, + 21888242871839275222246405745257275088548364400416034343698203648026409573006, + 491679295912461, + 21888242871839275222246405745257275088548364400416034343698203721613459318179, + 21888242871839275222246405745257275088548364400416034343698203771054883890412, + 21888242871839275222246405745257275088548364400416034343698203649405626424340, + 21888242871839275222246405745257275088548364400416034343698203631401317369352, + 502402746689937, + 21888242871839275222246405745257275088548364400416034343698204047790217366470, + 446715255573450, + 452766941275265, + 21888242871839275222246405745257275088548364400416034343698204062176678104585, + 288244111740082, + 266747391792819, + 21888242871839275222246405745257275088548364400416034343698203660076416940288, + 21888242871839275222246405745257275088548364400416034343698203850644202754060, + 436801819487316, + 21888242871839275222246405745257275088548364400416034343698203629511184517253, + 459494598456282, + 21888242871839275222246405745257275088548364400416034343698203831454641057990, + 21888242871839275222246405745257275088548364400416034343698203861055945701311, + 21888242871839275222246405745257275088548364400416034343698203660807695301323, + 510329218028835, + 229578573602020, + 21888242871839275222246405745257275088548364400416034343698204183982773405317, + 503675632744863, + 21888242871839275222246405745257275088548364400416034343698204113359667688884, + 21888242871839275222246405745257275088548364400416034343698204136404394418404, + 407427030579832, + 503858321143150, + 336700686291006, + 21888242871839275222246405745257275088548364400416034343698204154599048525977, + 61941537781241, + 21888242871839275222246405745257275088548364400416034343698204048404616369842, + 21888242871839275222246405745257275088548364400416034343698203889880135079239, + 348462858165156, + 556306893135992, + 21888242871839275222246405745257275088548364400416034343698203976534254017060, + 336984978088401, + 21888242871839275222246405745257275088548364400416034343698203669363010606486, + 438039197893276, + 21888242871839275222246405745257275088548364400416034343698203988156548100185, + 21888242871839275222246405745257275088548364400416034343698203811312624239358, + 21888242871839275222246405745257275088548364400416034343698203884137944413346, + 18939511163493, + 55246367093610, + 309629093840812, + 458772730411908, + 551276173037307, + 219260525055057, + 21888242871839275222246405745257275088548364400416034343698204029873453711316, + 21888242871839275222246405745257275088548364400416034343698204124551832519555, + 21888242871839275222246405745257275088548364400416034343698203979462983249478, + 21888242871839275222246405745257275088548364400416034343698203996456195081426, + 21888242871839275222246405745257275088548364400416034343698203804288237537426, + 278088576913048, + 21888242871839275222246405745257275088548364400416034343698203976562250474890, + 21888242871839275222246405745257275088548364400416034343698204107080581925001, + 128063143517519, + 36334370281230, + 21888242871839275222246405745257275088548364400416034343698204089299459501270, + 213829154912922, + 21888242871839275222246405745257275088548364400416034343698203627889904453142, + 21888242871839275222246405745257275088548364400416034343698204094258154740081, + 10166851561612, + 263364177094729, + 21888242871839275222246405745257275088548364400416034343698204129726494852357, + 21888242871839275222246405745257275088548364400416034343698204058623767786463, + 21888242871839275222246405745257275088548364400416034343698203813540377445774, + 21888242871839275222246405745257275088548364400416034343698203993851045523021, + 21888242871839275222246405745257275088548364400416034343698204126401382017077, + 21888242871839275222246405745257275088548364400416034343698203638269835937186, + 285632613294887, + 21888242871839275222246405745257275088548364400416034343698204058987425807031, + 303602414631677, + 21888242871839275222246405745257275088548364400416034343698203801026686198698, + 21888242871839275222246405745257275088548364400416034343698204174841382523132, + 21888242871839275222246405745257275088548364400416034343698203625222572991966, + 21888242871839275222246405745257275088548364400416034343698204153551128147655, + 21888242871839275222246405745257275088548364400416034343698203819603799567782, + 214639247441939, + 21888242871839275222246405745257275088548364400416034343698203746261853386601, + 21888242871839275222246405745257275088548364400416034343698203808513777406047, + 21888242871839275222246405745257275088548364400416034343698204080007863392504, + 21888242871839275222246405745257275088548364400416034343698204119472679716676, + 21888242871839275222246405745257275088548364400416034343698203950998023844549, + 414067508348779, + 423330875940244, + 479945442650729, + 142029321425876, + 21888242871839275222246405745257275088548364400416034343698203808251006342254, + 21888242871839275222246405745257275088548364400416034343698203856937885460041, + 213513848770418, + 250500880572620, + 21888242871839275222246405745257275088548364400416034343698203852993553660784, + 493202801260236, + 21888242871839275222246405745257275088548364400416034343698204046392367451266, + 467018260710856, + 21888242871839275222246405745257275088548364400416034343698203950005957306939, + 21888242871839275222246405745257275088548364400416034343698203800018193037687, + 541036314193303, + 21888242871839275222246405745257275088548364400416034343698203706362903907857, + 21888242871839275222246405745257275088548364400416034343698203764495047801917, + 21888242871839275222246405745257275088548364400416034343698204172089388266547, + 21888242871839275222246405745257275088548364400416034343698203685595287487979, + 21888242871839275222246405745257275088548364400416034343698204102503395584956, + 21888242871839275222246405745257275088548364400416034343698203787290009402209, + 21888242871839275222246405745257275088548364400416034343698203790706692265112, + 21888242871839275222246405745257275088548364400416034343698203687997325096863, + 21888242871839275222246405745257275088548364400416034343698204150350285075003, + 170292309252269, + 21888242871839275222246405745257275088548364400416034343698203842535092412129, + 21888242871839275222246405745257275088548364400416034343698203901264186710122, + 21888242871839275222246405745257275088548364400416034343698203920577967399878, + 456735379711075, + 454400335925878, + 42377018323638, + 21888242871839275222246405745257275088548364400416034343698203818625492858986, + 21888242871839275222246405745257275088548364400416034343698203691295745110295, + 364443204567572, + 21888242871839275222246405745257275088548364400416034343698203974443613340813, + 448569842169487, + 21888242871839275222246405745257275088548364400416034343698203690881789842338, + 21888242871839275222246405745257275088548364400416034343698203918422757328601, + 21888242871839275222246405745257275088548364400416034343698203643603981582498, + 21888242871839275222246405745257275088548364400416034343698204173620013927142, + 291266255515134, + 477874538293881, + 163649799070412, + 21888242871839275222246405745257275088548364400416034343698203686577907465213, + 41053757961201, + 163460505780382, + 535832538235951, + 374466104791973, + 21888242871839275222246405745257275088548364400416034343698203821517189144354, + 257493645247758, + 412515151934449, + 21888242871839275222246405745257275088548364400416034343698203860745656856450, + 24168226889063, + 507503977564572, + 523311620145609, + 270799383881374, + 21888242871839275222246405745257275088548364400416034343698204178070996441160, + 345667391302837, + 21888242871839275222246405745257275088548364400416034343698204184197553257108, + 465503746664080, + 186647800815131, + 361526210956404, + 21888242871839275222246405745257275088548364400416034343698203797348580836792, + 21888242871839275222246405745257275088548364400416034343698203856292550808359, + 21888242871839275222246405745257275088548364400416034343698203827061202603742, + 404652484262567, + 21888242871839275222246405745257275088548364400416034343698203867002729817618, + 515409463029176, + 21888242871839275222246405745257275088548364400416034343698203693686727300615, + 21888242871839275222246405745257275088548364400416034343698204056278221681530, + 74843737900411, + 21888242871839275222246405745257275088548364400416034343698203693475249696660, + 548834286666406, + 38251863667427, + 190865844782493, + 267271477959773, + 21888242871839275222246405745257275088548364400416034343698204013722242609690, + 205522256065014, + 21888242871839275222246405745257275088548364400416034343698203863004067004038, + 21888242871839275222246405745257275088548364400416034343698204012847503475100, + 271288009357963, + 479754034599694, + 248408706703239, + 21888242871839275222246405745257275088548364400416034343698203866522015276778, + 295686516497238, + 498952192375665, + 444412328977997, + 390990964601985, + 21888242871839275222246405745257275088548364400416034343698203788964205017141, + 298117607021673, + 21888242871839275222246405745257275088548364400416034343698203937756164954355, + 21888242871839275222246405745257275088548364400416034343698204177121946391389, + 21888242871839275222246405745257275088548364400416034343698204117391324302886, + 21888242871839275222246405745257275088548364400416034343698203707736193766189, + 21888242871839275222246405745257275088548364400416034343698203994540531224406, + 21888242871839275222246405745257275088548364400416034343698203848884099802718, + 174500107210347, + 21888242871839275222246405745257275088548364400416034343698204022810315941599, + 224038190506661, + 21888242871839275222246405745257275088548364400416034343698204066418729574808, + 21888242871839275222246405745257275088548364400416034343698203942520358256021, + 21888242871839275222246405745257275088548364400416034343698203721221216310145, + 21888242871839275222246405745257275088548364400416034343698204105333045593849, + 21888242871839275222246405745257275088548364400416034343698204139021114429458, + 21888242871839275222246405745257275088548364400416034343698203660162800055916, + 21888242871839275222246405745257275088548364400416034343698203841892013280144, + 21888242871839275222246405745257275088548364400416034343698203941309466370606, + 489214241560817, + 513708796842350, + 21888242871839275222246405745257275088548364400416034343698203924425827800903, + 21888242871839275222246405745257275088548364400416034343698204106613827120658, + 21888242871839275222246405745257275088548364400416034343698204071387705598126, + 21888242871839275222246405745257275088548364400416034343698204099471217841144, + 21888242871839275222246405745257275088548364400416034343698203749952833680711, + 180660945831750, + 21888242871839275222246405745257275088548364400416034343698203680524796747604, + 216303176111713, + 299937265202695, + 21888242871839275222246405745257275088548364400416034343698203715840666486335, + 228060684506970, + 21888242871839275222246405745257275088548364400416034343698203763883011513689, + 21888242871839275222246405745257275088548364400416034343698203927172349144761, + 21888242871839275222246405745257275088548364400416034343698204018488389180841, + 527086515903211, + 21888242871839275222246405745257275088548364400416034343698204054361314138701, + 521734636946508, + 20142055468656, + 20058724391272, + 159839831049188, + 21888242871839275222246405745257275088548364400416034343698203835554068735464, + 21888242871839275222246405745257275088548364400416034343698203750965792585097, + 21888242871839275222246405745257275088548364400416034343698204101319022269408, + 21888242871839275222246405745257275088548364400416034343698203689999411236665, + 198656670240497, + 366763135651194, + 21888242871839275222246405745257275088548364400416034343698203849803871947862, + 21888242871839275222246405745257275088548364400416034343698203685087927881002, + 21888242871839275222246405745257275088548364400416034343698204055222908430848, + 409169190927989, + 21888242871839275222246405745257275088548364400416034343698204082792470157604, + 160537619819862, + 21888242871839275222246405745257275088548364400416034343698203943025000198531, + 435060801262031, + 21888242871839275222246405745257275088548364400416034343698203969793113429680, + 21888242871839275222246405745257275088548364400416034343698203804899151428439, + 26843658066202, + 21888242871839275222246405745257275088548364400416034343698203824940758740579, + 21888242871839275222246405745257275088548364400416034343698204108861435911508, + 195757720189868, + 142133457235065, + 342529414521396, + 221687650645228, + 21888242871839275222246405745257275088548364400416034343698204094873580342030, + 424126056265296, + 21888242871839275222246405745257275088548364400416034343698203746691999317639, + 28543622276417, + 31536671053253, + 369438243136648, + 21888242871839275222246405745257275088548364400416034343698203791426395659764, + 21888242871839275222246405745257275088548364400416034343698203660850078116175, + 21888242871839275222246405745257275088548364400416034343698203899135945107562, + 21888242871839275222246405745257275088548364400416034343698203877604246985477, + 21888242871839275222246405745257275088548364400416034343698203669513021632460, + 465639851645602, + 21888242871839275222246405745257275088548364400416034343698203769940528214352, + 21888242871839275222246405745257275088548364400416034343698203902220233808360, + 21888242871839275222246405745257275088548364400416034343698203841742407631724, + 21888242871839275222246405745257275088548364400416034343698203645121686660078, + 21888242871839275222246405745257275088548364400416034343698203810184807423219, + 21888242871839275222246405745257275088548364400416034343698204155299294943553, + 21888242871839275222246405745257275088548364400416034343698203756888277995421, + 21888242871839275222246405745257275088548364400416034343698203985508573333105, + 283330382939392, + 21888242871839275222246405745257275088548364400416034343698204153943768401718, + 371244989131223, + 123918641609758, + 341844620839153, + 21888242871839275222246405745257275088548364400416034343698203930965303896278, + 441230326299703, + 293580552079570, + 400139877152061, + 560254452284372, + 358245845704662, + 21888242871839275222246405745257275088548364400416034343698203946154177466911, + 237354871619977, + 98656005548982, + 21888242871839275222246405745257275088548364400416034343698203988173751169458, + 21888242871839275222246405745257275088548364400416034343698203735396072257740, + 21888242871839275222246405745257275088548364400416034343698203968136318981332, + 21888242871839275222246405745257275088548364400416034343698203961347044868940, + 418356295831951, + 16631219394864, + 21888242871839275222246405745257275088548364400416034343698204078348326158034, + 210777701168686, + 301078101006412, + 74379043326354, + 21888242871839275222246405745257275088548364400416034343698204017380214623789, + 189371467820112, + 291849606816750, + 431206247872037, + 321585755490307, + 469427035648719, + 323710290565081, + 513255621777995, + 21888242871839275222246405745257275088548364400416034343698203777951439433576, + 214053952968587, + 269504124311451, + 529987299273739, + 21888242871839275222246405745257275088548364400416034343698204000109566346464, + 532218143828486, + 129113720676963, + 62340379814492, + 312063755858321, + 21888242871839275222246405745257275088548364400416034343698204149400978848585, + 21888242871839275222246405745257275088548364400416034343698203966354006400593, + 190867151901729, + 516307359907575, + 468817329581394, + 21888242871839275222246405745257275088548364400416034343698204101983658804764, + 21888242871839275222246405745257275088548364400416034343698204102395591719579, + 126136175410273, + 21888242871839275222246405745257275088548364400416034343698203760485089428266, + 21888242871839275222246405745257275088548364400416034343698204008634989171262, + 21888242871839275222246405745257275088548364400416034343698203625736754463941, + 21888242871839275222246405745257275088548364400416034343698203633163225064126, + 363155885756743, + 161316367760445, + 176970811230388, + 14056734953094, + 426776722080739, + 21888242871839275222246405745257275088548364400416034343698204087839917514898, + 445745683711579, + 21888242871839275222246405745257275088548364400416034343698203716121544047384, + 21888242871839275222246405745257275088548364400416034343698203784209578170857, + 261481897361889, + 21888242871839275222246405745257275088548364400416034343698203727755421768731, + 21888242871839275222246405745257275088548364400416034343698203903163468752747, + 549922074725329, + 21888242871839275222246405745257275088548364400416034343698203662888504769395, + 361697711798129, + 72594454803647, + 528493274029123, + 343178934170494, + 413240972083932, + 21888242871839275222246405745257275088548364400416034343698203857069317372927, + 152224523317, + 21888242871839275222246405745257275088548364400416034343698203970861723647813, + 21888242871839275222246405745257275088548364400416034343698203942881568155898, + 21888242871839275222246405745257275088548364400416034343698203710342452661638, + 53104019704565, + 21888242871839275222246405745257275088548364400416034343698204160103752580302, + 126493363727556, + 21888242871839275222246405745257275088548364400416034343698204140055702607674, + 21888242871839275222246405745257275088548364400416034343698204014995653824415, + 251999464246576, + 517386154262126, + 118103100303591, + 121792922197966, + 442266455623995, + 343472821754909, + 307685344714725, + 21888242871839275222246405745257275088548364400416034343698203708929399607910, + 21888242871839275222246405745257275088548364400416034343698203807218251686816, + 21888242871839275222246405745257275088548364400416034343698204038125835537965, + 21888242871839275222246405745257275088548364400416034343698203949350301804860, + 21888242871839275222246405745257275088548364400416034343698204050637721316936, + 79924342296940, + 21888242871839275222246405745257275088548364400416034343698203641923520345139, + 56822195272011, + 21888242871839275222246405745257275088548364400416034343698204185376322763783, + 364012856402445, + 21888242871839275222246405745257275088548364400416034343698203764859260600041, + 21888242871839275222246405745257275088548364400416034343698203687475518963131, + 21888242871839275222246405745257275088548364400416034343698204068376653253236, + 21888242871839275222246405745257275088548364400416034343698204112589927952010, + 21888242871839275222246405745257275088548364400416034343698203916221241489667, + 117937878536863, + 21888242871839275222246405745257275088548364400416034343698203729749638669470, + 501018004971922, + 77184137163749, + 21888242871839275222246405745257275088548364400416034343698203743967467641956, + 173424866111621, + 123638017877840, + 21888242871839275222246405745257275088548364400416034343698203856120396219092, + 615297832468, + 378469060101624, + 21888242871839275222246405745257275088548364400416034343698203936332982354220, + 77330753488086, + 346024084266116, + 21888242871839275222246405745257275088548364400416034343698203926506198831636, + 387764916608548, + 292066625463069, + 21888242871839275222246405745257275088548364400416034343698203742831690074122, + 498835755599946, + 562740659153918, + 21888242871839275222246405745257275088548364400416034343698203669187779575227, + 534435945454236, + 21888242871839275222246405745257275088548364400416034343698203744798792399717, + 552777075046636, + 513837731934457, + 413696516404850, + 91245060933720, + 21888242871839275222246405745257275088548364400416034343698203734475751788001, + 21888242871839275222246405745257275088548364400416034343698203641401131717106, + 21888242871839275222246405745257275088548364400416034343698203800412545335991, + 298345058531222, + 21888242871839275222246405745257275088548364400416034343698203791568817700131, + 323666542781172, + 21888242871839275222246405745257275088548364400416034343698203967829658514878, + 344033671325596, + 17955949472457, + 21888242871839275222246405745257275088548364400416034343698204013506007754814, + 21888242871839275222246405745257275088548364400416034343698203904249964716079, + 21888242871839275222246405745257275088548364400416034343698203679204010009923, + 64848871639628, + 21888242871839275222246405745257275088548364400416034343698204047548672229680, + 21888242871839275222246405745257275088548364400416034343698203736607444621431, + 159185077831157, + 53581663927426, + 358858834303410, + 353859014624056, + 497928923979407, + 21888242871839275222246405745257275088548364400416034343698204103214536120807, + 21888242871839275222246405745257275088548364400416034343698204145292665343392, + 21888242871839275222246405745257275088548364400416034343698203881991177577545, + 21888242871839275222246405745257275088548364400416034343698204126688719921866, + 21888242871839275222246405745257275088548364400416034343698203690832924512996, + 120016384462110, + 100379539914319, + 21888242871839275222246405745257275088548364400416034343698204048548475164822, + 21888242871839275222246405745257275088548364400416034343698203907051975121295, + 238694900439921, + 399114641241967, + 314206218907890, + 21888242871839275222246405745257275088548364400416034343698203923911943961279, + 419541042695115, + 330112784859999, + 21888242871839275222246405745257275088548364400416034343698203900999126703218, + 159225211890196, + 338615753604770, + 21888242871839275222246405745257275088548364400416034343698203650728176786945, + 21888242871839275222246405745257275088548364400416034343698203746483036985225, + 422009874380894, + 32648008504178, + 21888242871839275222246405745257275088548364400416034343698203957556384400506, + 21888242871839275222246405745257275088548364400416034343698203680605269417881, + 8424744323386, + 63962574505694, + 517657248250410, + 21888242871839275222246405745257275088548364400416034343698203801088589071307, + 21888242871839275222246405745257275088548364400416034343698204030167535439184, + 306874205197548, + 21888242871839275222246405745257275088548364400416034343698203836425025930202, + 167978100093003, + 193128156584063, + 33369022398210, + 21888242871839275222246405745257275088548364400416034343698203987002636673794, + 329911992421346, + 21888242871839275222246405745257275088548364400416034343698204155411337636137, + 100064443930625, + 112815392472974, + 21888242871839275222246405745257275088548364400416034343698204107020545400252, + 338007744587721, + 159275713679010, + 214539776462154, + 290384769419768, + 21888242871839275222246405745257275088548364400416034343698203628641138436846, + 360076966659515, + 21888242871839275222246405745257275088548364400416034343698203957941348070702, + 532088045037308, + 414732508283498, + 21888242871839275222246405745257275088548364400416034343698203714529929000323, + 268925539500797, + 21888242871839275222246405745257275088548364400416034343698203723311136363008, + 195966212760074, + 21888242871839275222246405745257275088548364400416034343698203882682953295223, + 21888242871839275222246405745257275088548364400416034343698203750512668565109, + 21888242871839275222246405745257275088548364400416034343698203771019252867703, + 21888242871839275222246405745257275088548364400416034343698203956263997475058, + 21888242871839275222246405745257275088548364400416034343698204084575490819183, + 263011765294178, + 470393063948939, + 21888242871839275222246405745257275088548364400416034343698203803591631396575, + 21888242871839275222246405745257275088548364400416034343698204084565759938034, + 221500977972947, + 21888242871839275222246405745257275088548364400416034343698203956695632859453, + 21888242871839275222246405745257275088548364400416034343698203658216556499435, + 433431444972058, + 338961771959373, + 442819432248341, + 32781957651312, + 21888242871839275222246405745257275088548364400416034343698204143569857335356, + 21888242871839275222246405745257275088548364400416034343698203843311725555643, + 230921163242736, + 428908136707516, + 370886513367846, + 15152835768532, + 21888242871839275222246405745257275088548364400416034343698203883977938922190, + 98679519591625, + 28748561491639, + 21888242871839275222246405745257275088548364400416034343698203928782902329581, + 320754070719463, + 21888242871839275222246405745257275088548364400416034343698203966907701139466, + 285366444933000, + 167754645340182, + 384826776557034, + 43588532488035, + 21888242871839275222246405745257275088548364400416034343698203668476235106214, + 345911801534715, + 190495717881762, + 21888242871839275222246405745257275088548364400416034343698203752846359033937, + 21888242871839275222246405745257275088548364400416034343698203716589163723570, + 21888242871839275222246405745257275088548364400416034343698203953145166385809, + 482035766005141, + 233108517280587, + 21888242871839275222246405745257275088548364400416034343698204051495179928504, + 36076149674957, + 284705567139527, + 342878336237885, + 21888242871839275222246405745257275088548364400416034343698204117774303771333, + 21888242871839275222246405745257275088548364400416034343698204158458914443679, + 21888242871839275222246405745257275088548364400416034343698204084579764294476, + 554640686388044, + 21888242871839275222246405745257275088548364400416034343698203922546374696562, + 241696213305190, + 275822610730527, + 537438985516437, + 21888242871839275222246405745257275088548364400416034343698204175593264195250, + 21888242871839275222246405745257275088548364400416034343698203808273329699256, + 76269361457342, + 381245809371082, + 21888242871839275222246405745257275088548364400416034343698204073814108535551, + 21888242871839275222246405745257275088548364400416034343698204039515287003016, + 21888242871839275222246405745257275088548364400416034343698203920427580155456, + 21888242871839275222246405745257275088548364400416034343698203851768786435336, + 21888242871839275222246405745257275088548364400416034343698204156247874250534, + 142494016482929, + 21888242871839275222246405745257275088548364400416034343698203722022767515155, + 516025147847201, + 21888242871839275222246405745257275088548364400416034343698203834402165288871, + 21888242871839275222246405745257275088548364400416034343698203949322182071919, + 341178792876826, + 21888242871839275222246405745257275088548364400416034343698203691519086522326, + 255294479173270, + 21888242871839275222246405745257275088548364400416034343698204113232030784681, + 21888242871839275222246405745257275088548364400416034343698203980191210133917, + 21888242871839275222246405745257275088548364400416034343698204035652734126761, + 58298500425556, + 539496520577125, + 21888242871839275222246405745257275088548364400416034343698204098630741634683, + 554622971957732, + 21888242871839275222246405745257275088548364400416034343698203932573607900733, + 21888242871839275222246405745257275088548364400416034343698203850482538864408, + 322193170358393, + 21888242871839275222246405745257275088548364400416034343698204172188949377319, + 89050051985802, + 21888242871839275222246405745257275088548364400416034343698204038041391227318, + 21888242871839275222246405745257275088548364400416034343698203951724848889817, + 259605991638502, + 401820893159772, + 201371510787422, + 191405560456439, + 21888242871839275222246405745257275088548364400416034343698204156313991652909, + 21888242871839275222246405745257275088548364400416034343698203989011125528798, + 21888242871839275222246405745257275088548364400416034343698204108059093712198, + 6058492504067, + 21888242871839275222246405745257275088548364400416034343698203840150510237941, + 308350083995933, + 21888242871839275222246405745257275088548364400416034343698203683526430700069, + 21888242871839275222246405745257275088548364400416034343698203858126729738863, + 52583478895671, + 21888242871839275222246405745257275088548364400416034343698203671676723670324, + 184745174486399, + 21888242871839275222246405745257275088548364400416034343698203885473841102238, + 364382884535010, + 375789493195966, + 21888242871839275222246405745257275088548364400416034343698203918642224703782, + 21888242871839275222246405745257275088548364400416034343698203704275533643514, + 21888242871839275222246405745257275088548364400416034343698203746257184722176, + 21888242871839275222246405745257275088548364400416034343698203827077540259180, + 21888242871839275222246405745257275088548364400416034343698204098764399590805, + 265897701930143, + 21888242871839275222246405745257275088548364400416034343698203974204510594751, + 554653908221093, + 44138270625864, + 21888242871839275222246405745257275088548364400416034343698203978478611800785, + 40875815149979, + 21888242871839275222246405745257275088548364400416034343698203735171178635192, + 559142375843453, + 303582059190747, + 98116721305434, + 18979826776611, + 456666824919232, + 140107242242057, + 21888242871839275222246405745257275088548364400416034343698203912842887816512, + 21888242871839275222246405745257275088548364400416034343698204048718419862318, + 21888242871839275222246405745257275088548364400416034343698203739764250499333, + 21888242871839275222246405745257275088548364400416034343698203923706379187705, + 21888242871839275222246405745257275088548364400416034343698203707586084766820, + 130160825537109, + 57104678958696, + 116919333739443, + 529376538325576, + 26163302275933, + 14710106379831, + 21888242871839275222246405745257275088548364400416034343698203938192997456958, + 21888242871839275222246405745257275088548364400416034343698204149289396184429, + 60795148182344, + 21888242871839275222246405745257275088548364400416034343698204009410587049364, + 378816919883030, + 500432919529038, + 294599741134503, + 21888242871839275222246405745257275088548364400416034343698203987603162054991, + 325635512693597, + 193010593101974, + 21888242871839275222246405745257275088548364400416034343698203875397751486628, + 21888242871839275222246405745257275088548364400416034343698203826560726306817, + 152458722552820, + 21888242871839275222246405745257275088548364400416034343698203707529913865102, + 227849160859989, + 21888242871839275222246405745257275088548364400416034343698203818214103755484, + 21888242871839275222246405745257275088548364400416034343698203962323993356542, + 55654317369057, + 278631329903162, + 21888242871839275222246405745257275088548364400416034343698204134432920228355, + 21888242871839275222246405745257275088548364400416034343698203763952657255740, + 508779281577883, + 424465667200002, + 392427793831661, + 269568487598151, + 21888242871839275222246405745257275088548364400416034343698203653173975826500, + 21888242871839275222246405745257275088548364400416034343698203648417389622083, + 294971455012545, + 21888242871839275222246405745257275088548364400416034343698204100707467329056, + 405932925876587, + 21888242871839275222246405745257275088548364400416034343698204030727972870497, + 21888242871839275222246405745257275088548364400416034343698203713752123110041, + 21888242871839275222246405745257275088548364400416034343698203884500312266982, + 256398432430938, + 21888242871839275222246405745257275088548364400416034343698203688439637277109, + 478830317031430, + 21888242871839275222246405745257275088548364400416034343698203902746352627858, + 21888242871839275222246405745257275088548364400416034343698203989161785063909, + 21888242871839275222246405745257275088548364400416034343698204016292072148117, + 239686974550826, + 21888242871839275222246405745257275088548364400416034343698203893670386516596, + 313247123826564, + 21888242871839275222246405745257275088548364400416034343698203634421304397651, + 83598544987868, + 21888242871839275222246405745257275088548364400416034343698203691586502351321, + 336195385323700, + 21888242871839275222246405745257275088548364400416034343698204182308256252087, + 89018263355444, + 151820877825286, + 21888242871839275222246405745257275088548364400416034343698203637411409319706, + 21888242871839275222246405745257275088548364400416034343698203728951607835789, + 213443751460367, + 21888242871839275222246405745257275088548364400416034343698203735720345487559, + 370147711816265, + 157352855392156, + 21888242871839275222246405745257275088548364400416034343698203764394697868321, + 87389893557396, + 21888242871839275222246405745257275088548364400416034343698204168054964701825, + 508874175144538, + 21888242871839275222246405745257275088548364400416034343698203697204469380219, + 350634652930315, + 21888242871839275222246405745257275088548364400416034343698203858247871287429, + 21888242871839275222246405745257275088548364400416034343698203660394774539992, + 21888242871839275222246405745257275088548364400416034343698204025041581737583, + 344475937168154, + 21888242871839275222246405745257275088548364400416034343698203671783978597952, + 449848675409837, + 21888242871839275222246405745257275088548364400416034343698203690003358420344, + 117071380069466, + 21888242871839275222246405745257275088548364400416034343698203967760402582490, + 165657356531288, + 122901452678115, + 21888242871839275222246405745257275088548364400416034343698203815394303916552, + 21888242871839275222246405745257275088548364400416034343698203729526477264509, + 21888242871839275222246405745257275088548364400416034343698204026584614977686, + 173148011096733, + 21888242871839275222246405745257275088548364400416034343698203846466394522643, + 556524563958928, + 21888242871839275222246405745257275088548364400416034343698204089947483364195, + 21888242871839275222246405745257275088548364400416034343698204168594687905165, + 282292326911690, + 485072324070586, + 21888242871839275222246405745257275088548364400416034343698204135471278470449, + 21888242871839275222246405745257275088548364400416034343698203808020860362345, + 496625490792863, + 21888242871839275222246405745257275088548364400416034343698203780056592294406, + 21888242871839275222246405745257275088548364400416034343698203863356503116413, + 21888242871839275222246405745257275088548364400416034343698204139398500183751, + 21888242871839275222246405745257275088548364400416034343698203792815183343181, + 93529361553772, + 21888242871839275222246405745257275088548364400416034343698203791706984979144, + 21888242871839275222246405745257275088548364400416034343698203697789088542751, + 21888242871839275222246405745257275088548364400416034343698204071368750783144, + 21888242871839275222246405745257275088548364400416034343698204010217618259501, + 37429222124566, + 278186104189441, + 21888242871839275222246405745257275088548364400416034343698203800353941198221, + 18923497901825, + 52809049339252, + 370909248919702, + 515469368578667, + 288160082307532, + 21888242871839275222246405745257275088548364400416034343698203625398676267863, + 263575658217840, + 288873933738091, + 457836742227777, + 98372499021293, + 21888242871839275222246405745257275088548364400416034343698203775907674127845, + 196694525952446, + 21888242871839275222246405745257275088548364400416034343698203723536338618703, + 21888242871839275222246405745257275088548364400416034343698204107558568302510, + 24935029938423, + 21888242871839275222246405745257275088548364400416034343698203872054565168368, + 21888242871839275222246405745257275088548364400416034343698204062060083752703, + 21888242871839275222246405745257275088548364400416034343698204003619023039117, + 34999682206839, + 486654045208914, + 318348011138865, + 21888242871839275222246405745257275088548364400416034343698203925335076649378, + 350414240104025, + 340596030010157, + 21888242871839275222246405745257275088548364400416034343698203947474889818589, + 52810142284439, + 21888242871839275222246405745257275088548364400416034343698203957630846974758, + 21888242871839275222246405745257275088548364400416034343698203872907321888671, + 130519534142957, + 393682489941213, + 39579380255044, + 255464537735734, + 21888242871839275222246405745257275088548364400416034343698204130040624432060, + 21888242871839275222246405745257275088548364400416034343698203975139608084538, + 21888242871839275222246405745257275088548364400416034343698204184174037350222, + 21888242871839275222246405745257275088548364400416034343698203639122377151395, + 111617605424336, + 306770849795766, + 497107818388906, + 21888242871839275222246405745257275088548364400416034343698204015426948071733, + 21888242871839275222246405745257275088548364400416034343698204164980041091991, + 253249183133805, + 21888242871839275222246405745257275088548364400416034343698204170136973520889, + 21888242871839275222246405745257275088548364400416034343698203955304734677646, + 21888242871839275222246405745257275088548364400416034343698204108073171230089, + 21888242871839275222246405745257275088548364400416034343698203819298036650910, + 49969314704265, + 116831846071708, + 21888242871839275222246405745257275088548364400416034343698203999000342438208, + 9534070871928, + 67472402609371, + 21888242871839275222246405745257275088548364400416034343698203985092474661811, + 515841530637454, + 21888242871839275222246405745257275088548364400416034343698204119040746736441, + 21888242871839275222246405745257275088548364400416034343698204152022364531176, + 21888242871839275222246405745257275088548364400416034343698203854079352652237, + 450086150854837, + 253019636346378, + 21888242871839275222246405745257275088548364400416034343698203833389986483812, + 149766438637961, + 233743390641681, + 21888242871839275222246405745257275088548364400416034343698204066751627228671, + 492372492645101, + 21888242871839275222246405745257275088548364400416034343698203976751441730280, + 21888242871839275222246405745257275088548364400416034343698204155704241359762, + 181540047301466, + 21888242871839275222246405745257275088548364400416034343698203726904503855839, + 21888242871839275222246405745257275088548364400416034343698204163638784919429, + 21888242871839275222246405745257275088548364400416034343698204125711467638882, + 21888242871839275222246405745257275088548364400416034343698204150456632840036, + 21888242871839275222246405745257275088548364400416034343698203766417740167276, + 334353763388327, + 262120968122139, + 21888242871839275222246405745257275088548364400416034343698203756664442517624, + 329688170929683, + 469920908658741, + 21888242871839275222246405745257275088548364400416034343698203757696479422550, + 482589693011561, + 21888242871839275222246405745257275088548364400416034343698204009754767880971, + 21888242871839275222246405745257275088548364400416034343698204138061077760241, + 400453573315612, + 117228619848296, + 75721388630876, + 21888242871839275222246405745257275088548364400416034343698203799557856528197, + 208111264167264, + 21888242871839275222246405745257275088548364400416034343698204071954172094067, + 21888242871839275222246405745257275088548364400416034343698203914229227583719, + 281093752467244, + 394152531738833, + 21888242871839275222246405745257275088548364400416034343698203964843540091399, + 322948164986811, + 536020119294703, + 183295452728560, + 213001717955944, + 21888242871839275222246405745257275088548364400416034343698203657869184280123, + 505214602408226, + 21888242871839275222246405745257275088548364400416034343698204152732613844680, + 156222805594995, + 21888242871839275222246405745257275088548364400416034343698203951410793991936, + 131888416738902, + 21888242871839275222246405745257275088548364400416034343698203638181532349705, + 21888242871839275222246405745257275088548364400416034343698204073710545820242, + 21888242871839275222246405745257275088548364400416034343698203670296553150735, + 21888242871839275222246405745257275088548364400416034343698204103014187849108, + 21888242871839275222246405745257275088548364400416034343698203856422429082687, + 347139170379732, + 379145882650298, + 51512799973268, + 131094797688616, + 21888242871839275222246405745257275088548364400416034343698203687464839066624, + 51673172347460, + 147762019147922, + 429022363669393, + 21888242871839275222246405745257275088548364400416034343698203643058423368420, + 21888242871839275222246405745257275088548364400416034343698204130224255207146, + 532890262823952, + 555785411476538, + 207166165924810, + 21888242871839275222246405745257275088548364400416034343698203893645881273511, + 33782917298453, + 249229268745732, + 21888242871839275222246405745257275088548364400416034343698204002583903467808, + 227840431242274, + 21888242871839275222246405745257275088548364400416034343698203918012277067579, + 21888242871839275222246405745257275088548364400416034343698204063188640092118, + 57812218144638, + 21888242871839275222246405745257275088548364400416034343698204099606613880989, + 21888242871839275222246405745257275088548364400416034343698204132282101699037, + 21888242871839275222246405745257275088548364400416034343698203797760926065264, + 180164172393314, + 21888242871839275222246405745257275088548364400416034343698204056903231267453, + 508201304799156, + 21888242871839275222246405745257275088548364400416034343698203984137079287708, + 386376628328366, + 21888242871839275222246405745257275088548364400416034343698203758729465985777, + 21888242871839275222246405745257275088548364400416034343698203918756799966377, + 31893440179299, + 239150379320735, + 21888242871839275222246405745257275088548364400416034343698204055790941409651, + 306347424410404, + 21888242871839275222246405745257275088548364400416034343698203886914870370447, + 87509011804770, + 522119449793918, + 21888242871839275222246405745257275088548364400416034343698203795290385922223, + 385011975620604, + 130783363813070, + 21888242871839275222246405745257275088548364400416034343698203711880480950040, + 21888242871839275222246405745257275088548364400416034343698203943212510110469, + 277251611104759, + 91287636681046, + 21888242871839275222246405745257275088548364400416034343698203818428706651389, + 426139328367945, + 291789511630246, + 21888242871839275222246405745257275088548364400416034343698204101954726286438, + 21888242871839275222246405745257275088548364400416034343698204049946392871770, + 402272641016412, + 21888242871839275222246405745257275088548364400416034343698203805005425974883, + 21888242871839275222246405745257275088548364400416034343698204057686671390723, + 88845638971322, + 21888242871839275222246405745257275088548364400416034343698204154126562150173, + 21888242871839275222246405745257275088548364400416034343698203721146115670221, + 253762826949090, + 21888242871839275222246405745257275088548364400416034343698203831078135775462, + 24288852943824, + 264350003188019, + 31126502447388, + 238085283225621, + 21888242871839275222246405745257275088548364400416034343698204026958913623756, + 21888242871839275222246405745257275088548364400416034343698203879176162062066, + 21888242871839275222246405745257275088548364400416034343698203738531283227190, + 69072980296791, + 377761900318321, + 21888242871839275222246405745257275088548364400416034343698203894369277374185, + 209391248882873, + 21888242871839275222246405745257275088548364400416034343698203848175126840298, + 194299194716230, + 199484505842700, + 440129445237022, + 299832950654853, + 21888242871839275222246405745257275088548364400416034343698204179386143817220, + 21888242871839275222246405745257275088548364400416034343698204145074945880157, + 21888242871839275222246405745257275088548364400416034343698203901958047666816, + 21888242871839275222246405745257275088548364400416034343698203744665057882520, + 21888242871839275222246405745257275088548364400416034343698204113633614068763, + 21888242871839275222246405745257275088548364400416034343698204121593611173643, + 21888242871839275222246405745257275088548364400416034343698203875201803993783, + 250813184407116, + 268746449426744, + 21888242871839275222246405745257275088548364400416034343698204093360482219267, + 26715753324234, + 289359384195516, + 21888242871839275222246405745257275088548364400416034343698203787133635445699, + 21888242871839275222246405745257275088548364400416034343698203900968077838644, + 337800026193523, + 21888242871839275222246405745257275088548364400416034343698203956372818671529, + 156324292765846, + 21888242871839275222246405745257275088548364400416034343698203787543066468728, + 21888242871839275222246405745257275088548364400416034343698203824176205453325, + 21888242871839275222246405745257275088548364400416034343698203941752393678946, + 190797530462169, + 84657548103973, + 144049793110290, + 481128792436589, + 21888242871839275222246405745257275088548364400416034343698204148237043428549, + 21888242871839275222246405745257275088548364400416034343698203776554190198749, + 21888242871839275222246405745257275088548364400416034343698203709919488586055, + 21888242871839275222246405745257275088548364400416034343698203633432248954298, + 95987110423547, + 207492356425678, + 21888242871839275222246405745257275088548364400416034343698203832927333218062, + 329243556709261, + 21888242871839275222246405745257275088548364400416034343698203994324562699293, + 30509916997460, + 21888242871839275222246405745257275088548364400416034343698203855080716078624, + 144057241661138, + 275256261500561, + 257266979638153, + 158017482441882, + 265121441994935, + 131884955722595, + 328186366166382, + 21888242871839275222246405745257275088548364400416034343698204108242578141528, + 354426127206509, + 503787096875842, + 21888242871839275222246405745257275088548364400416034343698204038582290543748, + 21888242871839275222246405745257275088548364400416034343698204048181113450429, + 206101751550016, + 378450130574930, + 39789893219428, + 458484050042745, + 21888242871839275222246405745257275088548364400416034343698203741853750843703, + 21888242871839275222246405745257275088548364400416034343698204106020771677626, + 21888242871839275222246405745257275088548364400416034343698204067521647575478, + 21888242871839275222246405745257275088548364400416034343698204171067233401931, + 402203978583777, + 21888242871839275222246405745257275088548364400416034343698203748085296129554, + 21888242871839275222246405745257275088548364400416034343698203988105836501659, + 21888242871839275222246405745257275088548364400416034343698204014484183485838, + 276152444634215, + 21888242871839275222246405745257275088548364400416034343698203868673965795327, + 399307234962924, + 189847718071040, + 21888242871839275222246405745257275088548364400416034343698204116004446879015, + 21888242871839275222246405745257275088548364400416034343698204173079973674452, + 21888242871839275222246405745257275088548364400416034343698203682060629067955, + 21888242871839275222246405745257275088548364400416034343698203810126934222462, + 80891355271427, + 164031689202775, + 468013111435623, + 170013466548092, + 21888242871839275222246405745257275088548364400416034343698203972553349908240, + 21888242871839275222246405745257275088548364400416034343698203931480840058164, + 161605014762159, + 21888242871839275222246405745257275088548364400416034343698204072884028290462, + 253730180610270, + 342525237464015, + 21888242871839275222246405745257275088548364400416034343698203825076409536177, + 21888242871839275222246405745257275088548364400416034343698203753002216775985, + 253942993100165, + 21888242871839275222246405745257275088548364400416034343698203927750283262124, + 190975377394396, + 233021715157919, + 21888242871839275222246405745257275088548364400416034343698204163585432159912, + 224901492456991, + 110657179506581, + 552029067379182, + 291512589066386, + 21888242871839275222246405745257275088548364400416034343698203710237797647823, + 931974898044, + 21888242871839275222246405745257275088548364400416034343698204023529560097259, + 21888242871839275222246405745257275088548364400416034343698204126330065179539, + 21888242871839275222246405745257275088548364400416034343698204122859516441208, + 21888242871839275222246405745257275088548364400416034343698203855977607209469, + 21888242871839275222246405745257275088548364400416034343698204076292630990281, + 233503286559618, + 21888242871839275222246405745257275088548364400416034343698203861808853079924, + 492088740854009, + 142370718117664, + 21888242871839275222246405745257275088548364400416034343698204053375062026892, + 21888242871839275222246405745257275088548364400416034343698204090487437352884, + 21888242871839275222246405745257275088548364400416034343698203673358788014793, + 364941732127042, + 264190200380163, + 103925712711482, + 21888242871839275222246405745257275088548364400416034343698203843511646601778, + 174731664245280, + 388402131165367, + 276862926786736, + 21888242871839275222246405745257275088548364400416034343698203881357606362344, + 21888242871839275222246405745257275088548364400416034343698204185936286977223, + 21888242871839275222246405745257275088548364400416034343698204102623819285232, + 21888242871839275222246405745257275088548364400416034343698204159230740582565, + 433494147744817, + 21888242871839275222246405745257275088548364400416034343698203806063622862499, + 259528170356889, + 410348267161558, + 21888242871839275222246405745257275088548364400416034343698203760779678913803, + 21888242871839275222246405745257275088548364400416034343698203944383290160418, + 209803538884724, + 380910877586068, + 296254123432665, + 21888242871839275222246405745257275088548364400416034343698204056405953023628, + 21888242871839275222246405745257275088548364400416034343698203951494259917550, + 21888242871839275222246405745257275088548364400416034343698203725532747702022, + 21888242871839275222246405745257275088548364400416034343698203742240256349701, + 34748324026220, + 21888242871839275222246405745257275088548364400416034343698203812919236995926, + 21888242871839275222246405745257275088548364400416034343698203722590553026740, + 384418517236726, + 145439720855417, + 49085244042502, + 21888242871839275222246405745257275088548364400416034343698203951831068553211, + 21888242871839275222246405745257275088548364400416034343698203886145759351682, + 21888242871839275222246405745257275088548364400416034343698204090522598383510, + 307999171183671, + 239169246607286, + 21888242871839275222246405745257275088548364400416034343698204156939280325887, + 21888242871839275222246405745257275088548364400416034343698203789286689200938, + 140087203766646, + 239424999225625, + 418056410476953, + 21888242871839275222246405745257275088548364400416034343698203690520840385399, + 238516712699354, + 184824027338774, + 138528198264537, + 21888242871839275222246405745257275088548364400416034343698203868424851788750, + 481396033518623, + 518194622042808, + 434609372534917, + 21888242871839275222246405745257275088548364400416034343698203907879832483256, + 87162132851137, + 103680201184065, + 21888242871839275222246405745257275088548364400416034343698204158404891825558, + 77032604743452, + 21888242871839275222246405745257275088548364400416034343698203667269281768312, + 21888242871839275222246405745257275088548364400416034343698203746049240804892, + 21888242871839275222246405745257275088548364400416034343698204030122507712021, + 21888242871839275222246405745257275088548364400416034343698204005999911097597, + 115484694023906, + 21888242871839275222246405745257275088548364400416034343698204028397037954205, + 21888242871839275222246405745257275088548364400416034343698203671397986794209, + 21888242871839275222246405745257275088548364400416034343698204019556982368708, + 21888242871839275222246405745257275088548364400416034343698203624737638698691, + 370535834293929, + 197643130361798, + 26460500065294, + 21888242871839275222246405745257275088548364400416034343698203717253601417057, + 487433923407861, + 21888242871839275222246405745257275088548364400416034343698203986673880013219, + 21888242871839275222246405745257275088548364400416034343698203761468261297967, + 134551362180566, + 21888242871839275222246405745257275088548364400416034343698203687979085197988, + 547305706486133, + 228116375429535, + 481253406350392, + 366001737801709, + 79917686594927, + 21888242871839275222246405745257275088548364400416034343698203962805023393294, + 103972543340905, + 21888242871839275222246405745257275088548364400416034343698203826804848948849, + 21888242871839275222246405745257275088548364400416034343698204109198937827762, + 21888242871839275222246405745257275088548364400416034343698204050212280914038, + 21888242871839275222246405745257275088548364400416034343698204079423750581141, + 253535197687403, + 21888242871839275222246405745257275088548364400416034343698204045729767988659, + 21888242871839275222246405745257275088548364400416034343698203800810473252655, + 21888242871839275222246405745257275088548364400416034343698203770360342850563, + 21888242871839275222246405745257275088548364400416034343698204088895606175894, + 4230763260458, + 21888242871839275222246405745257275088548364400416034343698203932033226078436, + 21888242871839275222246405745257275088548364400416034343698203901296004138359, + 21888242871839275222246405745257275088548364400416034343698203972323316266333, + 21888242871839275222246405745257275088548364400416034343698204141326928070217, + 122879116306677, + 21888242871839275222246405745257275088548364400416034343698204157693054077804, + 21888242871839275222246405745257275088548364400416034343698203744529640829504, + 21888242871839275222246405745257275088548364400416034343698203648450445641013, + 258122722761448, + 493605224711260, + 495554613040564, + 21888242871839275222246405745257275088548364400416034343698203829469678222633, + 21888242871839275222246405745257275088548364400416034343698203721796113486786, + 21888242871839275222246405745257275088548364400416034343698204087139011072565, + 473580536558695, + 516966440798832, + 21888242871839275222246405745257275088548364400416034343698203959127624393124, + 405285520580088, + 383375534274173, + 21888242871839275222246405745257275088548364400416034343698203713882817503750, + 263971992709270, + 391640400578121, + 21888242871839275222246405745257275088548364400416034343698203772593279675035, + 195410058862418, + 348366957116930, + 30134706287306, + 21888242871839275222246405745257275088548364400416034343698204006825259116520, + 481528065674123, + 21227595634115, + 21888242871839275222246405745257275088548364400416034343698203951559062020232, + 526550052394621, + 21888242871839275222246405745257275088548364400416034343698203675909269352323, + 21888242871839275222246405745257275088548364400416034343698203671813135814082, + 21888242871839275222246405745257275088548364400416034343698204155919334784793, + 21888242871839275222246405745257275088548364400416034343698203836400499196438, + 21888242871839275222246405745257275088548364400416034343698204061669206963121, + 40264702415721, + 21888242871839275222246405745257275088548364400416034343698204149124030483919, + 21888242871839275222246405745257275088548364400416034343698204156113056757627, + 21888242871839275222246405745257275088548364400416034343698203672713758932338, + 21888242871839275222246405745257275088548364400416034343698204101139094133467, + 21888242871839275222246405745257275088548364400416034343698203917682126329673, + 469354621984660, + 21888242871839275222246405745257275088548364400416034343698203787606304192721, + 21888242871839275222246405745257275088548364400416034343698203964898048787154, + 21888242871839275222246405745257275088548364400416034343698203947309516743936, + 21888242871839275222246405745257275088548364400416034343698203880617961878719, + 137472076358548, + 248458989738192, + 21888242871839275222246405745257275088548364400416034343698203716685189747860, + 386850793584991, + 21888242871839275222246405745257275088548364400416034343698203802587652346363, + 466274136925068, + 546214265765128, + 547934197048988, + 21888242871839275222246405745257275088548364400416034343698204171427382052729, + 21888242871839275222246405745257275088548364400416034343698203628660159850753, + 472862802187216, + 424434404868774, + 21888242871839275222246405745257275088548364400416034343698203819165371259417, + 21888242871839275222246405745257275088548364400416034343698204027611656407777, + 21888242871839275222246405745257275088548364400416034343698204012046300147105, + 21888242871839275222246405745257275088548364400416034343698204127642999639933, + 248052024794570, + 21888242871839275222246405745257275088548364400416034343698203832369428315289, + 21888242871839275222246405745257275088548364400416034343698204023985601422787, + 21888242871839275222246405745257275088548364400416034343698203769550753306242, + 240523316782516, + 21888242871839275222246405745257275088548364400416034343698204084149157021710, + 21888242871839275222246405745257275088548364400416034343698204075169225253057, + 511725499614614, + 21888242871839275222246405745257275088548364400416034343698204079219826782515, + 21888242871839275222246405745257275088548364400416034343698204099184645574761, + 312077022155414, + 541245270059197, + 465962638793088, + 21888242871839275222246405745257275088548364400416034343698204083499908741690, + 239716938474791, + 21888242871839275222246405745257275088548364400416034343698204043286940608009, + 70286122422501, + 546384690694546, + 21888242871839275222246405745257275088548364400416034343698203840094069375564, + 222449882812109, + 463785551750203, + 556301101333558, + 21888242871839275222246405745257275088548364400416034343698203979879507982219, + 255614316847217, + 21888242871839275222246405745257275088548364400416034343698203917705929763516, + 21888242871839275222246405745257275088548364400416034343698204062162242165145, + 92267347426040, + 21888242871839275222246405745257275088548364400416034343698203799459721831044, + 527615918384473, + 21888242871839275222246405745257275088548364400416034343698204048670409023457, + 187626903512682, + 21888242871839275222246405745257275088548364400416034343698203636261388471409, + 21888242871839275222246405745257275088548364400416034343698204028510665005355, + 252859474898708, + 398870934782390, + 21888242871839275222246405745257275088548364400416034343698203818512747837765, + 21888242871839275222246405745257275088548364400416034343698203810605907548146, + 441501253408044, + 21888242871839275222246405745257275088548364400416034343698204126021682105692, + 21888242871839275222246405745257275088548364400416034343698203626393720553159, + 369382160989268, + 328971997078365, + 237043047394767, + 21888242871839275222246405745257275088548364400416034343698203701032796647299, + 437783099768321, + 211399888455259, + 21888242871839275222246405745257275088548364400416034343698203931567058734079, + 21888242871839275222246405745257275088548364400416034343698203729636419149093, + 356436236438897, + 35284648500597, + 21888242871839275222246405745257275088548364400416034343698204163961106432959, + 209178526355111, + 21888242871839275222246405745257275088548364400416034343698204120482847318130, + 469357036009853, + 21888242871839275222246405745257275088548364400416034343698203623895401948851, + 21888242871839275222246405745257275088548364400416034343698203678783439532444, + 21888242871839275222246405745257275088548364400416034343698204036563347292669, + 371636209057930, + 371211674465159, + 21888242871839275222246405745257275088548364400416034343698203912250014900681, + 376418936227501, + 24606846058674, + 21888242871839275222246405745257275088548364400416034343698204097994903049425, + 540513028571640, + 21888242871839275222246405745257275088548364400416034343698204010651741646149, + 21888242871839275222246405745257275088548364400416034343698203859471478229260, + 21888242871839275222246405745257275088548364400416034343698204051899044225286, + 438500245719532, + 562581814047026, + 21888242871839275222246405745257275088548364400416034343698203669174932660549, + 21888242871839275222246405745257275088548364400416034343698203862250875173206, + 21888242871839275222246405745257275088548364400416034343698204087458919200599, + 386702022412046, + 305705492636073, + 21888242871839275222246405745257275088548364400416034343698203940434029159655, + 415698525001983, + 21888242871839275222246405745257275088548364400416034343698204160850938245443, + 176411752227664, + 539811130085967, + 21888242871839275222246405745257275088548364400416034343698204056216719789019, + 83579023538798, + 536974384981421, + 21888242871839275222246405745257275088548364400416034343698204010832236975162, + 81151498482783, + 21888242871839275222246405745257275088548364400416034343698203907422650503162, + 149123202085726, + 21888242871839275222246405745257275088548364400416034343698203874041015079711, + 417940307500087, + 21888242871839275222246405745257275088548364400416034343698203652315863558799, + 89774950096714, + 21888242871839275222246405745257275088548364400416034343698203738324970693339, + 261022734549516, + 436156670439597, + 21888242871839275222246405745257275088548364400416034343698203724792252298698, + 21888242871839275222246405745257275088548364400416034343698203733540237338518, + 21888242871839275222246405745257275088548364400416034343698204095819768714163, + 21888242871839275222246405745257275088548364400416034343698203658028930463349, + 54827027435795, + 101763547645046, + 21888242871839275222246405745257275088548364400416034343698204168571958994378, + 243787010782846, + 21888242871839275222246405745257275088548364400416034343698204101852100410833, + 21888242871839275222246405745257275088548364400416034343698203946913552510069, + 21888242871839275222246405745257275088548364400416034343698203822634423698707, + 21888242871839275222246405745257275088548364400416034343698203820565708846014, + 342445032819141, + 21888242871839275222246405745257275088548364400416034343698204070836019533491, + 21888242871839275222246405745257275088548364400416034343698203719196102985514, + 21888242871839275222246405745257275088548364400416034343698203838589890424272, + 21888242871839275222246405745257275088548364400416034343698203947839343422547, + 21888242871839275222246405745257275088548364400416034343698203959807189137444, + 21888242871839275222246405745257275088548364400416034343698203918906076522346, + 21888242871839275222246405745257275088548364400416034343698203723749307009812, + 105205751367805, + 21888242871839275222246405745257275088548364400416034343698204093967999499511, + 21888242871839275222246405745257275088548364400416034343698203629742085308212, + 46194067864047, + 213164681990303, + 21888242871839275222246405745257275088548364400416034343698204099620757775493, + 451253795722911, + 322172399868746, + 303232145327347, + 21888242871839275222246405745257275088548364400416034343698203988737502679109, + 19854157463850, + 21888242871839275222246405745257275088548364400416034343698204127134160464506, + 50725144527558, + 386324168702632, + 2820068755979, + 425196260835766, + 21888242871839275222246405745257275088548364400416034343698204089568786556631, + 21888242871839275222246405745257275088548364400416034343698204087718618545036, + 213870514400178, + 15163610562833, + 110339856781190, + 202020212973891, + 21888242871839275222246405745257275088548364400416034343698204036722469330544, + 390487185670510, + 85803311522446, + 312876809086777, + 169514876096121, + 21888242871839275222246405745257275088548364400416034343698204101021553026552, + 532863768841046, + 21888242871839275222246405745257275088548364400416034343698204080710470100877, + 21888242871839275222246405745257275088548364400416034343698204047163893075351, + 21888242871839275222246405745257275088548364400416034343698203774732570594470, + 21888242871839275222246405745257275088548364400416034343698203905063125473717, + 281474669638920, + 21888242871839275222246405745257275088548364400416034343698203628891172269585, + 165726168078598, + 249652953334457, + 46079191968307, + 405149974188272, + 21888242871839275222246405745257275088548364400416034343698203653699756965278, + 21888242871839275222246405745257275088548364400416034343698203707087365913616, + 21888242871839275222246405745257275088548364400416034343698204001046321770140, + 21888242871839275222246405745257275088548364400416034343698204056147986335078, + 385041077140803, + 21888242871839275222246405745257275088548364400416034343698203863315980451371, + 36636759685492, + 21888242871839275222246405745257275088548364400416034343698203963976268699771, + 196157669297475, + 21888242871839275222246405745257275088548364400416034343698203902624708442345, + 21888242871839275222246405745257275088548364400416034343698203872196050215381, + 471507910497104, + 555900809413400, + 21888242871839275222246405745257275088548364400416034343698203851370829028897, + 419441747724384, + 276222174670764, + 21888242871839275222246405745257275088548364400416034343698204022701694999108, + 432156075260427, + 355189455563119, + 397198138894459, + 21888242871839275222246405745257275088548364400416034343698203663633914155926, + 21888242871839275222246405745257275088548364400416034343698204024124405585962, + 21888242871839275222246405745257275088548364400416034343698203858796754628186, + 32148276902029, + 530315526777262, + 305205074219828, + 21888242871839275222246405745257275088548364400416034343698203837846279560857, + 21888242871839275222246405745257275088548364400416034343698203940225109189308, + 21888242871839275222246405745257275088548364400416034343698204159535771597630, + 311079603996432, + 104165278662963, + 21888242871839275222246405745257275088548364400416034343698204040112153176544, + 91844511960488, + 21888242871839275222246405745257275088548364400416034343698204089789773534264, + 21888242871839275222246405745257275088548364400416034343698203664370320184182, + 21888242871839275222246405745257275088548364400416034343698203626860449484915, + 155535117218068, + 232537573439998, + 406420960881327, + 21888242871839275222246405745257275088548364400416034343698204039780737166868, + 21888242871839275222246405745257275088548364400416034343698204029047567566504, + 21888242871839275222246405745257275088548364400416034343698204113124872697979, + 236161671855398, + 21888242871839275222246405745257275088548364400416034343698204002004450889813, + 269511623211701, + 271149605643474, + 95695769672835, + 21888242871839275222246405745257275088548364400416034343698203672569399419518, + 21888242871839275222246405745257275088548364400416034343698203886500414126306, + 21888242871839275222246405745257275088548364400416034343698203787893525639350, + 21888242871839275222246405745257275088548364400416034343698204007193653863128, + 45122372774166, + 21888242871839275222246405745257275088548364400416034343698203854781960776323, + 21888242871839275222246405745257275088548364400416034343698203666784579512263, + 21888242871839275222246405745257275088548364400416034343698203804809031083560, + 21888242871839275222246405745257275088548364400416034343698204164936954445072, + 439497793787222, + 21888242871839275222246405745257275088548364400416034343698203872799372714457, + 21888242871839275222246405745257275088548364400416034343698203996567991628803, + 389860624605917, + 10092832922671, + 21888242871839275222246405745257275088548364400416034343698203706018353116625, + 276539276070313, + 21888242871839275222246405745257275088548364400416034343698204166669845216630, + 239767611088498, + 21888242871839275222246405745257275088548364400416034343698203746422723456149, + 21888242871839275222246405745257275088548364400416034343698204141814992310833, + 14065141571535, + 21888242871839275222246405745257275088548364400416034343698203814613646274657, + 21888242871839275222246405745257275088548364400416034343698203823498613930491, + 247962656132240, + 554025952178644, + 255073963153000, + 143242227569550, + 554890550804846, + 21888242871839275222246405745257275088548364400416034343698204159139960595084, + 21888242871839275222246405745257275088548364400416034343698204059106240376177, + 21888242871839275222246405745257275088548364400416034343698203997957767492979, + 21888242871839275222246405745257275088548364400416034343698204018065750052595, + 365446511746249, + 236915413367244, + 21888242871839275222246405745257275088548364400416034343698203826703629877437, + 21888242871839275222246405745257275088548364400416034343698203813910690256062, + 421368880895020, + 493962503988215, + 21888242871839275222246405745257275088548364400416034343698203870271051939790, + 552843447534377, + 544542947362, + 21888242871839275222246405745257275088548364400416034343698203745287479373282, + 21888242871839275222246405745257275088548364400416034343698204043015830353541, + 142735287256693, + 21888242871839275222246405745257275088548364400416034343698204090989909544315, + 49362121202805, + 21888242871839275222246405745257275088548364400416034343698203751209686906325, + 245876102014123, + 21888242871839275222246405745257275088548364400416034343698204044245612748286, + 21888242871839275222246405745257275088548364400416034343698203643563738437955, + 21888242871839275222246405745257275088548364400416034343698204097198136453504, + 87468276766747, + 21888242871839275222246405745257275088548364400416034343698204013050961820489, + 21888242871839275222246405745257275088548364400416034343698203725954092836869, + 21888242871839275222246405745257275088548364400416034343698203946977189594970, + 510154266387831, + 288524010290195, + 365301895800083, + 21888242871839275222246405745257275088548364400416034343698204115790145755976, + 333110030982849, + 476946851356998, + 159201882151010, + 179228480737408, + 381324000570203, + 75126875640369, + 21888242871839275222246405745257275088548364400416034343698204134820547108090, + 463981178270574, + 21888242871839275222246405745257275088548364400416034343698203736052376287384, + 224222164121210, + 395890114435399, + 21888242871839275222246405745257275088548364400416034343698203919861237443094, + 21888242871839275222246405745257275088548364400416034343698203633840106786083, + 81340920593842, + 21888242871839275222246405745257275088548364400416034343698203852430576977820, + 21888242871839275222246405745257275088548364400416034343698204053146395628237, + 21888242871839275222246405745257275088548364400416034343698203669541152807946, + 20738210414927, + 21888242871839275222246405745257275088548364400416034343698203745020705334405, + 388644336521601, + 21888242871839275222246405745257275088548364400416034343698203807496998234488, + 61879464271915, + 21888242871839275222246405745257275088548364400416034343698203765624822172150, + 162443846300041, + 21888242871839275222246405745257275088548364400416034343698203967766892495664, + 21888242871839275222246405745257275088548364400416034343698204098579986741017, + 21888242871839275222246405745257275088548364400416034343698203654918931421681, + 21888242871839275222246405745257275088548364400416034343698204120078379909970, + 313625396150974, + 21888242871839275222246405745257275088548364400416034343698203687212208372798, + 320577344918696, + 21888242871839275222246405745257275088548364400416034343698203929370573933238, + 32155807667405, + 410586298527026, + 465364000119887, + 302414750821706, + 21888242871839275222246405745257275088548364400416034343698203669890184103020, + 21888242871839275222246405745257275088548364400416034343698203948239900992219, + 21888242871839275222246405745257275088548364400416034343698203812187022315467, + 21888242871839275222246405745257275088548364400416034343698203740936501803858, + 425618477006678, + 21888242871839275222246405745257275088548364400416034343698203777970669560735, + 21888242871839275222246405745257275088548364400416034343698204163629863867719, + 456991713240448, + 441586788087095, + 61165849463021, + 78943499084688, + 554052253077723, + 21888242871839275222246405745257275088548364400416034343698203876132409919347, + 122597038703581, + 25837670243150, + 21888242871839275222246405745257275088548364400416034343698203908812727266432, + 280815760446177, + 291551652928027, + 289988913304183, + 348148807595541, + 433027128493913, + 21888242871839275222246405745257275088548364400416034343698203722358880832910, + 21888242871839275222246405745257275088548364400416034343698204027248754603025, + 360269280452972, + 21888242871839275222246405745257275088548364400416034343698204119334699374903, + 463859116723637, + 524232610411459, + 21888242871839275222246405745257275088548364400416034343698203792293569992411, + 152394204568053, + 100157222557206, + 339131883554946, + 21888242871839275222246405745257275088548364400416034343698204164109278121588, + 215291535386310, + 534897577270671, + 359255168973025, + 325190035726292, + 21888242871839275222246405745257275088548364400416034343698204087641807655672, + 21888242871839275222246405745257275088548364400416034343698203944079909858866, + 156199062143765, + 21888242871839275222246405745257275088548364400416034343698204121268323916641, + 21888242871839275222246405745257275088548364400416034343698203668860021158657, + 21888242871839275222246405745257275088548364400416034343698204003919878638999, + 374360199298240, + 385423073412816, + 21888242871839275222246405745257275088548364400416034343698203929701590445311, + 259434287854625, + 94850785038, + 307760237989412, + 21888242871839275222246405745257275088548364400416034343698203650635234531841, + 102548603727000, + 21888242871839275222246405745257275088548364400416034343698204094460685002225, + 490075561639482, + 21888242871839275222246405745257275088548364400416034343698203675851141226629, + 21888242871839275222246405745257275088548364400416034343698204130194406119843, + 21888242871839275222246405745257275088548364400416034343698203670072738098626, + 78193604618936, + 21888242871839275222246405745257275088548364400416034343698203663223415195864, + 210705561487829, + 210227025385629, + 21888242871839275222246405745257275088548364400416034343698204082313620594612, + 54336950779617, + 141965982885912, + 314187444664361, + 377196099958461, + 145001575227080, + 21888242871839275222246405745257275088548364400416034343698203898955432510379, + 111293899893038, + 128974882637622, + 14919150223145, + 68633627683896, + 21888242871839275222246405745257275088548364400416034343698203866321826807702, + 21888242871839275222246405745257275088548364400416034343698203986716934031612, + 194668163297502, + 21888242871839275222246405745257275088548364400416034343698203872759315885211, + 21888242871839275222246405745257275088548364400416034343698204144288120416433, + 37277619563664, + 461847084358056, + 430587752234017, + 224106714480635, + 21888242871839275222246405745257275088548364400416034343698203899634106602408, + 21888242871839275222246405745257275088548364400416034343698204150693552055214, + 269289868072616, + 51513262475331, + 339892082636753, + 21888242871839275222246405745257275088548364400416034343698203652784536952709, + 21888242871839275222246405745257275088548364400416034343698203693099724809324, + 21888242871839275222246405745257275088548364400416034343698204107968443600399, + 21888242871839275222246405745257275088548364400416034343698203944497873459220, + 286094288777516, + 21888242871839275222246405745257275088548364400416034343698204133816325678365, + 471663383544014, + 21888242871839275222246405745257275088548364400416034343698203646652856209962, + 80293544078240, + 21888242871839275222246405745257275088548364400416034343698203843328436115481, + 21888242871839275222246405745257275088548364400416034343698204155412656630299, + 21888242871839275222246405745257275088548364400416034343698203992018432521178, + 366502328697605, + 471525623583986, + 246085654332456, + 390636888628404, + 21888242871839275222246405745257275088548364400416034343698203651002355614616, + 546863926522120, + 306104549257242, + 145873248163553, + 21888242871839275222246405745257275088548364400416034343698203771116462879600, + 21888242871839275222246405745257275088548364400416034343698204096477514513160, + 298656244909875, + 21888242871839275222246405745257275088548364400416034343698203778080079909631, + 21888242871839275222246405745257275088548364400416034343698203889325200952633, + 382471113877013, + 111441696165431, + 21888242871839275222246405745257275088548364400416034343698203961737866300090, + 10680831964641, + 480018751419621, + 21888242871839275222246405745257275088548364400416034343698203966628322682676, + 268926261608802, + 21888242871839275222246405745257275088548364400416034343698203993948264841777, + 21888242871839275222246405745257275088548364400416034343698203938577045125440, + 21888242871839275222246405745257275088548364400416034343698203753019965752726, + 21888242871839275222246405745257275088548364400416034343698203627049521996514, + 339400276589578, + 71641471882826, + 471317071119151, + 21888242871839275222246405745257275088548364400416034343698203783849401480214, + 11840198657659, + 185354151835691, + 524081444740953, + 491384084999404, + 21888242871839275222246405745257275088548364400416034343698203985163916692000, + 21888242871839275222246405745257275088548364400416034343698203874299409100351, + 21888242871839275222246405745257275088548364400416034343698203817259572501104, + 142178898790331, + 382964599120921, + 21888242871839275222246405745257275088548364400416034343698204175040209278501, + 21888242871839275222246405745257275088548364400416034343698204134792619570014, + 462837123887086, + 21888242871839275222246405745257275088548364400416034343698203982332859410470, + 212414730721944, + 21888242871839275222246405745257275088548364400416034343698203677027701380614, + 21888242871839275222246405745257275088548364400416034343698203891181161768086, + 80811927096269, + 21888242871839275222246405745257275088548364400416034343698204043845940787508, + 21888242871839275222246405745257275088548364400416034343698203809820230433369, + 237268348831268, + 233452171489146, + 21888242871839275222246405745257275088548364400416034343698203674832327150313, + 21888242871839275222246405745257275088548364400416034343698203892032473495590, + 21888242871839275222246405745257275088548364400416034343698203737777306936405, + 21888242871839275222246405745257275088548364400416034343698203985703007270231, + 21888242871839275222246405745257275088548364400416034343698203731415884814467, + 323600312506531, + 21888242871839275222246405745257275088548364400416034343698203837414815448411, + 21888242871839275222246405745257275088548364400416034343698204011955919938548, + 21888242871839275222246405745257275088548364400416034343698204111367811983585, + 367354904252905, + 212497276400962, + 21888242871839275222246405745257275088548364400416034343698204148184929759641, + 21888242871839275222246405745257275088548364400416034343698203681169279808564, + 252412328344456, + 21888242871839275222246405745257275088548364400416034343698203646597559976001, + 21888242871839275222246405745257275088548364400416034343698203824252481897179, + 21888242871839275222246405745257275088548364400416034343698203833812334418303, + 548350814830176, + 430841704440756, + 226223201216497, + 463619714410110, + 21888242871839275222246405745257275088548364400416034343698203659201337508374, + 21888242871839275222246405745257275088548364400416034343698204098656814087977, + 21888242871839275222246405745257275088548364400416034343698204026693328036243, + 21888242871839275222246405745257275088548364400416034343698203757528653652797, + 21888242871839275222246405745257275088548364400416034343698203824218624302939, + 231582308473247, + 198396745472075, + 305468103337407, + 21888242871839275222246405745257275088548364400416034343698204176466055830619, + 391329847154518, + 21888242871839275222246405745257275088548364400416034343698203666507888735335, + 21888242871839275222246405745257275088548364400416034343698204117928714610234, + 134427797312032, + 428282813397992, + 21888242871839275222246405745257275088548364400416034343698203659119821327766, + 21888242871839275222246405745257275088548364400416034343698203877326620181390, + 21888242871839275222246405745257275088548364400416034343698203775744913355708, + 21888242871839275222246405745257275088548364400416034343698203830319943428331, + 21888242871839275222246405745257275088548364400416034343698203773025509097447, + 311242193190983, + 21888242871839275222246405745257275088548364400416034343698204082169374572798, + 214037258960928, + 21888242871839275222246405745257275088548364400416034343698203940852841908692, + 21888242871839275222246405745257275088548364400416034343698203944015714051318, + 128119880717485, + 21888242871839275222246405745257275088548364400416034343698203982638803617679, + 21888242871839275222246405745257275088548364400416034343698204125617082585501, + 21888242871839275222246405745257275088548364400416034343698204026255076219383, + 21888242871839275222246405745257275088548364400416034343698204031006414244873, + 236272636769518, + 342399975564567, + 21888242871839275222246405745257275088548364400416034343698204131161426130450, + 361735795521594, + 409842862819446, + 235647636931469, + 21888242871839275222246405745257275088548364400416034343698203654721636987435, + 21888242871839275222246405745257275088548364400416034343698203796594082441845, + 21888242871839275222246405745257275088548364400416034343698203712219472301454, + 21888242871839275222246405745257275088548364400416034343698203739573549425201, + 257758296166056, + 376522095070501, + 560810745074117, + 112268580790104, + 21888242871839275222246405745257275088548364400416034343698203768802883766575, + 21888242871839275222246405745257275088548364400416034343698203665986614918746, + 21888242871839275222246405745257275088548364400416034343698203824497997323341, + 527576561154883, + 290643922290939, + 21888242871839275222246405745257275088548364400416034343698204113252552377593, + 555337247290697, + 234387356501963, + 239951416040146, + 21888242871839275222246405745257275088548364400416034343698203652052567933590, + 213749376680902, + 311181737439870, + 21888242871839275222246405745257275088548364400416034343698203990034646111400, + 555772778005107, + 21888242871839275222246405745257275088548364400416034343698203676039387199442, + 21888242871839275222246405745257275088548364400416034343698203757387368990823, + 21888242871839275222246405745257275088548364400416034343698203749345857944953, + 533942647590949, + 21888242871839275222246405745257275088548364400416034343698203829261546093022, + 302378648884564, + 21888242871839275222246405745257275088548364400416034343698203911469114874932, + 100055629503156, + 21888242871839275222246405745257275088548364400416034343698203653772220123041, + 486292540122670, + 115787187841923, + 21888242871839275222246405745257275088548364400416034343698204016689321035639, + 21888242871839275222246405745257275088548364400416034343698203815950289508315, + 21888242871839275222246405745257275088548364400416034343698203671829867604676, + 87760093060563, + 288439111110339, + 21888242871839275222246405745257275088548364400416034343698204132219521363496, + 21888242871839275222246405745257275088548364400416034343698204077664444763223, + 491718593618521, + 526317491918663, + 21888242871839275222246405745257275088548364400416034343698203715921287894574, + 424543781255574, + 326774182582474, + 21888242871839275222246405745257275088548364400416034343698204018129472505529, + 21888242871839275222246405745257275088548364400416034343698204011086040712898, + 21888242871839275222246405745257275088548364400416034343698203896832661408697, + 21888242871839275222246405745257275088548364400416034343698203746036666864152, + 21888242871839275222246405745257275088548364400416034343698204144729080712435, + 21888242871839275222246405745257275088548364400416034343698203823448183317922, + 21888242871839275222246405745257275088548364400416034343698203955562866448140, + 360873494068422, + 21888242871839275222246405745257275088548364400416034343698203985594610505514, + 21888242871839275222246405745257275088548364400416034343698203764679484647152, + 431305451784413, + 363686321359618, + 193573149520332, + 21888242871839275222246405745257275088548364400416034343698203728647103153449, + 21888242871839275222246405745257275088548364400416034343698203668432678337772, + 169675487638888, + 21888242871839275222246405745257275088548364400416034343698203810968075853186, + 21888242871839275222246405745257275088548364400416034343698203812946150179432, + 21888242871839275222246405745257275088548364400416034343698203995341196113777, + 88341427586006, + 450069049261143, + 404688555849759, + 274144700682311, + 21888242871839275222246405745257275088548364400416034343698203634083177921449, + 10903924407676, + 71705272030469, + 21888242871839275222246405745257275088548364400416034343698203807469017784946, + 21888242871839275222246405745257275088548364400416034343698203678399343228557, + 21888242871839275222246405745257275088548364400416034343698203886861631679566, + 24170601754940, + 81191547039878, + 111307557696298, + 21888242871839275222246405745257275088548364400416034343698203800578504481742, + 544585020389894, + 58312725264649, + 21888242871839275222246405745257275088548364400416034343698203893269836109373, + 445258283831766, + 39301123875781, + 489192934108230, + 248430255575105, + 333963073484495, + 21888242871839275222246405745257275088548364400416034343698203913990355738023, + 128165634202469, + 484206478437641, + 21888242871839275222246405745257275088548364400416034343698203744033718012435, + 21888242871839275222246405745257275088548364400416034343698204019768896940435, + 21888242871839275222246405745257275088548364400416034343698204079387220729340, + 296266947890501, + 40431392600238, + 175777238818480, + 209040556619639, + 175132716706383, + 21888242871839275222246405745257275088548364400416034343698203940560621048041, + 352086467860264, + 21888242871839275222246405745257275088548364400416034343698203734776168915776, + 21888242871839275222246405745257275088548364400416034343698203699440673975078, + 301367854763883, + 21888242871839275222246405745257275088548364400416034343698203994708536500539, + 256589681809944, + 381051746043779, + 486237264530759, + 21888242871839275222246405745257275088548364400416034343698203635147433315407, + 21888242871839275222246405745257275088548364400416034343698203940745083960768, + 21888242871839275222246405745257275088548364400416034343698204170370883654595, + 21888242871839275222246405745257275088548364400416034343698203928109287655150, + 21888242871839275222246405745257275088548364400416034343698203975396967221874, + 21888242871839275222246405745257275088548364400416034343698203938935549254830, + 24280176799503, + 496017107393719, + 21888242871839275222246405745257275088548364400416034343698203840007852017159, + 21888242871839275222246405745257275088548364400416034343698204070669823063632, + 21888242871839275222246405745257275088548364400416034343698204148831329838325, + 301531436687087, + 21888242871839275222246405745257275088548364400416034343698204017709731233767, + 21888242871839275222246405745257275088548364400416034343698203733728146154890, + 303704060441389, + 362926232300822, + 169909851665012, + 459875857893575, + 21888242871839275222246405745257275088548364400416034343698204088251349467262, + 89138395785855, + 21888242871839275222246405745257275088548364400416034343698204148959479475325, + 21888242871839275222246405745257275088548364400416034343698203833270783731630, + 21888242871839275222246405745257275088548364400416034343698203958108244790087, + 463842345034596, + 449714695129556, + 21888242871839275222246405745257275088548364400416034343698204068151033633698, + 21888242871839275222246405745257275088548364400416034343698203762596551187044, + 525308291508618, + 21888242871839275222246405745257275088548364400416034343698203758384060273244, + 21888242871839275222246405745257275088548364400416034343698203748248939875313, + 21888242871839275222246405745257275088548364400416034343698204149715380682548, + 21888242871839275222246405745257275088548364400416034343698204173676115899770, + 87770554614904, + 21888242871839275222246405745257275088548364400416034343698204060997064860897, + 322652690865844, + 21888242871839275222246405745257275088548364400416034343698203900058763711962, + 436264312199516, + 48406454069155, + 412066087333217, + 21888242871839275222246405745257275088548364400416034343698203870846187020132, + 117286061259431, + 21888242871839275222246405745257275088548364400416034343698203965179578698937, + 351345786028478, + 21888242871839275222246405745257275088548364400416034343698204014389128296302, + 21888242871839275222246405745257275088548364400416034343698203817892135778143, + 292973186790892, + 439719819006776, + 263728627920218, + 21888242871839275222246405745257275088548364400416034343698203940906477548561, + 21888242871839275222246405745257275088548364400416034343698203833877897658466, + 21888242871839275222246405745257275088548364400416034343698204111212924097382, + 21888242871839275222246405745257275088548364400416034343698203702449663897668, + 273721874546097, + 21888242871839275222246405745257275088548364400416034343698204085610786569287, + 128087571351385, + 388260942371687, + 21888242871839275222246405745257275088548364400416034343698204053713767513199, + 21888242871839275222246405745257275088548364400416034343698204153208225146745, + 21888242871839275222246405745257275088548364400416034343698203882784311477292, + 21888242871839275222246405745257275088548364400416034343698203892737865181969, + 201128245564737, + 21888242871839275222246405745257275088548364400416034343698203784330593530125, + 42381549621466, + 21888242871839275222246405745257275088548364400416034343698203997373464109630, + 21888242871839275222246405745257275088548364400416034343698204035617667839799, + 361022353515753, + 21888242871839275222246405745257275088548364400416034343698204067454167319944, + 305832046797375, + 58521427392690, + 21888242871839275222246405745257275088548364400416034343698204051526880447136, + 524903117816342, + 21888242871839275222246405745257275088548364400416034343698204134399200898793, + 21888242871839275222246405745257275088548364400416034343698204122521165601629, + 21888242871839275222246405745257275088548364400416034343698203737162807086668, + 314715965800206, + 288637344747860, + 21888242871839275222246405745257275088548364400416034343698203680875997739597, + 21888242871839275222246405745257275088548364400416034343698203953878066528850, + 21888242871839275222246405745257275088548364400416034343698204023194469304444, + 21888242871839275222246405745257275088548364400416034343698204156085615535763, + 21888242871839275222246405745257275088548364400416034343698203659525051756968, + 21888242871839275222246405745257275088548364400416034343698204023879879379098, + 38606362529802, + 371442450071314, + 387699680067166, + 21888242871839275222246405745257275088548364400416034343698203929717372711405, + 21888242871839275222246405745257275088548364400416034343698203678598264615330, + 18277420200102, + 21888242871839275222246405745257275088548364400416034343698203966927835080699, + 21888242871839275222246405745257275088548364400416034343698203970210234053421, + 206550063077940, + 59542950186053, + 21888242871839275222246405745257275088548364400416034343698203979473844093780, + 56847667598967, + 40954138502341, + 522504164429799, + 233535009126475, + 21888242871839275222246405745257275088548364400416034343698203972929806748654, + 239118650547504, + 78045509517554, + 330434871208103, + 21888242871839275222246405745257275088548364400416034343698203663008553870727, + 408010483234595, + 21888242871839275222246405745257275088548364400416034343698203792885435531266, + 21888242871839275222246405745257275088548364400416034343698204045310329342487, + 21888242871839275222246405745257275088548364400416034343698203885960252942998, + 556281327844026, + 180337869595123, + 154846465409452, + 561818805243388, + 21888242871839275222246405745257275088548364400416034343698204114232151556179, + 159153900928338, + 21888242871839275222246405745257275088548364400416034343698203982781248373100, + 374192841845235, + 21888242871839275222246405745257275088548364400416034343698204166057698265517, + 21888242871839275222246405745257275088548364400416034343698204039850878731527, + 428531487638094, + 21888242871839275222246405745257275088548364400416034343698203723487898811214, + 21888242871839275222246405745257275088548364400416034343698203924473466520474, + 21888242871839275222246405745257275088548364400416034343698203632092484217704, + 21888242871839275222246405745257275088548364400416034343698203913861842052608, + 463781781127527, + 407969713390733, + 192005587558101, + 292516847120488, + 21888242871839275222246405745257275088548364400416034343698203890039308747349, + 21888242871839275222246405745257275088548364400416034343698203643953266215513, + 344476568682806, + 297518803945264, + 21888242871839275222246405745257275088548364400416034343698204089954106257148, + 21888242871839275222246405745257275088548364400416034343698204149548269844564, + 21888242871839275222246405745257275088548364400416034343698203660978322452540, + 133590611530789, + 21888242871839275222246405745257275088548364400416034343698203943334287050368, + 21888242871839275222246405745257275088548364400416034343698203787537212187128, + 21888242871839275222246405745257275088548364400416034343698203740765393117844, + 21888242871839275222246405745257275088548364400416034343698203910051741738508, + 21888242871839275222246405745257275088548364400416034343698203736795775764803, + 408726164407570, + 371106292433280, + 21888242871839275222246405745257275088548364400416034343698203859461083739084, + 143149223458728, + 70096828028127, + 332829306194381, + 21888242871839275222246405745257275088548364400416034343698203867380252435608, + 21888242871839275222246405745257275088548364400416034343698204183191946800116, + 21888242871839275222246405745257275088548364400416034343698204022409459561826, + 184696249918513, + 458486462555900, + 482974625476705, + 225093543118642, + 21888242871839275222246405745257275088548364400416034343698204091594635378236, + 343410461216400, + 21888242871839275222246405745257275088548364400416034343698203706616227155367, + 21888242871839275222246405745257275088548364400416034343698203825285880435316, + 21888242871839275222246405745257275088548364400416034343698203786991220475479, + 21888242871839275222246405745257275088548364400416034343698203824394971691963, + 21888242871839275222246405745257275088548364400416034343698203943746269355865, + 44545559328236, + 343897447530739, + 546525410760037, + 390569658494216, + 347997916202465, + 94250680630488, + 244138731012998, + 50094153742731, + 21888242871839275222246405745257275088548364400416034343698204066351674472510, + 465662842573072, + 17566183722930, + 376838288819401, + 409593500767114, + 339855271750090, + 21888242871839275222246405745257275088548364400416034343698204160047126999980, + 336324451016818, + 267003850640062, + 490017151266087, + 21888242871839275222246405745257275088548364400416034343698203950962987941935, + 408430722816370, + 21888242871839275222246405745257275088548364400416034343698204185487988234744, + 21888242871839275222246405745257275088548364400416034343698203734588285634512, + 21888242871839275222246405745257275088548364400416034343698203666017039884000, + 21888242871839275222246405745257275088548364400416034343698203810432233815602, + 501548831191658, + 496938314599034, + 415492996356924, + 21888242871839275222246405745257275088548364400416034343698203984196322309580, + 517240552554068, + 249164889543576, + 63327018774760, + 111272575263060, + 410379481747298, + 145729377243688, + 21888242871839275222246405745257275088548364400416034343698204014740964514180, + 518495503637031, + 480820665873019, + 21888242871839275222246405745257275088548364400416034343698203871506576947638, + 249788152977424, + 382151297048628, + 21888242871839275222246405745257275088548364400416034343698204111268841802774, + 21888242871839275222246405745257275088548364400416034343698204038992616928662, + 21888242871839275222246405745257275088548364400416034343698203802485386099153, + 230814147052469, + 21888242871839275222246405745257275088548364400416034343698203907407148878470, + 101289363628431, + 21888242871839275222246405745257275088548364400416034343698203744365263374583, + 35950614245043, + 465829095794836, + 21888242871839275222246405745257275088548364400416034343698203852086048521717, + 330185147957645, + 324376975254498, + 21888242871839275222246405745257275088548364400416034343698204116063629735727, + 21888242871839275222246405745257275088548364400416034343698203881075626739991, + 137726883278433, + 21888242871839275222246405745257275088548364400416034343698204166140180348239, + 522237690303526, + 376226019409886, + 513897850928534, + 140540758014613, + 21888242871839275222246405745257275088548364400416034343698203824540629906495, + 1233155526990, + 402747259277900, + 324542984520278, + 21888242871839275222246405745257275088548364400416034343698204112530163072406, + 21888242871839275222246405745257275088548364400416034343698203864442608650295, + 21888242871839275222246405745257275088548364400416034343698203975461985484836, + 298455800490290, + 434743387388141, + 7759559099884, + 21888242871839275222246405745257275088548364400416034343698203810046129438187, + 468002106883841, + 21888242871839275222246405745257275088548364400416034343698203763631554770036, + 21888242871839275222246405745257275088548364400416034343698203860917208857182, + 21888242871839275222246405745257275088548364400416034343698203688497169931975, + 231338090381500, + 21888242871839275222246405745257275088548364400416034343698204173349842579435, + 525587940451522, + 503452023064440, + 21888242871839275222246405745257275088548364400416034343698203734331063739284, + 425979964687723, + 363548065913213, + 135694199975079, + 470724438983320, + 21888242871839275222246405745257275088548364400416034343698203963772216986213, + 329578466470865, + 245120801553334, + 299274064169277, + 21888242871839275222246405745257275088548364400416034343698203802541327327472, + 21888242871839275222246405745257275088548364400416034343698204111855535562615, + 224420654515175, + 293779840880481, + 518912386061529, + 225146149375809, + 292155162460007, + 21888242871839275222246405745257275088548364400416034343698203782333042972555, + 21888242871839275222246405745257275088548364400416034343698204128877417419664, + 21888242871839275222246405745257275088548364400416034343698204000351586776233, + 546037503444888, + 333179006060957, + 936649493166, + 221386335672106, + 424726969720968, + 347491657326409, + 21888242871839275222246405745257275088548364400416034343698203972853079234693, + 383576744444337, + 461272618842831, + 21888242871839275222246405745257275088548364400416034343698203653602278347991, + 21888242871839275222246405745257275088548364400416034343698203888961808351049, + 54871628030822, + 438334309514674, + 21888242871839275222246405745257275088548364400416034343698203656159237740420, + 21888242871839275222246405745257275088548364400416034343698204135545842497437, + 16747716745471, + 21888242871839275222246405745257275088548364400416034343698203924347122457873, + 237099318863760, + 368501377769370, + 293570248588072, + 480247119656951, + 21888242871839275222246405745257275088548364400416034343698203924673210219828, + 77222038262556, + 21888242871839275222246405745257275088548364400416034343698203629886325852434, + 325822394558736, + 277781899708887, + 165617323605019, + 548200820031209, + 21888242871839275222246405745257275088548364400416034343698204126676373551483, + 447081188614544, + 21888242871839275222246405745257275088548364400416034343698203848263415900027, + 69164653926925, + 21888242871839275222246405745257275088548364400416034343698203625943881643250, + 21888242871839275222246405745257275088548364400416034343698203926536048535197, + 520787764598760, + 108092908162273, + 235093022848426, + 21888242871839275222246405745257275088548364400416034343698203766518226264443, + 304884693350635, + 21888242871839275222246405745257275088548364400416034343698203821979085546042, + 21888242871839275222246405745257275088548364400416034343698203786483693943859, + 21888242871839275222246405745257275088548364400416034343698203767033770469137, + 119913396005977, + 448340021036262, + 21888242871839275222246405745257275088548364400416034343698204047151887505609, + 21888242871839275222246405745257275088548364400416034343698203996283664966744, + 35708623648049, + 549873703896913, + 21888242871839275222246405745257275088548364400416034343698204176406677766550, + 21888242871839275222246405745257275088548364400416034343698204045997068602851, + 21888242871839275222246405745257275088548364400416034343698203706627138902657, + 176273699652772, + 21888242871839275222246405745257275088548364400416034343698204136776369210081, + 21888242871839275222246405745257275088548364400416034343698204121524313254555, + 198193813864103, + 110511165331146, + 21888242871839275222246405745257275088548364400416034343698203867091548692104, + 21888242871839275222246405745257275088548364400416034343698204009891408269241, + 297836120195043, + 4860032447811, + 167046350347395, + 21888242871839275222246405745257275088548364400416034343698203900072215746896, + 21888242871839275222246405745257275088548364400416034343698203957311175274964, + 21888242871839275222246405745257275088548364400416034343698203840787429169378, + 21888242871839275222246405745257275088548364400416034343698203737676679502356, + 21888242871839275222246405745257275088548364400416034343698204047600351597286, + 21888242871839275222246405745257275088548364400416034343698204182859638247662, + 21888242871839275222246405745257275088548364400416034343698203700962849730660, + 103106576412863, + 21888242871839275222246405745257275088548364400416034343698204110820212104596, + 21888242871839275222246405745257275088548364400416034343698204110092861210300, + 21888242871839275222246405745257275088548364400416034343698203950667273199888, + 171745567715063, + 361186605049859, + 482183752588932, + 21888242871839275222246405745257275088548364400416034343698204162105183932659, + 21888242871839275222246405745257275088548364400416034343698204181018445648217, + 21888242871839275222246405745257275088548364400416034343698203991020060038646, + 21888242871839275222246405745257275088548364400416034343698204138348560326003, + 348055596718239, + 21888242871839275222246405745257275088548364400416034343698204014112994091197, + 21888242871839275222246405745257275088548364400416034343698203900107194964846, + 88027043685738, + 21888242871839275222246405745257275088548364400416034343698204130038599934061, + 21888242871839275222246405745257275088548364400416034343698203947802149937809, + 21888242871839275222246405745257275088548364400416034343698204144497925292044, + 21888242871839275222246405745257275088548364400416034343698203849167915920562, + 134438592752523, + 110560248635192, + 112734987869649, + 21888242871839275222246405745257275088548364400416034343698204178421967190684, + 21888242871839275222246405745257275088548364400416034343698204125678729486377, + 21888242871839275222246405745257275088548364400416034343698203740021891017646, + 21888242871839275222246405745257275088548364400416034343698204022277715845505, + 437287743477565, + 59860380825443, + 21888242871839275222246405745257275088548364400416034343698203711538018950062, + 21888242871839275222246405745257275088548364400416034343698203711735999178011, + 405384835676700, + 478400673395443, + 291234731485376, + 292083822986664, + 21888242871839275222246405745257275088548364400416034343698204074484058250411, + 1213254740196, + 134282883753634, + 334975830372788, + 21888242871839275222246405745257275088548364400416034343698203715849754449091, + 106941681937723, + 34966810942872, + 21888242871839275222246405745257275088548364400416034343698203991532110883688, + 21888242871839275222246405745257275088548364400416034343698204042661054506294, + 21888242871839275222246405745257275088548364400416034343698203774184964321036, + 184804255095941, + 314119094112157, + 21888242871839275222246405745257275088548364400416034343698203916682259324022, + 11989103698526, + 21888242871839275222246405745257275088548364400416034343698203798669218714748, + 21888242871839275222246405745257275088548364400416034343698204026636813075878, + 21888242871839275222246405745257275088548364400416034343698204133120112328658, + 21888242871839275222246405745257275088548364400416034343698204019753051999896, + 333427615351680, + 191477521954852, + 183411294067756, + 179304938231013, + 21888242871839275222246405745257275088548364400416034343698204012600489526023, + 21888242871839275222246405745257275088548364400416034343698204051602818734747, + 439709294691548, + 21888242871839275222246405745257275088548364400416034343698203888717933655220, + 21888242871839275222246405745257275088548364400416034343698203665674866624225, + 469261310824594, + 21888242871839275222246405745257275088548364400416034343698203625483774161430, + 21888242871839275222246405745257275088548364400416034343698203877450051496454, + 21888242871839275222246405745257275088548364400416034343698203679368671794895, + 271632330517437, + 512952001276762, + 21888242871839275222246405745257275088548364400416034343698203651747279112662, + 142240136837841, + 111464921314666, + 21888242871839275222246405745257275088548364400416034343698204011491514778402, + 21888242871839275222246405745257275088548364400416034343698203995026803015557, + 519228228276115, + 21888242871839275222246405745257275088548364400416034343698203858539686362313, + 21888242871839275222246405745257275088548364400416034343698203719706007933628, + 340746123648810, + 21888242871839275222246405745257275088548364400416034343698204014701013760735, + 560731614137073, + 355617060900366, + 147296927952332, + 21888242871839275222246405745257275088548364400416034343698203731590225206207, + 376320456858383, + 21888242871839275222246405745257275088548364400416034343698204109313468385233, + 21888242871839275222246405745257275088548364400416034343698204082480567379594, + 242297162697034, + 21888242871839275222246405745257275088548364400416034343698204027481416984319, + 21888242871839275222246405745257275088548364400416034343698203782413164539061, + 513394678333841, + 536954866928500, + 21888242871839275222246405745257275088548364400416034343698203833108127794841, + 21888242871839275222246405745257275088548364400416034343698203885782481316646, + 21888242871839275222246405745257275088548364400416034343698203881055423811006, + 497341097048812, + 273611790472384, + 21888242871839275222246405745257275088548364400416034343698203735348992881467, + 369518130324294, + 21888242871839275222246405745257275088548364400416034343698203834173314929952, + 357326753028686, + 307765099745092, + 473783828977352, + 21888242871839275222246405745257275088548364400416034343698203776597342209783, + 21888242871839275222246405745257275088548364400416034343698204050958787093239, + 84850117412044, + 21888242871839275222246405745257275088548364400416034343698203972245212474102, + 21888242871839275222246405745257275088548364400416034343698203711678149345745, + 394355998242138, + 257094027441973, + 107088008819902, + 512032844433322, + 277169232432181, + 165541096543952, + 21888242871839275222246405745257275088548364400416034343698204168781313573918, + 84787445186753, + 21888242871839275222246405745257275088548364400416034343698203625499187453571, + 21888242871839275222246405745257275088548364400416034343698204056325491814199, + 355903790554891, + 501528500514140, + 21888242871839275222246405745257275088548364400416034343698204017527341842350, + 21888242871839275222246405745257275088548364400416034343698204112245268056340, + 21888242871839275222246405745257275088548364400416034343698204123929882010463, + 458689861739741, + 528738835293050, + 21888242871839275222246405745257275088548364400416034343698204136389367572510, + 272034364355795, + 126365799038180, + 82117879540402, + 21888242871839275222246405745257275088548364400416034343698204027507152416671, + 108523078082388, + 188397523396116, + 21888242871839275222246405745257275088548364400416034343698203727339552560670, + 21888242871839275222246405745257275088548364400416034343698204060960309465576, + 366832159364924, + 271974297422405, + 21888242871839275222246405745257275088548364400416034343698204087922324047602, + 21888242871839275222246405745257275088548364400416034343698203850483825614206, + 426315532377134, + 303240384162288, + 497509579400307, + 21888242871839275222246405745257275088548364400416034343698204168827024811720, + 21888242871839275222246405745257275088548364400416034343698203856242615345251, + 21888242871839275222246405745257275088548364400416034343698203862881297483591, + 336862554752277, + 21888242871839275222246405745257275088548364400416034343698203899887981125775, + 543634239712358, + 298314140086440, + 255707280757887, + 157124190793884, + 135634729340528, + 21888242871839275222246405745257275088548364400416034343698203629238946483177, + 21888242871839275222246405745257275088548364400416034343698204081793107049164, + 128353729819461, + 21888242871839275222246405745257275088548364400416034343698203689524479107967, + 21888242871839275222246405745257275088548364400416034343698203627300693736231, + 485902762053453, + 21888242871839275222246405745257275088548364400416034343698203681907487892365, + 21888242871839275222246405745257275088548364400416034343698203933386537125457, + 449870734437311, + 21888242871839275222246405745257275088548364400416034343698203885896268458114, + 21888242871839275222246405745257275088548364400416034343698203798056432320696, + 21888242871839275222246405745257275088548364400416034343698203751289941068613, + 491683941856372, + 113196348789849, + 21888242871839275222246405745257275088548364400416034343698203792934185818874, + 21888242871839275222246405745257275088548364400416034343698204023408379891482, + 21888242871839275222246405745257275088548364400416034343698203837457109831430, + 121948090579017, + 273512548147494, + 21888242871839275222246405745257275088548364400416034343698204090953188080434, + 21888242871839275222246405745257275088548364400416034343698203900759467514420, + 21888242871839275222246405745257275088548364400416034343698204084815020644255, + 21888242871839275222246405745257275088548364400416034343698203932642532192720, + 21888242871839275222246405745257275088548364400416034343698204025353554047216, + 191656341042316, + 21888242871839275222246405745257275088548364400416034343698203674355906640617, + 231862882702487, + 21888242871839275222246405745257275088548364400416034343698203939709298418432, + 21888242871839275222246405745257275088548364400416034343698203775070685567043, + 477569452993749, + 21888242871839275222246405745257275088548364400416034343698204055263800617288, + 21888242871839275222246405745257275088548364400416034343698203960056404659310, + 21888242871839275222246405745257275088548364400416034343698203999155691195504, + 21888242871839275222246405745257275088548364400416034343698203879741311173179, + 21888242871839275222246405745257275088548364400416034343698203874265757724043, + 21888242871839275222246405745257275088548364400416034343698203796614589395693, + 21888242871839275222246405745257275088548364400416034343698204001747915601909, + 266413426264361, + 21888242871839275222246405745257275088548364400416034343698203934288114723229, + 21888242871839275222246405745257275088548364400416034343698204182918071567050, + 21888242871839275222246405745257275088548364400416034343698203837039621898570, + 21888242871839275222246405745257275088548364400416034343698203922008252112314, + 502710898481038, + 21888242871839275222246405745257275088548364400416034343698204036247593507870, + 21888242871839275222246405745257275088548364400416034343698204095814113901594, + 21888242871839275222246405745257275088548364400416034343698203732662465741965, + 418236212931462, + 237501107732228, + 21888242871839275222246405745257275088548364400416034343698203729959507403488, + 21888242871839275222246405745257275088548364400416034343698204156833565766922, + 21888242871839275222246405745257275088548364400416034343698203778605216408576, + 298866761184905, + 385168311780035, + 21888242871839275222246405745257275088548364400416034343698204161012249026027, + 21888242871839275222246405745257275088548364400416034343698204022283231815885, + 157615550120256, + 21888242871839275222246405745257275088548364400416034343698204001477696554122, + 281797037719161, + 21888242871839275222246405745257275088548364400416034343698204126574374655510, + 21888242871839275222246405745257275088548364400416034343698204099554723903177, + 396558335898094, + 21888242871839275222246405745257275088548364400416034343698204067622643727654, + 21888242871839275222246405745257275088548364400416034343698204083632608457104, + 180140618069642, + 345142390864476, + 21888242871839275222246405745257275088548364400416034343698203831629559712882, + 159149500042496, + 21888242871839275222246405745257275088548364400416034343698203705071843213542, + 77003544113332, + 21888242871839275222246405745257275088548364400416034343698203708180242618453, + 282340818156498, + 185081876801690, + 66705008747603, + 132877580430116, + 272391128861590, + 21888242871839275222246405745257275088548364400416034343698203830263745036413, + 21888242871839275222246405745257275088548364400416034343698203822415154700971, + 225540324464225, + 21888242871839275222246405745257275088548364400416034343698204161158245582793, + 21888242871839275222246405745257275088548364400416034343698204035535596738065, + 346471166695535, + 21888242871839275222246405745257275088548364400416034343698203910640478059282, + 406850724167028, + 21888242871839275222246405745257275088548364400416034343698203809927565539824, + 403296054372373, + 36611056131359, + 241554015483822, + 337038771354024, + 288690696152463, + 21888242871839275222246405745257275088548364400416034343698204128866481905992, + 128595865743694, + 21888242871839275222246405745257275088548364400416034343698204108098639664893, + 21888242871839275222246405745257275088548364400416034343698204074636469540263, + 21888242871839275222246405745257275088548364400416034343698203657607966602496, + 21888242871839275222246405745257275088548364400416034343698204168862815722842, + 21888242871839275222246405745257275088548364400416034343698203943846943484047, + 21888242871839275222246405745257275088548364400416034343698204109642802593265, + 21888242871839275222246405745257275088548364400416034343698203703561852043109, + 25480226002143, + 21888242871839275222246405745257275088548364400416034343698203825497407940763, + 404288714915163, + 82837370302374, + 21888242871839275222246405745257275088548364400416034343698203849555284561117, + 21888242871839275222246405745257275088548364400416034343698203664420083457051, + 21888242871839275222246405745257275088548364400416034343698203830216073625771, + 21888242871839275222246405745257275088548364400416034343698203844463493655683, + 53104441295219, + 229237156176528, + 34225270771097, + 21888242871839275222246405745257275088548364400416034343698203795183826765417, + 21888242871839275222246405745257275088548364400416034343698204043298017400096, + 283988869536407, + 21888242871839275222246405745257275088548364400416034343698203701130941538196, + 162565056601419, + 121581723369084, + 288674970654611, + 161479644217497, + 21888242871839275222246405745257275088548364400416034343698203747384681969156, + 458583053713505, + 21888242871839275222246405745257275088548364400416034343698204006432733324792, + 152052157698675, + 21888242871839275222246405745257275088548364400416034343698203752725422729934, + 21888242871839275222246405745257275088548364400416034343698203813801134045244, + 21888242871839275222246405745257275088548364400416034343698203900538920019587, + 520789683723325, + 50709828517541, + 230044910974156, + 433819257868931, + 228239858362402, + 21888242871839275222246405745257275088548364400416034343698203700013072190943, + 84745192523503, + 21888242871839275222246405745257275088548364400416034343698204105864437220972, + 514639699836906, + 21888242871839275222246405745257275088548364400416034343698203934483855009572, + 66721930608997, + 21888242871839275222246405745257275088548364400416034343698204023165819982482, + 374536485083546, + 318641903672226, + 158301525380477, + 55868503692773, + 21888242871839275222246405745257275088548364400416034343698204153001254863853, + 159903419966032, + 341367450737470, + 21888242871839275222246405745257275088548364400416034343698203881086498631225, + 486259470317985, + 21888242871839275222246405745257275088548364400416034343698204046334262235689, + 277553110231893, + 21888242871839275222246405745257275088548364400416034343698204186068048341473, + 21888242871839275222246405745257275088548364400416034343698203654235431602516, + 98385581673496, + 21888242871839275222246405745257275088548364400416034343698203758557672220013, + 21888242871839275222246405745257275088548364400416034343698203959510832890757, + 100724866840379, + 21888242871839275222246405745257275088548364400416034343698203929147966646841, + 21888242871839275222246405745257275088548364400416034343698204087450469979544, + 366709457150437, + 222113225684063, + 21888242871839275222246405745257275088548364400416034343698203961751383196486, + 21888242871839275222246405745257275088548364400416034343698203890714814790125, + 205973215687859, + 21888242871839275222246405745257275088548364400416034343698203709621270984816, + 15165390776876, + 21888242871839275222246405745257275088548364400416034343698204003771208804443, + 21888242871839275222246405745257275088548364400416034343698204132265509514724, + 21888242871839275222246405745257275088548364400416034343698203906364622963992, + 171825119353600, + 377139174599420, + 21888242871839275222246405745257275088548364400416034343698203981499487375867, + 240428443455083, + 530684642123349, + 158723773051768, + 21888242871839275222246405745257275088548364400416034343698203880893483839841, + 21888242871839275222246405745257275088548364400416034343698204130390875655785, + 21888242871839275222246405745257275088548364400416034343698204055940429489570, + 21888242871839275222246405745257275088548364400416034343698203766578468913250, + 407213963142917, + 21888242871839275222246405745257275088548364400416034343698203800687817953292, + 168383196092194, + 51855286420074, + 21888242871839275222246405745257275088548364400416034343698203691774463437345, + 21888242871839275222246405745257275088548364400416034343698203660945108094655, + 23433143492297, + 25598169232529, + 21888242871839275222246405745257275088548364400416034343698203656613703223330, + 102100214294132, + 21888242871839275222246405745257275088548364400416034343698203651202479526865, + 480401463196966, + 447868082261793, + 21888242871839275222246405745257275088548364400416034343698203820781914924263, + 418724947750805, + 109038287925546, + 21888242871839275222246405745257275088548364400416034343698203816049903399522, + 125305585364871, + 134321317495400, + 267521740813256, + 384343748301950, + 91902571351369, + 21888242871839275222246405745257275088548364400416034343698204008548368732965, + 21888242871839275222246405745257275088548364400416034343698203839147834427012, + 21888242871839275222246405745257275088548364400416034343698203653313187479831, + 21888242871839275222246405745257275088548364400416034343698203934511930812877, + 21888242871839275222246405745257275088548364400416034343698203803746326687456, + 21888242871839275222246405745257275088548364400416034343698204141751083915265, + 21888242871839275222246405745257275088548364400416034343698204053455754314766, + 319172777459551, + 21888242871839275222246405745257275088548364400416034343698204057080864120115, + 21888242871839275222246405745257275088548364400416034343698204053970805941344, + 21888242871839275222246405745257275088548364400416034343698203683611582154386, + 21888242871839275222246405745257275088548364400416034343698204124955605391458, + 21888242871839275222246405745257275088548364400416034343698203952053992716194, + 348770338657849, + 521528061301054, + 21888242871839275222246405745257275088548364400416034343698203857999251933355, + 21888242871839275222246405745257275088548364400416034343698203932828711593487, + 482030346167764, + 21888242871839275222246405745257275088548364400416034343698203763463300627002, + 377655167743126, + 21888242871839275222246405745257275088548364400416034343698204149231164489742, + 341279324803821, + 21888242871839275222246405745257275088548364400416034343698204024525756207523, + 331591403303804, + 21888242871839275222246405745257275088548364400416034343698204090429299387824, + 21888242871839275222246405745257275088548364400416034343698203779932312807335, + 21888242871839275222246405745257275088548364400416034343698204016752167924109, + 196039693035829, + 548381003657786, + 21888242871839275222246405745257275088548364400416034343698203898479780271209, + 21888242871839275222246405745257275088548364400416034343698203718154078605911, + 21888242871839275222246405745257275088548364400416034343698203816373178819840, + 21888242871839275222246405745257275088548364400416034343698203688283557591283, + 365675621719232, + 428072509804338, + 308548006415792, + 53254728984570, + 21888242871839275222246405745257275088548364400416034343698204074591531027044, + 21888242871839275222246405745257275088548364400416034343698203749144889237065, + 131700139767514, + 101322412320869, + 439123481524832, + 262745291482355, + 21888242871839275222246405745257275088548364400416034343698204072457310239346, + 125612854188744, + 197290883896885, + 421376660343309, + 275004041078938, + 21888242871839275222246405745257275088548364400416034343698204041096327229748, + 21888242871839275222246405745257275088548364400416034343698203985453788192489, + 21888242871839275222246405745257275088548364400416034343698203792529524035156, + 21888242871839275222246405745257275088548364400416034343698203899847237576323, + 21888242871839275222246405745257275088548364400416034343698203807603793568953, + 73884017156125, + 21888242871839275222246405745257275088548364400416034343698203927263136085679, + 531843918643628, + 386197856467018, + 21888242871839275222246405745257275088548364400416034343698204115089141264964, + 103909601880446, + 504198508960865, + 21888242871839275222246405745257275088548364400416034343698203915329198116905, + 21888242871839275222246405745257275088548364400416034343698203924448110010332, + 470481561794017, + 398499085238231, + 21888242871839275222246405745257275088548364400416034343698204167319024190383, + 21888242871839275222246405745257275088548364400416034343698204085408793794388, + 55198959410158, + 395992524609714, + 21888242871839275222246405745257275088548364400416034343698203883661733655582, + 21888242871839275222246405745257275088548364400416034343698204159055617968696, + 18613477896165, + 211404409463563, + 499168416769141, + 196381424438066, + 486597372421469, + 325298640306187, + 502189895590596, + 521264072500875, + 21888242871839275222246405745257275088548364400416034343698203703158339227924, + 510796074744360, + 21888242871839275222246405745257275088548364400416034343698204109696365175245, + 21888242871839275222246405745257275088548364400416034343698204155899344195653, + 21888242871839275222246405745257275088548364400416034343698203960458113749492, + 21888242871839275222246405745257275088548364400416034343698203771249281015315, + 444186866528266, + 21888242871839275222246405745257275088548364400416034343698203885504700832226, + 119126387353783, + 42974992320018, + 21888242871839275222246405745257275088548364400416034343698203650201522997316, + 21888242871839275222246405745257275088548364400416034343698204106509617621443, + 21888242871839275222246405745257275088548364400416034343698204076507890069491, + 21888242871839275222246405745257275088548364400416034343698203694543315653959, + 21888242871839275222246405745257275088548364400416034343698204121363238981203, + 245168830502799, + 21888242871839275222246405745257275088548364400416034343698203698571839478829, + 477903400382480, + 367758157869065, + 21888242871839275222246405745257275088548364400416034343698203735361534003943, + 21888242871839275222246405745257275088548364400416034343698203846848266649979, + 107788397029607, + 21888242871839275222246405745257275088548364400416034343698204165566180494627, + 21888242871839275222246405745257275088548364400416034343698203658466676537118, + 359308025243738, + 21888242871839275222246405745257275088548364400416034343698203977318955380594, + 21888242871839275222246405745257275088548364400416034343698203653632308752680, + 453247539732474, + 460449854663290, + 532740226297915, + 21888242871839275222246405745257275088548364400416034343698204033958882843269, + 409133772876053, + 441229175862513, + 21888242871839275222246405745257275088548364400416034343698203866123520886334, + 542614398604057, + 8543591652153, + 21888242871839275222246405745257275088548364400416034343698203669692719480367, + 21888242871839275222246405745257275088548364400416034343698203664538967914143, + 21888242871839275222246405745257275088548364400416034343698203897163847710448, + 214408005533529, + 21888242871839275222246405745257275088548364400416034343698204127448268444493, + 21888242871839275222246405745257275088548364400416034343698203920671266108628, + 21888242871839275222246405745257275088548364400416034343698203943034673337853, + 120169653565070, + 423919076450509, + 21888242871839275222246405745257275088548364400416034343698203881512864815113, + 21888242871839275222246405745257275088548364400416034343698203899037281163068, + 339999279331342, + 285578240753047, + 21888242871839275222246405745257275088548364400416034343698203668472484549023, + 562312081021308, + 244227985931531, + 496759103248775, + 21888242871839275222246405745257275088548364400416034343698204179703495245025, + 21888242871839275222246405745257275088548364400416034343698203721862614098189, + 21888242871839275222246405745257275088548364400416034343698203910291490067354, + 21888242871839275222246405745257275088548364400416034343698203789608631883862, + 21888242871839275222246405745257275088548364400416034343698203910977630532442, + 383625904282389, + 314661383559476, + 21888242871839275222246405745257275088548364400416034343698203729677585114434, + 255173522129188, + 157675869646173, + 21888242871839275222246405745257275088548364400416034343698204049954881980654, + 282605544313326, + 308986138693096, + 21888242871839275222246405745257275088548364400416034343698203690378361136979, + 21888242871839275222246405745257275088548364400416034343698203866079810808907, + 21888242871839275222246405745257275088548364400416034343698203992329901486816, + 398181624163682, + 1228154023810, + 21888242871839275222246405745257275088548364400416034343698203895772992861761, + 21888242871839275222246405745257275088548364400416034343698203923142629022200, + 21888242871839275222246405745257275088548364400416034343698203634077484863633, + 21888242871839275222246405745257275088548364400416034343698203958200331628856, + 21888242871839275222246405745257275088548364400416034343698203692793779039996, + 43965663902106, + 21888242871839275222246405745257275088548364400416034343698203971354696227429, + 58064923204381, + 21888242871839275222246405745257275088548364400416034343698203965014325846721, + 417288598146402, + 280757958250711, + 439462391157528, + 307286204115592, + 21888242871839275222246405745257275088548364400416034343698203799736184760991, + 156792962080761, + 163874682275422, + 499963907636854, + 82248605007664, + 21888242871839275222246405745257275088548364400416034343698204174800182196478, + 21888242871839275222246405745257275088548364400416034343698204151007236393596, + 21888242871839275222246405745257275088548364400416034343698204145993933371415, + 123698087930634, + 347442404909070, + 323085698924186, + 21888242871839275222246405745257275088548364400416034343698203753168434938528, + 21888242871839275222246405745257275088548364400416034343698203980142705024856, + 21888242871839275222246405745257275088548364400416034343698204173831314861667, + 21888242871839275222246405745257275088548364400416034343698204044895291504184, + 349897673612779, + 505851059073796, + 21888242871839275222246405745257275088548364400416034343698203929305145888400, + 62876257760024, + 328573292598448, + 43147652548733, + 21888242871839275222246405745257275088548364400416034343698204156414345566326, + 119255644204577, + 144185013008669, + 316246416745927, + 21888242871839275222246405745257275088548364400416034343698203909547318677168, + 265542665215037, + 150029485953284, + 21888242871839275222246405745257275088548364400416034343698203718519953683208, + 365526878405840, + 21888242871839275222246405745257275088548364400416034343698203844849963491482, + 21888242871839275222246405745257275088548364400416034343698203836300291884326, + 303042835418425, + 21888242871839275222246405745257275088548364400416034343698203690171062149201, + 21888242871839275222246405745257275088548364400416034343698204100910115088515, + 21888242871839275222246405745257275088548364400416034343698204027361809371129, + 31189040987548, + 21888242871839275222246405745257275088548364400416034343698203657160908175125, + 21888242871839275222246405745257275088548364400416034343698203927876812321697, + 331564343324489, + 340558553330993, + 21888242871839275222246405745257275088548364400416034343698203949786245157861, + 96832324445530, + 161102852879371, + 21888242871839275222246405745257275088548364400416034343698203836448331014652, + 21888242871839275222246405745257275088548364400416034343698203795699816918445, + 373886084062200, + 21888242871839275222246405745257275088548364400416034343698203671889275366006, + 485999175479356, + 21888242871839275222246405745257275088548364400416034343698204154197834003668, + 40112587999670, + 198064239605826, + 205398004273415, + 21888242871839275222246405745257275088548364400416034343698204008834393162698, + 21888242871839275222246405745257275088548364400416034343698203801975889958109, + 263947098853711, + 398715693603476, + 21888242871839275222246405745257275088548364400416034343698204158795522289115, + 21888242871839275222246405745257275088548364400416034343698204116014247676821, + 282280736076769, + 169492861376927, + 21888242871839275222246405745257275088548364400416034343698204096735111650945, + 21888242871839275222246405745257275088548364400416034343698203986907400660466, + 504290117719029, + 31451832104022, + 21888242871839275222246405745257275088548364400416034343698204159093070555069, + 203075388782121, + 139484019358234, + 21888242871839275222246405745257275088548364400416034343698203790194592215020, + 21888242871839275222246405745257275088548364400416034343698204032216612339487, + 233145396627960, + 201937620438873, + 450953218872901, + 21888242871839275222246405745257275088548364400416034343698203642351779484864, + 21888242871839275222246405745257275088548364400416034343698204013008532476720, + 447616150134138, + 21888242871839275222246405745257275088548364400416034343698203832805996837745, + 50394430666163, + 49210911733250, + 552442615917915, + 276590213543997, + 54670681545180, + 21888242871839275222246405745257275088548364400416034343698203961867006682908, + 334858324421075, + 437144697549141, + 21888242871839275222246405745257275088548364400416034343698203981315016943153, + 28102753108733, + 129206752934944, + 230404604086037, + 119306357482744, + 368307537122244, + 21888242871839275222246405745257275088548364400416034343698203641735469071798, + 21888242871839275222246405745257275088548364400416034343698203889117894793069, + 38290037191806, + 297642922060768, + 556716437597861, + 65370360902153, + 340055330380280, + 21888242871839275222246405745257275088548364400416034343698203639055274562176, + 21888242871839275222246405745257275088548364400416034343698204031504824935040, + 61154438858780, + 361627977547642, + 384567416260309, + 177174566572800, + 21888242871839275222246405745257275088548364400416034343698203739137901328619, + 21888242871839275222246405745257275088548364400416034343698203806610366844715, + 21888242871839275222246405745257275088548364400416034343698203758001139248143, + 373432146521321, + 21888242871839275222246405745257275088548364400416034343698203864489384824382, + 21888242871839275222246405745257275088548364400416034343698203917857271211440, + 21888242871839275222246405745257275088548364400416034343698203630539910422045, + 233185465932835, + 340536006908937, + 21888242871839275222246405745257275088548364400416034343698204123237564757612, + 21888242871839275222246405745257275088548364400416034343698204159322840728044, + 493099507739684, + 21888242871839275222246405745257275088548364400416034343698203941186377050662, + 21888242871839275222246405745257275088548364400416034343698203875471012433010, + 68387033258775, + 21888242871839275222246405745257275088548364400416034343698203968224907453923, + 268133954115481, + 72651813540907, + 500438901099141, + 21888242871839275222246405745257275088548364400416034343698204055564508887614, + 433199221265850, + 372976975043745, + 21888242871839275222246405745257275088548364400416034343698204169583437051608, + 511759491240695, + 21888242871839275222246405745257275088548364400416034343698204074488905091814, + 299886494136799, + 277259125424411, + 21888242871839275222246405745257275088548364400416034343698203854919821215840, + 21888242871839275222246405745257275088548364400416034343698203762129937057445, + 21888242871839275222246405745257275088548364400416034343698203908781771427674, + 341688105567160, + 21888242871839275222246405745257275088548364400416034343698203915919139882247, + 432954393391403, + 21888242871839275222246405745257275088548364400416034343698203958712813181751, + 21888242871839275222246405745257275088548364400416034343698203976846421453874, + 21888242871839275222246405745257275088548364400416034343698203849084028495928, + 21888242871839275222246405745257275088548364400416034343698203902445279977170, + 21888242871839275222246405745257275088548364400416034343698203851718446349844, + 21888242871839275222246405745257275088548364400416034343698204154996867692578, + 453812137711114, + 21888242871839275222246405745257275088548364400416034343698204026850745241436, + 21888242871839275222246405745257275088548364400416034343698203889772064375358, + 69745067849183, + 21888242871839275222246405745257275088548364400416034343698203819045277017768, + 401726883645570, + 21888242871839275222246405745257275088548364400416034343698203929003135170359, + 21888242871839275222246405745257275088548364400416034343698203991223657900128, + 21888242871839275222246405745257275088548364400416034343698203632583884533067, + 21888242871839275222246405745257275088548364400416034343698203763884826132784, + 412516251948022, + 161988953291065, + 21888242871839275222246405745257275088548364400416034343698203941967150709631, + 522451931940302, + 312836515320332, + 21888242871839275222246405745257275088548364400416034343698203748320534094253, + 517381582930100, + 21888242871839275222246405745257275088548364400416034343698203864606731263365, + 21888242871839275222246405745257275088548364400416034343698203697623018546474, + 21888242871839275222246405745257275088548364400416034343698203992512267131806, + 21888242871839275222246405745257275088548364400416034343698203731887749151463, + 266444125266744, + 21888242871839275222246405745257275088548364400416034343698203843417163108930, + 68962867985640, + 195011367459768, + 21888242871839275222246405745257275088548364400416034343698203854292110810796, + 42906186627472, + 266558875794551, + 190612634789216, + 317613596972522, + 21888242871839275222246405745257275088548364400416034343698204183899567077447, + 21888242871839275222246405745257275088548364400416034343698204103617288423647, + 21888242871839275222246405745257275088548364400416034343698203922022315587692, + 21888242871839275222246405745257275088548364400416034343698204109663801183640, + 21888242871839275222246405745257275088548364400416034343698203988627354745469, + 430928977018328, + 21888242871839275222246405745257275088548364400416034343698204039610291683626, + 21888242871839275222246405745257275088548364400416034343698203649119243787272, + 424007732231014, + 21888242871839275222246405745257275088548364400416034343698203740138798806020, + 259384878159610, + 429852764122628, + 531990207643648, + 252601054969511, + 21888242871839275222246405745257275088548364400416034343698203958356714667523, + 558438940196798, + 332037025730720, + 21888242871839275222246405745257275088548364400416034343698203915969109157817, + 68567183170828, + 21888242871839275222246405745257275088548364400416034343698203924346660948674, + 460527710740320, + 548029752863971, + 21888242871839275222246405745257275088548364400416034343698204024255402578681, + 21888242871839275222246405745257275088548364400416034343698204127205325018489, + 114868767343131, + 159300885105211, + 249747721199210, + 21888242871839275222246405745257275088548364400416034343698203814694869016332, + 255599202110895, + 376563135656529, + 21888242871839275222246405745257275088548364400416034343698204057028802492793, + 108786063557622, + 21888242871839275222246405745257275088548364400416034343698203860120085840569, + 178673816533225, + 21888242871839275222246405745257275088548364400416034343698203948305944716114, + 265296917030880, + 9096328922774, + 21888242871839275222246405745257275088548364400416034343698204032788904690480, + 21888242871839275222246405745257275088548364400416034343698203909395131021261, + 370968994428149, + 277307782608452, + 374384906088545, + 21888242871839275222246405745257275088548364400416034343698203907269176695967, + 133296847028123, + 114632066284695, + 14852988245393, + 529406407443022, + 40784775483716, + 21888242871839275222246405745257275088548364400416034343698203804760027265839, + 186439598797575, + 21888242871839275222246405745257275088548364400416034343698203653321021312032, + 226776532770220, + 21888242871839275222246405745257275088548364400416034343698203732739255570779, + 8902499967436, + 497331578879269, + 21888242871839275222246405745257275088548364400416034343698204011432156612439, + 21888242871839275222246405745257275088548364400416034343698203996860117053252, + 21888242871839275222246405745257275088548364400416034343698203949948785619396, + 21888242871839275222246405745257275088548364400416034343698203895441027544227, + 21888242871839275222246405745257275088548364400416034343698203908837315216472, + 246478764949673, + 21888242871839275222246405745257275088548364400416034343698203880479174900637, + 21888242871839275222246405745257275088548364400416034343698204105540720658211, + 21888242871839275222246405745257275088548364400416034343698204157173013314664, + 21888242871839275222246405745257275088548364400416034343698203719675603184965, + 21888242871839275222246405745257275088548364400416034343698204059472615520734, + 174236204050235, + 297399553737464, + 21888242871839275222246405745257275088548364400416034343698203737622853666773, + 21888242871839275222246405745257275088548364400416034343698203931910210328026, + 21888242871839275222246405745257275088548364400416034343698203876634566821084, + 21888242871839275222246405745257275088548364400416034343698204100815314901965, + 21888242871839275222246405745257275088548364400416034343698204171629887216255, + 338135043641681, + 271231480490091, + 21888242871839275222246405745257275088548364400416034343698204122897068933434, + 223897551337709, + 21888242871839275222246405745257275088548364400416034343698204008306234023465, + 21888242871839275222246405745257275088548364400416034343698204058421077824070, + 486941293453754, + 21888242871839275222246405745257275088548364400416034343698203879957975093145, + 428862277581259, + 21888242871839275222246405745257275088548364400416034343698204096277138650446, + 378160464609372, + 238844490619155, + 236199799942962, + 21888242871839275222246405745257275088548364400416034343698203831727017580219, + 21888242871839275222246405745257275088548364400416034343698203992257394012989, + 106427558590531, + 21888242871839275222246405745257275088548364400416034343698204135315409998490, + 215859626368237, + 186227407565151, + 21888242871839275222246405745257275088548364400416034343698203914319459559702, + 54146394890086, + 21888242871839275222246405745257275088548364400416034343698204034233405953384, + 21888242871839275222246405745257275088548364400416034343698204164287793568948, + 210627276363774, + 445456545501971, + 21888242871839275222246405745257275088548364400416034343698203762747612835014, + 114392526603979, + 168644517406903, + 21888242871839275222246405745257275088548364400416034343698203877985016504455, + 535254855170630, + 324159601230903, + 21888242871839275222246405745257275088548364400416034343698204110627689493524, + 234153273967555, + 21888242871839275222246405745257275088548364400416034343698203655480609060296, + 21888242871839275222246405745257275088548364400416034343698203954642157737758, + 21888242871839275222246405745257275088548364400416034343698203624138267499380, + 21888242871839275222246405745257275088548364400416034343698203795775775804094, + 21888242871839275222246405745257275088548364400416034343698203827701603192693, + 21888242871839275222246405745257275088548364400416034343698203858054134750947, + 208819716730133, + 466985754511948, + 21888242871839275222246405745257275088548364400416034343698203962400572449882, + 67856257125807, + 116300943852381, + 137654355824044, + 138691699161338, + 21888242871839275222246405745257275088548364400416034343698203640014496275012, + 321128247069706, + 21888242871839275222246405745257275088548364400416034343698203698949273934204, + 21888242871839275222246405745257275088548364400416034343698203737952456570022, + 240099927959623, + 21888242871839275222246405745257275088548364400416034343698203747230456241313, + 21888242871839275222246405745257275088548364400416034343698203957823411423205, + 21888242871839275222246405745257275088548364400416034343698203689900514639420, + 120683330647859, + 371799540888571, + 21888242871839275222246405745257275088548364400416034343698204179666400860592, + 21888242871839275222246405745257275088548364400416034343698203803496186609748, + 21888242871839275222246405745257275088548364400416034343698203672567301246563, + 43594261568276, + 472749955654580, + 261460550073202, + 21888242871839275222246405745257275088548364400416034343698203829465159836710, + 401806636450950, + 52822542854390, + 21888242871839275222246405745257275088548364400416034343698204086938672440898, + 21888242871839275222246405745257275088548364400416034343698203784535964423868, + 21888242871839275222246405745257275088548364400416034343698203758657049291419, + 21888242871839275222246405745257275088548364400416034343698203889098833129158, + 413564050300119, + 505786376386561, + 21888242871839275222246405745257275088548364400416034343698203637372915421527, + 406167989571486, + 467844606108119, + 405896813808007, + 376309946733779, + 21888242871839275222246405745257275088548364400416034343698203792643149283645, + 201983005413126, + 21888242871839275222246405745257275088548364400416034343698203648420617629720, + 21888242871839275222246405745257275088548364400416034343698203834339155355077, + 263678022664943, + 488682799612722, + 21888242871839275222246405745257275088548364400416034343698204018894937509595, + 21888242871839275222246405745257275088548364400416034343698203670585898997210, + 21888242871839275222246405745257275088548364400416034343698203810137814626463, + 21888242871839275222246405745257275088548364400416034343698204097756654544137, + 21888242871839275222246405745257275088548364400416034343698204061637208075658, + 131583817113688, + 21888242871839275222246405745257275088548364400416034343698204185165555121956, + 321171616653970, + 317396300277027, + 21888242871839275222246405745257275088548364400416034343698203686445971047166, + 21888242871839275222246405745257275088548364400416034343698204165288786855499, + 9523693526945, + 205739670926825, + 21888242871839275222246405745257275088548364400416034343698204041966801212048, + 21888242871839275222246405745257275088548364400416034343698204163201644244822, + 144718439886289, + 21888242871839275222246405745257275088548364400416034343698204037849647211308, + 21888242871839275222246405745257275088548364400416034343698203956424756764514, + 141315310719321, + 21888242871839275222246405745257275088548364400416034343698203998497083006761, + 507922682842615, + 53984633429246, + 21888242871839275222246405745257275088548364400416034343698204072005398242593, + 28027122262518, + 237582235754489, + 402267117144067, + 21888242871839275222246405745257275088548364400416034343698203881837970608719, + 21888242871839275222246405745257275088548364400416034343698203994271260564533, + 74458449125188, + 21888242871839275222246405745257275088548364400416034343698203760498515815048, + 491869000422829, + 21888242871839275222246405745257275088548364400416034343698203692741991689490, + 312456740159078, + 175810741618954, + 55464933961471, + 21888242871839275222246405745257275088548364400416034343698203736076668621505, + 21888242871839275222246405745257275088548364400416034343698204122526641432987, + 52699687343184, + 21888242871839275222246405745257275088548364400416034343698203930980244245642, + 121470896810447, + 348174296471464, + 507196019795294, + 236389483438747, + 146116860284036, + 201174600451262, + 323652646781664, + 430881971919338, + 387779245515015, + 21888242871839275222246405745257275088548364400416034343698203854473532109372, + 505024521051797, + 21888242871839275222246405745257275088548364400416034343698204035855424527478, + 545221002997057, + 135961136106576, + 21888242871839275222246405745257275088548364400416034343698203887337498429605, + 520597462305171, + 230380549721614, + 21888242871839275222246405745257275088548364400416034343698203816256545578800, + 243987443119864, + 21888242871839275222246405745257275088548364400416034343698204144501749434319, + 21888242871839275222246405745257275088548364400416034343698204100685179977034, + 93551261640498, + 281389553904959, + 394525810492367, + 21888242871839275222246405745257275088548364400416034343698204095217499503457, + 363008266728177, + 310639875459010, + 397160977238912, + 21888242871839275222246405745257275088548364400416034343698204126186802170244, + 21888242871839275222246405745257275088548364400416034343698203627963740121720, + 21888242871839275222246405745257275088548364400416034343698203733528021633046, + 21888242871839275222246405745257275088548364400416034343698204156288011082694, + 30114674307249, + 82792375172599, + 107474725717787, + 21888242871839275222246405745257275088548364400416034343698203778005893793005, + 25232765968343, + 548702326658021, + 485676759423336, + 21888242871839275222246405745257275088548364400416034343698203719103345861357, + 21888242871839275222246405745257275088548364400416034343698203984646902291054, + 21888242871839275222246405745257275088548364400416034343698203691224795706092, + 21888242871839275222246405745257275088548364400416034343698204079005867583645, + 21888242871839275222246405745257275088548364400416034343698204029282652691896, + 21888242871839275222246405745257275088548364400416034343698203835392414446170, + 21888242871839275222246405745257275088548364400416034343698203625057273894239, + 396876394972859, + 21888242871839275222246405745257275088548364400416034343698203717535597390791, + 21888242871839275222246405745257275088548364400416034343698203837832617440207, + 21888242871839275222246405745257275088548364400416034343698204131224311452369, + 21888242871839275222246405745257275088548364400416034343698203631648172736024, + 500147843464254, + 316958064490378, + 149980946636517, + 528500674815242, + 21888242871839275222246405745257275088548364400416034343698203650292799426371, + 21888242871839275222246405745257275088548364400416034343698203886585610549175, + 175200143359421, + 215233756172131, + 21888242871839275222246405745257275088548364400416034343698203766606051321904, + 21888242871839275222246405745257275088548364400416034343698203875210050173857, + 291566597016862, + 209140186573446, + 21888242871839275222246405745257275088548364400416034343698203809679779194956, + 480114609569925, + 373450826534431, + 21888242871839275222246405745257275088548364400416034343698203957308102808175, + 21888242871839275222246405745257275088548364400416034343698204125051153976996, + 21888242871839275222246405745257275088548364400416034343698203931319222249691, + 21888242871839275222246405745257275088548364400416034343698203752357966791690, + 305175155716289, + 21888242871839275222246405745257275088548364400416034343698203892276374110549, + 29707414525250, + 21888242871839275222246405745257275088548364400416034343698204149359098492349, + 90363296599482, + 238823614612335, + 28949398505711, + 21888242871839275222246405745257275088548364400416034343698203776570945951867, + 21888242871839275222246405745257275088548364400416034343698203658171250343378, + 393317965860388, + 150029938545643, + 23790822212246, + 21888242871839275222246405745257275088548364400416034343698204002398206757537, + 21888242871839275222246405745257275088548364400416034343698204018797960876989, + 21888242871839275222246405745257275088548364400416034343698203702419332648996, + 21888242871839275222246405745257275088548364400416034343698203690907504599457, + 21888242871839275222246405745257275088548364400416034343698203774105294134308, + 228682233823433, + 21888242871839275222246405745257275088548364400416034343698203641849403567570, + 21888242871839275222246405745257275088548364400416034343698203773426087050672, + 300248865276105, + 213986163120733, + 21888242871839275222246405745257275088548364400416034343698203896453881465171, + 21888242871839275222246405745257275088548364400416034343698203734292097817814, + 21888242871839275222246405745257275088548364400416034343698203671774788255549, + 313355297598453, + 21888242871839275222246405745257275088548364400416034343698203889772889391064, + 21888242871839275222246405745257275088548364400416034343698203816709230114385, + 464457388373294, + 21888242871839275222246405745257275088548364400416034343698203628563524097387, + 468839231060897, + 134165244321463, + 66164680642324, + 21888242871839275222246405745257275088548364400416034343698203631556607086468, + 496680298521723, + 21888242871839275222246405745257275088548364400416034343698204029325353625571, + 21888242871839275222246405745257275088548364400416034343698203633350737966899, + 21888242871839275222246405745257275088548364400416034343698204143941912071216, + 308037397194987, + 21888242871839275222246405745257275088548364400416034343698203630779213093065, + 21888242871839275222246405745257275088548364400416034343698204069036287119535, + 127877531128518, + 78753395287621, + 286042695293695, + 174966505097394, + 171851081187143, + 21888242871839275222246405745257275088548364400416034343698203661687726701783, + 6576162330933, + 54544984105472, + 424426764658759, + 472948518816408, + 115933316043673, + 21888242871839275222246405745257275088548364400416034343698203767499558925350, + 452410702447615, + 21888242871839275222246405745257275088548364400416034343698203835157273948336, + 21888242871839275222246405745257275088548364400416034343698203850699063349606, + 21888242871839275222246405745257275088548364400416034343698203825536396138345, + 21888242871839275222246405745257275088548364400416034343698203943660058782749, + 315617443431028, + 21888242871839275222246405745257275088548364400416034343698203628935265326566, + 12972610785670, + 38500867663421, + 21888242871839275222246405745257275088548364400416034343698203879157874810050, + 21888242871839275222246405745257275088548364400416034343698203823083969416620, + 21888242871839275222246405745257275088548364400416034343698204144987874250044, + 217727463335393, + 226033288156824, + 21888242871839275222246405745257275088548364400416034343698203673616091801320, + 244607821192212, + 281667275616976, + 240238729732882, + 21888242871839275222246405745257275088548364400416034343698203927788203939649, + 516939189643875, + 234969794565269, + 113253864403716, + 331352974267168, + 21888242871839275222246405745257275088548364400416034343698203792230438230400, + 455919999984488, + 21888242871839275222246405745257275088548364400416034343698203996128138489313, + 21888242871839275222246405745257275088548364400416034343698203762791706196604, + 138483609107641, + 60031908029348, + 21888242871839275222246405745257275088548364400416034343698204089181471292166, + 449027881414919, + 326297999696652, + 325433340252309, + 222008808656675, + 266358602418245, + 21888242871839275222246405745257275088548364400416034343698203744488841760676, + 21888242871839275222246405745257275088548364400416034343698203722009911398878, + 364724891579232, + 21888242871839275222246405745257275088548364400416034343698204004116958189837, + 119834903060728, + 463046751977082, + 555001408868298, + 437349620204534, + 21888242871839275222246405745257275088548364400416034343698203906836426175913, + 183098863792556, + 474252491565165, + 138315424209976, + 417545112943264, + 21888242871839275222246405745257275088548364400416034343698203674685201189368, + 21888242871839275222246405745257275088548364400416034343698203953740349751208, + 59306536059638, + 314300636384259, + 359672544172177, + 196770525043, + 21888242871839275222246405745257275088548364400416034343698204007218062554773, + 21888242871839275222246405745257275088548364400416034343698203716037728413672, + 21888242871839275222246405745257275088548364400416034343698204024362129139518, + 387238868150905, + 346964010116079, + 21888242871839275222246405745257275088548364400416034343698203913788673496177, + 55707942053513, + 132976779371104, + 21888242871839275222246405745257275088548364400416034343698204030475684872227, + 220736129354399, + 21888242871839275222246405745257275088548364400416034343698204006721887612509, + 21888242871839275222246405745257275088548364400416034343698203801061421982579, + 21888242871839275222246405745257275088548364400416034343698204015965336261261, + 21888242871839275222246405745257275088548364400416034343698203891573913291978, + 157333274186709, + 350292805652126, + 21888242871839275222246405745257275088548364400416034343698203802870243560270, + 164114093877686, + 21888242871839275222246405745257275088548364400416034343698204125684463517833, + 383934482333498, + 21888242871839275222246405745257275088548364400416034343698203783458593690623, + 90937921726073, + 234074055612988, + 21888242871839275222246405745257275088548364400416034343698203851436039575431, + 21888242871839275222246405745257275088548364400416034343698203855584058916383, + 21888242871839275222246405745257275088548364400416034343698204150951850247552, + 99538021344094, + 36708477343830, + 166853147589646, + 21888242871839275222246405745257275088548364400416034343698204077893113299977, + 446217719526499, + 56864550334794, + 106578087761746, + 21888242871839275222246405745257275088548364400416034343698204184425912276633, + 413743534675189, + 21888242871839275222246405745257275088548364400416034343698204020173332536109, + 21888242871839275222246405745257275088548364400416034343698203966285052265748, + 487424273709694, + 504263880667827, + 546672745574653, + 21888242871839275222246405745257275088548364400416034343698203863683626142106, + 424454838746675, + 21888242871839275222246405745257275088548364400416034343698203863760505971631, + 267818739914051, + 21888242871839275222246405745257275088548364400416034343698203820824589083095, + 98615561627791, + 441822181375956, + 21888242871839275222246405745257275088548364400416034343698203665292183260219, + 410282819734804, + 21888242871839275222246405745257275088548364400416034343698203900407749425194, + 21888242871839275222246405745257275088548364400416034343698203927281967714921, + 280470155339633, + 21888242871839275222246405745257275088548364400416034343698203982971698125757, + 21888242871839275222246405745257275088548364400416034343698204031794845634222, + 21888242871839275222246405745257275088548364400416034343698204050201179029875, + 346429785599793, + 21888242871839275222246405745257275088548364400416034343698204025924078286067, + 514319649209989, + 235243627975191, + 118111842538211, + 321149137835723, + 21888242871839275222246405745257275088548364400416034343698204113353863179058, + 38083950292504, + 133393556182942, + 21888242871839275222246405745257275088548364400416034343698204077860438554422, + 21888242871839275222246405745257275088548364400416034343698203650615886945021, + 21888242871839275222246405745257275088548364400416034343698204113774227247274, + 333275824397057, + 21888242871839275222246405745257275088548364400416034343698204001266267579055, + 152602550463051, + 21888242871839275222246405745257275088548364400416034343698203749173448536883, + 21888242871839275222246405745257275088548364400416034343698203748696608616584, + 149045352150713, + 159385969616519, + 220922505675852, + 21888242871839275222246405745257275088548364400416034343698203759478518336772, + 21888242871839275222246405745257275088548364400416034343698204138894955820536, + 326980883815477, + 21888242871839275222246405745257275088548364400416034343698203762407130460321, + 21888242871839275222246405745257275088548364400416034343698203834768225160274, + 21888242871839275222246405745257275088548364400416034343698204071258936529441, + 21888242871839275222246405745257275088548364400416034343698203816344520291053, + 21888242871839275222246405745257275088548364400416034343698203711912945373719, + 506481541559900, + 21888242871839275222246405745257275088548364400416034343698203966375176351013, + 319145220826433, + 363379156812502, + 21888242871839275222246405745257275088548364400416034343698203992983353637600, + 21888242871839275222246405745257275088548364400416034343698203779626953756816, + 21888242871839275222246405745257275088548364400416034343698203756682947751965, + 21888242871839275222246405745257275088548364400416034343698203781726605824666, + 21888242871839275222246405745257275088548364400416034343698203682096821960946, + 21888242871839275222246405745257275088548364400416034343698203811462713556746, + 59606288099527, + 21888242871839275222246405745257275088548364400416034343698203809801160075135, + 21888242871839275222246405745257275088548364400416034343698203795077634115524, + 21888242871839275222246405745257275088548364400416034343698204037118369312832, + 21888242871839275222246405745257275088548364400416034343698203705205836477953, + 123477449891094, + 21888242871839275222246405745257275088548364400416034343698204029718044007296, + 415669063956190, + 21888242871839275222246405745257275088548364400416034343698204003211046095627, + 129177020502912, + 407727621291797, + 109106912741664, + 21888242871839275222246405745257275088548364400416034343698204075402493904474, + 321532822270902, + 469258651137069, + 249450550539694, + 21888242871839275222246405745257275088548364400416034343698204094612306164870, + 21888242871839275222246405745257275088548364400416034343698203769685664336728, + 21888242871839275222246405745257275088548364400416034343698204087021224337706, + 21888242871839275222246405745257275088548364400416034343698203935012021064846, + 21888242871839275222246405745257275088548364400416034343698203820692753800132, + 21888242871839275222246405745257275088548364400416034343698203931062768371425, + 21888242871839275222246405745257275088548364400416034343698203715464452050847, + 21888242871839275222246405745257275088548364400416034343698203786476199792887, + 21888242871839275222246405745257275088548364400416034343698204119908046117676, + 350059164600110, + 21888242871839275222246405745257275088548364400416034343698203932787547296026, + 433003907403893, + 27144143792372, + 252255846425742, + 21888242871839275222246405745257275088548364400416034343698204053479213612717, + 388169670553011, + 284021384947946, + 21888242871839275222246405745257275088548364400416034343698203981075640677983, + 389976706730509, + 517097545946332, + 85396878445814, + 181274843053398, + 21888242871839275222246405745257275088548364400416034343698203981635312742968, + 495046098411413, + 153856429089224, + 355269476928437, + 21888242871839275222246405745257275088548364400416034343698204155360969457922, + 21888242871839275222246405745257275088548364400416034343698203702136312234806, + 21888242871839275222246405745257275088548364400416034343698203946227657686882, + 21888242871839275222246405745257275088548364400416034343698204045310609392912, + 237566938011733, + 21888242871839275222246405745257275088548364400416034343698203894081868698964, + 21888242871839275222246405745257275088548364400416034343698203677564154225471, + 303026810537811, + 296267446884694, + 21888242871839275222246405745257275088548364400416034343698203650082887791875, + 21888242871839275222246405745257275088548364400416034343698204091206484216519, + 115047747302779, + 76217146048930, + 21888242871839275222246405745257275088548364400416034343698204092814120767667, + 44179664757296, + 36959686084870, + 453250828188047, + 89555448902100, + 21888242871839275222246405745257275088548364400416034343698203683311601974528, + 545838559061222, + 21888242871839275222246405745257275088548364400416034343698204133040542878342, + 21888242871839275222246405745257275088548364400416034343698204179831908443381, + 21888242871839275222246405745257275088548364400416034343698203947752419351909, + 345300976120309, + 290102709969617, + 21888242871839275222246405745257275088548364400416034343698203863633227495014, + 439571805961378, + 21888242871839275222246405745257275088548364400416034343698203888992652695315, + 91027646228814, + 200170987542876, + 489655133448483, + 21888242871839275222246405745257275088548364400416034343698204104719674713283, + 242915798444729, + 21888242871839275222246405745257275088548364400416034343698203866890015854187, + 34253011241303, + 36041095695042, + 529529907092878, + 21888242871839275222246405745257275088548364400416034343698203995752720988339, + 254588874565114, + 21888242871839275222246405745257275088548364400416034343698204014216496988729, + 21888242871839275222246405745257275088548364400416034343698203808910484163577, + 218229169248592, + 21888242871839275222246405745257275088548364400416034343698204128031582273498, + 21888242871839275222246405745257275088548364400416034343698204056881323804098, + 21888242871839275222246405745257275088548364400416034343698203670460878477104, + 21888242871839275222246405745257275088548364400416034343698204076140458391019, + 21888242871839275222246405745257275088548364400416034343698203677506657579873, + 234308851999702, + 434428105566281, + 38668888143530, + 21888242871839275222246405745257275088548364400416034343698203792131505874003, + 462352949729295, + 21888242871839275222246405745257275088548364400416034343698204143665199090297, + 21888242871839275222246405745257275088548364400416034343698204003565866924493, + 21888242871839275222246405745257275088548364400416034343698203691417619651464, + 303515894374380, + 123929688112906, + 21888242871839275222246405745257275088548364400416034343698204155728308397389, + 21888242871839275222246405745257275088548364400416034343698203844061643773961, + 285314814206465, + 21888242871839275222246405745257275088548364400416034343698203640057585595434, + 436880991448814, + 21888242871839275222246405745257275088548364400416034343698204133036311836930, + 21888242871839275222246405745257275088548364400416034343698203639788640909467, + 185528401898437, + 491466196832629, + 21888242871839275222246405745257275088548364400416034343698203804489559432205, + 21888242871839275222246405745257275088548364400416034343698203691536632820229, + 21888242871839275222246405745257275088548364400416034343698203637859913644632, + 225480726871846, + 498557973499890, + 21888242871839275222246405745257275088548364400416034343698203814549613911468, + 379971316827372, + 21888242871839275222246405745257275088548364400416034343698204158227756055699, + 60326256883922, + 21888242871839275222246405745257275088548364400416034343698204120345667857274, + 150925850514834, + 75340496381158, + 21888242871839275222246405745257275088548364400416034343698204077131441193198, + 485310945520276, + 21888242871839275222246405745257275088548364400416034343698203852095066795117, + 21888242871839275222246405745257275088548364400416034343698203957990954039951, + 21888242871839275222246405745257275088548364400416034343698203716565230326834, + 21888242871839275222246405745257275088548364400416034343698203966708193507022, + 21888242871839275222246405745257275088548364400416034343698204160063699450539, + 21888242871839275222246405745257275088548364400416034343698203858189035305399, + 541073087679338, + 420888718968588, + 21888242871839275222246405745257275088548364400416034343698203674102341721460, + 550057992986889, + 21888242871839275222246405745257275088548364400416034343698204045900046539806, + 21888242871839275222246405745257275088548364400416034343698204017220434552947, + 302979268573497, + 21888242871839275222246405745257275088548364400416034343698204177949643700211, + 428270356551138, + 21888242871839275222246405745257275088548364400416034343698204011826470439326, + 530577629743311, + 21888242871839275222246405745257275088548364400416034343698204114391480613451, + 446780823729843, + 238537755502652, + 21888242871839275222246405745257275088548364400416034343698203671548785726821, + 21888242871839275222246405745257275088548364400416034343698203950524290662232, + 21888242871839275222246405745257275088548364400416034343698203639484437837455, + 21888242871839275222246405745257275088548364400416034343698203810520855608471, + 21888242871839275222246405745257275088548364400416034343698204116761081626430, + 544713793697063, + 21888242871839275222246405745257275088548364400416034343698204123858037456394, + 21888242871839275222246405745257275088548364400416034343698203712637875727189, + 68404705407694, + 99479550537595, + 4349545261771, + 463101265295393, + 21888242871839275222246405745257275088548364400416034343698203861449307150480, + 21888242871839275222246405745257275088548364400416034343698203651063536718553, + 522091958188340, + 21888242871839275222246405745257275088548364400416034343698203804717516625161, + 21888242871839275222246405745257275088548364400416034343698203833838686113673, + 302565730392172, + 98733340176042, + 21888242871839275222246405745257275088548364400416034343698203928628731159110, + 21888242871839275222246405745257275088548364400416034343698203807415101030850, + 178733548267872, + 21888242871839275222246405745257275088548364400416034343698203889052282594865, + 21888242871839275222246405745257275088548364400416034343698203925331873663600, + 380207632025679, + 21888242871839275222246405745257275088548364400416034343698203961023570620214, + 450192044434971, + 406386180348017, + 21888242871839275222246405745257275088548364400416034343698203730449397100359, + 136480918894927, + 509242594372708, + 21888242871839275222246405745257275088548364400416034343698203847400902222062, + 21888242871839275222246405745257275088548364400416034343698204179939014013110, + 109915098320350, + 315383019452081, + 21888242871839275222246405745257275088548364400416034343698203731613681247846, + 217383561041804, + 500100265871614, + 21888242871839275222246405745257275088548364400416034343698204184693164387015, + 21888242871839275222246405745257275088548364400416034343698204065617136732162, + 273415595973147, + 405595530261745, + 550864187172339, + 218508714510072, + 530182658155457, + 21888242871839275222246405745257275088548364400416034343698203835729498720979, + 21888242871839275222246405745257275088548364400416034343698203752307842913676, + 21888242871839275222246405745257275088548364400416034343698204025074827635982, + 21888242871839275222246405745257275088548364400416034343698204016765718967343, + 21888242871839275222246405745257275088548364400416034343698203706420263211375, + 21888242871839275222246405745257275088548364400416034343698203910857874998867, + 21888242871839275222246405745257275088548364400416034343698204076782923549034, + 21888242871839275222246405745257275088548364400416034343698203823296566314726, + 21888242871839275222246405745257275088548364400416034343698203895799484315489, + 21888242871839275222246405745257275088548364400416034343698204082041323471054, + 231311125149257, + 114310185087546, + 134174462521205, + 395288223644641, + 392210980569519, + 6745223500521, + 21888242871839275222246405745257275088548364400416034343698204118956112298381, + 235826822414080, + 358263433414806, + 499831412370215, + 542015881859819, + 368238746450968, + 9606861142005, + 135032494638002, + 242236185556114, + 21888242871839275222246405745257275088548364400416034343698203935711553756654, + 440799802858453, + 136263472289666, + 21888242871839275222246405745257275088548364400416034343698203904039712405497, + 23034329021929, + 356797954687130, + 21888242871839275222246405745257275088548364400416034343698203717916181898228, + 96962772040420, + 412302079554915, + 21888242871839275222246405745257275088548364400416034343698204061399452455752, + 484760787255261, + 21888242871839275222246405745257275088548364400416034343698204022783436282986, + 21888242871839275222246405745257275088548364400416034343698203733523011064653, + 21888242871839275222246405745257275088548364400416034343698204109830123637441, + 351377198867170, + 317096395695387, + 178643138977491, + 561332493321060, + 21888242871839275222246405745257275088548364400416034343698203814823373793421, + 4480403403003, + 365379204469216, + 183805646923514, + 275240314399034, + 262867745066493, + 74032024702483, + 21888242871839275222246405745257275088548364400416034343698203771189727463363, + 464312081704482, + 186171022389153, + 21888242871839275222246405745257275088548364400416034343698203746667405751718, + 21888242871839275222246405745257275088548364400416034343698203812087855860949, + 81996593294312, + 21888242871839275222246405745257275088548364400416034343698203774053431479985, + 21888242871839275222246405745257275088548364400416034343698203959368442080311, + 222418683099444, + 21888242871839275222246405745257275088548364400416034343698203886884987961308, + 21888242871839275222246405745257275088548364400416034343698203763046206094245, + 21888242871839275222246405745257275088548364400416034343698204152249188039915, + 342659972309946, + 309143878286862, + 21888242871839275222246405745257275088548364400416034343698203714024862688820, + 275815118790432, + 350451277389838, + 21888242871839275222246405745257275088548364400416034343698204056102047571613, + 21888242871839275222246405745257275088548364400416034343698204141559634316078, + 374408966766471, + 21888242871839275222246405745257275088548364400416034343698204056080044520745, + 21888242871839275222246405745257275088548364400416034343698203805257403715528, + 150921645378535, + 21888242871839275222246405745257275088548364400416034343698204009741178943553, + 29433212726802, + 260588692946098, + 370904142460655, + 218695771539900, + 80113912555676, + 434650748553809, + 107144566273524, + 28906034173017, + 31381570668838, + 21888242871839275222246405745257275088548364400416034343698203694302696168005, + 21888242871839275222246405745257275088548364400416034343698203916486726434867, + 168858070702730, + 21888242871839275222246405745257275088548364400416034343698204170616607001847, + 21888242871839275222246405745257275088548364400416034343698204161898277273139, + 329633012354430, + 230915577896305, + 21888242871839275222246405745257275088548364400416034343698203909014169520157, + 393587183122348, + 423592521750161, + 513574379488820, + 21888242871839275222246405745257275088548364400416034343698204105075637939933, + 395793252329630, + 273212640946115, + 21888242871839275222246405745257275088548364400416034343698203686148923624120, + 21888242871839275222246405745257275088548364400416034343698203691288991367938, + 477985414724324, + 542114488764784, + 21888242871839275222246405745257275088548364400416034343698203990148124421660, + 28734948226169, + 116647242533977, + 21888242871839275222246405745257275088548364400416034343698203949608073138821, + 304942819468067, + 21888242871839275222246405745257275088548364400416034343698203669114096695738, + 220475570155354, + 74731367456080, + 21888242871839275222246405745257275088548364400416034343698203835296001508483, + 62995517970080, + 526616325866092, + 21888242871839275222246405745257275088548364400416034343698203894023097421628, + 21888242871839275222246405745257275088548364400416034343698204006021802485629, + 21888242871839275222246405745257275088548364400416034343698203716789573559861, + 311787131286567, + 21888242871839275222246405745257275088548364400416034343698204011389312966694, + 393966254886378, + 191080034204046, + 21888242871839275222246405745257275088548364400416034343698203727407130900060, + 96148969760324, + 21888242871839275222246405745257275088548364400416034343698203658443212080352, + 20082576706829, + 227528018598530, + 521155070961701, + 304967075590143, + 21888242871839275222246405745257275088548364400416034343698203970837497419083, + 21888242871839275222246405745257275088548364400416034343698204166006107399252, + 153927447301779, + 21888242871839275222246405745257275088548364400416034343698204086195659798035, + 21888242871839275222246405745257275088548364400416034343698203837815365472968, + 397197993079299, + 21888242871839275222246405745257275088548364400416034343698203911475160711985, + 21888242871839275222246405745257275088548364400416034343698204127809822637557, + 381433766958924, + 209460085119745, + 42994992315735, + 21888242871839275222246405745257275088548364400416034343698203749861867297960, + 21888242871839275222246405745257275088548364400416034343698203634346006197988, + 21888242871839275222246405745257275088548364400416034343698203861421956179265, + 494805493700881, + 109753233219088, + 154710773574305, + 21888242871839275222246405745257275088548364400416034343698204162169525663725, + 49161630097204, + 166994347579538, + 21888242871839275222246405745257275088548364400416034343698204102923898891197, + 467024799211068, + 144874141723051, + 268886585251520, + 21888242871839275222246405745257275088548364400416034343698204177132498290384, + 21888242871839275222246405745257275088548364400416034343698204109562921094642, + 17844386022577, + 178324372432275, + 21888242871839275222246405745257275088548364400416034343698204044176085369440, + 437315736953873, + 21888242871839275222246405745257275088548364400416034343698204118480515586953, + 94246742801156, + 21888242871839275222246405745257275088548364400416034343698203960607479778516, + 21888242871839275222246405745257275088548364400416034343698204091080393626519, + 104617548218086, + 527827842965082, + 21888242871839275222246405745257275088548364400416034343698203934622989301145, + 303283295876368, + 172439505774728, + 21888242871839275222246405745257275088548364400416034343698203875866702266296, + 21888242871839275222246405745257275088548364400416034343698203979526828595129, + 19655415960617, + 21888242871839275222246405745257275088548364400416034343698203702611698218207, + 344728493636863, + 21888242871839275222246405745257275088548364400416034343698204081426004890435, + 21888242871839275222246405745257275088548364400416034343698203943868990212116, + 21888242871839275222246405745257275088548364400416034343698203871943087040216, + 308051302664308, + 11910343196601, + 21888242871839275222246405745257275088548364400416034343698203937487954528170, + 535600019107587, + 228827103609237, + 393957914178931, + 21888242871839275222246405745257275088548364400416034343698204087839420211532, + 68160135741369, + 202900768236241, + 21888242871839275222246405745257275088548364400416034343698204120392525835211, + 21888242871839275222246405745257275088548364400416034343698203763477936130609, + 21888242871839275222246405745257275088548364400416034343698203924880173359550, + 21888242871839275222246405745257275088548364400416034343698204044912845214428, + 21888242871839275222246405745257275088548364400416034343698204036311215185440, + 21888242871839275222246405745257275088548364400416034343698204160571738529778, + 21888242871839275222246405745257275088548364400416034343698203835069564185685, + 336945924582400, + 21888242871839275222246405745257275088548364400416034343698203646444617610563, + 314130277223109, + 164505689546311, + 220273968423456, + 93160806236073, + 21888242871839275222246405745257275088548364400416034343698203712972062056639, + 21888242871839275222246405745257275088548364400416034343698204175287695743621, + 21888242871839275222246405745257275088548364400416034343698203824899437047373, + 509650052261300, + 21888242871839275222246405745257275088548364400416034343698204141523026644257, + 21888242871839275222246405745257275088548364400416034343698203691147717944118, + 479956712151198, + 132767247050260, + 21888242871839275222246405745257275088548364400416034343698203633292856683047, + 543223576664229, + 245068124174957, + 338645036193056, + 265453861583641, + 21888242871839275222246405745257275088548364400416034343698203964749034529286, + 21888242871839275222246405745257275088548364400416034343698203794719738584666, + 460179857400436, + 118406866199415, + 21888242871839275222246405745257275088548364400416034343698203801093279842486, + 21888242871839275222246405745257275088548364400416034343698203702785537392723, + 242770359886250, + 21888242871839275222246405745257275088548364400416034343698204021577308476651, + 21888242871839275222246405745257275088548364400416034343698204106495687493771, + 269136982268960, + 21888242871839275222246405745257275088548364400416034343698204139540162144817, + 561485460982805, + 112464570439984, + 396947283165373, + 21888242871839275222246405745257275088548364400416034343698203642500252726970, + 21888242871839275222246405745257275088548364400416034343698203852300283033974, + 181531739635558, + 21888242871839275222246405745257275088548364400416034343698203950249163607947, + 427988793492689, + 21888242871839275222246405745257275088548364400416034343698204143057879080949, + 21888242871839275222246405745257275088548364400416034343698203901220366746145, + 21888242871839275222246405745257275088548364400416034343698204008424017840450, + 21888242871839275222246405745257275088548364400416034343698203912977634414428, + 21888242871839275222246405745257275088548364400416034343698204066449254246186, + 21888242871839275222246405745257275088548364400416034343698204060025416736587, + 509150129118508, + 61572855089276, + 21888242871839275222246405745257275088548364400416034343698204126657533997876, + 21888242871839275222246405745257275088548364400416034343698203956684060833914, + 21888242871839275222246405745257275088548364400416034343698203689121951778646, + 293313847903624, + 29698075518296, + 340082598529052, + 177455140614966, + 21888242871839275222246405745257275088548364400416034343698204097775099898828, + 216900100840476, + 21888242871839275222246405745257275088548364400416034343698204000319119983530, + 21888242871839275222246405745257275088548364400416034343698203630637816551002, + 314888484972003, + 109574618944347, + 21888242871839275222246405745257275088548364400416034343698203750148640936897, + 21888242871839275222246405745257275088548364400416034343698203840796822361580, + 208963469048879, + 402618247195661, + 21888242871839275222246405745257275088548364400416034343698203872482965200182, + 414004418796783, + 21888242871839275222246405745257275088548364400416034343698204083124873556526, + 21888242871839275222246405745257275088548364400416034343698203761653103214736, + 558686715037298, + 21888242871839275222246405745257275088548364400416034343698204048744173272964, + 21888242871839275222246405745257275088548364400416034343698203930982281592944, + 21888242871839275222246405745257275088548364400416034343698203869523936260682, + 21888242871839275222246405745257275088548364400416034343698203789932628713717, + 94601640860331, + 21888242871839275222246405745257275088548364400416034343698204142655347925497, + 21888242871839275222246405745257275088548364400416034343698203820128598614397, + 21888242871839275222246405745257275088548364400416034343698203722719428376617, + 21888242871839275222246405745257275088548364400416034343698203839840534381486, + 294334743524315, + 21888242871839275222246405745257275088548364400416034343698204066948668111561, + 409666584558817, + 21888242871839275222246405745257275088548364400416034343698203757897567910526, + 301404369100222, + 210982785499596, + 59737286733422, + 21888242871839275222246405745257275088548364400416034343698203886135940864202, + 21888242871839275222246405745257275088548364400416034343698204009345522264372, + 194845984413853, + 21888242871839275222246405745257275088548364400416034343698203988344960006209, + 21888242871839275222246405745257275088548364400416034343698204063287070199129, + 344356319045574, + 21888242871839275222246405745257275088548364400416034343698203650757418096903, + 282246994039536, + 355082055073431, + 327628986004135, + 21888242871839275222246405745257275088548364400416034343698203813948426947043, + 21888242871839275222246405745257275088548364400416034343698203655952940407452, + 21888242871839275222246405745257275088548364400416034343698203864193460688063, + 21888242871839275222246405745257275088548364400416034343698203742326505559055, + 21888242871839275222246405745257275088548364400416034343698203641246500419881, + 251035666664397, + 144472805354906, + 258741432556072, + 21888242871839275222246405745257275088548364400416034343698203994363633960195, + 21888242871839275222246405745257275088548364400416034343698203759371307146077, + 466931150092381, + 21888242871839275222246405745257275088548364400416034343698203641571519761200, + 21888242871839275222246405745257275088548364400416034343698203943461031520577, + 21888242871839275222246405745257275088548364400416034343698203626971861495964, + 21888242871839275222246405745257275088548364400416034343698203721690190752314, + 21888242871839275222246405745257275088548364400416034343698204113907236349569, + 21888242871839275222246405745257275088548364400416034343698203900126714004827, + 453022106124429, + 21888242871839275222246405745257275088548364400416034343698203708014991471488, + 21888242871839275222246405745257275088548364400416034343698204050550479109631, + 364217711033109, + 333023099404068, + 229618876988708, + 21888242871839275222246405745257275088548364400416034343698203916094260311572, + 529586181490021, + 21888242871839275222246405745257275088548364400416034343698204104129217757440, + 492476038564419, + 21888242871839275222246405745257275088548364400416034343698204091616886711593, + 208146793072470, + 21888242871839275222246405745257275088548364400416034343698203686382547376613, + 21888242871839275222246405745257275088548364400416034343698203784475668843680, + 21888242871839275222246405745257275088548364400416034343698203725326442659152, + 557095193573469, + 244631531831146, + 21888242871839275222246405745257275088548364400416034343698203962552263818042, + 21888242871839275222246405745257275088548364400416034343698203918362679149808, + 12180091642949, + 21888242871839275222246405745257275088548364400416034343698203959851406014796, + 21888242871839275222246405745257275088548364400416034343698203941672405541363, + 223765086631808, + 21888242871839275222246405745257275088548364400416034343698204130113637231875, + 131154416655795, + 21888242871839275222246405745257275088548364400416034343698203752142527456137, + 52889287287564, + 466380456287191, + 21888242871839275222246405745257275088548364400416034343698204029435487707347, + 557577112010470, + 21888242871839275222246405745257275088548364400416034343698204009992767752615, + 21888242871839275222246405745257275088548364400416034343698203902428214658900, + 471667217980881, + 205582024705740, + 302251283790817, + 21888242871839275222246405745257275088548364400416034343698203742262777560657, + 514851178511521, + 21888242871839275222246405745257275088548364400416034343698204173987458654969, + 129389105697898, + 21888242871839275222246405745257275088548364400416034343698203701760033747969, + 21888242871839275222246405745257275088548364400416034343698203957666759271680, + 206148943955555, + 495500794701385, + 23034500172588, + 21888242871839275222246405745257275088548364400416034343698204057118458084494, + 21888242871839275222246405745257275088548364400416034343698204110195043469329, + 173470142331336, + 21888242871839275222246405745257275088548364400416034343698203996237309013232, + 21888242871839275222246405745257275088548364400416034343698203755293094874928, + 413477061349413, + 21888242871839275222246405745257275088548364400416034343698203914654613177963, + 337449340794974, + 21888242871839275222246405745257275088548364400416034343698204127601093230713, + 75742712508105, + 21888242871839275222246405745257275088548364400416034343698203829732969041726, + 21888242871839275222246405745257275088548364400416034343698204168633219836309, + 21888242871839275222246405745257275088548364400416034343698203863128732899716, + 55649509528566, + 21888242871839275222246405745257275088548364400416034343698203698085620743989, + 125112606118583, + 21888242871839275222246405745257275088548364400416034343698204070475054282974, + 21888242871839275222246405745257275088548364400416034343698203757922215742936, + 483269915768084, + 21888242871839275222246405745257275088548364400416034343698203979605364695365, + 333842072535278, + 21888242871839275222246405745257275088548364400416034343698204171124039248423, + 536461947962004, + 196695156807769, + 21888242871839275222246405745257275088548364400416034343698203647402719020611, + 21888242871839275222246405745257275088548364400416034343698203985037180901295, + 411293679941112, + 228555150392939, + 21888242871839275222246405745257275088548364400416034343698203780591824830140, + 21888242871839275222246405745257275088548364400416034343698203909625003769001, + 193332890668570, + 21888242871839275222246405745257275088548364400416034343698203659747393323907, + 21888242871839275222246405745257275088548364400416034343698204063045143484168, + 21888242871839275222246405745257275088548364400416034343698203685745157456245, + 317799139215522, + 545294630814450, + 315488610599181, + 21888242871839275222246405745257275088548364400416034343698203863515187804283, + 11921574328784, + 225972590119746, + 415347907438159, + 21888242871839275222246405745257275088548364400416034343698203967639419326284, + 95054765773506, + 288690816211506, + 269920582350889, + 43896267521926, + 560054968805907, + 495689193239687, + 305030620394960, + 245591857940775, + 21888242871839275222246405745257275088548364400416034343698204075494325804030, + 21888242871839275222246405745257275088548364400416034343698203870227065251222, + 401526264060940, + 21888242871839275222246405745257275088548364400416034343698203975108205388120, + 21888242871839275222246405745257275088548364400416034343698204035330475032349, + 21888242871839275222246405745257275088548364400416034343698203819341647451479, + 21888242871839275222246405745257275088548364400416034343698204097208323938371, + 21888242871839275222246405745257275088548364400416034343698203797682952137421, + 192019706281272, + 21888242871839275222246405745257275088548364400416034343698204074775510303309, + 418738435056383, + 21888242871839275222246405745257275088548364400416034343698203672305378829147, + 21888242871839275222246405745257275088548364400416034343698203701682037827408, + 21888242871839275222246405745257275088548364400416034343698203795384477054045, + 21888242871839275222246405745257275088548364400416034343698203964870072274805, + 21888242871839275222246405745257275088548364400416034343698204034009671343008, + 21888242871839275222246405745257275088548364400416034343698203755483801176176, + 21888242871839275222246405745257275088548364400416034343698204140918884529653, + 349473951131446, + 21888242871839275222246405745257275088548364400416034343698203773085664577793, + 497097147567750, + 331048417741255, + 21888242871839275222246405745257275088548364400416034343698203833087812958707, + 21888242871839275222246405745257275088548364400416034343698203772576773606032, + 21888242871839275222246405745257275088548364400416034343698203949422880023743, + 549191672039958, + 21888242871839275222246405745257275088548364400416034343698203631857003605136, + 263644749114355, + 21888242871839275222246405745257275088548364400416034343698203889379596376181, + 531951204990863, + 21888242871839275222246405745257275088548364400416034343698203968353996731984, + 265533603482260, + 21888242871839275222246405745257275088548364400416034343698203705052485840947, + 131917752583269, + 141765037505337, + 21888242871839275222246405745257275088548364400416034343698204096891926614015, + 21888242871839275222246405745257275088548364400416034343698203815696251959263, + 21888242871839275222246405745257275088548364400416034343698203727695055106539, + 431772822092539, + 21888242871839275222246405745257275088548364400416034343698203669524408442744, + 171443858850035, + 318927635380711, + 56267414736040, + 26093992666917, + 353297995142100, + 53992945994567, + 21888242871839275222246405745257275088548364400416034343698203787495733885350, + 21888242871839275222246405745257275088548364400416034343698203968433382786182, + 21888242871839275222246405745257275088548364400416034343698203649790891653956, + 21888242871839275222246405745257275088548364400416034343698204115462996709960, + 21888242871839275222246405745257275088548364400416034343698203999098512207698, + 470788562762672, + 116448123000060, + 446708182342620, + 21888242871839275222246405745257275088548364400416034343698204005472162151225, + 50513484749495, + 237227206352169, + 21888242871839275222246405745257275088548364400416034343698203984572912186402, + 21888242871839275222246405745257275088548364400416034343698203896096234155803, + 21888242871839275222246405745257275088548364400416034343698204005642022890472, + 492425035203706, + 21888242871839275222246405745257275088548364400416034343698203701966130875655, + 21888242871839275222246405745257275088548364400416034343698203923484160336763, + 21888242871839275222246405745257275088548364400416034343698203767469961577436, + 211772816145906, + 225719499809334, + 21888242871839275222246405745257275088548364400416034343698204061582720683946, + 379998081348726, + 481889309109335, + 379313641985444, + 21888242871839275222246405745257275088548364400416034343698204160557786256957, + 121777123610335, + 21888242871839275222246405745257275088548364400416034343698203816204842722157, + 21888242871839275222246405745257275088548364400416034343698204059768341358192, + 21888242871839275222246405745257275088548364400416034343698203728294524079933, + 322132896249214, + 21888242871839275222246405745257275088548364400416034343698204124389192773100, + 21888242871839275222246405745257275088548364400416034343698203889486630870958, + 21888242871839275222246405745257275088548364400416034343698203934461270161215, + 509235089542511, + 300307949691022, + 21888242871839275222246405745257275088548364400416034343698203789821119799055, + 21888242871839275222246405745257275088548364400416034343698203648108132842647, + 139497832755578, + 493372853294776, + 21888242871839275222246405745257275088548364400416034343698203983704478075459, + 308517964286533, + 21888242871839275222246405745257275088548364400416034343698203851552730766117, + 21888242871839275222246405745257275088548364400416034343698203930644983496167, + 21888242871839275222246405745257275088548364400416034343698204095523023391194, + 21888242871839275222246405745257275088548364400416034343698203892729822342824, + 434465575409643, + 21888242871839275222246405745257275088548364400416034343698203866125542046603, + 229866310149186, + 21888242871839275222246405745257275088548364400416034343698203681699944998950, + 153718042219350, + 21888242871839275222246405745257275088548364400416034343698204105631613614930, + 21888242871839275222246405745257275088548364400416034343698203717400637347952, + 185713425619115, + 223366007223466, + 21888242871839275222246405745257275088548364400416034343698203734584314046631, + 184045886848130, + 514012070078971, + 21888242871839275222246405745257275088548364400416034343698203727144913113723, + 21888242871839275222246405745257275088548364400416034343698204083121481492466, + 349263032214257, + 532826036484143, + 21888242871839275222246405745257275088548364400416034343698204133435398633721, + 327087245426392, + 433515465692094, + 370485043374671, + 21888242871839275222246405745257275088548364400416034343698204083693237169061, + 21888242871839275222246405745257275088548364400416034343698203714003192535311, + 21888242871839275222246405745257275088548364400416034343698203980101893291409, + 21888242871839275222246405745257275088548364400416034343698203865173224026554, + 376774641103755, + 445330814430238, + 121486892499435, + 21888242871839275222246405745257275088548364400416034343698203766763599892621, + 77565589338310, + 21888242871839275222246405745257275088548364400416034343698204096505876608681, + 21888242871839275222246405745257275088548364400416034343698203920271249830370, + 21888242871839275222246405745257275088548364400416034343698203929895196002290, + 21888242871839275222246405745257275088548364400416034343698203668429714838422, + 21888242871839275222246405745257275088548364400416034343698204096156208967425, + 99443709016499, + 20882443192448, + 369318066324361, + 97007084379402, + 297385605361740, + 21888242871839275222246405745257275088548364400416034343698203781606589231137, + 21888242871839275222246405745257275088548364400416034343698203770504751158239, + 21888242871839275222246405745257275088548364400416034343698204140870550407925, + 21888242871839275222246405745257275088548364400416034343698204150581575811657, + 188270296484422, + 64102987022130, + 21888242871839275222246405745257275088548364400416034343698204047900660525943, + 480027482406575, + 21888242871839275222246405745257275088548364400416034343698203714273486730271, + 21888242871839275222246405745257275088548364400416034343698204055124360382356, + 553615458549354, + 21888242871839275222246405745257275088548364400416034343698204037109843110453, + 21888242871839275222246405745257275088548364400416034343698203824417155586782, + 21888242871839275222246405745257275088548364400416034343698203928707538207028, + 21888242871839275222246405745257275088548364400416034343698204133229145180964, + 512576102016778, + 21888242871839275222246405745257275088548364400416034343698203892255227778224, + 21888242871839275222246405745257275088548364400416034343698203966505764577667, + 21888242871839275222246405745257275088548364400416034343698204141472852448037, + 278637760586031, + 20881255576484, + 365430575509445, + 21888242871839275222246405745257275088548364400416034343698204094892465714146, + 21888242871839275222246405745257275088548364400416034343698203860220052317946, + 406990484780965, + 21888242871839275222246405745257275088548364400416034343698203690865266315319, + 353775243660405, + 11570146842769, + 317561279526633, + 501565926483429, + 177983995232449, + 141193570938007, + 364499257467301, + 406743294221847, + 288346711738911, + 125221989898972, + 21888242871839275222246405745257275088548364400416034343698204034218073172526, + 276425101084176, + 61514038238512, + 21888242871839275222246405745257275088548364400416034343698203773470618385906, + 135476560203699, + 481240858598522, + 468443630367908, + 307640006658100, + 21888242871839275222246405745257275088548364400416034343698203652660457961093, + 497940665862159, + 21888242871839275222246405745257275088548364400416034343698203712858257378165, + 251421194188996, + 21888242871839275222246405745257275088548364400416034343698203831173204851464, + 203206477465574, + 21888242871839275222246405745257275088548364400416034343698203986941218741572, + 21888242871839275222246405745257275088548364400416034343698203996969016848167, + 21888242871839275222246405745257275088548364400416034343698203648330817080653, + 268073412461394, + 205974374829168, + 21888242871839275222246405745257275088548364400416034343698204100839226978112, + 184490549735076, + 334424235405679, + 132541482073523, + 21888242871839275222246405745257275088548364400416034343698203820005827536281, + 21888242871839275222246405745257275088548364400416034343698203793329349895960, + 21888242871839275222246405745257275088548364400416034343698204062760529883427, + 196179218626274, + 21888242871839275222246405745257275088548364400416034343698203658246088319627, + 21888242871839275222246405745257275088548364400416034343698203643475139309919, + 21888242871839275222246405745257275088548364400416034343698204062882225664655, + 21888242871839275222246405745257275088548364400416034343698203917097129030049, + 398304665681330, + 21888242871839275222246405745257275088548364400416034343698203946097907593421, + 21888242871839275222246405745257275088548364400416034343698204168636835498051, + 378752601746118, + 21888242871839275222246405745257275088548364400416034343698203886678075923108, + 21888242871839275222246405745257275088548364400416034343698204010516520073404, + 536871568782684, + 21888242871839275222246405745257275088548364400416034343698204062388617067513, + 532398084820495, + 21888242871839275222246405745257275088548364400416034343698204056582158681830, + 21888242871839275222246405745257275088548364400416034343698203707622771837094, + 21888242871839275222246405745257275088548364400416034343698204132538558591326, + 448347509092546, + 21888242871839275222246405745257275088548364400416034343698203901870235631079, + 21888242871839275222246405745257275088548364400416034343698203777485018194940, + 21888242871839275222246405745257275088548364400416034343698203745098212605076, + 176035061021269, + 478216283969872, + 21888242871839275222246405745257275088548364400416034343698204173954379981208, + 17648594994404, + 412903919498531, + 21888242871839275222246405745257275088548364400416034343698203726910396576951, + 21888242871839275222246405745257275088548364400416034343698203646529815210862, + 21888242871839275222246405745257275088548364400416034343698203958809414021212, + 527977223313671, + 256295589711197, + 273506766247331, + 21888242871839275222246405745257275088548364400416034343698203848918313020608, + 283583149252176, + 21888242871839275222246405745257275088548364400416034343698204153238637481475, + 21888242871839275222246405745257275088548364400416034343698204000456342029174, + 21888242871839275222246405745257275088548364400416034343698203811224810288310, + 21888242871839275222246405745257275088548364400416034343698203655876731424638, + 270788946047532, + 21888242871839275222246405745257275088548364400416034343698204120936489709821, + 273294294807229, + 142354613197300, + 83928134088408, + 216891679011404, + 21888242871839275222246405745257275088548364400416034343698203752154891237172, + 21888242871839275222246405745257275088548364400416034343698203757670116452054, + 288867028250036, + 455560146643607, + 21888242871839275222246405745257275088548364400416034343698203787977963571410, + 97437944555394, + 289570721240276, + 21888242871839275222246405745257275088548364400416034343698204170259282731740, + 347364131824893, + 497101891385386, + 21888242871839275222246405745257275088548364400416034343698203746604928062904, + 21888242871839275222246405745257275088548364400416034343698203767108684568002, + 311644019007518, + 21888242871839275222246405745257275088548364400416034343698203988832183847195, + 21888242871839275222246405745257275088548364400416034343698203940495931498810, + 21888242871839275222246405745257275088548364400416034343698203681886009946833, + 21888242871839275222246405745257275088548364400416034343698204057629781205611, + 331376208928393, + 21888242871839275222246405745257275088548364400416034343698203643529375039161, + 306674612993736, + 21888242871839275222246405745257275088548364400416034343698203673761540309335, + 87175511021799, + 21888242871839275222246405745257275088548364400416034343698204121813939995446, + 21888242871839275222246405745257275088548364400416034343698203897100409662561, + 250756344925762, + 516304156011470, + 21888242871839275222246405745257275088548364400416034343698203808352452180539, + 21888242871839275222246405745257275088548364400416034343698203877238385675662, + 474742364344192, + 192999769409424, + 21888242871839275222246405745257275088548364400416034343698203997225492820474, + 21888242871839275222246405745257275088548364400416034343698204109861326843258, + 25726382425332, + 335116266295209, + 21888242871839275222246405745257275088548364400416034343698203893915751027923, + 21888242871839275222246405745257275088548364400416034343698203677087826139868, + 21888242871839275222246405745257275088548364400416034343698203698877775077612, + 235000925070182, + 21888242871839275222246405745257275088548364400416034343698203903025587925477, + 21888242871839275222246405745257275088548364400416034343698203953454800908933, + 21888242871839275222246405745257275088548364400416034343698203819544755625442, + 21888242871839275222246405745257275088548364400416034343698204116566375681307, + 475220731795569, + 21888242871839275222246405745257275088548364400416034343698203721880984916814, + 20090482472239, + 339035904819218, + 21888242871839275222246405745257275088548364400416034343698203883592011056243, + 319800538346834, + 21888242871839275222246405745257275088548364400416034343698203833881349947672, + 21888242871839275222246405745257275088548364400416034343698203682305903800668, + 252791884362151, + 1596022278959, + 106326663896282, + 435271544850936, + 128043081215514, + 482090252824311, + 21888242871839275222246405745257275088548364400416034343698203908385863681586, + 253979719463959, + 518197454183669, + 321617461838976, + 21888242871839275222246405745257275088548364400416034343698203841817772199789, + 21888242871839275222246405745257275088548364400416034343698204056522516793470, + 21888242871839275222246405745257275088548364400416034343698203712363599746797, + 70933833219224, + 346766972119234, + 21888242871839275222246405745257275088548364400416034343698203772348724966663, + 361040579138406, + 311727017203233, + 21888242871839275222246405745257275088548364400416034343698203816699032714279, + 21888242871839275222246405745257275088548364400416034343698203865480003705017, + 286459019447854, + 21888242871839275222246405745257275088548364400416034343698203702519102898186, + 459177297151807, + 422892723940734, + 413081499665466, + 92560282415536, + 73396075325416, + 101684099407127, + 21888242871839275222246405745257275088548364400416034343698203731595733870332, + 33861850588761, + 45447708564637, + 21888242871839275222246405745257275088548364400416034343698204154099293734431, + 489890648166863, + 467417732638128, + 21888242871839275222246405745257275088548364400416034343698203735457722836220, + 22985962789333, + 21888242871839275222246405745257275088548364400416034343698204110033415362040, + 422755309002605, + 502295331083759, + 56048577871156, + 21888242871839275222246405745257275088548364400416034343698204125675755311961, + 21888242871839275222246405745257275088548364400416034343698203703699638846956, + 21888242871839275222246405745257275088548364400416034343698203945587057384551, + 94999400898947, + 303502911673842, + 21888242871839275222246405745257275088548364400416034343698203699683005746956, + 217577730782578, + 21888242871839275222246405745257275088548364400416034343698203971460839035631, + 21888242871839275222246405745257275088548364400416034343698204153159686344986, + 21888242871839275222246405745257275088548364400416034343698204027995100026213, + 21888242871839275222246405745257275088548364400416034343698203635970012350166, + 21888242871839275222246405745257275088548364400416034343698204167825333681528, + 21888242871839275222246405745257275088548364400416034343698203709472359241239, + 498961065189909, + 21888242871839275222246405745257275088548364400416034343698203702471952825924, + 21888242871839275222246405745257275088548364400416034343698203936457928331684, + 490525184311734, + 21888242871839275222246405745257275088548364400416034343698203720497085436585, + 252206552882649, + 327851964904865, + 76933237524508, + 21888242871839275222246405745257275088548364400416034343698203980156318536662, + 402151423378590, + 124599456296654, + 7636371415309, + 21888242871839275222246405745257275088548364400416034343698203895405223747480, + 21888242871839275222246405745257275088548364400416034343698203907436816713336, + 169855620414326, + 467589723000631, + 21888242871839275222246405745257275088548364400416034343698204015584333832157, + 185388975363900, + 21888242871839275222246405745257275088548364400416034343698203999727907357084, + 21888242871839275222246405745257275088548364400416034343698203690588400241851, + 21888242871839275222246405745257275088548364400416034343698203707274717008257, + 192394470711498, + 103610845973487, + 351362082107181, + 243905679662349, + 365912429119109, + 21888242871839275222246405745257275088548364400416034343698204091194241286386, + 21888242871839275222246405745257275088548364400416034343698203741602465782503, + 518627046059393, + 539963106697225, + 21888242871839275222246405745257275088548364400416034343698204097171646700092, + 455083589174154, + 21888242871839275222246405745257275088548364400416034343698204089693929372439, + 187020347951263, + 379092645435523, + 13914553887627, + 149170853572499, + 236724107410486, + 133668974903867, + 21888242871839275222246405745257275088548364400416034343698204042319086235750, + 295698637131141, + 21888242871839275222246405745257275088548364400416034343698203826333597765937, + 21888242871839275222246405745257275088548364400416034343698203825652770662250, + 21888242871839275222246405745257275088548364400416034343698203970607190138432, + 57427416313572, + 21888242871839275222246405745257275088548364400416034343698203978088373498711, + 21888242871839275222246405745257275088548364400416034343698204087681306055297, + 74248720589154, + 167088726082335, + 21888242871839275222246405745257275088548364400416034343698203699612432273717, + 407879721137825, + 21888242871839275222246405745257275088548364400416034343698203761980904855680, + 21888242871839275222246405745257275088548364400416034343698204046571897033248, + 21888242871839275222246405745257275088548364400416034343698204035817113983382, + 249309667184446, + 21888242871839275222246405745257275088548364400416034343698203754005897234676, + 21888242871839275222246405745257275088548364400416034343698204183486666950700, + 21888242871839275222246405745257275088548364400416034343698203720885588858597, + 387183071018563, + 126960641108263, + 21888242871839275222246405745257275088548364400416034343698203785147600461286, + 21888242871839275222246405745257275088548364400416034343698204078337665750895, + 464724667154790, + 21888242871839275222246405745257275088548364400416034343698203857270480700119, + 21888242871839275222246405745257275088548364400416034343698203802216828950957, + 235338487840124, + 21888242871839275222246405745257275088548364400416034343698204185243776947768, + 21888242871839275222246405745257275088548364400416034343698203878477196902556, + 554156404486338, + 21888242871839275222246405745257275088548364400416034343698204020060488468777, + 21888242871839275222246405745257275088548364400416034343698203664113909737909, + 21888242871839275222246405745257275088548364400416034343698204006909860977833, + 144811911238866, + 21888242871839275222246405745257275088548364400416034343698203848015118619347, + 91621007341006, + 523870611374858, + 21888242871839275222246405745257275088548364400416034343698203685811071236078, + 426607291941480, + 5278368830000, + 395212814270076, + 451640519327250, + 401887046542535, + 21888242871839275222246405745257275088548364400416034343698203993315538742298, + 21888242871839275222246405745257275088548364400416034343698203839941256570149, + 21888242871839275222246405745257275088548364400416034343698203887421946360695, + 457703296461228, + 21888242871839275222246405745257275088548364400416034343698204099643271846015, + 21888242871839275222246405745257275088548364400416034343698203784277524975462, + 215308424184879, + 21888242871839275222246405745257275088548364400416034343698203656616315352646, + 21888242871839275222246405745257275088548364400416034343698204133568055323186, + 21888242871839275222246405745257275088548364400416034343698203683502799003649, + 202548712811925, + 21888242871839275222246405745257275088548364400416034343698203961847336031722, + 21888242871839275222246405745257275088548364400416034343698203853004295423966, + 533797694247886, + 21888242871839275222246405745257275088548364400416034343698203666545331877846, + 21888242871839275222246405745257275088548364400416034343698204114619521599324, + 8930026684104, + 21888242871839275222246405745257275088548364400416034343698203701997657541622, + 21888242871839275222246405745257275088548364400416034343698203721472982637087, + 210556275870454, + 132433020452036, + 259539981647853, + 21888242871839275222246405745257275088548364400416034343698203865080074398569, + 21888242871839275222246405745257275088548364400416034343698203787115579401117, + 21888242871839275222246405745257275088548364400416034343698203961101170099614, + 21888242871839275222246405745257275088548364400416034343698203803759916122887, + 21888242871839275222246405745257275088548364400416034343698203700722155243846, + 236310638497611, + 21888242871839275222246405745257275088548364400416034343698203798308932427993, + 410471817201450, + 420099689338906, + 455021428956947, + 304423141070291, + 21888242871839275222246405745257275088548364400416034343698203971202555849569, + 21888242871839275222246405745257275088548364400416034343698203664231034394136, + 196463292405826, + 484708701564619, + 391841566995428, + 82548542116376, + 21888242871839275222246405745257275088548364400416034343698203640438738557511, + 445414814878000, + 21888242871839275222246405745257275088548364400416034343698204185703343446458, + 21888242871839275222246405745257275088548364400416034343698203796846828005642, + 85984266723104, + 117979499287499, + 416292464830186, + 21888242871839275222246405745257275088548364400416034343698203896383463555522, + 21888242871839275222246405745257275088548364400416034343698203692730339553117, + 105080503290871, + 21888242871839275222246405745257275088548364400416034343698203689764528907222, + 21888242871839275222246405745257275088548364400416034343698203756587960263865, + 21888242871839275222246405745257275088548364400416034343698203662386981740312, + 21888242871839275222246405745257275088548364400416034343698203912616646985619, + 21888242871839275222246405745257275088548364400416034343698204134038278163583, + 21888242871839275222246405745257275088548364400416034343698203835840921993312, + 315752328372208, + 514626447328881, + 344111015174793, + 21888242871839275222246405745257275088548364400416034343698203812815005328855, + 73743696607472, + 21888242871839275222246405745257275088548364400416034343698204177050050497497, + 21888242871839275222246405745257275088548364400416034343698203999528451844926, + 364042020572317, + 21888242871839275222246405745257275088548364400416034343698204015035216195155, + 240396435478594, + 21888242871839275222246405745257275088548364400416034343698203911523767696794, + 21888242871839275222246405745257275088548364400416034343698203906582611813552, + 21888242871839275222246405745257275088548364400416034343698204147144927063788, + 21888242871839275222246405745257275088548364400416034343698204008184759356974, + 21888242871839275222246405745257275088548364400416034343698204171525589167848, + 21888242871839275222246405745257275088548364400416034343698204185367295878995, + 21888242871839275222246405745257275088548364400416034343698203908928953171613, + 205710777621527, + 124039120630000, + 373946528504392, + 21888242871839275222246405745257275088548364400416034343698203955238619232646, + 21888242871839275222246405745257275088548364400416034343698204133219536221786, + 21888242871839275222246405745257275088548364400416034343698203787047438247147, + 525271843663125, + 346453754020231, + 21888242871839275222246405745257275088548364400416034343698204115323122639627, + 319678679146003, + 109983012757838, + 296748524227859, + 21888242871839275222246405745257275088548364400416034343698203778726440483909, + 21888242871839275222246405745257275088548364400416034343698204055120024466485, + 71909338955757, + 93172283711484, + 21888242871839275222246405745257275088548364400416034343698203639126939171899, + 80394292734201, + 21888242871839275222246405745257275088548364400416034343698204107351759170427, + 446331090004882, + 382469833768607, + 232472990261579, + 557792208101164, + 21888242871839275222246405745257275088548364400416034343698203894194553026779, + 21888242871839275222246405745257275088548364400416034343698203688794237816741, + 21888242871839275222246405745257275088548364400416034343698203830538881557289, + 199248412217664, + 21888242871839275222246405745257275088548364400416034343698203703414046736154, + 21888242871839275222246405745257275088548364400416034343698203756296076916874, + 21888242871839275222246405745257275088548364400416034343698204034886168553750, + 526728324737992, + 21888242871839275222246405745257275088548364400416034343698204034890834999646, + 21888242871839275222246405745257275088548364400416034343698203968741753913153, + 21888242871839275222246405745257275088548364400416034343698203882802189294933, + 21888242871839275222246405745257275088548364400416034343698204142446187186620, + 300195908067962, + 21888242871839275222246405745257275088548364400416034343698204058527640912111, + 21888242871839275222246405745257275088548364400416034343698203780787715747336, + 304488726769139, + 273553776623448, + 21888242871839275222246405745257275088548364400416034343698203820441138534866, + 533058136417501, + 21888242871839275222246405745257275088548364400416034343698203778914304598725, + 21888242871839275222246405745257275088548364400416034343698203930225056883824, + 21888242871839275222246405745257275088548364400416034343698203643800819115163, + 21888242871839275222246405745257275088548364400416034343698203874754785792143, + 21888242871839275222246405745257275088548364400416034343698204034916221523401, + 21888242871839275222246405745257275088548364400416034343698203711584776050582, + 330953064550667, + 519094165489755, + 21888242871839275222246405745257275088548364400416034343698203986556376163908, + 21888242871839275222246405745257275088548364400416034343698203986829501646359, + 21888242871839275222246405745257275088548364400416034343698203958154345255755, + 446444314560343, + 328772056834285, + 21888242871839275222246405745257275088548364400416034343698204134686434742049, + 21888242871839275222246405745257275088548364400416034343698204118444685290899, + 21888242871839275222246405745257275088548364400416034343698204070127930604032, + 32903451768880, + 84768594253023, + 21888242871839275222246405745257275088548364400416034343698203816404185262302, + 21888242871839275222246405745257275088548364400416034343698203655412010620189, + 151239644135919, + 514965312984148, + 21888242871839275222246405745257275088548364400416034343698203941340314972820, + 556490917681971, + 382638673648644, + 21888242871839275222246405745257275088548364400416034343698204009936054728082, + 21888242871839275222246405745257275088548364400416034343698203996212884481447, + 246673990417570, + 21888242871839275222246405745257275088548364400416034343698203864264698447947, + 21888242871839275222246405745257275088548364400416034343698204055320082123939, + 21888242871839275222246405745257275088548364400416034343698203907035988453397, + 21888242871839275222246405745257275088548364400416034343698203863070558613447, + 21888242871839275222246405745257275088548364400416034343698204073626015991446, + 336359890649595, + 21888242871839275222246405745257275088548364400416034343698204169886337979965, + 382721832252903, + 144304734680905, + 282671260652147, + 21888242871839275222246405745257275088548364400416034343698203689391290782795, + 159901025069128, + 235353251785252, + 45703492267883, + 21888242871839275222246405745257275088548364400416034343698203796126297000473, + 21888242871839275222246405745257275088548364400416034343698203682846278244973, + 21888242871839275222246405745257275088548364400416034343698204036499820968717, + 21888242871839275222246405745257275088548364400416034343698203993306262049706, + 421146910854424, + 21888242871839275222246405745257275088548364400416034343698204043579126866128, + 21888242871839275222246405745257275088548364400416034343698204052882120384755, + 21888242871839275222246405745257275088548364400416034343698203966874448265428, + 21888242871839275222246405745257275088548364400416034343698204136395899883010, + 108275232912973, + 14838013317217, + 21888242871839275222246405745257275088548364400416034343698203951303856502588, + 513141432864455, + 21888242871839275222246405745257275088548364400416034343698204175423179902200, + 448211512453248, + 21888242871839275222246405745257275088548364400416034343698204092828525574794, + 21888242871839275222246405745257275088548364400416034343698203825870722416147, + 463031678921191, + 21888242871839275222246405745257275088548364400416034343698203864427990738156, + 21888242871839275222246405745257275088548364400416034343698203919370611108903, + 21888242871839275222246405745257275088548364400416034343698203902361873587558, + 296891076189981, + 368971708608056, + 21888242871839275222246405745257275088548364400416034343698203973891516956936, + 186520746385513, + 21888242871839275222246405745257275088548364400416034343698204069296705723096, + 21888242871839275222246405745257275088548364400416034343698203828986296538800, + 21888242871839275222246405745257275088548364400416034343698203797906861702357, + 434352607838363, + 21888242871839275222246405745257275088548364400416034343698203895764441983836, + 21888242871839275222246405745257275088548364400416034343698204000316677255139, + 519693298397701, + 75934445156193, + 215296328241699, + 21888242871839275222246405745257275088548364400416034343698203889395962929815, + 390214745957783, + 495795328839165, + 21888242871839275222246405745257275088548364400416034343698203635587251183546, + 465431697482111, + 21888242871839275222246405745257275088548364400416034343698204117275046149354, + 562887938882293, + 547731029320162, + 21888242871839275222246405745257275088548364400416034343698204159722474846916, + 21888242871839275222246405745257275088548364400416034343698203816609101688360, + 21888242871839275222246405745257275088548364400416034343698204122255669778383, + 511161193485688, + 205000166712758, + 479063810615228, + 21888242871839275222246405745257275088548364400416034343698204039775220947619, + 21888242871839275222246405745257275088548364400416034343698203721982368020117, + 21888242871839275222246405745257275088548364400416034343698203910394347719134, + 391804050706727, + 21888242871839275222246405745257275088548364400416034343698204015443696660583, + 219834637483609, + 128891464691440, + 21888242871839275222246405745257275088548364400416034343698203767254931768142, + 21888242871839275222246405745257275088548364400416034343698203679281720754729, + 336317793833563, + 68636261428533, + 245591944816548, + 21888242871839275222246405745257275088548364400416034343698203863204300579729, + 21888242871839275222246405745257275088548364400416034343698204116627557757371, + 109001512579650, + 21888242871839275222246405745257275088548364400416034343698203999915647746170, + 488335600275918, + 21888242871839275222246405745257275088548364400416034343698203760025495196966, + 548992997688244, + 393323454964685, + 48750085504573, + 21888242871839275222246405745257275088548364400416034343698203644998772429654, + 21888242871839275222246405745257275088548364400416034343698203832873643398218, + 21888242871839275222246405745257275088548364400416034343698203977310212288469, + 393126718498332, + 89245753549029, + 21888242871839275222246405745257275088548364400416034343698203990617722301999, + 82071796455339, + 21888242871839275222246405745257275088548364400416034343698204037424683287310, + 241296028622383, + 245782315256569, + 21888242871839275222246405745257275088548364400416034343698203939292205580386, + 21888242871839275222246405745257275088548364400416034343698203792694659753080, + 230917941607307, + 21888242871839275222246405745257275088548364400416034343698203852170464058181, + 398148631081483, + 360288544840533, + 356686897072880, + 21888242871839275222246405745257275088548364400416034343698203664391155142572, + 279244600895823, + 262320242540959, + 376719732790202, + 21888242871839275222246405745257275088548364400416034343698203789329570990294, + 404158109057116, + 145758591117785, + 172483672457025, + 465074902930852, + 21888242871839275222246405745257275088548364400416034343698203897531408314331, + 21888242871839275222246405745257275088548364400416034343698204117899494401140, + 21888242871839275222246405745257275088548364400416034343698203925966314077455, + 21888242871839275222246405745257275088548364400416034343698204103489571497151, + 341340056646422, + 65551123264222, + 5810890399536, + 21888242871839275222246405745257275088548364400416034343698203893394555844292, + 21888242871839275222246405745257275088548364400416034343698203662938893069854, + 21888242871839275222246405745257275088548364400416034343698203842931024025685, + 126875098932377, + 21888242871839275222246405745257275088548364400416034343698203790279270810671, + 304838819700639, + 21888242871839275222246405745257275088548364400416034343698203850447686625133, + 56545741166666, + 422193682141226, + 21888242871839275222246405745257275088548364400416034343698203696185395172855, + 21888242871839275222246405745257275088548364400416034343698204068863308853780, + 421018575371514, + 497768348885438, + 315828648168165, + 296658376941454, + 21888242871839275222246405745257275088548364400416034343698203950021076025764, + 21888242871839275222246405745257275088548364400416034343698203794396394894065, + 299561583692160, + 114839957133340, + 21888242871839275222246405745257275088548364400416034343698204015350492077337, + 21888242871839275222246405745257275088548364400416034343698204061094054899071, + 21888242871839275222246405745257275088548364400416034343698203978705966184259, + 21888242871839275222246405745257275088548364400416034343698203720289500787376, + 21888242871839275222246405745257275088548364400416034343698203956835511877372, + 21888242871839275222246405745257275088548364400416034343698203804996791778076, + 556319880461247, + 162758272924291, + 21888242871839275222246405745257275088548364400416034343698203892824918395723, + 21888242871839275222246405745257275088548364400416034343698204045908950240311, + 160388998250191, + 199163085394154, + 21888242871839275222246405745257275088548364400416034343698204078150892653300, + 35120336998261, + 251950178647129, + 21888242871839275222246405745257275088548364400416034343698204069704774088954, + 21888242871839275222246405745257275088548364400416034343698203742860992210897, + 21888242871839275222246405745257275088548364400416034343698203920353414370264, + 21888242871839275222246405745257275088548364400416034343698203825546440379446, + 21888242871839275222246405745257275088548364400416034343698204010347170283384, + 21888242871839275222246405745257275088548364400416034343698203770639526740932, + 21888242871839275222246405745257275088548364400416034343698204001993329435721, + 425540091610443, + 393686093061716, + 21888242871839275222246405745257275088548364400416034343698203627965295464329, + 21888242871839275222246405745257275088548364400416034343698203897081834310998, + 21888242871839275222246405745257275088548364400416034343698203742301622632857, + 21888242871839275222246405745257275088548364400416034343698204112788696434667, + 21888242871839275222246405745257275088548364400416034343698203977297358261979, + 455685157565317, + 485521830121066, + 21888242871839275222246405745257275088548364400416034343698203999560669932044, + 21888242871839275222246405745257275088548364400416034343698204059373059710209, + 419828268248082, + 21888242871839275222246405745257275088548364400416034343698204062251991106889, + 309919624207954, + 115355738070739, + 21888242871839275222246405745257275088548364400416034343698203964362228825004, + 287917820415072, + 21888242871839275222246405745257275088548364400416034343698203766916096393481, + 21888242871839275222246405745257275088548364400416034343698203838869551756446, + 21888242871839275222246405745257275088548364400416034343698203944309729243482, + 403695739799103, + 79552218796992, + 21888242871839275222246405745257275088548364400416034343698203837389722078252, + 21888242871839275222246405745257275088548364400416034343698204114576123954346, + 21888242871839275222246405745257275088548364400416034343698203644652368454247, + 21888242871839275222246405745257275088548364400416034343698204070355400823365, + 430149943537504, + 562739866879296, + 253627807453701, + 4674180341952, + 48976600535815, + 21888242871839275222246405745257275088548364400416034343698203640857707396594, + 288547552315596, + 21888242871839275222246405745257275088548364400416034343698203787106821364101, + 111255589851645, + 439940221156497, + 21888242871839275222246405745257275088548364400416034343698203741341469359128, + 471408291247906, + 21888242871839275222246405745257275088548364400416034343698203733531190616600, + 165724089598069, + 128207665985900, + 343289657113114, + 21888242871839275222246405745257275088548364400416034343698204130496089163598, + 262096927037019, + 21888242871839275222246405745257275088548364400416034343698204119934309129946, + 21888242871839275222246405745257275088548364400416034343698204049394704078220, + 553563223502194, + 21888242871839275222246405745257275088548364400416034343698203660284647393604, + 49731694551318, + 473949563506961, + 21888242871839275222246405745257275088548364400416034343698203849649204748873, + 327545865328335, + 21888242871839275222246405745257275088548364400416034343698203837398070547782, + 197518674692791, + 121762828642844, + 538214517182825, + 21888242871839275222246405745257275088548364400416034343698203901192136224785, + 21888242871839275222246405745257275088548364400416034343698203713650185158788, + 338536289557156, + 341524025220307, + 21888242871839275222246405745257275088548364400416034343698204072974320215429, + 486493149044772, + 99232572758191, + 21888242871839275222246405745257275088548364400416034343698203683539946278958, + 328734521346686, + 403463945364925, + 385301231847298, + 21888242871839275222246405745257275088548364400416034343698203984123879741357, + 21888242871839275222246405745257275088548364400416034343698203711083223708444, + 308059177973995, + 192719474860622, + 21888242871839275222246405745257275088548364400416034343698203697060078351552, + 300311927463114, + 21888242871839275222246405745257275088548364400416034343698203989081340879889, + 97079715403239, + 21888242871839275222246405745257275088548364400416034343698203997669113821672, + 432736423733249, + 140808674423927, + 107464750717095, + 21888242871839275222246405745257275088548364400416034343698203750798031069350, + 21888242871839275222246405745257275088548364400416034343698204045396991444994, + 21888242871839275222246405745257275088548364400416034343698203743735898652720, + 407235056217423, + 499443856640576, + 406660512977780, + 193845854330186, + 21888242871839275222246405745257275088548364400416034343698203656010204458507, + 186930486874266, + 21888242871839275222246405745257275088548364400416034343698203926030600504424, + 312075562137516, + 21888242871839275222246405745257275088548364400416034343698204071988902387811, + 408898062742746, + 157761084986123, + 428575190130394, + 415003430299738, + 354835769561020, + 21888242871839275222246405745257275088548364400416034343698203806142541077840, + 391952710731308, + 561059301500342, + 21888242871839275222246405745257275088548364400416034343698204146171746409082, + 21888242871839275222246405745257275088548364400416034343698203883385263810273, + 21888242871839275222246405745257275088548364400416034343698203895730455966200, + 143243695587962, + 21888242871839275222246405745257275088548364400416034343698203909471412623134, + 21888242871839275222246405745257275088548364400416034343698203750702597517775, + 21888242871839275222246405745257275088548364400416034343698203959883958616356, + 40957083658615, + 218864282752810, + 21888242871839275222246405745257275088548364400416034343698203859036322501917, + 58363004072628, + 21888242871839275222246405745257275088548364400416034343698203714410761122114, + 327715318511834, + 21888242871839275222246405745257275088548364400416034343698203856417751404319, + 21888242871839275222246405745257275088548364400416034343698203981155538721680, + 2008412193055, + 369939720811499, + 21888242871839275222246405745257275088548364400416034343698204112127870845659, + 27848366335964, + 21888242871839275222246405745257275088548364400416034343698203916332256425270, + 317796324804862, + 21888242871839275222246405745257275088548364400416034343698203654090457364784, + 21888242871839275222246405745257275088548364400416034343698203763927556963344, + 11417963203056, + 363008013165620, + 21888242871839275222246405745257275088548364400416034343698203945001479815030, + 21888242871839275222246405745257275088548364400416034343698203961858240452368, + 156682244652602, + 21888242871839275222246405745257275088548364400416034343698203810822765701715, + 66028668334292, + 18719005919828, + 295509723148309, + 21888242871839275222246405745257275088548364400416034343698203958688849573885, + 21888242871839275222246405745257275088548364400416034343698203818211224004436, + 309661993024025, + 21888242871839275222246405745257275088548364400416034343698203960384754814158, + 229295033432824, + 21888242871839275222246405745257275088548364400416034343698204045105874446893, + 21888242871839275222246405745257275088548364400416034343698204089929016896827, + 21888242871839275222246405745257275088548364400416034343698204079087878180123, + 144033377129688, + 21888242871839275222246405745257275088548364400416034343698203635865919093847, + 558001292805266, + 158774229212470, + 310863928829846, + 101751648240330, + 66989910410824, + 236430519341126, + 21888242871839275222246405745257275088548364400416034343698203790337028648874, + 250873612596233, + 190810285641061, + 94531269250558, + 445620227468841, + 21888242871839275222246405745257275088548364400416034343698203951696707424389, + 21888242871839275222246405745257275088548364400416034343698204012087272648125, + 120201401238851, + 21888242871839275222246405745257275088548364400416034343698204165354273384898, + 379600920364624, + 21888242871839275222246405745257275088548364400416034343698204155904772565213, + 21888242871839275222246405745257275088548364400416034343698204013512016991062, + 527449218319084, + 21888242871839275222246405745257275088548364400416034343698204113236042968951, + 21888242871839275222246405745257275088548364400416034343698203840310865799637, + 157414979290405, + 235657834664210, + 21888242871839275222246405745257275088548364400416034343698203704246169597108, + 21888242871839275222246405745257275088548364400416034343698203867075839279658, + 21888242871839275222246405745257275088548364400416034343698203936235178897533, + 21888242871839275222246405745257275088548364400416034343698203656632080090315, + 21888242871839275222246405745257275088548364400416034343698203885125911981343, + 485458967046781, + 264827184884064, + 415798426721211, + 533599970311970, + 240751843619690, + 21888242871839275222246405745257275088548364400416034343698203964646520366679, + 21888242871839275222246405745257275088548364400416034343698203957918738889562, + 21888242871839275222246405745257275088548364400416034343698203716924730300103, + 292145893405934, + 21888242871839275222246405745257275088548364400416034343698203683636227569105, + 21888242871839275222246405745257275088548364400416034343698203967128842674432, + 94626098666514, + 21888242871839275222246405745257275088548364400416034343698203736223784520710, + 150603546834509, + 21888242871839275222246405745257275088548364400416034343698203855581216819206, + 352371786503631, + 382800694835011, + 21888242871839275222246405745257275088548364400416034343698203968680582225741, + 21888242871839275222246405745257275088548364400416034343698204150281370268375, + 21888242871839275222246405745257275088548364400416034343698203949761256435645, + 53846706960755, + 21888242871839275222246405745257275088548364400416034343698203767697027422679, + 21888242871839275222246405745257275088548364400416034343698204001746537847321, + 35346835671994, + 21888242871839275222246405745257275088548364400416034343698204133447779295907, + 123796951663687, + 21888242871839275222246405745257275088548364400416034343698203623962823458247, + 21888242871839275222246405745257275088548364400416034343698204135532358880788, + 375827399354824, + 21888242871839275222246405745257275088548364400416034343698204036373337013637, + 21888242871839275222246405745257275088548364400416034343698204073830020136650, + 21888242871839275222246405745257275088548364400416034343698203896214118057170, + 21888242871839275222246405745257275088548364400416034343698203895007282665637, + 21888242871839275222246405745257275088548364400416034343698203809057235673812, + 178652266380979, + 431967811569825, + 424877663605173, + 178857860222446, + 21888242871839275222246405745257275088548364400416034343698204123343074284500, + 21888242871839275222246405745257275088548364400416034343698204036631191175669, + 317167138547001, + 21888242871839275222246405745257275088548364400416034343698203802660558672016, + 176633300233629, + 21888242871839275222246405745257275088548364400416034343698203903261517256363, + 416612439167177, + 422264146557365, + 21888242871839275222246405745257275088548364400416034343698203882723971468960, + 21888242871839275222246405745257275088548364400416034343698203813083046284933, + 219748566328784, + 21888242871839275222246405745257275088548364400416034343698204166525444607505, + 21888242871839275222246405745257275088548364400416034343698204051732487892161, + 3267151728857, + 273621541458008, + 118968971812070, + 222361190731531, + 344888631212438, + 139942804156046, + 502057268475492, + 21888242871839275222246405745257275088548364400416034343698204010433065426352, + 482489116739444, + 21888242871839275222246405745257275088548364400416034343698203997539174481993, + 2399242306291, + 21888242871839275222246405745257275088548364400416034343698203823474499226732, + 21888242871839275222246405745257275088548364400416034343698203663579928249453, + 21888242871839275222246405745257275088548364400416034343698204185369259097465, + 324171021303751, + 557002585898485, + 21888242871839275222246405745257275088548364400416034343698203964998874995215, + 260694142107580, + 21888242871839275222246405745257275088548364400416034343698203963659582095870, + 312538111203804, + 11028774430102, + 21888242871839275222246405745257275088548364400416034343698204027657688755741, + 149796474170632, + 21888242871839275222246405745257275088548364400416034343698203811637563356265, + 446415812925255, + 266425515121236, + 21888242871839275222246405745257275088548364400416034343698204172595912567344, + 128498697936096, + 21888242871839275222246405745257275088548364400416034343698203766513421876746, + 21888242871839275222246405745257275088548364400416034343698203632217901487071, + 300280204344729, + 180860436944166, + 507230535541587, + 21888242871839275222246405745257275088548364400416034343698203719847212072420, + 21888242871839275222246405745257275088548364400416034343698204040849812483551, + 180103266231471, + 21888242871839275222246405745257275088548364400416034343698203677751193183206, + 21888242871839275222246405745257275088548364400416034343698204127962931656633, + 21888242871839275222246405745257275088548364400416034343698203999922576808140, + 21888242871839275222246405745257275088548364400416034343698203702621874009386, + 462359351184001, + 21888242871839275222246405745257275088548364400416034343698203858888814571107, + 21888242871839275222246405745257275088548364400416034343698203812394034636685, + 21888242871839275222246405745257275088548364400416034343698203924952712172479, + 21888242871839275222246405745257275088548364400416034343698203662045550326191, + 153210223111622, + 214930826456825, + 56858427572662, + 21888242871839275222246405745257275088548364400416034343698203839819184849677, + 399734702722485, + 21888242871839275222246405745257275088548364400416034343698204102516657474458, + 99120687910983, + 21888242871839275222246405745257275088548364400416034343698203727737713241689, + 21888242871839275222246405745257275088548364400416034343698203963308612451908, + 120879417849582, + 305600301409298, + 21888242871839275222246405745257275088548364400416034343698204053254277656565, + 552706125589103, + 21888242871839275222246405745257275088548364400416034343698203990948476430347, + 21888242871839275222246405745257275088548364400416034343698203966431234933015, + 21888242871839275222246405745257275088548364400416034343698203682972892965150, + 101924856084315, + 21888242871839275222246405745257275088548364400416034343698204034331964870050, + 21888242871839275222246405745257275088548364400416034343698203919569852496872, + 21888242871839275222246405745257275088548364400416034343698203651353997162763, + 21888242871839275222246405745257275088548364400416034343698204158943403570735, + 421109408362971, + 440432399607632, + 187825198913632, + 21888242871839275222246405745257275088548364400416034343698204083237947103341, + 344543827613041, + 21888242871839275222246405745257275088548364400416034343698204007479434277843, + 21888242871839275222246405745257275088548364400416034343698203780747966583080, + 21888242871839275222246405745257275088548364400416034343698203748721119075175, + 21888242871839275222246405745257275088548364400416034343698203638409914906307, + 21888242871839275222246405745257275088548364400416034343698204081975246765166, + 21888242871839275222246405745257275088548364400416034343698204134132256784168, + 21888242871839275222246405745257275088548364400416034343698203887359520160380, + 145345942283657, + 21888242871839275222246405745257275088548364400416034343698203766576464993749, + 21888242871839275222246405745257275088548364400416034343698203965685237482617, + 352217447122600, + 319226952234701, + 34370299476270, + 92584019042643, + 263293522479696, + 21888242871839275222246405745257275088548364400416034343698204146057382761307, + 282291653462585, + 381749217589788, + 21888242871839275222246405745257275088548364400416034343698203840526134877747, + 21888242871839275222246405745257275088548364400416034343698203717898224569645, + 21888242871839275222246405745257275088548364400416034343698204121242926473919, + 21888242871839275222246405745257275088548364400416034343698203753155287762543, + 497393114343235, + 21888242871839275222246405745257275088548364400416034343698203802992058770201, + 21888242871839275222246405745257275088548364400416034343698203978286565293028, + 21888242871839275222246405745257275088548364400416034343698204093102814204859, + 21888242871839275222246405745257275088548364400416034343698203928372917579149, + 21888242871839275222246405745257275088548364400416034343698204056762361028624, + 222483708954628, + 21888242871839275222246405745257275088548364400416034343698203937712405575834, + 28788688333669, + 520427056594943, + 21888242871839275222246405745257275088548364400416034343698203852906306328397, + 551961168550471, + 245683980254706, + 382853247692042, + 348488382066108, + 21888242871839275222246405745257275088548364400416034343698204164056078558662, + 21888242871839275222246405745257275088548364400416034343698203934237561576996, + 555137470054629, + 21888242871839275222246405745257275088548364400416034343698203957136192842812, + 194664998796719, + 21888242871839275222246405745257275088548364400416034343698203850559302339375, + 146387780275856, + 21888242871839275222246405745257275088548364400416034343698203995745944956044, + 21888242871839275222246405745257275088548364400416034343698203987701116729203, + 452634656640687, + 291157924212477, + 21888242871839275222246405745257275088548364400416034343698203730522698847599, + 550238789215411, + 21888242871839275222246405745257275088548364400416034343698203951863177395163, + 21888242871839275222246405745257275088548364400416034343698204130653897153102, + 21888242871839275222246405745257275088548364400416034343698203695399644278089, + 469182350723049, + 311856945355578, + 289283867443360, + 12608490945114, + 11250512782336, + 543549500654256, + 201641339054415, + 21888242871839275222246405745257275088548364400416034343698203995322377939617, + 554509102674674, + 21888242871839275222246405745257275088548364400416034343698204027505476215130, + 21888242871839275222246405745257275088548364400416034343698204026757128755714, + 21888242871839275222246405745257275088548364400416034343698204183077408730623, + 21888242871839275222246405745257275088548364400416034343698203792333035204723, + 111006160153597, + 21888242871839275222246405745257275088548364400416034343698203677041920537851, + 21888242871839275222246405745257275088548364400416034343698204117713139202555, + 305323480640114, + 296130898401970, + 407659626515991, + 21888242871839275222246405745257275088548364400416034343698204031811346407644, + 21888242871839275222246405745257275088548364400416034343698204003349431222280, + 59215860233211, + 49224425946668, + 67054190851650, + 161736345866665, + 527864373883097, + 287989467813022, + 466654270620546, + 21888242871839275222246405745257275088548364400416034343698203894499871553567, + 21888242871839275222246405745257275088548364400416034343698203847848863639257, + 21888242871839275222246405745257275088548364400416034343698203718709019585540, + 21888242871839275222246405745257275088548364400416034343698203751446069207835, + 177263999668349, + 472036792498835, + 306426766860797, + 259623627660283, + 365794063874335, + 21888242871839275222246405745257275088548364400416034343698203823934820422719, + 507490031576730, + 21888242871839275222246405745257275088548364400416034343698203728336980366455, + 150031673198300, + 425594391667768, + 199619363998497, + 514965131796137, + 21888242871839275222246405745257275088548364400416034343698203849526417837480, + 550857402865681, + 522299468663075, + 21888242871839275222246405745257275088548364400416034343698203751227693761438, + 21888242871839275222246405745257275088548364400416034343698203679125127255886, + 21888242871839275222246405745257275088548364400416034343698204143342278071143, + 21888242871839275222246405745257275088548364400416034343698204134708484400092, + 454371023123397, + 21888242871839275222246405745257275088548364400416034343698203787823638108965, + 21888242871839275222246405745257275088548364400416034343698203851084258608587, + 38443643500998, + 21888242871839275222246405745257275088548364400416034343698203884437188397555, + 21888242871839275222246405745257275088548364400416034343698204129588374835230, + 118850330279099, + 164292335477133, + 21888242871839275222246405745257275088548364400416034343698203792103779300262, + 258870052869411, + 427179540397222, + 535756251993542, + 21888242871839275222246405745257275088548364400416034343698204042374912265640, + 148539595820277, + 42287732513419, + 422621672611981, + 21888242871839275222246405745257275088548364400416034343698203779271221956781, + 21888242871839275222246405745257275088548364400416034343698203814098079460204, + 21888242871839275222246405745257275088548364400416034343698204182100795940909, + 163060569878034, + 190009613150071, + 21888242871839275222246405745257275088548364400416034343698203969789399576277, + 335682060313741, + 22462742184266, + 21888242871839275222246405745257275088548364400416034343698203837143378738864, + 232997983090134, + 299886349618963, + 311328655988305, + 509797936794226, + 500776147406451, + 21888242871839275222246405745257275088548364400416034343698204097762381140219, + 21888242871839275222246405745257275088548364400416034343698204180994052359617, + 21888242871839275222246405745257275088548364400416034343698203972106239729805, + 21888242871839275222246405745257275088548364400416034343698203723069335667864, + 110446895467888, + 21888242871839275222246405745257275088548364400416034343698203838205980917991, + 21888242871839275222246405745257275088548364400416034343698204149343319513237, + 140545958744555, + 88556225511185, + 13728383506406, + 21888242871839275222246405745257275088548364400416034343698204122302779764600, + 430563124056893, + 21888242871839275222246405745257275088548364400416034343698204065448084133997, + 494902727103251, + 103648819043910, + 21888242871839275222246405745257275088548364400416034343698203683034176846592, + 393365892532709, + 21888242871839275222246405745257275088548364400416034343698203924250051306834, + 9938031201301, + 134939806347063, + 363984239268182, + 296427187420681, + 21888242871839275222246405745257275088548364400416034343698203980256987307544, + 58902622685851, + 21888242871839275222246405745257275088548364400416034343698203897517699739032, + 21888242871839275222246405745257275088548364400416034343698204045510267496542, + 168236134800033, + 416640111472030, + 5649930968830, + 160284957372567, + 121548092426078, + 21888242871839275222246405745257275088548364400416034343698203755656073285557, + 558362189948918, + 21888242871839275222246405745257275088548364400416034343698203940853378017433, + 21888242871839275222246405745257275088548364400416034343698203641070932899959, + 21888242871839275222246405745257275088548364400416034343698204020714579283780, + 100719875969019, + 340743794950203, + 21888242871839275222246405745257275088548364400416034343698204054770969315192, + 21888242871839275222246405745257275088548364400416034343698204109461341891102, + 94188381601110, + 140352956238888, + 272417605285139, + 137219023497047, + 21888242871839275222246405745257275088548364400416034343698203827630351570493, + 543117275204796, + 21888242871839275222246405745257275088548364400416034343698204007846925779032, + 21888242871839275222246405745257275088548364400416034343698204157060432164202, + 21888242871839275222246405745257275088548364400416034343698203963655188844317, + 21888242871839275222246405745257275088548364400416034343698203834556316568578, + 305749339162333, + 21888242871839275222246405745257275088548364400416034343698203748466078779675, + 21888242871839275222246405745257275088548364400416034343698203805940181835571, + 21888242871839275222246405745257275088548364400416034343698203745768674730825, + 21888242871839275222246405745257275088548364400416034343698203696400674863167, + 63635291493926, + 21888242871839275222246405745257275088548364400416034343698204066624324990561, + 21888242871839275222246405745257275088548364400416034343698204116416073428136, + 21888242871839275222246405745257275088548364400416034343698203725159210826873, + 241898290168150, + 103088064803690, + 422969487398510, + 21888242871839275222246405745257275088548364400416034343698203785509691908205, + 21888242871839275222246405745257275088548364400416034343698204042786795813139, + 278670065685959, + 21888242871839275222246405745257275088548364400416034343698203982235021503154, + 21888242871839275222246405745257275088548364400416034343698203667479024786918, + 87984772838761, + 480449260468316, + 21888242871839275222246405745257275088548364400416034343698203693492131812779, + 17720208154259, + 83747753779732, + 319130341879251, + 352417208158108, + 21888242871839275222246405745257275088548364400416034343698203977350202168428, + 21888242871839275222246405745257275088548364400416034343698203637349435019038, + 523637977653565, + 330277172185694, + 553234117594220, + 21888242871839275222246405745257275088548364400416034343698203839966433093821, + 21888242871839275222246405745257275088548364400416034343698203692892771029221, + 341711691498680, + 21888242871839275222246405745257275088548364400416034343698204101348252280862, + 377980292783613, + 385945126497529, + 21888242871839275222246405745257275088548364400416034343698203949475443856055, + 418563444213824, + 21888242871839275222246405745257275088548364400416034343698204060241560619386, + 21888242871839275222246405745257275088548364400416034343698203688553298980498, + 529616973996915, + 418578721509135, + 259386181752279, + 264383542436532, + 16613937501420, + 376178436344150, + 21888242871839275222246405745257275088548364400416034343698203699514374585632, + 21888242871839275222246405745257275088548364400416034343698203718521335614389, + 380197130060484, + 84097249808830, + 292762673021362, + 21888242871839275222246405745257275088548364400416034343698203864304722243708, + 163277804761401, + 21888242871839275222246405745257275088548364400416034343698203938669287895795, + 406310607710143, + 219823089523681, + 21888242871839275222246405745257275088548364400416034343698204147302167583484, + 124382026404921, + 21888242871839275222246405745257275088548364400416034343698204138728648761025, + 185186804937774, + 21888242871839275222246405745257275088548364400416034343698203784448085182410, + 21888242871839275222246405745257275088548364400416034343698203657147892082850, + 21888242871839275222246405745257275088548364400416034343698204160380253314875, + 499755180856206, + 507592077880585, + 21888242871839275222246405745257275088548364400416034343698203899798958411901, + 122860808190755, + 21888242871839275222246405745257275088548364400416034343698203791563362944278, + 21888242871839275222246405745257275088548364400416034343698203797189367928180, + 439455330629127, + 411545074116784, + 21888242871839275222246405745257275088548364400416034343698203724482657771711, + 21888242871839275222246405745257275088548364400416034343698203979352599395890, + 292944460374388, + 534810321490144, + 21888242871839275222246405745257275088548364400416034343698203834743961762583, + 102405986232874, + 262866324144224, + 21888242871839275222246405745257275088548364400416034343698203876690684053375, + 21888242871839275222246405745257275088548364400416034343698203690884153313642, + 21888242871839275222246405745257275088548364400416034343698203858372823004244, + 416901215949581, + 21888242871839275222246405745257275088548364400416034343698203708466850227865, + 21888242871839275222246405745257275088548364400416034343698204015455920703898, + 29210493082105, + 323429591529835, + 21888242871839275222246405745257275088548364400416034343698204003241647973837, + 21888242871839275222246405745257275088548364400416034343698203768484306962579, + 348569463984469, + 190303658181763, + 21888242871839275222246405745257275088548364400416034343698203997565191563933, + 553686944832856, + 470965281193290, + 305524793152690, + 21888242871839275222246405745257275088548364400416034343698203966025416507562, + 323691764636064, + 152053148862834, + 21888242871839275222246405745257275088548364400416034343698203919807213927019, + 556902512866869, + 113286581328142, + 247020592987362, + 355992067497603, + 164902335260322, + 181429927903755, + 404365909437204, + 21888242871839275222246405745257275088548364400416034343698203749263150320591, + 332158468544499, + 128948279747602, + 245038684411001, + 6784961730017, + 445045442643339, + 21888242871839275222246405745257275088548364400416034343698204156905354827184, + 481671088046633, + 21888242871839275222246405745257275088548364400416034343698204003708763763322, + 107635462605977, + 557385888091012, + 7093404437048, + 90165505438295, + 543057408382818, + 366281761968348, + 536996140277492, + 21888242871839275222246405745257275088548364400416034343698203823670330870296, + 509759323927940, + 21888242871839275222246405745257275088548364400416034343698203992228554041636, + 21888242871839275222246405745257275088548364400416034343698203963893171156225, + 21888242871839275222246405745257275088548364400416034343698204129282621411875, + 21888242871839275222246405745257275088548364400416034343698203706531196414245, + 502401544225205, + 21888242871839275222246405745257275088548364400416034343698203745134548178613, + 431860916376903, + 293584804543285, + 379284986920014, + 21888242871839275222246405745257275088548364400416034343698204153808962651344, + 21888242871839275222246405745257275088548364400416034343698204128327860800192, + 7019817172088, + 21888242871839275222246405745257275088548364400416034343698203790992380373711, + 21888242871839275222246405745257275088548364400416034343698203939745786586345, + 21888242871839275222246405745257275088548364400416034343698203889139352716999, + 489759007525345, + 289228907354417, + 21888242871839275222246405745257275088548364400416034343698203714256875075730, + 430115864053375, + 21888242871839275222246405745257275088548364400416034343698203932693860289796, + 133406967604856, + 21888242871839275222246405745257275088548364400416034343698203976407112457696, + 489436810312416, + 21888242871839275222246405745257275088548364400416034343698203860897716779121, + 21888242871839275222246405745257275088548364400416034343698203788617109951518, + 137240214606333, + 21888242871839275222246405745257275088548364400416034343698204173486119708466, + 265451642554657, + 382015122388654, + 21888242871839275222246405745257275088548364400416034343698203967796142566096, + 21888242871839275222246405745257275088548364400416034343698203944138801342767, + 417217507909760, + 21888242871839275222246405745257275088548364400416034343698203777701985503799, + 21888242871839275222246405745257275088548364400416034343698203647583959590459, + 164531274823554, + 21888242871839275222246405745257275088548364400416034343698203955005493721393, + 21888242871839275222246405745257275088548364400416034343698203955329624065055, + 21888242871839275222246405745257275088548364400416034343698203996231505565331, + 432353086042028, + 21888242871839275222246405745257275088548364400416034343698204177413756208359, + 387500582846469, + 21888242871839275222246405745257275088548364400416034343698203645903286032964, + 539188372846463, + 227129460804696, + 182733292341594, + 21888242871839275222246405745257275088548364400416034343698204108208401800438, + 133034373580518, + 21888242871839275222246405745257275088548364400416034343698204185361068660753, + 21888242871839275222246405745257275088548364400416034343698203997429429466397, + 21888242871839275222246405745257275088548364400416034343698203883677462603871, + 247882341573090, + 21888242871839275222246405745257275088548364400416034343698203989215885129931, + 21888242871839275222246405745257275088548364400416034343698203726459785318755, + 328163334627676, + 107509156120231, + 21888242871839275222246405745257275088548364400416034343698203993641632246342, + 267944831888990, + 456500217058579, + 289607537865053, + 146418283070463, + 21888242871839275222246405745257275088548364400416034343698203959071142755667, + 46145565473726, + 21888242871839275222246405745257275088548364400416034343698203829934586423765, + 21888242871839275222246405745257275088548364400416034343698204116480949804652, + 132392568898651, + 21888242871839275222246405745257275088548364400416034343698203691690178381812, + 283924094452392, + 21888242871839275222246405745257275088548364400416034343698203966605518653409, + 21888242871839275222246405745257275088548364400416034343698203754700013105028, + 21888242871839275222246405745257275088548364400416034343698203944394549122766, + 176793561764374, + 271963790433116, + 67801763190794, + 21888242871839275222246405745257275088548364400416034343698203842350556284932, + 257265859718215, + 21888242871839275222246405745257275088548364400416034343698203883096323460757, + 21888242871839275222246405745257275088548364400416034343698203738391357303209, + 21888242871839275222246405745257275088548364400416034343698203824094919942534, + 298244324842214, + 21888242871839275222246405745257275088548364400416034343698204004662934150481, + 21888242871839275222246405745257275088548364400416034343698203626018611454854, + 1030073983632, + 179503434326336, + 404425340284729, + 21888242871839275222246405745257275088548364400416034343698204026596245115650, + 21888242871839275222246405745257275088548364400416034343698203818706054436259, + 332504061440611, + 21888242871839275222246405745257275088548364400416034343698204162633568872866, + 21888242871839275222246405745257275088548364400416034343698203860323614137621, + 21888242871839275222246405745257275088548364400416034343698204144036913792019, + 485456870777376, + 518080650543844, + 21888242871839275222246405745257275088548364400416034343698203628983697125534, + 21888242871839275222246405745257275088548364400416034343698203785432328008313, + 423290477168872, + 21888242871839275222246405745257275088548364400416034343698203800800736892574, + 21888242871839275222246405745257275088548364400416034343698203837770009711067, + 21888242871839275222246405745257275088548364400416034343698204116715400441717, + 21888242871839275222246405745257275088548364400416034343698203913348981665859, + 21888242871839275222246405745257275088548364400416034343698203900554049046782, + 276779155549960, + 21888242871839275222246405745257275088548364400416034343698203677749193685921, + 217612724021665, + 21888242871839275222246405745257275088548364400416034343698203742811507763303, + 21888242871839275222246405745257275088548364400416034343698203988689312013944, + 21888242871839275222246405745257275088548364400416034343698203777743520402816, + 145732586496271, + 21888242871839275222246405745257275088548364400416034343698203887133347104855, + 359525026837852, + 543260858227975, + 21888242871839275222246405745257275088548364400416034343698204048785369701339, + 21888242871839275222246405745257275088548364400416034343698204022289008944168, + 21888242871839275222246405745257275088548364400416034343698204178744028113493, + 21888242871839275222246405745257275088548364400416034343698203655624496149064, + 21888242871839275222246405745257275088548364400416034343698203930930835342083, + 21888242871839275222246405745257275088548364400416034343698203763520220001848, + 21888242871839275222246405745257275088548364400416034343698203753405738308589, + 438676440780789, + 21888242871839275222246405745257275088548364400416034343698204093001880479920, + 21888242871839275222246405745257275088548364400416034343698204073011313400168, + 21888242871839275222246405745257275088548364400416034343698203748666424653334, + 21888242871839275222246405745257275088548364400416034343698203874804817061756, + 361474468293614, + 21888242871839275222246405745257275088548364400416034343698203694242829120017, + 21888242871839275222246405745257275088548364400416034343698204148618444305975, + 21888242871839275222246405745257275088548364400416034343698203659030442049127, + 21888242871839275222246405745257275088548364400416034343698203884789052485827, + 21888242871839275222246405745257275088548364400416034343698203896869665595093, + 138398122194967, + 21888242871839275222246405745257275088548364400416034343698203876844977982643, + 391428267801744, + 21888242871839275222246405745257275088548364400416034343698203981105843839632, + 60231681035010, + 324124462816271, + 488325197116494, + 119666519557249, + 89799207005830, + 503881619443661, + 21888242871839275222246405745257275088548364400416034343698203759379856321098, + 21888242871839275222246405745257275088548364400416034343698203880342717964052, + 21888242871839275222246405745257275088548364400416034343698203673723475476864, + 540148195233895, + 232136855382009, + 84650520664978, + 21888242871839275222246405745257275088548364400416034343698204047328564466510, + 21888242871839275222246405745257275088548364400416034343698203969702727912975, + 16441412091169, + 46756708660929, + 21888242871839275222246405745257275088548364400416034343698203908987355748623, + 21888242871839275222246405745257275088548364400416034343698203794338729341785, + 21888242871839275222246405745257275088548364400416034343698203666690508586083, + 21888242871839275222246405745257275088548364400416034343698204089244389687130, + 21888242871839275222246405745257275088548364400416034343698203834497138700086, + 21888242871839275222246405745257275088548364400416034343698203724499906101044, + 21888242871839275222246405745257275088548364400416034343698203663069834585358, + 21888242871839275222246405745257275088548364400416034343698203978983064514134, + 21888242871839275222246405745257275088548364400416034343698204034720145136709, + 269368337776898, + 303279562231874, + 21888242871839275222246405745257275088548364400416034343698203994634442355108, + 21888242871839275222246405745257275088548364400416034343698203651164167450370, + 21888242871839275222246405745257275088548364400416034343698204074944424693920, + 21888242871839275222246405745257275088548364400416034343698203720570751420875, + 479491595828833, + 21888242871839275222246405745257275088548364400416034343698204122214621338370, + 21888242871839275222246405745257275088548364400416034343698204019162954244898, + 21888242871839275222246405745257275088548364400416034343698203891752896534342, + 21888242871839275222246405745257275088548364400416034343698203885682476870509, + 21888242871839275222246405745257275088548364400416034343698204156176750781060, + 418903818282766, + 110479266455921, + 454001732698936, + 21888242871839275222246405745257275088548364400416034343698204110449074610882, + 21888242871839275222246405745257275088548364400416034343698204055067783639558, + 21888242871839275222246405745257275088548364400416034343698203998068557118487, + 46597515028992, + 19420100760305, + 411634750331981, + 118696217845804, + 437765595482300, + 21888242871839275222246405745257275088548364400416034343698203851823621615824, + 21888242871839275222246405745257275088548364400416034343698204127446269013802, + 21888242871839275222246405745257275088548364400416034343698203903358531580304, + 144661584865816, + 47872959388324, + 405081291189477, + 21888242871839275222246405745257275088548364400416034343698204093027219750848, + 291360455442033, + 506085622683972, + 21888242871839275222246405745257275088548364400416034343698203751175550062651, + 4904844915012, + 21888242871839275222246405745257275088548364400416034343698203634582921878936, + 21888242871839275222246405745257275088548364400416034343698203762252948814327, + 21888242871839275222246405745257275088548364400416034343698204055596295091411, + 271955053659577, + 187754014819648, + 475444778208939, + 21888242871839275222246405745257275088548364400416034343698204112119873161833, + 21888242871839275222246405745257275088548364400416034343698203623978351647124, + 203837972857893, + 406029662856063, + 21888242871839275222246405745257275088548364400416034343698203980862962401460, + 21888242871839275222246405745257275088548364400416034343698203730032626108431, + 21888242871839275222246405745257275088548364400416034343698203823252272209846, + 224267962603985, + 531580554985469, + 21888242871839275222246405745257275088548364400416034343698203724955288806805, + 21888242871839275222246405745257275088548364400416034343698203851031779767569, + 21888242871839275222246405745257275088548364400416034343698203965415979455425, + 138917019248595, + 21888242871839275222246405745257275088548364400416034343698203757691564541988, + 275127036360114, + 217306627552354, + 21888242871839275222246405745257275088548364400416034343698203971212742867768, + 441809251485767, + 274489029291363, + 365729541571874, + 21888242871839275222246405745257275088548364400416034343698203907534774637426, + 21888242871839275222246405745257275088548364400416034343698204016211432587240, + 302599960837254, + 21888242871839275222246405745257275088548364400416034343698203677165938897341, + 24304515486800, + 21888242871839275222246405745257275088548364400416034343698203930643664577685, + 350505107044972, + 377712538704384, + 21888242871839275222246405745257275088548364400416034343698203978975235109968, + 481771152416361, + 21888242871839275222246405745257275088548364400416034343698203650254779954625, + 516151375210279, + 21888242871839275222246405745257275088548364400416034343698203646901422813061, + 21888242871839275222246405745257275088548364400416034343698203731980461154580, + 21888242871839275222246405745257275088548364400416034343698203861087282689740, + 21888242871839275222246405745257275088548364400416034343698204162898108508984, + 21888242871839275222246405745257275088548364400416034343698203637453696960273, + 424243062749259, + 21888242871839275222246405745257275088548364400416034343698203926529358583793, + 9268928293071, + 21888242871839275222246405745257275088548364400416034343698203907350284202473, + 21888242871839275222246405745257275088548364400416034343698203986800258956733, + 21888242871839275222246405745257275088548364400416034343698204103721876831882, + 481053926412390, + 21888242871839275222246405745257275088548364400416034343698203624769897786415, + 21888242871839275222246405745257275088548364400416034343698203758076049910465, + 21888242871839275222246405745257275088548364400416034343698204052691870066001, + 449227383839299, + 21888242871839275222246405745257275088548364400416034343698204133071351274834, + 510646380932447, + 21888242871839275222246405745257275088548364400416034343698203916438671774431, + 21888242871839275222246405745257275088548364400416034343698204106623295317952, + 31948855181054, + 296275193726387, + 21888242871839275222246405745257275088548364400416034343698203655112125919456, + 21888242871839275222246405745257275088548364400416034343698204136030437874917, + 21888242871839275222246405745257275088548364400416034343698203772020203345781, + 21888242871839275222246405745257275088548364400416034343698203739025771552951, + 21888242871839275222246405745257275088548364400416034343698203794493560397882, + 21888242871839275222246405745257275088548364400416034343698203798111726262186, + 21888242871839275222246405745257275088548364400416034343698203868867938095252, + 21888242871839275222246405745257275088548364400416034343698203950367034680682, + 21888242871839275222246405745257275088548364400416034343698203975177081961097, + 178112793593698, + 21888242871839275222246405745257275088548364400416034343698203983871479236833, + 21888242871839275222246405745257275088548364400416034343698203868816525814616, + 116245047831143, + 542828698626014, + 418674853300687, + 455279065528709, + 21888242871839275222246405745257275088548364400416034343698203868708064909896, + 231761411089639, + 143799481564921, + 364144175930930, + 21888242871839275222246405745257275088548364400416034343698203863659572601224, + 21888242871839275222246405745257275088548364400416034343698203903674741161383, + 298081821632075, + 21888242871839275222246405745257275088548364400416034343698203820386881759096, + 114439442693171, + 21888242871839275222246405745257275088548364400416034343698203718134632759592, + 21888242871839275222246405745257275088548364400416034343698203657640422705278, + 21888242871839275222246405745257275088548364400416034343698203722303196709516, + 116302921015196, + 21888242871839275222246405745257275088548364400416034343698204132237655912144, + 416663427278403, + 495931369228952, + 373511261843646, + 199295208386709, + 21888242871839275222246405745257275088548364400416034343698203870589238405577, + 266848272898800, + 297004616648492, + 21888242871839275222246405745257275088548364400416034343698204077274271325511, + 21888242871839275222246405745257275088548364400416034343698203773765915871788, + 154907724657731, + 21888242871839275222246405745257275088548364400416034343698203726731854414315, + 477815081749848, + 21888242871839275222246405745257275088548364400416034343698203633485781760663, + 21888242871839275222246405745257275088548364400416034343698203877687166330602, + 528631195511698, + 127852468189374, + 21888242871839275222246405745257275088548364400416034343698204090462690873419, + 455515066491241, + 21888242871839275222246405745257275088548364400416034343698203829670811154251, + 369753221361474, + 132048192938954, + 4698230722265, + 21888242871839275222246405745257275088548364400416034343698203818912097016800, + 21888242871839275222246405745257275088548364400416034343698204121092721485444, + 506398892745628, + 492778272528526, + 21888242871839275222246405745257275088548364400416034343698204027633395775770, + 21888242871839275222246405745257275088548364400416034343698203744786798363099, + 191797137249802, + 516190740810470, + 481569955073255, + 21888242871839275222246405745257275088548364400416034343698203900433896125485, + 21888242871839275222246405745257275088548364400416034343698204006061385592587, + 21888242871839275222246405745257275088548364400416034343698203936379751343547, + 255003142280987, + 277145860910470, + 91091572075591, + 152140138229076, + 216219509016804, + 21888242871839275222246405745257275088548364400416034343698203908470886379366, + 21888242871839275222246405745257275088548364400416034343698203670291707525937, + 21888242871839275222246405745257275088548364400416034343698204084789301317083, + 513228479178536, + 21888242871839275222246405745257275088548364400416034343698203779824626922868, + 343725690902934, + 21888242871839275222246405745257275088548364400416034343698203747951702346196, + 21888242871839275222246405745257275088548364400416034343698204039895339655875, + 21888242871839275222246405745257275088548364400416034343698203735531658751327, + 21888242871839275222246405745257275088548364400416034343698203934503982383775, + 447819841183103, + 21888242871839275222246405745257275088548364400416034343698203828753592737532, + 366055759553812, + 372469953066480, + 21888242871839275222246405745257275088548364400416034343698203735744898632945, + 189249321248706, + 439212600591552, + 106457135834284, + 548866562626377, + 21888242871839275222246405745257275088548364400416034343698204016776981815060, + 157446270761419, + 21888242871839275222246405745257275088548364400416034343698203772245080571853, + 78627972485019, + 163358188804148, + 22266766369294, + 21888242871839275222246405745257275088548364400416034343698203629292617250887, + 325511459569457, + 54289354188829, + 21888242871839275222246405745257275088548364400416034343698203827613307562252, + 21888242871839275222246405745257275088548364400416034343698203650558147487497, + 47767408202419, + 21888242871839275222246405745257275088548364400416034343698203841425389543048, + 21888242871839275222246405745257275088548364400416034343698204050625392641518, + 338113412882637, + 21888242871839275222246405745257275088548364400416034343698203761076565747257, + 21888242871839275222246405745257275088548364400416034343698204180656204139956, + 40627164344907, + 21888242871839275222246405745257275088548364400416034343698203888613154805620, + 395186955379965, + 21888242871839275222246405745257275088548364400416034343698203939902825301218, + 401433481804707, + 252689758100037, + 503556851419049, + 21888242871839275222246405745257275088548364400416034343698204066677000484646, + 456190639899390, + 21888242871839275222246405745257275088548364400416034343698203759316915036894, + 353608497363669, + 107255606530392, + 157803529069679, + 205361089545021, + 21888242871839275222246405745257275088548364400416034343698204054886131264487, + 21888242871839275222246405745257275088548364400416034343698203787528767844971, + 21888242871839275222246405745257275088548364400416034343698204102127808453449, + 516139543808137, + 21888242871839275222246405745257275088548364400416034343698203901232124747855, + 21888242871839275222246405745257275088548364400416034343698203763857186585009, + 21888242871839275222246405745257275088548364400416034343698204168403636041378, + 21888242871839275222246405745257275088548364400416034343698204047966997913846, + 297324809434279, + 21888242871839275222246405745257275088548364400416034343698203665600620372050, + 178880325762436, + 364425915410830, + 428210247464309, + 21888242871839275222246405745257275088548364400416034343698203870053088660557, + 414405047231160, + 89452178372844, + 21888242871839275222246405745257275088548364400416034343698203881548088891316, + 21888242871839275222246405745257275088548364400416034343698203962859789185898, + 412902791848992, + 21888242871839275222246405745257275088548364400416034343698203879156149089989, + 21888242871839275222246405745257275088548364400416034343698204087299335851836, + 21888242871839275222246405745257275088548364400416034343698204160925962298952, + 21888242871839275222246405745257275088548364400416034343698203809965728933103, + 21888242871839275222246405745257275088548364400416034343698203652997559609620, + 21888242871839275222246405745257275088548364400416034343698203965123362877035, + 21888242871839275222246405745257275088548364400416034343698203700773277848822, + 53944586734174, + 21888242871839275222246405745257275088548364400416034343698204020821275729740, + 218116491050824, + 254505102475104, + 437638925498010, + 129177266225084, + 21888242871839275222246405745257275088548364400416034343698203685093193624387, + 21888242871839275222246405745257275088548364400416034343698204047262326852304, + 206156395865050, + 479768408850966, + 364445342302560, + 358889075317202, + 21888242871839275222246405745257275088548364400416034343698203915419567511791, + 21888242871839275222246405745257275088548364400416034343698204181883786617123, + 21888242871839275222246405745257275088548364400416034343698203648411466588554, + 21888242871839275222246405745257275088548364400416034343698203829876800453460, + 21888242871839275222246405745257275088548364400416034343698204011366252322489, + 21888242871839275222246405745257275088548364400416034343698203759217324474342, + 106629836911199, + 137573578086456, + 21888242871839275222246405745257275088548364400416034343698203756778294921423, + 153145135371291, + 21888242871839275222246405745257275088548364400416034343698203874708286825228, + 21888242871839275222246405745257275088548364400416034343698203920255508445970, + 159469589719263, + 332084093697721, + 553093727192217, + 21888242871839275222246405745257275088548364400416034343698204180576629918690, + 21888242871839275222246405745257275088548364400416034343698203710932155719703, + 473006879866923, + 21888242871839275222246405745257275088548364400416034343698203701280336842908, + 21888242871839275222246405745257275088548364400416034343698204092918145861413, + 483267162156992, + 21888242871839275222246405745257275088548364400416034343698204045361901048409, + 21888242871839275222246405745257275088548364400416034343698204048047286037766, + 199960911756064, + 321875170381996, + 21888242871839275222246405745257275088548364400416034343698204052189550337179, + 418579457687689, + 21888242871839275222246405745257275088548364400416034343698203630015933805631, + 162603273871027, + 53751826495073, + 21888242871839275222246405745257275088548364400416034343698204146885954359184, + 21888242871839275222246405745257275088548364400416034343698203692413938624622, + 21888242871839275222246405745257275088548364400416034343698203804743968982515, + 98941105992034, + 293907832789517, + 21888242871839275222246405745257275088548364400416034343698203853018442549195, + 21888242871839275222246405745257275088548364400416034343698203990990639647349, + 21888242871839275222246405745257275088548364400416034343698204049324034223068, + 21888242871839275222246405745257275088548364400416034343698204130115897668706, + 430379383591053, + 21888242871839275222246405745257275088548364400416034343698203831323995612397, + 161927079684836, + 21888242871839275222246405745257275088548364400416034343698203854943728590320, + 21888242871839275222246405745257275088548364400416034343698203720381711864057, + 452027721038934, + 81963286328715, + 118870554608618, + 254237115687446, + 374405697384487, + 105793040648139, + 21888242871839275222246405745257275088548364400416034343698204162289951643751, + 109340617717036, + 21888242871839275222246405745257275088548364400416034343698203661971042316023, + 21888242871839275222246405745257275088548364400416034343698204127815738964264, + 184897458096487, + 21888242871839275222246405745257275088548364400416034343698203809276174051390, + 150942655828595, + 21888242871839275222246405745257275088548364400416034343698203836588328500401, + 424469026048791, + 218029169022486, + 351682895923168, + 452575743984512, + 21888242871839275222246405745257275088548364400416034343698204087631981485710, + 14025732735252, + 21888242871839275222246405745257275088548364400416034343698204026822109286112, + 450221619259718, + 498000223851808, + 432620770797665, + 197101495004872, + 153954715919844, + 481264485800872, + 21888242871839275222246405745257275088548364400416034343698204043819506387143, + 21888242871839275222246405745257275088548364400416034343698203980288174100408, + 21888242871839275222246405745257275088548364400416034343698204050563948025734, + 146025963223621, + 21888242871839275222246405745257275088548364400416034343698203928186014771016, + 21888242871839275222246405745257275088548364400416034343698203898370899924590, + 21888242871839275222246405745257275088548364400416034343698203721939292153075, + 190308327438649, + 529961161332114, + 416697077967244, + 21888242871839275222246405745257275088548364400416034343698203713428705531445, + 290327666776094, + 505072884781035, + 61320625863629, + 398850615922115, + 21888242871839275222246405745257275088548364400416034343698203774832073602135, + 72472708718463, + 65002779717034, + 152721541090967, + 21888242871839275222246405745257275088548364400416034343698204015693419943420, + 19648297046542, + 86778637795785, + 147001199515994, + 256598595713625, + 21888242871839275222246405745257275088548364400416034343698203700211948462547, + 21888242871839275222246405745257275088548364400416034343698203718349677326205, + 21888242871839275222246405745257275088548364400416034343698204155343614267223, + 290012478860068, + 549029701522244, + 21888242871839275222246405745257275088548364400416034343698203789192442045883, + 209892991163877, + 156141586361957, + 21888242871839275222246405745257275088548364400416034343698203896301684738234, + 561426159813540, + 436869159422310, + 21888242871839275222246405745257275088548364400416034343698203973724551713616, + 269386896808166, + 254430692153926, + 21888242871839275222246405745257275088548364400416034343698203843910127434098, + 21888242871839275222246405745257275088548364400416034343698203950707535825835, + 123732201930386, + 319888059025193, + 319428540812363, + 21888242871839275222246405745257275088548364400416034343698203877985337873087, + 21888242871839275222246405745257275088548364400416034343698203757981629537884, + 21888242871839275222246405745257275088548364400416034343698203764556834141335, + 125205641958479, + 21888242871839275222246405745257275088548364400416034343698203625557281945335, + 545339760023248, + 21888242871839275222246405745257275088548364400416034343698203973481149372119, + 21888242871839275222246405745257275088548364400416034343698203661363991708225, + 554475610099308, + 21888242871839275222246405745257275088548364400416034343698203941412689703179, + 21888242871839275222246405745257275088548364400416034343698204130374835096582, + 21888242871839275222246405745257275088548364400416034343698203787924460085821, + 493340582622047, + 21888242871839275222246405745257275088548364400416034343698203987144898011715, + 69256923008205, + 21888242871839275222246405745257275088548364400416034343698204074549317330067, + 487791960344773, + 21888242871839275222246405745257275088548364400416034343698203651483986377016, + 21888242871839275222246405745257275088548364400416034343698203944189215211996, + 21888242871839275222246405745257275088548364400416034343698203686536349811634, + 419744488465846, + 21888242871839275222246405745257275088548364400416034343698204150213284399446, + 21888242871839275222246405745257275088548364400416034343698203765813999846739, + 3879035770793, + 21888242871839275222246405745257275088548364400416034343698203949670845123884, + 19908461314262, + 21888242871839275222246405745257275088548364400416034343698203782412367282940, + 452788907775556, + 167134739358702, + 352306422720181, + 496660533255, + 21888242871839275222246405745257275088548364400416034343698203898407311027244, + 21095964068467, + 183227550931463, + 185732630723713, + 21888242871839275222246405745257275088548364400416034343698203939126272368522, + 21888242871839275222246405745257275088548364400416034343698204009860232475500, + 281152475177874, + 18073882072362, + 161495560144807, + 328342582604137, + 118943709878046, + 338540488606677, + 103486081091032, + 21888242871839275222246405745257275088548364400416034343698203982650383206070, + 21888242871839275222246405745257275088548364400416034343698203782305520686177, + 459618574059502, + 21888242871839275222246405745257275088548364400416034343698204101071319055624, + 21888242871839275222246405745257275088548364400416034343698203845259938474904, + 21888242871839275222246405745257275088548364400416034343698204002221078412531, + 521718375588031, + 504899033539853, + 21888242871839275222246405745257275088548364400416034343698204068928745915077, + 21888242871839275222246405745257275088548364400416034343698203812342912752614, + 21888242871839275222246405745257275088548364400416034343698203697027807869751, + 42117734772051, + 21888242871839275222246405745257275088548364400416034343698203891338529579381, + 21888242871839275222246405745257275088548364400416034343698203863944075355106, + 21888242871839275222246405745257275088548364400416034343698204080097942575210, + 71439764438668, + 21888242871839275222246405745257275088548364400416034343698203943912818889853, + 21888242871839275222246405745257275088548364400416034343698204087470204506503, + 5237794852876, + 554093816380067, + 21888242871839275222246405745257275088548364400416034343698203659770232946429, + 463238325195870, + 21888242871839275222246405745257275088548364400416034343698203818708836596074, + 464675852201147, + 21888242871839275222246405745257275088548364400416034343698203856864018567750, + 21888242871839275222246405745257275088548364400416034343698203893398490929141, + 21888242871839275222246405745257275088548364400416034343698203697550133601010, + 21888242871839275222246405745257275088548364400416034343698204186012224652805, + 21888242871839275222246405745257275088548364400416034343698204081557904214309, + 224353803251868, + 350283613615439, + 385270527569445, + 386741223947946, + 309557818382767, + 21888242871839275222246405745257275088548364400416034343698203775955042219633, + 469984133497490, + 461027056171389, + 21888242871839275222246405745257275088548364400416034343698204055981967871995, + 21888242871839275222246405745257275088548364400416034343698203697518424566520, + 21888242871839275222246405745257275088548364400416034343698203965670517482008, + 184334455989441, + 21888242871839275222246405745257275088548364400416034343698203830256035397646, + 264491440406743, + 252600515165179, + 155199467234304, + 315961089279251, + 263996666041762, + 465117792203444, + 21888242871839275222246405745257275088548364400416034343698203739797337309269, + 121379617180728, + 516031758415173, + 152752618896148, + 221750141419973, + 391350582915993, + 144243902521599, + 21888242871839275222246405745257275088548364400416034343698203755058100222903, + 466510568240970, + 225728710128198, + 21888242871839275222246405745257275088548364400416034343698203792040354424295, + 21888242871839275222246405745257275088548364400416034343698203739077183668866, + 139294749180255, + 152869656545855, + 21888242871839275222246405745257275088548364400416034343698204068575595889268, + 21888242871839275222246405745257275088548364400416034343698203992323415000134, + 21888242871839275222246405745257275088548364400416034343698203839312143300944, + 366853690819990, + 188292352827534, + 21888242871839275222246405745257275088548364400416034343698203855440861866166, + 25876070429435, + 21888242871839275222246405745257275088548364400416034343698203727315181113013, + 126334530700400, + 401167874765276, + 377068276984027, + 168271004869875, + 184093851164979, + 512835566177658, + 84079438579, + 542704258156604, + 21888242871839275222246405745257275088548364400416034343698203667087165664409, + 21888242871839275222246405745257275088548364400416034343698204017207794654993, + 114495493058545, + 21888242871839275222246405745257275088548364400416034343698204007415174560967, + 21888242871839275222246405745257275088548364400416034343698203971085395531374, + 369863863647461, + 21888242871839275222246405745257275088548364400416034343698204037619521601760, + 261594024820000, + 21888242871839275222246405745257275088548364400416034343698204027586888535449, + 202352516086586, + 106996123392459, + 21888242871839275222246405745257275088548364400416034343698203931690469991483, + 21888242871839275222246405745257275088548364400416034343698203843277089139236, + 394706107159064, + 223561904562176, + 21888242871839275222246405745257275088548364400416034343698203941123186915974, + 21888242871839275222246405745257275088548364400416034343698203954016457705774, + 21888242871839275222246405745257275088548364400416034343698203686582348222477, + 21888242871839275222246405745257275088548364400416034343698203912275672042359, + 523316883575744, + 282482912023434, + 548752135786923, + 21888242871839275222246405745257275088548364400416034343698203652022977035960, + 21888242871839275222246405745257275088548364400416034343698203875615237662513, + 21888242871839275222246405745257275088548364400416034343698203909459483431961, + 136340502232201, + 21888242871839275222246405745257275088548364400416034343698203928617740176386, + 21888242871839275222246405745257275088548364400416034343698203657012130588519, + 25665147379543, + 479366803547786, + 21888242871839275222246405745257275088548364400416034343698204118454851061752, + 126809617083580, + 21888242871839275222246405745257275088548364400416034343698204052986726536720, + 21888242871839275222246405745257275088548364400416034343698204113348617745866, + 21888242871839275222246405745257275088548364400416034343698203682289184195164, + 492643912097129, + 21888242871839275222246405745257275088548364400416034343698203711057396018625, + 357831933645292, + 21888242871839275222246405745257275088548364400416034343698203969590447633707, + 21888242871839275222246405745257275088548364400416034343698203651256890551891, + 21888242871839275222246405745257275088548364400416034343698204061959652602726, + 21888242871839275222246405745257275088548364400416034343698203776387579507642, + 21888242871839275222246405745257275088548364400416034343698203856734005301848, + 21888242871839275222246405745257275088548364400416034343698203642058860580999, + 492273575161770, + 109095796376760, + 21888242871839275222246405745257275088548364400416034343698204091169327111916, + 257756671877558, + 286769883856131, + 21888242871839275222246405745257275088548364400416034343698204051578049942412, + 21888242871839275222246405745257275088548364400416034343698203690308945071637, + 21888242871839275222246405745257275088548364400416034343698204162404122543927, + 21888242871839275222246405745257275088548364400416034343698203717284756239243, + 21888242871839275222246405745257275088548364400416034343698203766317943806193, + 159033395470062, + 21888242871839275222246405745257275088548364400416034343698204078851370064687, + 445361643030015, + 288772937573245, + 288745417511364, + 392533959020938, + 305158838689956, + 21888242871839275222246405745257275088548364400416034343698203683588104429165, + 103697469080392, + 21888242871839275222246405745257275088548364400416034343698203934687218354763, + 500619114325384, + 338711368634874, + 225354591414923, + 60146355738073, + 21888242871839275222246405745257275088548364400416034343698203809073880799912, + 452933780704451, + 21888242871839275222246405745257275088548364400416034343698204121414643007168, + 21888242871839275222246405745257275088548364400416034343698203667727421342378, + 21888242871839275222246405745257275088548364400416034343698203868454742831870, + 21888242871839275222246405745257275088548364400416034343698203681754071028172, + 21888242871839275222246405745257275088548364400416034343698204109370641011382, + 21888242871839275222246405745257275088548364400416034343698204175034928681500, + 501845153269563, + 382602483390620, + 142085142380790, + 174913110813197, + 237180609705783, + 21888242871839275222246405745257275088548364400416034343698204123913431085231, + 21888242871839275222246405745257275088548364400416034343698203625347934227954, + 21888242871839275222246405745257275088548364400416034343698204120948351188471, + 21888242871839275222246405745257275088548364400416034343698203826418987734344, + 77829763258938, + 21888242871839275222246405745257275088548364400416034343698203971011213909715, + 176530613929262, + 542992132007701, + 21888242871839275222246405745257275088548364400416034343698204132843408941965, + 58287103103326, + 345803532193332, + 194957912005000, + 21888242871839275222246405745257275088548364400416034343698204115828999764250, + 21888242871839275222246405745257275088548364400416034343698203762757852242147, + 21888242871839275222246405745257275088548364400416034343698203942844061558608, + 428697996037919, + 304806595463406, + 428817989318046, + 21888242871839275222246405745257275088548364400416034343698203640852549276607, + 21888242871839275222246405745257275088548364400416034343698203649359787150713, + 21888242871839275222246405745257275088548364400416034343698203876684152228828, + 409848294022120, + 21888242871839275222246405745257275088548364400416034343698204159725856238614, + 434136382744723, + 494888200432092, + 21888242871839275222246405745257275088548364400416034343698203901176777142755, + 350887776840810, + 316637227367895, + 16529354485889, + 21888242871839275222246405745257275088548364400416034343698204129596863975658, + 64398633700997, + 21888242871839275222246405745257275088548364400416034343698203953960091326999, + 21888242871839275222246405745257275088548364400416034343698204176765836982559, + 21888242871839275222246405745257275088548364400416034343698203833550839684740, + 21888242871839275222246405745257275088548364400416034343698204047334813791624, + 21888242871839275222246405745257275088548364400416034343698204073686715187064, + 21888242871839275222246405745257275088548364400416034343698203717993893038084, + 21888242871839275222246405745257275088548364400416034343698203663944261915532, + 21888242871839275222246405745257275088548364400416034343698203890287634984433, + 211276985080151, + 21888242871839275222246405745257275088548364400416034343698203680089437953064, + 343142636546685, + 21888242871839275222246405745257275088548364400416034343698203659605267860088, + 172587120958141, + 48986391558803, + 21888242871839275222246405745257275088548364400416034343698203933951881295604, + 21888242871839275222246405745257275088548364400416034343698204172188956242546, + 21888242871839275222246405745257275088548364400416034343698204053145219346823, + 21888242871839275222246405745257275088548364400416034343698203956504969712371, + 202713740093461, + 399204855849203, + 21888242871839275222246405745257275088548364400416034343698204033720755849335, + 276140273270826, + 366998851194014, + 196687087112607, + 259070961525241, + 69713294720601, + 21888242871839275222246405745257275088548364400416034343698204174173687406341, + 285129157067211, + 21888242871839275222246405745257275088548364400416034343698203845326881003124, + 155410641140257, + 21888242871839275222246405745257275088548364400416034343698203953251606642481, + 21888242871839275222246405745257275088548364400416034343698203713454859017916, + 423966576299903, + 511967278687041, + 529930070516445, + 21888242871839275222246405745257275088548364400416034343698203723094932860408, + 21888242871839275222246405745257275088548364400416034343698203642491589120794, + 510673836939507, + 21888242871839275222246405745257275088548364400416034343698203878629770275269, + 21888242871839275222246405745257275088548364400416034343698203948522224216659, + 21888242871839275222246405745257275088548364400416034343698203705446799456083, + 394154291129683, + 385110689784322, + 21888242871839275222246405745257275088548364400416034343698204145561645722230, + 511565616230265, + 132642745722132, + 266109304160520, + 21888242871839275222246405745257275088548364400416034343698203792117026389949, + 380011421287344, + 22528545704039, + 284505261603327, + 178309454387250, + 21888242871839275222246405745257275088548364400416034343698203865787815955740, + 238887845420334, + 21888242871839275222246405745257275088548364400416034343698204148490502213564, + 101170751480426, + 21888242871839275222246405745257275088548364400416034343698203852675151486565, + 118738252225427, + 9636141955615, + 172869639541184, + 13808847864416, + 272823688939274, + 21888242871839275222246405745257275088548364400416034343698203662417634530108, + 75788028342000, + 433638113038485, + 21888242871839275222246405745257275088548364400416034343698204168464067136824, + 202871316636698, + 160717239395504, + 356892994586677, + 21888242871839275222246405745257275088548364400416034343698203728175406780250, + 245232017879932, + 21888242871839275222246405745257275088548364400416034343698203682979536465143, + 107366393088361, + 21888242871839275222246405745257275088548364400416034343698203945472164247670, + 21888242871839275222246405745257275088548364400416034343698203771273755258245, + 451550071523687, + 21888242871839275222246405745257275088548364400416034343698204101314477421716, + 517857446047859, + 444381717362616, + 63863351146795, + 21888242871839275222246405745257275088548364400416034343698203899745905586715, + 21888242871839275222246405745257275088548364400416034343698203862053903186400, + 258643314360436, + 21888242871839275222246405745257275088548364400416034343698203894349367524630, + 238413280434190, + 21888242871839275222246405745257275088548364400416034343698203642457376859939, + 21888242871839275222246405745257275088548364400416034343698203668718831647583, + 21888242871839275222246405745257275088548364400416034343698203712305338315410, + 215876743121521, + 509879264956408, + 21888242871839275222246405745257275088548364400416034343698203687088969428827, + 49799716474007, + 21888242871839275222246405745257275088548364400416034343698204051102888254803, + 21888242871839275222246405745257275088548364400416034343698203719664940467575, + 21888242871839275222246405745257275088548364400416034343698204093517768457850, + 21888242871839275222246405745257275088548364400416034343698203929033450835534, + 417381769095586, + 220654386474157, + 21888242871839275222246405745257275088548364400416034343698203897693446522842, + 455248588052380, + 438759092811253, + 97896823810886, + 21888242871839275222246405745257275088548364400416034343698203967993966884004, + 369799248815680, + 149769747613197, + 21888242871839275222246405745257275088548364400416034343698204031010551251800, + 183983478950410, + 21888242871839275222246405745257275088548364400416034343698203681626128961583, + 21888242871839275222246405745257275088548364400416034343698203657169657235853, + 21888242871839275222246405745257275088548364400416034343698203659186959435484, + 21888242871839275222246405745257275088548364400416034343698203682500789237463, + 268318242938818, + 469383706752364, + 359251702097011, + 183916514832370, + 21888242871839275222246405745257275088548364400416034343698203755763987475999, + 507333749151244, + 21888242871839275222246405745257275088548364400416034343698204027814550506975, + 21888242871839275222246405745257275088548364400416034343698203652820499383047, + 483306483648655, + 253207809011851, + 21888242871839275222246405745257275088548364400416034343698204078355842000184, + 16591536152282, + 322446594413397, + 21888242871839275222246405745257275088548364400416034343698204167871677061026, + 21888242871839275222246405745257275088548364400416034343698203945922007565150, + 21888242871839275222246405745257275088548364400416034343698203761206120799600, + 21888242871839275222246405745257275088548364400416034343698203774459049075409, + 344701433660656, + 21888242871839275222246405745257275088548364400416034343698203707791451354554, + 211102538020794, + 154494660250217, + 21888242871839275222246405745257275088548364400416034343698203869833463161968, + 363897348411980, + 21888242871839275222246405745257275088548364400416034343698204046232588343447, + 443204635913774, + 21888242871839275222246405745257275088548364400416034343698204021540908795060, + 21888242871839275222246405745257275088548364400416034343698203832413038753269, + 21888242871839275222246405745257275088548364400416034343698203898242070102410, + 560278303137213, + 313855414392823, + 95491865091209, + 268518925817411, + 149060177402158, + 284391523094404, + 42485221441796, + 431163262138745, + 21888242871839275222246405745257275088548364400416034343698203917649657613713, + 21888242871839275222246405745257275088548364400416034343698204103944274020065, + 21888242871839275222246405745257275088548364400416034343698204139219802772578, + 21888242871839275222246405745257275088548364400416034343698203699186761497620, + 21888242871839275222246405745257275088548364400416034343698203675669127222178, + 21888242871839275222246405745257275088548364400416034343698203627508421590697, + 282579539719753, + 400782223173530, + 21888242871839275222246405745257275088548364400416034343698204081681617584528, + 21888242871839275222246405745257275088548364400416034343698204040974214956607, + 21888242871839275222246405745257275088548364400416034343698203911574963057687, + 21888242871839275222246405745257275088548364400416034343698203629027581703018, + 21888242871839275222246405745257275088548364400416034343698203881261076908983, + 21888242871839275222246405745257275088548364400416034343698204126464953758153, + 21888242871839275222246405745257275088548364400416034343698204152404786303670, + 21888242871839275222246405745257275088548364400416034343698203735744661621561, + 174031155911140, + 21888242871839275222246405745257275088548364400416034343698203982516624233998, + 316734775708088, + 283549464710328, + 215495619385521, + 552209452140470, + 21888242871839275222246405745257275088548364400416034343698203892324392810481, + 21888242871839275222246405745257275088548364400416034343698203923305930414832, + 21888242871839275222246405745257275088548364400416034343698203848932431507235, + 21888242871839275222246405745257275088548364400416034343698203997639633140802, + 21888242871839275222246405745257275088548364400416034343698204103344370642581, + 394791788930780, + 21888242871839275222246405745257275088548364400416034343698203852645223132701, + 21888242871839275222246405745257275088548364400416034343698203764327274111916, + 425679437259561, + 21888242871839275222246405745257275088548364400416034343698203648387956258510, + 21888242871839275222246405745257275088548364400416034343698204151154851102225, + 348660881844655, + 21888242871839275222246405745257275088548364400416034343698203752451524860254, + 21888242871839275222246405745257275088548364400416034343698203763960874674558, + 416873251702623, + 21888242871839275222246405745257275088548364400416034343698204135120440136507, + 530490267368198, + 21888242871839275222246405745257275088548364400416034343698204054212464243293, + 21888242871839275222246405745257275088548364400416034343698204181621651832475, + 21888242871839275222246405745257275088548364400416034343698203918716934090097, + 228651390371724, + 92561891917800, + 21888242871839275222246405745257275088548364400416034343698204152020245712858, + 401401892463782, + 185413229578354, + 20276121276549, + 299648770028870, + 107049764370335, + 243473662541256, + 21888242871839275222246405745257275088548364400416034343698204091651776641581, + 21888242871839275222246405745257275088548364400416034343698203867814877564501, + 21888242871839275222246405745257275088548364400416034343698203975975599674637, + 544544171445510, + 157460860679539, + 400137520600110, + 21888242871839275222246405745257275088548364400416034343698203931674383525096, + 21888242871839275222246405745257275088548364400416034343698203815083461742161, + 21888242871839275222246405745257275088548364400416034343698204168017905586272, + 21888242871839275222246405745257275088548364400416034343698203980091913995184, + 140042350158265, + 419886831260502, + 408515826133702, + 21888242871839275222246405745257275088548364400416034343698203797937958357276, + 21888242871839275222246405745257275088548364400416034343698204031283932592714, + 22302776845157, + 21888242871839275222246405745257275088548364400416034343698203692105300270867, + 202959786400962, + 21888242871839275222246405745257275088548364400416034343698203909679785358025, + 21888242871839275222246405745257275088548364400416034343698204043942156900048, + 248122774600290, + 31350924016424, + 264295759637797, + 21888242871839275222246405745257275088548364400416034343698204118122039946455, + 195692803531032, + 21888242871839275222246405745257275088548364400416034343698203916880609148678, + 21888242871839275222246405745257275088548364400416034343698203701099412219822, + 21888242871839275222246405745257275088548364400416034343698203746890367921072, + 235499490117642, + 382950742821690, + 21888242871839275222246405745257275088548364400416034343698203649586841649382, + 392939640990005, + 21888242871839275222246405745257275088548364400416034343698203752094860430491, + 526947011363231, + 279555372957756, + 21888242871839275222246405745257275088548364400416034343698203640587996327917, + 21888242871839275222246405745257275088548364400416034343698203854851437297450, + 21888242871839275222246405745257275088548364400416034343698203649585326495068, + 385734663943318, + 344010983779439, + 21888242871839275222246405745257275088548364400416034343698204164141197231794, + 21888242871839275222246405745257275088548364400416034343698203646751972848884, + 21888242871839275222246405745257275088548364400416034343698203869703621312065, + 21888242871839275222246405745257275088548364400416034343698203750176816322663, + 480949229306731, + 533038858798770, + 21888242871839275222246405745257275088548364400416034343698204152450839156017, + 142326105215696, + 73453649753579, + 21888242871839275222246405745257275088548364400416034343698204110303121156868, + 523855640507532, + 210606947961384, + 21888242871839275222246405745257275088548364400416034343698204018254438356062, + 23024360395333, + 21888242871839275222246405745257275088548364400416034343698203671422748550265, + 21888242871839275222246405745257275088548364400416034343698203972915352522667, + 68881497569136, + 21888242871839275222246405745257275088548364400416034343698204148456637797088, + 21888242871839275222246405745257275088548364400416034343698203789143686876261, + 21888242871839275222246405745257275088548364400416034343698203650039968986775, + 21888242871839275222246405745257275088548364400416034343698203949645762228925, + 46181679215168, + 21888242871839275222246405745257275088548364400416034343698203839716270414441, + 21888242871839275222246405745257275088548364400416034343698203894791728347304, + 21888242871839275222246405745257275088548364400416034343698203968846172252533, + 21888242871839275222246405745257275088548364400416034343698204130781582411561, + 21888242871839275222246405745257275088548364400416034343698204082698306955262, + 47084948229080, + 356940407894790, + 21888242871839275222246405745257275088548364400416034343698203908510897589062, + 385143227636516, + 21888242871839275222246405745257275088548364400416034343698203835518463223501, + 21888242871839275222246405745257275088548364400416034343698203854284482417029, + 21888242871839275222246405745257275088548364400416034343698204118986595653546, + 236714909150822, + 21888242871839275222246405745257275088548364400416034343698203624276540441053, + 85245309055301, + 384665601087787, + 21888242871839275222246405745257275088548364400416034343698203985975836337967, + 21888242871839275222246405745257275088548364400416034343698204163048757499655, + 430181365893875, + 21888242871839275222246405745257275088548364400416034343698203918551823261582, + 21888242871839275222246405745257275088548364400416034343698204024838204762057, + 250897168192645, + 21888242871839275222246405745257275088548364400416034343698203993787738066447, + 397355716244845, + 361381135397889, + 21888242871839275222246405745257275088548364400416034343698203996977233017680, + 21888242871839275222246405745257275088548364400416034343698203715213731853321, + 399455926420166, + 381945677616405, + 505602734254274, + 21888242871839275222246405745257275088548364400416034343698203955050357205882, + 21888242871839275222246405745257275088548364400416034343698203945475823552992, + 21888242871839275222246405745257275088548364400416034343698203834790138569780, + 407811353344831, + 21888242871839275222246405745257275088548364400416034343698203959929388406433, + 854875879067, + 21888242871839275222246405745257275088548364400416034343698203705939756612389, + 30129804407600, + 21888242871839275222246405745257275088548364400416034343698204139772183167429, + 163814169797532, + 53574648738572, + 223311007410380, + 419145082681712, + 21888242871839275222246405745257275088548364400416034343698203715801249318965, + 129785807562004, + 144241013405408, + 560021522538932, + 21888242871839275222246405745257275088548364400416034343698203950768146243815, + 162941378049851, + 21888242871839275222246405745257275088548364400416034343698203791126580481621, + 21888242871839275222246405745257275088548364400416034343698203754536804623396, + 21888242871839275222246405745257275088548364400416034343698203838135859194067, + 21888242871839275222246405745257275088548364400416034343698204008922366127897, + 21888242871839275222246405745257275088548364400416034343698203993202555799993, + 21888242871839275222246405745257275088548364400416034343698204056197054384209, + 142065347197364, + 491214784931442, + 538200505595509, + 21888242871839275222246405745257275088548364400416034343698203737246294235212, + 21888242871839275222246405745257275088548364400416034343698204036031399504391, + 21888242871839275222246405745257275088548364400416034343698204108845521805561, + 21888242871839275222246405745257275088548364400416034343698203767311159647967, + 21888242871839275222246405745257275088548364400416034343698203927982240981774, + 259145069823319, + 287402230765256, + 21888242871839275222246405745257275088548364400416034343698204134508649538367, + 21888242871839275222246405745257275088548364400416034343698204077478614393727, + 21888242871839275222246405745257275088548364400416034343698203772912747453594, + 21888242871839275222246405745257275088548364400416034343698203902541009078184, + 364388316514119, + 21888242871839275222246405745257275088548364400416034343698203682001367318183, + 270518107270497, + 119477111773909, + 410992246384682, + 306597572088375, + 178908012980229, + 302704219402302, + 21888242871839275222246405745257275088548364400416034343698204114649679300016, + 21888242871839275222246405745257275088548364400416034343698204144476709793119, + 68647841868473, + 539959849892873, + 21888242871839275222246405745257275088548364400416034343698203943706995858379, + 21888242871839275222246405745257275088548364400416034343698204070138878015478, + 7292404318743, + 21888242871839275222246405745257275088548364400416034343698204043319337300412, + 162667935584138, + 21888242871839275222246405745257275088548364400416034343698203891657843266237, + 50219732607058, + 21888242871839275222246405745257275088548364400416034343698203828710922095181, + 325219949123930, + 21888242871839275222246405745257275088548364400416034343698204035897611064091, + 21888242871839275222246405745257275088548364400416034343698203647490649847674, + 21888242871839275222246405745257275088548364400416034343698203982584009863325, + 197348474163414, + 253094762881742, + 329138972576990, + 233434565376960, + 105667804929355, + 21888242871839275222246405745257275088548364400416034343698204115435328812253, + 221045927942427, + 499644577240667, + 395232526209959, + 404149166484622, + 38381103199048, + 21888242871839275222246405745257275088548364400416034343698203663585900353612, + 21888242871839275222246405745257275088548364400416034343698204046727063331445, + 21888242871839275222246405745257275088548364400416034343698204175464078582503, + 316481181405572, + 21888242871839275222246405745257275088548364400416034343698204044850976033650, + 21888242871839275222246405745257275088548364400416034343698204053644221192049, + 21888242871839275222246405745257275088548364400416034343698204164337645647746, + 21888242871839275222246405745257275088548364400416034343698204183039141293155, + 515589239554199, + 21888242871839275222246405745257275088548364400416034343698203949103516131440, + 484145600256915, + 21888242871839275222246405745257275088548364400416034343698203935862694263148, + 21888242871839275222246405745257275088548364400416034343698203995289101712832, + 208528605949231, + 21888242871839275222246405745257275088548364400416034343698203744720391227120, + 21888242871839275222246405745257275088548364400416034343698204114560799735137, + 21888242871839275222246405745257275088548364400416034343698203739836728687182, + 21888242871839275222246405745257275088548364400416034343698203960741727498389, + 21888242871839275222246405745257275088548364400416034343698203769539673629843, + 2158544621485, + 549697381534448, + 21888242871839275222246405745257275088548364400416034343698203864536466093721, + 192437530615539, + 140012604655112, + 21888242871839275222246405745257275088548364400416034343698204149530431862554, + 475888949393712, + 500581091675189, + 21888242871839275222246405745257275088548364400416034343698203743323171036669, + 21888242871839275222246405745257275088548364400416034343698203948314187959540, + 21888242871839275222246405745257275088548364400416034343698204160202097242115, + 121834004383098, + 21888242871839275222246405745257275088548364400416034343698203970739779659495, + 21888242871839275222246405745257275088548364400416034343698204095697837271206, + 254028714448875, + 292117956409546, + 134417177670285, + 21888242871839275222246405745257275088548364400416034343698203657000364081503, + 161616748595800, + 11971715838237, + 21888242871839275222246405745257275088548364400416034343698204125063882973145, + 310158578924230, + 21888242871839275222246405745257275088548364400416034343698203823223887121023, + 454695629212090, + 374986291701051, + 21888242871839275222246405745257275088548364400416034343698204078371310432914, + 21888242871839275222246405745257275088548364400416034343698204130108818473360, + 169531544472704, + 10290291041509, + 196501065654112, + 354112700199818, + 21888242871839275222246405745257275088548364400416034343698204115157882455685, + 513516937736659, + 515996257258102, + 21888242871839275222246405745257275088548364400416034343698204038492246979438, + 21888242871839275222246405745257275088548364400416034343698204044816720446611, + 186671665577106, + 21888242871839275222246405745257275088548364400416034343698203849447179648007, + 21888242871839275222246405745257275088548364400416034343698203793337618299376, + 21888242871839275222246405745257275088548364400416034343698204102171624152629, + 150820572654756, + 21888242871839275222246405745257275088548364400416034343698204063780556733264, + 21888242871839275222246405745257275088548364400416034343698203695166892704907, + 21888242871839275222246405745257275088548364400416034343698203655763891996884, + 537066317949446, + 21888242871839275222246405745257275088548364400416034343698203812347759116403, + 21888242871839275222246405745257275088548364400416034343698204119346433271661, + 21888242871839275222246405745257275088548364400416034343698203778625863992369, + 21888242871839275222246405745257275088548364400416034343698204042119622777640, + 271477926230531, + 377766358024145, + 188703183186781, + 442720598484660, + 21888242871839275222246405745257275088548364400416034343698204030966476205994, + 24114649245378, + 21888242871839275222246405745257275088548364400416034343698203916879305964404, + 471612083323608, + 21888242871839275222246405745257275088548364400416034343698203952005380155642, + 372653637904203, + 346612620048685, + 21888242871839275222246405745257275088548364400416034343698203718862767336406, + 244179200359228, + 21888242871839275222246405745257275088548364400416034343698203840817967573427, + 626082767690, + 262234477148665, + 21888242871839275222246405745257275088548364400416034343698203658432605210882, + 3267634211452, + 274538108301276, + 21888242871839275222246405745257275088548364400416034343698203906619517596752, + 89899180262043, + 434931158387899, + 21888242871839275222246405745257275088548364400416034343698204007582240230093, + 21888242871839275222246405745257275088548364400416034343698203793191576804915, + 491497425527310, + 21888242871839275222246405745257275088548364400416034343698203818211358463723, + 238299185503419, + 313982258879792, + 558475238304968, + 2904758375382, + 432356106416022, + 21888242871839275222246405745257275088548364400416034343698204058526287237294, + 21888242871839275222246405745257275088548364400416034343698203932303260857024, + 21888242871839275222246405745257275088548364400416034343698204075685099800648, + 21888242871839275222246405745257275088548364400416034343698204185398981255590, + 21888242871839275222246405745257275088548364400416034343698204101052006938821, + 21888242871839275222246405745257275088548364400416034343698203897103002225071, + 21888242871839275222246405745257275088548364400416034343698203924983192639262, + 21888242871839275222246405745257275088548364400416034343698203981035353262792, + 326751151636306, + 193174807017472, + 246933774796008, + 401181138955653, + 21888242871839275222246405745257275088548364400416034343698203944427836973289, + 515848483298680, + 231165184592836, + 21888242871839275222246405745257275088548364400416034343698203735480018717902, + 21888242871839275222246405745257275088548364400416034343698203840167920269506, + 21888242871839275222246405745257275088548364400416034343698203638798709638567, + 168207976900410, + 239190379022496, + 46684675302242, + 155914437076277, + 325193285015596, + 21888242871839275222246405745257275088548364400416034343698203788811727271984, + 522988443593645, + 370699935586155, + 191444557523656, + 38635625355085, + 21888242871839275222246405745257275088548364400416034343698204109374767661179, + 142545295431809, + 461978943968852, + 21888242871839275222246405745257275088548364400416034343698204028822551122898, + 21888242871839275222246405745257275088548364400416034343698204172269197924496, + 21888242871839275222246405745257275088548364400416034343698203914784762907831, + 143592887551349, + 425073512936348, + 21888242871839275222246405745257275088548364400416034343698203644491257428908, + 39631948582519, + 143914088957277, + 21888242871839275222246405745257275088548364400416034343698204019514184635121, + 21888242871839275222246405745257275088548364400416034343698203736146038517881, + 21888242871839275222246405745257275088548364400416034343698204070577505659984, + 21888242871839275222246405745257275088548364400416034343698204079812042420874, + 21888242871839275222246405745257275088548364400416034343698203938595336684671, + 160130627676629, + 21888242871839275222246405745257275088548364400416034343698203665081811913833, + 21888242871839275222246405745257275088548364400416034343698203663142882848785, + 21888242871839275222246405745257275088548364400416034343698204046538692772676, + 21888242871839275222246405745257275088548364400416034343698203770522334410926, + 21888242871839275222246405745257275088548364400416034343698203804093514180968, + 76689422393813, + 21888242871839275222246405745257275088548364400416034343698203780715971486628, + 21888242871839275222246405745257275088548364400416034343698203691139062034216, + 44769146386251, + 390033479982909, + 21888242871839275222246405745257275088548364400416034343698203763470164768957, + 457628626070963, + 21888242871839275222246405745257275088548364400416034343698203991046318446978, + 21888242871839275222246405745257275088548364400416034343698204101098406195477, + 21888242871839275222246405745257275088548364400416034343698203971600492196472, + 412838557474921, + 1024965316438, + 21888242871839275222246405745257275088548364400416034343698203970311058077067, + 21888242871839275222246405745257275088548364400416034343698203862142260999206, + 21888242871839275222246405745257275088548364400416034343698204092829422140726, + 21888242871839275222246405745257275088548364400416034343698203677002069975510, + 21888242871839275222246405745257275088548364400416034343698203700737034428483, + 21888242871839275222246405745257275088548364400416034343698203673140776976121, + 21888242871839275222246405745257275088548364400416034343698203985744791934279, + 562274051718645, + 111004788227731, + 18339524038714, + 424207622953016, + 314372094771268, + 21888242871839275222246405745257275088548364400416034343698204015726713747721, + 21888242871839275222246405745257275088548364400416034343698203764623295378824, + 268051547611536, + 337051805747670, + 457818429987327, + 246975231439740, + 112023625813713, + 470730740351889, + 540919254539039, + 476866331286401, + 10836538354222, + 21888242871839275222246405745257275088548364400416034343698204055396351900281, + 419570330678496, + 21888242871839275222246405745257275088548364400416034343698203844603312483957, + 464157319034189, + 423541793238850, + 21888242871839275222246405745257275088548364400416034343698204165220384560667, + 341141244711429, + 179230552287229, + 21888242871839275222246405745257275088548364400416034343698204154382934711096, + 111813746259513, + 80298482191052, + 21888242871839275222246405745257275088548364400416034343698203708761165179977, + 9633706414990, + 21888242871839275222246405745257275088548364400416034343698203641335035750203, + 21888242871839275222246405745257275088548364400416034343698203839523635892648, + 186620185744299, + 21888242871839275222246405745257275088548364400416034343698203868065396887698, + 39647472467166, + 202430399208895, + 122480182190765, + 344285082824466, + 21888242871839275222246405745257275088548364400416034343698203731106761874914, + 21888242871839275222246405745257275088548364400416034343698204147291722431102, + 549660765282260, + 21888242871839275222246405745257275088548364400416034343698203843094016212324, + 21888242871839275222246405745257275088548364400416034343698204100588911188310, + 21888242871839275222246405745257275088548364400416034343698203777799026447917, + 509830312253173, + 21888242871839275222246405745257275088548364400416034343698203722363353950596, + 325339100754390, + 21888242871839275222246405745257275088548364400416034343698203697655136537271, + 184465997723742, + 21888242871839275222246405745257275088548364400416034343698204048507966618789, + 21888242871839275222246405745257275088548364400416034343698203988821325775620, + 54250231134802, + 21888242871839275222246405745257275088548364400416034343698203783317029469825, + 21888242871839275222246405745257275088548364400416034343698203799059588842769, + 21888242871839275222246405745257275088548364400416034343698204066044316998198, + 154295916430245, + 61609530070384, + 21888242871839275222246405745257275088548364400416034343698203715069508384255, + 499142139577645, + 90202050371508, + 21888242871839275222246405745257275088548364400416034343698204183942349316606, + 21888242871839275222246405745257275088548364400416034343698203691122120288432, + 21888242871839275222246405745257275088548364400416034343698203662634998356048, + 533170213300170, + 21888242871839275222246405745257275088548364400416034343698203679618631276310, + 320598309107341, + 480978087631522, + 21888242871839275222246405745257275088548364400416034343698203987810643075431, + 364378047370115, + 192403579956970, + 21888242871839275222246405745257275088548364400416034343698203922960905654351, + 486453876062888, + 21888242871839275222246405745257275088548364400416034343698204070535088021475, + 217419884768736, + 21888242871839275222246405745257275088548364400416034343698203917365799707038, + 153055721092871, + 21888242871839275222246405745257275088548364400416034343698203830936379775625, + 356494771935799, + 21888242871839275222246405745257275088548364400416034343698203707633712074968, + 21888242871839275222246405745257275088548364400416034343698204002791229284971, + 63005467002827, + 82367173636645, + 404810776760373, + 419987309912833, + 280671189262826, + 21888242871839275222246405745257275088548364400416034343698203895221948377904, + 21888242871839275222246405745257275088548364400416034343698203684207865238965, + 453683523574409, + 21888242871839275222246405745257275088548364400416034343698203692602127192298, + 164769024928954, + 21888242871839275222246405745257275088548364400416034343698203867319746937134, + 313173554834847, + 21888242871839275222246405745257275088548364400416034343698203759140703743138, + 258977277410287, + 496911235739224, + 21888242871839275222246405745257275088548364400416034343698204086015711082440, + 21888242871839275222246405745257275088548364400416034343698203642454487118202, + 21888242871839275222246405745257275088548364400416034343698204158561810308624, + 450644244411722, + 21888242871839275222246405745257275088548364400416034343698204104675020389555, + 388025866649912, + 21888242871839275222246405745257275088548364400416034343698203935863079651696, + 368018172463760, + 21888242871839275222246405745257275088548364400416034343698203659514820294348, + 508923375025121, + 52933844982119, + 546899298813648, + 63912592001330, + 21888242871839275222246405745257275088548364400416034343698203663724719180364, + 21888242871839275222246405745257275088548364400416034343698204134171248422067, + 88175428934007, + 371214357843967, + 21888242871839275222246405745257275088548364400416034343698204067074264685906, + 72272417026215, + 219524856079734, + 21888242871839275222246405745257275088548364400416034343698203950747464196678, + 476263082877713, + 21888242871839275222246405745257275088548364400416034343698203799852373345129, + 21888242871839275222246405745257275088548364400416034343698203771029947529877, + 389582891295654, + 459692886181758, + 205091958648031, + 21888242871839275222246405745257275088548364400416034343698204159066826910220, + 172686760021223, + 450752258189940, + 204178946343123, + 177790698059098, + 21888242871839275222246405745257275088548364400416034343698204064819251218710, + 21888242871839275222246405745257275088548364400416034343698203902203675150862, + 21888242871839275222246405745257275088548364400416034343698203712759585813048, + 507698596126096, + 457872412656827, + 21888242871839275222246405745257275088548364400416034343698204014670256820826, + 522126250446274, + 21888242871839275222246405745257275088548364400416034343698203767150599727990, + 21888242871839275222246405745257275088548364400416034343698203865120609577989, + 21888242871839275222246405745257275088548364400416034343698204182075172089379, + 21888242871839275222246405745257275088548364400416034343698203649896117122678, + 448566051516836, + 21888242871839275222246405745257275088548364400416034343698203989348895629115, + 21888242871839275222246405745257275088548364400416034343698203991658428031574, + 21888242871839275222246405745257275088548364400416034343698203658858921462629, + 21888242871839275222246405745257275088548364400416034343698203643172577700772, + 21888242871839275222246405745257275088548364400416034343698204135751133227900, + 148424933252947, + 93931329501194, + 45386545168038, + 21888242871839275222246405745257275088548364400416034343698203936641451590801, + 180367885648159, + 282821139106654, + 21888242871839275222246405745257275088548364400416034343698203716223910266326, + 535288298023327, + 102368908265852, + 114900133636066, + 21888242871839275222246405745257275088548364400416034343698204004770761626116, + 124718058932568, + 21888242871839275222246405745257275088548364400416034343698203763896418515429, + 468756413187777, + 21888242871839275222246405745257275088548364400416034343698203713039215176416, + 21888242871839275222246405745257275088548364400416034343698203644853480188943, + 395330263899108, + 328807090648502, + 384816125264222, + 21888242871839275222246405745257275088548364400416034343698204028924096163723, + 368371273582937, + 21888242871839275222246405745257275088548364400416034343698204074848339070201, + 414548822977410, + 21888242871839275222246405745257275088548364400416034343698203703911249447047, + 21888242871839275222246405745257275088548364400416034343698203938671550502587, + 21888242871839275222246405745257275088548364400416034343698203664568802067890, + 457259963990406, + 181536601664734, + 21888242871839275222246405745257275088548364400416034343698203747479484819866, + 21888242871839275222246405745257275088548364400416034343698203787687772330917, + 21888242871839275222246405745257275088548364400416034343698203883788003028113, + 21888242871839275222246405745257275088548364400416034343698204164125919001530, + 21888242871839275222246405745257275088548364400416034343698203984304751378350, + 21888242871839275222246405745257275088548364400416034343698203758291181144999, + 21888242871839275222246405745257275088548364400416034343698203785140160246804, + 21888242871839275222246405745257275088548364400416034343698203759942979306985, + 334855789671541, + 21888242871839275222246405745257275088548364400416034343698204023223514316843, + 21888242871839275222246405745257275088548364400416034343698203626856481265926, + 27898795203282, + 21888242871839275222246405745257275088548364400416034343698203918968289450682, + 184309247669341, + 283803642564415, + 84693899124863, + 21888242871839275222246405745257275088548364400416034343698203894789775229033, + 21888242871839275222246405745257275088548364400416034343698204033393889231511, + 285447012795707, + 122955473373438, + 146774113597240, + 21888242871839275222246405745257275088548364400416034343698203844577921125756, + 435134600944685, + 21888242871839275222246405745257275088548364400416034343698204018178159071049, + 21888242871839275222246405745257275088548364400416034343698203685810021004781, + 561700575081442, + 31545395745003, + 21888242871839275222246405745257275088548364400416034343698204110230257300674, + 21888242871839275222246405745257275088548364400416034343698203787846871861535, + 190070315748629, + 255950161782271, + 21888242871839275222246405745257275088548364400416034343698203978142460348436, + 21888242871839275222246405745257275088548364400416034343698203879787083794128, + 111526361929357, + 21888242871839275222246405745257275088548364400416034343698203807686246750660, + 21888242871839275222246405745257275088548364400416034343698204132459479755842, + 490671490125903, + 389561325608361, + 21888242871839275222246405745257275088548364400416034343698204087467661103361, + 427978650119221, + 21888242871839275222246405745257275088548364400416034343698203986772491251896, + 270601454983080, + 375562269380334, + 209453027850680, + 21888242871839275222246405745257275088548364400416034343698203715965132998448, + 181996628750669, + 504511185346318, + 435370925948763, + 466697349407460, + 165725723660816, + 233892319227092, + 21888242871839275222246405745257275088548364400416034343698203887298072873768, + 21888242871839275222246405745257275088548364400416034343698204180772679878976, + 332403686123298, + 353929130995774, + 21888242871839275222246405745257275088548364400416034343698203674368734826553, + 21888242871839275222246405745257275088548364400416034343698203783389618141069, + 140509675937734, + 286497836003768, + 258157223755150, + 403940283894194, + 165301592784151, + 288944998723667, + 531157886927230, + 521334780750802, + 21888242871839275222246405745257275088548364400416034343698203976303858812144, + 532512264853284, + 392637737541128, + 21888242871839275222246405745257275088548364400416034343698203702461654667976, + 21888242871839275222246405745257275088548364400416034343698203962535516018956, + 5599673971785, + 21888242871839275222246405745257275088548364400416034343698203661858147996235, + 21888242871839275222246405745257275088548364400416034343698203896287939992143, + 21888242871839275222246405745257275088548364400416034343698203901690076279859, + 465097039101341, + 170232696229932, + 21888242871839275222246405745257275088548364400416034343698203784411100327061, + 385215478626484, + 21888242871839275222246405745257275088548364400416034343698203681664851558415, + 21888242871839275222246405745257275088548364400416034343698203684333404611104, + 21888242871839275222246405745257275088548364400416034343698203811567706072075, + 21888242871839275222246405745257275088548364400416034343698204164682865510540, + 285258818221470, + 13482797442136, + 133928705048328, + 21888242871839275222246405745257275088548364400416034343698203640552616093393, + 67793200183610, + 469017528032265, + 21888242871839275222246405745257275088548364400416034343698203753848149844968, + 21888242871839275222246405745257275088548364400416034343698204069712315392955, + 21888242871839275222246405745257275088548364400416034343698204143093631615621, + 21888242871839275222246405745257275088548364400416034343698203999154222423574, + 442670151504935, + 444678733096204, + 21888242871839275222246405745257275088548364400416034343698203752322861668231, + 438247786970062, + 21888242871839275222246405745257275088548364400416034343698203640770498569709, + 438226675810592, + 50588495399975, + 541799404456441, + 9899204901166, + 526376931751138, + 21888242871839275222246405745257275088548364400416034343698204010098507460627, + 284859417365858, + 119772836123921, + 318240567513235, + 21888242871839275222246405745257275088548364400416034343698204057026828328675, + 21888242871839275222246405745257275088548364400416034343698204139998378478493, + 502771959396686, + 549786870995712, + 477083335951044, + 203671290281900, + 363857037877702, + 86633611878792, + 125033183701175, + 73971366298860, + 21888242871839275222246405745257275088548364400416034343698203970188484859221, + 136052679037636, + 21888242871839275222246405745257275088548364400416034343698203930543356420427, + 339386688171919, + 6729491563445, + 396010890903667, + 509559579793594, + 497962824996876, + 21888242871839275222246405745257275088548364400416034343698203941833261089425, + 21888242871839275222246405745257275088548364400416034343698203717686564183872, + 21888242871839275222246405745257275088548364400416034343698203727703439388326, + 21888242871839275222246405745257275088548364400416034343698204062222258977135, + 390369923779090, + 120697798962316, + 21888242871839275222246405745257275088548364400416034343698204094262869825578, + 127360299798744, + 386714588939194, + 21888242871839275222246405745257275088548364400416034343698203934015935846725, + 277966356882761, + 21888242871839275222246405745257275088548364400416034343698203917554144423253, + 165482216946206, + 540495818345094, + 21888242871839275222246405745257275088548364400416034343698204164972590746088, + 208472351656069, + 21888242871839275222246405745257275088548364400416034343698204027630134768862, + 21888242871839275222246405745257275088548364400416034343698203625628236003615, + 106522404984668, + 469327013724982, + 518970923078986, + 21888242871839275222246405745257275088548364400416034343698203888899324227219, + 21888242871839275222246405745257275088548364400416034343698204008330405586408, + 166072314217289, + 21888242871839275222246405745257275088548364400416034343698203651242218524580, + 21888242871839275222246405745257275088548364400416034343698203954156123750297, + 147387198443048, + 21888242871839275222246405745257275088548364400416034343698203783670647298687, + 21888242871839275222246405745257275088548364400416034343698204152966288916289, + 21888242871839275222246405745257275088548364400416034343698203839134037555743, + 305243069647113, + 21888242871839275222246405745257275088548364400416034343698203706173176368110, + 21888242871839275222246405745257275088548364400416034343698203977571163912402, + 21888242871839275222246405745257275088548364400416034343698204168623934314945, + 268009010998366, + 21888242871839275222246405745257275088548364400416034343698204088660025539892, + 172140226604678, + 505456866735380, + 21888242871839275222246405745257275088548364400416034343698203771602518618733, + 21888242871839275222246405745257275088548364400416034343698204029780149327446, + 402879239162656, + 21888242871839275222246405745257275088548364400416034343698204024566962863383, + 5194892767925, + 21888242871839275222246405745257275088548364400416034343698203625920099864389, + 203117941166283, + 21888242871839275222246405745257275088548364400416034343698203803132177166345, + 421062171303166, + 496307293012968, + 315935030252135, + 18312568651824, + 368333403775425, + 430681273362167, + 21888242871839275222246405745257275088548364400416034343698203833792698316123, + 21888242871839275222246405745257275088548364400416034343698203962899561015279, + 375085136512918, + 21888242871839275222246405745257275088548364400416034343698203798692042480196, + 21888242871839275222246405745257275088548364400416034343698204126415633695445, + 535733419298497, + 432588273742711, + 21888242871839275222246405745257275088548364400416034343698203789454508085145, + 21888242871839275222246405745257275088548364400416034343698203900797402354684, + 10338830518190, + 186034495158793, + 292369216111695, + 21888242871839275222246405745257275088548364400416034343698203776970413566028, + 431729463454607, + 297172803880322, + 253659603494306, + 17222012982270, + 21888242871839275222246405745257275088548364400416034343698203713507117293461, + 139291561605796, + 380660108547737, + 21888242871839275222246405745257275088548364400416034343698203877256361503879, + 431736544855799, + 21888242871839275222246405745257275088548364400416034343698204084612210595384, + 173736487760732, + 21888242871839275222246405745257275088548364400416034343698203908515332142011, + 21888242871839275222246405745257275088548364400416034343698203668557107876428, + 21888242871839275222246405745257275088548364400416034343698203976541557046150, + 21888242871839275222246405745257275088548364400416034343698203816108127176180, + 416519242690412, + 21888242871839275222246405745257275088548364400416034343698203938448482654283, + 309874380461140, + 21888242871839275222246405745257275088548364400416034343698203986704196285070, + 21888242871839275222246405745257275088548364400416034343698203656477899704404, + 122021649156629, + 21888242871839275222246405745257275088548364400416034343698204120384122154011, + 21888242871839275222246405745257275088548364400416034343698203675559337657644, + 21888242871839275222246405745257275088548364400416034343698203966395699258058, + 169538620250753, + 83273929130110, + 21888242871839275222246405745257275088548364400416034343698203782037243688900, + 21888242871839275222246405745257275088548364400416034343698203656130096751715, + 433911350917043, + 138310254940942, + 16856524424463, + 21888242871839275222246405745257275088548364400416034343698204123091974415395, + 518082374711873, + 121404841209354, + 182462419158186, + 212448300846903, + 144708266189671, + 480758847639139, + 14308950544214, + 278130936285364, + 76764789768957, + 21888242871839275222246405745257275088548364400416034343698203856834375038625, + 340914714649326, + 323087605025544, + 503626363554245, + 21888242871839275222246405745257275088548364400416034343698203994443633251081, + 294556551493015, + 21888242871839275222246405745257275088548364400416034343698203678280526585145, + 519802324236015, + 31950057275286, + 21888242871839275222246405745257275088548364400416034343698204044032287978867, + 312991281261710, + 21888242871839275222246405745257275088548364400416034343698203925879262146769, + 21888242871839275222246405745257275088548364400416034343698204041727584533359, + 21888242871839275222246405745257275088548364400416034343698204009033768988127, + 21888242871839275222246405745257275088548364400416034343698203873788531246269, + 21888242871839275222246405745257275088548364400416034343698203830027443993126, + 21888242871839275222246405745257275088548364400416034343698204093429706798413, + 21888242871839275222246405745257275088548364400416034343698203890093230241904, + 21888242871839275222246405745257275088548364400416034343698203684773410339023, + 140323731490550, + 21888242871839275222246405745257275088548364400416034343698203779465102693936, + 202740507926977, + 21888242871839275222246405745257275088548364400416034343698203876988511288743, + 489952467100000, + 21888242871839275222246405745257275088548364400416034343698203958957862279291, + 42054704852597, + 87351637698601, + 268994054223760, + 21888242871839275222246405745257275088548364400416034343698204164937103266869, + 552403515650905, + 457080969075294, + 269141702006271, + 21888242871839275222246405745257275088548364400416034343698204158305654757867, + 73247839473815, + 21888242871839275222246405745257275088548364400416034343698203898382757159117, + 21888242871839275222246405745257275088548364400416034343698203898407307152736, + 21888242871839275222246405745257275088548364400416034343698203939131051625523, + 289127807337976, + 21888242871839275222246405745257275088548364400416034343698203668667411226047, + 198252380426791, + 21888242871839275222246405745257275088548364400416034343698204061352261121798, + 21888242871839275222246405745257275088548364400416034343698203889717409569724, + 188595451086954, + 21888242871839275222246405745257275088548364400416034343698203815288956436822, + 21888242871839275222246405745257275088548364400416034343698203980810432507508, + 21888242871839275222246405745257275088548364400416034343698203691681704666202, + 41434615374485, + 21888242871839275222246405745257275088548364400416034343698203750286660639540, + 21888242871839275222246405745257275088548364400416034343698204178095786619275, + 72940398438406, + 21888242871839275222246405745257275088548364400416034343698204147832103978113, + 21888242871839275222246405745257275088548364400416034343698204069123262210679, + 206331428560619, + 21888242871839275222246405745257275088548364400416034343698203716676285355041, + 216080455155231, + 21888242871839275222246405745257275088548364400416034343698203941614118470689, + 291818612067022, + 21888242871839275222246405745257275088548364400416034343698204009636545082819, + 17160255789908, + 21888242871839275222246405745257275088548364400416034343698203643589554180188, + 21888242871839275222246405745257275088548364400416034343698204006638241693881, + 21888242871839275222246405745257275088548364400416034343698204114130832595643, + 6942175220298, + 111802798625291, + 21888242871839275222246405745257275088548364400416034343698203760660184866810, + 366300282837179, + 355407057360734, + 307960381765014, + 468410454069535, + 160857499580594, + 21888242871839275222246405745257275088548364400416034343698203748728214561065, + 140952159913005, + 312929127536467, + 419743884557719, + 21888242871839275222246405745257275088548364400416034343698203788748328887339, + 86761573376382, + 81936464019059, + 21888242871839275222246405745257275088548364400416034343698203735811722203943, + 176772517361980, + 21888242871839275222246405745257275088548364400416034343698204001385840845281, + 387461716072188, + 21888242871839275222246405745257275088548364400416034343698204044057540886351, + 49516612260906, + 518638769593974, + 197603441080961, + 21888242871839275222246405745257275088548364400416034343698203624048288998612, + 21888242871839275222246405745257275088548364400416034343698203694413634631540, + 343296552268605, + 168619629215652, + 164594619923559, + 21888242871839275222246405745257275088548364400416034343698203842258714587157, + 21888242871839275222246405745257275088548364400416034343698203750913623848304, + 524822489973331, + 110088648214698, + 21888242871839275222246405745257275088548364400416034343698204121421631802581, + 125722095269703, + 248819565444083, + 21888242871839275222246405745257275088548364400416034343698204010764982297069, + 394662012645741, + 21888242871839275222246405745257275088548364400416034343698204013045887868475, + 21888242871839275222246405745257275088548364400416034343698203977704329217629, + 115618450894856, + 557847328034733, + 21888242871839275222246405745257275088548364400416034343698204001587858316068, + 406560587953828, + 21888242871839275222246405745257275088548364400416034343698203863016405007892, + 48493890419759, + 21888242871839275222246405745257275088548364400416034343698203866893795384208, + 477189225753232, + 312405830582547, + 21888242871839275222246405745257275088548364400416034343698203883628109677012, + 430194959521604, + 400923990463808, + 228024766817113, + 3753334411821, + 21888242871839275222246405745257275088548364400416034343698204136619844728586, + 21888242871839275222246405745257275088548364400416034343698203861072877125746, + 286641991915966, + 21888242871839275222246405745257275088548364400416034343698203949503618914621, + 21888242871839275222246405745257275088548364400416034343698203773809669318278, + 110531664482567, + 463332834396030, + 443579994263302, + 21888242871839275222246405745257275088548364400416034343698204044044323931100, + 325884137113460, + 22391597752647, + 72930469585360, + 507125546280298, + 429794302268675, + 21888242871839275222246405745257275088548364400416034343698203780389489374904, + 433643427421612, + 532622386670805, + 383768559819324, + 305065159636528, + 84451475561624, + 339770908671203, + 155040772156755, + 21888242871839275222246405745257275088548364400416034343698203874058907457365, + 21888242871839275222246405745257275088548364400416034343698203686506360044300, + 455071102218777, + 256512853515922, + 21888242871839275222246405745257275088548364400416034343698204074786052364705, + 21888242871839275222246405745257275088548364400416034343698203670019895025066, + 35453779211982, + 21888242871839275222246405745257275088548364400416034343698203638347284964055, + 103156339339561, + 403434982722239, + 62982701175767, + 299089998545353, + 21888242871839275222246405745257275088548364400416034343698203922299146982659, + 21888242871839275222246405745257275088548364400416034343698204038579556697806, + 24182962449048, + 537395886338708, + 343425167615889, + 397110376079398, + 151722635012377, + 285124097973627, + 21888242871839275222246405745257275088548364400416034343698204006265724863719, + 21888242871839275222246405745257275088548364400416034343698203942147835727572, + 21888242871839275222246405745257275088548364400416034343698203731302534161825, + 46233027215265, + 315409220063987, + 21888242871839275222246405745257275088548364400416034343698204073583444110120, + 21888242871839275222246405745257275088548364400416034343698204130020221165180, + 93764135774726, + 102519741442154, + 21888242871839275222246405745257275088548364400416034343698204104179811124909, + 21888242871839275222246405745257275088548364400416034343698203659597184349714, + 21888242871839275222246405745257275088548364400416034343698203732819776165171, + 196816915570401, + 95467872997369, + 21888242871839275222246405745257275088548364400416034343698203795564079065430, + 21888242871839275222246405745257275088548364400416034343698203963226085873606, + 552613919273647, + 21888242871839275222246405745257275088548364400416034343698203990198972652333, + 273861630090230, + 21888242871839275222246405745257275088548364400416034343698203937424830121299, + 21888242871839275222246405745257275088548364400416034343698203708945566680686, + 147457787888932, + 398895427159623, + 406403913060413, + 21888242871839275222246405745257275088548364400416034343698204131157479935185, + 473459263617879, + 372051068708325, + 77422661455773, + 21888242871839275222246405745257275088548364400416034343698204008956687505538, + 228923356888589, + 86138366374839, + 21888242871839275222246405745257275088548364400416034343698203627630749187568, + 21888242871839275222246405745257275088548364400416034343698203955312852158195, + 21888242871839275222246405745257275088548364400416034343698203703943275534149, + 260330283841578, + 21888242871839275222246405745257275088548364400416034343698203678482948125516, + 130894566710934, + 1966571840531, + 21888242871839275222246405745257275088548364400416034343698203950300273043602, + 21888242871839275222246405745257275088548364400416034343698203659534588802120, + 21888242871839275222246405745257275088548364400416034343698204075890657336794, + 167869234156825, + 21888242871839275222246405745257275088548364400416034343698203916672332756893, + 21888242871839275222246405745257275088548364400416034343698203812192362844330, + 43687255625078, + 349226082949651, + 21888242871839275222246405745257275088548364400416034343698204046617198266659, + 21888242871839275222246405745257275088548364400416034343698203893803414631923, + 21888242871839275222246405745257275088548364400416034343698204097053468120558, + 21888242871839275222246405745257275088548364400416034343698203724450564317112, + 21888242871839275222246405745257275088548364400416034343698203847582142722603, + 21888242871839275222246405745257275088548364400416034343698203987205719401118, + 21888242871839275222246405745257275088548364400416034343698204120296387733538, + 287444021186229, + 290615689844595, + 16709338212557, + 21888242871839275222246405745257275088548364400416034343698204030188810516152, + 21888242871839275222246405745257275088548364400416034343698203888144297582724, + 21888242871839275222246405745257275088548364400416034343698204018347563211285, + 21888242871839275222246405745257275088548364400416034343698203643877376200542, + 183212322962348, + 21888242871839275222246405745257275088548364400416034343698203745730129849736, + 21888242871839275222246405745257275088548364400416034343698203656622480113279, + 21888242871839275222246405745257275088548364400416034343698204040714411373159, + 141184124128202, + 21888242871839275222246405745257275088548364400416034343698203985558704854203, + 21888242871839275222246405745257275088548364400416034343698203793507736893781, + 21888242871839275222246405745257275088548364400416034343698203910090398742749, + 21888242871839275222246405745257275088548364400416034343698203959987901353326, + 266769104425575, + 345073136347105, + 21888242871839275222246405745257275088548364400416034343698203999837590494858, + 21888242871839275222246405745257275088548364400416034343698203817793708184145, + 453972241645969, + 21888242871839275222246405745257275088548364400416034343698204151896842165559, + 499017605333823, + 263703390521917, + 119739943266809, + 19995252231111, + 21888242871839275222246405745257275088548364400416034343698203666363402378132, + 21888242871839275222246405745257275088548364400416034343698204025851858757068, + 21888242871839275222246405745257275088548364400416034343698203733331079949384, + 325119430236418, + 21888242871839275222246405745257275088548364400416034343698203763243447549537, + 21888242871839275222246405745257275088548364400416034343698203817118154425988, + 21888242871839275222246405745257275088548364400416034343698203716001857724146, + 341742088764115, + 487928717839560, + 163597415123720, + 21888242871839275222246405745257275088548364400416034343698204058223155278730, + 138992870225551, + 21888242871839275222246405745257275088548364400416034343698203764830463949073, + 197641917574155, + 21888242871839275222246405745257275088548364400416034343698203672544476024352, + 109558199945121, + 21888242871839275222246405745257275088548364400416034343698203831873271081657, + 378258563171916, + 475766570297430, + 554125127707809, + 416796976674511, + 21888242871839275222246405745257275088548364400416034343698204065148970823382, + 21888242871839275222246405745257275088548364400416034343698204018234933072802, + 21888242871839275222246405745257275088548364400416034343698203947923461625192, + 30313307353215, + 316101409719027, + 211907415581787, + 195921280077183, + 382489101440763, + 21888242871839275222246405745257275088548364400416034343698203745109986456228, + 249321895770299, + 4317829087933, + 21888242871839275222246405745257275088548364400416034343698203654572150479331, + 21888242871839275222246405745257275088548364400416034343698203979392208185927, + 320461948867669, + 21888242871839275222246405745257275088548364400416034343698203757477577369643, + 259979754731226, + 197790656748700, + 286905670753286, + 450527963864865, + 21888242871839275222246405745257275088548364400416034343698203990609718094480, + 43626727636997, + 21888242871839275222246405745257275088548364400416034343698203964234099358874, + 74508065932309, + 489900407708662, + 365654231567903, + 400129755966899, + 510511200631180, + 21888242871839275222246405745257275088548364400416034343698204034852976717374, + 21888242871839275222246405745257275088548364400416034343698203672117851952155, + 21888242871839275222246405745257275088548364400416034343698204118146121174129, + 289954639722314, + 21888242871839275222246405745257275088548364400416034343698204116882544357620, + 395336578438750, + 339082494696780, + 499211837573147, + 21888242871839275222246405745257275088548364400416034343698203982009597694443, + 23470526863591, + 180086253425475, + 21888242871839275222246405745257275088548364400416034343698204182847391781458, + 21888242871839275222246405745257275088548364400416034343698203900948843089755, + 21888242871839275222246405745257275088548364400416034343698203665519739555436, + 21888242871839275222246405745257275088548364400416034343698204185470300404358, + 150433891704914, + 68736776483779, + 225297709966985, + 21888242871839275222246405745257275088548364400416034343698203989881765210587, + 506860454055729, + 401330033488606, + 326971639256232, + 21888242871839275222246405745257275088548364400416034343698203977937611332126, + 17638173411279, + 65711998666862, + 21888242871839275222246405745257275088548364400416034343698203793850972551498, + 410024616703786, + 21888242871839275222246405745257275088548364400416034343698204091251364794183, + 21888242871839275222246405745257275088548364400416034343698204130215112712486, + 21888242871839275222246405745257275088548364400416034343698203853184179687982, + 21888242871839275222246405745257275088548364400416034343698204052894633674119, + 308303224576166, + 21888242871839275222246405745257275088548364400416034343698203945343872330779, + 21888242871839275222246405745257275088548364400416034343698204119990981067314, + 21888242871839275222246405745257275088548364400416034343698203755945414782885, + 21888242871839275222246405745257275088548364400416034343698203647496950108981, + 281097324310537, + 21888242871839275222246405745257275088548364400416034343698203885190177058827, + 21888242871839275222246405745257275088548364400416034343698203991460871331650, + 166407233464894, + 167442282120917, + 189495404846799, + 21888242871839275222246405745257275088548364400416034343698204186086187617789, + 119205677543199, + 21888242871839275222246405745257275088548364400416034343698203954692889871109, + 21888242871839275222246405745257275088548364400416034343698203875867365625771, + 343314046343878, + 21888242871839275222246405745257275088548364400416034343698203773649362285233, + 18505770299766, + 283247875220219, + 427720274880836, + 21888242871839275222246405745257275088548364400416034343698203776226192195458, + 493062164920566, + 21888242871839275222246405745257275088548364400416034343698203884278038087399, + 48722012198630, + 21888242871839275222246405745257275088548364400416034343698203647491208019278, + 21888242871839275222246405745257275088548364400416034343698203947441701373476, + 21888242871839275222246405745257275088548364400416034343698204129931921244438, + 426400960059665, + 21888242871839275222246405745257275088548364400416034343698203773295639712999, + 21888242871839275222246405745257275088548364400416034343698203651560347352361, + 502429205481710, + 346489148941935, + 21888242871839275222246405745257275088548364400416034343698203826481546789350, + 408451735619265, + 294589461274919, + 21888242871839275222246405745257275088548364400416034343698204141774401441866, + 21888242871839275222246405745257275088548364400416034343698203815743982482732, + 378027045612375, + 21888242871839275222246405745257275088548364400416034343698203844175077550058, + 269870322408117, + 21888242871839275222246405745257275088548364400416034343698204093833318075325, + 290100359424930, + 21888242871839275222246405745257275088548364400416034343698203858220522505273, + 21888242871839275222246405745257275088548364400416034343698204131984915389550, + 408991627848161, + 21888242871839275222246405745257275088548364400416034343698203732985187638348, + 21888242871839275222246405745257275088548364400416034343698203679355212221937, + 21888242871839275222246405745257275088548364400416034343698203913342519156300, + 169235371799158, + 269481750191454, + 41355668870206, + 24564663677472, + 62814447579597, + 21888242871839275222246405745257275088548364400416034343698203910087175928743, + 21888242871839275222246405745257275088548364400416034343698204077576786409851, + 348112342559465, + 61777908733289, + 439453662882401, + 407302821805793, + 18773903207944, + 21888242871839275222246405745257275088548364400416034343698203796035443281346, + 445077718943082, + 21888242871839275222246405745257275088548364400416034343698204045806216648020, + 525583420932679, + 21888242871839275222246405745257275088548364400416034343698203682323218014910, + 444364512651933, + 1864351314536, + 21888242871839275222246405745257275088548364400416034343698204060639929338584, + 159678963056027, + 141803028244064, + 112427892302211, + 21888242871839275222246405745257275088548364400416034343698203669140832426459, + 21888242871839275222246405745257275088548364400416034343698204031196247143739, + 496943862805597, + 475383987931995, + 21888242871839275222246405745257275088548364400416034343698204030803405543032, + 21888242871839275222246405745257275088548364400416034343698203941301884597071, + 21888242871839275222246405745257275088548364400416034343698204071568365959225, + 548356035478287, + 317912206699409, + 165292016852333, + 513060743050434, + 314692550052103, + 21888242871839275222246405745257275088548364400416034343698204128967504507447, + 21888242871839275222246405745257275088548364400416034343698203751729440686142, + 21888242871839275222246405745257275088548364400416034343698203644325827413745, + 21888242871839275222246405745257275088548364400416034343698204174525312101215, + 264405419570545, + 442647215527603, + 21888242871839275222246405745257275088548364400416034343698203861568576876263, + 184646827050466, + 308531534131258, + 21888242871839275222246405745257275088548364400416034343698204176274594118527, + 380725526161211, + 16291642256408, + 21888242871839275222246405745257275088548364400416034343698203904070319548098, + 21888242871839275222246405745257275088548364400416034343698203655880909868099, + 21888242871839275222246405745257275088548364400416034343698203692646530762958, + 21888242871839275222246405745257275088548364400416034343698203656693332791139, + 21888242871839275222246405745257275088548364400416034343698204012478777644957, + 21888242871839275222246405745257275088548364400416034343698203728022548435373, + 21888242871839275222246405745257275088548364400416034343698204070352179981912, + 21888242871839275222246405745257275088548364400416034343698204033444608177339, + 21888242871839275222246405745257275088548364400416034343698203727722476772313, + 357758242889275, + 21888242871839275222246405745257275088548364400416034343698203821968676960587, + 212327845133468, + 21888242871839275222246405745257275088548364400416034343698203809654397748737, + 152955335551832, + 425740357288117, + 21888242871839275222246405745257275088548364400416034343698204130890580830975, + 18240989588637, + 477597666869316, + 378520912458518, + 376291191781729, + 74038420975436, + 21888242871839275222246405745257275088548364400416034343698203799663081807945, + 429449391641318, + 21888242871839275222246405745257275088548364400416034343698203804300765580574, + 113552684576332, + 21888242871839275222246405745257275088548364400416034343698203939520744091527, + 21888242871839275222246405745257275088548364400416034343698203769872244477422, + 21888242871839275222246405745257275088548364400416034343698203734846312946080, + 21888242871839275222246405745257275088548364400416034343698203851818999680246, + 317521969071769, + 278108050657104, + 194145323816482, + 21888242871839275222246405745257275088548364400416034343698203636401064873371, + 21888242871839275222246405745257275088548364400416034343698203870840104518270, + 21888242871839275222246405745257275088548364400416034343698203626154006602439, + 529509210131103, + 21888242871839275222246405745257275088548364400416034343698203711362180464752, + 21888242871839275222246405745257275088548364400416034343698203913749733535135, + 215076727451452, + 267399933185681, + 376584320522617, + 12306511961715, + 6477370038941, + 334411659506622, + 21888242871839275222246405745257275088548364400416034343698203746546847194102, + 281954835360595, + 21888242871839275222246405745257275088548364400416034343698203861707692491776, + 32976641196671, + 556548249684732, + 126795805296860, + 21888242871839275222246405745257275088548364400416034343698203945028765003906, + 21888242871839275222246405745257275088548364400416034343698203746248070152265, + 21888242871839275222246405745257275088548364400416034343698204180096306317130, + 216761407716868, + 21888242871839275222246405745257275088548364400416034343698204041378383990076, + 21888242871839275222246405745257275088548364400416034343698203830638106125030, + 21888242871839275222246405745257275088548364400416034343698204124536653554818, + 108113179284346, + 21888242871839275222246405745257275088548364400416034343698204154364684600248, + 490498984922014, + 21888242871839275222246405745257275088548364400416034343698203918055803567723, + 462403979368421, + 21888242871839275222246405745257275088548364400416034343698203951907624394722, + 21888242871839275222246405745257275088548364400416034343698203690522518052705, + 436142247248797, + 21888242871839275222246405745257275088548364400416034343698203912956572587628, + 21888242871839275222246405745257275088548364400416034343698204078898030303033, + 21888242871839275222246405745257275088548364400416034343698204179585745529203, + 197918094097595, + 21888242871839275222246405745257275088548364400416034343698204174348630065716, + 519634286750332, + 283208511088358, + 21888242871839275222246405745257275088548364400416034343698203961577204506730, + 21888242871839275222246405745257275088548364400416034343698203901894814759252, + 21888242871839275222246405745257275088548364400416034343698203845513881729257, + 21888242871839275222246405745257275088548364400416034343698204068152973909722, + 37682042211662, + 21888242871839275222246405745257275088548364400416034343698204011540559289592, + 9967693685888, + 68113204343391, + 21888242871839275222246405745257275088548364400416034343698203787056475597103, + 445960334250690, + 499415908124384, + 258894067525168, + 338750888482469, + 314044560922285, + 21888242871839275222246405745257275088548364400416034343698203875427678702777, + 68342122977455, + 363382347974699, + 21888242871839275222246405745257275088548364400416034343698203897184489335363, + 430457078678987, + 21888242871839275222246405745257275088548364400416034343698203819017040941751, + 21888242871839275222246405745257275088548364400416034343698204046357448647288, + 21888242871839275222246405745257275088548364400416034343698204008871106300840, + 21888242871839275222246405745257275088548364400416034343698203722684382530415, + 21888242871839275222246405745257275088548364400416034343698203874808094433007, + 21888242871839275222246405745257275088548364400416034343698203940527462513947, + 21888242871839275222246405745257275088548364400416034343698203965808026409845, + 276767458847169, + 21888242871839275222246405745257275088548364400416034343698203697526801271013, + 21888242871839275222246405745257275088548364400416034343698204078707561631179, + 377951990112814, + 152284927089670, + 21888242871839275222246405745257275088548364400416034343698203766800495001868, + 465496486978, + 357893518295063, + 21888242871839275222246405745257275088548364400416034343698203707679325266923, + 21888242871839275222246405745257275088548364400416034343698203994696916006350, + 69678059262566, + 179280978763839, + 21888242871839275222246405745257275088548364400416034343698204104571252938206, + 21888242871839275222246405745257275088548364400416034343698203984684116372407, + 70591745074040, + 143918905768213, + 21888242871839275222246405745257275088548364400416034343698203677904771252286, + 356350983010716, + 457762023869052, + 21888242871839275222246405745257275088548364400416034343698204010851840620784, + 21888242871839275222246405745257275088548364400416034343698204144203907331573, + 21888242871839275222246405745257275088548364400416034343698203672639330082374, + 21888242871839275222246405745257275088548364400416034343698203921662530495280, + 21888242871839275222246405745257275088548364400416034343698203786546808470643, + 21888242871839275222246405745257275088548364400416034343698203786942799646053, + 21888242871839275222246405745257275088548364400416034343698203675199490465444, + 220315336390402, + 350460149219478, + 21888242871839275222246405745257275088548364400416034343698203985397006770253, + 21888242871839275222246405745257275088548364400416034343698203663659109561729, + 21888242871839275222246405745257275088548364400416034343698203800273547072409, + 333692780790536, + 166617579690361, + 433715454483630, + 282571282331095, + 455591976874639, + 21888242871839275222246405745257275088548364400416034343698203996780202905962, + 21888242871839275222246405745257275088548364400416034343698204151891201916774, + 21888242871839275222246405745257275088548364400416034343698204121314059954708, + 507571108880885, + 21888242871839275222246405745257275088548364400416034343698203712862080427304, + 118395200880277, + 69313390412209, + 21888242871839275222246405745257275088548364400416034343698203755537472635871, + 145509723945890, + 21888242871839275222246405745257275088548364400416034343698203740226559758002, + 21888242871839275222246405745257275088548364400416034343698204051533310145442, + 331782771637125, + 21888242871839275222246405745257275088548364400416034343698203665927197736650, + 448291535267404, + 145151347522907, + 126432011935381, + 61115852794855, + 190475093958321, + 21888242871839275222246405745257275088548364400416034343698204031989046841068, + 21888242871839275222246405745257275088548364400416034343698203644265851411229, + 21888242871839275222246405745257275088548364400416034343698203663661314263386, + 255012723489985, + 21888242871839275222246405745257275088548364400416034343698203926971301664736, + 128677082367744, + 158898410272123, + 21888242871839275222246405745257275088548364400416034343698204173991280566312, + 21888242871839275222246405745257275088548364400416034343698203739099787542281, + 60461798182863, + 21888242871839275222246405745257275088548364400416034343698204105287594480887, + 21888242871839275222246405745257275088548364400416034343698203947193443073053, + 21888242871839275222246405745257275088548364400416034343698203782101656829921, + 73413621159726, + 21888242871839275222246405745257275088548364400416034343698203837183196890455, + 222442780800191, + 207519276125891, + 21888242871839275222246405745257275088548364400416034343698204082146284107498, + 66253093610260, + 335340260365012, + 365414080345618, + 243340596294320, + 21888242871839275222246405745257275088548364400416034343698204181964003497630, + 21888242871839275222246405745257275088548364400416034343698203964885706243755, + 530011329351830, + 76913130759757, + 393477005480936, + 14292985709096, + 317978962449168, + 21888242871839275222246405745257275088548364400416034343698203676339923479768, + 21888242871839275222246405745257275088548364400416034343698203641715670208538, + 21888242871839275222246405745257275088548364400416034343698203908919135682065, + 21888242871839275222246405745257275088548364400416034343698203869246976471393, + 151821501247835, + 21888242871839275222246405745257275088548364400416034343698203973253671411367, + 172763506611071, + 466092331050000, + 21888242871839275222246405745257275088548364400416034343698204154808519290887, + 21888242871839275222246405745257275088548364400416034343698204005727374276061, + 21888242871839275222246405745257275088548364400416034343698204069715736860045, + 210638637872921, + 21888242871839275222246405745257275088548364400416034343698203820810032228972, + 370815173447447, + 21888242871839275222246405745257275088548364400416034343698204017012762406992, + 21888242871839275222246405745257275088548364400416034343698203861619201413481, + 21888242871839275222246405745257275088548364400416034343698203991531542819487, + 21888242871839275222246405745257275088548364400416034343698204007323976636047, + 21888242871839275222246405745257275088548364400416034343698203740135107076963, + 21888242871839275222246405745257275088548364400416034343698204142201794009627, + 21888242871839275222246405745257275088548364400416034343698204141593581049094, + 21888242871839275222246405745257275088548364400416034343698204150430441212705, + 21888242871839275222246405745257275088548364400416034343698203998950617381574, + 21888242871839275222246405745257275088548364400416034343698203997773785152725, + 21888242871839275222246405745257275088548364400416034343698204181056063483852, + 21888242871839275222246405745257275088548364400416034343698203633181245030946, + 76213280200625, + 21888242871839275222246405745257275088548364400416034343698204153313551649163, + 21888242871839275222246405745257275088548364400416034343698203714037797230969, + 21888242871839275222246405745257275088548364400416034343698204051830580134430, + 21888242871839275222246405745257275088548364400416034343698203742233403928552, + 21888242871839275222246405745257275088548364400416034343698204008612069352171, + 21888242871839275222246405745257275088548364400416034343698203919477846203164, + 21888242871839275222246405745257275088548364400416034343698203981972305374878, + 179360195243130, + 525919843194002, + 136755133335948, + 21888242871839275222246405745257275088548364400416034343698203833497713696731, + 21888242871839275222246405745257275088548364400416034343698204030197891491405, + 205158951026754, + 21888242871839275222246405745257275088548364400416034343698204103122559317618, + 21888242871839275222246405745257275088548364400416034343698203729601270052656, + 453091871235101, + 231921722333498, + 159394540653485, + 21888242871839275222246405745257275088548364400416034343698203870974730807729, + 493719625084107, + 21888242871839275222246405745257275088548364400416034343698203658788301823550, + 21888242871839275222246405745257275088548364400416034343698203890613785505692, + 21888242871839275222246405745257275088548364400416034343698204166484024083975, + 156751545146337, + 21888242871839275222246405745257275088548364400416034343698203632971495031136, + 238783796551583, + 21888242871839275222246405745257275088548364400416034343698203957268627937450, + 63222962175905, + 133435810422708, + 168557194299865, + 21888242871839275222246405745257275088548364400416034343698204164261941435655, + 401548547588567, + 365902471286672, + 45989182131695, + 486981071868156, + 21888242871839275222246405745257275088548364400416034343698203843542054351260, + 21888242871839275222246405745257275088548364400416034343698203905932565110203, + 307632634476181, + 390876079203654, + 338791602236243, + 21888242871839275222246405745257275088548364400416034343698203763047481710408, + 21888242871839275222246405745257275088548364400416034343698203671246497553348, + 492701923379014, + 21888242871839275222246405745257275088548364400416034343698203948336123439006, + 7666645517142, + 371894454506427, + 21888242871839275222246405745257275088548364400416034343698203726856518841768, + 21888242871839275222246405745257275088548364400416034343698203849003601771110, + 503111947612754, + 21888242871839275222246405745257275088548364400416034343698203939843774702402, + 224847152846824, + 21888242871839275222246405745257275088548364400416034343698204121125312485095, + 56156640551854, + 489761235651514, + 21888242871839275222246405745257275088548364400416034343698203946601967936054, + 21888242871839275222246405745257275088548364400416034343698204087909495647821, + 21888242871839275222246405745257275088548364400416034343698204004369693620165, + 123005555541720, + 122859967905522, + 21888242871839275222246405745257275088548364400416034343698204183308236453814, + 409875735907576, + 21888242871839275222246405745257275088548364400416034343698204079633398355405, + 419209176432039, + 21888242871839275222246405745257275088548364400416034343698204021466824989546, + 308938233646432, + 21888242871839275222246405745257275088548364400416034343698204114313723209178, + 59708832770490, + 21888242871839275222246405745257275088548364400416034343698204142329410260593, + 21888242871839275222246405745257275088548364400416034343698204089895767899510, + 21888242871839275222246405745257275088548364400416034343698204020801936785344, + 21888242871839275222246405745257275088548364400416034343698203831648204302181, + 21888242871839275222246405745257275088548364400416034343698204099049827772547, + 220074043744008, + 461374401530660, + 425513911522881, + 432442960154018, + 21888242871839275222246405745257275088548364400416034343698204143325241813830, + 21888242871839275222246405745257275088548364400416034343698203791259915753306, + 21888242871839275222246405745257275088548364400416034343698203926014547285391, + 21888242871839275222246405745257275088548364400416034343698203749593238788764, + 21888242871839275222246405745257275088548364400416034343698204112579437767287, + 21888242871839275222246405745257275088548364400416034343698203703473539652272, + 21888242871839275222246405745257275088548364400416034343698204172015853447335, + 21888242871839275222246405745257275088548364400416034343698203820584496163800, + 493291729944094, + 59000956736842, + 21888242871839275222246405745257275088548364400416034343698204161904680628303, + 21888242871839275222246405745257275088548364400416034343698204054000712389361, + 451901702480153, + 398499413242153, + 21888242871839275222246405745257275088548364400416034343698204173418829776580, + 422985571111422, + 21888242871839275222246405745257275088548364400416034343698204069730023826966, + 279018112375600, + 106574677727893, + 221224713187293, + 21888242871839275222246405745257275088548364400416034343698204026828911868282, + 179816668921939, + 21888242871839275222246405745257275088548364400416034343698203816627226762158, + 21888242871839275222246405745257275088548364400416034343698203781701020352084, + 514257954906857, + 21888242871839275222246405745257275088548364400416034343698203647942201309366, + 327472109609626, + 453917546939329, + 21888242871839275222246405745257275088548364400416034343698203670613077717829, + 424961352716527, + 453861755923401, + 21888242871839275222246405745257275088548364400416034343698203898903184096243, + 21888242871839275222246405745257275088548364400416034343698204005522036737268, + 519889972742266, + 21888242871839275222246405745257275088548364400416034343698203942038619684184, + 21888242871839275222246405745257275088548364400416034343698204059572917136047, + 512919819167517, + 462357420007361, + 21888242871839275222246405745257275088548364400416034343698203711994260533135, + 21888242871839275222246405745257275088548364400416034343698203958747112064659, + 21888242871839275222246405745257275088548364400416034343698203896701729879564, + 21888242871839275222246405745257275088548364400416034343698204023694546727768, + 21888242871839275222246405745257275088548364400416034343698204127159541903400, + 21888242871839275222246405745257275088548364400416034343698204065682042759711, + 21888242871839275222246405745257275088548364400416034343698204067799821673471, + 516373160613914, + 21888242871839275222246405745257275088548364400416034343698203834015740759991, + 237637757220272, + 21888242871839275222246405745257275088548364400416034343698203782243469244102, + 184143793106423, + 451393174817137, + 21888242871839275222246405745257275088548364400416034343698203983036418190948, + 65061934985201, + 133445469916075, + 489325173136586, + 21888242871839275222246405745257275088548364400416034343698203829378036345818, + 21888242871839275222246405745257275088548364400416034343698203667191733239631, + 99776059727449, + 235873862402030, + 390544830449372, + 21888242871839275222246405745257275088548364400416034343698203935589754824983, + 476433018549154, + 21888242871839275222246405745257275088548364400416034343698204144501972823383, + 21888242871839275222246405745257275088548364400416034343698204055904871872602, + 21888242871839275222246405745257275088548364400416034343698203949929747866552, + 300364439048753, + 209614161044200, + 21888242871839275222246405745257275088548364400416034343698203989590682249652, + 39309847811349, + 553257844950615, + 21888242871839275222246405745257275088548364400416034343698203685865602785894, + 450218523688724, + 459130681348903, + 542761515377023, + 21888242871839275222246405745257275088548364400416034343698204058898952462238, + 21888242871839275222246405745257275088548364400416034343698204009413465258477, + 127665219745454, + 21888242871839275222246405745257275088548364400416034343698203924024707052146, + 21888242871839275222246405745257275088548364400416034343698203920266744421043, + 152313017321353, + 21888242871839275222246405745257275088548364400416034343698203912974303428460, + 231486024866935, + 387106142962898, + 457427293944274, + 243543467050122, + 21888242871839275222246405745257275088548364400416034343698203824496199613922, + 21888242871839275222246405745257275088548364400416034343698203777936351589263, + 21888242871839275222246405745257275088548364400416034343698203715608677350237, + 21888242871839275222246405745257275088548364400416034343698203663721294432445, + 194103228274175, + 21888242871839275222246405745257275088548364400416034343698203839791048709132, + 408576444160110, + 21888242871839275222246405745257275088548364400416034343698204062341364399360, + 190621881314846, + 21888242871839275222246405745257275088548364400416034343698203834438707202703, + 21888242871839275222246405745257275088548364400416034343698203999959538720803, + 21888242871839275222246405745257275088548364400416034343698203986448731769217, + 191984221030460, + 21888242871839275222246405745257275088548364400416034343698204008467136104708, + 21888242871839275222246405745257275088548364400416034343698203985059744375884, + 21888242871839275222246405745257275088548364400416034343698204014317894636160, + 21888242871839275222246405745257275088548364400416034343698204026360522042045, + 21888242871839275222246405745257275088548364400416034343698204147115062418472, + 21888242871839275222246405745257275088548364400416034343698204128472002018440, + 421421645715381, + 21888242871839275222246405745257275088548364400416034343698203740373381996939, + 21888242871839275222246405745257275088548364400416034343698203799840939726471, + 21888242871839275222246405745257275088548364400416034343698203755690851887104, + 21888242871839275222246405745257275088548364400416034343698203672429510230616, + 512277952486264, + 221887203780935, + 272792277434914, + 238642708589348, + 86809259438717, + 120831990561870, + 21888242871839275222246405745257275088548364400416034343698203743897623249324, + 21888242871839275222246405745257275088548364400416034343698203736048407004745, + 21888242871839275222246405745257275088548364400416034343698203648250978304628, + 126111231988426, + 204466359680475, + 21888242871839275222246405745257275088548364400416034343698203931968576733713, + 21888242871839275222246405745257275088548364400416034343698203634426013072766, + 21888242871839275222246405745257275088548364400416034343698203988013960797889, + 21888242871839275222246405745257275088548364400416034343698204167381991991493, + 21888242871839275222246405745257275088548364400416034343698203692117631435946, + 553254891926878, + 21888242871839275222246405745257275088548364400416034343698204035679087763138, + 21888242871839275222246405745257275088548364400416034343698203913102978471674, + 371607511017636, + 468414413169344, + 21888242871839275222246405745257275088548364400416034343698203978319067059642, + 285406303888763, + 381561521459225, + 21888242871839275222246405745257275088548364400416034343698203836710344751646, + 514227045843067, + 21888242871839275222246405745257275088548364400416034343698204006993714760578, + 21888242871839275222246405745257275088548364400416034343698204159944800727128, + 498088737535328, + 68524165975919, + 21888242871839275222246405745257275088548364400416034343698203958819525480594, + 26685497891653, + 21888242871839275222246405745257275088548364400416034343698204157574537518462, + 136899842981348, + 21888242871839275222246405745257275088548364400416034343698203915126230073375, + 383453118219718, + 21888242871839275222246405745257275088548364400416034343698203735692374164581, + 246600499893719, + 274236573291801, + 203476610983246, + 374323294744120, + 21888242871839275222246405745257275088548364400416034343698203781441332170715, + 21888242871839275222246405745257275088548364400416034343698204095895731916521, + 174646388395789, + 21888242871839275222246405745257275088548364400416034343698203696206611641521, + 21888242871839275222246405745257275088548364400416034343698203943380041434930, + 20370335009974, + 138267902796376, + 202865437327363, + 162494668764634, + 21888242871839275222246405745257275088548364400416034343698203703195992310213, + 320509713201495, + 106156180489924, + 21888242871839275222246405745257275088548364400416034343698203676606023038259, + 21888242871839275222246405745257275088548364400416034343698203953595809193137, + 21888242871839275222246405745257275088548364400416034343698204098326320440406, + 21888242871839275222246405745257275088548364400416034343698203846578301066440, + 272213195536647, + 63112580026410, + 438545080203570, + 287546345557472, + 21888242871839275222246405745257275088548364400416034343698203709288807527088, + 423929650461566, + 21888242871839275222246405745257275088548364400416034343698204121775325034581, + 227225843357378, + 21888242871839275222246405745257275088548364400416034343698203920472094627152, + 144304772409434, + 508327989310627, + 261264434049250, + 21888242871839275222246405745257275088548364400416034343698204069611060954051, + 214222155959363, + 21888242871839275222246405745257275088548364400416034343698204147942543033957, + 63163566611827, + 482607773262886, + 21888242871839275222246405745257275088548364400416034343698203931610902301508, + 21888242871839275222246405745257275088548364400416034343698204096528754396458, + 21888242871839275222246405745257275088548364400416034343698203645430270234894, + 361904875998453, + 21888242871839275222246405745257275088548364400416034343698203777421987268993, + 332443384953971, + 374625871237879, + 132617885653892, + 177040532875665, + 21888242871839275222246405745257275088548364400416034343698204121096053551357, + 553860927615837, + 26375270008233, + 211811400514589, + 276336293437541, + 21888242871839275222246405745257275088548364400416034343698203779340602191241, + 254808900172368, + 231249894515691, + 21888242871839275222246405745257275088548364400416034343698204175719692329197, + 51056587851761, + 219103854787857, + 21888242871839275222246405745257275088548364400416034343698203882335031499815, + 31093240869296, + 21888242871839275222246405745257275088548364400416034343698203796715587555248, + 21888242871839275222246405745257275088548364400416034343698203699637309615379, + 21888242871839275222246405745257275088548364400416034343698203953182879822742, + 21888242871839275222246405745257275088548364400416034343698203964713405052974, + 118337655017926, + 203514436251924, + 21888242871839275222246405745257275088548364400416034343698203959405269397373, + 21888242871839275222246405745257275088548364400416034343698203903327597326347, + 21888242871839275222246405745257275088548364400416034343698203970160932677300, + 196078225679567, + 21888242871839275222246405745257275088548364400416034343698203794269760958452, + 29073084021322, + 21888242871839275222246405745257275088548364400416034343698203753823851547031, + 150694825911870, + 21888242871839275222246405745257275088548364400416034343698203979253465126529, + 21888242871839275222246405745257275088548364400416034343698204157474773549797, + 21888242871839275222246405745257275088548364400416034343698203905642611857816, + 21888242871839275222246405745257275088548364400416034343698204060700857773010, + 34596791540238, + 442839760863108, + 21888242871839275222246405745257275088548364400416034343698203949899043424574, + 362224052156456, + 236992115625365, + 21888242871839275222246405745257275088548364400416034343698203650981657186753, + 145725379371431, + 286481949935729, + 21888242871839275222246405745257275088548364400416034343698203651017496976100, + 21888242871839275222246405745257275088548364400416034343698203908098323100913, + 21888242871839275222246405745257275088548364400416034343698203724342338437262, + 21888242871839275222246405745257275088548364400416034343698203932887456173312, + 155128797395803, + 21888242871839275222246405745257275088548364400416034343698203640496448532027, + 21888242871839275222246405745257275088548364400416034343698203931277188556482, + 315745674952503, + 21888242871839275222246405745257275088548364400416034343698204142738502571628, + 219283619036797, + 28519508318625, + 361278977079813, + 21888242871839275222246405745257275088548364400416034343698203679620043539061, + 290832011517655, + 243895320965841, + 466055083035708, + 560139200764730, + 344182464514256, + 21888242871839275222246405745257275088548364400416034343698203965133067743248, + 21888242871839275222246405745257275088548364400416034343698203955364589904143, + 21888242871839275222246405745257275088548364400416034343698203708980997479259, + 21888242871839275222246405745257275088548364400416034343698203930489701634550, + 21888242871839275222246405745257275088548364400416034343698203831905990080197, + 21888242871839275222246405745257275088548364400416034343698204115516944931184, + 21888242871839275222246405745257275088548364400416034343698204171931690469412, + 21888242871839275222246405745257275088548364400416034343698203715298891180632, + 21888242871839275222246405745257275088548364400416034343698203764800228765094, + 21888242871839275222246405745257275088548364400416034343698203645081263768402, + 21888242871839275222246405745257275088548364400416034343698203928877690423998, + 316992773897830, + 311615082987762, + 21888242871839275222246405745257275088548364400416034343698204027804246388627, + 21888242871839275222246405745257275088548364400416034343698203812005110102264, + 489537980211890, + 21888242871839275222246405745257275088548364400416034343698204063507391415217, + 338258338147153, + 78268948547178, + 345596732954517, + 21888242871839275222246405745257275088548364400416034343698204094158499742652, + 276902365439704, + 143777588980592, + 217303743956191, + 80928660254931, + 21888242871839275222246405745257275088548364400416034343698204009502830011519, + 21888242871839275222246405745257275088548364400416034343698203866631344181901, + 221150261509840, + 141607791977548, + 21888242871839275222246405745257275088548364400416034343698203770390980665473, + 21888242871839275222246405745257275088548364400416034343698204163418879515451, + 58794864436663, + 187605054960601, + 21888242871839275222246405745257275088548364400416034343698203805637778463026, + 21888242871839275222246405745257275088548364400416034343698204153050342172629, + 43992579866804, + 101225442816872, + 21888242871839275222246405745257275088548364400416034343698203716178723056963, + 313508961737658, + 21888242871839275222246405745257275088548364400416034343698204135123050259867, + 21888242871839275222246405745257275088548364400416034343698204140015433181154, + 257746467477667, + 460761943496509, + 344847487499783, + 21888242871839275222246405745257275088548364400416034343698203832744277425504, + 181203842302557, + 455874085703201, + 21888242871839275222246405745257275088548364400416034343698203981882880926359, + 21888242871839275222246405745257275088548364400416034343698203874922465185195, + 21888242871839275222246405745257275088548364400416034343698203952795791773342, + 21888242871839275222246405745257275088548364400416034343698203945396837370840, + 21888242871839275222246405745257275088548364400416034343698203922923278385453, + 296349902524113, + 317783088968795, + 21888242871839275222246405745257275088548364400416034343698203726502583743563, + 21888242871839275222246405745257275088548364400416034343698204065211324758530, + 104687379158703, + 367798233019911, + 225644800114658, + 21888242871839275222246405745257275088548364400416034343698203836586374321841, + 21888242871839275222246405745257275088548364400416034343698203757237999430231, + 542827115930347, + 21888242871839275222246405745257275088548364400416034343698203670980151691307, + 21888242871839275222246405745257275088548364400416034343698203719434581213256, + 174660145266042, + 21888242871839275222246405745257275088548364400416034343698203828670675871803, + 386466419797742, + 21888242871839275222246405745257275088548364400416034343698204128576630365405, + 315266641553879, + 21888242871839275222246405745257275088548364400416034343698204116016450948325, + 21888242871839275222246405745257275088548364400416034343698203732646366865596, + 21888242871839275222246405745257275088548364400416034343698203952235403131429, + 150251436822020, + 395691480763404, + 400056820008947, + 21888242871839275222246405745257275088548364400416034343698204174780809245402, + 292859361463403, + 21888242871839275222246405745257275088548364400416034343698204078884582466005, + 248184231348019, + 341394604970637, + 21888242871839275222246405745257275088548364400416034343698204108994703714867, + 291146293809056, + 388408653348130, + 21888242871839275222246405745257275088548364400416034343698203779077841962891, + 21888242871839275222246405745257275088548364400416034343698204018468351050783, + 21888242871839275222246405745257275088548364400416034343698203902521401743424, + 21888242871839275222246405745257275088548364400416034343698203882733245762189, + 406591466891663, + 21888242871839275222246405745257275088548364400416034343698204062074597801018, + 261513308488680, + 21888242871839275222246405745257275088548364400416034343698203771870412855330, + 70009401168426, + 405743004825339, + 21888242871839275222246405745257275088548364400416034343698203969832754766264, + 198704284717655, + 436012061576738, + 203661914718466, + 463935745278540, + 72354017287080, + 21888242871839275222246405745257275088548364400416034343698203734313573203979, + 21888242871839275222246405745257275088548364400416034343698204023831243727474, + 21888242871839275222246405745257275088548364400416034343698203950095466532015, + 21888242871839275222246405745257275088548364400416034343698203801435765019636, + 511343817956916, + 21888242871839275222246405745257275088548364400416034343698204166464256855927, + 183642264699709, + 21888242871839275222246405745257275088548364400416034343698203750789055892345, + 242222339296955, + 21888242871839275222246405745257275088548364400416034343698204070857043211743, + 21888242871839275222246405745257275088548364400416034343698204161061304598969, + 23375017183994, + 21888242871839275222246405745257275088548364400416034343698203727264051374342, + 21888242871839275222246405745257275088548364400416034343698203640118901087863, + 495750219390173, + 515674676679496, + 181768315573259, + 21888242871839275222246405745257275088548364400416034343698204157382308812323, + 21888242871839275222246405745257275088548364400416034343698204122281998462854, + 508209931377561, + 540833825191987, + 21888242871839275222246405745257275088548364400416034343698203636266791035096, + 21888242871839275222246405745257275088548364400416034343698203727165885127551, + 493154633759078, + 21888242871839275222246405745257275088548364400416034343698203723431059031081, + 21888242871839275222246405745257275088548364400416034343698203703217286266376, + 21888242871839275222246405745257275088548364400416034343698204180979794350696, + 12945568745684, + 435462572229295, + 364927774113984, + 44170475714672, + 21888242871839275222246405745257275088548364400416034343698203666740170252052, + 499416444562016, + 382842593252458, + 495526166498087, + 21888242871839275222246405745257275088548364400416034343698203816473667930797, + 21888242871839275222246405745257275088548364400416034343698203736473119450349, + 21888242871839275222246405745257275088548364400416034343698203721574615434273, + 252737586197565, + 21888242871839275222246405745257275088548364400416034343698204145568456389478, + 21888242871839275222246405745257275088548364400416034343698204146105735398497, + 214784796213581, + 480182590369828, + 21888242871839275222246405745257275088548364400416034343698204051800710618316, + 21888242871839275222246405745257275088548364400416034343698204062489797052166, + 318482332102065, + 296896539448050, + 540051223690163, + 162865318476529, + 21888242871839275222246405745257275088548364400416034343698203917399514320035, + 21888242871839275222246405745257275088548364400416034343698203955596419264475, + 408966851831537, + 21888242871839275222246405745257275088548364400416034343698203709781752082430, + 21888242871839275222246405745257275088548364400416034343698204046147197408586, + 60106980347957, + 21888242871839275222246405745257275088548364400416034343698204142605516238531, + 21888242871839275222246405745257275088548364400416034343698203743387036582956, + 305081787061940, + 21888242871839275222246405745257275088548364400416034343698203705812044326423, + 259687383409183, + 21888242871839275222246405745257275088548364400416034343698204178164371512952, + 21888242871839275222246405745257275088548364400416034343698204063753651173611, + 94615690651219, + 172545096097351, + 418477414635716, + 21888242871839275222246405745257275088548364400416034343698204072374947276120, + 178631314230095, + 225548970166920, + 367767495809102, + 342578800350836, + 112780035176006, + 24760544691897, + 526655606521013, + 520724385796799, + 508900166304977, + 21888242871839275222246405745257275088548364400416034343698203953306917890487, + 21888242871839275222246405745257275088548364400416034343698203870894213088083, + 21888242871839275222246405745257275088548364400416034343698203885348335935466, + 212395657302055, + 21888242871839275222246405745257275088548364400416034343698203869851642690154, + 21888242871839275222246405745257275088548364400416034343698203818101874798695, + 447181592102276, + 385969193324139, + 90646674800552, + 550827168216898, + 317306952322543, + 147768483059473, + 21888242871839275222246405745257275088548364400416034343698203832665246297454, + 21888242871839275222246405745257275088548364400416034343698204103135816868211, + 340125444111724, + 21888242871839275222246405745257275088548364400416034343698203691866178678134, + 72958550808661, + 317316043037233, + 127116022600586, + 21888242871839275222246405745257275088548364400416034343698203825808111528487, + 21888242871839275222246405745257275088548364400416034343698203909341406069852, + 74282575603309, + 21888242871839275222246405745257275088548364400416034343698203779110280007239, + 402506226466320, + 389682599296144, + 512947935450893, + 259080387357130, + 21888242871839275222246405745257275088548364400416034343698203762780228355452, + 21888242871839275222246405745257275088548364400416034343698204105158214144141, + 31394478813425, + 21888242871839275222246405745257275088548364400416034343698204099883620409333, + 21888242871839275222246405745257275088548364400416034343698203771964411246495, + 94728423496103, + 35383197443632, + 21888242871839275222246405745257275088548364400416034343698204074233356062259, + 21888242871839275222246405745257275088548364400416034343698203972818286345753, + 21888242871839275222246405745257275088548364400416034343698204130666975672179, + 238053607342698, + 21888242871839275222246405745257275088548364400416034343698204047505551102196, + 21888242871839275222246405745257275088548364400416034343698204044351595301796, + 21888242871839275222246405745257275088548364400416034343698204002134114248899, + 348938181941033, + 21888242871839275222246405745257275088548364400416034343698204124571800735202, + 436266190704299, + 106147386615885, + 21888242871839275222246405745257275088548364400416034343698204065032735782124, + 21888242871839275222246405745257275088548364400416034343698203904171823251340, + 21888242871839275222246405745257275088548364400416034343698203998379115367710, + 384575520080342, + 551387030981413, + 21888242871839275222246405745257275088548364400416034343698203632439146244630, + 157911053398042, + 376658070726141, + 21888242871839275222246405745257275088548364400416034343698204002210717415633, + 21888242871839275222246405745257275088548364400416034343698204008878744694691, + 21888242871839275222246405745257275088548364400416034343698204046946022942308, + 21888242871839275222246405745257275088548364400416034343698203662435569129450, + 21888242871839275222246405745257275088548364400416034343698203983794164691704, + 21888242871839275222246405745257275088548364400416034343698203878099368211477, + 521419268418399, + 354017417387618, + 21888242871839275222246405745257275088548364400416034343698203662987713437941, + 356563936143726, + 212352284535396, + 272007612975527, + 21888242871839275222246405745257275088548364400416034343698204021807336983664, + 354202499363276, + 21888242871839275222246405745257275088548364400416034343698204168439243703348, + 21888242871839275222246405745257275088548364400416034343698203673696791144590, + 21888242871839275222246405745257275088548364400416034343698203872805828372047, + 476495706851447, + 514094914036820, + 30340019827620, + 561442851491467, + 21888242871839275222246405745257275088548364400416034343698203929158523068470, + 408056696008162, + 21888242871839275222246405745257275088548364400416034343698203957193834633648, + 29605052536499, + 8778668271518, + 231741695987937, + 21888242871839275222246405745257275088548364400416034343698203772648925519289, + 21888242871839275222246405745257275088548364400416034343698203743241206293916, + 21888242871839275222246405745257275088548364400416034343698203953726706127145, + 21888242871839275222246405745257275088548364400416034343698203928522959011625, + 499316050081650, + 21888242871839275222246405745257275088548364400416034343698203896722975664660, + 21888242871839275222246405745257275088548364400416034343698203884677277469501, + 329004094647859, + 21888242871839275222246405745257275088548364400416034343698203707148287117260, + 21888242871839275222246405745257275088548364400416034343698203700043127845662, + 21888242871839275222246405745257275088548364400416034343698203755478222569653, + 208390595949855, + 150660256690360, + 21888242871839275222246405745257275088548364400416034343698203869913595186209, + 21888242871839275222246405745257275088548364400416034343698204016591641818964, + 506816165736998, + 71898445673044, + 397118455254157, + 21888242871839275222246405745257275088548364400416034343698203985408091605160, + 153526204914224, + 21888242871839275222246405745257275088548364400416034343698203896764215168718, + 21888242871839275222246405745257275088548364400416034343698204066416087232901, + 21888242871839275222246405745257275088548364400416034343698204044135713287625, + 138363071703413, + 214960649291333, + 21888242871839275222246405745257275088548364400416034343698203802272595833798, + 21888242871839275222246405745257275088548364400416034343698203891372741657429, + 335721996633494, + 21888242871839275222246405745257275088548364400416034343698203730203222530725, + 11106852140854, + 355602553569999, + 420537767351281, + 504671486852456, + 164868179305863, + 340964013454571, + 21888242871839275222246405745257275088548364400416034343698203869889724392781, + 7882554227608, + 21888242871839275222246405745257275088548364400416034343698203857372663588231, + 309185243405293, + 497650110071695, + 21888242871839275222246405745257275088548364400416034343698203882139505793835, + 561239960450572, + 132006929780096, + 342460334839160, + 449594993814556, + 21888242871839275222246405745257275088548364400416034343698204068169479377262, + 21888242871839275222246405745257275088548364400416034343698204044868502577299, + 19287269293583, + 21888242871839275222246405745257275088548364400416034343698203761815738116322, + 238997374171165, + 232417491059197, + 103300214310734, + 21888242871839275222246405745257275088548364400416034343698203761950689949137, + 21888242871839275222246405745257275088548364400416034343698203811069417972481, + 25802096233323, + 21888242871839275222246405745257275088548364400416034343698203694630202333944, + 104358064684854, + 21888242871839275222246405745257275088548364400416034343698204046936120110356, + 21888242871839275222246405745257275088548364400416034343698203727855428554206, + 21888242871839275222246405745257275088548364400416034343698204011983198993393, + 138931564493345, + 448475806278337, + 413205667550057, + 358680070287186, + 222032050695296, + 21888242871839275222246405745257275088548364400416034343698203697057748146494, + 375104328304203, + 141636811404638, + 298405263508954, + 420808244252067, + 21888242871839275222246405745257275088548364400416034343698203635894764383003, + 482478710836469, + 62363842473903, + 21888242871839275222246405745257275088548364400416034343698204043074149021346, + 21888242871839275222246405745257275088548364400416034343698204097386776985336, + 21888242871839275222246405745257275088548364400416034343698203810510313514741, + 378409471287521, + 21888242871839275222246405745257275088548364400416034343698203747326358826836, + 18262929119935, + 21888242871839275222246405745257275088548364400416034343698203852051686257876, + 21888242871839275222246405745257275088548364400416034343698203733280808540739, + 294881524308538, + 460199993642840, + 304752969322277, + 21888242871839275222246405745257275088548364400416034343698204004591964810921, + 413468615784048, + 371660981112064, + 21888242871839275222246405745257275088548364400416034343698204030898092247496, + 491542845483308, + 21888242871839275222246405745257275088548364400416034343698203797264834751233, + 428466512052505, + 21888242871839275222246405745257275088548364400416034343698203741583237579201, + 21888242871839275222246405745257275088548364400416034343698204029534243070036, + 21888242871839275222246405745257275088548364400416034343698203654999337446409, + 379648248233685, + 21888242871839275222246405745257275088548364400416034343698203914356768549509, + 21888242871839275222246405745257275088548364400416034343698203817421002990458, + 21888242871839275222246405745257275088548364400416034343698203964548622705233, + 172134371453434, + 242278651011550, + 285369748116297, + 21888242871839275222246405745257275088548364400416034343698204010765920592173, + 21888242871839275222246405745257275088548364400416034343698203876692434255846, + 21888242871839275222246405745257275088548364400416034343698203793510743253965, + 21888242871839275222246405745257275088548364400416034343698203919543965289957, + 486096963097348, + 21888242871839275222246405745257275088548364400416034343698203895121412154148, + 205857659321865, + 530853716714386, + 21888242871839275222246405745257275088548364400416034343698204179107734991371, + 21888242871839275222246405745257275088548364400416034343698204117268332380159, + 135740882853171, + 526738336360302, + 211992417549998, + 21888242871839275222246405745257275088548364400416034343698203698396140336544, + 21888242871839275222246405745257275088548364400416034343698203990900181428731, + 289051568695497, + 21888242871839275222246405745257275088548364400416034343698203657996657976470, + 21888242871839275222246405745257275088548364400416034343698203856113358527123, + 56949697587869, + 320784815454365, + 21888242871839275222246405745257275088548364400416034343698203994959817355966, + 172322956654330, + 437203177603064, + 532288647959221, + 366997912142852, + 533229288678509, + 497690429347667, + 21888242871839275222246405745257275088548364400416034343698203780930007296326, + 21888242871839275222246405745257275088548364400416034343698203863852283613906, + 418619310053007, + 21888242871839275222246405745257275088548364400416034343698204176251955288113, + 21888242871839275222246405745257275088548364400416034343698203818880895838557, + 355003804396443, + 21888242871839275222246405745257275088548364400416034343698204015102033779298, + 396749824549436, + 21888242871839275222246405745257275088548364400416034343698203950208610471980, + 2864353319435, + 202417813239498, + 419256830595680, + 402468036029296, + 235860220378454, + 405916910118828, + 495447173741039, + 346727231568034, + 45929939071544, + 1226894487213, + 21888242871839275222246405745257275088548364400416034343698203670114207215856, + 21888242871839275222246405745257275088548364400416034343698204087127705520267, + 330064950274934, + 21888242871839275222246405745257275088548364400416034343698204083510960198261, + 494129658598586, + 21888242871839275222246405745257275088548364400416034343698203850546390606506, + 21888242871839275222246405745257275088548364400416034343698204063199534588187, + 21888242871839275222246405745257275088548364400416034343698204124241070287562, + 189801904732969, + 311474551758231, + 21888242871839275222246405745257275088548364400416034343698203831408294601866, + 68210443060180, + 21888242871839275222246405745257275088548364400416034343698204080110947993907, + 21888242871839275222246405745257275088548364400416034343698203817264904876887, + 21888242871839275222246405745257275088548364400416034343698203644988666896999, + 218857473477706, + 21888242871839275222246405745257275088548364400416034343698203791224618896460, + 21888242871839275222246405745257275088548364400416034343698203947249442454580, + 21888242871839275222246405745257275088548364400416034343698204106716731462407, + 21888242871839275222246405745257275088548364400416034343698203991196212659017, + 21888242871839275222246405745257275088548364400416034343698203846364103384446, + 184179780639944, + 21888242871839275222246405745257275088548364400416034343698203662705182462396, + 261944080921744, + 21888242871839275222246405745257275088548364400416034343698204142374242298700, + 21888242871839275222246405745257275088548364400416034343698203751942575113077, + 254097516315569, + 21888242871839275222246405745257275088548364400416034343698203819109201032129, + 423052427269622, + 21888242871839275222246405745257275088548364400416034343698204050902096544919, + 460946721078408, + 453388566251107, + 215927068640802, + 21888242871839275222246405745257275088548364400416034343698203697729723476074, + 460588705591423, + 21888242871839275222246405745257275088548364400416034343698204159166903285617, + 21888242871839275222246405745257275088548364400416034343698203737743184524789, + 21888242871839275222246405745257275088548364400416034343698203801699416601653, + 505516882661822, + 21888242871839275222246405745257275088548364400416034343698203960586387334720, + 21888242871839275222246405745257275088548364400416034343698204079319669287871, + 21888242871839275222246405745257275088548364400416034343698203663022398265240, + 526812113824477, + 21888242871839275222246405745257275088548364400416034343698203952347448117214, + 21888242871839275222246405745257275088548364400416034343698203847571558493153, + 21888242871839275222246405745257275088548364400416034343698203899445301639557, + 21888242871839275222246405745257275088548364400416034343698204144751256972250, + 157837580329279, + 21888242871839275222246405745257275088548364400416034343698203763461279248738, + 21888242871839275222246405745257275088548364400416034343698203727429676884697, + 21888242871839275222246405745257275088548364400416034343698203750597230449938, + 177960785224276, + 544749969209229, + 21888242871839275222246405745257275088548364400416034343698204119836512238412, + 21888242871839275222246405745257275088548364400416034343698203698583269156797, + 200605677180703, + 235116352082247, + 21888242871839275222246405745257275088548364400416034343698204046892773552438, + 21888242871839275222246405745257275088548364400416034343698203932361102628613, + 272294724392898, + 21888242871839275222246405745257275088548364400416034343698203980051597825808, + 489988433437002, + 21888242871839275222246405745257275088548364400416034343698204074671750178928, + 207549371572249, + 524621262881070, + 21888242871839275222246405745257275088548364400416034343698203842394089596023, + 21888242871839275222246405745257275088548364400416034343698203754838156305000, + 21888242871839275222246405745257275088548364400416034343698203692937687450295, + 21888242871839275222246405745257275088548364400416034343698204021066907279339, + 21888242871839275222246405745257275088548364400416034343698204059340380363262, + 21888242871839275222246405745257275088548364400416034343698203997353067031870, + 327390536266523, + 115979473555027, + 21888242871839275222246405745257275088548364400416034343698203832703912003621, + 21888242871839275222246405745257275088548364400416034343698203685763172581409, + 21888242871839275222246405745257275088548364400416034343698203771470589372453, + 21888242871839275222246405745257275088548364400416034343698203943055698144425, + 199326670293603, + 157302349753167, + 181950326228543, + 21888242871839275222246405745257275088548364400416034343698204181222881825862, + 251291854638697, + 21888242871839275222246405745257275088548364400416034343698204139320374550161, + 111855533929294, + 21888242871839275222246405745257275088548364400416034343698203714057487664000, + 96571056146680, + 21888242871839275222246405745257275088548364400416034343698203698862123737576, + 21888242871839275222246405745257275088548364400416034343698204098392275351670, + 182512009440480, + 417727623424476, + 93074294479024, + 180446590443951, + 60596117255893, + 7553216377748, + 203952648695727, + 484889708948204, + 21888242871839275222246405745257275088548364400416034343698203924210739320309, + 21888242871839275222246405745257275088548364400416034343698204001091078750511, + 177765667949413, + 21888242871839275222246405745257275088548364400416034343698203984474116914203, + 21888242871839275222246405745257275088548364400416034343698203686662707227415, + 30084065526801, + 376959761181, + 21888242871839275222246405745257275088548364400416034343698204008690281651532, + 21888242871839275222246405745257275088548364400416034343698203638120774476005, + 338430311071930, + 152181577223692, + 383025816250484, + 518113169875369, + 241726489868577, + 21888242871839275222246405745257275088548364400416034343698204162055242689279, + 21888242871839275222246405745257275088548364400416034343698203658662431213618, + 368874884208802, + 21888242871839275222246405745257275088548364400416034343698203930717828058159, + 397314003066709, + 21888242871839275222246405745257275088548364400416034343698203703148176826674, + 345689792203357, + 21888242871839275222246405745257275088548364400416034343698204027990724905308, + 21888242871839275222246405745257275088548364400416034343698204128633518583179, + 217090301543580, + 21888242871839275222246405745257275088548364400416034343698204012654824918882, + 21888242871839275222246405745257275088548364400416034343698203628868730017923, + 344790170947043, + 84684865319419, + 427215573931981, + 511973746157324, + 432818144270579, + 21888242871839275222246405745257275088548364400416034343698204005165681720703, + 21888242871839275222246405745257275088548364400416034343698204057900783348320, + 21888242871839275222246405745257275088548364400416034343698203815908492437332, + 21888242871839275222246405745257275088548364400416034343698203935932127899633, + 479855540477578, + 294906907634170, + 21888242871839275222246405745257275088548364400416034343698204090765990637469, + 21888242871839275222246405745257275088548364400416034343698204048545296952329, + 403679982542075, + 21888242871839275222246405745257275088548364400416034343698203903214897423588, + 131597348550853, + 495765910644466, + 21888242871839275222246405745257275088548364400416034343698203700929342720811, + 21888242871839275222246405745257275088548364400416034343698204113182855374108, + 518206073146037, + 21888242871839275222246405745257275088548364400416034343698204069200831618476, + 19044771631891, + 300123433443625, + 21888242871839275222246405745257275088548364400416034343698203845228269005824, + 223019090753463, + 21888242871839275222246405745257275088548364400416034343698203841867422930500, + 146757832191850, + 202317461614126, + 454389341574443, + 21888242871839275222246405745257275088548364400416034343698203886448331945138, + 168458271899916, + 21777106459605, + 21888242871839275222246405745257275088548364400416034343698203714629258777698, + 21888242871839275222246405745257275088548364400416034343698203793051657509478, + 505167748872812, + 98270993871714, + 527181458838584, + 21888242871839275222246405745257275088548364400416034343698203726375727881452, + 457580963006942, + 21888242871839275222246405745257275088548364400416034343698203791666240289951, + 21888242871839275222246405745257275088548364400416034343698203716743145954426, + 21888242871839275222246405745257275088548364400416034343698203883362661786035, + 21888242871839275222246405745257275088548364400416034343698203711883681785122, + 372802693714695, + 21888242871839275222246405745257275088548364400416034343698203715857615983692, + 541861693082414, + 21888242871839275222246405745257275088548364400416034343698203845737326235417, + 353183492127726, + 21888242871839275222246405745257275088548364400416034343698204052877258423902, + 111504949912873, + 540932322009672, + 436782981657713, + 32029870365758, + 40732335281226, + 372807753644920, + 387125924620464, + 366142476787266, + 34522571150257, + 81131371805658, + 21888242871839275222246405745257275088548364400416034343698203747701356090760, + 21888242871839275222246405745257275088548364400416034343698203801832660704782, + 540327118644913, + 21888242871839275222246405745257275088548364400416034343698204120437273451964, + 148891038388080, + 87389573149224, + 462378639816786, + 37052202560378, + 522140665729954, + 21888242871839275222246405745257275088548364400416034343698203733059055908014, + 115487826528348, + 21888242871839275222246405745257275088548364400416034343698203625430566360401, + 417726467400990, + 220779222963633, + 473589138700549, + 76011281637419, + 21888242871839275222246405745257275088548364400416034343698204138594489472133, + 21888242871839275222246405745257275088548364400416034343698203689042193600506, + 291422641350135, + 21888242871839275222246405745257275088548364400416034343698204102078098083508, + 21888242871839275222246405745257275088548364400416034343698204128194067777068, + 21888242871839275222246405745257275088548364400416034343698203656785291575963, + 21888242871839275222246405745257275088548364400416034343698203749755221848108, + 21888242871839275222246405745257275088548364400416034343698203963700065390774, + 21888242871839275222246405745257275088548364400416034343698204064658335126484, + 21888242871839275222246405745257275088548364400416034343698204146106202601426, + 7807723364237, + 404304981312952, + 21888242871839275222246405745257275088548364400416034343698203763098267898880, + 21888242871839275222246405745257275088548364400416034343698203783899710792078, + 123475517768378, + 21888242871839275222246405745257275088548364400416034343698203662659559035506, + 323452371433458, + 21888242871839275222246405745257275088548364400416034343698204167584517438461, + 280199953493019, + 21888242871839275222246405745257275088548364400416034343698204067142867984139, + 21888242871839275222246405745257275088548364400416034343698204073013877737399, + 21888242871839275222246405745257275088548364400416034343698203869535356394341, + 21888242871839275222246405745257275088548364400416034343698203876026795977272, + 64535352994794, + 410569639529390, + 376998948031333, + 341729574952228, + 291679498338942, + 284650723042400, + 544528201215085, + 21888242871839275222246405745257275088548364400416034343698203893840954809187, + 21888242871839275222246405745257275088548364400416034343698203751977798516047, + 21888242871839275222246405745257275088548364400416034343698203780993880015286, + 21888242871839275222246405745257275088548364400416034343698203916697159616979, + 21888242871839275222246405745257275088548364400416034343698204017941343441146, + 21888242871839275222246405745257275088548364400416034343698204053787062734257, + 21888242871839275222246405745257275088548364400416034343698203733050878048492, + 372227808621076, + 216269272138794, + 21888242871839275222246405745257275088548364400416034343698204180826678934484, + 21888242871839275222246405745257275088548364400416034343698203848903178694889, + 21888242871839275222246405745257275088548364400416034343698203937914953945813, + 21888242871839275222246405745257275088548364400416034343698203870186161920404, + 21888242871839275222246405745257275088548364400416034343698203781340105302103, + 21888242871839275222246405745257275088548364400416034343698203780663349441855, + 21888242871839275222246405745257275088548364400416034343698204164944842260362, + 21888242871839275222246405745257275088548364400416034343698203925667755082687, + 21888242871839275222246405745257275088548364400416034343698203964959168063123, + 287567690417789, + 21888242871839275222246405745257275088548364400416034343698204078155967788283, + 21888242871839275222246405745257275088548364400416034343698203919383205117048, + 147595536509807, + 301236748788715, + 21888242871839275222246405745257275088548364400416034343698204086058474299711, + 21888242871839275222246405745257275088548364400416034343698204184724635817732, + 503171761870223, + 356468129869299, + 327973906371622, + 21888242871839275222246405745257275088548364400416034343698203805386053928792, + 433553004672410, + 296516583027680, + 21888242871839275222246405745257275088548364400416034343698203636019823573546, + 236022971946587, + 21888242871839275222246405745257275088548364400416034343698203749608552001999, + 135324509308231, + 21888242871839275222246405745257275088548364400416034343698203802516349480544, + 21888242871839275222246405745257275088548364400416034343698204038888972243351, + 525251090351131, + 21888242871839275222246405745257275088548364400416034343698203641583239013491, + 21888242871839275222246405745257275088548364400416034343698203777795817761847, + 21888242871839275222246405745257275088548364400416034343698203692732723079574, + 21888242871839275222246405745257275088548364400416034343698204154655285062070, + 442964446938864, + 302882871037543, + 21888242871839275222246405745257275088548364400416034343698203901743940904744, + 424283167881913, + 21888242871839275222246405745257275088548364400416034343698204010149234322709, + 430461772456646, + 252740622556528, + 335656897321246, + 21888242871839275222246405745257275088548364400416034343698204131965098002049, + 496934826377159, + 21888242871839275222246405745257275088548364400416034343698203625350569150623, + 21888242871839275222246405745257275088548364400416034343698203682215438924365, + 431039839779693, + 467576586914732, + 21888242871839275222246405745257275088548364400416034343698203666479082117324, + 306193473460327, + 21888242871839275222246405745257275088548364400416034343698204101573011271626, + 24343632881054, + 21888242871839275222246405745257275088548364400416034343698203708137933048716, + 517283254062316, + 21888242871839275222246405745257275088548364400416034343698203953228819182395, + 92021700419032, + 234201073530626, + 21888242871839275222246405745257275088548364400416034343698204018453745505263, + 441388933943982, + 21888242871839275222246405745257275088548364400416034343698204049057112148569, + 21888242871839275222246405745257275088548364400416034343698204094783504777243, + 107129652220290, + 430392584854584, + 21888242871839275222246405745257275088548364400416034343698204175744677956332, + 21888242871839275222246405745257275088548364400416034343698204020485533764352, + 371989977462287, + 28996883470646, + 85902792434444, + 188266360064247, + 254903263416004, + 21888242871839275222246405745257275088548364400416034343698204151740248175479, + 21888242871839275222246405745257275088548364400416034343698203645982894000227, + 21888242871839275222246405745257275088548364400416034343698203951814583866460, + 21888242871839275222246405745257275088548364400416034343698203781870240630267, + 21888242871839275222246405745257275088548364400416034343698203953771485060542, + 294373558740658, + 461845231435779, + 21888242871839275222246405745257275088548364400416034343698203787219727922831, + 201732545341976, + 21888242871839275222246405745257275088548364400416034343698203898628772610456, + 21888242871839275222246405745257275088548364400416034343698203786219264064929, + 21888242871839275222246405745257275088548364400416034343698203918125192726506, + 166674467306746, + 21888242871839275222246405745257275088548364400416034343698203894956387385043, + 21888242871839275222246405745257275088548364400416034343698203950742049674088, + 21888242871839275222246405745257275088548364400416034343698204036381698561928, + 21888242871839275222246405745257275088548364400416034343698203709059187449316, + 21888242871839275222246405745257275088548364400416034343698203818770472258446, + 169974313300226, + 142410625394922, + 66885946174353, + 333505436759825, + 404875310096484, + 21888242871839275222246405745257275088548364400416034343698204047266618285314, + 372367182610893, + 21888242871839275222246405745257275088548364400416034343698204126958656438583, + 62429479055489, + 135255310786834, + 502191151362841, + 240254959374456, + 47324753534326, + 425944078177174, + 212945322636663, + 511809158650468, + 21888242871839275222246405745257275088548364400416034343698203942518754257939, + 21888242871839275222246405745257275088548364400416034343698203853512279224050, + 142379877723165, + 21888242871839275222246405745257275088548364400416034343698204083016137688487, + 21888242871839275222246405745257275088548364400416034343698204028088964930509, + 380305807866765, + 21888242871839275222246405745257275088548364400416034343698203892858245382950, + 21888242871839275222246405745257275088548364400416034343698203744402036805879, + 356667348303742, + 124886711304017, + 21888242871839275222246405745257275088548364400416034343698203847992476466792, + 461078630035270, + 541433126709248, + 21888242871839275222246405745257275088548364400416034343698204050441600238052, + 107297628523038, + 21888242871839275222246405745257275088548364400416034343698204087510209778827, + 21888242871839275222246405745257275088548364400416034343698203653788911340807, + 142576192777083, + 289121646449988, + 316642784650847, + 21888242871839275222246405745257275088548364400416034343698203644683948813839, + 21888242871839275222246405745257275088548364400416034343698203675977171671699, + 21888242871839275222246405745257275088548364400416034343698203683100418374785, + 21888242871839275222246405745257275088548364400416034343698203833288980373424, + 428821188677624, + 178378119618655, + 433258258195831, + 21888242871839275222246405745257275088548364400416034343698203731884092863435, + 93891119247701, + 21888242871839275222246405745257275088548364400416034343698203985222519933626, + 523072905553389, + 447880182967264, + 21888242871839275222246405745257275088548364400416034343698203777508068509300, + 238972797927091, + 21888242871839275222246405745257275088548364400416034343698203980185440741836, + 21888242871839275222246405745257275088548364400416034343698203963193609806781, + 380587827910469, + 557638999244372, + 21888242871839275222246405745257275088548364400416034343698203925761426778944, + 21888242871839275222246405745257275088548364400416034343698203904321757373665, + 407834711048915, + 21888242871839275222246405745257275088548364400416034343698204063270321592300, + 373691736953549, + 184573174711372, + 342265105462109, + 406880149265007, + 21888242871839275222246405745257275088548364400416034343698203983688793123901, + 9612892955891, + 21888242871839275222246405745257275088548364400416034343698203799070872219598, + 534533348753864, + 211219996768789, + 59691934974803, + 21888242871839275222246405745257275088548364400416034343698203673962492895991, + 185469875809535, + 110852291097308, + 21888242871839275222246405745257275088548364400416034343698203697451394337978, + 91554910117429, + 21888242871839275222246405745257275088548364400416034343698203684764266835508, + 368379335561302, + 21888242871839275222246405745257275088548364400416034343698203998351425511198, + 511771469475763, + 21888242871839275222246405745257275088548364400416034343698204159420432513448, + 21888242871839275222246405745257275088548364400416034343698203646212663392609, + 21888242871839275222246405745257275088548364400416034343698203816036556855118, + 21888242871839275222246405745257275088548364400416034343698203913269914854032, + 21888242871839275222246405745257275088548364400416034343698203880234315628086, + 523554764379303, + 39917416875627, + 380613721880210, + 21888242871839275222246405745257275088548364400416034343698203703007033800505, + 21888242871839275222246405745257275088548364400416034343698204106766528199348, + 433904558722291, + 177465509629, + 21888242871839275222246405745257275088548364400416034343698204077979450919892, + 21888242871839275222246405745257275088548364400416034343698203959044759317490, + 342791184259585, + 219517520040457, + 78644548138206, + 21888242871839275222246405745257275088548364400416034343698203655635376079048, + 156771730304701, + 21888242871839275222246405745257275088548364400416034343698203689832039674003, + 21888242871839275222246405745257275088548364400416034343698203858459097837513, + 21888242871839275222246405745257275088548364400416034343698203680747237123507, + 53223940087968, + 21888242871839275222246405745257275088548364400416034343698203697692350795855, + 154814297470284, + 259862539391726, + 340177178269521, + 502442559080503, + 392566484791000, + 21888242871839275222246405745257275088548364400416034343698203888500307873969, + 123404793461856, + 183347512545356, + 553234418377432, + 21888242871839275222246405745257275088548364400416034343698203856063256309160, + 21888242871839275222246405745257275088548364400416034343698204084116515427675, + 21888242871839275222246405745257275088548364400416034343698203851256673623504, + 67297897581665, + 21888242871839275222246405745257275088548364400416034343698203655082650713318, + 21888242871839275222246405745257275088548364400416034343698204096629359852890, + 57538613619511, + 3818019552743, + 373015642725487, + 21888242871839275222246405745257275088548364400416034343698203664171127036568, + 107900820017610, + 359547258617430, + 21888242871839275222246405745257275088548364400416034343698204107505775304321, + 236634992433124, + 535285529829320, + 21888242871839275222246405745257275088548364400416034343698204119105271948963, + 268970897224208, + 21888242871839275222246405745257275088548364400416034343698203745575683342397, + 21888242871839275222246405745257275088548364400416034343698203768735677042956, + 431330885298597, + 21888242871839275222246405745257275088548364400416034343698203807301989159554, + 229420186464741, + 511882624745043, + 8252872063180, + 392858832448849, + 45961218100816, + 347965479824218, + 21888242871839275222246405745257275088548364400416034343698203976394601288556, + 24236900458256, + 21888242871839275222246405745257275088548364400416034343698204096446413890833, + 336521154953481, + 21888242871839275222246405745257275088548364400416034343698204174375010555108, + 498016604357468, + 21888242871839275222246405745257275088548364400416034343698203716503107971272, + 224046113604524, + 21888242871839275222246405745257275088548364400416034343698203856980860396243, + 21888242871839275222246405745257275088548364400416034343698204019573374307587, + 105600966480745, + 309135955908029, + 256577999383784, + 21888242871839275222246405745257275088548364400416034343698203782563715891435, + 412709078556046, + 518776981547756, + 472146350689192, + 172340742799694, + 21888242871839275222246405745257275088548364400416034343698203763117200295928, + 96103535114383, + 490665049311453, + 21888242871839275222246405745257275088548364400416034343698203667100378131185, + 21888242871839275222246405745257275088548364400416034343698204033875108999702, + 463170594865922, + 497566344239354, + 527449960516042, + 514576501603122, + 21888242871839275222246405745257275088548364400416034343698203739917071108573, + 104884301015368, + 21888242871839275222246405745257275088548364400416034343698204131121110032532, + 522241330599709, + 21888242871839275222246405745257275088548364400416034343698203631968940277145, + 468361794421730, + 21888242871839275222246405745257275088548364400416034343698203867710316283160, + 86387289830997, + 21888242871839275222246405745257275088548364400416034343698203706134342870891, + 288583870858994, + 21888242871839275222246405745257275088548364400416034343698204122205012060651, + 21888242871839275222246405745257275088548364400416034343698204167748013999452, + 276774321081219, + 13889471396576, + 278823262421003, + 21888242871839275222246405745257275088548364400416034343698203629703785347231, + 107922785892080, + 21888242871839275222246405745257275088548364400416034343698203716168724052711, + 294415669087328, + 417582533315653, + 21888242871839275222246405745257275088548364400416034343698204088531219569219, + 21888242871839275222246405745257275088548364400416034343698203811172703255192, + 21888242871839275222246405745257275088548364400416034343698204039853140902340, + 21888242871839275222246405745257275088548364400416034343698204015623110878454, + 21888242871839275222246405745257275088548364400416034343698203748976060750258, + 21888242871839275222246405745257275088548364400416034343698203734955227183819, + 376625231141728, + 456917929899801, + 560643843415897, + 424482471733018, + 21888242871839275222246405745257275088548364400416034343698203829213722965573, + 21888242871839275222246405745257275088548364400416034343698203680022257727499, + 21888242871839275222246405745257275088548364400416034343698203678056890715577, + 21888242871839275222246405745257275088548364400416034343698204159828391298776, + 21888242871839275222246405745257275088548364400416034343698203883950360514731, + 178504878756818, + 21888242871839275222246405745257275088548364400416034343698203776488722418447, + 21888242871839275222246405745257275088548364400416034343698204107784620940621, + 236611607611136, + 21888242871839275222246405745257275088548364400416034343698203804698354149896, + 337942720660785, + 121622377775968, + 132869920003184, + 392994494090633, + 437745393404911, + 548933533695324, + 21888242871839275222246405745257275088548364400416034343698203774336672163319, + 340300237841323, + 193898180680093, + 526024597127191, + 21888242871839275222246405745257275088548364400416034343698203638608630348459, + 21888242871839275222246405745257275088548364400416034343698204116007435270760, + 283194987528692, + 402697592886708, + 384985041735782, + 16302374754152, + 21888242871839275222246405745257275088548364400416034343698203658573382286707, + 21888242871839275222246405745257275088548364400416034343698203675416419698878, + 21888242871839275222246405745257275088548364400416034343698203925881916208170, + 21888242871839275222246405745257275088548364400416034343698204104540262735533, + 379120214792450, + 21888242871839275222246405745257275088548364400416034343698203636894321840922, + 21888242871839275222246405745257275088548364400416034343698203964303740515493, + 276483316809810, + 147953003456127, + 21888242871839275222246405745257275088548364400416034343698203708536506959166, + 21888242871839275222246405745257275088548364400416034343698203879115251922208, + 21888242871839275222246405745257275088548364400416034343698204020323581292642, + 52636733616074, + 21888242871839275222246405745257275088548364400416034343698203846177866555827, + 274662628228184, + 520831534103860, + 195791049968236, + 21888242871839275222246405745257275088548364400416034343698203766536627773133, + 330609894832588, + 104256946807440, + 21888242871839275222246405745257275088548364400416034343698204145540701871926, + 21888242871839275222246405745257275088548364400416034343698203749108146306018, + 442958314371075, + 381212946403532, + 21888242871839275222246405745257275088548364400416034343698204017890949549316, + 178322892359093, + 8952498690040, + 545312405934664, + 21888242871839275222246405745257275088548364400416034343698203823684249736760, + 21888242871839275222246405745257275088548364400416034343698203978739512869055, + 561857459064442, + 21888242871839275222246405745257275088548364400416034343698203668001460162509, + 21888242871839275222246405745257275088548364400416034343698203938298253122127, + 21888242871839275222246405745257275088548364400416034343698203774276389715298, + 28399174770362, + 21888242871839275222246405745257275088548364400416034343698203825069709903200, + 213342648713646, + 367248688157511, + 21888242871839275222246405745257275088548364400416034343698204137637119943208, + 21888242871839275222246405745257275088548364400416034343698203813831851843838, + 539720261888134, + 21888242871839275222246405745257275088548364400416034343698204007037253414293, + 21888242871839275222246405745257275088548364400416034343698203637144345501634, + 65085775953407, + 21888242871839275222246405745257275088548364400416034343698204170331038451456, + 21888242871839275222246405745257275088548364400416034343698203827669479214463, + 21888242871839275222246405745257275088548364400416034343698204084919055957649, + 21888242871839275222246405745257275088548364400416034343698203710907626746882, + 21888242871839275222246405745257275088548364400416034343698203960487054785072, + 398674961891560, + 21888242871839275222246405745257275088548364400416034343698204075476625530494, + 21888242871839275222246405745257275088548364400416034343698203644605300780177, + 21888242871839275222246405745257275088548364400416034343698203848370190688676, + 284674800010850, + 75441394390493, + 67178303740986, + 199744369681770, + 8845844045889, + 435278317803112, + 21888242871839275222246405745257275088548364400416034343698203829514823315075, + 21888242871839275222246405745257275088548364400416034343698203770046700466701, + 21888242871839275222246405745257275088548364400416034343698204054353192612690, + 21888242871839275222246405745257275088548364400416034343698203772709933868687, + 21888242871839275222246405745257275088548364400416034343698203654253011340317, + 240154009316818, + 104321573773817, + 21888242871839275222246405745257275088548364400416034343698204085675897604822, + 503853240352880, + 264004861906807, + 21888242871839275222246405745257275088548364400416034343698204152048261274573, + 559009171437271, + 224595659272528, + 432062543592703, + 437850498462506, + 21888242871839275222246405745257275088548364400416034343698203974861580925993, + 21888242871839275222246405745257275088548364400416034343698204061132605059790, + 21888242871839275222246405745257275088548364400416034343698203716018558731779, + 374190205651395, + 342135388602357, + 21888242871839275222246405745257275088548364400416034343698203704948265838742, + 394330375053840, + 21888242871839275222246405745257275088548364400416034343698203890694813511180, + 21888242871839275222246405745257275088548364400416034343698204025225067665434, + 21888242871839275222246405745257275088548364400416034343698203945193849008594, + 71874391099093, + 21888242871839275222246405745257275088548364400416034343698204161933904678701, + 420108647814334, + 181970383721705, + 21888242871839275222246405745257275088548364400416034343698203746739906302948, + 168645478352505, + 21888242871839275222246405745257275088548364400416034343698203994455663982477, + 82986471333487, + 21888242871839275222246405745257275088548364400416034343698203637970446670475, + 21888242871839275222246405745257275088548364400416034343698203953170013630569, + 253436815817626, + 504954569463576, + 21888242871839275222246405745257275088548364400416034343698203913574135134806, + 460664538160454, + 467111593265069, + 532131777032375, + 21888242871839275222246405745257275088548364400416034343698203963188163569464, + 293718912176943, + 547317299937378, + 56260658985951, + 21888242871839275222246405745257275088548364400416034343698204116204419289402, + 21888242871839275222246405745257275088548364400416034343698204183684098787279, + 538465969135212, + 176542676633232, + 21888242871839275222246405745257275088548364400416034343698203904369331395608, + 21888242871839275222246405745257275088548364400416034343698204074817273317282, + 257972695966914, + 167415155613859, + 342560333117536, + 21888242871839275222246405745257275088548364400416034343698203929072402972935, + 21888242871839275222246405745257275088548364400416034343698203794880058023124, + 71179253805808, + 461285621008312, + 21888242871839275222246405745257275088548364400416034343698203637500896054255, + 313070439894268, + 21888242871839275222246405745257275088548364400416034343698203888578279745378, + 21888242871839275222246405745257275088548364400416034343698203892951572496596, + 365659346771313, + 203203173596752, + 232138494215543, + 59975163418606, + 21888242871839275222246405745257275088548364400416034343698203853947146276991, + 21888242871839275222246405745257275088548364400416034343698203989839143093390, + 21888242871839275222246405745257275088548364400416034343698204164344609485969, + 126883863819923, + 243923318393158, + 509586057111646, + 21888242871839275222246405745257275088548364400416034343698203935976568303494, + 21888242871839275222246405745257275088548364400416034343698203661044756855511, + 21888242871839275222246405745257275088548364400416034343698203672187530382859, + 293479799378271, + 189560618607853, + 21888242871839275222246405745257275088548364400416034343698203717309319595786, + 21888242871839275222246405745257275088548364400416034343698204074141723433640, + 441333908567420, + 21888242871839275222246405745257275088548364400416034343698204081658730470847, + 21888242871839275222246405745257275088548364400416034343698203691105383359806, + 21888242871839275222246405745257275088548364400416034343698203940650752389959, + 60630691085436, + 21888242871839275222246405745257275088548364400416034343698203748958012290037, + 317925414318034, + 213974573485314, + 21888242871839275222246405745257275088548364400416034343698204140956754283126, + 73773405348317, + 402525700387764, + 21888242871839275222246405745257275088548364400416034343698203912392135501672, + 203675703585498, + 519469466107618, + 21888242871839275222246405745257275088548364400416034343698204110954226957647, + 21888242871839275222246405745257275088548364400416034343698203812436161583344, + 104345361929030, + 112584587590632, + 21888242871839275222246405745257275088548364400416034343698203851882553698182, + 20628290505819, + 117915933214360, + 561793804995256, + 407677195462591, + 21888242871839275222246405745257275088548364400416034343698204167146645368351, + 343415584215351, + 213886076395685, + 386693521160301, + 48433171274437, + 21888242871839275222246405745257275088548364400416034343698204069376787678003, + 333956056831757, + 84158899119005, + 122187398678526, + 21888242871839275222246405745257275088548364400416034343698203929062497895994, + 21888242871839275222246405745257275088548364400416034343698203726168472671280, + 194095884200485, + 115672931030838, + 21888242871839275222246405745257275088548364400416034343698203816185494540966, + 46244041309454, + 169416780571673, + 327855313223707, + 21888242871839275222246405745257275088548364400416034343698203834323340901273, + 92603475133328, + 228533911256806, + 432848426929948, + 96463302193180, + 21888242871839275222246405745257275088548364400416034343698203881907209582093, + 543113508630148, + 21888242871839275222246405745257275088548364400416034343698204174158017315677, + 477692207249366, + 85111695589773, + 559222179661904, + 85504184201327, + 8904817025844, + 323318138704774, + 495784377775046, + 21888242871839275222246405745257275088548364400416034343698204146193325479220, + 21888242871839275222246405745257275088548364400416034343698203849039071051350, + 21888242871839275222246405745257275088548364400416034343698204120243062037217, + 528895745201483, + 355392185031551, + 21888242871839275222246405745257275088548364400416034343698203974088122958705, + 21888242871839275222246405745257275088548364400416034343698203712415560924861, + 21888242871839275222246405745257275088548364400416034343698203941022279193981, + 385327945153346, + 21888242871839275222246405745257275088548364400416034343698204038178351921598, + 21888242871839275222246405745257275088548364400416034343698203823054605651499, + 21888242871839275222246405745257275088548364400416034343698203898025105250524, + 21888242871839275222246405745257275088548364400416034343698204057859185564028, + 21888242871839275222246405745257275088548364400416034343698204019762831349622, + 65675874149516, + 21888242871839275222246405745257275088548364400416034343698203934654887264120, + 285391984564536, + 21888242871839275222246405745257275088548364400416034343698203685090826051831, + 21888242871839275222246405745257275088548364400416034343698203912336882668794, + 21888242871839275222246405745257275088548364400416034343698203742174476910791, + 502109449616943, + 21888242871839275222246405745257275088548364400416034343698203734299310057286, + 347935003851644, + 21888242871839275222246405745257275088548364400416034343698203926797418528743, + 21888242871839275222246405745257275088548364400416034343698203880748942804014, + 210457364300190, + 21888242871839275222246405745257275088548364400416034343698204178345395509154, + 236637652425937, + 119905172961181, + 145154427944172, + 21888242871839275222246405745257275088548364400416034343698203644040640147813, + 21888242871839275222246405745257275088548364400416034343698203822450368653391, + 21888242871839275222246405745257275088548364400416034343698203855357030053661, + 46630775740447, + 21888242871839275222246405745257275088548364400416034343698204063617497596396, + 3886826226802, + 12670303185702, + 21888242871839275222246405745257275088548364400416034343698203923849043904969, + 329122521587362, + 405314719303433, + 307493680632467, + 21888242871839275222246405745257275088548364400416034343698204167942890989579, + 21888242871839275222246405745257275088548364400416034343698203920347710369013, + 21888242871839275222246405745257275088548364400416034343698204105246536256237, + 21888242871839275222246405745257275088548364400416034343698204144785877458481, + 58564242517482, + 21888242871839275222246405745257275088548364400416034343698203634073024300936, + 21888242871839275222246405745257275088548364400416034343698203681912680123899, + 21888242871839275222246405745257275088548364400416034343698203697933209138126, + 155166068326041, + 479854856744838, + 21888242871839275222246405745257275088548364400416034343698203736696623737830, + 21888242871839275222246405745257275088548364400416034343698203941349033250999, + 491495187257913, + 21888242871839275222246405745257275088548364400416034343698204084976108096130, + 143065871632502, + 236277720082603, + 21888242871839275222246405745257275088548364400416034343698203945562754171874, + 21888242871839275222246405745257275088548364400416034343698204049969003235244, + 21888242871839275222246405745257275088548364400416034343698203647796175145814, + 21888242871839275222246405745257275088548364400416034343698204062431766301939, + 43385254951070, + 21888242871839275222246405745257275088548364400416034343698203917326438984682, + 21888242871839275222246405745257275088548364400416034343698204103672316720992, + 34340804145098, + 53407372742251, + 21888242871839275222246405745257275088548364400416034343698204180345526040145, + 21888242871839275222246405745257275088548364400416034343698204028270357962604, + 435478234826114, + 221175819057079, + 21888242871839275222246405745257275088548364400416034343698204024632115127349, + 174796563469461, + 439918280859647, + 21888242871839275222246405745257275088548364400416034343698203644408021547504, + 21888242871839275222246405745257275088548364400416034343698203878159593994394, + 21888242871839275222246405745257275088548364400416034343698203929115206757489, + 21888242871839275222246405745257275088548364400416034343698204105373388492976, + 84765368377030, + 21888242871839275222246405745257275088548364400416034343698203962604009393386, + 245803586294149, + 101396348707254, + 21888242871839275222246405745257275088548364400416034343698203835134088370421, + 21888242871839275222246405745257275088548364400416034343698203800145187645351, + 21888242871839275222246405745257275088548364400416034343698203809156511778185, + 197323562623970, + 509414327152022, + 134052180391662, + 166046102351934, + 129295298227925, + 21888242871839275222246405745257275088548364400416034343698204066926583633051, + 243038581458606, + 208675184605929, + 427659746620353, + 90456901698881, + 21888242871839275222246405745257275088548364400416034343698203678765571123699, + 21888242871839275222246405745257275088548364400416034343698203956784944841427, + 21888242871839275222246405745257275088548364400416034343698203819508000648832, + 322775808518174, + 21888242871839275222246405745257275088548364400416034343698203872299897847165, + 42714614154501, + 148215322939815, + 47577564200985, + 17395022004860, + 109331820390798, + 493640275614541, + 29097385990844, + 21888242871839275222246405745257275088548364400416034343698204137422235930119, + 511439683459917, + 21888242871839275222246405745257275088548364400416034343698203627953556078325, + 174411729164444, + 21888242871839275222246405745257275088548364400416034343698203951147886391461, + 269399306484923, + 21888242871839275222246405745257275088548364400416034343698204066575132425971, + 555130852584553, + 259600215904719, + 462148236446720, + 311726949828745, + 256554996670599, + 21888242871839275222246405745257275088548364400416034343698204063542876128702, + 21888242871839275222246405745257275088548364400416034343698203745221780422193, + 311096265118361, + 147512404222264, + 21888242871839275222246405745257275088548364400416034343698203864435585752478, + 21888242871839275222246405745257275088548364400416034343698204118022885792467, + 21888242871839275222246405745257275088548364400416034343698204080651101584611, + 137422504886106, + 434810876029061, + 21888242871839275222246405745257275088548364400416034343698204114376184736351, + 21888242871839275222246405745257275088548364400416034343698204107845168413780, + 21888242871839275222246405745257275088548364400416034343698203964384464335292, + 21888242871839275222246405745257275088548364400416034343698203975320236371642, + 295803757744589, + 21888242871839275222246405745257275088548364400416034343698203945506427166379, + 21888242871839275222246405745257275088548364400416034343698203783622865129433, + 392684247349226, + 21888242871839275222246405745257275088548364400416034343698203764350737392180, + 21888242871839275222246405745257275088548364400416034343698203846823633436091, + 21888242871839275222246405745257275088548364400416034343698204171713814266608, + 376966143235453, + 21888242871839275222246405745257275088548364400416034343698203637587485778391, + 69128977586987, + 103443719777286, + 21888242871839275222246405745257275088548364400416034343698203901170252376960, + 427754612702121, + 403382750745135, + 46139467447809, + 21888242871839275222246405745257275088548364400416034343698203754244732171561, + 21888242871839275222246405745257275088548364400416034343698203788260898532955, + 21888242871839275222246405745257275088548364400416034343698203983860049514307, + 49112031907931, + 21888242871839275222246405745257275088548364400416034343698203986690779791087, + 2796920924784, + 451820968468956, + 21888242871839275222246405745257275088548364400416034343698203657875856470886, + 164803504096327, + 21888242871839275222246405745257275088548364400416034343698203854900821732762, + 474870907072094, + 21888242871839275222246405745257275088548364400416034343698204163103142405906, + 88722158625931, + 21888242871839275222246405745257275088548364400416034343698203997507769957940, + 21888242871839275222246405745257275088548364400416034343698203904067358179192, + 21888242871839275222246405745257275088548364400416034343698203874523696522589, + 21888242871839275222246405745257275088548364400416034343698203795227482006242, + 21888242871839275222246405745257275088548364400416034343698204043512216331499, + 82179943742461, + 21888242871839275222246405745257275088548364400416034343698203879018111612028, + 21888242871839275222246405745257275088548364400416034343698204091525361837099, + 21888242871839275222246405745257275088548364400416034343698203977246835901121, + 535404324198079, + 323579344611352, + 21888242871839275222246405745257275088548364400416034343698203792690772148537, + 21888242871839275222246405745257275088548364400416034343698204089234738377269, + 21888242871839275222246405745257275088548364400416034343698203927432451359040, + 308259934562123, + 21888242871839275222246405745257275088548364400416034343698204120437789041568, + 37612657041781, + 89710474560782, + 21888242871839275222246405745257275088548364400416034343698203735443523972738, + 21888242871839275222246405745257275088548364400416034343698203632007618207760, + 21888242871839275222246405745257275088548364400416034343698204048171788234933, + 126590130103873, + 21888242871839275222246405745257275088548364400416034343698203966852470064333, + 131923184013017, + 3969932583713, + 21888242871839275222246405745257275088548364400416034343698203798526406593035, + 64828302806858, + 21888242871839275222246405745257275088548364400416034343698203730053700008968, + 383436864153404, + 21888242871839275222246405745257275088548364400416034343698204049662264842300, + 21888242871839275222246405745257275088548364400416034343698203764713545014462, + 21888242871839275222246405745257275088548364400416034343698203847602882943442, + 21888242871839275222246405745257275088548364400416034343698203651030203533361, + 16668733689234, + 267905909450307, + 21888242871839275222246405745257275088548364400416034343698204047109415558584, + 475004267777188, + 21888242871839275222246405745257275088548364400416034343698204072304221322107, + 21888242871839275222246405745257275088548364400416034343698204061111729842199, + 130202050263587, + 147080931989263, + 21888242871839275222246405745257275088548364400416034343698203742535170087201, + 21888242871839275222246405745257275088548364400416034343698204117703928951503, + 21888242871839275222246405745257275088548364400416034343698203767500110070485, + 21888242871839275222246405745257275088548364400416034343698203638109490846095, + 21888242871839275222246405745257275088548364400416034343698203692678180485174, + 21888242871839275222246405745257275088548364400416034343698203914791334280929, + 21888242871839275222246405745257275088548364400416034343698203855101130655699, + 21888242871839275222246405745257275088548364400416034343698204103397944394579, + 453914919823838, + 481723444916826, + 441241241249664, + 107469713937904, + 21888242871839275222246405745257275088548364400416034343698203804184083259981, + 500139518743268, + 134790826993897, + 483062378307235, + 21888242871839275222246405745257275088548364400416034343698204050722867382750, + 399104605552016, + 21888242871839275222246405745257275088548364400416034343698204106229108531183, + 528434660841204, + 483950570399448, + 21888242871839275222246405745257275088548364400416034343698203803900269765562, + 398392545945135, + 217543400218664, + 21888242871839275222246405745257275088548364400416034343698203841578039581809, + 21888242871839275222246405745257275088548364400416034343698203832912040383491, + 110376071378569, + 524744826214751, + 21888242871839275222246405745257275088548364400416034343698204137556364532795, + 21888242871839275222246405745257275088548364400416034343698203864556637023849, + 21888242871839275222246405745257275088548364400416034343698203931410101410938, + 336232485662156, + 21888242871839275222246405745257275088548364400416034343698203980034685938110, + 21888242871839275222246405745257275088548364400416034343698203779226388762184, + 410393578180697, + 21888242871839275222246405745257275088548364400416034343698204137830420429492, + 40933320223835, + 21888242871839275222246405745257275088548364400416034343698203992794785816972, + 21888242871839275222246405745257275088548364400416034343698203899274818856975, + 327001746616439, + 348215392508461, + 172477231833611, + 21888242871839275222246405745257275088548364400416034343698203701126813061733, + 21888242871839275222246405745257275088548364400416034343698203963813560109516, + 21888242871839275222246405745257275088548364400416034343698203644317134002780, + 364863082461603, + 21888242871839275222246405745257275088548364400416034343698204041383063099724, + 430303344057295, + 302346460985865, + 21888242871839275222246405745257275088548364400416034343698204084161405856948, + 522126968596121, + 21888242871839275222246405745257275088548364400416034343698203835971137306796, + 21888242871839275222246405745257275088548364400416034343698203718638431395304, + 369317122711707, + 250340272857595, + 21888242871839275222246405745257275088548364400416034343698203725588665158503, + 21888242871839275222246405745257275088548364400416034343698203846223807326808, + 206630551985827, + 21888242871839275222246405745257275088548364400416034343698203815376287446900, + 280261525209872, + 21888242871839275222246405745257275088548364400416034343698203727564370814704, + 431379203246388, + 21888242871839275222246405745257275088548364400416034343698203922901348896300, + 530247749957984, + 21888242871839275222246405745257275088548364400416034343698204012125609613328, + 21888242871839275222246405745257275088548364400416034343698203700579335070638, + 86051940032677, + 21888242871839275222246405745257275088548364400416034343698203854340780413106, + 21888242871839275222246405745257275088548364400416034343698203766415482827532, + 446766316948903, + 21888242871839275222246405745257275088548364400416034343698203741120271707778, + 561279945377175, + 21888242871839275222246405745257275088548364400416034343698203711813044078724, + 380467375102838, + 117167814412803, + 21888242871839275222246405745257275088548364400416034343698203819280247279943, + 21888242871839275222246405745257275088548364400416034343698203893488937788678, + 21888242871839275222246405745257275088548364400416034343698204160487604410239, + 503411059355560, + 21888242871839275222246405745257275088548364400416034343698203967613371243242, + 251934127666277, + 21888242871839275222246405745257275088548364400416034343698203797719272325227, + 21888242871839275222246405745257275088548364400416034343698204041969441048807, + 50420393212112, + 21888242871839275222246405745257275088548364400416034343698203901539474726773, + 204833245827392, + 262078824662634, + 178230089601077, + 189942164578862, + 486446112179642, + 21888242871839275222246405745257275088548364400416034343698203938156800567870, + 21888242871839275222246405745257275088548364400416034343698204123325212634121, + 21888242871839275222246405745257275088548364400416034343698204185751493885311, + 21888242871839275222246405745257275088548364400416034343698203725238743639779, + 184751673972697, + 21888242871839275222246405745257275088548364400416034343698204152629959962424, + 93721935245926, + 21888242871839275222246405745257275088548364400416034343698204092501726754793, + 21888242871839275222246405745257275088548364400416034343698204164936690642468, + 115963480686888, + 21888242871839275222246405745257275088548364400416034343698204079812556160778, + 391678993707538, + 21888242871839275222246405745257275088548364400416034343698203977205900477762, + 21888242871839275222246405745257275088548364400416034343698203831052729729485, + 252830526436767, + 21888242871839275222246405745257275088548364400416034343698203910929470845999, + 43591276187101, + 21888242871839275222246405745257275088548364400416034343698203950414341002545, + 201629703790579, + 547925999697829, + 21888242871839275222246405745257275088548364400416034343698203979570706466947, + 21888242871839275222246405745257275088548364400416034343698203782634982283072, + 21888242871839275222246405745257275088548364400416034343698203674317584041228, + 34683506289691, + 305843807663487, + 276004146887381, + 21888242871839275222246405745257275088548364400416034343698203651014110257305, + 142897197634947, + 21888242871839275222246405745257275088548364400416034343698203945774362487433, + 21888242871839275222246405745257275088548364400416034343698203638732754169242, + 282772554076310, + 21888242871839275222246405745257275088548364400416034343698204140430375176034, + 255255457749257, + 21888242871839275222246405745257275088548364400416034343698204046139668423820, + 180773602357699, + 21888242871839275222246405745257275088548364400416034343698203762514592755265, + 21888242871839275222246405745257275088548364400416034343698203673743105404463, + 408022157323703, + 324545463572922, + 21888242871839275222246405745257275088548364400416034343698203900314873166990, + 21888242871839275222246405745257275088548364400416034343698203952818012000298, + 21888242871839275222246405745257275088548364400416034343698204011801950485639, + 551428000279777, + 21888242871839275222246405745257275088548364400416034343698203691612458934805, + 21888242871839275222246405745257275088548364400416034343698203975441422986247, + 142533039798128, + 189570857569855, + 21888242871839275222246405745257275088548364400416034343698203716225896627963, + 167898727301755, + 517600676670711, + 139640670420265, + 21888242871839275222246405745257275088548364400416034343698204054421625119576, + 21888242871839275222246405745257275088548364400416034343698204017091511214957, + 21888242871839275222246405745257275088548364400416034343698204060221763342255, + 310494809312303, + 21888242871839275222246405745257275088548364400416034343698204075924487547098, + 21888242871839275222246405745257275088548364400416034343698203986323381901351, + 21888242871839275222246405745257275088548364400416034343698203986938196127840, + 21888242871839275222246405745257275088548364400416034343698203890367666249852, + 241496798605184, + 5591320522478, + 21888242871839275222246405745257275088548364400416034343698204100880944469691, + 195392697909851, + 176495988925729, + 21888242871839275222246405745257275088548364400416034343698203914719712343443, + 362235251164655, + 392357774594217, + 21888242871839275222246405745257275088548364400416034343698203688569848713536, + 268342656491219, + 131493712280621, + 168830849130013, + 310697722370875, + 536062368960347, + 296206945090695, + 21888242871839275222246405745257275088548364400416034343698204094440880753604, + 552282392042115, + 21888242871839275222246405745257275088548364400416034343698204106061822136671, + 240482705552365, + 21888242871839275222246405745257275088548364400416034343698204153580783141757, + 21888242871839275222246405745257275088548364400416034343698203821871824547252, + 21888242871839275222246405745257275088548364400416034343698203962137834640682, + 95192965810896, + 21888242871839275222246405745257275088548364400416034343698203783325321149929, + 21888242871839275222246405745257275088548364400416034343698204026673662527872, + 206858824550531, + 306999733140053, + 21888242871839275222246405745257275088548364400416034343698203997265803818284, + 11429578808443, + 281345881647825, + 274636661400589, + 327800165895685, + 370357287629066, + 124632006128050, + 293159166267436, + 21888242871839275222246405745257275088548364400416034343698203916591446286838, + 313055193721667, + 21888242871839275222246405745257275088548364400416034343698203835443220495514, + 21888242871839275222246405745257275088548364400416034343698203874820296430363, + 343148036024639, + 21888242871839275222246405745257275088548364400416034343698203732043869638626, + 27921351899704, + 241738589250422, + 21888242871839275222246405745257275088548364400416034343698203634167760850150, + 492480456768437, + 21888242871839275222246405745257275088548364400416034343698203798139184950590, + 453794771737150, + 529833283107588, + 21888242871839275222246405745257275088548364400416034343698204090580584125608, + 67460075049033, + 247195799838063, + 209495477101900, + 21888242871839275222246405745257275088548364400416034343698203718177728393288, + 21888242871839275222246405745257275088548364400416034343698203887964752325920, + 524423039195458, + 498211767439906, + 21888242871839275222246405745257275088548364400416034343698203664484369636785, + 21888242871839275222246405745257275088548364400416034343698203890616048391519, + 482939077755135, + 21888242871839275222246405745257275088548364400416034343698203763409620241863, + 218493816314479, + 21888242871839275222246405745257275088548364400416034343698203648914667262740, + 21888242871839275222246405745257275088548364400416034343698204010463442358151, + 337054816752939, + 261005735620317, + 21888242871839275222246405745257275088548364400416034343698203649905464084083, + 427560600844907, + 134029798836760, + 551395142281931, + 21888242871839275222246405745257275088548364400416034343698204007606732113123, + 353569427157414, + 100210034642536, + 483094971845869, + 21888242871839275222246405745257275088548364400416034343698204160138432164488, + 21888242871839275222246405745257275088548364400416034343698203913716449305087, + 21888242871839275222246405745257275088548364400416034343698203857566671372088, + 450538270976779, + 445818413896150, + 21888242871839275222246405745257275088548364400416034343698203882522676332175, + 427466703499529, + 21888242871839275222246405745257275088548364400416034343698204144416805140987, + 21888242871839275222246405745257275088548364400416034343698203725978124195041, + 21888242871839275222246405745257275088548364400416034343698204104382863599595, + 284257747261468, + 21888242871839275222246405745257275088548364400416034343698203916588994158406, + 497715173499433, + 90915642988641, + 21888242871839275222246405745257275088548364400416034343698203738303723247176, + 300342692436823, + 489791413791501, + 442823097263327, + 21888242871839275222246405745257275088548364400416034343698203811947640193500, + 21888242871839275222246405745257275088548364400416034343698204103723268189056, + 366456246189494, + 118131315158423, + 24447753809337, + 157155042593612, + 21888242871839275222246405745257275088548364400416034343698203945055698836316, + 420762539574203, + 550118521112862, + 21888242871839275222246405745257275088548364400416034343698204054822266688896, + 21888242871839275222246405745257275088548364400416034343698203840575505574539, + 21888242871839275222246405745257275088548364400416034343698203889067207986133, + 481204314475465, + 539663369028615, + 527240358994964, + 57485504651776, + 21888242871839275222246405745257275088548364400416034343698203658587860029487, + 21888242871839275222246405745257275088548364400416034343698204139633754243709, + 267179103670952, + 21888242871839275222246405745257275088548364400416034343698204029690972828010, + 21888242871839275222246405745257275088548364400416034343698203883726662020019, + 21888242871839275222246405745257275088548364400416034343698203657011796818803, + 21888242871839275222246405745257275088548364400416034343698203966781951476229, + 21888242871839275222246405745257275088548364400416034343698203861767159726188, + 21888242871839275222246405745257275088548364400416034343698203829746195710917, + 21888242871839275222246405745257275088548364400416034343698203690065600443373, + 18628535295792, + 366476396195374, + 172665482003512, + 484974628131209, + 21888242871839275222246405745257275088548364400416034343698204064184760190773, + 226795373730696, + 80695549468382, + 21888242871839275222246405745257275088548364400416034343698204011137689287075, + 21888242871839275222246405745257275088548364400416034343698204052639108738015, + 243926238598433, + 21888242871839275222246405745257275088548364400416034343698203822919882971630, + 342348899908111, + 166021249720488, + 21888242871839275222246405745257275088548364400416034343698204019962853391155, + 21888242871839275222246405745257275088548364400416034343698203879184012274094, + 223288265622195, + 481387814957823, + 21888242871839275222246405745257275088548364400416034343698203723487108453152, + 21888242871839275222246405745257275088548364400416034343698203695898338118486, + 345583422917937, + 21888242871839275222246405745257275088548364400416034343698203849025121576101, + 21888242871839275222246405745257275088548364400416034343698203997051040245415, + 264103571377385, + 21888242871839275222246405745257275088548364400416034343698204079801959960688, + 387761827918498, + 21888242871839275222246405745257275088548364400416034343698203795792540379074, + 21888242871839275222246405745257275088548364400416034343698204120022637735025, + 21888242871839275222246405745257275088548364400416034343698203964763131306243, + 562831332889307, + 21888242871839275222246405745257275088548364400416034343698204051053705919390, + 107578108946039, + 148975904464100, + 21888242871839275222246405745257275088548364400416034343698204057757247252846, + 21888242871839275222246405745257275088548364400416034343698204118805856951499, + 308343044256602, + 206367419989849, + 84316795283760, + 399584608514197, + 21888242871839275222246405745257275088548364400416034343698203705267026833352, + 144022151166907, + 21888242871839275222246405745257275088548364400416034343698204156961175742898, + 364159584814589, + 174371374454508, + 21888242871839275222246405745257275088548364400416034343698203675179052742734, + 237413723329083, + 21888242871839275222246405745257275088548364400416034343698203946389451539679, + 21888242871839275222246405745257275088548364400416034343698203975542348848774, + 21888242871839275222246405745257275088548364400416034343698204016705481468613, + 185424878270779, + 223212194988664, + 161679400075851, + 21888242871839275222246405745257275088548364400416034343698204025196786154885, + 167393465569214, + 21888242871839275222246405745257275088548364400416034343698204006033498337415, + 21888242871839275222246405745257275088548364400416034343698204124697669298567, + 134637743409730, + 21888242871839275222246405745257275088548364400416034343698203697429437483605, + 269322227904448, + 101427639515722, + 21888242871839275222246405745257275088548364400416034343698203853029811132824, + 495636054035335, + 379298362239832, + 21888242871839275222246405745257275088548364400416034343698204017917252044689, + 176943185405930, + 21888242871839275222246405745257275088548364400416034343698203892495897750014, + 501030139885605, + 21888242871839275222246405745257275088548364400416034343698203825264845440585, + 21888242871839275222246405745257275088548364400416034343698203977669263751560, + 21888242871839275222246405745257275088548364400416034343698204052874193402980, + 223772188362998, + 462222053029419, + 272758251158812, + 21888242871839275222246405745257275088548364400416034343698203763947653026150, + 105134372069536, + 489031734947231, + 21888242871839275222246405745257275088548364400416034343698203713139292349922, + 145441851158591, + 21888242871839275222246405745257275088548364400416034343698203813736104326333, + 40219484294943, + 435281997226798, + 21888242871839275222246405745257275088548364400416034343698203821578666523675, + 408959978306847, + 306018925094353, + 4708602590725, + 98935319188618, + 21888242871839275222246405745257275088548364400416034343698203793318215212581, + 21888242871839275222246405745257275088548364400416034343698203973789323817016, + 21888242871839275222246405745257275088548364400416034343698204040650083107103, + 21888242871839275222246405745257275088548364400416034343698203733865807236477, + 21888242871839275222246405745257275088548364400416034343698204056847885961521, + 21888242871839275222246405745257275088548364400416034343698203929013232188665, + 21888242871839275222246405745257275088548364400416034343698203724560859193227, + 21888242871839275222246405745257275088548364400416034343698203639749669275134, + 21888242871839275222246405745257275088548364400416034343698203824358389295777, + 21888242871839275222246405745257275088548364400416034343698203649875856942225, + 21888242871839275222246405745257275088548364400416034343698204180264097454479, + 516645337551031, + 21888242871839275222246405745257275088548364400416034343698203987768165296090, + 21888242871839275222246405745257275088548364400416034343698204074001072575984, + 277399809345848, + 244907845876235, + 427093288431030, + 78552795973, + 404681043986294, + 19193277157477, + 408950801810402, + 411547550087216, + 21888242871839275222246405745257275088548364400416034343698203983720000080581, + 21888242871839275222246405745257275088548364400416034343698203976943595081659, + 21888242871839275222246405745257275088548364400416034343698203875368922925716, + 560027656051995, + 21888242871839275222246405745257275088548364400416034343698204094444447821683, + 21888242871839275222246405745257275088548364400416034343698203999548883273837, + 341701368449602, + 206117875462257, + 461021352605638, + 378278238031157, + 21888242871839275222246405745257275088548364400416034343698203764126425913299, + 21888242871839275222246405745257275088548364400416034343698203904329365290813, + 455378578539503, + 21888242871839275222246405745257275088548364400416034343698203673224475443623, + 21888242871839275222246405745257275088548364400416034343698204094878984197536, + 92238493754163, + 176258749733723, + 511219148144675, + 99683279234473, + 213414583451092, + 21888242871839275222246405745257275088548364400416034343698204046342210622907, + 21888242871839275222246405745257275088548364400416034343698204159957046652364, + 21888242871839275222246405745257275088548364400416034343698204108382626321645, + 21888242871839275222246405745257275088548364400416034343698203889737910604156, + 178224789648955, + 21888242871839275222246405745257275088548364400416034343698203956023738091641, + 560180612606062, + 21888242871839275222246405745257275088548364400416034343698203941738586975956, + 330430656770270, + 21888242871839275222246405745257275088548364400416034343698203992732077997642, + 238576882486079, + 510478608967884, + 217598079245129, + 229450683674105, + 280697202920263, + 50466368081666, + 402234940680451, + 21888242871839275222246405745257275088548364400416034343698203899850177744298, + 21888242871839275222246405745257275088548364400416034343698203983085385271996, + 21888242871839275222246405745257275088548364400416034343698204024872774426684, + 4471149623313, + 91123368594009, + 21888242871839275222246405745257275088548364400416034343698204066622034420121, + 395920810760552, + 466464129987923, + 288877532213038, + 220638743660227, + 21888242871839275222246405745257275088548364400416034343698203706001363687492, + 29646217595253, + 63900434491595, + 221116076795578, + 21888242871839275222246405745257275088548364400416034343698203798293282912615, + 21888242871839275222246405745257275088548364400416034343698203883268415310419, + 21888242871839275222246405745257275088548364400416034343698204124370641095952, + 21888242871839275222246405745257275088548364400416034343698203846222379649048, + 272888659332879, + 185278536500447, + 40305574023933, + 149392553757788, + 186037623131304, + 367155397636839, + 21888242871839275222246405745257275088548364400416034343698203942672135911298, + 282355997877044, + 21888242871839275222246405745257275088548364400416034343698203881635801339402, + 518753309424277, + 21888242871839275222246405745257275088548364400416034343698204006061659111787, + 21888242871839275222246405745257275088548364400416034343698203686512421302765, + 74685597337944, + 538175939167010, + 374936714346442, + 21888242871839275222246405745257275088548364400416034343698203776903057213002, + 21888242871839275222246405745257275088548364400416034343698203931129376100304, + 21888242871839275222246405745257275088548364400416034343698203935396530343761, + 78839469089458, + 21888242871839275222246405745257275088548364400416034343698204133686996728967, + 21888242871839275222246405745257275088548364400416034343698203627392451457636, + 21888242871839275222246405745257275088548364400416034343698204153360207416390, + 554122128445793, + 408091685012624, + 120456779065027, + 21888242871839275222246405745257275088548364400416034343698203897611118248090, + 307275617927977, + 21888242871839275222246405745257275088548364400416034343698204163701055121761, + 21888242871839275222246405745257275088548364400416034343698203980580620411392, + 449701924321268, + 21888242871839275222246405745257275088548364400416034343698203876745909699141, + 21888242871839275222246405745257275088548364400416034343698204164300937851719, + 211088036365398, + 21888242871839275222246405745257275088548364400416034343698204175525262206424, + 528085925989443, + 213144741588589, + 21888242871839275222246405745257275088548364400416034343698204041294429079098, + 82722756570351, + 43442124907925, + 69047229703330, + 426182214367495, + 170817512672358, + 71524661805575, + 21888242871839275222246405745257275088548364400416034343698203650526197942781, + 21888242871839275222246405745257275088548364400416034343698203861541366305827, + 21888242871839275222246405745257275088548364400416034343698203733425097369070, + 21888242871839275222246405745257275088548364400416034343698203817077121421279, + 269151854059085, + 21888242871839275222246405745257275088548364400416034343698203875948724815631, + 21888242871839275222246405745257275088548364400416034343698204146050153052254, + 21888242871839275222246405745257275088548364400416034343698203713346938987524, + 370445113573720, + 21888242871839275222246405745257275088548364400416034343698203930236414374114, + 383043349572289, + 21888242871839275222246405745257275088548364400416034343698204131639886758903, + 425658523536490, + 21888242871839275222246405745257275088548364400416034343698203687659677761143, + 241308806559630, + 73793767164567, + 352845995294942, + 177203395246442, + 21888242871839275222246405745257275088548364400416034343698203633912855107504, + 21888242871839275222246405745257275088548364400416034343698203741945773378973, + 74149837455820, + 21888242871839275222246405745257275088548364400416034343698204049921447643420, + 406412705753956, + 21888242871839275222246405745257275088548364400416034343698204184199776442667, + 21888242871839275222246405745257275088548364400416034343698204037497390712110, + 535068226386605, + 18614655031425, + 262957095438614, + 330668136393857, + 21888242871839275222246405745257275088548364400416034343698204148328015205193, + 21888242871839275222246405745257275088548364400416034343698203977981768489148, + 21888242871839275222246405745257275088548364400416034343698203962329456602617, + 21888242871839275222246405745257275088548364400416034343698203641969545548595, + 21888242871839275222246405745257275088548364400416034343698203915112655269153, + 153482077127794, + 308181375470880, + 523529144193771, + 362841336315653, + 21888242871839275222246405745257275088548364400416034343698203696055074312653, + 347798105811577, + 84611268706819, + 21888242871839275222246405745257275088548364400416034343698204021115519872795, + 379900060167970, + 21888242871839275222246405745257275088548364400416034343698203703149456645058, + 21888242871839275222246405745257275088548364400416034343698203830350295233258, + 21888242871839275222246405745257275088548364400416034343698203818488661132588, + 520059405023960, + 150352770879046, + 21888242871839275222246405745257275088548364400416034343698203693631687694630, + 21888242871839275222246405745257275088548364400416034343698204065435018207468, + 544757050855558, + 21888242871839275222246405745257275088548364400416034343698203771944156138333, + 339123899824917, + 21888242871839275222246405745257275088548364400416034343698204028300107663168, + 21888242871839275222246405745257275088548364400416034343698203792013099743426, + 76875114807847, + 528262634086809, + 491285020509631, + 176194530799419, + 181135733265855, + 462356802899108, + 313041598762079, + 21888242871839275222246405745257275088548364400416034343698203755519051099089, + 185468220063215, + 21888242871839275222246405745257275088548364400416034343698203652420296470987, + 21888242871839275222246405745257275088548364400416034343698203661215029038446, + 21888242871839275222246405745257275088548364400416034343698204183881938394315, + 21888242871839275222246405745257275088548364400416034343698204067667082377419, + 308211245924017, + 240293226836311, + 21888242871839275222246405745257275088548364400416034343698204085226905376910, + 416382903805274, + 21888242871839275222246405745257275088548364400416034343698204180230565793416, + 433681890303908, + 298246555788698, + 21888242871839275222246405745257275088548364400416034343698203833335792201503, + 4890946476330, + 21888242871839275222246405745257275088548364400416034343698203776560883016501, + 21888242871839275222246405745257275088548364400416034343698204133336674855293, + 21888242871839275222246405745257275088548364400416034343698203728324577329595, + 488679242968641, + 27951449110442, + 21888242871839275222246405745257275088548364400416034343698203970102699178550, + 525485216315020, + 21888242871839275222246405745257275088548364400416034343698203839867846876777, + 28279664350752, + 21888242871839275222246405745257275088548364400416034343698204021864792278646, + 21888242871839275222246405745257275088548364400416034343698204142231059649095, + 171187043116920, + 519650280255841, + 21888242871839275222246405745257275088548364400416034343698204019202055849208, + 183338838574589, + 21888242871839275222246405745257275088548364400416034343698204053582737415176, + 199583634600258, + 21888242871839275222246405745257275088548364400416034343698203982889295873226, + 309167946030935, + 234666577049620, + 21888242871839275222246405745257275088548364400416034343698203718714012123439, + 21888242871839275222246405745257275088548364400416034343698203815571283736846, + 340799648635758, + 434437211780702, + 279873762657908, + 21888242871839275222246405745257275088548364400416034343698203697686542070551, + 21888242871839275222246405745257275088548364400416034343698204014592521835699, + 67096515565444, + 281164016198132, + 21888242871839275222246405745257275088548364400416034343698203893744850764734, + 21888242871839275222246405745257275088548364400416034343698203789988416934880, + 7099081724669, + 406668309349420, + 436229096271492, + 21888242871839275222246405745257275088548364400416034343698203869937739384485, + 437627733674352, + 355357511480495, + 21888242871839275222246405745257275088548364400416034343698203700115582827131, + 21888242871839275222246405745257275088548364400416034343698203688768719596596, + 285347135824561, + 21888242871839275222246405745257275088548364400416034343698203714302593184654, + 286916052535970, + 21888242871839275222246405745257275088548364400416034343698203795485100847439, + 21888242871839275222246405745257275088548364400416034343698203719671797851653, + 21888242871839275222246405745257275088548364400416034343698203648931396429687, + 21888242871839275222246405745257275088548364400416034343698203835523594935352, + 162272248261579, + 540844812632017, + 145525126970411, + 390174723180034, + 346387499247407, + 21888242871839275222246405745257275088548364400416034343698203829470244510983, + 142472196057143, + 86059807544558, + 21888242871839275222246405745257275088548364400416034343698203911768118128424, + 21888242871839275222246405745257275088548364400416034343698203812742697785126, + 21888242871839275222246405745257275088548364400416034343698204064759928209541, + 21888242871839275222246405745257275088548364400416034343698204031737655873585, + 108789359412116, + 32833733484069, + 529982308690435, + 21888242871839275222246405745257275088548364400416034343698203665869954000461, + 462231100760719, + 549369770675897, + 475599263924276, + 21888242871839275222246405745257275088548364400416034343698204173205538150246, + 21888242871839275222246405745257275088548364400416034343698204003772068180451, + 21888242871839275222246405745257275088548364400416034343698204072230474553030, + 21888242871839275222246405745257275088548364400416034343698204136543862481441, + 21888242871839275222246405745257275088548364400416034343698203733050725181525, + 21888242871839275222246405745257275088548364400416034343698204005473843576082, + 21888242871839275222246405745257275088548364400416034343698203789410926038252, + 21888242871839275222246405745257275088548364400416034343698203717743322592567, + 21888242871839275222246405745257275088548364400416034343698204061695004290185, + 21888242871839275222246405745257275088548364400416034343698204031596407111942, + 41555205161723, + 11432369772087, + 21888242871839275222246405745257275088548364400416034343698204175006381701988, + 219455094006678, + 21888242871839275222246405745257275088548364400416034343698203748172475055408, + 21888242871839275222246405745257275088548364400416034343698203902535967622459, + 21888242871839275222246405745257275088548364400416034343698203788617307735076, + 21888242871839275222246405745257275088548364400416034343698203679570931025381, + 26304759831604, + 21888242871839275222246405745257275088548364400416034343698204170815833766262, + 195039290188136, + 261878449548880, + 226673406009488, + 21888242871839275222246405745257275088548364400416034343698203829627287287042, + 35279423685370, + 21888242871839275222246405745257275088548364400416034343698204031511970005793, + 21888242871839275222246405745257275088548364400416034343698203915383141087582, + 21888242871839275222246405745257275088548364400416034343698203870552475502469, + 481151237616195, + 21888242871839275222246405745257275088548364400416034343698203656759563268215, + 60315110906622, + 21888242871839275222246405745257275088548364400416034343698204135114135974111, + 21888242871839275222246405745257275088548364400416034343698203956273538256601, + 21888242871839275222246405745257275088548364400416034343698204093906500187539, + 21888242871839275222246405745257275088548364400416034343698203781257090524600, + 21888242871839275222246405745257275088548364400416034343698203916933337390905, + 518196937100685, + 285084416650088, + 508852079779851, + 445134847147448, + 355510676748459, + 340454039716035, + 21888242871839275222246405745257275088548364400416034343698203688951256433351, + 453379185777296, + 21888242871839275222246405745257275088548364400416034343698203943500585012703, + 21888242871839275222246405745257275088548364400416034343698203732289568486747, + 21888242871839275222246405745257275088548364400416034343698203668908849178478, + 21888242871839275222246405745257275088548364400416034343698203623949685913610, + 259727352365279, + 328273704255528, + 21888242871839275222246405745257275088548364400416034343698203711083265146234, + 21888242871839275222246405745257275088548364400416034343698203908729324506783, + 21888242871839275222246405745257275088548364400416034343698203828181155370196, + 71109506396903, + 21888242871839275222246405745257275088548364400416034343698203674140068246648, + 21888242871839275222246405745257275088548364400416034343698204177570628890942, + 21888242871839275222246405745257275088548364400416034343698203993174414546516, + 21888242871839275222246405745257275088548364400416034343698203963723996316892, + 21888242871839275222246405745257275088548364400416034343698203784865109418615, + 21888242871839275222246405745257275088548364400416034343698203755197414532808, + 21888242871839275222246405745257275088548364400416034343698203763353680506250, + 21888242871839275222246405745257275088548364400416034343698203778241386037557, + 21888242871839275222246405745257275088548364400416034343698203679524552261847, + 520006402299291, + 499808246612370, + 366598227843731, + 21888242871839275222246405745257275088548364400416034343698203798944391932542, + 221414165015225, + 251142428176164, + 21888242871839275222246405745257275088548364400416034343698204003201642281507, + 21888242871839275222246405745257275088548364400416034343698203735876239710470, + 21888242871839275222246405745257275088548364400416034343698203899562567839090, + 21888242871839275222246405745257275088548364400416034343698203798347774849009, + 21888242871839275222246405745257275088548364400416034343698203935718974323282, + 21888242871839275222246405745257275088548364400416034343698203648820786148026, + 21888242871839275222246405745257275088548364400416034343698204138005432023602, + 21888242871839275222246405745257275088548364400416034343698203805689946222161, + 21888242871839275222246405745257275088548364400416034343698203720094333321992, + 21888242871839275222246405745257275088548364400416034343698203774152902652644, + 21888242871839275222246405745257275088548364400416034343698204113538674426981, + 21888242871839275222246405745257275088548364400416034343698203695342325126542, + 204708904518388, + 21888242871839275222246405745257275088548364400416034343698204084566095532523, + 21888242871839275222246405745257275088548364400416034343698203685135189428965, + 336881092428492, + 21888242871839275222246405745257275088548364400416034343698203847526307263369, + 428987677549799, + 307423841737474, + 341830212481520, + 149596494541799, + 21888242871839275222246405745257275088548364400416034343698203770479925877825, + 335839649671152, + 365183201412116, + 548377711757721, + 21888242871839275222246405745257275088548364400416034343698203743315345054103, + 21888242871839275222246405745257275088548364400416034343698203846106526794405, + 21888242871839275222246405745257275088548364400416034343698204016744723371121, + 21888242871839275222246405745257275088548364400416034343698204052442004031771, + 203479711774513, + 131641937750357, + 21888242871839275222246405745257275088548364400416034343698203931078701887840, + 21888242871839275222246405745257275088548364400416034343698203804753824532995, + 367097869872731, + 21888242871839275222246405745257275088548364400416034343698203701451404553916, + 21888242871839275222246405745257275088548364400416034343698203722523681851358, + 229711396515149, + 21888242871839275222246405745257275088548364400416034343698203781364126863890, + 21888242871839275222246405745257275088548364400416034343698204040049275688566, + 399068942810623, + 21888242871839275222246405745257275088548364400416034343698203730876256563997, + 307143361029646, + 6518324268264, + 21888242871839275222246405745257275088548364400416034343698203973932420426670, + 185093631408558, + 21888242871839275222246405745257275088548364400416034343698204173808080112911, + 517197201310278, + 21888242871839275222246405745257275088548364400416034343698204070556361074384, + 21888242871839275222246405745257275088548364400416034343698203860539045627599, + 235677115051342, + 213756687499758, + 91758568612140, + 265014479854097, + 558358195485975, + 21888242871839275222246405745257275088548364400416034343698204125255461882154, + 21888242871839275222246405745257275088548364400416034343698203709851343906655, + 207787355956395, + 21888242871839275222246405745257275088548364400416034343698204136707426796764, + 21888242871839275222246405745257275088548364400416034343698204087334097858729, + 21888242871839275222246405745257275088548364400416034343698203813577278939532, + 21888242871839275222246405745257275088548364400416034343698203892271703974659, + 273318998378314, + 271959013953742, + 21888242871839275222246405745257275088548364400416034343698203713576132996465, + 513047073530507, + 319720998287595, + 21888242871839275222246405745257275088548364400416034343698203698798758944655, + 260861650554064, + 21888242871839275222246405745257275088548364400416034343698203627292745347881, + 21888242871839275222246405745257275088548364400416034343698203731574623978541, + 21888242871839275222246405745257275088548364400416034343698203762795576301394, + 172330692850146, + 21888242871839275222246405745257275088548364400416034343698204004999822614955, + 21888242871839275222246405745257275088548364400416034343698203702528318164647, + 21888242871839275222246405745257275088548364400416034343698203956639415833185, + 219265814024832, + 21888242871839275222246405745257275088548364400416034343698203796606115555340, + 21888242871839275222246405745257275088548364400416034343698203936694193987590, + 21888242871839275222246405745257275088548364400416034343698203759579240250887, + 409170268292531, + 21888242871839275222246405745257275088548364400416034343698203925470650793449, + 21888242871839275222246405745257275088548364400416034343698203881185513497251, + 21888242871839275222246405745257275088548364400416034343698203964681182058949, + 187178408818622, + 21888242871839275222246405745257275088548364400416034343698203918777838920543, + 21888242871839275222246405745257275088548364400416034343698203885517234881907, + 21888242871839275222246405745257275088548364400416034343698204052576841847127, + 21888242871839275222246405745257275088548364400416034343698203865285948106526, + 21888242871839275222246405745257275088548364400416034343698204083247259203320, + 21888242871839275222246405745257275088548364400416034343698203834190195478294, + 21888242871839275222246405745257275088548364400416034343698203949167631130597, + 438337993689688, + 21888242871839275222246405745257275088548364400416034343698203844661230423458, + 21888242871839275222246405745257275088548364400416034343698204031341334850522, + 21888242871839275222246405745257275088548364400416034343698204168268089183584, + 21888242871839275222246405745257275088548364400416034343698204081933599713996, + 21888242871839275222246405745257275088548364400416034343698203814866540129965, + 76457102381220, + 537978828411896, + 267828770239512, + 21888242871839275222246405745257275088548364400416034343698203812782629177466, + 21888242871839275222246405745257275088548364400416034343698204083752730434300, + 21888242871839275222246405745257275088548364400416034343698204137861521386351, + 549266078197520, + 21888242871839275222246405745257275088548364400416034343698203673582844084220, + 21888242871839275222246405745257275088548364400416034343698203704768070672526, + 504180215632758, + 53712648739581, + 21888242871839275222246405745257275088548364400416034343698203684787261977006, + 298897025831470, + 531954094705693, + 21888242871839275222246405745257275088548364400416034343698203678185554323266, + 110629671791443, + 21888242871839275222246405745257275088548364400416034343698204031184245823986, + 21888242871839275222246405745257275088548364400416034343698204109576364109372, + 230633832152289, + 439511910796470, + 398735900202200, + 215910847640857, + 21888242871839275222246405745257275088548364400416034343698203645176398615928, + 385518936175678, + 21888242871839275222246405745257275088548364400416034343698203795090240135129, + 147827086743927, + 21888242871839275222246405745257275088548364400416034343698203983083799474964, + 21888242871839275222246405745257275088548364400416034343698204002623404000672, + 94377626739762, + 139953199105833, + 152534407737020, + 204699420540067, + 21888242871839275222246405745257275088548364400416034343698204131731714884048, + 21888242871839275222246405745257275088548364400416034343698204170801917171744, + 21888242871839275222246405745257275088548364400416034343698204063751646370459, + 21888242871839275222246405745257275088548364400416034343698203779759489933801, + 21888242871839275222246405745257275088548364400416034343698204065210388641217, + 21888242871839275222246405745257275088548364400416034343698203973810560879087, + 326060713017837, + 21888242871839275222246405745257275088548364400416034343698203959690315079109, + 505767191559037, + 21888242871839275222246405745257275088548364400416034343698203852551512620462, + 21888242871839275222246405745257275088548364400416034343698203629155675224854, + 21888242871839275222246405745257275088548364400416034343698204181417650483009, + 456564295161578, + 21888242871839275222246405745257275088548364400416034343698203962715607714494, + 19078766165793, + 72571496825827, + 133997095697091, + 21888242871839275222246405745257275088548364400416034343698203694415761487044, + 313400273460962, + 453394573216157, + 362377894509736, + 232645860902065, + 41266007108932, + 170476341385843, + 21888242871839275222246405745257275088548364400416034343698203823391961058261, + 207329822261055, + 479793860765725, + 248188227226215, + 381108461328965, + 362658745180311, + 155798494276110, + 21888242871839275222246405745257275088548364400416034343698203893104180280257, + 542632846106394, + 398425375520160, + 111269568267295, + 21888242871839275222246405745257275088548364400416034343698203647335164414325, + 198259869947102, + 21888242871839275222246405745257275088548364400416034343698203629806099382406, + 4295470223110, + 21888242871839275222246405745257275088548364400416034343698204142323537463837, + 21888242871839275222246405745257275088548364400416034343698204044114082390662, + 108321167618304, + 21888242871839275222246405745257275088548364400416034343698203885664800247628, + 21888242871839275222246405745257275088548364400416034343698203663854410572404, + 21888242871839275222246405745257275088548364400416034343698203960678294299389, + 21888242871839275222246405745257275088548364400416034343698204043015441011732, + 21888242871839275222246405745257275088548364400416034343698203693016411663446, + 502527033088049, + 543760079237246, + 21888242871839275222246405745257275088548364400416034343698203624264667581700, + 290393268117959, + 21888242871839275222246405745257275088548364400416034343698203775501288906180, + 196946747895368, + 21888242871839275222246405745257275088548364400416034343698203639331048385299, + 533051062832157, + 21888242871839275222246405745257275088548364400416034343698203715934352937742, + 470364596631195, + 69262715506979, + 208089797610462, + 21888242871839275222246405745257275088548364400416034343698203898483317854459, + 106989731059042, + 337832439223834, + 21888242871839275222246405745257275088548364400416034343698203653598457034892, + 442420370660526, + 204990464331519, + 21888242871839275222246405745257275088548364400416034343698203956878091524965, + 21888242871839275222246405745257275088548364400416034343698204171130720903357, + 218112576962812, + 551735380501383, + 517935441783184, + 21888242871839275222246405745257275088548364400416034343698203709359202767796, + 21888242871839275222246405745257275088548364400416034343698203983645277589707, + 21888242871839275222246405745257275088548364400416034343698203787393740977589, + 21888242871839275222246405745257275088548364400416034343698204183109408428165, + 21888242871839275222246405745257275088548364400416034343698203642317496700945, + 388096975367080, + 21888242871839275222246405745257275088548364400416034343698204115322955908931, + 21888242871839275222246405745257275088548364400416034343698203726111419667653, + 21888242871839275222246405745257275088548364400416034343698203972914177253513, + 21888242871839275222246405745257275088548364400416034343698203652851244021540, + 21888242871839275222246405745257275088548364400416034343698203995085822030203, + 141661847652568, + 237865057957752, + 310692308146643, + 379900353377843, + 403705353010059, + 21888242871839275222246405745257275088548364400416034343698203898261812914508, + 21888242871839275222246405745257275088548364400416034343698204020729508769319, + 21888242871839275222246405745257275088548364400416034343698203863241866256827, + 326780650610830, + 440946210723310, + 21888242871839275222246405745257275088548364400416034343698204139923387487692, + 408569520496075, + 21888242871839275222246405745257275088548364400416034343698203731316318309708, + 21888242871839275222246405745257275088548364400416034343698203901785424941811, + 21888242871839275222246405745257275088548364400416034343698203668096109173260, + 422445137760695, + 77287764487326, + 21888242871839275222246405745257275088548364400416034343698203680412803520520, + 291584579657654, + 119864258159772, + 464374688894863, + 341721370208149, + 21888242871839275222246405745257275088548364400416034343698203931076565520074, + 43351147487701, + 21888242871839275222246405745257275088548364400416034343698203805652711162010, + 517538649708460, + 21888242871839275222246405745257275088548364400416034343698204137029493960871, + 21888242871839275222246405745257275088548364400416034343698203666234396747580, + 21888242871839275222246405745257275088548364400416034343698204004393985442004, + 86794979309200, + 239486785241448, + 410621330011598, + 21888242871839275222246405745257275088548364400416034343698203714475969429404, + 480370949979939, + 354891559226434, + 354058809552516, + 21888242871839275222246405745257275088548364400416034343698203991542811535576, + 339048742019323, + 21888242871839275222246405745257275088548364400416034343698203816878290180014, + 120652724110233, + 21888242871839275222246405745257275088548364400416034343698203843549136756045, + 238421284011111, + 106404568239381, + 21888242871839275222246405745257275088548364400416034343698203710410165359738, + 121729912842475, + 190012780664034, + 457548404973509, + 21888242871839275222246405745257275088548364400416034343698203867319971587039, + 21888242871839275222246405745257275088548364400416034343698203965891878878254, + 445437587732081, + 21888242871839275222246405745257275088548364400416034343698203966128905813763, + 21888242871839275222246405745257275088548364400416034343698203774333846268552, + 20553887652717, + 21888242871839275222246405745257275088548364400416034343698204180025920159418, + 21888242871839275222246405745257275088548364400416034343698203677145654776133, + 554344406113883, + 305792799034797, + 21888242871839275222246405745257275088548364400416034343698203727687941165128, + 21888242871839275222246405745257275088548364400416034343698204106826505873383, + 62527744470759, + 69922499711193, + 272352576184481, + 505006134619926, + 15119440393785, + 174807601306676, + 541721582336404, + 21888242871839275222246405745257275088548364400416034343698204064369793947943, + 21888242871839275222246405745257275088548364400416034343698203984172898012118, + 21888242871839275222246405745257275088548364400416034343698204077817797822975, + 21888242871839275222246405745257275088548364400416034343698203832639630606707, + 21888242871839275222246405745257275088548364400416034343698203975740152065164, + 21888242871839275222246405745257275088548364400416034343698203771079403223924, + 21888242871839275222246405745257275088548364400416034343698204185411049514874, + 273883038951360, + 138445859949860, + 21122697897318, + 21888242871839275222246405745257275088548364400416034343698203846010915985640, + 387064123515532, + 168124007108569, + 21888242871839275222246405745257275088548364400416034343698204121612205195604, + 21888242871839275222246405745257275088548364400416034343698203846664379126905, + 487938986887846, + 21888242871839275222246405745257275088548364400416034343698203863931790957184, + 21888242871839275222246405745257275088548364400416034343698204137697123880317, + 21888242871839275222246405745257275088548364400416034343698203890847954508193, + 235104383907668, + 21888242871839275222246405745257275088548364400416034343698203890355939506740, + 529079008736377, + 21888242871839275222246405745257275088548364400416034343698203680844975401126, + 400096713058563, + 21888242871839275222246405745257275088548364400416034343698204110322170545612, + 549559983346515, + 38263128936258, + 531756169503657, + 21888242871839275222246405745257275088548364400416034343698204004999476335936, + 21888242871839275222246405745257275088548364400416034343698203954948710737526, + 21888242871839275222246405745257275088548364400416034343698203680872406677751, + 185857682300568, + 177793737218097, + 21888242871839275222246405745257275088548364400416034343698203973657894605362, + 21888242871839275222246405745257275088548364400416034343698203849511119716599, + 75084560072785, + 433828232201244, + 309504372739213, + 122604613431964, + 21888242871839275222246405745257275088548364400416034343698204083358973022006, + 513694519964251, + 21888242871839275222246405745257275088548364400416034343698203867467836521950, + 21888242871839275222246405745257275088548364400416034343698203857313840229242, + 507610794093696, + 21888242871839275222246405745257275088548364400416034343698204151262672260336, + 10214532297671, + 21888242871839275222246405745257275088548364400416034343698203796510295614529, + 21888242871839275222246405745257275088548364400416034343698203687814598839908, + 104823552307632, + 373563207821992, + 270895710380251, + 157415538379716, + 326154210056862, + 21888242871839275222246405745257275088548364400416034343698203630023043421785, + 346943900921513, + 296687671858768, + 21888242871839275222246405745257275088548364400416034343698203871161877331254, + 21888242871839275222246405745257275088548364400416034343698203906313143389953, + 73285052141370, + 102535353940659, + 21888242871839275222246405745257275088548364400416034343698203908693002745663, + 21888242871839275222246405745257275088548364400416034343698203655216637031546, + 21888242871839275222246405745257275088548364400416034343698203900631525212900, + 59348552054939, + 485277192271600, + 525330917110289, + 21888242871839275222246405745257275088548364400416034343698204141157309079968, + 21888242871839275222246405745257275088548364400416034343698203720997093684831, + 167711500791670, + 480450997477141, + 451156940595953, + 21888242871839275222246405745257275088548364400416034343698203858441612715543, + 21888242871839275222246405745257275088548364400416034343698203834459362293875, + 98305958346155, + 21888242871839275222246405745257275088548364400416034343698204035544786363850, + 22202780604260, + 519249335885264, + 21888242871839275222246405745257275088548364400416034343698204038207568403653, + 21888242871839275222246405745257275088548364400416034343698203629363495730866, + 21888242871839275222246405745257275088548364400416034343698203715473229790329, + 11284526307378, + 21888242871839275222246405745257275088548364400416034343698203800085732759955, + 21888242871839275222246405745257275088548364400416034343698203744326466730777, + 21888242871839275222246405745257275088548364400416034343698203864946797113750, + 21888242871839275222246405745257275088548364400416034343698204155231579471005, + 145622378631776, + 21888242871839275222246405745257275088548364400416034343698203761650547214350, + 21888242871839275222246405745257275088548364400416034343698203724017096767257, + 21888242871839275222246405745257275088548364400416034343698203794890289579922, + 21888242871839275222246405745257275088548364400416034343698203738882486458132, + 21888242871839275222246405745257275088548364400416034343698203992011224032794, + 125067033862691, + 282181482137139, + 169742285205191, + 21888242871839275222246405745257275088548364400416034343698203808682541128254, + 21888242871839275222246405745257275088548364400416034343698203900219760430356, + 21888242871839275222246405745257275088548364400416034343698203887427942087590, + 183807735810707, + 220524181204303, + 21888242871839275222246405745257275088548364400416034343698203792572197772768, + 320969498138798, + 21888242871839275222246405745257275088548364400416034343698204093035444582854, + 409153416396811, + 21888242871839275222246405745257275088548364400416034343698204065232744978265, + 51086253941133, + 21888242871839275222246405745257275088548364400416034343698203862705892921580, + 62995845763001, + 497117655436739, + 553812391688627, + 531469628391093, + 21888242871839275222246405745257275088548364400416034343698204055699874126152, + 435668187910793, + 408136520787240, + 21888242871839275222246405745257275088548364400416034343698203818991435544426, + 462187048519539, + 91410229430851, + 153557362689222, + 220433023540014, + 441667613135876, + 211108233620911, + 534265117594366, + 21888242871839275222246405745257275088548364400416034343698203689995161043341, + 21888242871839275222246405745257275088548364400416034343698203816213681147951, + 129055395133692, + 21888242871839275222246405745257275088548364400416034343698204013211359351919, + 445415741948620, + 21888242871839275222246405745257275088548364400416034343698204012640912673262, + 555823036557752, + 259243326471555, + 399751100697704, + 21888242871839275222246405745257275088548364400416034343698203861844888631512, + 21888242871839275222246405745257275088548364400416034343698203979325602108683, + 39200109669658, + 21888242871839275222246405745257275088548364400416034343698203952754688354964, + 21888242871839275222246405745257275088548364400416034343698203649794553368633, + 21888242871839275222246405745257275088548364400416034343698203685680986156357, + 21888242871839275222246405745257275088548364400416034343698204042311609019022, + 21888242871839275222246405745257275088548364400416034343698203935637498989902, + 21888242871839275222246405745257275088548364400416034343698203724222857016367, + 21888242871839275222246405745257275088548364400416034343698204147835787154601, + 21888242871839275222246405745257275088548364400416034343698203783252518699796, + 344742560693239, + 21888242871839275222246405745257275088548364400416034343698204092119449426796, + 218196043351002, + 21888242871839275222246405745257275088548364400416034343698203984748262390292, + 511806543765384, + 96653543322723, + 21888242871839275222246405745257275088548364400416034343698203651140357565151, + 21888242871839275222246405745257275088548364400416034343698204061288538341359, + 142146114752547, + 466445390820679, + 21888242871839275222246405745257275088548364400416034343698203897046169768000, + 21888242871839275222246405745257275088548364400416034343698204004575865768950, + 242897774463511, + 21888242871839275222246405745257275088548364400416034343698203788083825423783, + 148206362014419, + 21888242871839275222246405745257275088548364400416034343698204065230903009863, + 21888242871839275222246405745257275088548364400416034343698203793896554686942, + 64820409281240, + 434591961689851, + 21888242871839275222246405745257275088548364400416034343698203771786119685693, + 152532294060658, + 139585245841494, + 21888242871839275222246405745257275088548364400416034343698203848035801466332, + 53302011633241, + 21888242871839275222246405745257275088548364400416034343698203631598912091248, + 21888242871839275222246405745257275088548364400416034343698203918154423219893, + 21888242871839275222246405745257275088548364400416034343698203958995186783295, + 77811200871019, + 181727193323469, + 511113689781454, + 21888242871839275222246405745257275088548364400416034343698203722054779292347, + 21888242871839275222246405745257275088548364400416034343698204173031795795820, + 376121007824098, + 64507493767572, + 88934033256233, + 21888242871839275222246405745257275088548364400416034343698204161330205659960, + 21888242871839275222246405745257275088548364400416034343698204064049176984853, + 21888242871839275222246405745257275088548364400416034343698204047272629398256, + 21888242871839275222246405745257275088548364400416034343698203671521817356667, + 50115085902501, + 21888242871839275222246405745257275088548364400416034343698203864697628486820, + 21888242871839275222246405745257275088548364400416034343698203820538302587097, + 21888242871839275222246405745257275088548364400416034343698203785197624484258, + 21888242871839275222246405745257275088548364400416034343698203711869955273184, + 228624290833559, + 21888242871839275222246405745257275088548364400416034343698204106848314707874, + 376770535560922, + 21888242871839275222246405745257275088548364400416034343698203779087869875984, + 350561219822681, + 282009299324201, + 21888242871839275222246405745257275088548364400416034343698204015004438620880, + 21888242871839275222246405745257275088548364400416034343698203640677134644000, + 21888242871839275222246405745257275088548364400416034343698204045971015376118, + 316460152310889, + 88702920983159, + 265334415808437, + 21888242871839275222246405745257275088548364400416034343698203922430638441521, + 21888242871839275222246405745257275088548364400416034343698203930202260380211, + 504458485834134, + 514069296897119, + 21888242871839275222246405745257275088548364400416034343698203792056227185125, + 346966995666035, + 21888242871839275222246405745257275088548364400416034343698204185329274598559, + 21888242871839275222246405745257275088548364400416034343698203696866118846982, + 275031035765141, + ]), + Polynomial::new([ + 178696856508202, + 21888242871839275222246405745257275088548364400416034343698203944205561310856, + 21888242871839275222246405745257275088548364400416034343698204081502703837473, + 13160053064394, + 21888242871839275222246405745257275088548364400416034343698203803169884466232, + 493461116995333, + 334341582910919, + 21888242871839275222246405745257275088548364400416034343698204044701847964556, + 245244395892637, + 201417215804492, + 21888242871839275222246405745257275088548364400416034343698203806132999184791, + 322670187446079, + 21888242871839275222246405745257275088548364400416034343698204123537568622135, + 515091336978750, + 291668490732771, + 21888242871839275222246405745257275088548364400416034343698203937068650572788, + 6866225120699, + 21888242871839275222246405745257275088548364400416034343698203861945415795449, + 533150154930130, + 21888242871839275222246405745257275088548364400416034343698203873975488237040, + 21888242871839275222246405745257275088548364400416034343698204020334612885720, + 70123653893604, + 436936668316226, + 173919675859080, + 21888242871839275222246405745257275088548364400416034343698203797082053613595, + 245119214911264, + 21888242871839275222246405745257275088548364400416034343698204128142804104617, + 470724254992373, + 54548351919830, + 21888242871839275222246405745257275088548364400416034343698204005551514543064, + 224555179692874, + 454677407566287, + 21888242871839275222246405745257275088548364400416034343698204088428959105473, + 302088602902381, + 301178584925081, + 21888242871839275222246405745257275088548364400416034343698204185848985843502, + 21888242871839275222246405745257275088548364400416034343698204133234173228698, + 21888242871839275222246405745257275088548364400416034343698203989660950076950, + 21888242871839275222246405745257275088548364400416034343698203841845091780070, + 21888242871839275222246405745257275088548364400416034343698204151589551954423, + 21888242871839275222246405745257275088548364400416034343698204069228385840762, + 354985708750298, + 21888242871839275222246405745257275088548364400416034343698203695863941393210, + 461893798409669, + 21888242871839275222246405745257275088548364400416034343698203800796219150291, + 526038374588307, + 260336999889537, + 21888242871839275222246405745257275088548364400416034343698204178234340814637, + 206195291404005, + 21888242871839275222246405745257275088548364400416034343698204044093844826523, + 21888242871839275222246405745257275088548364400416034343698203983142349644991, + 147392302267270, + 40128128767129, + 21888242871839275222246405745257275088548364400416034343698203823264445573797, + 42903910221231, + 159032682578736, + 21888242871839275222246405745257275088548364400416034343698203681926380575048, + 154598063941256, + 21888242871839275222246405745257275088548364400416034343698203760198664605670, + 21888242871839275222246405745257275088548364400416034343698203726309862026545, + 155810943241223, + 386849746266809, + 272133975782431, + 329558807853556, + 21888242871839275222246405745257275088548364400416034343698203991683542026456, + 206456535862775, + 373524295178506, + 290030880451604, + 21888242871839275222246405745257275088548364400416034343698203904850251698796, + 150259608336906, + 21888242871839275222246405745257275088548364400416034343698203820219011117663, + 231126445609385, + 312121855181477, + 67565258831827, + 21888242871839275222246405745257275088548364400416034343698203773731784135879, + 349951770566703, + 21888242871839275222246405745257275088548364400416034343698203695516950563435, + 21888242871839275222246405745257275088548364400416034343698203993791207358497, + 315769732206294, + 321076494655086, + 388553514485054, + 224173535457547, + 458215017657354, + 462980896819109, + 21888242871839275222246405745257275088548364400416034343698204048601062007169, + 40574169159563, + 402774522602905, + 21888242871839275222246405745257275088548364400416034343698203749302345006397, + 21888242871839275222246405745257275088548364400416034343698204157425618525055, + 21888242871839275222246405745257275088548364400416034343698203962235889512115, + 35576606084425, + 522428306161227, + 21888242871839275222246405745257275088548364400416034343698203971679186471409, + 21888242871839275222246405745257275088548364400416034343698203681703933769830, + 516556286569877, + 258049796065372, + 21888242871839275222246405745257275088548364400416034343698203709005023430675, + 21888242871839275222246405745257275088548364400416034343698203672029950269061, + 472385726695722, + 539004436651034, + 21888242871839275222246405745257275088548364400416034343698203662465212656463, + 232930261524214, + 174550306740964, + 522319334099907, + 21888242871839275222246405745257275088548364400416034343698203758593074464772, + 175994456908335, + 21888242871839275222246405745257275088548364400416034343698204143642999900615, + 21888242871839275222246405745257275088548364400416034343698203887408305306479, + 177227035578258, + 147024697638549, + 412905822688382, + 247977640334380, + 492067801337734, + 203365926811056, + 21888242871839275222246405745257275088548364400416034343698204101631878564098, + 21888242871839275222246405745257275088548364400416034343698203965691111216431, + 21888242871839275222246405745257275088548364400416034343698203890282593764785, + 378690155361848, + 21888242871839275222246405745257275088548364400416034343698203746476247366406, + 21888242871839275222246405745257275088548364400416034343698203898757384013422, + 74097015968034, + 345871173404995, + 21888242871839275222246405745257275088548364400416034343698204010135672714213, + 21888242871839275222246405745257275088548364400416034343698203805405805320023, + 246078121715850, + 21888242871839275222246405745257275088548364400416034343698203987019732167580, + 122071032336750, + 543200953117764, + 21888242871839275222246405745257275088548364400416034343698204022063196316208, + 336292851773606, + 487289193683402, + 21888242871839275222246405745257275088548364400416034343698204153574507149150, + 21888242871839275222246405745257275088548364400416034343698203826475064622008, + 21888242871839275222246405745257275088548364400416034343698204177759612782103, + 21888242871839275222246405745257275088548364400416034343698203944824153777526, + 51968982226445, + 21888242871839275222246405745257275088548364400416034343698204095694119888315, + 21888242871839275222246405745257275088548364400416034343698204171582324573067, + 423405148150077, + 9177881418395, + 243530364557197, + 76055182993796, + 180213219238513, + 202446480188273, + 204512638440219, + 54413535902520, + 207273579877522, + 21888242871839275222246405745257275088548364400416034343698204144264481942272, + 254526503976536, + 21888242871839275222246405745257275088548364400416034343698203895022019328002, + 21888242871839275222246405745257275088548364400416034343698203921697327540787, + 21888242871839275222246405745257275088548364400416034343698203665708660028358, + 159711502125858, + 21888242871839275222246405745257275088548364400416034343698203953171280338578, + 21888242871839275222246405745257275088548364400416034343698204119314586938190, + 21888242871839275222246405745257275088548364400416034343698203927440732878277, + 21888242871839275222246405745257275088548364400416034343698204071283576675013, + 21888242871839275222246405745257275088548364400416034343698203987939736603799, + 152998809929118, + 21888242871839275222246405745257275088548364400416034343698204115501768819743, + 21888242871839275222246405745257275088548364400416034343698203794494576174102, + 520150973263507, + 21888242871839275222246405745257275088548364400416034343698203730700273816270, + 422414182953447, + 463870003036866, + 21888242871839275222246405745257275088548364400416034343698203998521496932041, + 506149465902695, + 21888242871839275222246405745257275088548364400416034343698203983317457479178, + 21888242871839275222246405745257275088548364400416034343698204076414380787089, + 21888242871839275222246405745257275088548364400416034343698203874774717331081, + 135917973410052, + 296328019231306, + 21888242871839275222246405745257275088548364400416034343698204104957291706936, + 21888242871839275222246405745257275088548364400416034343698204182717262865516, + 21888242871839275222246405745257275088548364400416034343698203960276388452210, + 451970830901114, + 286804038240289, + 330718697940212, + 21888242871839275222246405745257275088548364400416034343698204147550292069013, + 145863398607294, + 21888242871839275222246405745257275088548364400416034343698204068464286520524, + 253403685614711, + 21888242871839275222246405745257275088548364400416034343698204091584403651086, + 21888242871839275222246405745257275088548364400416034343698203997972010770523, + 21888242871839275222246405745257275088548364400416034343698204095370790857469, + 21888242871839275222246405745257275088548364400416034343698203972379495193086, + 21888242871839275222246405745257275088548364400416034343698203874055247159187, + 221939108762994, + 54164399237959, + 21888242871839275222246405745257275088548364400416034343698204057661821072529, + 441488855050151, + 21888242871839275222246405745257275088548364400416034343698203735615484711008, + 58513409870575, + 21888242871839275222246405745257275088548364400416034343698204178990008790475, + 21888242871839275222246405745257275088548364400416034343698203788380922011968, + 280569406659306, + 21888242871839275222246405745257275088548364400416034343698204044252220158526, + 492511300435368, + 85322016903120, + 21888242871839275222246405745257275088548364400416034343698203830937601723080, + 21888242871839275222246405745257275088548364400416034343698203969754727561113, + 21888242871839275222246405745257275088548364400416034343698204017331568554094, + 194399796733847, + 390449609817374, + 363274041317867, + 174697782920500, + 519656168504751, + 21888242871839275222246405745257275088548364400416034343698203733767331504004, + 219673682421861, + 21888242871839275222246405745257275088548364400416034343698204079991457561576, + 427954855287320, + 470425250884902, + 21888242871839275222246405745257275088548364400416034343698204185875668363949, + 181508382871769, + 21888242871839275222246405745257275088548364400416034343698203803436912667822, + 21888242871839275222246405745257275088548364400416034343698203670434422732460, + 21888242871839275222246405745257275088548364400416034343698203870993648366147, + 21888242871839275222246405745257275088548364400416034343698204133975024560989, + 373159399158137, + 72838326399338, + 178238957431730, + 21888242871839275222246405745257275088548364400416034343698203796953883689221, + 298387163384964, + 21888242871839275222246405745257275088548364400416034343698204148556218080790, + 21888242871839275222246405745257275088548364400416034343698203944037272908522, + 21888242871839275222246405745257275088548364400416034343698204044800974615218, + 557622507875544, + 237084559123696, + 220215155743657, + 190294967303485, + 21888242871839275222246405745257275088548364400416034343698203976019221073565, + 362742170244582, + 21888242871839275222246405745257275088548364400416034343698203848929634285217, + 218324569902165, + 500765558125330, + 21888242871839275222246405745257275088548364400416034343698203698252275921848, + 21888242871839275222246405745257275088548364400416034343698204062785058819867, + 21888242871839275222246405745257275088548364400416034343698203648133552614091, + 506505501823851, + 21888242871839275222246405745257275088548364400416034343698203705308193258226, + 21888242871839275222246405745257275088548364400416034343698204138926774240313, + 21888242871839275222246405745257275088548364400416034343698203896778981639264, + 21888242871839275222246405745257275088548364400416034343698204000187569364223, + 21888242871839275222246405745257275088548364400416034343698203638141820002979, + 21888242871839275222246405745257275088548364400416034343698204184143198752258, + 261269143310143, + 398625318998865, + 21888242871839275222246405745257275088548364400416034343698203720437825145784, + 21888242871839275222246405745257275088548364400416034343698203855121197909569, + 21888242871839275222246405745257275088548364400416034343698203952375541788456, + 471726198530715, + 21888242871839275222246405745257275088548364400416034343698204086177418127854, + 21888242871839275222246405745257275088548364400416034343698203824892536793517, + 21888242871839275222246405745257275088548364400416034343698203724089067897632, + 98110524776851, + 21888242871839275222246405745257275088548364400416034343698203751713736965466, + 377177849301930, + 33962446877830, + 21888242871839275222246405745257275088548364400416034343698203994984271455706, + 3592181304420, + 21888242871839275222246405745257275088548364400416034343698203878066597915463, + 277066296603873, + 21888242871839275222246405745257275088548364400416034343698203855231284092548, + 502816450877956, + 21888242871839275222246405745257275088548364400416034343698203921152441656941, + 21888242871839275222246405745257275088548364400416034343698203869813213833570, + 21888242871839275222246405745257275088548364400416034343698203848321746674183, + 485222479046279, + 21888242871839275222246405745257275088548364400416034343698204119790106315672, + 21888242871839275222246405745257275088548364400416034343698203954640514720348, + 353507342463784, + 476704549140755, + 21888242871839275222246405745257275088548364400416034343698203855635238400422, + 21888242871839275222246405745257275088548364400416034343698204175024257005306, + 140813481117500, + 21888242871839275222246405745257275088548364400416034343698203816793715200633, + 110982762507744, + 21888242871839275222246405745257275088548364400416034343698203811361530780577, + 247598922169861, + 21888242871839275222246405745257275088548364400416034343698204069537231530457, + 21888242871839275222246405745257275088548364400416034343698203638232383313655, + 134497800152196, + 39688899538226, + 21888242871839275222246405745257275088548364400416034343698203984552059056264, + 21888242871839275222246405745257275088548364400416034343698203643555864635929, + 235542405833274, + 31517504160543, + 21888242871839275222246405745257275088548364400416034343698203900230002363814, + 21888242871839275222246405745257275088548364400416034343698203702536841903346, + 153143154828629, + 392645196504748, + 21888242871839275222246405745257275088548364400416034343698203667653576792122, + 506805384152667, + 192382787208049, + 21888242871839275222246405745257275088548364400416034343698204160605514551801, + 21888242871839275222246405745257275088548364400416034343698203932404981089835, + 375835785570528, + 393357879216027, + 21888242871839275222246405745257275088548364400416034343698203653165091156738, + 21888242871839275222246405745257275088548364400416034343698203661344764732676, + 129556020608648, + 21888242871839275222246405745257275088548364400416034343698203775343831104832, + 163515935623040, + 240477178747831, + 21888242871839275222246405745257275088548364400416034343698203976908049493685, + 377996154984604, + 503178194073946, + 162976105858612, + 446869403512710, + 512232414308105, + 21888242871839275222246405745257275088548364400416034343698203750271329977874, + 21888242871839275222246405745257275088548364400416034343698203908637260804523, + 36902029513404, + 487867617215057, + 21888242871839275222246405745257275088548364400416034343698203893247732139345, + 151452984544464, + 21888242871839275222246405745257275088548364400416034343698203714837110872663, + 271248429864275, + 494923853106298, + 21888242871839275222246405745257275088548364400416034343698203814727112539199, + 209998829802590, + 36554116187392, + 21888242871839275222246405745257275088548364400416034343698203695736704618328, + 203147381854554, + 423320709143616, + 250086433165277, + 518323206117517, + 21888242871839275222246405745257275088548364400416034343698203794604071603789, + 21888242871839275222246405745257275088548364400416034343698203676342227822801, + 79881375667259, + 263939232464360, + 437102745135425, + 21888242871839275222246405745257275088548364400416034343698203798209288661030, + 21888242871839275222246405745257275088548364400416034343698204186262914792282, + 120711894798106, + 177285380900887, + 21888242871839275222246405745257275088548364400416034343698204083222500967443, + 416807788572835, + 21888242871839275222246405745257275088548364400416034343698203950415391083168, + 21888242871839275222246405745257275088548364400416034343698203962852331226740, + 127311434765349, + 62968441358580, + 326169650841815, + 245908178463595, + 21888242871839275222246405745257275088548364400416034343698203948942705221554, + 21888242871839275222246405745257275088548364400416034343698203998744154531524, + 21888242871839275222246405745257275088548364400416034343698204079799516809535, + 93748096601281, + 52202263171459, + 21888242871839275222246405745257275088548364400416034343698203737985927224899, + 21888242871839275222246405745257275088548364400416034343698203644656380898281, + 381679550808325, + 82919635714985, + 197614211438569, + 21888242871839275222246405745257275088548364400416034343698203946928332158550, + 266114370044632, + 85936925781204, + 59742074322507, + 21888242871839275222246405745257275088548364400416034343698204161488097125583, + 253741129167379, + 21888242871839275222246405745257275088548364400416034343698203884763583431121, + 453931689814810, + 285636181513593, + 312000011221110, + 233001175408837, + 21888242871839275222246405745257275088548364400416034343698204089939669676771, + 321276025500204, + 21888242871839275222246405745257275088548364400416034343698203679892826871081, + 21888242871839275222246405745257275088548364400416034343698203734398000496064, + 21888242871839275222246405745257275088548364400416034343698203790175383049946, + 154915793841501, + 385315155560954, + 193602499503683, + 21888242871839275222246405745257275088548364400416034343698204083662750858410, + 44962795748719, + 390829173575846, + 21888242871839275222246405745257275088548364400416034343698203936411025490475, + 510084393280599, + 21888242871839275222246405745257275088548364400416034343698203760242472975016, + 21888242871839275222246405745257275088548364400416034343698203703654675717330, + 466861931972727, + 445067221463187, + 21888242871839275222246405745257275088548364400416034343698204008216667692077, + 345316695691425, + 444279155382778, + 524477292229280, + 36255443640766, + 85576938520202, + 190851787825735, + 101487889182732, + 410032232264110, + 21888242871839275222246405745257275088548364400416034343698203700908083396685, + 21888242871839275222246405745257275088548364400416034343698204142202934779540, + 553471845209138, + 21888242871839275222246405745257275088548364400416034343698203696850898907872, + 21888242871839275222246405745257275088548364400416034343698204006975214742303, + 21888242871839275222246405745257275088548364400416034343698203637605021240342, + 21888242871839275222246405745257275088548364400416034343698203646648704267862, + 21888242871839275222246405745257275088548364400416034343698203825106696438891, + 21888242871839275222246405745257275088548364400416034343698204119197819876646, + 21888242871839275222246405745257275088548364400416034343698203974006970584706, + 21888242871839275222246405745257275088548364400416034343698203998295024341131, + 21888242871839275222246405745257275088548364400416034343698204117703809636815, + 477467729717264, + 21888242871839275222246405745257275088548364400416034343698203933455948662287, + 155044931486207, + 21888242871839275222246405745257275088548364400416034343698203915161065117341, + 201924603205415, + 21888242871839275222246405745257275088548364400416034343698203660802755154628, + 21888242871839275222246405745257275088548364400416034343698203929592276639094, + 21888242871839275222246405745257275088548364400416034343698203758254060832164, + 307408393482866, + 21888242871839275222246405745257275088548364400416034343698204014910557834605, + 180495444819185, + 21888242871839275222246405745257275088548364400416034343698203705283281114831, + 558974511435678, + 51926259173677, + 21888242871839275222246405745257275088548364400416034343698203924993691224714, + 21888242871839275222246405745257275088548364400416034343698203646471015812381, + 21888242871839275222246405745257275088548364400416034343698204007594381234107, + 21888242871839275222246405745257275088548364400416034343698203875609943467766, + 530479429382289, + 21888242871839275222246405745257275088548364400416034343698204018534435856482, + 296390906469889, + 245502553098876, + 21888242871839275222246405745257275088548364400416034343698204134433647344512, + 239054935883451, + 179515801873574, + 342397160092239, + 340160899691142, + 531517437153746, + 380999849280671, + 21888242871839275222246405745257275088548364400416034343698204145700853444094, + 51497189090527, + 21888242871839275222246405745257275088548364400416034343698203887492630680852, + 487807742435086, + 21888242871839275222246405745257275088548364400416034343698204003055713461955, + 21888242871839275222246405745257275088548364400416034343698204104369421312706, + 209815632192149, + 358947387047471, + 366767023199762, + 551290552410153, + 32587530396940, + 58321079555331, + 244528562317201, + 21888242871839275222246405745257275088548364400416034343698203744043791901209, + 21888242871839275222246405745257275088548364400416034343698203861527763036950, + 186656738148798, + 21888242871839275222246405745257275088548364400416034343698204158072368425985, + 208753980527698, + 21888242871839275222246405745257275088548364400416034343698203877748875912423, + 21888242871839275222246405745257275088548364400416034343698204173231331174609, + 81974341265231, + 21888242871839275222246405745257275088548364400416034343698203878023627694465, + 393534983898359, + 191908621175280, + 21888242871839275222246405745257275088548364400416034343698203929312539418155, + 277328686545553, + 451831332864099, + 21888242871839275222246405745257275088548364400416034343698203753408405755071, + 513178962134884, + 393636638747686, + 21888242871839275222246405745257275088548364400416034343698204178065078652041, + 21888242871839275222246405745257275088548364400416034343698204112323414989666, + 501240287695049, + 387491319161756, + 21888242871839275222246405745257275088548364400416034343698203962253550368059, + 21888242871839275222246405745257275088548364400416034343698204132774453262048, + 379975463423824, + 21888242871839275222246405745257275088548364400416034343698203655721191516490, + 21888242871839275222246405745257275088548364400416034343698204163980740679087, + 519167086266884, + 21888242871839275222246405745257275088548364400416034343698203631375125327674, + 483714146359888, + 88459818422960, + 301555326403417, + 536571249880353, + 417981901770959, + 21888242871839275222246405745257275088548364400416034343698204097070058123747, + 130725484180312, + 279461471691026, + 21888242871839275222246405745257275088548364400416034343698203719353169276313, + 21888242871839275222246405745257275088548364400416034343698204154476054598878, + 21888242871839275222246405745257275088548364400416034343698204065667763271117, + 263302194463020, + 21888242871839275222246405745257275088548364400416034343698203946851342567102, + 188983152118195, + 21888242871839275222246405745257275088548364400416034343698204032811030032778, + 21888242871839275222246405745257275088548364400416034343698204150019953049234, + 21888242871839275222246405745257275088548364400416034343698204122777241029297, + 502048203019701, + 21888242871839275222246405745257275088548364400416034343698203730487137914275, + 21888242871839275222246405745257275088548364400416034343698203686145308887693, + 21888242871839275222246405745257275088548364400416034343698204158709948289320, + 21888242871839275222246405745257275088548364400416034343698203918619970360877, + 493911841899178, + 21888242871839275222246405745257275088548364400416034343698203967911468899679, + 385283354095968, + 230384594249696, + 21888242871839275222246405745257275088548364400416034343698203639007557648538, + 364882271132620, + 424362831953929, + 21888242871839275222246405745257275088548364400416034343698204023809608438602, + 509243820839387, + 21888242871839275222246405745257275088548364400416034343698204045404307210251, + 21888242871839275222246405745257275088548364400416034343698203734618883433938, + 132139087268606, + 21888242871839275222246405745257275088548364400416034343698204182237568500426, + 21888242871839275222246405745257275088548364400416034343698203628815285957302, + 58182639915003, + 242165649170560, + 21888242871839275222246405745257275088548364400416034343698204084898350429991, + 21888242871839275222246405745257275088548364400416034343698203961265213149062, + 21888242871839275222246405745257275088548364400416034343698203806836448038368, + 21888242871839275222246405745257275088548364400416034343698204122587767643203, + 21888242871839275222246405745257275088548364400416034343698203983089156760468, + 532895265091281, + 21888242871839275222246405745257275088548364400416034343698203694602897286626, + 287838238877117, + 162452170913711, + 21888242871839275222246405745257275088548364400416034343698204001666416815052, + 16553686866503, + 188797821872868, + 21888242871839275222246405745257275088548364400416034343698204092497232944652, + 21888242871839275222246405745257275088548364400416034343698204088600546944664, + 363573000587573, + 469018170604747, + 186318024868190, + 21888242871839275222246405745257275088548364400416034343698203776829597056022, + 82663858437843, + 21888242871839275222246405745257275088548364400416034343698203779930965986712, + 21888242871839275222246405745257275088548364400416034343698203795205363258997, + 21888242871839275222246405745257275088548364400416034343698204061192121468080, + 482725103651005, + 323095929017153, + 21888242871839275222246405745257275088548364400416034343698203934368544195061, + 21888242871839275222246405745257275088548364400416034343698204064615916678267, + 335909615867302, + 21888242871839275222246405745257275088548364400416034343698203983034493742636, + 282483241935189, + 21888242871839275222246405745257275088548364400416034343698204144307382675501, + 388578482222931, + 548740661532138, + 21888242871839275222246405745257275088548364400416034343698203868398459716371, + 248982815729118, + 21888242871839275222246405745257275088548364400416034343698203693816260220820, + 21888242871839275222246405745257275088548364400416034343698203942122555244418, + 21888242871839275222246405745257275088548364400416034343698203836162409123935, + 21888242871839275222246405745257275088548364400416034343698203885206255930339, + 21888242871839275222246405745257275088548364400416034343698203740510385349372, + 21888242871839275222246405745257275088548364400416034343698204105851405132721, + 21888242871839275222246405745257275088548364400416034343698203630787598932725, + 21888242871839275222246405745257275088548364400416034343698203680378769742945, + 21888242871839275222246405745257275088548364400416034343698203649653937632357, + 125429188081532, + 129267011704990, + 21888242871839275222246405745257275088548364400416034343698204132714017331103, + 21888242871839275222246405745257275088548364400416034343698203690125824601783, + 21888242871839275222246405745257275088548364400416034343698204074529655271181, + 345539380938333, + 100888029009455, + 411461313919842, + 21888242871839275222246405745257275088548364400416034343698204105091594932767, + 21888242871839275222246405745257275088548364400416034343698203893992224169217, + 21888242871839275222246405745257275088548364400416034343698203715129176145988, + 21888242871839275222246405745257275088548364400416034343698203792439516881940, + 290303161362597, + 93231902810727, + 21888242871839275222246405745257275088548364400416034343698203676370796918600, + 250608312568393, + 485034146433052, + 371173540115824, + 21888242871839275222246405745257275088548364400416034343698203865238315864079, + 21888242871839275222246405745257275088548364400416034343698203664260275745256, + 532838384470691, + 21888242871839275222246405745257275088548364400416034343698203797312142718790, + 293949593491203, + 21888242871839275222246405745257275088548364400416034343698203734973405027596, + 425055623773697, + 95966781663427, + 21888242871839275222246405745257275088548364400416034343698203943556175042967, + 347917071140932, + 21888242871839275222246405745257275088548364400416034343698204070412525293965, + 21888242871839275222246405745257275088548364400416034343698204033506736384637, + 21888242871839275222246405745257275088548364400416034343698203988629644887875, + 68469784604558, + 112049097604628, + 235301513222171, + 174344377759147, + 517954538290465, + 21888242871839275222246405745257275088548364400416034343698203881411132647719, + 12383993617825, + 21888242871839275222246405745257275088548364400416034343698204037925005680469, + 169444742520001, + 324953996049527, + 26366523768575, + 116412792964906, + 21888242871839275222246405745257275088548364400416034343698203782993476626028, + 2094551905545, + 33666323383845, + 129007766810673, + 350099756494975, + 438190370382387, + 21888242871839275222246405745257275088548364400416034343698203810967184254195, + 21888242871839275222246405745257275088548364400416034343698203784015783828902, + 183074140154467, + 373676378701475, + 21888242871839275222246405745257275088548364400416034343698203759105562310076, + 277970671460122, + 160296094574955, + 21888242871839275222246405745257275088548364400416034343698203939866410931792, + 324429686972295, + 21888242871839275222246405745257275088548364400416034343698203977789341266719, + 21888242871839275222246405745257275088548364400416034343698204116743339474312, + 21888242871839275222246405745257275088548364400416034343698203875207063126078, + 21888242871839275222246405745257275088548364400416034343698203940880994197184, + 21888242871839275222246405745257275088548364400416034343698203838234410509426, + 21888242871839275222246405745257275088548364400416034343698203657303917098636, + 307359408029485, + 251308897555848, + 21888242871839275222246405745257275088548364400416034343698203683424465459979, + 427113819345784, + 21888242871839275222246405745257275088548364400416034343698203876143371808856, + 379412928920781, + 282909592948770, + 159928503363680, + 427095792680086, + 336984002199031, + 21888242871839275222246405745257275088548364400416034343698203848292476897947, + 291557704445703, + 21888242871839275222246405745257275088548364400416034343698203846514562627551, + 21888242871839275222246405745257275088548364400416034343698203754065576202519, + 21888242871839275222246405745257275088548364400416034343698203847863513535947, + 391755773811512, + 349577835474884, + 159614188877961, + 144317177276428, + 225301883616133, + 21888242871839275222246405745257275088548364400416034343698203763437104549917, + 428127469472936, + 556402249439778, + 21888242871839275222246405745257275088548364400416034343698204153565072270197, + 141258925076489, + 21888242871839275222246405745257275088548364400416034343698203883382886449473, + 21888242871839275222246405745257275088548364400416034343698203880567852877278, + 558558744923724, + 21888242871839275222246405745257275088548364400416034343698204111870893329285, + 21888242871839275222246405745257275088548364400416034343698203789577565823188, + 21888242871839275222246405745257275088548364400416034343698203995641494293100, + 132315701581403, + 104259150119132, + 137843359554525, + 236365565946779, + 21888242871839275222246405745257275088548364400416034343698203651877803380063, + 518425691520252, + 542344192329372, + 21888242871839275222246405745257275088548364400416034343698203688107673781052, + 21888242871839275222246405745257275088548364400416034343698203662103877481699, + 150633349214527, + 21888242871839275222246405745257275088548364400416034343698203971576680639424, + 21888242871839275222246405745257275088548364400416034343698203689396106759209, + 499922230713426, + 21888242871839275222246405745257275088548364400416034343698203718960644176985, + 21888242871839275222246405745257275088548364400416034343698203780899161751358, + 21888242871839275222246405745257275088548364400416034343698203915850885644274, + 21888242871839275222246405745257275088548364400416034343698203939540397651769, + 21888242871839275222246405745257275088548364400416034343698204156861566712483, + 21888242871839275222246405745257275088548364400416034343698204080669900051142, + 514781173029455, + 21888242871839275222246405745257275088548364400416034343698203832257308475737, + 264549854981933, + 21888242871839275222246405745257275088548364400416034343698203885629049961629, + 193128352582494, + 270051742428620, + 21888242871839275222246405745257275088548364400416034343698204080645986330572, + 21888242871839275222246405745257275088548364400416034343698204009150263096870, + 21888242871839275222246405745257275088548364400416034343698203674328918847571, + 274342196165631, + 21888242871839275222246405745257275088548364400416034343698203836909164096832, + 23337851675714, + 21888242871839275222246405745257275088548364400416034343698204098510791477691, + 496667123005228, + 21888242871839275222246405745257275088548364400416034343698203678027261373530, + 1685498072008, + 493099871101297, + 340108652939438, + 444276760918732, + 21888242871839275222246405745257275088548364400416034343698203787741891542504, + 251497570094692, + 21888242871839275222246405745257275088548364400416034343698204170824890370631, + 104073253804738, + 42649946487271, + 207337874320763, + 21888242871839275222246405745257275088548364400416034343698203683191372865333, + 21888242871839275222246405745257275088548364400416034343698203757302551616793, + 21888242871839275222246405745257275088548364400416034343698203883605354274063, + 508834836249700, + 21888242871839275222246405745257275088548364400416034343698203920486586106300, + 539248389120811, + 443430526055001, + 531677004596200, + 360098348091791, + 21888242871839275222246405745257275088548364400416034343698204007328257570179, + 239230682150219, + 21888242871839275222246405745257275088548364400416034343698203982364885030599, + 21888242871839275222246405745257275088548364400416034343698204027057591901135, + 262281966051473, + 21888242871839275222246405745257275088548364400416034343698203766741207794912, + 51742457768823, + 21888242871839275222246405745257275088548364400416034343698204104651893106368, + 367177685403595, + 443514315798969, + 516980497894012, + 21888242871839275222246405745257275088548364400416034343698203863848554159620, + 21888242871839275222246405745257275088548364400416034343698203854479624512771, + 21888242871839275222246405745257275088548364400416034343698204111556833266501, + 21888242871839275222246405745257275088548364400416034343698203832732362391376, + 524212759225917, + 271245094827562, + 21888242871839275222246405745257275088548364400416034343698204034210875603758, + 21888242871839275222246405745257275088548364400416034343698203962911876674726, + 21888242871839275222246405745257275088548364400416034343698203965952777583921, + 21888242871839275222246405745257275088548364400416034343698204096746466209229, + 21888242871839275222246405745257275088548364400416034343698204153773323325205, + 491076250407895, + 21888242871839275222246405745257275088548364400416034343698204184994465438743, + 109419147500495, + 76024892657663, + 21888242871839275222246405745257275088548364400416034343698203820077706889905, + 30863419376414, + 492497282866962, + 21888242871839275222246405745257275088548364400416034343698204079120341633890, + 21888242871839275222246405745257275088548364400416034343698203837764349278037, + 198187317156514, + 21888242871839275222246405745257275088548364400416034343698203842182176768886, + 21888242871839275222246405745257275088548364400416034343698203902925596809793, + 21888242871839275222246405745257275088548364400416034343698203860592892134138, + 21888242871839275222246405745257275088548364400416034343698204121117355311993, + 455058053786384, + 21888242871839275222246405745257275088548364400416034343698203864597353293303, + 21888242871839275222246405745257275088548364400416034343698203736141902248632, + 21888242871839275222246405745257275088548364400416034343698204063039458221747, + 21888242871839275222246405745257275088548364400416034343698204040359088967501, + 21888242871839275222246405745257275088548364400416034343698203633070991023461, + 466766638622189, + 391311416868032, + 21888242871839275222246405745257275088548364400416034343698203811355129872449, + 345556223887497, + 149220239802225, + 121024187644515, + 372094827313399, + 395626203434328, + 145364185435348, + 437111847351961, + 269788114937781, + 211462061165502, + 43203529736365, + 21888242871839275222246405745257275088548364400416034343698203735664444667670, + 129408719240545, + 21888242871839275222246405745257275088548364400416034343698203701590064889257, + 21888242871839275222246405745257275088548364400416034343698203829465520731812, + 21888242871839275222246405745257275088548364400416034343698204161650651419247, + 21888242871839275222246405745257275088548364400416034343698203675594083508853, + 198129817082144, + 21888242871839275222246405745257275088548364400416034343698203673017702106288, + 21888242871839275222246405745257275088548364400416034343698203755005996192466, + 21888242871839275222246405745257275088548364400416034343698203879431279950853, + 300120098744448, + 21888242871839275222246405745257275088548364400416034343698203668079751238886, + 551219503856186, + 158801047685715, + 454486528944353, + 21888242871839275222246405745257275088548364400416034343698203823614473411215, + 272021970151826, + 442292423434693, + 504140156691559, + 296234465845051, + 105846879453659, + 177130933588504, + 260591407483119, + 21888242871839275222246405745257275088548364400416034343698203788820677883551, + 395802279774277, + 373633884831325, + 273443231774140, + 21888242871839275222246405745257275088548364400416034343698204101170545635068, + 139408937971057, + 21888242871839275222246405745257275088548364400416034343698204107240602355704, + 307110515097004, + 21888242871839275222246405745257275088548364400416034343698203805576581536691, + 21888242871839275222246405745257275088548364400416034343698204034598392175435, + 344873797776033, + 494300596243951, + 21888242871839275222246405745257275088548364400416034343698204091035477156084, + 402240228993108, + 21888242871839275222246405745257275088548364400416034343698203717786760747950, + 75689974587414, + 347730620931877, + 327035863235024, + 200669610459323, + 256776861185872, + 534579985002043, + 59737841595551, + 542736220730491, + 71930277085080, + 117237438008023, + 441023808405145, + 21888242871839275222246405745257275088548364400416034343698204157570658029919, + 522564687610461, + 200339342877498, + 192173044478173, + 21888242871839275222246405745257275088548364400416034343698204090773505501675, + 21888242871839275222246405745257275088548364400416034343698204071400359884090, + 538702286360876, + 34370192206393, + 21888242871839275222246405745257275088548364400416034343698203871613965459680, + 44300654881591, + 21888242871839275222246405745257275088548364400416034343698203890279445315528, + 348795737623015, + 52073432897258, + 40817893559325, + 197393241521719, + 520853309391455, + 21888242871839275222246405745257275088548364400416034343698203951317896012062, + 21888242871839275222246405745257275088548364400416034343698203875725008633991, + 411886005120635, + 343057202390774, + 400551057288533, + 21888242871839275222246405745257275088548364400416034343698203998462043808382, + 334321848558239, + 369922189811453, + 21888242871839275222246405745257275088548364400416034343698204104072086027004, + 21888242871839275222246405745257275088548364400416034343698204007023517966308, + 305383921076174, + 273286810516512, + 307835725525548, + 395119775481786, + 98593844852264, + 21888242871839275222246405745257275088548364400416034343698204117771554369021, + 21888242871839275222246405745257275088548364400416034343698203837529774416580, + 21888242871839275222246405745257275088548364400416034343698204100682592238618, + 380184126432130, + 219691004923112, + 281310356289344, + 281182658352607, + 312839058281907, + 99051998847019, + 139886150096635, + 21888242871839275222246405745257275088548364400416034343698203789651538390931, + 21888242871839275222246405745257275088548364400416034343698204182957661961739, + 399442185863374, + 383231981287946, + 21888242871839275222246405745257275088548364400416034343698204180941642791313, + 290508523127966, + 522487221380437, + 541581619788581, + 226768206203072, + 307755562090743, + 21888242871839275222246405745257275088548364400416034343698203939295298528105, + 276973017100681, + 549144616866429, + 266950260115644, + 185473177583672, + 21888242871839275222246405745257275088548364400416034343698203986376096314825, + 21888242871839275222246405745257275088548364400416034343698203898119694662965, + 493865565374942, + 21888242871839275222246405745257275088548364400416034343698204064713531717736, + 21888242871839275222246405745257275088548364400416034343698204138096972283054, + 223990725699803, + 407105819024178, + 219935559064937, + 409563966730310, + 503590313095257, + 297518703013284, + 542118724943233, + 337094631757012, + 21888242871839275222246405745257275088548364400416034343698203670866600811836, + 21888242871839275222246405745257275088548364400416034343698204034634711989588, + 21888242871839275222246405745257275088548364400416034343698203831628149388364, + 21888242871839275222246405745257275088548364400416034343698203683090564374439, + 21888242871839275222246405745257275088548364400416034343698203661263119010281, + 428014865120571, + 21888242871839275222246405745257275088548364400416034343698204076838430107775, + 21888242871839275222246405745257275088548364400416034343698204180581425894072, + 365681589009729, + 667899194057, + 69690313573678, + 21888242871839275222246405745257275088548364400416034343698204121688438744872, + 24719244749505, + 21888242871839275222246405745257275088548364400416034343698204132822795033736, + 21888242871839275222246405745257275088548364400416034343698203889755147490350, + 336772686714088, + 21888242871839275222246405745257275088548364400416034343698204134267646264289, + 21888242871839275222246405745257275088548364400416034343698203954688171053243, + 236120871524192, + 233072653977483, + 21888242871839275222246405745257275088548364400416034343698203872633192357274, + 32605018605183, + 458868930025415, + 309965889394363, + 199354640071446, + 7238495281067, + 82180962919236, + 355984098454979, + 333333450737422, + 429957705683910, + 481824351775186, + 21888242871839275222246405745257275088548364400416034343698203903490251789571, + 21888242871839275222246405745257275088548364400416034343698203801500355043577, + 21888242871839275222246405745257275088548364400416034343698203978691153041477, + 323153839995905, + 21888242871839275222246405745257275088548364400416034343698204003875025336433, + 534418169220789, + 118477872148510, + 21888242871839275222246405745257275088548364400416034343698203968093803191928, + 21888242871839275222246405745257275088548364400416034343698203958843542760077, + 21888242871839275222246405745257275088548364400416034343698204025860158271620, + 21888242871839275222246405745257275088548364400416034343698203697757015391100, + 417062201725886, + 316231760294780, + 445021520991148, + 166093076377357, + 21888242871839275222246405745257275088548364400416034343698204178424324565034, + 233193458640193, + 110321072354764, + 213296963339427, + 344098102645927, + 16974051863977, + 244279707540102, + 32999871756603, + 207371102377892, + 21888242871839275222246405745257275088548364400416034343698203970245587012471, + 21888242871839275222246405745257275088548364400416034343698204157809239291297, + 21888242871839275222246405745257275088548364400416034343698204059791136902635, + 21888242871839275222246405745257275088548364400416034343698203982101243157110, + 556811748578508, + 420631563990080, + 21888242871839275222246405745257275088548364400416034343698203831873045575238, + 21888242871839275222246405745257275088548364400416034343698204081582583332133, + 21888242871839275222246405745257275088548364400416034343698203717119453377549, + 171354959549740, + 21888242871839275222246405745257275088548364400416034343698204074406610896572, + 34896577195690, + 121022701587618, + 441436439376288, + 21888242871839275222246405745257275088548364400416034343698203989723740731240, + 49573076273832, + 273060341360702, + 21888242871839275222246405745257275088548364400416034343698204175124765714064, + 21888242871839275222246405745257275088548364400416034343698203786655996724030, + 21888242871839275222246405745257275088548364400416034343698203718880589495385, + 21888242871839275222246405745257275088548364400416034343698203729353994488987, + 544398972703746, + 272385908914669, + 21888242871839275222246405745257275088548364400416034343698203840212659226904, + 176573582719581, + 120226388426599, + 21888242871839275222246405745257275088548364400416034343698203782086407430572, + 21888242871839275222246405745257275088548364400416034343698203815562558446476, + 109912309523947, + 273229920936679, + 21888242871839275222246405745257275088548364400416034343698204042739138813706, + 21888242871839275222246405745257275088548364400416034343698203947836791289180, + 383081415917560, + 264829112674663, + 21888242871839275222246405745257275088548364400416034343698203979881306506177, + 21888242871839275222246405745257275088548364400416034343698203759344414345746, + 547135244350089, + 21888242871839275222246405745257275088548364400416034343698203881931740101584, + 434101019384764, + 172897024078385, + 437790162617575, + 21888242871839275222246405745257275088548364400416034343698204121604042207963, + 475624452118000, + 73248028307202, + 21888242871839275222246405745257275088548364400416034343698204108307397565265, + 10652013962735, + 21888242871839275222246405745257275088548364400416034343698204024702124944554, + 213295260461578, + 102819007289927, + 261150108100838, + 153201600737372, + 21888242871839275222246405745257275088548364400416034343698203985778082070822, + 25111396392809, + 21888242871839275222246405745257275088548364400416034343698204022700327591550, + 21888242871839275222246405745257275088548364400416034343698203938707501144544, + 430494392606679, + 21888242871839275222246405745257275088548364400416034343698203842871288868935, + 21888242871839275222246405745257275088548364400416034343698203799718714286078, + 21888242871839275222246405745257275088548364400416034343698203954561136589820, + 329184958008007, + 21888242871839275222246405745257275088548364400416034343698204098701548046361, + 22817972153158, + 138432014048278, + 30235334488456, + 21888242871839275222246405745257275088548364400416034343698203660996068689344, + 407708457034988, + 458882550694240, + 27924766948881, + 305516357967614, + 244947150697440, + 52721424359162, + 365036711329273, + 21888242871839275222246405745257275088548364400416034343698203892279818513542, + 321276334385146, + 21888242871839275222246405745257275088548364400416034343698203942133257175088, + 21888242871839275222246405745257275088548364400416034343698203941311906107152, + 386909070008939, + 21888242871839275222246405745257275088548364400416034343698203631523862429919, + 50286214691611, + 21888242871839275222246405745257275088548364400416034343698203953719459071571, + 21888242871839275222246405745257275088548364400416034343698203904488256950159, + 21888242871839275222246405745257275088548364400416034343698203662880787865768, + 21888242871839275222246405745257275088548364400416034343698203634383789200349, + 21888242871839275222246405745257275088548364400416034343698204066198383745752, + 145711787142232, + 404711993531480, + 21888242871839275222246405745257275088548364400416034343698203782170025588824, + 21888242871839275222246405745257275088548364400416034343698203765457817798999, + 21888242871839275222246405745257275088548364400416034343698203879055822426896, + 383132181165823, + 21888242871839275222246405745257275088548364400416034343698204122945306357669, + 21888242871839275222246405745257275088548364400416034343698204138371444528133, + 21888242871839275222246405745257275088548364400416034343698204058902605881867, + 21888242871839275222246405745257275088548364400416034343698203864674368513045, + 322077411671058, + 531727501332899, + 21888242871839275222246405745257275088548364400416034343698203768105580367001, + 419234951910111, + 129883303158421, + 207477632713156, + 451023494307278, + 153188065710773, + 21888242871839275222246405745257275088548364400416034343698204151533883836199, + 21888242871839275222246405745257275088548364400416034343698204173740056518267, + 21888242871839275222246405745257275088548364400416034343698203653212118536075, + 523966767698523, + 562017927967701, + 21888242871839275222246405745257275088548364400416034343698203793973668540264, + 534722154492223, + 21888242871839275222246405745257275088548364400416034343698203747838367386073, + 21888242871839275222246405745257275088548364400416034343698203627711725588535, + 267331735433753, + 21888242871839275222246405745257275088548364400416034343698203721118330710810, + 21888242871839275222246405745257275088548364400416034343698204152602812518415, + 21888242871839275222246405745257275088548364400416034343698203770861127430055, + 21888242871839275222246405745257275088548364400416034343698203986916939251836, + 21888242871839275222246405745257275088548364400416034343698203965050499649013, + 21888242871839275222246405745257275088548364400416034343698203915382904803264, + 21888242871839275222246405745257275088548364400416034343698203650291087950266, + 21888242871839275222246405745257275088548364400416034343698204002713565410758, + 21888242871839275222246405745257275088548364400416034343698203742343754651029, + 21888242871839275222246405745257275088548364400416034343698203629195083372469, + 21888242871839275222246405745257275088548364400416034343698204165558259175005, + 21888242871839275222246405745257275088548364400416034343698203706895789967274, + 21888242871839275222246405745257275088548364400416034343698204118602661034537, + 21888242871839275222246405745257275088548364400416034343698204143930985055089, + 49872881307459, + 221588135916562, + 147040156817128, + 21888242871839275222246405745257275088548364400416034343698203810736471083676, + 40637872028817, + 412280232961009, + 177229360962442, + 317660767416576, + 21888242871839275222246405745257275088548364400416034343698203798588403559045, + 21888242871839275222246405745257275088548364400416034343698203917306708908020, + 21888242871839275222246405745257275088548364400416034343698203848551623964271, + 422563022023694, + 21888242871839275222246405745257275088548364400416034343698203633201402302304, + 107435953135197, + 134413645175011, + 40733372731955, + 528436913341219, + 112163237511411, + 21888242871839275222246405745257275088548364400416034343698203903054469983486, + 322759589120610, + 21888242871839275222246405745257275088548364400416034343698204114768521115498, + 21888242871839275222246405745257275088548364400416034343698203910980462131759, + 21888242871839275222246405745257275088548364400416034343698204038208347968337, + 21888242871839275222246405745257275088548364400416034343698203903703721997213, + 271245875822188, + 21888242871839275222246405745257275088548364400416034343698203894528964538132, + 224031231547102, + 21888242871839275222246405745257275088548364400416034343698203769041354561252, + 21888242871839275222246405745257275088548364400416034343698204180041122300973, + 206414486053333, + 272490702525875, + 500917216352898, + 21888242871839275222246405745257275088548364400416034343698203793189828881426, + 152335913495554, + 301058634423721, + 21888242871839275222246405745257275088548364400416034343698203748293178725134, + 21888242871839275222246405745257275088548364400416034343698203909957368079221, + 355481729307997, + 85820029712954, + 21888242871839275222246405745257275088548364400416034343698204063117709883217, + 125108998077187, + 21888242871839275222246405745257275088548364400416034343698204118875271492921, + 383115847037316, + 24272300728294, + 66100753688249, + 272760871963632, + 363106575898730, + 32965326705630, + 372734103254185, + 21888242871839275222246405745257275088548364400416034343698203885711557402839, + 33835254073142, + 21888242871839275222246405745257275088548364400416034343698204088646025857246, + 89451774084848, + 437117843480911, + 21888242871839275222246405745257275088548364400416034343698203799326170659580, + 21888242871839275222246405745257275088548364400416034343698203797731027919083, + 444003556869254, + 153706311166132, + 547472409088719, + 21888242871839275222246405745257275088548364400416034343698203838611437711809, + 21888242871839275222246405745257275088548364400416034343698203706855090652398, + 21888242871839275222246405745257275088548364400416034343698203882220945547156, + 181491428887377, + 50849516798634, + 276380093168347, + 21888242871839275222246405745257275088548364400416034343698203949525619688213, + 21888242871839275222246405745257275088548364400416034343698204129813778671904, + 138094441496519, + 21888242871839275222246405745257275088548364400416034343698203880361373743448, + 21888242871839275222246405745257275088548364400416034343698204182929100479370, + 21888242871839275222246405745257275088548364400416034343698203672675944586705, + 4032707026264, + 456549755438080, + 21888242871839275222246405745257275088548364400416034343698203917853040265785, + 21888242871839275222246405745257275088548364400416034343698203842318581290783, + 21888242871839275222246405745257275088548364400416034343698204135821893323805, + 155832239619066, + 21888242871839275222246405745257275088548364400416034343698203749358920602282, + 21888242871839275222246405745257275088548364400416034343698203817983751024279, + 21888242871839275222246405745257275088548364400416034343698203907706884551941, + 21888242871839275222246405745257275088548364400416034343698203623840572962251, + 21888242871839275222246405745257275088548364400416034343698204158993763520435, + 8031404141279, + 315131296407818, + 21888242871839275222246405745257275088548364400416034343698203795718825947343, + 21888242871839275222246405745257275088548364400416034343698203883240024864095, + 21888242871839275222246405745257275088548364400416034343698204072400572588213, + 21888242871839275222246405745257275088548364400416034343698203793364927537254, + 21888242871839275222246405745257275088548364400416034343698204129021524226215, + 21888242871839275222246405745257275088548364400416034343698203908657506731760, + 21888242871839275222246405745257275088548364400416034343698203863540018801504, + 26981810703626, + 274578836713702, + 21888242871839275222246405745257275088548364400416034343698203650835582343957, + 21888242871839275222246405745257275088548364400416034343698204049127655524229, + 21888242871839275222246405745257275088548364400416034343698204173492896662232, + 394709358787629, + 453143849967877, + 139981614850649, + 21888242871839275222246405745257275088548364400416034343698203958853314544372, + 21888242871839275222246405745257275088548364400416034343698204176445912651636, + 58903096635049, + 117093138398661, + 266535693765660, + 354201169736952, + 21888242871839275222246405745257275088548364400416034343698203657717462113987, + 195873052758660, + 21888242871839275222246405745257275088548364400416034343698204155644844216301, + 142752689222955, + 491378063647303, + 544610331905610, + 468899157068135, + 21888242871839275222246405745257275088548364400416034343698203988227152103993, + 21888242871839275222246405745257275088548364400416034343698203641387243094707, + 545653438317167, + 21888242871839275222246405745257275088548364400416034343698203931562859724667, + 438046086359727, + 21888242871839275222246405745257275088548364400416034343698203911771294350455, + 21888242871839275222246405745257275088548364400416034343698204077781490202868, + 314535465934489, + 299352247556799, + 21888242871839275222246405745257275088548364400416034343698203663776690292236, + 176754767255791, + 331741682549142, + 21888242871839275222246405745257275088548364400416034343698203710328057517011, + 21888242871839275222246405745257275088548364400416034343698204086659137753890, + 44256205371602, + 21888242871839275222246405745257275088548364400416034343698203646754488127233, + 441564560960565, + 520805053865274, + 21888242871839275222246405745257275088548364400416034343698204150794911490083, + 21888242871839275222246405745257275088548364400416034343698203950469098013295, + 21888242871839275222246405745257275088548364400416034343698203770080586336685, + 21888242871839275222246405745257275088548364400416034343698203658440609049305, + 21888242871839275222246405745257275088548364400416034343698203760939617496831, + 283821548831776, + 299507307476501, + 263079023064464, + 474203977388344, + 21888242871839275222246405745257275088548364400416034343698204007531679652890, + 21888242871839275222246405745257275088548364400416034343698204081488370719708, + 8802460126281, + 21888242871839275222246405745257275088548364400416034343698204093636012540386, + 289719712440611, + 21888242871839275222246405745257275088548364400416034343698203790146064129431, + 111935931687295, + 38943937613774, + 21888242871839275222246405745257275088548364400416034343698203955047634708876, + 215148390080445, + 411636725266211, + 552414761051125, + 21888242871839275222246405745257275088548364400416034343698203701422330081034, + 231868997939930, + 21888242871839275222246405745257275088548364400416034343698203864280833143234, + 21888242871839275222246405745257275088548364400416034343698203778456673717657, + 143925610033098, + 21888242871839275222246405745257275088548364400416034343698204038567711669589, + 179726348317376, + 21888242871839275222246405745257275088548364400416034343698203702281739966497, + 437736852983673, + 21888242871839275222246405745257275088548364400416034343698203988472152393795, + 21888242871839275222246405745257275088548364400416034343698204061251835024206, + 21888242871839275222246405745257275088548364400416034343698204155422858510245, + 21888242871839275222246405745257275088548364400416034343698203752977727139072, + 89362381917718, + 276777839631852, + 21888242871839275222246405745257275088548364400416034343698203710663496705072, + 442735511663399, + 21888242871839275222246405745257275088548364400416034343698204144338323887993, + 21888242871839275222246405745257275088548364400416034343698203934940625410109, + 101229590495862, + 21888242871839275222246405745257275088548364400416034343698203765887093704991, + 371837893160862, + 9793020290710, + 33334939929958, + 548493091958917, + 21888242871839275222246405745257275088548364400416034343698203706617572773471, + 21888242871839275222246405745257275088548364400416034343698203967518483079921, + 326003306171394, + 353744624408120, + 326904675830198, + 21888242871839275222246405745257275088548364400416034343698203929659890648221, + 21888242871839275222246405745257275088548364400416034343698203938680107115166, + 428882799584327, + 248472411415656, + 44308458776867, + 343706163176278, + 21888242871839275222246405745257275088548364400416034343698203942138520108930, + 21888242871839275222246405745257275088548364400416034343698203797851078706551, + 21888242871839275222246405745257275088548364400416034343698203977463200820361, + 21888242871839275222246405745257275088548364400416034343698203969849570714032, + 439022577756542, + 95560956545147, + 100546891294045, + 21888242871839275222246405745257275088548364400416034343698204143309147709032, + 348762959911763, + 21888242871839275222246405745257275088548364400416034343698203742153616096396, + 131208043053406, + 158416398418830, + 21888242871839275222246405745257275088548364400416034343698203830865528630364, + 21888242871839275222246405745257275088548364400416034343698204157143675077975, + 21888242871839275222246405745257275088548364400416034343698204170257573683318, + 239282745707243, + 200051139355173, + 21888242871839275222246405745257275088548364400416034343698203764433738682435, + 464729575692588, + 197035188330631, + 103553704191087, + 21888242871839275222246405745257275088548364400416034343698203949918808015602, + 21888242871839275222246405745257275088548364400416034343698204112364923961678, + 21888242871839275222246405745257275088548364400416034343698203644107051284793, + 21888242871839275222246405745257275088548364400416034343698203744635779566851, + 115190606137951, + 21888242871839275222246405745257275088548364400416034343698203760456265447524, + 21888242871839275222246405745257275088548364400416034343698204014704806835125, + 160303824666278, + 21888242871839275222246405745257275088548364400416034343698204028375844883626, + 21888242871839275222246405745257275088548364400416034343698203893837627021793, + 298193011797783, + 1980065897398, + 21888242871839275222246405745257275088548364400416034343698203718545504744059, + 315167619958839, + 21888242871839275222246405745257275088548364400416034343698204158897076354061, + 230056572170611, + 199157202720707, + 21888242871839275222246405745257275088548364400416034343698203635214698536817, + 269895350032442, + 431486790272885, + 62552378705174, + 171239145074422, + 21888242871839275222246405745257275088548364400416034343698203762814677485168, + 21888242871839275222246405745257275088548364400416034343698203920996458510973, + 117044639752221, + 21888242871839275222246405745257275088548364400416034343698203654387076269526, + 286295573119470, + 156587715444791, + 342671621779994, + 21888242871839275222246405745257275088548364400416034343698203992440587441257, + 497959593721119, + 21888242871839275222246405745257275088548364400416034343698203806744505600939, + 14549560973778, + 319958442614058, + 21888242871839275222246405745257275088548364400416034343698203838059554127640, + 461574599740832, + 21888242871839275222246405745257275088548364400416034343698203995632534063805, + 21888242871839275222246405745257275088548364400416034343698203857274945343047, + 403524375540172, + 145291655573935, + 21888242871839275222246405745257275088548364400416034343698203926045046818411, + 21888242871839275222246405745257275088548364400416034343698203837101250238942, + 349135108897265, + 161022747272326, + 304466311950513, + 21888242871839275222246405745257275088548364400416034343698203668228671932237, + 331389789961655, + 21888242871839275222246405745257275088548364400416034343698203833065599944657, + 473589596581513, + 173600044163725, + 463099634814064, + 229756123098088, + 145867441181891, + 21888242871839275222246405745257275088548364400416034343698203699255314270536, + 21888242871839275222246405745257275088548364400416034343698203786883460185487, + 21888242871839275222246405745257275088548364400416034343698203680884802222811, + 57617512798850, + 62712538287457, + 261955439544453, + 21888242871839275222246405745257275088548364400416034343698204153684873214833, + 30703235448164, + 21888242871839275222246405745257275088548364400416034343698204104678841099894, + 21888242871839275222246405745257275088548364400416034343698204092409653600552, + 21888242871839275222246405745257275088548364400416034343698203841113694422218, + 21888242871839275222246405745257275088548364400416034343698203897048789091387, + 352002376953662, + 20487925623778, + 117456725193664, + 21888242871839275222246405745257275088548364400416034343698204103084499213292, + 21888242871839275222246405745257275088548364400416034343698204142413178027178, + 21888242871839275222246405745257275088548364400416034343698203662970699044678, + 214571050315429, + 294057429069776, + 334397258812824, + 21888242871839275222246405745257275088548364400416034343698203967321224430617, + 332117701177991, + 21888242871839275222246405745257275088548364400416034343698203648038271545922, + 21888242871839275222246405745257275088548364400416034343698203747365450637497, + 21888242871839275222246405745257275088548364400416034343698204008957383672120, + 21888242871839275222246405745257275088548364400416034343698203963767704346648, + 176362964151555, + 21888242871839275222246405745257275088548364400416034343698203867637785281688, + 384047945965098, + 21888242871839275222246405745257275088548364400416034343698203804221964687223, + 545445594280069, + 21888242871839275222246405745257275088548364400416034343698203923490754806616, + 76965537389354, + 21888242871839275222246405745257275088548364400416034343698203993680985864241, + 21888242871839275222246405745257275088548364400416034343698204119033853940998, + 21888242871839275222246405745257275088548364400416034343698204133241555652388, + 508171097344488, + 21888242871839275222246405745257275088548364400416034343698204160908372695013, + 21888242871839275222246405745257275088548364400416034343698203679032797221501, + 21888242871839275222246405745257275088548364400416034343698203657924199235022, + 429508819617425, + 540912272940013, + 21888242871839275222246405745257275088548364400416034343698204156755691047943, + 379593838597919, + 21888242871839275222246405745257275088548364400416034343698203831014615933525, + 505306176962576, + 520095239129614, + 21888242871839275222246405745257275088548364400416034343698203801210652145447, + 506083349965271, + 21888242871839275222246405745257275088548364400416034343698203826758159178987, + 290804233791522, + 21888242871839275222246405745257275088548364400416034343698204177788786710385, + 270236858139954, + 21888242871839275222246405745257275088548364400416034343698204099640884418072, + 237182155354202, + 21888242871839275222246405745257275088548364400416034343698203650368728388854, + 21888242871839275222246405745257275088548364400416034343698203999063194012881, + 298186144088908, + 181966109459927, + 135289621511299, + 530331934958583, + 21888242871839275222246405745257275088548364400416034343698203903929743205170, + 414523902297069, + 21888242871839275222246405745257275088548364400416034343698203914826059212314, + 21888242871839275222246405745257275088548364400416034343698203815357467264675, + 21888242871839275222246405745257275088548364400416034343698203681305649179481, + 21888242871839275222246405745257275088548364400416034343698203651403671545017, + 21888242871839275222246405745257275088548364400416034343698203826612355744168, + 21888242871839275222246405745257275088548364400416034343698204112008439095762, + 336986605336042, + 21888242871839275222246405745257275088548364400416034343698204118986230448250, + 242378788686300, + 289553607495359, + 77963675945395, + 21888242871839275222246405745257275088548364400416034343698204173188872435243, + 21888242871839275222246405745257275088548364400416034343698203958098963718716, + 21888242871839275222246405745257275088548364400416034343698203920998912013435, + 21888242871839275222246405745257275088548364400416034343698203719837479510200, + 21888242871839275222246405745257275088548364400416034343698203986633557098624, + 21888242871839275222246405745257275088548364400416034343698204011978307720278, + 21888242871839275222246405745257275088548364400416034343698204053190468474666, + 181898436656632, + 21888242871839275222246405745257275088548364400416034343698203870512690833642, + 253704617598261, + 21888242871839275222246405745257275088548364400416034343698204068262928745585, + 419120401018292, + 424105822269545, + 376902206855134, + 521682178439525, + 397662909571966, + 21888242871839275222246405745257275088548364400416034343698204058233359179847, + 531931278028807, + 404268206059033, + 510942388583676, + 21888242871839275222246405745257275088548364400416034343698203990296252548651, + 21888242871839275222246405745257275088548364400416034343698204020892490883729, + 17334417879772, + 21888242871839275222246405745257275088548364400416034343698204137653483618688, + 21888242871839275222246405745257275088548364400416034343698203729545421400653, + 310226477356605, + 21888242871839275222246405745257275088548364400416034343698203740232195533312, + 21888242871839275222246405745257275088548364400416034343698203697846297077164, + 21888242871839275222246405745257275088548364400416034343698203633910921515623, + 409052889052051, + 21888242871839275222246405745257275088548364400416034343698203884729540062032, + 372123757173699, + 134635824540099, + 21888242871839275222246405745257275088548364400416034343698203935558156889722, + 21888242871839275222246405745257275088548364400416034343698203798619770820599, + 21888242871839275222246405745257275088548364400416034343698204107280712030395, + 58751331738462, + 21888242871839275222246405745257275088548364400416034343698203971541046666716, + 21888242871839275222246405745257275088548364400416034343698203951547283694303, + 21888242871839275222246405745257275088548364400416034343698203718275464654781, + 511548879561411, + 21888242871839275222246405745257275088548364400416034343698203799723167870460, + 21888242871839275222246405745257275088548364400416034343698203871743474381198, + 21888242871839275222246405745257275088548364400416034343698204095771193003025, + 21888242871839275222246405745257275088548364400416034343698204141129814684273, + 449702539707285, + 533602723457377, + 21888242871839275222246405745257275088548364400416034343698203911765326066444, + 21888242871839275222246405745257275088548364400416034343698203872623847029519, + 394632404406896, + 21888242871839275222246405745257275088548364400416034343698203633845537065370, + 131232125945120, + 93885537769032, + 117894077114930, + 21888242871839275222246405745257275088548364400416034343698203804830378487964, + 21888242871839275222246405745257275088548364400416034343698203843528064574195, + 21888242871839275222246405745257275088548364400416034343698203677526964879080, + 21888242871839275222246405745257275088548364400416034343698204035394097951637, + 21888242871839275222246405745257275088548364400416034343698204079430583510516, + 21888242871839275222246405745257275088548364400416034343698203968413928011541, + 21888242871839275222246405745257275088548364400416034343698203831968855944225, + 21888242871839275222246405745257275088548364400416034343698204056909866900272, + 21888242871839275222246405745257275088548364400416034343698203659730029780978, + 224638084625971, + 21888242871839275222246405745257275088548364400416034343698204011400991543133, + 47238820443642, + 21888242871839275222246405745257275088548364400416034343698204041338735411098, + 21888242871839275222246405745257275088548364400416034343698204034251505741652, + 21888242871839275222246405745257275088548364400416034343698204071612920765060, + 315743096439717, + 71534194695622, + 541511280795330, + 21888242871839275222246405745257275088548364400416034343698204007788309485082, + 21888242871839275222246405745257275088548364400416034343698204156879985545556, + 133110691810433, + 21888242871839275222246405745257275088548364400416034343698204182227490365675, + 21888242871839275222246405745257275088548364400416034343698203932329084449339, + 21888242871839275222246405745257275088548364400416034343698203862851475372741, + 532390800935024, + 503379819215324, + 21888242871839275222246405745257275088548364400416034343698203903498221222110, + 270329079117313, + 21888242871839275222246405745257275088548364400416034343698203653479523378069, + 86271844427923, + 21888242871839275222246405745257275088548364400416034343698203981512699564503, + 433132982720246, + 185363384780759, + 21888242871839275222246405745257275088548364400416034343698203753406677985468, + 21888242871839275222246405745257275088548364400416034343698203704875791897507, + 128369383174500, + 547105861785610, + 559392500513776, + 21888242871839275222246405745257275088548364400416034343698204026425751653966, + 58912751055412, + 252970365248964, + 21888242871839275222246405745257275088548364400416034343698203880355621693367, + 164665815384600, + 247952195838678, + 448053960770295, + 517366188620509, + 21888242871839275222246405745257275088548364400416034343698203634682407258081, + 21888242871839275222246405745257275088548364400416034343698203904997914868128, + 21888242871839275222246405745257275088548364400416034343698203732925215195469, + 21888242871839275222246405745257275088548364400416034343698203936942731840932, + 21888242871839275222246405745257275088548364400416034343698203662346501978983, + 21888242871839275222246405745257275088548364400416034343698203707409666980513, + 425873234098482, + 360112960654709, + 21888242871839275222246405745257275088548364400416034343698203658236391720961, + 21888242871839275222246405745257275088548364400416034343698203718251415021578, + 454179836986310, + 21888242871839275222246405745257275088548364400416034343698203640155362810190, + 21888242871839275222246405745257275088548364400416034343698203627506354667745, + 21888242871839275222246405745257275088548364400416034343698203649802387990748, + 372432840967993, + 21888242871839275222246405745257275088548364400416034343698203834292874157602, + 159912478615926, + 141898260409186, + 70725583651773, + 21888242871839275222246405745257275088548364400416034343698203687595227781268, + 184391653406940, + 293898504075076, + 21888242871839275222246405745257275088548364400416034343698203980244795255607, + 21888242871839275222246405745257275088548364400416034343698203776692637271878, + 202650080729197, + 269464761924445, + 62912597237171, + 354537396881533, + 21888242871839275222246405745257275088548364400416034343698204023224504194616, + 21888242871839275222246405745257275088548364400416034343698203879052883225138, + 21888242871839275222246405745257275088548364400416034343698203626559869906373, + 32996485517616, + 441888238834729, + 257771856503851, + 21888242871839275222246405745257275088548364400416034343698203877859922302615, + 21888242871839275222246405745257275088548364400416034343698203896573221813624, + 21888242871839275222246405745257275088548364400416034343698203931509100188318, + 48023232429630, + 68367424627641, + 21888242871839275222246405745257275088548364400416034343698203939404092564909, + 21888242871839275222246405745257275088548364400416034343698203817643957412903, + 21888242871839275222246405745257275088548364400416034343698203670279905548647, + 21888242871839275222246405745257275088548364400416034343698203911568596984217, + 74138117169453, + 400136938191264, + 21888242871839275222246405745257275088548364400416034343698203917873645078014, + 21888242871839275222246405745257275088548364400416034343698203977596761319220, + 468695989468116, + 21888242871839275222246405745257275088548364400416034343698204066347595569280, + 407587648909988, + 341975086731677, + 124725903189840, + 23949868672955, + 242393715517874, + 536509446402720, + 21888242871839275222246405745257275088548364400416034343698203681026608648236, + 378797150734840, + 21888242871839275222246405745257275088548364400416034343698203625398672907310, + 21888242871839275222246405745257275088548364400416034343698203928105038556312, + 50420903594996, + 21888242871839275222246405745257275088548364400416034343698203794961350802604, + 21888242871839275222246405745257275088548364400416034343698204042094962102937, + 21888242871839275222246405745257275088548364400416034343698203881823866828109, + 112249607945733, + 21888242871839275222246405745257275088548364400416034343698203837324065391904, + 485978661970289, + 21888242871839275222246405745257275088548364400416034343698204083706196296977, + 204218767472983, + 21888242871839275222246405745257275088548364400416034343698203900976127592697, + 562427400374964, + 416775708762714, + 21888242871839275222246405745257275088548364400416034343698204133599821169703, + 82502682334815, + 21888242871839275222246405745257275088548364400416034343698204013607518845743, + 101049810110649, + 21888242871839275222246405745257275088548364400416034343698203725977998125271, + 21888242871839275222246405745257275088548364400416034343698203714147677460252, + 21888242871839275222246405745257275088548364400416034343698203777887963101232, + 502675775009419, + 461266970011455, + 21888242871839275222246405745257275088548364400416034343698203944701301325962, + 21888242871839275222246405745257275088548364400416034343698203751717003732328, + 138907193573045, + 21888242871839275222246405745257275088548364400416034343698204174854636422541, + 21888242871839275222246405745257275088548364400416034343698203914304588981043, + 104528896283424, + 21888242871839275222246405745257275088548364400416034343698203656929647297068, + 21888242871839275222246405745257275088548364400416034343698203671450701382501, + 93543388392018, + 21888242871839275222246405745257275088548364400416034343698204129280465428710, + 21888242871839275222246405745257275088548364400416034343698204112308594853956, + 255884951868899, + 322628038109885, + 21888242871839275222246405745257275088548364400416034343698204045225159074335, + 21888242871839275222246405745257275088548364400416034343698204184915648481750, + 45321584451469, + 21888242871839275222246405745257275088548364400416034343698203720904682683007, + 86781464296736, + 84652087378294, + 21888242871839275222246405745257275088548364400416034343698204094610821237364, + 21888242871839275222246405745257275088548364400416034343698204156808208723080, + 200711807130874, + 21888242871839275222246405745257275088548364400416034343698204005540212005009, + 21888242871839275222246405745257275088548364400416034343698203896544757223500, + 457828992026730, + 197538181255607, + 21888242871839275222246405745257275088548364400416034343698203975026188747848, + 21888242871839275222246405745257275088548364400416034343698203649454107664635, + 21888242871839275222246405745257275088548364400416034343698203689554716985201, + 405598542826851, + 21888242871839275222246405745257275088548364400416034343698204171966604653794, + 345320093181304, + 21888242871839275222246405745257275088548364400416034343698204141828808628747, + 361113329638113, + 21888242871839275222246405745257275088548364400416034343698203883204559775174, + 21888242871839275222246405745257275088548364400416034343698204000308487332730, + 21888242871839275222246405745257275088548364400416034343698203636103437281850, + 73620284985189, + 54348746466216, + 367523997073691, + 164853997366224, + 17092083342214, + 21888242871839275222246405745257275088548364400416034343698203657581673260667, + 21888242871839275222246405745257275088548364400416034343698203876764508189148, + 21888242871839275222246405745257275088548364400416034343698204042161617494646, + 21888242871839275222246405745257275088548364400416034343698203713614929648345, + 21888242871839275222246405745257275088548364400416034343698203668572834338722, + 403142596148680, + 281619560580639, + 21888242871839275222246405745257275088548364400416034343698203642352930895678, + 21888242871839275222246405745257275088548364400416034343698204033616386027449, + 21888242871839275222246405745257275088548364400416034343698203951178583593021, + 451522722551274, + 21888242871839275222246405745257275088548364400416034343698204126239197016349, + 273426615093777, + 362403085485549, + 375888383733178, + 161779618825338, + 483530996692260, + 281306711633252, + 252776337446726, + 88179342430126, + 3172669607559, + 339916087182117, + 130519405669555, + 123819514387282, + 30293469365926, + 88784692019871, + 21888242871839275222246405745257275088548364400416034343698203846579684949019, + 515306539785407, + 21888242871839275222246405745257275088548364400416034343698204107293140380071, + 87675803078449, + 21888242871839275222246405745257275088548364400416034343698204043770647415893, + 157910939306623, + 5813524925506, + 282932454476735, + 451152953070232, + 21888242871839275222246405745257275088548364400416034343698203767730389285896, + 478189625706611, + 21888242871839275222246405745257275088548364400416034343698203657785202423090, + 21888242871839275222246405745257275088548364400416034343698203946124345474404, + 21888242871839275222246405745257275088548364400416034343698203953087797323322, + 434645734976596, + 269195279789527, + 21888242871839275222246405745257275088548364400416034343698203891480632399471, + 21888242871839275222246405745257275088548364400416034343698204118979421691438, + 502932581258916, + 526300918706724, + 21888242871839275222246405745257275088548364400416034343698203696831507364285, + 21888242871839275222246405745257275088548364400416034343698203942137141613413, + 487891449197275, + 540691972531490, + 397276931945438, + 21888242871839275222246405745257275088548364400416034343698203783914105739897, + 21888242871839275222246405745257275088548364400416034343698203991758774483924, + 410178418566340, + 465904952257543, + 21888242871839275222246405745257275088548364400416034343698204120775293084637, + 21888242871839275222246405745257275088548364400416034343698203882760806198243, + 21888242871839275222246405745257275088548364400416034343698204041435983564059, + 432695284027554, + 21888242871839275222246405745257275088548364400416034343698203642437711988708, + 483514211637301, + 21888242871839275222246405745257275088548364400416034343698203904457023879368, + 21888242871839275222246405745257275088548364400416034343698203794604576554984, + 21888242871839275222246405745257275088548364400416034343698203842981510099137, + 21888242871839275222246405745257275088548364400416034343698204057494469682964, + 17653416839144, + 148279403276746, + 21888242871839275222246405745257275088548364400416034343698203790070299987949, + 21888242871839275222246405745257275088548364400416034343698203629908560304348, + 237528134691508, + 21888242871839275222246405745257275088548364400416034343698203976906889252782, + 21888242871839275222246405745257275088548364400416034343698204131081840909094, + 21888242871839275222246405745257275088548364400416034343698204148724605360351, + 21888242871839275222246405745257275088548364400416034343698203857504302997360, + 546848217316428, + 360233376759276, + 21888242871839275222246405745257275088548364400416034343698204157363520891450, + 21888242871839275222246405745257275088548364400416034343698203827853089961292, + 412926790894322, + 21888242871839275222246405745257275088548364400416034343698203807688818483244, + 21888242871839275222246405745257275088548364400416034343698203746864188414424, + 21888242871839275222246405745257275088548364400416034343698203695414052772809, + 556075366480857, + 248995342891241, + 21888242871839275222246405745257275088548364400416034343698204154111427805381, + 21888242871839275222246405745257275088548364400416034343698203876320486327820, + 21888242871839275222246405745257275088548364400416034343698204097058991395938, + 407896616448276, + 21888242871839275222246405745257275088548364400416034343698204102575042601612, + 21888242871839275222246405745257275088548364400416034343698204059217929578865, + 21888242871839275222246405745257275088548364400416034343698203857699769186937, + 21888242871839275222246405745257275088548364400416034343698203743329052520816, + 21888242871839275222246405745257275088548364400416034343698203895646019775546, + 21888242871839275222246405745257275088548364400416034343698203979650219469562, + 306924903612797, + 53518419962577, + 463338568376779, + 21888242871839275222246405745257275088548364400416034343698203863035502227036, + 21888242871839275222246405745257275088548364400416034343698203841602013951591, + 21888242871839275222246405745257275088548364400416034343698204053796091327550, + 62018618856149, + 345717379764501, + 21888242871839275222246405745257275088548364400416034343698203773175521852735, + 21888242871839275222246405745257275088548364400416034343698203818937464815971, + 21888242871839275222246405745257275088548364400416034343698203761990489193872, + 451510129632221, + 21888242871839275222246405745257275088548364400416034343698203818631395013806, + 21888242871839275222246405745257275088548364400416034343698203650296526464294, + 21888242871839275222246405745257275088548364400416034343698203860633143393580, + 246467883858825, + 21888242871839275222246405745257275088548364400416034343698204168822702712869, + 21888242871839275222246405745257275088548364400416034343698203810712963507411, + 21888242871839275222246405745257275088548364400416034343698204046346251373134, + 21888242871839275222246405745257275088548364400416034343698203735332241229782, + 21888242871839275222246405745257275088548364400416034343698203985080919165651, + 247983631098951, + 21888242871839275222246405745257275088548364400416034343698204001423388020211, + 354963393923197, + 21888242871839275222246405745257275088548364400416034343698203767172693454600, + 106497292010739, + 281891484619232, + 22618498906350, + 21888242871839275222246405745257275088548364400416034343698203863255765358306, + 95631727504045, + 21888242871839275222246405745257275088548364400416034343698204141347846320546, + 21888242871839275222246405745257275088548364400416034343698203866834546447002, + 142749822422305, + 21888242871839275222246405745257275088548364400416034343698203910546354076714, + 1106494233494, + 163292837423510, + 21888242871839275222246405745257275088548364400416034343698204110364799887620, + 21888242871839275222246405745257275088548364400416034343698204186185573394058, + 454277650388941, + 204583947591017, + 392318567223281, + 467689456672615, + 21888242871839275222246405745257275088548364400416034343698204013244400642838, + 21888242871839275222246405745257275088548364400416034343698203662428260219450, + 21888242871839275222246405745257275088548364400416034343698203686601932300434, + 261964271082653, + 536234464702231, + 21888242871839275222246405745257275088548364400416034343698203690962153190352, + 44664721599075, + 2112530573375, + 21888242871839275222246405745257275088548364400416034343698203676634148562204, + 380515620534611, + 21888242871839275222246405745257275088548364400416034343698203643325712693657, + 497614584602857, + 144878385118962, + 334933405545675, + 21888242871839275222246405745257275088548364400416034343698203706667240449640, + 302298423725166, + 463386264517601, + 781387113565, + 546584691091933, + 21888242871839275222246405745257275088548364400416034343698204019627413085077, + 21888242871839275222246405745257275088548364400416034343698203907282028664143, + 212967148555183, + 15312560838503, + 263379914150975, + 43329670428666, + 21888242871839275222246405745257275088548364400416034343698203658960638194545, + 173806919053840, + 478557132595284, + 357523033260075, + 89011737852135, + 21888242871839275222246405745257275088548364400416034343698204045240427765715, + 21888242871839275222246405745257275088548364400416034343698203954950973820886, + 44361736781806, + 20468301729389, + 21888242871839275222246405745257275088548364400416034343698204075773723633629, + 278039929099722, + 346537571905098, + 189158806408310, + 21888242871839275222246405745257275088548364400416034343698204077066888740293, + 454879214398358, + 21888242871839275222246405745257275088548364400416034343698203676445632676599, + 441660657106686, + 21888242871839275222246405745257275088548364400416034343698203999437221374188, + 209682445807841, + 21888242871839275222246405745257275088548364400416034343698203814960958991097, + 21888242871839275222246405745257275088548364400416034343698204035369745267312, + 246977542979076, + 21888242871839275222246405745257275088548364400416034343698204119239808581398, + 21888242871839275222246405745257275088548364400416034343698204083160597500969, + 103694023034714, + 7321202077315, + 21888242871839275222246405745257275088548364400416034343698203762837253107627, + 46637850826233, + 21888242871839275222246405745257275088548364400416034343698203781370103121850, + 21888242871839275222246405745257275088548364400416034343698204050477475174205, + 21888242871839275222246405745257275088548364400416034343698203790542430444170, + 21888242871839275222246405745257275088548364400416034343698203867321772355750, + 104244260097216, + 512246863922470, + 68807368848813, + 425100442192901, + 21888242871839275222246405745257275088548364400416034343698204010545656047755, + 21888242871839275222246405745257275088548364400416034343698203840957944210921, + 21888242871839275222246405745257275088548364400416034343698204120117909134262, + 32421961639371, + 21888242871839275222246405745257275088548364400416034343698203700704732223168, + 21888242871839275222246405745257275088548364400416034343698203721100022184284, + 418788173692866, + 21888242871839275222246405745257275088548364400416034343698203678983663471908, + 176081408347504, + 46714723567690, + 21888242871839275222246405745257275088548364400416034343698204162584943727924, + 21888242871839275222246405745257275088548364400416034343698203930652176741844, + 21888242871839275222246405745257275088548364400416034343698203729608550380253, + 335690658359897, + 78749017064048, + 552118511429686, + 21888242871839275222246405745257275088548364400416034343698204088197733667394, + 21888242871839275222246405745257275088548364400416034343698203674454178681403, + 24656627315598, + 21888242871839275222246405745257275088548364400416034343698204085283777814819, + 164088446192722, + 21888242871839275222246405745257275088548364400416034343698203806798075273847, + 21888242871839275222246405745257275088548364400416034343698203656466787707062, + 89690122521038, + 21888242871839275222246405745257275088548364400416034343698204069240304492684, + 451208378951427, + 543484888760898, + 479275062193293, + 21888242871839275222246405745257275088548364400416034343698203951163204266606, + 21888242871839275222246405745257275088548364400416034343698203968516621468375, + 21888242871839275222246405745257275088548364400416034343698203983461066141762, + 297443118011611, + 21888242871839275222246405745257275088548364400416034343698203777985098057887, + 21888242871839275222246405745257275088548364400416034343698203796668930194256, + 21888242871839275222246405745257275088548364400416034343698203835750513727547, + 21888242871839275222246405745257275088548364400416034343698203898865160514469, + 21888242871839275222246405745257275088548364400416034343698204169778980904953, + 127347734166142, + 21888242871839275222246405745257275088548364400416034343698203668796661550265, + 386425225846258, + 21888242871839275222246405745257275088548364400416034343698203750844622224710, + 547591359946412, + 21888242871839275222246405745257275088548364400416034343698204126629058590866, + 21888242871839275222246405745257275088548364400416034343698203796472716253132, + 344525659101289, + 21888242871839275222246405745257275088548364400416034343698203983683302443143, + 43872258024360, + 5672903345153, + 21888242871839275222246405745257275088548364400416034343698203701983949717274, + 224849499343663, + 21888242871839275222246405745257275088548364400416034343698203845892433688519, + 70415149755557, + 21888242871839275222246405745257275088548364400416034343698204039144764248180, + 68023520698238, + 209075179955691, + 38621537702659, + 21888242871839275222246405745257275088548364400416034343698203696040047305349, + 21888242871839275222246405745257275088548364400416034343698203775197244864827, + 21888242871839275222246405745257275088548364400416034343698203679306993768293, + 228818171101069, + 21888242871839275222246405745257275088548364400416034343698203969245838664753, + 21888242871839275222246405745257275088548364400416034343698203972049869404282, + 1931968064865, + 21888242871839275222246405745257275088548364400416034343698204110649636924716, + 21888242871839275222246405745257275088548364400416034343698203928688557651091, + 21888242871839275222246405745257275088548364400416034343698203628175280606201, + 21888242871839275222246405745257275088548364400416034343698203875557514901132, + 21888242871839275222246405745257275088548364400416034343698203713714095620639, + 324699410734697, + 512457861117386, + 208923454778763, + 498182390121836, + 505357300503314, + 21888242871839275222246405745257275088548364400416034343698204043448584172917, + 345032961557756, + 21888242871839275222246405745257275088548364400416034343698203745593776023362, + 209048279944139, + 21888242871839275222246405745257275088548364400416034343698203764243613108583, + 21888242871839275222246405745257275088548364400416034343698204184366382382157, + 261459495079269, + 21888242871839275222246405745257275088548364400416034343698203906598484126454, + 439264545881215, + 11017731510949, + 165333275556583, + 202108062760659, + 21888242871839275222246405745257275088548364400416034343698203927890656207721, + 21888242871839275222246405745257275088548364400416034343698204092733673117188, + 21888242871839275222246405745257275088548364400416034343698203959456197144439, + 189415841090989, + 77416784539474, + 21888242871839275222246405745257275088548364400416034343698203940095420649341, + 267273305469202, + 299871972554737, + 324096071380034, + 373536460744594, + 116198594406085, + 21888242871839275222246405745257275088548364400416034343698203795021792465454, + 203494346556057, + 21888242871839275222246405745257275088548364400416034343698203680325040014321, + 87495312024877, + 21888242871839275222246405745257275088548364400416034343698203953060108331851, + 21888242871839275222246405745257275088548364400416034343698203788733607747906, + 21888242871839275222246405745257275088548364400416034343698203957664371455331, + 261079085106881, + 21888242871839275222246405745257275088548364400416034343698203900823544378926, + 21888242871839275222246405745257275088548364400416034343698203672794307846851, + 21888242871839275222246405745257275088548364400416034343698203811068857975167, + 21888242871839275222246405745257275088548364400416034343698204087481932371063, + 21888242871839275222246405745257275088548364400416034343698203883580845487953, + 21888242871839275222246405745257275088548364400416034343698204171898862428207, + 21888242871839275222246405745257275088548364400416034343698204006348500482831, + 21888242871839275222246405745257275088548364400416034343698203851392455015760, + 45342685437247, + 76671020603996, + 558290830564289, + 21888242871839275222246405745257275088548364400416034343698203996520459083648, + 21888242871839275222246405745257275088548364400416034343698203700352811533556, + 21888242871839275222246405745257275088548364400416034343698203715814006048782, + 21888242871839275222246405745257275088548364400416034343698204012553716451367, + 21888242871839275222246405745257275088548364400416034343698203879251116672724, + 21888242871839275222246405745257275088548364400416034343698203784666664905655, + 21888242871839275222246405745257275088548364400416034343698203821178051400044, + 544143826616481, + 336701516295920, + 21888242871839275222246405745257275088548364400416034343698204022641729006701, + 21888242871839275222246405745257275088548364400416034343698203746097276075900, + 21888242871839275222246405745257275088548364400416034343698203749419874454206, + 21888242871839275222246405745257275088548364400416034343698203854023044619416, + 21888242871839275222246405745257275088548364400416034343698203928158065291721, + 21888242871839275222246405745257275088548364400416034343698203685794487028363, + 21888242871839275222246405745257275088548364400416034343698203886988003912071, + 21888242871839275222246405745257275088548364400416034343698203873909744983113, + 516538800286360, + 21888242871839275222246405745257275088548364400416034343698204044120187597919, + 347140846762793, + 283888915004855, + 21888242871839275222246405745257275088548364400416034343698203784018419412365, + 21888242871839275222246405745257275088548364400416034343698203687175979242802, + 298893709388912, + 288554679468608, + 301244263459325, + 347495238695812, + 21888242871839275222246405745257275088548364400416034343698204035304286120532, + 270311103416232, + 231177507323874, + 505731143313532, + 230588275654001, + 541083412633430, + 21888242871839275222246405745257275088548364400416034343698204167874317130976, + 465225837355912, + 21888242871839275222246405745257275088548364400416034343698203696402987382512, + 21888242871839275222246405745257275088548364400416034343698204042666824591423, + 21888242871839275222246405745257275088548364400416034343698204119455996832165, + 298903520265188, + 374316194320508, + 21888242871839275222246405745257275088548364400416034343698203762153023857263, + 21888242871839275222246405745257275088548364400416034343698204035849871820859, + 452867619124725, + 21888242871839275222246405745257275088548364400416034343698203936368681126486, + 21888242871839275222246405745257275088548364400416034343698204137392765539021, + 21888242871839275222246405745257275088548364400416034343698203885891009948475, + 21888242871839275222246405745257275088548364400416034343698203936831780524911, + 21888242871839275222246405745257275088548364400416034343698203726131647623995, + 21888242871839275222246405745257275088548364400416034343698203946184074816757, + 21888242871839275222246405745257275088548364400416034343698203858230876632259, + 21888242871839275222246405745257275088548364400416034343698203954234701467056, + 82640519084252, + 246035114871741, + 21888242871839275222246405745257275088548364400416034343698203640503234918681, + 14567693471442, + 22773502456325, + 348427102099284, + 66266105017867, + 21888242871839275222246405745257275088548364400416034343698203784375980085912, + 21888242871839275222246405745257275088548364400416034343698203948671071646042, + 21888242871839275222246405745257275088548364400416034343698203985619849407309, + 21888242871839275222246405745257275088548364400416034343698203879122111386082, + 93902788399831, + 21888242871839275222246405745257275088548364400416034343698203936504374798772, + 157616768105075, + 47598774072034, + 21888242871839275222246405745257275088548364400416034343698203809954844416286, + 134557046367946, + 21888242871839275222246405745257275088548364400416034343698203956346694881958, + 147583563876332, + 21888242871839275222246405745257275088548364400416034343698203680395128458182, + 21888242871839275222246405745257275088548364400416034343698203933176574769991, + 21888242871839275222246405745257275088548364400416034343698203931915087951235, + 21888242871839275222246405745257275088548364400416034343698203811478808951540, + 21888242871839275222246405745257275088548364400416034343698204071724738245742, + 42770822402526, + 209474014352153, + 441932560762667, + 21888242871839275222246405745257275088548364400416034343698203813102231328560, + 21888242871839275222246405745257275088548364400416034343698203733895394544179, + 83640494009404, + 500841419280895, + 21888242871839275222246405745257275088548364400416034343698203853814426461994, + 527551518647611, + 21888242871839275222246405745257275088548364400416034343698203957068986309718, + 21888242871839275222246405745257275088548364400416034343698204033385398982488, + 21888242871839275222246405745257275088548364400416034343698204090208560791381, + 21888242871839275222246405745257275088548364400416034343698203913991396074508, + 21888242871839275222246405745257275088548364400416034343698203879582917835660, + 382970001003392, + 21888242871839275222246405745257275088548364400416034343698204017245965417912, + 21888242871839275222246405745257275088548364400416034343698203891017072325809, + 281986663119161, + 21888242871839275222246405745257275088548364400416034343698203667613676289782, + 459555421590656, + 254978490000854, + 149661060170032, + 512129150251452, + 466574255806430, + 158230032630389, + 21888242871839275222246405745257275088548364400416034343698203698208155915233, + 416504712400685, + 21888242871839275222246405745257275088548364400416034343698203651241447421051, + 21888242871839275222246405745257275088548364400416034343698203783110316992721, + 21888242871839275222246405745257275088548364400416034343698204079824793583069, + 367438999264657, + 21888242871839275222246405745257275088548364400416034343698203729070240302275, + 21888242871839275222246405745257275088548364400416034343698204126814276825600, + 21888242871839275222246405745257275088548364400416034343698203716916309521898, + 21888242871839275222246405745257275088548364400416034343698203770922431359381, + 245048459598132, + 8636637922096, + 151826262660675, + 312781463189183, + 103314042070826, + 119885011586665, + 21888242871839275222246405745257275088548364400416034343698204007753813111459, + 536242576620718, + 21888242871839275222246405745257275088548364400416034343698203954893490689575, + 21888242871839275222246405745257275088548364400416034343698203969024953398527, + 391785820083624, + 21888242871839275222246405745257275088548364400416034343698203954368951842167, + 360122272987446, + 21888242871839275222246405745257275088548364400416034343698203817064523787531, + 21888242871839275222246405745257275088548364400416034343698203730256674032558, + 21888242871839275222246405745257275088548364400416034343698203693710471624505, + 21888242871839275222246405745257275088548364400416034343698204052438827461041, + 21888242871839275222246405745257275088548364400416034343698203942244575333672, + 21888242871839275222246405745257275088548364400416034343698203935381234267261, + 21888242871839275222246405745257275088548364400416034343698204068006730212787, + 21888242871839275222246405745257275088548364400416034343698203777537014164868, + 21888242871839275222246405745257275088548364400416034343698203755380774539474, + 21888242871839275222246405745257275088548364400416034343698203979775156815849, + 154108807633553, + 485784377833215, + 491137906387329, + 21888242871839275222246405745257275088548364400416034343698204036130296645299, + 21888242871839275222246405745257275088548364400416034343698204176663910149768, + 21888242871839275222246405745257275088548364400416034343698203923900228089837, + 326727323113043, + 89607439110303, + 192478089864383, + 45245276303429, + 21888242871839275222246405745257275088548364400416034343698204011189167024775, + 223637000063210, + 21888242871839275222246405745257275088548364400416034343698204062218952562703, + 510397696939977, + 223512212049279, + 17805336269059, + 21888242871839275222246405745257275088548364400416034343698203700363975248158, + 21888242871839275222246405745257275088548364400416034343698203748854457216438, + 269649014055726, + 21888242871839275222246405745257275088548364400416034343698203951859998718013, + 48896717947264, + 21888242871839275222246405745257275088548364400416034343698204100372576722979, + 266827997755537, + 285038378434047, + 21888242871839275222246405745257275088548364400416034343698203636498227086331, + 190334851355825, + 21888242871839275222246405745257275088548364400416034343698203657899685681377, + 474656270307278, + 21888242871839275222246405745257275088548364400416034343698204028169231263980, + 21888242871839275222246405745257275088548364400416034343698203893965927485526, + 21888242871839275222246405745257275088548364400416034343698203787541820025317, + 21888242871839275222246405745257275088548364400416034343698203774720683282449, + 79634075181780, + 424036868144229, + 321140213473367, + 21888242871839275222246405745257275088548364400416034343698203770255426235342, + 40459489255816, + 270388601170788, + 431684505024756, + 165566819936647, + 21888242871839275222246405745257275088548364400416034343698203897870879063335, + 346796573471350, + 21888242871839275222246405745257275088548364400416034343698204079696609405237, + 469681579286569, + 74931481728296, + 547966493136394, + 185490982714143, + 21888242871839275222246405745257275088548364400416034343698203932928685183839, + 278685831606716, + 514063095285927, + 21888242871839275222246405745257275088548364400416034343698204087998967260870, + 190766634532302, + 218416288740350, + 265056171532137, + 21888242871839275222246405745257275088548364400416034343698203627057575007422, + 21888242871839275222246405745257275088548364400416034343698203705327038389725, + 21888242871839275222246405745257275088548364400416034343698204101106024707091, + 397197385544193, + 21888242871839275222246405745257275088548364400416034343698203687271627508728, + 21888242871839275222246405745257275088548364400416034343698203829847386861091, + 21888242871839275222246405745257275088548364400416034343698203695909400008042, + 21888242871839275222246405745257275088548364400416034343698203847148547367483, + 21888242871839275222246405745257275088548364400416034343698204032812822110089, + 261332445170752, + 21888242871839275222246405745257275088548364400416034343698203652388548312702, + 21888242871839275222246405745257275088548364400416034343698203673203217716500, + 21888242871839275222246405745257275088548364400416034343698203819231947218382, + 21888242871839275222246405745257275088548364400416034343698204083905585818155, + 21888242871839275222246405745257275088548364400416034343698204058522875720353, + 215472285519085, + 386312396289563, + 187762421274153, + 279446375088571, + 324775807123950, + 21888242871839275222246405745257275088548364400416034343698204049777387827370, + 21888242871839275222246405745257275088548364400416034343698203751455380949584, + 21888242871839275222246405745257275088548364400416034343698203961698805639924, + 21888242871839275222246405745257275088548364400416034343698204007859207821934, + 55554248478544, + 280343476883079, + 144106114282753, + 21888242871839275222246405745257275088548364400416034343698203931199356835914, + 21888242871839275222246405745257275088548364400416034343698203927056411720020, + 161161241805880, + 525071780071510, + 21888242871839275222246405745257275088548364400416034343698203727422124521422, + 21888242871839275222246405745257275088548364400416034343698203624761797473559, + 21888242871839275222246405745257275088548364400416034343698204134941269158914, + 21888242871839275222246405745257275088548364400416034343698204117862342026023, + 21888242871839275222246405745257275088548364400416034343698204031052363437921, + 3141858460706, + 121957565743008, + 120681563673581, + 365876045503945, + 21888242871839275222246405745257275088548364400416034343698203920333256508570, + 21888242871839275222246405745257275088548364400416034343698204025828896322486, + 284053635168381, + 117135544329381, + 21888242871839275222246405745257275088548364400416034343698203641032524693931, + 221097362903141, + 21888242871839275222246405745257275088548364400416034343698203668144811377527, + 378309858847374, + 21888242871839275222246405745257275088548364400416034343698203770537394214721, + 7802695755594, + 50237997624921, + 305138929954618, + 448917647852321, + 21888242871839275222246405745257275088548364400416034343698203954944588968583, + 21888242871839275222246405745257275088548364400416034343698203806980488103680, + 520359132698148, + 555568530477622, + 467430499857017, + 23571678170502, + 274502585294196, + 307572019905109, + 520862383773981, + 21888242871839275222246405745257275088548364400416034343698203791851287519388, + 430486149200035, + 21888242871839275222246405745257275088548364400416034343698203972995688150163, + 21888242871839275222246405745257275088548364400416034343698203722981523775421, + 85601884806060, + 534939367013344, + 399378641600468, + 21888242871839275222246405745257275088548364400416034343698204171789781158546, + 503659403645164, + 21888242871839275222246405745257275088548364400416034343698203845178744931093, + 21888242871839275222246405745257275088548364400416034343698203700984755192147, + 21888242871839275222246405745257275088548364400416034343698203993619167886635, + 21888242871839275222246405745257275088548364400416034343698203644900343061718, + 257907967694648, + 21888242871839275222246405745257275088548364400416034343698203748835181995078, + 21888242871839275222246405745257275088548364400416034343698203677499518995678, + 21888242871839275222246405745257275088548364400416034343698204075973936815238, + 21888242871839275222246405745257275088548364400416034343698204016493794943709, + 59102677431186, + 254629949974363, + 21888242871839275222246405745257275088548364400416034343698203660278745417521, + 293020148987441, + 21888242871839275222246405745257275088548364400416034343698203677404407753259, + 21888242871839275222246405745257275088548364400416034343698204034325789963298, + 333854879995535, + 21888242871839275222246405745257275088548364400416034343698203849403978584158, + 332248956495578, + 21888242871839275222246405745257275088548364400416034343698203750724035189461, + 491490494095783, + 21888242871839275222246405745257275088548364400416034343698203767573864957121, + 21888242871839275222246405745257275088548364400416034343698203675729066339880, + 21888242871839275222246405745257275088548364400416034343698203860897785375815, + 21888242871839275222246405745257275088548364400416034343698203960434361710574, + 55686961236958, + 21888242871839275222246405745257275088548364400416034343698203697679297048208, + 21888242871839275222246405745257275088548364400416034343698203770603274178772, + 21888242871839275222246405745257275088548364400416034343698204019480581022388, + 501642219558306, + 261861068835705, + 354347016661712, + 458202968002503, + 450949688180024, + 102063881563505, + 21888242871839275222246405745257275088548364400416034343698203628417463575695, + 21888242871839275222246405745257275088548364400416034343698203828386570914777, + 21888242871839275222246405745257275088548364400416034343698204105548612628087, + 527351268272223, + 21888242871839275222246405745257275088548364400416034343698204084035982566308, + 21888242871839275222246405745257275088548364400416034343698203939415374436873, + 100946356082243, + 470972719036865, + 75020993083072, + 535065882234974, + 298288812362907, + 21888242871839275222246405745257275088548364400416034343698203806169318276000, + 21888242871839275222246405745257275088548364400416034343698204006710382447680, + 442632015533162, + 480064680749609, + 150131240928212, + 21888242871839275222246405745257275088548364400416034343698204127462258327203, + 266063800404624, + 21888242871839275222246405745257275088548364400416034343698203657911911173870, + 21888242871839275222246405745257275088548364400416034343698203835969532643202, + 270306338831670, + 477029789209300, + 21888242871839275222246405745257275088548364400416034343698203626381578839589, + 513546730899293, + 21888242871839275222246405745257275088548364400416034343698203780499720832483, + 21888242871839275222246405745257275088548364400416034343698204179719178836210, + 21888242871839275222246405745257275088548364400416034343698204183629898763628, + 21888242871839275222246405745257275088548364400416034343698203689157150071997, + 21888242871839275222246405745257275088548364400416034343698203736448323963678, + 21888242871839275222246405745257275088548364400416034343698203987970672144453, + 185023965791326, + 45104081079991, + 391381229235834, + 353655422809658, + 21888242871839275222246405745257275088548364400416034343698203864958692125106, + 21888242871839275222246405745257275088548364400416034343698203780221341675272, + 21888242871839275222246405745257275088548364400416034343698203989538142576065, + 403617622660786, + 248720035735818, + 21888242871839275222246405745257275088548364400416034343698203654265876577230, + 21888242871839275222246405745257275088548364400416034343698203853942061773675, + 21888242871839275222246405745257275088548364400416034343698204034690871261445, + 21888242871839275222246405745257275088548364400416034343698203862502336905356, + 21888242871839275222246405745257275088548364400416034343698203721132310405254, + 21888242871839275222246405745257275088548364400416034343698203946498000817897, + 21888242871839275222246405745257275088548364400416034343698204156944448789444, + 195238954773873, + 21888242871839275222246405745257275088548364400416034343698203909099859635876, + 301488645464611, + 149410023875977, + 390968763161020, + 53295336476502, + 21888242871839275222246405745257275088548364400416034343698204069744225400559, + 470099394977231, + 27509072060444, + 21888242871839275222246405745257275088548364400416034343698204105047017310357, + 249433768795782, + 21888242871839275222246405745257275088548364400416034343698203640605462645194, + 21888242871839275222246405745257275088548364400416034343698203951794367575647, + 21888242871839275222246405745257275088548364400416034343698203976408748420093, + 508621110184457, + 48034993817943, + 534644101293908, + 21888242871839275222246405745257275088548364400416034343698204041026938611956, + 380286319169244, + 210804830812500, + 21888242871839275222246405745257275088548364400416034343698203641348771031033, + 21888242871839275222246405745257275088548364400416034343698203690657055321006, + 21888242871839275222246405745257275088548364400416034343698203762892612669137, + 21888242871839275222246405745257275088548364400416034343698203668791387236992, + 21888242871839275222246405745257275088548364400416034343698204081965244315678, + 81677050945559, + 21888242871839275222246405745257275088548364400416034343698203734921263243074, + 21888242871839275222246405745257275088548364400416034343698203915011458204825, + 21888242871839275222246405745257275088548364400416034343698204072435142661420, + 21888242871839275222246405745257275088548364400416034343698203850856191655063, + 469481381924227, + 393021824635438, + 21888242871839275222246405745257275088548364400416034343698203876580340447773, + 462545601555900, + 231985483075799, + 21888242871839275222246405745257275088548364400416034343698203835273015114500, + 212182618713609, + 21888242871839275222246405745257275088548364400416034343698203638986672754140, + 373332205176636, + 473073191415877, + 21888242871839275222246405745257275088548364400416034343698203912449756826692, + 358277827405750, + 474475708070331, + 21888242871839275222246405745257275088548364400416034343698203940282036924724, + 375337993666167, + 21888242871839275222246405745257275088548364400416034343698203783643726206255, + 367628811052900, + 296700680401624, + 21888242871839275222246405745257275088548364400416034343698204028974352076734, + 21888242871839275222246405745257275088548364400416034343698204116507364291519, + 422569633144796, + 352580714338006, + 21888242871839275222246405745257275088548364400416034343698203646510017579585, + 329150637224020, + 151224633801913, + 422849021231112, + 402554318233394, + 21888242871839275222246405745257275088548364400416034343698203753085001202368, + 287218758601716, + 359854792273467, + 21888242871839275222246405745257275088548364400416034343698203943520023643226, + 479781225450237, + 34950751849076, + 21888242871839275222246405745257275088548364400416034343698203721677619048734, + 451540048911313, + 21888242871839275222246405745257275088548364400416034343698204020103593138347, + 21888242871839275222246405745257275088548364400416034343698204021036935105753, + 498213397234817, + 21888242871839275222246405745257275088548364400416034343698203885777787773604, + 21888242871839275222246405745257275088548364400416034343698203991931003118529, + 21888242871839275222246405745257275088548364400416034343698203922610090122627, + 21888242871839275222246405745257275088548364400416034343698203701054489995392, + 324012847064474, + 371452016194204, + 435107791825928, + 21888242871839275222246405745257275088548364400416034343698203902792402389803, + 21888242871839275222246405745257275088548364400416034343698204123996841538254, + 21888242871839275222246405745257275088548364400416034343698203873249557297722, + 257411076371844, + 21888242871839275222246405745257275088548364400416034343698203843226408765066, + 539541452078645, + 315438194063821, + 21888242871839275222246405745257275088548364400416034343698203938101189133934, + 21888242871839275222246405745257275088548364400416034343698203655363225306109, + 21888242871839275222246405745257275088548364400416034343698204176602389475922, + 383527217084821, + 21888242871839275222246405745257275088548364400416034343698203653652012843946, + 560560971858835, + 21888242871839275222246405745257275088548364400416034343698204103197060818746, + 12323826650233, + 491318234591502, + 513238043498889, + 56133709464361, + 21888242871839275222246405745257275088548364400416034343698203944554138204501, + 21888242871839275222246405745257275088548364400416034343698204136052412956657, + 21888242871839275222246405745257275088548364400416034343698203736136718742179, + 367471580732294, + 556261668684051, + 21888242871839275222246405745257275088548364400416034343698203845021232568559, + 193272055082723, + 21888242871839275222246405745257275088548364400416034343698203786929288949999, + 21888242871839275222246405745257275088548364400416034343698204019834164647363, + 104386345976988, + 21888242871839275222246405745257275088548364400416034343698203804600677430235, + 237501763223359, + 24062680178879, + 103390378043163, + 21888242871839275222246405745257275088548364400416034343698204095948289887793, + 21888242871839275222246405745257275088548364400416034343698203727655670772979, + 529501585829417, + 306859180484394, + 21888242871839275222246405745257275088548364400416034343698204166194236377774, + 548765542743133, + 21888242871839275222246405745257275088548364400416034343698204007981193017395, + 462351733977466, + 21888242871839275222246405745257275088548364400416034343698204009747268283466, + 377770440260339, + 21888242871839275222246405745257275088548364400416034343698203677819830640567, + 21888242871839275222246405745257275088548364400416034343698203839022789933231, + 467225685200318, + 191948411174367, + 499871390892600, + 18592912382214, + 21888242871839275222246405745257275088548364400416034343698203742818361522432, + 21888242871839275222246405745257275088548364400416034343698204059203009174744, + 21888242871839275222246405745257275088548364400416034343698203704171912518668, + 389912023828097, + 21888242871839275222246405745257275088548364400416034343698204106385418288541, + 496064680766109, + 562246410310224, + 305113685719929, + 83874620882458, + 125892411174110, + 21888242871839275222246405745257275088548364400416034343698204141127604939909, + 135811000617585, + 52539984295203, + 21888242871839275222246405745257275088548364400416034343698204091272746943607, + 21888242871839275222246405745257275088548364400416034343698204088059619460571, + 61562105768152, + 21888242871839275222246405745257275088548364400416034343698203998026136500575, + 21888242871839275222246405745257275088548364400416034343698203757044657300011, + 216694953714526, + 352202749269486, + 46987191568356, + 393187392384726, + 421155625123166, + 288191307840362, + 50593461863501, + 21888242871839275222246405745257275088548364400416034343698203949274186749365, + 21888242871839275222246405745257275088548364400416034343698203951333649859135, + 389229325267435, + 21888242871839275222246405745257275088548364400416034343698203940964751482859, + 21888242871839275222246405745257275088548364400416034343698203770754492036670, + 21888242871839275222246405745257275088548364400416034343698203794682801515861, + 21888242871839275222246405745257275088548364400416034343698203776793669452893, + 21888242871839275222246405745257275088548364400416034343698203733861309622517, + 34767303282798, + 21888242871839275222246405745257275088548364400416034343698204090692516498605, + 21888242871839275222246405745257275088548364400416034343698204039735513277926, + 21888242871839275222246405745257275088548364400416034343698203867649091078820, + 21888242871839275222246405745257275088548364400416034343698204015937658055628, + 21888242871839275222246405745257275088548364400416034343698203784388235227182, + 21888242871839275222246405745257275088548364400416034343698203870981769147696, + 21888242871839275222246405745257275088548364400416034343698203870744270847592, + 21888242871839275222246405745257275088548364400416034343698203762331255186602, + 21888242871839275222246405745257275088548364400416034343698204131854199881738, + 371711407389285, + 82345711996769, + 82749881896961, + 78655986644624, + 21888242871839275222246405745257275088548364400416034343698203738688003587140, + 21888242871839275222246405745257275088548364400416034343698203734732446375231, + 255752308957661, + 435496905730171, + 273064375850833, + 176107202178441, + 21888242871839275222246405745257275088548364400416034343698203904162471118944, + 21888242871839275222246405745257275088548364400416034343698204063763339362778, + 459438322785740, + 21888242871839275222246405745257275088548364400416034343698203975974078405216, + 463651830547815, + 36576088185565, + 70011917706481, + 527619801314610, + 99574728558641, + 329153590041455, + 21888242871839275222246405745257275088548364400416034343698204103207504713312, + 21888242871839275222246405745257275088548364400416034343698204059866431657432, + 21888242871839275222246405745257275088548364400416034343698203688630551293713, + 21888242871839275222246405745257275088548364400416034343698203745598635416738, + 482748014286913, + 21888242871839275222246405745257275088548364400416034343698204028275275935242, + 202621282413165, + 479305187767011, + 21888242871839275222246405745257275088548364400416034343698203694286773836261, + 224064183424394, + 199261155957004, + 196371468650389, + 21888242871839275222246405745257275088548364400416034343698203815654594869699, + 21888242871839275222246405745257275088548364400416034343698204034778963644813, + 109373139347544, + 529940283114873, + 21888242871839275222246405745257275088548364400416034343698203784802988624266, + 30317698569463, + 145670235605335, + 21888242871839275222246405745257275088548364400416034343698203879749243806396, + 400689665905455, + 21888242871839275222246405745257275088548364400416034343698203974296055372857, + 21888242871839275222246405745257275088548364400416034343698204123662312881584, + 21888242871839275222246405745257275088548364400416034343698204017461130334828, + 234600001671553, + 21888242871839275222246405745257275088548364400416034343698203640712729988805, + 21888242871839275222246405745257275088548364400416034343698203680224146812848, + 306748469701745, + 21888242871839275222246405745257275088548364400416034343698203687757440432943, + 279997198991602, + 21888242871839275222246405745257275088548364400416034343698204135237580676107, + 199710165440772, + 415435155906407, + 32403463408207, + 219431289398985, + 459946011822556, + 540966264082470, + 394962788358773, + 21888242871839275222246405745257275088548364400416034343698203776283809373766, + 110427370266304, + 21888242871839275222246405745257275088548364400416034343698203859900027760397, + 21888242871839275222246405745257275088548364400416034343698203999681186433457, + 21888242871839275222246405745257275088548364400416034343698204062560879978340, + 34452811965699, + 98014058695118, + 502834232024100, + 398795455862483, + 407330535552722, + 21888242871839275222246405745257275088548364400416034343698204179645858503834, + 287298767118706, + 21888242871839275222246405745257275088548364400416034343698204067767313970608, + 21888242871839275222246405745257275088548364400416034343698204006892901228789, + 21888242871839275222246405745257275088548364400416034343698204099762533388959, + 95260818497476, + 162831169106804, + 21888242871839275222246405745257275088548364400416034343698203754728053328286, + 21888242871839275222246405745257275088548364400416034343698203762019386494590, + 981290525353, + 348027999385964, + 201624811489298, + 42596928256365, + 50869919264625, + 21888242871839275222246405745257275088548364400416034343698204040642329171877, + 64525322461405, + 224898238064930, + 21888242871839275222246405745257275088548364400416034343698203694713409388275, + 57970375073476, + 415709880955876, + 94181437127962, + 21888242871839275222246405745257275088548364400416034343698203648789061397011, + 527645129972401, + 21888242871839275222246405745257275088548364400416034343698203994708656079219, + 137034951490328, + 21888242871839275222246405745257275088548364400416034343698204183932006239993, + 21888242871839275222246405745257275088548364400416034343698204112695512554998, + 21888242871839275222246405745257275088548364400416034343698203662870894626403, + 200181077363206, + 187636930565766, + 406118326694441, + 21888242871839275222246405745257275088548364400416034343698204161445487915483, + 21888242871839275222246405745257275088548364400416034343698203726409412769914, + 21888242871839275222246405745257275088548364400416034343698203956904708211220, + 21888242871839275222246405745257275088548364400416034343698203763621860008477, + 21888242871839275222246405745257275088548364400416034343698203740721958872039, + 71597261196948, + 451945925782076, + 287977136898223, + 2194393358009, + 412510355975508, + 21888242871839275222246405745257275088548364400416034343698204070966489797783, + 141758845220494, + 551674891102353, + 295708151598904, + 269016252460963, + 21888242871839275222246405745257275088548364400416034343698204112952639381025, + 197522539265898, + 21888242871839275222246405745257275088548364400416034343698204065433986907354, + 21888242871839275222246405745257275088548364400416034343698203763086981799324, + 112764160160741, + 21888242871839275222246405745257275088548364400416034343698203675666853144614, + 362363033500493, + 21888242871839275222246405745257275088548364400416034343698204162446506181612, + 470521076364316, + 21888242871839275222246405745257275088548364400416034343698204015437680161808, + 21888242871839275222246405745257275088548364400416034343698203848771336893436, + 110245740016082, + 21888242871839275222246405745257275088548364400416034343698203644341949053552, + 21888242871839275222246405745257275088548364400416034343698204120514705955568, + 388133112308719, + 414085587069321, + 21888242871839275222246405745257275088548364400416034343698203811865434513027, + 560582038387952, + 492848054446247, + 23718909442404, + 21888242871839275222246405745257275088548364400416034343698203905137447583454, + 106679366407596, + 438401643027079, + 21888242871839275222246405745257275088548364400416034343698203637910982377682, + 112213499819815, + 348806310391485, + 158508106749696, + 21888242871839275222246405745257275088548364400416034343698203776228960683262, + 21888242871839275222246405745257275088548364400416034343698203717116145327608, + 70825781756613, + 21888242871839275222246405745257275088548364400416034343698203951059028765630, + 418904699953685, + 21888242871839275222246405745257275088548364400416034343698203873905198951396, + 508474394832631, + 21888242871839275222246405745257275088548364400416034343698203881295559223189, + 222951662701144, + 21888242871839275222246405745257275088548364400416034343698203867983247138379, + 21888242871839275222246405745257275088548364400416034343698203937894986580424, + 427884501687072, + 122642674571976, + 21888242871839275222246405745257275088548364400416034343698203957699767632246, + 191026947607529, + 284414986865546, + 166646467570700, + 21888242871839275222246405745257275088548364400416034343698203641129172273054, + 448152691531218, + 460465522472145, + 21888242871839275222246405745257275088548364400416034343698203939748848825593, + 21888242871839275222246405745257275088548364400416034343698204114926057145005, + 466922567183878, + 86946150852576, + 21888242871839275222246405745257275088548364400416034343698204019424630612211, + 154942191256778, + 21888242871839275222246405745257275088548364400416034343698203882880953205386, + 73949379168141, + 209643031815015, + 21888242871839275222246405745257275088548364400416034343698203928745317646440, + 21888242871839275222246405745257275088548364400416034343698204140257864857893, + 21888242871839275222246405745257275088548364400416034343698203965353901551294, + 21888242871839275222246405745257275088548364400416034343698203896957080566571, + 21888242871839275222246405745257275088548364400416034343698203858297022060980, + 130296236038882, + 368724947240373, + 539281492047547, + 21888242871839275222246405745257275088548364400416034343698203721587021704033, + 21888242871839275222246405745257275088548364400416034343698203706908450058982, + 21888242871839275222246405745257275088548364400416034343698203766461157376747, + 21888242871839275222246405745257275088548364400416034343698203930525856169060, + 21888242871839275222246405745257275088548364400416034343698203650105207379772, + 21888242871839275222246405745257275088548364400416034343698203737950291371839, + 118366347079086, + 218864414605210, + 21888242871839275222246405745257275088548364400416034343698203828065694047863, + 162237747386924, + 21888242871839275222246405745257275088548364400416034343698203831313754496894, + 131574767986341, + 21888242871839275222246405745257275088548364400416034343698204021790953508640, + 21888242871839275222246405745257275088548364400416034343698203656355457940361, + 142761309513672, + 21888242871839275222246405745257275088548364400416034343698203746170726187172, + 21888242871839275222246405745257275088548364400416034343698203916739723257007, + 21888242871839275222246405745257275088548364400416034343698204006198952532373, + 271326965220077, + 21888242871839275222246405745257275088548364400416034343698203717752847752706, + 21888242871839275222246405745257275088548364400416034343698204012534006701146, + 21888242871839275222246405745257275088548364400416034343698203963285789083676, + 254909734778283, + 246448330897298, + 21888242871839275222246405745257275088548364400416034343698203934438683629893, + 278357399636902, + 544986480110729, + 21888242871839275222246405745257275088548364400416034343698203810911264197849, + 21888242871839275222246405745257275088548364400416034343698204142911272241056, + 21888242871839275222246405745257275088548364400416034343698204098740705830306, + 21888242871839275222246405745257275088548364400416034343698204118334835317197, + 21888242871839275222246405745257275088548364400416034343698203913401077728949, + 21888242871839275222246405745257275088548364400416034343698203751033664762098, + 21888242871839275222246405745257275088548364400416034343698203675645520402457, + 451334259268636, + 383747426314560, + 309726669381722, + 519310689182915, + 21888242871839275222246405745257275088548364400416034343698203826637346451134, + 554103882596866, + 21888242871839275222246405745257275088548364400416034343698203840532687510713, + 21888242871839275222246405745257275088548364400416034343698203861394280015620, + 429940072165206, + 21888242871839275222246405745257275088548364400416034343698203928989816805972, + 174457620724712, + 33450320212893, + 21888242871839275222246405745257275088548364400416034343698204063650844631755, + 51862255213553, + 21888242871839275222246405745257275088548364400416034343698203850962960695450, + 21888242871839275222246405745257275088548364400416034343698203804036589362562, + 126670823733111, + 21888242871839275222246405745257275088548364400416034343698204173443039753298, + 21888242871839275222246405745257275088548364400416034343698203846865504221496, + 21888242871839275222246405745257275088548364400416034343698203818247888900572, + 21888242871839275222246405745257275088548364400416034343698203981321638472914, + 21888242871839275222246405745257275088548364400416034343698203943996313872996, + 21888242871839275222246405745257275088548364400416034343698203809056302555808, + 330151723038992, + 395185336545716, + 1577950405986, + 21888242871839275222246405745257275088548364400416034343698203807369659516392, + 432465455841593, + 21888242871839275222246405745257275088548364400416034343698204087181349555758, + 21888242871839275222246405745257275088548364400416034343698204097234320393071, + 21888242871839275222246405745257275088548364400416034343698204091560733149172, + 526829698653745, + 21888242871839275222246405745257275088548364400416034343698203889793048620037, + 439793427389648, + 21888242871839275222246405745257275088548364400416034343698204050992134605031, + 516095062767028, + 52237073987291, + 21888242871839275222246405745257275088548364400416034343698203896809226460730, + 524354769233289, + 21888242871839275222246405745257275088548364400416034343698204066136541182699, + 21888242871839275222246405745257275088548364400416034343698203834637740392601, + 21888242871839275222246405745257275088548364400416034343698204009732230654141, + 195387037638765, + 545040299772497, + 21888242871839275222246405745257275088548364400416034343698203685889334603165, + 21888242871839275222246405745257275088548364400416034343698203806277112456598, + 354853238991246, + 347936900261973, + 313193471952338, + 21888242871839275222246405745257275088548364400416034343698203769228155874658, + 90739151691188, + 21888242871839275222246405745257275088548364400416034343698204097484091660233, + 21888242871839275222246405745257275088548364400416034343698203968869328140496, + 172081826745927, + 21888242871839275222246405745257275088548364400416034343698203680499467308944, + 21888242871839275222246405745257275088548364400416034343698203966813459842782, + 387413988418532, + 275698093173170, + 21888242871839275222246405745257275088548364400416034343698203975873567769107, + 197097558397120, + 70167336079615, + 21888242871839275222246405745257275088548364400416034343698203676729241163441, + 21888242871839275222246405745257275088548364400416034343698204087354027288578, + 526508377953535, + 476713095314794, + 156614342355614, + 21888242871839275222246405745257275088548364400416034343698204023811878143636, + 297576714392271, + 74432698181392, + 56114058686565, + 21888242871839275222246405745257275088548364400416034343698203881405052934111, + 92180627050590, + 428819201409030, + 401074105847507, + 457903013989456, + 21888242871839275222246405745257275088548364400416034343698203916811774435416, + 515058054022187, + 21888242871839275222246405745257275088548364400416034343698204076963104008707, + 21888242871839275222246405745257275088548364400416034343698203624448419555108, + 402570052399763, + 209625854968598, + 21888242871839275222246405745257275088548364400416034343698203658513176231211, + 22812750418413, + 21888242871839275222246405745257275088548364400416034343698203702727681715448, + 21888242871839275222246405745257275088548364400416034343698203813933734556543, + 413909870938102, + 21888242871839275222246405745257275088548364400416034343698203901161802440688, + 22647164206835, + 21888242871839275222246405745257275088548364400416034343698203993055235929744, + 21888242871839275222246405745257275088548364400416034343698203984634950856955, + 44946111370500, + 95115570063739, + 202809164086291, + 21888242871839275222246405745257275088548364400416034343698204107880411325249, + 21888242871839275222246405745257275088548364400416034343698203653952804264845, + 21888242871839275222246405745257275088548364400416034343698203901595532874316, + 21888242871839275222246405745257275088548364400416034343698203885248790908729, + 21888242871839275222246405745257275088548364400416034343698203920241141210204, + 21888242871839275222246405745257275088548364400416034343698203718366428491283, + 21888242871839275222246405745257275088548364400416034343698203770784480142862, + 21888242871839275222246405745257275088548364400416034343698204038375952858519, + 21888242871839275222246405745257275088548364400416034343698203681358573622669, + 21888242871839275222246405745257275088548364400416034343698203954270449666657, + 21888242871839275222246405745257275088548364400416034343698204099529138178268, + 501437976635721, + 197746701700880, + 152238364700828, + 251750392844827, + 21888242871839275222246405745257275088548364400416034343698204094106842468877, + 397981993710252, + 198214752566911, + 21888242871839275222246405745257275088548364400416034343698204021049863699446, + 71521850446143, + 396278314575002, + 21888242871839275222246405745257275088548364400416034343698203972254962777019, + 21888242871839275222246405745257275088548364400416034343698203771141233018648, + 21888242871839275222246405745257275088548364400416034343698203854314629087069, + 21888242871839275222246405745257275088548364400416034343698203773316774645823, + 201942110371950, + 21888242871839275222246405745257275088548364400416034343698204136793501255781, + 21888242871839275222246405745257275088548364400416034343698203991611012813337, + 21888242871839275222246405745257275088548364400416034343698204020072393155646, + 21888242871839275222246405745257275088548364400416034343698204077263726752013, + 441101074574142, + 223993691370470, + 242843599994633, + 21888242871839275222246405745257275088548364400416034343698203845694758701073, + 9282352628817, + 21888242871839275222246405745257275088548364400416034343698204080919699533084, + 274527217317714, + 69800609526766, + 390574003365584, + 346196216658178, + 21888242871839275222246405745257275088548364400416034343698203703672491507434, + 412042262517261, + 244194891914390, + 527725739969293, + 21888242871839275222246405745257275088548364400416034343698203897138363762449, + 139604014073204, + 21888242871839275222246405745257275088548364400416034343698203659284595730011, + 120636680326794, + 57856525662167, + 21888242871839275222246405745257275088548364400416034343698204060716962164096, + 21888242871839275222246405745257275088548364400416034343698203988583775035617, + 21888242871839275222246405745257275088548364400416034343698203847990685132966, + 174253984254531, + 180839135076536, + 21888242871839275222246405745257275088548364400416034343698203838654393157563, + 21888242871839275222246405745257275088548364400416034343698204092074637890341, + 21888242871839275222246405745257275088548364400416034343698204061023010389354, + 146314994929315, + 21888242871839275222246405745257275088548364400416034343698203697669668488049, + 21888242871839275222246405745257275088548364400416034343698203633674152526220, + 516023722036925, + 21888242871839275222246405745257275088548364400416034343698203801168523725297, + 21888242871839275222246405745257275088548364400416034343698203750774222135286, + 21888242871839275222246405745257275088548364400416034343698203948911631275212, + 21888242871839275222246405745257275088548364400416034343698203732186835488011, + 372385318663942, + 21888242871839275222246405745257275088548364400416034343698203726727620460811, + 21888242871839275222246405745257275088548364400416034343698203755269986760310, + 21888242871839275222246405745257275088548364400416034343698203645316347245698, + 21888242871839275222246405745257275088548364400416034343698203825751557534224, + 21888242871839275222246405745257275088548364400416034343698203647947740840228, + 21888242871839275222246405745257275088548364400416034343698204164327054187410, + 308031364642866, + 54629461813506, + 14807572826792, + 21888242871839275222246405745257275088548364400416034343698204082471820953557, + 93512755586923, + 21888242871839275222246405745257275088548364400416034343698204133647327410627, + 130923782343799, + 21888242871839275222246405745257275088548364400416034343698203935904398390899, + 346640848661013, + 353058769184318, + 12671178893049, + 5953755763414, + 21888242871839275222246405745257275088548364400416034343698204070876721690059, + 21888242871839275222246405745257275088548364400416034343698203843038816114325, + 258745882194173, + 512260820027182, + 338958133589701, + 248279801796879, + 21888242871839275222246405745257275088548364400416034343698203813783224873839, + 21888242871839275222246405745257275088548364400416034343698204064049210558630, + 374109781330914, + 21888242871839275222246405745257275088548364400416034343698204106280318581270, + 433338223582387, + 130668886873313, + 21888242871839275222246405745257275088548364400416034343698203879804301498692, + 21888242871839275222246405745257275088548364400416034343698203697550848475478, + 21888242871839275222246405745257275088548364400416034343698203915652112701326, + 21888242871839275222246405745257275088548364400416034343698203795575250129556, + 236427476180835, + 518043319229512, + 6581926401587, + 21888242871839275222246405745257275088548364400416034343698203960594468447938, + 21888242871839275222246405745257275088548364400416034343698204028004954707875, + 21888242871839275222246405745257275088548364400416034343698204176150748465307, + 21888242871839275222246405745257275088548364400416034343698203655731148954585, + 423530288393395, + 21888242871839275222246405745257275088548364400416034343698204105583664744500, + 289470251123987, + 135525371034502, + 475353775653616, + 21888242871839275222246405745257275088548364400416034343698203750094838895855, + 21888242871839275222246405745257275088548364400416034343698204050359182917765, + 21888242871839275222246405745257275088548364400416034343698203754115526686521, + 21888242871839275222246405745257275088548364400416034343698203680560954927425, + 60565431490922, + 237210278012103, + 53199215753934, + 481279982046811, + 114954266825429, + 21888242871839275222246405745257275088548364400416034343698203796470254786857, + 514207510362813, + 21888242871839275222246405745257275088548364400416034343698203951019519662992, + 296591053209952, + 410316897592432, + 21888242871839275222246405745257275088548364400416034343698203723583758162538, + 483168755318704, + 94292717972602, + 21888242871839275222246405745257275088548364400416034343698203685941843914974, + 21888242871839275222246405745257275088548364400416034343698204140214549294982, + 280252382980720, + 21888242871839275222246405745257275088548364400416034343698203704178055887365, + 283986734639494, + 201770656600096, + 21888242871839275222246405745257275088548364400416034343698204141604163418798, + 21888242871839275222246405745257275088548364400416034343698204103681749091106, + 21888242871839275222246405745257275088548364400416034343698203640084940230145, + 21888242871839275222246405745257275088548364400416034343698203944694461529146, + 550926299420195, + 229047461818375, + 302173036055104, + 389925840752589, + 21888242871839275222246405745257275088548364400416034343698204169932712547840, + 389140398014277, + 21888242871839275222246405745257275088548364400416034343698203627607645552988, + 367674048562596, + 523102630640342, + 205492274660267, + 21888242871839275222246405745257275088548364400416034343698203660605159701414, + 21888242871839275222246405745257275088548364400416034343698204068239643452461, + 346220744495915, + 548437734991833, + 152505615718113, + 546019018823199, + 383668210165381, + 21888242871839275222246405745257275088548364400416034343698204061747369973062, + 21888242871839275222246405745257275088548364400416034343698203957030590465138, + 336130920219288, + 283131120329863, + 212772636765483, + 21888242871839275222246405745257275088548364400416034343698203769209915324743, + 21888242871839275222246405745257275088548364400416034343698203920397154459461, + 21888242871839275222246405745257275088548364400416034343698203993911977077717, + 382770446204254, + 21888242871839275222246405745257275088548364400416034343698203989963736246999, + 506451620891177, + 21888242871839275222246405745257275088548364400416034343698203848110217141145, + 21888242871839275222246405745257275088548364400416034343698204076209746030961, + 21888242871839275222246405745257275088548364400416034343698204172459309749746, + 548341902139004, + 21888242871839275222246405745257275088548364400416034343698203998179750787804, + 21888242871839275222246405745257275088548364400416034343698203733096934102335, + 73412694537813, + 21888242871839275222246405745257275088548364400416034343698203884167926526969, + 178480855262677, + 21888242871839275222246405745257275088548364400416034343698203766205939269687, + 283532760171978, + 167426081274322, + 21888242871839275222246405745257275088548364400416034343698204028328323247750, + 328506046522990, + 391535541187651, + 21888242871839275222246405745257275088548364400416034343698203819050355953937, + 550263367810865, + 21888242871839275222246405745257275088548364400416034343698203942989073756876, + 21888242871839275222246405745257275088548364400416034343698204143034599355918, + 364757352391412, + 221492544042472, + 21888242871839275222246405745257275088548364400416034343698204178367843422153, + 21888242871839275222246405745257275088548364400416034343698203635009757037052, + 556897764300832, + 21888242871839275222246405745257275088548364400416034343698204034530969620713, + 386903617219321, + 27789369492183, + 367883549167497, + 21888242871839275222246405745257275088548364400416034343698203843468369882576, + 21888242871839275222246405745257275088548364400416034343698204099981237350454, + 42938359350684, + 404680456134092, + 21888242871839275222246405745257275088548364400416034343698203758121440700239, + 21888242871839275222246405745257275088548364400416034343698203637472344483885, + 505468258516833, + 21888242871839275222246405745257275088548364400416034343698203641165323240531, + 21888242871839275222246405745257275088548364400416034343698203656995738818530, + 10012152260822, + 444234402265446, + 21888242871839275222246405745257275088548364400416034343698203905114351484519, + 21888242871839275222246405745257275088548364400416034343698203754963607267837, + 396424105828795, + 104064193346627, + 145374681497952, + 21888242871839275222246405745257275088548364400416034343698203892256614682566, + 21888242871839275222246405745257275088548364400416034343698203921683798978560, + 166109845360615, + 39415984714109, + 287178312333432, + 21888242871839275222246405745257275088548364400416034343698203659136047329000, + 172850790612978, + 21888242871839275222246405745257275088548364400416034343698203674536184321018, + 21888242871839275222246405745257275088548364400416034343698203669673928757101, + 21888242871839275222246405745257275088548364400416034343698203936908344947807, + 327752201907756, + 21888242871839275222246405745257275088548364400416034343698204083660461409629, + 181757174602946, + 452639066831555, + 314442777206076, + 261995536493717, + 21888242871839275222246405745257275088548364400416034343698203640521193243502, + 388705348316816, + 21888242871839275222246405745257275088548364400416034343698203930113049477520, + 49432150820099, + 21888242871839275222246405745257275088548364400416034343698204110568504475535, + 21888242871839275222246405745257275088548364400416034343698204087269277327491, + 324679222490750, + 21888242871839275222246405745257275088548364400416034343698203798240747219532, + 80581080678395, + 122843410139151, + 93278057679108, + 21888242871839275222246405745257275088548364400416034343698203849775317370744, + 21888242871839275222246405745257275088548364400416034343698203939421954133811, + 21888242871839275222246405745257275088548364400416034343698203778331924534661, + 21888242871839275222246405745257275088548364400416034343698204079421496758990, + 484843729969028, + 560455830002795, + 91162405697067, + 21888242871839275222246405745257275088548364400416034343698203944610311913904, + 21888242871839275222246405745257275088548364400416034343698204071932466360693, + 327105718717839, + 7298835901179, + 21888242871839275222246405745257275088548364400416034343698203624584254368720, + 21888242871839275222246405745257275088548364400416034343698204129243135666042, + 21888242871839275222246405745257275088548364400416034343698204154932442286273, + 32662156989972, + 21888242871839275222246405745257275088548364400416034343698203769117042497494, + 164127531525460, + 21888242871839275222246405745257275088548364400416034343698204104958513439729, + 206943365997169, + 21888242871839275222246405745257275088548364400416034343698204168508642069897, + 435562754714137, + 63498098359388, + 21888242871839275222246405745257275088548364400416034343698203989572072135119, + 179743602350913, + 305254268084011, + 365584415311530, + 508443963495097, + 21888242871839275222246405745257275088548364400416034343698203868382984881416, + 441743210042043, + 464286919073293, + 372886985338739, + 335674603860131, + 467978161402539, + 21888242871839275222246405745257275088548364400416034343698203860163352338876, + 435304378094927, + 303523251893856, + 21888242871839275222246405745257275088548364400416034343698203691679427395494, + 21888242871839275222246405745257275088548364400416034343698204047606601541906, + 530809996810650, + 19434816863255, + 21888242871839275222246405745257275088548364400416034343698203703181293060282, + 21888242871839275222246405745257275088548364400416034343698204131296971961376, + 257235123916749, + 397750665191801, + 21888242871839275222246405745257275088548364400416034343698204007503415154879, + 416685340921327, + 63278720061097, + 21888242871839275222246405745257275088548364400416034343698204081310535840584, + 12310754542935, + 279355410520618, + 533378054692443, + 164520339863510, + 276416216401751, + 414355339946591, + 138639423078754, + 27515191159063, + 21888242871839275222246405745257275088548364400416034343698203645881591403092, + 21888242871839275222246405745257275088548364400416034343698204181779080212148, + 21888242871839275222246405745257275088548364400416034343698204095078090473510, + 21888242871839275222246405745257275088548364400416034343698204120945513017357, + 21888242871839275222246405745257275088548364400416034343698203779209119621954, + 21888242871839275222246405745257275088548364400416034343698203700420984641735, + 497812538609695, + 21888242871839275222246405745257275088548364400416034343698204167730735549367, + 390527307382244, + 30665888987436, + 47386079300607, + 323919202256217, + 67671980245828, + 124388351826313, + 267090855372852, + 21888242871839275222246405745257275088548364400416034343698203988267174293553, + 21888242871839275222246405745257275088548364400416034343698204042741873973263, + 503539669086784, + 21888242871839275222246405745257275088548364400416034343698204047888840292977, + 335258252021537, + 21888242871839275222246405745257275088548364400416034343698203689900944483683, + 312733488664721, + 403745467236349, + 403121859987599, + 21888242871839275222246405745257275088548364400416034343698204132739603860042, + 172233408342939, + 21888242871839275222246405745257275088548364400416034343698204056401573207009, + 21888242871839275222246405745257275088548364400416034343698204161753820319736, + 21888242871839275222246405745257275088548364400416034343698203821355906736787, + 542467877154356, + 337540031401746, + 21888242871839275222246405745257275088548364400416034343698204148783075560095, + 21888242871839275222246405745257275088548364400416034343698203679402427479290, + 283251647699866, + 45061760219739, + 444093273371750, + 21888242871839275222246405745257275088548364400416034343698204036582711532727, + 455721184608892, + 217070213800970, + 21888242871839275222246405745257275088548364400416034343698203868069707889320, + 21888242871839275222246405745257275088548364400416034343698204041197824745618, + 436098746057022, + 416022670044810, + 217228687516255, + 21888242871839275222246405745257275088548364400416034343698204149911044178394, + 21888242871839275222246405745257275088548364400416034343698203916692127154163, + 21888242871839275222246405745257275088548364400416034343698204001226442167115, + 60262123595238, + 21888242871839275222246405745257275088548364400416034343698204038162148338247, + 312472325995824, + 21888242871839275222246405745257275088548364400416034343698203727985272328951, + 21888242871839275222246405745257275088548364400416034343698203917967281899154, + 21888242871839275222246405745257275088548364400416034343698203685580306518106, + 21888242871839275222246405745257275088548364400416034343698204155394121288117, + 21888242871839275222246405745257275088548364400416034343698204122262562231895, + 21888242871839275222246405745257275088548364400416034343698203730577984721855, + 21888242871839275222246405745257275088548364400416034343698203675517606159751, + 21888242871839275222246405745257275088548364400416034343698204083204639443784, + 8238116783598, + 21888242871839275222246405745257275088548364400416034343698203817077122312338, + 398969362897224, + 510196367735010, + 21888242871839275222246405745257275088548364400416034343698203746966564431928, + 84689387108072, + 486314695657957, + 21888242871839275222246405745257275088548364400416034343698204111398060436377, + 21888242871839275222246405745257275088548364400416034343698204023090253924076, + 21888242871839275222246405745257275088548364400416034343698203651336301326208, + 220928093398075, + 21888242871839275222246405745257275088548364400416034343698203837402515151028, + 21888242871839275222246405745257275088548364400416034343698203645797665490012, + 21888242871839275222246405745257275088548364400416034343698203890040576309121, + 21888242871839275222246405745257275088548364400416034343698203663022658745110, + 89649223751551, + 21888242871839275222246405745257275088548364400416034343698203642796958729740, + 39233158356993, + 290985314032915, + 8067397047185, + 21888242871839275222246405745257275088548364400416034343698203739931451211939, + 540870171541595, + 38326811895375, + 82242042022540, + 268494636131442, + 21888242871839275222246405745257275088548364400416034343698203812499820620457, + 426181113196573, + 323468990841361, + 133918079232359, + 21888242871839275222246405745257275088548364400416034343698203897381516995430, + 284463138870177, + 353745216495960, + 21888242871839275222246405745257275088548364400416034343698203837776641873827, + 21888242871839275222246405745257275088548364400416034343698204101057894832372, + 360021196821266, + 414996623628252, + 21888242871839275222246405745257275088548364400416034343698203667530205073605, + 73884186318905, + 21888242871839275222246405745257275088548364400416034343698204024579469654949, + 21888242871839275222246405745257275088548364400416034343698204143862033787294, + 21888242871839275222246405745257275088548364400416034343698203737381767726276, + 21888242871839275222246405745257275088548364400416034343698204119757305321571, + 277670090540556, + 21888242871839275222246405745257275088548364400416034343698203795005537370352, + 491101984086987, + 320140194395559, + 21888242871839275222246405745257275088548364400416034343698203954649147118640, + 86902184608449, + 21888242871839275222246405745257275088548364400416034343698204141485340304709, + 503869053323590, + 21888242871839275222246405745257275088548364400416034343698203836094825903060, + 21888242871839275222246405745257275088548364400416034343698203925147122884021, + 288234264929541, + 529101978002217, + 21888242871839275222246405745257275088548364400416034343698203629026722557007, + 242768606101603, + 302423484068847, + 110144090791853, + 526216045944849, + 500395885242562, + 21888242871839275222246405745257275088548364400416034343698203762671448291103, + 379787862931701, + 76820930366948, + 21888242871839275222246405745257275088548364400416034343698203790643397102710, + 7628193301747, + 388056341505250, + 118891153212562, + 21888242871839275222246405745257275088548364400416034343698203935757983732808, + 134305852113574, + 21888242871839275222246405745257275088548364400416034343698204154538402593643, + 513626554494692, + 21888242871839275222246405745257275088548364400416034343698203934032087432168, + 108392510022928, + 21888242871839275222246405745257275088548364400416034343698204142301575982289, + 21888242871839275222246405745257275088548364400416034343698203735481103027962, + 72140244782801, + 253453796547212, + 21888242871839275222246405745257275088548364400416034343698203929553399163070, + 21888242871839275222246405745257275088548364400416034343698203928477634254172, + 21888242871839275222246405745257275088548364400416034343698203991640534281938, + 21888242871839275222246405745257275088548364400416034343698203743038247687586, + 21888242871839275222246405745257275088548364400416034343698203772078439829142, + 407319645861116, + 345053241547535, + 471108435083558, + 21888242871839275222246405745257275088548364400416034343698204001581940471296, + 21888242871839275222246405745257275088548364400416034343698203854407461670941, + 21888242871839275222246405745257275088548364400416034343698204168971360428254, + 21888242871839275222246405745257275088548364400416034343698203647080552623399, + 346185591228855, + 21888242871839275222246405745257275088548364400416034343698204030648152469709, + 233824975445132, + 204887659791434, + 140911434756802, + 21888242871839275222246405745257275088548364400416034343698203814095419613113, + 411152724849601, + 408621248413941, + 21888242871839275222246405745257275088548364400416034343698203706931162554803, + 522828698274928, + 32112284378483, + 313849137339503, + 21888242871839275222246405745257275088548364400416034343698203791830628383373, + 21888242871839275222246405745257275088548364400416034343698204091782723095979, + 21888242871839275222246405745257275088548364400416034343698203843122695725334, + 120282358757180, + 373485911012516, + 226054952629264, + 21888242871839275222246405745257275088548364400416034343698203767572694391217, + 258998031442206, + 21888242871839275222246405745257275088548364400416034343698203964045727955551, + 21888242871839275222246405745257275088548364400416034343698204082380056110864, + 21888242871839275222246405745257275088548364400416034343698203861563709371108, + 448204497625151, + 21888242871839275222246405745257275088548364400416034343698204122990699375319, + 21888242871839275222246405745257275088548364400416034343698203966431124868684, + 21888242871839275222246405745257275088548364400416034343698204033460961848038, + 21888242871839275222246405745257275088548364400416034343698203900548589511774, + 21888242871839275222246405745257275088548364400416034343698203915874301012577, + 21888242871839275222246405745257275088548364400416034343698203946691598534811, + 21888242871839275222246405745257275088548364400416034343698203664217112456406, + 21888242871839275222246405745257275088548364400416034343698203790073828318725, + 21888242871839275222246405745257275088548364400416034343698204029188639138104, + 365042889012696, + 152517397348056, + 95682463317339, + 160337271019666, + 238524200230800, + 177011070951639, + 21888242871839275222246405745257275088548364400416034343698203915369880551459, + 544400370779595, + 21888242871839275222246405745257275088548364400416034343698204101597331049827, + 21888242871839275222246405745257275088548364400416034343698203638547841144687, + 244859711736283, + 21888242871839275222246405745257275088548364400416034343698204034386931712505, + 256978732942888, + 21888242871839275222246405745257275088548364400416034343698203696997699096165, + 560625887864698, + 416395333688115, + 458001710836870, + 534580320604888, + 21888242871839275222246405745257275088548364400416034343698203906197688437736, + 234660600652746, + 294961286775116, + 21888242871839275222246405745257275088548364400416034343698203974729699107459, + 102215626537448, + 21888242871839275222246405745257275088548364400416034343698204149880140606155, + 21888242871839275222246405745257275088548364400416034343698203818357920051025, + 21888242871839275222246405745257275088548364400416034343698203755308199561075, + 308881749335642, + 34998967054224, + 36765849673282, + 21888242871839275222246405745257275088548364400416034343698204030827446351894, + 21888242871839275222246405745257275088548364400416034343698204162100033244999, + 253405271606913, + 276180410347143, + 21888242871839275222246405745257275088548364400416034343698203758374515747312, + 276754294067808, + 21888242871839275222246405745257275088548364400416034343698203827938323932598, + 21888242871839275222246405745257275088548364400416034343698204159323708784659, + 21888242871839275222246405745257275088548364400416034343698203772189364462620, + 21888242871839275222246405745257275088548364400416034343698203763966594554552, + 294652531769916, + 486587173757986, + 442758965970125, + 21888242871839275222246405745257275088548364400416034343698203863356735186209, + 21888242871839275222246405745257275088548364400416034343698204048831262095419, + 131481014655096, + 21888242871839275222246405745257275088548364400416034343698204068210659754915, + 21888242871839275222246405745257275088548364400416034343698203889779915531434, + 21888242871839275222246405745257275088548364400416034343698203948118592042035, + 369119225182297, + 21888242871839275222246405745257275088548364400416034343698203935677717426231, + 21888242871839275222246405745257275088548364400416034343698203802603866435888, + 21888242871839275222246405745257275088548364400416034343698204050684286718211, + 121848816113521, + 21888242871839275222246405745257275088548364400416034343698204142551146813695, + 21888242871839275222246405745257275088548364400416034343698203822065167534562, + 21888242871839275222246405745257275088548364400416034343698203915212380194598, + 21888242871839275222246405745257275088548364400416034343698203959912275536416, + 21888242871839275222246405745257275088548364400416034343698204174304661981451, + 21888242871839275222246405745257275088548364400416034343698204127398441609509, + 295964940543201, + 21888242871839275222246405745257275088548364400416034343698204019204135914370, + 21888242871839275222246405745257275088548364400416034343698204171155306503751, + 21888242871839275222246405745257275088548364400416034343698203711288228061720, + 21888242871839275222246405745257275088548364400416034343698204032139553535710, + 207250895453022, + 290583253383872, + 21888242871839275222246405745257275088548364400416034343698203918705660304491, + 21888242871839275222246405745257275088548364400416034343698203764290091834459, + 21888242871839275222246405745257275088548364400416034343698203786103009472792, + 13473194445034, + 322257437372481, + 403478401825731, + 557634192532909, + 385227631450159, + 21888242871839275222246405745257275088548364400416034343698203910925219008963, + 139251909477933, + 483520279131695, + 21888242871839275222246405745257275088548364400416034343698204133812786839540, + 540773007719249, + 56090824334217, + 21888242871839275222246405745257275088548364400416034343698204164239328187852, + 121673810561714, + 158659929889849, + 450074211492242, + 21888242871839275222246405745257275088548364400416034343698203987120516150056, + 11478511189648, + 92334060811877, + 120295476656513, + 21888242871839275222246405745257275088548364400416034343698203774097758681350, + 21888242871839275222246405745257275088548364400416034343698203883251368598951, + 234937051293803, + 21888242871839275222246405745257275088548364400416034343698203714116121663602, + 521437128542030, + 342223373835481, + 21888242871839275222246405745257275088548364400416034343698203877497224853678, + 21888242871839275222246405745257275088548364400416034343698203794324595907524, + 21888242871839275222246405745257275088548364400416034343698203677785056256301, + 21888242871839275222246405745257275088548364400416034343698203717211685473203, + 21888242871839275222246405745257275088548364400416034343698203840657889281651, + 21888242871839275222246405745257275088548364400416034343698204071942465675848, + 21888242871839275222246405745257275088548364400416034343698204150383864888047, + 21888242871839275222246405745257275088548364400416034343698203837633473066080, + 21888242871839275222246405745257275088548364400416034343698203809555084002871, + 354135575726209, + 21888242871839275222246405745257275088548364400416034343698204083990378518058, + 293295951722587, + 21888242871839275222246405745257275088548364400416034343698204031749139755314, + 443165649069208, + 547766406614428, + 21888242871839275222246405745257275088548364400416034343698204107658820407408, + 467842788192344, + 277309428503919, + 21888242871839275222246405745257275088548364400416034343698204167646364244577, + 21888242871839275222246405745257275088548364400416034343698203954230577079640, + 21888242871839275222246405745257275088548364400416034343698203993168815312034, + 377278298265467, + 21888242871839275222246405745257275088548364400416034343698203653412730951838, + 21888242871839275222246405745257275088548364400416034343698203681627044959878, + 202935321428283, + 21888242871839275222246405745257275088548364400416034343698204147428447172860, + 52490535972652, + 21888242871839275222246405745257275088548364400416034343698203751095651704618, + 243401285848518, + 21888242871839275222246405745257275088548364400416034343698204105486312825897, + 21888242871839275222246405745257275088548364400416034343698203916069770884113, + 21888242871839275222246405745257275088548364400416034343698203679492671658231, + 21888242871839275222246405745257275088548364400416034343698203923008924823728, + 389375087241687, + 192443165097415, + 200139691312498, + 21888242871839275222246405745257275088548364400416034343698203813398065854756, + 21888242871839275222246405745257275088548364400416034343698203693790937162484, + 532126750786802, + 21888242871839275222246405745257275088548364400416034343698203998643529454257, + 497529267269674, + 285646746417983, + 21888242871839275222246405745257275088548364400416034343698204154176211483660, + 217075874122508, + 21888242871839275222246405745257275088548364400416034343698203741919374509833, + 174043047520316, + 21888242871839275222246405745257275088548364400416034343698204092060306586775, + 542015809455278, + 21888242871839275222246405745257275088548364400416034343698204090803492909786, + 21888242871839275222246405745257275088548364400416034343698203896217672118655, + 21888242871839275222246405745257275088548364400416034343698203935975736895465, + 238473471957756, + 21888242871839275222246405745257275088548364400416034343698203896093099419031, + 21888242871839275222246405745257275088548364400416034343698203983263150139025, + 21888242871839275222246405745257275088548364400416034343698203707428512104393, + 21888242871839275222246405745257275088548364400416034343698203672753318495349, + 448848004536802, + 264370056162717, + 21888242871839275222246405745257275088548364400416034343698203705254735621787, + 21888242871839275222246405745257275088548364400416034343698204106386796104700, + 21888242871839275222246405745257275088548364400416034343698204114487205944075, + 328100675000164, + 290244774663377, + 271810994237581, + 471032120233807, + 21888242871839275222246405745257275088548364400416034343698203971569995083640, + 21888242871839275222246405745257275088548364400416034343698204113188367041644, + 21888242871839275222246405745257275088548364400416034343698203803946611429474, + 288162928922487, + 283677508055677, + 170156426436935, + 185658892127850, + 21888242871839275222246405745257275088548364400416034343698203640585647412858, + 21888242871839275222246405745257275088548364400416034343698204018024377980360, + 557372362470295, + 501985524879233, + 330099188609070, + 21888242871839275222246405745257275088548364400416034343698203817071408871353, + 21888242871839275222246405745257275088548364400416034343698204081977418428997, + 21888242871839275222246405745257275088548364400416034343698204068293980862273, + 463994482590384, + 21888242871839275222246405745257275088548364400416034343698204175574263814470, + 21888242871839275222246405745257275088548364400416034343698203811711776612517, + 21888242871839275222246405745257275088548364400416034343698204117236923333544, + 21888242871839275222246405745257275088548364400416034343698203969979032475903, + 281588015764920, + 21888242871839275222246405745257275088548364400416034343698203704565839516966, + 21888242871839275222246405745257275088548364400416034343698203782807068979470, + 264635145683993, + 21888242871839275222246405745257275088548364400416034343698203960123647686926, + 308472018682875, + 532698843706673, + 21888242871839275222246405745257275088548364400416034343698203917257148150824, + 21888242871839275222246405745257275088548364400416034343698203700252608462722, + 268474959265574, + 21888242871839275222246405745257275088548364400416034343698203624826174867104, + 122847920801771, + 449006128939196, + 226414311984976, + 332499371506506, + 266318455842874, + 21888242871839275222246405745257275088548364400416034343698203730792542651719, + 387298406977033, + 332245591324028, + 76842667103800, + 21888242871839275222246405745257275088548364400416034343698204135012984327991, + 21888242871839275222246405745257275088548364400416034343698203656243381666721, + 21888242871839275222246405745257275088548364400416034343698204108015227496107, + 208153986166328, + 21888242871839275222246405745257275088548364400416034343698204185995723911593, + 21888242871839275222246405745257275088548364400416034343698204140214373592711, + 21888242871839275222246405745257275088548364400416034343698203813766162103039, + 381546805185615, + 415713596792638, + 227626994353173, + 322838554074226, + 64212254599951, + 246905046298463, + 149541152884391, + 148886286799004, + 21888242871839275222246405745257275088548364400416034343698203750362988683637, + 27489738574096, + 253666908809510, + 21888242871839275222246405745257275088548364400416034343698204114354723008888, + 93209361281168, + 418601472309678, + 21888242871839275222246405745257275088548364400416034343698203924553698797017, + 554421706468339, + 21888242871839275222246405745257275088548364400416034343698203832401341709082, + 21888242871839275222246405745257275088548364400416034343698203724843006551266, + 21888242871839275222246405745257275088548364400416034343698203975742521861332, + 21888242871839275222246405745257275088548364400416034343698203638177904197132, + 21888242871839275222246405745257275088548364400416034343698203947657406309984, + 438437338219309, + 21888242871839275222246405745257275088548364400416034343698203882929878532616, + 401884380692523, + 21888242871839275222246405745257275088548364400416034343698203783196269238786, + 21888242871839275222246405745257275088548364400416034343698203879277136709705, + 378794698778658, + 21888242871839275222246405745257275088548364400416034343698204119770353240131, + 164924469095811, + 327856279041258, + 543302904037307, + 105615937867467, + 311770045742672, + 21888242871839275222246405745257275088548364400416034343698204066528748460375, + 300763871392796, + 107721772392315, + 83350251678735, + 21888242871839275222246405745257275088548364400416034343698203656421083986346, + 21888242871839275222246405745257275088548364400416034343698203685842622225957, + 307984802143880, + 463076209324827, + 114287078846071, + 21888242871839275222246405745257275088548364400416034343698204067285428246544, + 501202630582347, + 164716416989799, + 140414583666352, + 527991014978056, + 21888242871839275222246405745257275088548364400416034343698203858097551761405, + 21888242871839275222246405745257275088548364400416034343698203993418271564048, + 532977558329839, + 5020190557459, + 21888242871839275222246405745257275088548364400416034343698203984724115621169, + 225272576434036, + 500760547970040, + 305063831298017, + 485319291913389, + 21888242871839275222246405745257275088548364400416034343698203878409173350398, + 67615429226900, + 247387691268580, + 21888242871839275222246405745257275088548364400416034343698204145083886311669, + 21888242871839275222246405745257275088548364400416034343698203885525403054141, + 21888242871839275222246405745257275088548364400416034343698203778534635895573, + 21888242871839275222246405745257275088548364400416034343698203887905560835098, + 313182817138102, + 21888242871839275222246405745257275088548364400416034343698203758260826380224, + 21888242871839275222246405745257275088548364400416034343698204067299128457850, + 200003557843986, + 21888242871839275222246405745257275088548364400416034343698203664980583218360, + 3152634157889, + 180935042809688, + 21888242871839275222246405745257275088548364400416034343698203793740829136518, + 214418684554131, + 21888242871839275222246405745257275088548364400416034343698204002857869074983, + 124550563866778, + 21888242871839275222246405745257275088548364400416034343698204112165866437123, + 561770940998109, + 554658584478528, + 398855672832653, + 504800224305508, + 21888242871839275222246405745257275088548364400416034343698203678187244653620, + 274343842535339, + 21888242871839275222246405745257275088548364400416034343698204090665599119853, + 21888242871839275222246405745257275088548364400416034343698203729254772312925, + 21888242871839275222246405745257275088548364400416034343698203800131066072059, + 21888242871839275222246405745257275088548364400416034343698203700485587789453, + 56813813253205, + 21888242871839275222246405745257275088548364400416034343698203975938858633625, + 121006996640316, + 21888242871839275222246405745257275088548364400416034343698204086429788207482, + 560052804501224, + 21888242871839275222246405745257275088548364400416034343698204153514357601843, + 21888242871839275222246405745257275088548364400416034343698204051873017861303, + 456473275192925, + 261011512094487, + 21888242871839275222246405745257275088548364400416034343698203976877169351174, + 417830801942028, + 21888242871839275222246405745257275088548364400416034343698203896886414125748, + 508482171265690, + 21888242871839275222246405745257275088548364400416034343698203678596048546022, + 439719750077752, + 21888242871839275222246405745257275088548364400416034343698203712667970183372, + 79471165192255, + 493242380453561, + 21888242871839275222246405745257275088548364400416034343698203973066538030803, + 419920553574, + 21888242871839275222246405745257275088548364400416034343698204094551824279753, + 21888242871839275222246405745257275088548364400416034343698203882567287722451, + 121693610323818, + 21888242871839275222246405745257275088548364400416034343698204139364716199336, + 210886232250233, + 501269627800487, + 21888242871839275222246405745257275088548364400416034343698203996694283476862, + 21888242871839275222246405745257275088548364400416034343698203890264690856105, + 54372609465434, + 223964010818870, + 21888242871839275222246405745257275088548364400416034343698203625736910204982, + 21888242871839275222246405745257275088548364400416034343698203741321388647776, + 518365311328839, + 338904223837969, + 21888242871839275222246405745257275088548364400416034343698203703701332156499, + 190466700806408, + 21888242871839275222246405745257275088548364400416034343698203729599431864421, + 21888242871839275222246405745257275088548364400416034343698204144394587501221, + 481741564395855, + 21888242871839275222246405745257275088548364400416034343698204179039436456709, + 269146718473363, + 21888242871839275222246405745257275088548364400416034343698203842522279710784, + 237474776723046, + 352839660116764, + 21888242871839275222246405745257275088548364400416034343698203646335287167894, + 531389011774135, + 21888242871839275222246405745257275088548364400416034343698204167099990568830, + 21888242871839275222246405745257275088548364400416034343698203674428138016134, + 134927246346915, + 21888242871839275222246405745257275088548364400416034343698203721013389812771, + 135755110504464, + 342763672293748, + 21888242871839275222246405745257275088548364400416034343698203865894742303756, + 516187757139944, + 21888242871839275222246405745257275088548364400416034343698203853885949641039, + 195043176270106, + 469877884864768, + 21888242871839275222246405745257275088548364400416034343698204126717799350965, + 21888242871839275222246405745257275088548364400416034343698203796523291864488, + 458448036992104, + 21888242871839275222246405745257275088548364400416034343698204064951126672226, + 460909716211201, + 21888242871839275222246405745257275088548364400416034343698204142062076713814, + 21888242871839275222246405745257275088548364400416034343698203756105222159866, + 21888242871839275222246405745257275088548364400416034343698203833888365419670, + 299264059463124, + 213738812102594, + 362278658500508, + 21888242871839275222246405745257275088548364400416034343698204172578513204560, + 371528373557307, + 21888242871839275222246405745257275088548364400416034343698204120088982685422, + 152538442225556, + 556809322532270, + 21888242871839275222246405745257275088548364400416034343698204068690893486450, + 21888242871839275222246405745257275088548364400416034343698203839377884061286, + 21888242871839275222246405745257275088548364400416034343698203704032275780571, + 21888242871839275222246405745257275088548364400416034343698203910642989614956, + 21888242871839275222246405745257275088548364400416034343698203965539558189258, + 139058519155483, + 160172420949864, + 21888242871839275222246405745257275088548364400416034343698203727889769112546, + 110376839886810, + 21888242871839275222246405745257275088548364400416034343698203809887682338690, + 21888242871839275222246405745257275088548364400416034343698204041779285679892, + 465486935028127, + 8631213940069, + 21888242871839275222246405745257275088548364400416034343698203776299647212165, + 21888242871839275222246405745257275088548364400416034343698203768373847074357, + 21888242871839275222246405745257275088548364400416034343698204130146820272597, + 21888242871839275222246405745257275088548364400416034343698204156398342196327, + 47495708182643, + 56438810387066, + 21888242871839275222246405745257275088548364400416034343698203644309088208215, + 21888242871839275222246405745257275088548364400416034343698204121788754323374, + 21888242871839275222246405745257275088548364400416034343698203850924745592279, + 21888242871839275222246405745257275088548364400416034343698203773675114550648, + 43661336311161, + 21888242871839275222246405745257275088548364400416034343698203667055785270278, + 326691360046721, + 313390284398259, + 21888242871839275222246405745257275088548364400416034343698204011779636108003, + 46978653778191, + 21888242871839275222246405745257275088548364400416034343698203846773859935291, + 21888242871839275222246405745257275088548364400416034343698204123506015741442, + 297354607367345, + 21888242871839275222246405745257275088548364400416034343698204010764048474182, + 21888242871839275222246405745257275088548364400416034343698203891284287240025, + 21888242871839275222246405745257275088548364400416034343698204140763740063903, + 21888242871839275222246405745257275088548364400416034343698204026495686478031, + 21888242871839275222246405745257275088548364400416034343698203813326655321471, + 139462756959776, + 427016998844471, + 21888242871839275222246405745257275088548364400416034343698203762776170154242, + 21888242871839275222246405745257275088548364400416034343698203866291309290406, + 556163067859879, + 21888242871839275222246405745257275088548364400416034343698203718907781656009, + 21888242871839275222246405745257275088548364400416034343698204074973761628958, + 21888242871839275222246405745257275088548364400416034343698203992171515779934, + 562633939475094, + 21888242871839275222246405745257275088548364400416034343698203805758299940374, + 21888242871839275222246405745257275088548364400416034343698204174788566900092, + 212141202459276, + 164281268416346, + 21888242871839275222246405745257275088548364400416034343698203897126465118199, + 21888242871839275222246405745257275088548364400416034343698203948512380880062, + 363184274267465, + 21888242871839275222246405745257275088548364400416034343698203628227326958794, + 124735548421509, + 13839168128520, + 21888242871839275222246405745257275088548364400416034343698204146653651892645, + 40801649752878, + 466796069003483, + 21888242871839275222246405745257275088548364400416034343698204064017784453640, + 21888242871839275222246405745257275088548364400416034343698203656552865842411, + 21888242871839275222246405745257275088548364400416034343698203855515864266360, + 21888242871839275222246405745257275088548364400416034343698203772647578768568, + 21888242871839275222246405745257275088548364400416034343698203750357716309370, + 272004883001465, + 25176781090260, + 21888242871839275222246405745257275088548364400416034343698203695817017998155, + 11039057882885, + 21888242871839275222246405745257275088548364400416034343698203659268398006805, + 21888242871839275222246405745257275088548364400416034343698203998191847948725, + 21888242871839275222246405745257275088548364400416034343698204177439078387039, + 21888242871839275222246405745257275088548364400416034343698203986947978643264, + 25317822446607, + 80646488516233, + 21888242871839275222246405745257275088548364400416034343698203642436255894473, + 253401817315907, + 194661044656816, + 21888242871839275222246405745257275088548364400416034343698204177665103920182, + 21888242871839275222246405745257275088548364400416034343698203767806891526685, + 181407313894382, + 443787146300570, + 21888242871839275222246405745257275088548364400416034343698203979638502466013, + 75202064737707, + 441417196246114, + 21888242871839275222246405745257275088548364400416034343698204136283083505221, + 21888242871839275222246405745257275088548364400416034343698203828876792049921, + 68671336880938, + 82373264922806, + 190925479050758, + 280640454852735, + 21015505721865, + 21888242871839275222246405745257275088548364400416034343698203919879437813051, + 21888242871839275222246405745257275088548364400416034343698203742922879247561, + 527446222829261, + 21888242871839275222246405745257275088548364400416034343698203949703197308910, + 299879482378796, + 54034767550299, + 21888242871839275222246405745257275088548364400416034343698203667617831154520, + 485213698197413, + 21888242871839275222246405745257275088548364400416034343698203971567154859924, + 21888242871839275222246405745257275088548364400416034343698204056125879229688, + 417226307034235, + 560856101373191, + 21888242871839275222246405745257275088548364400416034343698203669714238204122, + 21888242871839275222246405745257275088548364400416034343698203775997591642557, + 21888242871839275222246405745257275088548364400416034343698204181630588304046, + 21888242871839275222246405745257275088548364400416034343698203822519692813644, + 21888242871839275222246405745257275088548364400416034343698203668440654373180, + 76895542792500, + 21888242871839275222246405745257275088548364400416034343698203909543272455403, + 21888242871839275222246405745257275088548364400416034343698204009379222928320, + 21888242871839275222246405745257275088548364400416034343698203851645972825884, + 21888242871839275222246405745257275088548364400416034343698203989794553838835, + 21888242871839275222246405745257275088548364400416034343698204059081945915532, + 206042793922664, + 21888242871839275222246405745257275088548364400416034343698203670219450916951, + 326918869708562, + 451459609442431, + 288490528309546, + 21888242871839275222246405745257275088548364400416034343698203810723913890983, + 21888242871839275222246405745257275088548364400416034343698203649277472411234, + 21888242871839275222246405745257275088548364400416034343698203897080932467323, + 509485461393813, + 58283942909332, + 21888242871839275222246405745257275088548364400416034343698203695915939772554, + 376797945661076, + 231290418798372, + 533568729631682, + 163018742290745, + 169880321179870, + 423053287831416, + 498283915055881, + 21888242871839275222246405745257275088548364400416034343698203936776057357303, + 21888242871839275222246405745257275088548364400416034343698203912165070635889, + 191696665341906, + 21888242871839275222246405745257275088548364400416034343698203765269061068144, + 489575556748668, + 469348253717633, + 21888242871839275222246405745257275088548364400416034343698204157359482560569, + 372749332275789, + 21888242871839275222246405745257275088548364400416034343698204023231923099422, + 372357448751444, + 21888242871839275222246405745257275088548364400416034343698203894518350791917, + 315846621297965, + 21888242871839275222246405745257275088548364400416034343698204106237524864171, + 21888242871839275222246405745257275088548364400416034343698204030699043852462, + 43784871457795, + 21888242871839275222246405745257275088548364400416034343698203738958255313354, + 15832484467190, + 205280792712663, + 267863863209967, + 457149955017840, + 21888242871839275222246405745257275088548364400416034343698203996207968844783, + 21888242871839275222246405745257275088548364400416034343698204032207360362194, + 172097240151738, + 21888242871839275222246405745257275088548364400416034343698203741946033624102, + 228315190636129, + 21888242871839275222246405745257275088548364400416034343698203671580231418491, + 21888242871839275222246405745257275088548364400416034343698203633770424076463, + 21888242871839275222246405745257275088548364400416034343698203929836669065750, + 209856144264399, + 510689368481048, + 242935419958605, + 277121346940303, + 403146291448015, + 21888242871839275222246405745257275088548364400416034343698203822866561944889, + 21888242871839275222246405745257275088548364400416034343698203812119685247765, + 21888242871839275222246405745257275088548364400416034343698203988747690378766, + 50497468369093, + 12688921971495, + 350162607053907, + 296248686465398, + 21888242871839275222246405745257275088548364400416034343698204062992881442354, + 21888242871839275222246405745257275088548364400416034343698204099140249842639, + 21888242871839275222246405745257275088548364400416034343698203701070031172269, + 21888242871839275222246405745257275088548364400416034343698204051227242022243, + 466636123603485, + 21888242871839275222246405745257275088548364400416034343698203882088954498685, + 416302573540429, + 327369075369452, + 21888242871839275222246405745257275088548364400416034343698204090271137839355, + 335079805360353, + 84290736661178, + 416042425730302, + 457674236110431, + 469218096251607, + 11804289787869, + 21888242871839275222246405745257275088548364400416034343698203760645910733206, + 21888242871839275222246405745257275088548364400416034343698204107528128728839, + 21888242871839275222246405745257275088548364400416034343698204134009690002033, + 21888242871839275222246405745257275088548364400416034343698203748989786235212, + 250650923256496, + 225241788404549, + 361568857246647, + 21888242871839275222246405745257275088548364400416034343698204075185118507932, + 21888242871839275222246405745257275088548364400416034343698204109665079717656, + 251724932227019, + 151288294578767, + 21888242871839275222246405745257275088548364400416034343698203842621524481466, + 21888242871839275222246405745257275088548364400416034343698203697976415138402, + 409253207085127, + 21888242871839275222246405745257275088548364400416034343698203672513528830286, + 534210847735683, + 21888242871839275222246405745257275088548364400416034343698204029666145082869, + 326463982685985, + 21888242871839275222246405745257275088548364400416034343698203894916341022048, + 355944131609460, + 21888242871839275222246405745257275088548364400416034343698203994235919615933, + 21888242871839275222246405745257275088548364400416034343698203696404468530329, + 294514119998593, + 198759823195482, + 21888242871839275222246405745257275088548364400416034343698203846300576594781, + 21888242871839275222246405745257275088548364400416034343698203648199096140299, + 21888242871839275222246405745257275088548364400416034343698203648009834425585, + 21888242871839275222246405745257275088548364400416034343698203660840962229739, + 21888242871839275222246405745257275088548364400416034343698203957585436902166, + 21888242871839275222246405745257275088548364400416034343698204006815049298132, + 86051712356144, + 21888242871839275222246405745257275088548364400416034343698203739331053805031, + 21888242871839275222246405745257275088548364400416034343698203883936204393801, + 21888242871839275222246405745257275088548364400416034343698204174299294335622, + 21888242871839275222246405745257275088548364400416034343698204179066277707184, + 21888242871839275222246405745257275088548364400416034343698203837190810901900, + 335916515996808, + 21888242871839275222246405745257275088548364400416034343698203988469341681634, + 21888242871839275222246405745257275088548364400416034343698203728622562972856, + 327324696874530, + 46211043699181, + 21888242871839275222246405745257275088548364400416034343698203855597030453621, + 21888242871839275222246405745257275088548364400416034343698203923197975799272, + 21888242871839275222246405745257275088548364400416034343698203961926911620073, + 21888242871839275222246405745257275088548364400416034343698203688981946216419, + 24486579883290, + 54837627804743, + 21888242871839275222246405745257275088548364400416034343698203757990062238902, + 21888242871839275222246405745257275088548364400416034343698204124165950587396, + 452431657982844, + 21888242871839275222246405745257275088548364400416034343698203966700729581971, + 21888242871839275222246405745257275088548364400416034343698203835881420976607, + 21888242871839275222246405745257275088548364400416034343698203840453495481664, + 21888242871839275222246405745257275088548364400416034343698204147363700978368, + 21888242871839275222246405745257275088548364400416034343698203789538953425790, + 21888242871839275222246405745257275088548364400416034343698203646156058074511, + 426755943679906, + 173081250875457, + 412855538987587, + 32909159361728, + 21888242871839275222246405745257275088548364400416034343698203854347804260283, + 21888242871839275222246405745257275088548364400416034343698204149734611847619, + 464894736627520, + 21888242871839275222246405745257275088548364400416034343698203844366347839446, + 293503460794606, + 131516224063747, + 21888242871839275222246405745257275088548364400416034343698204172289962227033, + 21888242871839275222246405745257275088548364400416034343698204003854495823894, + 223621096860926, + 21888242871839275222246405745257275088548364400416034343698203689673509259409, + 21888242871839275222246405745257275088548364400416034343698203888164951893122, + 21888242871839275222246405745257275088548364400416034343698203849353601368765, + 21888242871839275222246405745257275088548364400416034343698204121012836788412, + 259155899163441, + 108375981072159, + 387294786711854, + 102866992818158, + 21888242871839275222246405745257275088548364400416034343698203972756073700273, + 21888242871839275222246405745257275088548364400416034343698203760452541005030, + 69728950360731, + 21888242871839275222246405745257275088548364400416034343698204051020435117701, + 21888242871839275222246405745257275088548364400416034343698204008327396078750, + 21888242871839275222246405745257275088548364400416034343698204058100404107510, + 495248699951319, + 468625844713116, + 21888242871839275222246405745257275088548364400416034343698203974739450983712, + 182708838734459, + 130473474605184, + 21888242871839275222246405745257275088548364400416034343698203790699646115077, + 21888242871839275222246405745257275088548364400416034343698203932804430190859, + 21888242871839275222246405745257275088548364400416034343698203990840592489216, + 21888242871839275222246405745257275088548364400416034343698203871457365520779, + 21888242871839275222246405745257275088548364400416034343698203995006436973332, + 21888242871839275222246405745257275088548364400416034343698203761894953713758, + 85612464805665, + 21888242871839275222246405745257275088548364400416034343698203726946850769936, + 21888242871839275222246405745257275088548364400416034343698203638749818581063, + 21888242871839275222246405745257275088548364400416034343698203807879304286046, + 508822600210823, + 21888242871839275222246405745257275088548364400416034343698204163797685830877, + 21888242871839275222246405745257275088548364400416034343698203959835286643800, + 125367391496185, + 69115345428947, + 21888242871839275222246405745257275088548364400416034343698203661176548510475, + 181142915386178, + 21888242871839275222246405745257275088548364400416034343698203837528936355797, + 21888242871839275222246405745257275088548364400416034343698203870132438358541, + 447370726918911, + 291768256703832, + 48414660876288, + 45066983895921, + 21888242871839275222246405745257275088548364400416034343698203748642793088342, + 389757138916026, + 21888242871839275222246405745257275088548364400416034343698203720264584192086, + 96586500207204, + 21888242871839275222246405745257275088548364400416034343698203652107938876294, + 467421942168002, + 7489385766942, + 21888242871839275222246405745257275088548364400416034343698203926541938097451, + 549495968686043, + 302483282408238, + 21888242871839275222246405745257275088548364400416034343698203796700637063300, + 226500125550704, + 21888242871839275222246405745257275088548364400416034343698203684651912188648, + 21888242871839275222246405745257275088548364400416034343698204172435508483583, + 21888242871839275222246405745257275088548364400416034343698203842662593867927, + 61601667557772, + 411353404650507, + 31031636994874, + 21888242871839275222246405745257275088548364400416034343698203970393629250341, + 302313511464716, + 490275378102629, + 21888242871839275222246405745257275088548364400416034343698203660144165346035, + 21888242871839275222246405745257275088548364400416034343698204007693066570820, + 123743144226706, + 173508967407899, + 21888242871839275222246405745257275088548364400416034343698203915091607887566, + 21888242871839275222246405745257275088548364400416034343698203974745902687516, + 220039339726009, + 21888242871839275222246405745257275088548364400416034343698203736740603569084, + 21888242871839275222246405745257275088548364400416034343698203796676308710468, + 21888242871839275222246405745257275088548364400416034343698204134554966337620, + 493041878642093, + 108034999916777, + 21888242871839275222246405745257275088548364400416034343698203624607022672829, + 21888242871839275222246405745257275088548364400416034343698203810998634543142, + 372421620881794, + 21888242871839275222246405745257275088548364400416034343698203859380145613573, + 21888242871839275222246405745257275088548364400416034343698203891608357498077, + 21888242871839275222246405745257275088548364400416034343698203666919866658277, + 21888242871839275222246405745257275088548364400416034343698203984611411203198, + 21888242871839275222246405745257275088548364400416034343698203926012927326945, + 21888242871839275222246405745257275088548364400416034343698203845953952420902, + 362706447501394, + 21888242871839275222246405745257275088548364400416034343698204060362522207971, + 390996626569783, + 21888242871839275222246405745257275088548364400416034343698204148634079493128, + 21888242871839275222246405745257275088548364400416034343698204071878439848218, + 47113752521406, + 75540849650509, + 228488267183464, + 359151382278342, + 21888242871839275222246405745257275088548364400416034343698203675294130073371, + 21888242871839275222246405745257275088548364400416034343698203720177663873716, + 21888242871839275222246405745257275088548364400416034343698204185153456173335, + 502434058565465, + 62122560355257, + 21888242871839275222246405745257275088548364400416034343698204008177935046555, + 236505536566723, + 21888242871839275222246405745257275088548364400416034343698204002041433076567, + 50960118104412, + 82911463204640, + 301234551752227, + 335800844249092, + 21888242871839275222246405745257275088548364400416034343698203885400075832141, + 230644766754054, + 531328986932689, + 21888242871839275222246405745257275088548364400416034343698203750701684984786, + 501376208548089, + 207710400108791, + 21888242871839275222246405745257275088548364400416034343698203951191495655359, + 21888242871839275222246405745257275088548364400416034343698203652914171455315, + 21888242871839275222246405745257275088548364400416034343698203987847133536530, + 21888242871839275222246405745257275088548364400416034343698203857408785243635, + 21888242871839275222246405745257275088548364400416034343698203714430498938861, + 21888242871839275222246405745257275088548364400416034343698203921193198767183, + 21888242871839275222246405745257275088548364400416034343698204136752200242588, + 21888242871839275222246405745257275088548364400416034343698203896275978349996, + 21888242871839275222246405745257275088548364400416034343698203714612171744722, + 21888242871839275222246405745257275088548364400416034343698203633321879406411, + 467872577240034, + 21888242871839275222246405745257275088548364400416034343698203832884100743997, + 21888242871839275222246405745257275088548364400416034343698203935055315436254, + 11601646150951, + 21888242871839275222246405745257275088548364400416034343698204052902556104346, + 21888242871839275222246405745257275088548364400416034343698204095881759774059, + 388921074023157, + 217214233134467, + 320419549945354, + 236292112257246, + 288563952566945, + 498565361295980, + 42913193044367, + 21888242871839275222246405745257275088548364400416034343698203934482955000396, + 185214251254267, + 21888242871839275222246405745257275088548364400416034343698204020436359637416, + 21888242871839275222246405745257275088548364400416034343698204043211998068569, + 329366714237744, + 92307122638784, + 401869447973438, + 178057191812157, + 242137627105124, + 414064502808205, + 21888242871839275222246405745257275088548364400416034343698203792648501810991, + 6875212421819, + 259360875662358, + 203025111198658, + 59133128781941, + 21888242871839275222246405745257275088548364400416034343698203890433355981445, + 444431887493766, + 21888242871839275222246405745257275088548364400416034343698204075798785199549, + 21888242871839275222246405745257275088548364400416034343698203678265592569487, + 21888242871839275222246405745257275088548364400416034343698204169587491126662, + 21888242871839275222246405745257275088548364400416034343698203829969701027802, + 21888242871839275222246405745257275088548364400416034343698203798274680553108, + 21888242871839275222246405745257275088548364400416034343698204043629113040049, + 350085083336595, + 259093453645937, + 70519951357260, + 70167965147209, + 21888242871839275222246405745257275088548364400416034343698203901764005604009, + 21888242871839275222246405745257275088548364400416034343698203674606225692524, + 137146627621334, + 441464773928368, + 23775462963445, + 21888242871839275222246405745257275088548364400416034343698203764054870990610, + 539576318517736, + 21888242871839275222246405745257275088548364400416034343698204031468298411067, + 358148874060017, + 21888242871839275222246405745257275088548364400416034343698204043513427288874, + 21888242871839275222246405745257275088548364400416034343698203683089128057074, + 348943742102280, + 363791988524776, + 21888242871839275222246405745257275088548364400416034343698204141831932822712, + 391627447450289, + 21888242871839275222246405745257275088548364400416034343698203968097198262123, + 478164854278115, + 173790181222378, + 21888242871839275222246405745257275088548364400416034343698203995522401144806, + 302102542916314, + 21888242871839275222246405745257275088548364400416034343698204039779144712216, + 338368577904990, + 377819994155256, + 143913233295314, + 4115420174540, + 452526173753118, + 21888242871839275222246405745257275088548364400416034343698204162622768036766, + 541246059185538, + 16754630318278, + 21888242871839275222246405745257275088548364400416034343698203638516110222583, + 528514710216496, + 69103463322215, + 21888242871839275222246405745257275088548364400416034343698204024104625209972, + 21888242871839275222246405745257275088548364400416034343698204084040771436194, + 21888242871839275222246405745257275088548364400416034343698203814186807514394, + 21888242871839275222246405745257275088548364400416034343698204037522415632231, + 21888242871839275222246405745257275088548364400416034343698203838733379382402, + 158277460271720, + 88072144793431, + 261039867792223, + 357436343683572, + 203102167601546, + 21888242871839275222246405745257275088548364400416034343698203885697599794621, + 371770758027577, + 477666934920017, + 21888242871839275222246405745257275088548364400416034343698204174641424578690, + 539335199210879, + 21888242871839275222246405745257275088548364400416034343698203768213346984583, + 509446026742293, + 21888242871839275222246405745257275088548364400416034343698203774559148960619, + 21888242871839275222246405745257275088548364400416034343698203633705435327696, + 211664420478137, + 21888242871839275222246405745257275088548364400416034343698204033916342972124, + 21888242871839275222246405745257275088548364400416034343698203670937147084230, + 21888242871839275222246405745257275088548364400416034343698203746287363763314, + 493021114239257, + 216091760520202, + 21888242871839275222246405745257275088548364400416034343698204097803590235405, + 21888242871839275222246405745257275088548364400416034343698203956317861162110, + 76860110857151, + 51965792329934, + 22361714588119, + 453316821269805, + 21888242871839275222246405745257275088548364400416034343698203939941200290955, + 537583018132553, + 21888242871839275222246405745257275088548364400416034343698203666645584495961, + 21888242871839275222246405745257275088548364400416034343698203818895456677237, + 138540885039087, + 144963883097254, + 120136630487645, + 21888242871839275222246405745257275088548364400416034343698204169689884190853, + 21888242871839275222246405745257275088548364400416034343698203927394784452413, + 21888242871839275222246405745257275088548364400416034343698203758933275258453, + 21888242871839275222246405745257275088548364400416034343698203663320931713263, + 406334903601673, + 456177362144828, + 21888242871839275222246405745257275088548364400416034343698203977690397591092, + 21888242871839275222246405745257275088548364400416034343698203699186350398363, + 273558102199640, + 21888242871839275222246405745257275088548364400416034343698203701723566930774, + 21888242871839275222246405745257275088548364400416034343698203821960344000968, + 21888242871839275222246405745257275088548364400416034343698203772371189811600, + 98245693641263, + 525243452316889, + 234306168944898, + 21888242871839275222246405745257275088548364400416034343698203933115804384566, + 121957737876649, + 8777735358952, + 21888242871839275222246405745257275088548364400416034343698203733114601285525, + 21888242871839275222246405745257275088548364400416034343698203771577753062390, + 21888242871839275222246405745257275088548364400416034343698204008696772602882, + 493991474576821, + 195919487496021, + 467498973357305, + 21888242871839275222246405745257275088548364400416034343698203670285237402123, + 40158751078686, + 25761357607025, + 21888242871839275222246405745257275088548364400416034343698203627835470995904, + 226307993207989, + 21888242871839275222246405745257275088548364400416034343698203936993293311879, + 21888242871839275222246405745257275088548364400416034343698203634795731060982, + 482316191685225, + 192670614640408, + 21888242871839275222246405745257275088548364400416034343698203690549473749606, + 21888242871839275222246405745257275088548364400416034343698203713298420118629, + 182552855037561, + 351653694907994, + 21888242871839275222246405745257275088548364400416034343698203625445559168404, + 382291337604704, + 21888242871839275222246405745257275088548364400416034343698203971311774589895, + 21888242871839275222246405745257275088548364400416034343698204000906544479746, + 94035338832233, + 177497034542231, + 21888242871839275222246405745257275088548364400416034343698204108046936083430, + 324739518093503, + 21888242871839275222246405745257275088548364400416034343698203926982322245036, + 21888242871839275222246405745257275088548364400416034343698203917789324588758, + 21888242871839275222246405745257275088548364400416034343698203706410507123494, + 30081046989179, + 21888242871839275222246405745257275088548364400416034343698203859343866957079, + 21888242871839275222246405745257275088548364400416034343698204058805894164005, + 21888242871839275222246405745257275088548364400416034343698203749646806345682, + 120579949227475, + 301977594469203, + 425240168088625, + 21888242871839275222246405745257275088548364400416034343698204086456743788732, + 21888242871839275222246405745257275088548364400416034343698203851025461915190, + 548018106701723, + 274178772819056, + 553477184215264, + 21888242871839275222246405745257275088548364400416034343698204073005637606766, + 21888242871839275222246405745257275088548364400416034343698203737334160332629, + 486208826405620, + 21888242871839275222246405745257275088548364400416034343698203814865161486594, + 548004184617260, + 21888242871839275222246405745257275088548364400416034343698203975815381330165, + 21888242871839275222246405745257275088548364400416034343698203709547335193635, + 346026917284185, + 21888242871839275222246405745257275088548364400416034343698203932459087365033, + 21888242871839275222246405745257275088548364400416034343698204183428072502790, + 21888242871839275222246405745257275088548364400416034343698203746331908071077, + 21888242871839275222246405745257275088548364400416034343698203807398880040960, + 154458408388799, + 21888242871839275222246405745257275088548364400416034343698203646677552376812, + 13898670192379, + 21888242871839275222246405745257275088548364400416034343698204082986579726432, + 134342458650247, + 21888242871839275222246405745257275088548364400416034343698203735933391555652, + 224153644901016, + 21888242871839275222246405745257275088548364400416034343698203713367488896809, + 335186622487062, + 21888242871839275222246405745257275088548364400416034343698203649144624511445, + 21888242871839275222246405745257275088548364400416034343698204040893131376532, + 21888242871839275222246405745257275088548364400416034343698203668457561251886, + 382858594347080, + 501971276979987, + 21888242871839275222246405745257275088548364400416034343698203731577120709899, + 350533600595409, + 21888242871839275222246405745257275088548364400416034343698203882631171536364, + 314558012294839, + 21888242871839275222246405745257275088548364400416034343698203842098971793174, + 21888242871839275222246405745257275088548364400416034343698203684348929684424, + 21888242871839275222246405745257275088548364400416034343698203791952144626009, + 21888242871839275222246405745257275088548364400416034343698203789755068292742, + 62055789706760, + 21888242871839275222246405745257275088548364400416034343698203856375361680589, + 21888242871839275222246405745257275088548364400416034343698203936354453614395, + 21888242871839275222246405745257275088548364400416034343698203835498685894947, + 21888242871839275222246405745257275088548364400416034343698203819684309445601, + 21888242871839275222246405745257275088548364400416034343698204012940514739162, + 21888242871839275222246405745257275088548364400416034343698203771674274915047, + 21888242871839275222246405745257275088548364400416034343698204070870054746580, + 21888242871839275222246405745257275088548364400416034343698203904658838937123, + 21888242871839275222246405745257275088548364400416034343698203831978062333258, + 413959749574591, + 21888242871839275222246405745257275088548364400416034343698204129119103918724, + 262127119972548, + 21888242871839275222246405745257275088548364400416034343698203776050907739632, + 21888242871839275222246405745257275088548364400416034343698204035902809423666, + 21888242871839275222246405745257275088548364400416034343698204016047665330063, + 21888242871839275222246405745257275088548364400416034343698203767050189320606, + 521498560832283, + 21888242871839275222246405745257275088548364400416034343698203985571257313604, + 21888242871839275222246405745257275088548364400416034343698204020450620877771, + 21888242871839275222246405745257275088548364400416034343698203921064491958903, + 556036279539806, + 514993249548536, + 21888242871839275222246405745257275088548364400416034343698203837936306134746, + 201672531862463, + 170000133222390, + 21888242871839275222246405745257275088548364400416034343698204051160803870242, + 104395917476167, + 467330404412754, + 217944266566589, + 21888242871839275222246405745257275088548364400416034343698203748422246609791, + 313200344454450, + 21888242871839275222246405745257275088548364400416034343698203769464598472602, + 21888242871839275222246405745257275088548364400416034343698203901983188996664, + 21888242871839275222246405745257275088548364400416034343698203999727420623262, + 21888242871839275222246405745257275088548364400416034343698203773099735375190, + 48116314157779, + 105924337533991, + 119459488104927, + 21888242871839275222246405745257275088548364400416034343698203793116436663618, + 75947654873852, + 2914588076443, + 21888242871839275222246405745257275088548364400416034343698204099141386380329, + 21888242871839275222246405745257275088548364400416034343698204107541090089546, + 21888242871839275222246405745257275088548364400416034343698203727636191939558, + 444265459032670, + 21888242871839275222246405745257275088548364400416034343698203762123483581650, + 21888242871839275222246405745257275088548364400416034343698203936796167808932, + 21888242871839275222246405745257275088548364400416034343698204004791377862189, + 21888242871839275222246405745257275088548364400416034343698203829771649163695, + 234927581988057, + 200348185817950, + 21888242871839275222246405745257275088548364400416034343698204117619088576098, + 335005147918269, + 432967499252991, + 21888242871839275222246405745257275088548364400416034343698203685274887473499, + 549796294929415, + 496891420884119, + 21888242871839275222246405745257275088548364400416034343698204048396525407570, + 472794435559870, + 144253156163771, + 21888242871839275222246405745257275088548364400416034343698204175522244345078, + 36924983600787, + 21888242871839275222246405745257275088548364400416034343698203960737854044714, + 21888242871839275222246405745257275088548364400416034343698203888108223211158, + 308669633016739, + 299403005189265, + 21888242871839275222246405745257275088548364400416034343698204024119685108911, + 157885713062947, + 21888242871839275222246405745257275088548364400416034343698204140797360568186, + 21888242871839275222246405745257275088548364400416034343698204037881102396184, + 21888242871839275222246405745257275088548364400416034343698203795939020621030, + 21888242871839275222246405745257275088548364400416034343698203727286757190291, + 21888242871839275222246405745257275088548364400416034343698203740998365662821, + 21888242871839275222246405745257275088548364400416034343698203702442331371621, + 21888242871839275222246405745257275088548364400416034343698203695028848506865, + 195873001146160, + 506151090561395, + 21888242871839275222246405745257275088548364400416034343698203846165415462432, + 21888242871839275222246405745257275088548364400416034343698203731230125806597, + 21888242871839275222246405745257275088548364400416034343698203885107016614281, + 16655789423263, + 21888242871839275222246405745257275088548364400416034343698203645654021064320, + 236806225893149, + 21888242871839275222246405745257275088548364400416034343698203636079124429425, + 21888242871839275222246405745257275088548364400416034343698203629144412667711, + 101333989267130, + 85098738468286, + 21888242871839275222246405745257275088548364400416034343698203967255200715188, + 21888242871839275222246405745257275088548364400416034343698203662846630499130, + 21888242871839275222246405745257275088548364400416034343698203956844919126244, + 410663583312489, + 338175390567733, + 362044487835118, + 460666574895522, + 26514511682365, + 21888242871839275222246405745257275088548364400416034343698203772196083565453, + 107782433689086, + 106757400863318, + 21888242871839275222246405745257275088548364400416034343698203625635511887674, + 21888242871839275222246405745257275088548364400416034343698204084898371467506, + 21888242871839275222246405745257275088548364400416034343698204172882366587945, + 497842716077686, + 21888242871839275222246405745257275088548364400416034343698204110524773693622, + 453354679281405, + 208717594491344, + 337213924569493, + 21888242871839275222246405745257275088548364400416034343698203651996138235497, + 190068266438009, + 21888242871839275222246405745257275088548364400416034343698204044498289337699, + 256961584808690, + 258912177386281, + 21888242871839275222246405745257275088548364400416034343698203734604098789002, + 483187241244162, + 276959885895602, + 407447596523112, + 47426739786063, + 223368389531769, + 509774042826795, + 21888242871839275222246405745257275088548364400416034343698203648338884286897, + 21888242871839275222246405745257275088548364400416034343698203761851031475027, + 198464225057517, + 212329293664644, + 21888242871839275222246405745257275088548364400416034343698203819901807775687, + 236475340867835, + 82966462175772, + 21888242871839275222246405745257275088548364400416034343698204122392080173274, + 21888242871839275222246405745257275088548364400416034343698204005959128495731, + 21888242871839275222246405745257275088548364400416034343698203836596069701522, + 21888242871839275222246405745257275088548364400416034343698203775183920826090, + 21888242871839275222246405745257275088548364400416034343698203872939430029526, + 21888242871839275222246405745257275088548364400416034343698203966681879332107, + 21888242871839275222246405745257275088548364400416034343698203942512466609760, + 489755368982127, + 193114556518859, + 21888242871839275222246405745257275088548364400416034343698203806124684279001, + 46841495524950, + 21888242871839275222246405745257275088548364400416034343698204155500431598472, + 21888242871839275222246405745257275088548364400416034343698203909212541688829, + 28420921086195, + 484718915463304, + 21888242871839275222246405745257275088548364400416034343698203708965864795751, + 21888242871839275222246405745257275088548364400416034343698203758884126696050, + 451961183736142, + 89420646872934, + 72430370122592, + 21888242871839275222246405745257275088548364400416034343698203960763991494002, + 21888242871839275222246405745257275088548364400416034343698203693246500859183, + 21888242871839275222246405745257275088548364400416034343698203833158378399023, + 21888242871839275222246405745257275088548364400416034343698203928783700560287, + 105491815650528, + 21888242871839275222246405745257275088548364400416034343698203644156284112143, + 21888242871839275222246405745257275088548364400416034343698204146070522867244, + 21888242871839275222246405745257275088548364400416034343698203628900232139310, + 175813552920436, + 21888242871839275222246405745257275088548364400416034343698203787724928225328, + 21888242871839275222246405745257275088548364400416034343698204146313733813015, + 21888242871839275222246405745257275088548364400416034343698203993728724007315, + 21888242871839275222246405745257275088548364400416034343698203659445671123737, + 21888242871839275222246405745257275088548364400416034343698203647167150256362, + 21888242871839275222246405745257275088548364400416034343698203742376319549567, + 21888242871839275222246405745257275088548364400416034343698204027800289422672, + 21888242871839275222246405745257275088548364400416034343698203638566106737036, + 531706393294618, + 308624967680913, + 21888242871839275222246405745257275088548364400416034343698203842707866099225, + 21888242871839275222246405745257275088548364400416034343698203932022418627758, + 284082841233554, + 262427672419649, + 456235599825762, + 21888242871839275222246405745257275088548364400416034343698203699551809163197, + 267041168831500, + 21888242871839275222246405745257275088548364400416034343698204053958575429869, + 538471669302142, + 21888242871839275222246405745257275088548364400416034343698203853588470853947, + 465920293394433, + 305574641391419, + 21888242871839275222246405745257275088548364400416034343698203831226932496456, + 306950456982154, + 21888242871839275222246405745257275088548364400416034343698203631902878619916, + 354150153495050, + 205773875474007, + 231958996428994, + 67856012398716, + 21888242871839275222246405745257275088548364400416034343698203641899659165955, + 205405206123630, + 256553778406948, + 21888242871839275222246405745257275088548364400416034343698203986072803070966, + 21888242871839275222246405745257275088548364400416034343698203656634015050600, + 21888242871839275222246405745257275088548364400416034343698203692257456880347, + 21888242871839275222246405745257275088548364400416034343698203703836813880502, + 21888242871839275222246405745257275088548364400416034343698204007955736543863, + 21888242871839275222246405745257275088548364400416034343698204078710204276899, + 124909652432495, + 115069716298963, + 21888242871839275222246405745257275088548364400416034343698203863425199743324, + 562584616273273, + 293037202590350, + 467893491860498, + 21888242871839275222246405745257275088548364400416034343698203904839936159496, + 556286383204615, + 21888242871839275222246405745257275088548364400416034343698203630233258683928, + 358429868690411, + 21888242871839275222246405745257275088548364400416034343698204053960020175416, + 21888242871839275222246405745257275088548364400416034343698203823958005629598, + 21888242871839275222246405745257275088548364400416034343698204022457663174078, + 9113365277417, + 21888242871839275222246405745257275088548364400416034343698203844318604099602, + 21888242871839275222246405745257275088548364400416034343698203647370005275457, + 21888242871839275222246405745257275088548364400416034343698204087960072368586, + 21888242871839275222246405745257275088548364400416034343698203810974670712196, + 505766038505236, + 89348948607225, + 21888242871839275222246405745257275088548364400416034343698204132428476435347, + 347071568905227, + 184623332126132, + 127943901096687, + 21888242871839275222246405745257275088548364400416034343698203637440492160617, + 21888242871839275222246405745257275088548364400416034343698203873377844061670, + 21888242871839275222246405745257275088548364400416034343698204030783469268117, + 21888242871839275222246405745257275088548364400416034343698203645584209183962, + 21888242871839275222246405745257275088548364400416034343698203684712791194197, + 21888242871839275222246405745257275088548364400416034343698203745931127490387, + 21888242871839275222246405745257275088548364400416034343698203968237395216985, + 540658940646109, + 545494774059723, + 417250784389119, + 4776271050705, + 21888242871839275222246405745257275088548364400416034343698203741280599638661, + 21888242871839275222246405745257275088548364400416034343698204118714566868337, + 21888242871839275222246405745257275088548364400416034343698204079980332916838, + 262847867512630, + 21888242871839275222246405745257275088548364400416034343698203665295998711410, + 183756203375383, + 21888242871839275222246405745257275088548364400416034343698203852365437018591, + 21888242871839275222246405745257275088548364400416034343698203730214595412405, + 21888242871839275222246405745257275088548364400416034343698204026651148769380, + 321849720732547, + 21888242871839275222246405745257275088548364400416034343698203727752188786540, + 21888242871839275222246405745257275088548364400416034343698204029537215488264, + 21888242871839275222246405745257275088548364400416034343698203892224750535185, + 438167637741091, + 42334116367622, + 21888242871839275222246405745257275088548364400416034343698204083606543711582, + 21888242871839275222246405745257275088548364400416034343698203707156539649503, + 21888242871839275222246405745257275088548364400416034343698203686489814091436, + 21888242871839275222246405745257275088548364400416034343698204024350291814179, + 256474812420091, + 21888242871839275222246405745257275088548364400416034343698203903432106132111, + 21888242871839275222246405745257275088548364400416034343698203729256124034758, + 277616143777247, + 21888242871839275222246405745257275088548364400416034343698203918020021879681, + 467239350059206, + 21888242871839275222246405745257275088548364400416034343698203802209076456377, + 21888242871839275222246405745257275088548364400416034343698203861040153394377, + 555362440912177, + 369522827148628, + 503530042041013, + 389781490669551, + 21888242871839275222246405745257275088548364400416034343698203942420155286859, + 257290318481790, + 400079641786458, + 21888242871839275222246405745257275088548364400416034343698203750522875029584, + 21888242871839275222246405745257275088548364400416034343698203972203076721447, + 343179757451902, + 21888242871839275222246405745257275088548364400416034343698203778890773646752, + 21888242871839275222246405745257275088548364400416034343698203642869570761152, + 21888242871839275222246405745257275088548364400416034343698203738189921831676, + 21888242871839275222246405745257275088548364400416034343698203879136077465747, + 305646233444107, + 242981096542575, + 21888242871839275222246405745257275088548364400416034343698203747611336728788, + 21888242871839275222246405745257275088548364400416034343698203714718532082398, + 498783918346793, + 502595643182944, + 21888242871839275222246405745257275088548364400416034343698203913359066328153, + 21888242871839275222246405745257275088548364400416034343698203974748391325350, + 467568240426694, + 73233132430422, + 408166839538726, + 21888242871839275222246405745257275088548364400416034343698203910681421168294, + 21888242871839275222246405745257275088548364400416034343698203839623831113075, + 21888242871839275222246405745257275088548364400416034343698203906437162027986, + 174694499259423, + 21888242871839275222246405745257275088548364400416034343698203928349176348973, + 477248780926626, + 433863222207891, + 21888242871839275222246405745257275088548364400416034343698204058527297458663, + 63376827383829, + 120200775476436, + 549071031759195, + 188978054778089, + 63932298211426, + 78629125122879, + 21888242871839275222246405745257275088548364400416034343698203731926980557941, + 16283574834309, + 21888242871839275222246405745257275088548364400416034343698203833898325266087, + 81694983692716, + 30323355595008, + 21888242871839275222246405745257275088548364400416034343698204137419235732362, + 197650636526167, + 21888242871839275222246405745257275088548364400416034343698203751536486414532, + 21888242871839275222246405745257275088548364400416034343698204178070763811446, + 21888242871839275222246405745257275088548364400416034343698203796561434767326, + 21888242871839275222246405745257275088548364400416034343698203944256624199739, + 21888242871839275222246405745257275088548364400416034343698203870163156367331, + 42710273119337, + 21888242871839275222246405745257275088548364400416034343698204032112886340507, + 21888242871839275222246405745257275088548364400416034343698203650993348623846, + 12283512322221, + 21888242871839275222246405745257275088548364400416034343698203946075917164100, + 495936328328480, + 21888242871839275222246405745257275088548364400416034343698203724378947397330, + 21888242871839275222246405745257275088548364400416034343698204184666968727046, + 21888242871839275222246405745257275088548364400416034343698203639789857730574, + 21888242871839275222246405745257275088548364400416034343698203788249082853954, + 21888242871839275222246405745257275088548364400416034343698204091619893830530, + 21888242871839275222246405745257275088548364400416034343698203871413318569322, + 21888242871839275222246405745257275088548364400416034343698204041065837484948, + 21888242871839275222246405745257275088548364400416034343698203975141821167086, + 21888242871839275222246405745257275088548364400416034343698204037608177045442, + 21888242871839275222246405745257275088548364400416034343698203827660595808813, + 21888242871839275222246405745257275088548364400416034343698203631246435833984, + 21888242871839275222246405745257275088548364400416034343698203883442024358467, + 21888242871839275222246405745257275088548364400416034343698203866686751520010, + 326499177530232, + 21888242871839275222246405745257275088548364400416034343698204149170840419699, + 361625839966048, + 155998789042176, + 261415517274246, + 21888242871839275222246405745257275088548364400416034343698203816321560670120, + 114730789835816, + 21888242871839275222246405745257275088548364400416034343698204177338761348332, + 512839430489982, + 287664170701079, + 202022670047047, + 21888242871839275222246405745257275088548364400416034343698203736127609123108, + 274559142058107, + 148142858249093, + 149752035535158, + 510770750798802, + 21888242871839275222246405745257275088548364400416034343698204070404122634529, + 55371951510673, + 164483003345671, + 454034803334966, + 232754132595398, + 435988684063903, + 21888242871839275222246405745257275088548364400416034343698203829134504879999, + 208514536704182, + 347835841504907, + 395511984190629, + 47803802645386, + 21888242871839275222246405745257275088548364400416034343698203662248156495525, + 309302377275508, + 156914124234143, + 21888242871839275222246405745257275088548364400416034343698203716603132380402, + 21888242871839275222246405745257275088548364400416034343698203645440080502846, + 472049658036456, + 21888242871839275222246405745257275088548364400416034343698204179622444436705, + 21888242871839275222246405745257275088548364400416034343698203774733995748576, + 387189522266579, + 214367676079706, + 21888242871839275222246405745257275088548364400416034343698203650912318181387, + 21888242871839275222246405745257275088548364400416034343698203654180282660613, + 57464298078169, + 21888242871839275222246405745257275088548364400416034343698204087894886616359, + 16699468971521, + 304116391845818, + 184870878028700, + 21888242871839275222246405745257275088548364400416034343698203945064397604649, + 484943931803875, + 21888242871839275222246405745257275088548364400416034343698203644374746185632, + 21888242871839275222246405745257275088548364400416034343698204056262036923185, + 21888242871839275222246405745257275088548364400416034343698203771216000765770, + 81984563411260, + 249247824494220, + 132458104413053, + 21888242871839275222246405745257275088548364400416034343698203716911563868135, + 21888242871839275222246405745257275088548364400416034343698203873695210024100, + 381270409698413, + 94325672108073, + 541116915651244, + 537449042212778, + 21888242871839275222246405745257275088548364400416034343698203966942846352648, + 506391871597828, + 432354762272732, + 21888242871839275222246405745257275088548364400416034343698203798615099713723, + 495227143443319, + 21888242871839275222246405745257275088548364400416034343698203897773293503992, + 3649689696526, + 21888242871839275222246405745257275088548364400416034343698204107959577998336, + 87662595350634, + 21888242871839275222246405745257275088548364400416034343698203628403966850966, + 21888242871839275222246405745257275088548364400416034343698203873252745783889, + 21888242871839275222246405745257275088548364400416034343698203899455763957936, + 21888242871839275222246405745257275088548364400416034343698203798939038437453, + 293230080919285, + 169193011979920, + 484977724658248, + 21888242871839275222246405745257275088548364400416034343698203878170862531738, + 212037052586418, + 21888242871839275222246405745257275088548364400416034343698203754429915540196, + 426067051619280, + 160444816552595, + 21888242871839275222246405745257275088548364400416034343698204121431465234619, + 21888242871839275222246405745257275088548364400416034343698203980147884929465, + 479798400754943, + 21888242871839275222246405745257275088548364400416034343698204008548339411570, + 342194818503995, + 21888242871839275222246405745257275088548364400416034343698203629390077831990, + 424303375004492, + 54226483419807, + 360113099070413, + 358185765859741, + 21888242871839275222246405745257275088548364400416034343698204150336903828142, + 212758164969261, + 21888242871839275222246405745257275088548364400416034343698203652500583688043, + 82067567880533, + 442609686770491, + 21888242871839275222246405745257275088548364400416034343698203819008868824508, + 544908786002357, + 450001021689741, + 21888242871839275222246405745257275088548364400416034343698204145767227594005, + 244580238792379, + 221756622094831, + 493338053596006, + 49005225707494, + 293062798419764, + 21888242871839275222246405745257275088548364400416034343698204036138184525342, + 21888242871839275222246405745257275088548364400416034343698203741949340275578, + 21888242871839275222246405745257275088548364400416034343698203761540029817958, + 317665582819512, + 21888242871839275222246405745257275088548364400416034343698203855930376773140, + 350166846262891, + 532721088995883, + 21888242871839275222246405745257275088548364400416034343698204065597614353091, + 40726589841183, + 21888242871839275222246405745257275088548364400416034343698203995348566270551, + 21888242871839275222246405745257275088548364400416034343698204013231870906148, + 56164056015195, + 21888242871839275222246405745257275088548364400416034343698203681139090340217, + 21888242871839275222246405745257275088548364400416034343698203844803778936116, + 416066072535756, + 21888242871839275222246405745257275088548364400416034343698204142474269928288, + 21888242871839275222246405745257275088548364400416034343698203993536720985283, + 21888242871839275222246405745257275088548364400416034343698203668247132272101, + 21888242871839275222246405745257275088548364400416034343698203700966987708798, + 21888242871839275222246405745257275088548364400416034343698203957108098669216, + 21888242871839275222246405745257275088548364400416034343698204170350713409476, + 216082362647058, + 369515401422607, + 21888242871839275222246405745257275088548364400416034343698203751446226407014, + 21888242871839275222246405745257275088548364400416034343698203728476979035350, + 335581547982906, + 305594316869955, + 21888242871839275222246405745257275088548364400416034343698204186308863958952, + 178361290124331, + 242573388427529, + 231511462825766, + 21888242871839275222246405745257275088548364400416034343698203681988598000323, + 21888242871839275222246405745257275088548364400416034343698203922965694150809, + 378664136584708, + 21888242871839275222246405745257275088548364400416034343698204103224244568167, + 21888242871839275222246405745257275088548364400416034343698203695119146623347, + 21888242871839275222246405745257275088548364400416034343698203951786227667989, + 21888242871839275222246405745257275088548364400416034343698203891627638321654, + 21888242871839275222246405745257275088548364400416034343698204081697153498045, + 21888242871839275222246405745257275088548364400416034343698204167700462546943, + 49559904925573, + 21888242871839275222246405745257275088548364400416034343698203827389601281440, + 21888242871839275222246405745257275088548364400416034343698203662628777044883, + 495461228827651, + 21499698754123, + 21888242871839275222246405745257275088548364400416034343698203732899050029868, + 21888242871839275222246405745257275088548364400416034343698203730561824352881, + 450902028981470, + 21888242871839275222246405745257275088548364400416034343698203764442516081269, + 21888242871839275222246405745257275088548364400416034343698204144942455152148, + 523791232815373, + 240270136229553, + 21888242871839275222246405745257275088548364400416034343698203636883272710598, + 536265616629437, + 177213485714770, + 30632805369387, + 21888242871839275222246405745257275088548364400416034343698203995096368238444, + 21888242871839275222246405745257275088548364400416034343698204047874774594437, + 21888242871839275222246405745257275088548364400416034343698203803915275541830, + 234583102680574, + 21888242871839275222246405745257275088548364400416034343698203630540232366706, + 21888242871839275222246405745257275088548364400416034343698204047486869827721, + 21888242871839275222246405745257275088548364400416034343698203623626354951392, + 21888242871839275222246405745257275088548364400416034343698203825437526139992, + 176057630778557, + 270041472159171, + 127096593950465, + 482817210452004, + 379523299028938, + 21888242871839275222246405745257275088548364400416034343698203839985749868659, + 21888242871839275222246405745257275088548364400416034343698203855978844684075, + 21888242871839275222246405745257275088548364400416034343698203832390365545649, + 21888242871839275222246405745257275088548364400416034343698203988781942319707, + 21888242871839275222246405745257275088548364400416034343698204141868222039023, + 21888242871839275222246405745257275088548364400416034343698204167626738545792, + 353633764547882, + 560123830593074, + 190990351460187, + 21888242871839275222246405745257275088548364400416034343698204120913737712844, + 334683164503999, + 21888242871839275222246405745257275088548364400416034343698203800994391184562, + 399611801735744, + 21888242871839275222246405745257275088548364400416034343698203962380416456837, + 21888242871839275222246405745257275088548364400416034343698203906960393883078, + 357599566718990, + 116708327915902, + 122843684092792, + 21888242871839275222246405745257275088548364400416034343698204094157525691503, + 123949703751125, + 21888242871839275222246405745257275088548364400416034343698203882749302938891, + 204290643625563, + 21888242871839275222246405745257275088548364400416034343698203998677579351187, + 538935998222209, + 457341865886367, + 161027538033638, + 21888242871839275222246405745257275088548364400416034343698203924667137711765, + 21888242871839275222246405745257275088548364400416034343698203905932792903436, + 533993263318205, + 123834339625572, + 21888242871839275222246405745257275088548364400416034343698204060087191795847, + 364991145297633, + 61831005330851, + 491760571388433, + 21888242871839275222246405745257275088548364400416034343698203816899772786640, + 21888242871839275222246405745257275088548364400416034343698203929931916495669, + 387716077177748, + 549321374633300, + 21888242871839275222246405745257275088548364400416034343698203676875804066447, + 21888242871839275222246405745257275088548364400416034343698204125414134827565, + 21888242871839275222246405745257275088548364400416034343698203762917829371905, + 426770053281853, + 187763760010125, + 270328134050870, + 21888242871839275222246405745257275088548364400416034343698203844701800146892, + 56851291680608, + 21888242871839275222246405745257275088548364400416034343698203946693335469322, + 175680176458037, + 21888242871839275222246405745257275088548364400416034343698204185058071695348, + 21888242871839275222246405745257275088548364400416034343698203683485016233199, + 186294794351263, + 21888242871839275222246405745257275088548364400416034343698203777194064654591, + 103469378980520, + 159159782212589, + 124349830608359, + 21888242871839275222246405745257275088548364400416034343698203817421539271052, + 21888242871839275222246405745257275088548364400416034343698203684993364716168, + 442490228331538, + 21888242871839275222246405745257275088548364400416034343698204153292219453621, + 553159766157182, + 59211952739926, + 170913350457635, + 506197171100214, + 21888242871839275222246405745257275088548364400416034343698204066995189521089, + 21888242871839275222246405745257275088548364400416034343698203925940594181429, + 67337624837682, + 256521091098659, + 21888242871839275222246405745257275088548364400416034343698203673709270216507, + 398247078575016, + 21888242871839275222246405745257275088548364400416034343698204145068916333500, + 128174260296868, + 153620738718721, + 21888242871839275222246405745257275088548364400416034343698203734229684502976, + 87590635200005, + 21888242871839275222246405745257275088548364400416034343698203702706302926885, + 21888242871839275222246405745257275088548364400416034343698203649641395394054, + 21888242871839275222246405745257275088548364400416034343698203984995387560067, + 21888242871839275222246405745257275088548364400416034343698203840928024333884, + 21888242871839275222246405745257275088548364400416034343698204051011281016848, + 515356059662731, + 373950167352004, + 21888242871839275222246405745257275088548364400416034343698204158216089930754, + 419705328717922, + 60312799443445, + 21888242871839275222246405745257275088548364400416034343698204119149674545860, + 21888242871839275222246405745257275088548364400416034343698204170371031205959, + 21888242871839275222246405745257275088548364400416034343698203639521466900387, + 21888242871839275222246405745257275088548364400416034343698204049964466108823, + 21888242871839275222246405745257275088548364400416034343698204137830347079382, + 426133760216654, + 28020134086837, + 194136362366578, + 21888242871839275222246405745257275088548364400416034343698204038375610599505, + 21888242871839275222246405745257275088548364400416034343698204181080718324022, + 21888242871839275222246405745257275088548364400416034343698204111905015623953, + 21888242871839275222246405745257275088548364400416034343698203793231289581323, + 21888242871839275222246405745257275088548364400416034343698203717303441471348, + 21888242871839275222246405745257275088548364400416034343698203908378297856853, + 334356951275400, + 170164610737437, + 273309500211768, + 21888242871839275222246405745257275088548364400416034343698204130214984447959, + 21888242871839275222246405745257275088548364400416034343698204170414155503150, + 139237260413657, + 21888242871839275222246405745257275088548364400416034343698203722953412223385, + 85676648184631, + 329024162296630, + 445988191855142, + 21888242871839275222246405745257275088548364400416034343698203958103447826593, + 21888242871839275222246405745257275088548364400416034343698204130735287050786, + 511359769684169, + 460142970607828, + 21888242871839275222246405745257275088548364400416034343698203951381458907067, + 537359090195423, + 506665712209950, + 133494344393092, + 21888242871839275222246405745257275088548364400416034343698203714633392378664, + 21888242871839275222246405745257275088548364400416034343698203866561400306456, + 187104704427155, + 117053076387617, + 450250630683901, + 21888242871839275222246405745257275088548364400416034343698203701034870568229, + 460479180398954, + 21888242871839275222246405745257275088548364400416034343698204059972205154429, + 21888242871839275222246405745257275088548364400416034343698203807813180995557, + 480287292328336, + 21888242871839275222246405745257275088548364400416034343698203743168600804432, + 264556434733482, + 269026422815940, + 21888242871839275222246405745257275088548364400416034343698203674297479334680, + 21888242871839275222246405745257275088548364400416034343698203863725935716102, + 21888242871839275222246405745257275088548364400416034343698203720560674770495, + 170689407843067, + 365031793959808, + 21888242871839275222246405745257275088548364400416034343698203803893368785728, + 209099403969920, + 21888242871839275222246405745257275088548364400416034343698204132258800046490, + 21888242871839275222246405745257275088548364400416034343698204114810748821975, + 21888242871839275222246405745257275088548364400416034343698204097177521048783, + 21888242871839275222246405745257275088548364400416034343698204044135396777734, + 355451822736002, + 21888242871839275222246405745257275088548364400416034343698203922312735858916, + 463490093982006, + 21888242871839275222246405745257275088548364400416034343698204124534528867450, + 21888242871839275222246405745257275088548364400416034343698203904310540601152, + 21888242871839275222246405745257275088548364400416034343698204116692368215824, + 530842877310659, + 510931300453059, + 21888242871839275222246405745257275088548364400416034343698203837207680803722, + 21888242871839275222246405745257275088548364400416034343698203710560576057116, + 21888242871839275222246405745257275088548364400416034343698203866548610603791, + 21888242871839275222246405745257275088548364400416034343698204116130264743159, + 298405491235625, + 430928076276519, + 177289901773060, + 21888242871839275222246405745257275088548364400416034343698203826140657358043, + 21888242871839275222246405745257275088548364400416034343698203802276975511434, + 21888242871839275222246405745257275088548364400416034343698204098801603785187, + 21888242871839275222246405745257275088548364400416034343698204154875076503804, + 194135269263086, + 21888242871839275222246405745257275088548364400416034343698203648519085707435, + 69015481127625, + 21888242871839275222246405745257275088548364400416034343698204069783290031684, + 21888242871839275222246405745257275088548364400416034343698203947617361063857, + 21888242871839275222246405745257275088548364400416034343698203873404032076208, + 21888242871839275222246405745257275088548364400416034343698204175472582111952, + 21888242871839275222246405745257275088548364400416034343698203944213054398658, + 352199928075742, + 21888242871839275222246405745257275088548364400416034343698203729435351639652, + 161686804524210, + 458020433168145, + 367257590828041, + 21888242871839275222246405745257275088548364400416034343698203742162515464033, + 21888242871839275222246405745257275088548364400416034343698203824734720164817, + 21888242871839275222246405745257275088548364400416034343698204179467605684634, + 429487098815071, + 328447713435596, + 21888242871839275222246405745257275088548364400416034343698203971785103150029, + 21888242871839275222246405745257275088548364400416034343698203976408496705166, + 461227979337481, + 33414307504144, + 21888242871839275222246405745257275088548364400416034343698204090648650659575, + 548904925230394, + 175120919730047, + 17080414200120, + 528684577462754, + 129302679486956, + 21888242871839275222246405745257275088548364400416034343698203738045534684193, + 21888242871839275222246405745257275088548364400416034343698203634778566884285, + 21888242871839275222246405745257275088548364400416034343698204010756582653267, + 396425195241769, + 21888242871839275222246405745257275088548364400416034343698203953535456605711, + 21888242871839275222246405745257275088548364400416034343698204065097977645157, + 21888242871839275222246405745257275088548364400416034343698203705803476491190, + 552822188705255, + 57226039749153, + 536423158794634, + 509962697671857, + 21888242871839275222246405745257275088548364400416034343698204063936189394863, + 38828749695455, + 450338518374186, + 339095122847354, + 451210323934781, + 21888242871839275222246405745257275088548364400416034343698203775985213031441, + 21888242871839275222246405745257275088548364400416034343698203849707325382923, + 508563897938981, + 21888242871839275222246405745257275088548364400416034343698203700028988468202, + 21888242871839275222246405745257275088548364400416034343698203651640062744937, + 246753530321762, + 44160405568410, + 21888242871839275222246405745257275088548364400416034343698203852151380713260, + 21888242871839275222246405745257275088548364400416034343698204134151356947350, + 528813051536847, + 21888242871839275222246405745257275088548364400416034343698203820626895305490, + 21888242871839275222246405745257275088548364400416034343698203913275858046821, + 71526997393589, + 465964467033187, + 527102535171946, + 127512330940408, + 21888242871839275222246405745257275088548364400416034343698204179841422127788, + 456292689333804, + 520184672471666, + 21888242871839275222246405745257275088548364400416034343698204065936183832737, + 21888242871839275222246405745257275088548364400416034343698203734414531365160, + 297022191927921, + 276667805678275, + 170287230566311, + 18485427970959, + 224296960611953, + 21888242871839275222246405745257275088548364400416034343698203814755174821243, + 504317151821090, + 21888242871839275222246405745257275088548364400416034343698204086203598954706, + 170125309738304, + 21888242871839275222246405745257275088548364400416034343698203839676132434224, + 21888242871839275222246405745257275088548364400416034343698203632161282665076, + 21888242871839275222246405745257275088548364400416034343698203761664982934135, + 410394250035654, + 21888242871839275222246405745257275088548364400416034343698203877829954427466, + 278464164866117, + 21888242871839275222246405745257275088548364400416034343698203769602965176733, + 37129123232279, + 21888242871839275222246405745257275088548364400416034343698204113991695003472, + 296497668712034, + 21888242871839275222246405745257275088548364400416034343698203755230773304594, + 21888242871839275222246405745257275088548364400416034343698203979610768692255, + 68484433361752, + 21888242871839275222246405745257275088548364400416034343698203967557899500512, + 348789049730307, + 324357213723868, + 297977309350255, + 21888242871839275222246405745257275088548364400416034343698203871710986139632, + 476013140186933, + 21888242871839275222246405745257275088548364400416034343698203991042248021773, + 21888242871839275222246405745257275088548364400416034343698203787607378881173, + 21888242871839275222246405745257275088548364400416034343698203944259600813112, + 25999033291569, + 21888242871839275222246405745257275088548364400416034343698203908979558534587, + 21888242871839275222246405745257275088548364400416034343698203855604515731059, + 450740603072886, + 21888242871839275222246405745257275088548364400416034343698204138706761272175, + 233323280834690, + 145600163215652, + 317079082808947, + 21888242871839275222246405745257275088548364400416034343698203937709178665062, + 21888242871839275222246405745257275088548364400416034343698203765310922999521, + 178978879367234, + 21888242871839275222246405745257275088548364400416034343698203902624758936297, + 21888242871839275222246405745257275088548364400416034343698203875815625614164, + 186988630135153, + 21888242871839275222246405745257275088548364400416034343698203926100050250871, + 21888242871839275222246405745257275088548364400416034343698204146613259595439, + 236507242649894, + 19070737551025, + 481965401540150, + 21888242871839275222246405745257275088548364400416034343698203741127074800464, + 453865358568922, + 21888242871839275222246405745257275088548364400416034343698204182598053445371, + 468736496518591, + 49372464436503, + 31034414147268, + 21888242871839275222246405745257275088548364400416034343698204003101409057781, + 244204507774465, + 21888242871839275222246405745257275088548364400416034343698204114074860196994, + 439926288958737, + 384104670390044, + 21888242871839275222246405745257275088548364400416034343698204132838538138218, + 318637777658356, + 238978497182568, + 21888242871839275222246405745257275088548364400416034343698203901279634435236, + 21888242871839275222246405745257275088548364400416034343698204182462757191010, + 21888242871839275222246405745257275088548364400416034343698203825037672469028, + 21888242871839275222246405745257275088548364400416034343698204142106232627659, + 490060911916041, + 78523236818220, + 449775964374775, + 424916739959373, + 21888242871839275222246405745257275088548364400416034343698204016134169640906, + 21888242871839275222246405745257275088548364400416034343698204000327945479107, + 227708049766346, + 376598146959637, + 55850366502300, + 21888242871839275222246405745257275088548364400416034343698204109420261195210, + 21888242871839275222246405745257275088548364400416034343698203794019853348357, + 21888242871839275222246405745257275088548364400416034343698203814990231659703, + 458336337791810, + 21888242871839275222246405745257275088548364400416034343698203819886394400873, + 468775581415411, + 325825770705566, + 21888242871839275222246405745257275088548364400416034343698204109106664439651, + 486815574424155, + 524456233473067, + 363059744683494, + 21888242871839275222246405745257275088548364400416034343698204121391912603180, + 397891897501514, + 35806155971750, + 21888242871839275222246405745257275088548364400416034343698203656293518333818, + 371073750884917, + 329618336043702, + 21888242871839275222246405745257275088548364400416034343698203736017188472412, + 540897967781643, + 325132552549178, + 398104079413082, + 191424951983165, + 21888242871839275222246405745257275088548364400416034343698204012852646813303, + 223226841090818, + 21888242871839275222246405745257275088548364400416034343698203707712373142590, + 364172593946765, + 21888242871839275222246405745257275088548364400416034343698204056704360631659, + 90305682485483, + 21888242871839275222246405745257275088548364400416034343698203842180545422957, + 135758781770764, + 539505114314948, + 21888242871839275222246405745257275088548364400416034343698203635425346726899, + 21888242871839275222246405745257275088548364400416034343698203761173416765195, + 304125058154005, + 477104484881169, + 301029815473988, + 117597663752020, + 21888242871839275222246405745257275088548364400416034343698203660358508423973, + 257722378754964, + 21888242871839275222246405745257275088548364400416034343698203790451103972666, + 124868479665443, + 17379194032560, + 21888242871839275222246405745257275088548364400416034343698203738201408775708, + 21888242871839275222246405745257275088548364400416034343698203715097401290358, + 213285229296236, + 300610323330008, + 561783228578741, + 21888242871839275222246405745257275088548364400416034343698203862500312963821, + 302277449088818, + 28588732861350, + 21888242871839275222246405745257275088548364400416034343698203983937690568268, + 21888242871839275222246405745257275088548364400416034343698203992948721763518, + 108130600442568, + 176611291428411, + 21888242871839275222246405745257275088548364400416034343698204175395823917156, + 21888242871839275222246405745257275088548364400416034343698203802442524066764, + 21888242871839275222246405745257275088548364400416034343698203770447782936798, + 548939140659280, + 21888242871839275222246405745257275088548364400416034343698203686265299638160, + 21888242871839275222246405745257275088548364400416034343698203820290518503660, + 21888242871839275222246405745257275088548364400416034343698203655838899046485, + 283233346411747, + 21888242871839275222246405745257275088548364400416034343698203699543812978568, + 169282186777044, + 21888242871839275222246405745257275088548364400416034343698203657614778037956, + 317303424170866, + 21888242871839275222246405745257275088548364400416034343698203680416103423150, + 187776667416284, + 21888242871839275222246405745257275088548364400416034343698204139488876639944, + 21888242871839275222246405745257275088548364400416034343698203801516390288182, + 21888242871839275222246405745257275088548364400416034343698203789854594361042, + 21888242871839275222246405745257275088548364400416034343698203911138119175986, + 21888242871839275222246405745257275088548364400416034343698203783126359808480, + 21888242871839275222246405745257275088548364400416034343698203647442248016659, + 21888242871839275222246405745257275088548364400416034343698204144540672332336, + 21888242871839275222246405745257275088548364400416034343698204082258991397811, + 21888242871839275222246405745257275088548364400416034343698203986802257947243, + 149819290270429, + 21888242871839275222246405745257275088548364400416034343698203894864119291301, + 21888242871839275222246405745257275088548364400416034343698203958629631827445, + 21888242871839275222246405745257275088548364400416034343698203925699332299198, + 21888242871839275222246405745257275088548364400416034343698203904878016838947, + 394711361196056, + 21888242871839275222246405745257275088548364400416034343698203846810385653090, + 21888242871839275222246405745257275088548364400416034343698203825088275749083, + 21888242871839275222246405745257275088548364400416034343698204133661000983373, + 21888242871839275222246405745257275088548364400416034343698203675617026423499, + 519091016622584, + 548821766335157, + 21888242871839275222246405745257275088548364400416034343698203850113259981456, + 279633313096776, + 309330543442971, + 21888242871839275222246405745257275088548364400416034343698203753189073244982, + 271608596135620, + 115515429922486, + 436591563699593, + 21888242871839275222246405745257275088548364400416034343698203774029736499174, + 313095424898121, + 325930894101114, + 38694430768637, + 21888242871839275222246405745257275088548364400416034343698203842486401016566, + 124158201185318, + 382592653012079, + 46356593413675, + 386593350630519, + 168264722062082, + 21888242871839275222246405745257275088548364400416034343698203663860907267945, + 21888242871839275222246405745257275088548364400416034343698203831237758953079, + 62250579211414, + 479116440035326, + 535161767613887, + 124259319553406, + 517975549863361, + 21888242871839275222246405745257275088548364400416034343698203712724443637627, + 80558318185452, + 240990240853920, + 21888242871839275222246405745257275088548364400416034343698203889168399647712, + 21888242871839275222246405745257275088548364400416034343698203846821486630050, + 546257332887832, + 21888242871839275222246405745257275088548364400416034343698203727378982640463, + 173356089037434, + 68592830225358, + 102898796770335, + 271427558088339, + 411340855418782, + 21888242871839275222246405745257275088548364400416034343698204055881168053399, + 21888242871839275222246405745257275088548364400416034343698204016352824482406, + 21888242871839275222246405745257275088548364400416034343698203663090168528117, + 31402619127078, + 538868453475071, + 21888242871839275222246405745257275088548364400416034343698203794640702670489, + 535807183265179, + 249084243381819, + 342068359152378, + 23283252399203, + 418421019783436, + 68853776149104, + 352030522265977, + 21888242871839275222246405745257275088548364400416034343698204156148349682743, + 305619026203357, + 133364294410292, + 172781346248710, + 21888242871839275222246405745257275088548364400416034343698203931679914822638, + 21888242871839275222246405745257275088548364400416034343698204173872594396328, + 142505733729247, + 184755030963573, + 21888242871839275222246405745257275088548364400416034343698204004410695346408, + 21888242871839275222246405745257275088548364400416034343698204032747719720790, + 21888242871839275222246405745257275088548364400416034343698203893445719330580, + 227350190799421, + 21888242871839275222246405745257275088548364400416034343698204143855110225157, + 21888242871839275222246405745257275088548364400416034343698204020823334981386, + 507431853182710, + 21888242871839275222246405745257275088548364400416034343698204007604121310755, + 21888242871839275222246405745257275088548364400416034343698204062901743454971, + 561074072489911, + 536863943714774, + 21888242871839275222246405745257275088548364400416034343698204129513029015356, + 21888242871839275222246405745257275088548364400416034343698203860719487549431, + 262100620305651, + 21888242871839275222246405745257275088548364400416034343698203967789162490249, + 21888242871839275222246405745257275088548364400416034343698203787924881630364, + 21888242871839275222246405745257275088548364400416034343698204055567266372081, + 429475671123000, + 291446943653845, + 21888242871839275222246405745257275088548364400416034343698203845952082455438, + 543374069529455, + 21888242871839275222246405745257275088548364400416034343698203733900206876891, + 159062557400135, + 21888242871839275222246405745257275088548364400416034343698204089937626592582, + 509084273583664, + 233638076454436, + 21888242871839275222246405745257275088548364400416034343698204018375822783209, + 198570528503048, + 21888242871839275222246405745257275088548364400416034343698203734558075849084, + 294900011525040, + 540276176150477, + 163568131921212, + 21888242871839275222246405745257275088548364400416034343698204109862317500494, + 21888242871839275222246405745257275088548364400416034343698203629724425782482, + 3361075906619, + 108684511416743, + 21888242871839275222246405745257275088548364400416034343698204108378889292417, + 21888242871839275222246405745257275088548364400416034343698204072771128758123, + 21888242871839275222246405745257275088548364400416034343698203962814490210216, + 115434220421361, + 69827762008305, + 21888242871839275222246405745257275088548364400416034343698203892799355977861, + 131271215801716, + 21888242871839275222246405745257275088548364400416034343698203825561938887665, + 401661739450465, + 270726145503181, + 314584624467934, + 324874600748564, + 373260267274535, + 21888242871839275222246405745257275088548364400416034343698204088199809823869, + 42256069276298, + 21888242871839275222246405745257275088548364400416034343698203736640498804659, + 52429942826936, + 476236019662995, + 160807911683383, + 412695255063982, + 21888242871839275222246405745257275088548364400416034343698204168761991895223, + 21888242871839275222246405745257275088548364400416034343698203922482457578374, + 36215761208489, + 396360170169701, + 8497032475058, + 21888242871839275222246405745257275088548364400416034343698203652866019741488, + 400928787822864, + 21888242871839275222246405745257275088548364400416034343698204032303601511885, + 21888242871839275222246405745257275088548364400416034343698204063760096492037, + 21888242871839275222246405745257275088548364400416034343698204177402436783340, + 128739927335696, + 299968502435365, + 21888242871839275222246405745257275088548364400416034343698203829352757053974, + 21888242871839275222246405745257275088548364400416034343698203719238414004428, + 21888242871839275222246405745257275088548364400416034343698203952514138781817, + 21888242871839275222246405745257275088548364400416034343698203651037589897103, + 21888242871839275222246405745257275088548364400416034343698203737545537023055, + 453849142252111, + 36232922562154, + 21888242871839275222246405745257275088548364400416034343698203951063748888207, + 21888242871839275222246405745257275088548364400416034343698203635899419951007, + 21888242871839275222246405745257275088548364400416034343698203775429066159703, + 21888242871839275222246405745257275088548364400416034343698203885583763711306, + 21888242871839275222246405745257275088548364400416034343698203757358468795512, + 70147416911527, + 361787638011427, + 25288329576920, + 21888242871839275222246405745257275088548364400416034343698203958903626806016, + 21888242871839275222246405745257275088548364400416034343698203726301191683775, + 537914769982175, + 357091810806506, + 21888242871839275222246405745257275088548364400416034343698203627319695487014, + 426811332630415, + 107577614471279, + 119919131754390, + 28112649617696, + 196918841738468, + 21888242871839275222246405745257275088548364400416034343698203722548746863434, + 21888242871839275222246405745257275088548364400416034343698203706828099173022, + 21888242871839275222246405745257275088548364400416034343698203818386948049720, + 21888242871839275222246405745257275088548364400416034343698203792629921030213, + 34597257896019, + 21888242871839275222246405745257275088548364400416034343698203789615253124545, + 21888242871839275222246405745257275088548364400416034343698204137042094107270, + 21888242871839275222246405745257275088548364400416034343698204152769120237631, + 71443689662988, + 21888242871839275222246405745257275088548364400416034343698203641341695365058, + 21888242871839275222246405745257275088548364400416034343698203948991756541350, + 167003918960686, + 493727430923399, + 160181134595324, + 428047223731898, + 21888242871839275222246405745257275088548364400416034343698204107547803583013, + 21888242871839275222246405745257275088548364400416034343698203742224929230938, + 289850081801148, + 21888242871839275222246405745257275088548364400416034343698204038157616470663, + 21888242871839275222246405745257275088548364400416034343698203953673314729720, + 21888242871839275222246405745257275088548364400416034343698203782322955516082, + 21888242871839275222246405745257275088548364400416034343698203746486725866426, + 21888242871839275222246405745257275088548364400416034343698204033901348164525, + 21888242871839275222246405745257275088548364400416034343698203844774106183635, + 458424723934256, + 21888242871839275222246405745257275088548364400416034343698203959696470218465, + 21888242871839275222246405745257275088548364400416034343698203943758359968930, + 31823998089622, + 21888242871839275222246405745257275088548364400416034343698204154412151753090, + 343779151884635, + 21888242871839275222246405745257275088548364400416034343698204011842344045475, + 299505140498450, + 21888242871839275222246405745257275088548364400416034343698203656820702253104, + 361224145567430, + 19801709231708, + 431486737007532, + 21888242871839275222246405745257275088548364400416034343698203648663254931873, + 21888242871839275222246405745257275088548364400416034343698204160177845617056, + 21888242871839275222246405745257275088548364400416034343698203938079943224459, + 380512607130784, + 490498060939302, + 392987367245413, + 40581439518143, + 21888242871839275222246405745257275088548364400416034343698204147146991984718, + 21888242871839275222246405745257275088548364400416034343698203863105012061628, + 514841386431264, + 200588690381219, + 390350611284464, + 515232424530490, + 21888242871839275222246405745257275088548364400416034343698203785687288561093, + 394855842300094, + 21888242871839275222246405745257275088548364400416034343698203958073776159958, + 21888242871839275222246405745257275088548364400416034343698204171151140488912, + 150021123593343, + 21888242871839275222246405745257275088548364400416034343698204161758017560958, + 21888242871839275222246405745257275088548364400416034343698204019318538127431, + 21888242871839275222246405745257275088548364400416034343698203937794370171075, + 239689125146344, + 21888242871839275222246405745257275088548364400416034343698203635715027936631, + 21888242871839275222246405745257275088548364400416034343698203778119363031470, + 92212715407001, + 21888242871839275222246405745257275088548364400416034343698203859349964173776, + 538678314744115, + 540511354627667, + 57218690912657, + 471760873444354, + 21888242871839275222246405745257275088548364400416034343698203953187452346318, + 21888242871839275222246405745257275088548364400416034343698203668714645673927, + 130027025518771, + 21888242871839275222246405745257275088548364400416034343698204001859188874830, + 76396148725837, + 21888242871839275222246405745257275088548364400416034343698204028122097020871, + 401324261329003, + 359948364984041, + 77253866484395, + 21888242871839275222246405745257275088548364400416034343698203733608585546449, + 21888242871839275222246405745257275088548364400416034343698203761350235047126, + 481291029320411, + 21888242871839275222246405745257275088548364400416034343698203728101730669579, + 45319277499862, + 166540804601278, + 21888242871839275222246405745257275088548364400416034343698203694604491303746, + 21888242871839275222246405745257275088548364400416034343698203808855837234336, + 21888242871839275222246405745257275088548364400416034343698203735444649740851, + 21888242871839275222246405745257275088548364400416034343698203744662184049416, + 21888242871839275222246405745257275088548364400416034343698203733181284725710, + 21888242871839275222246405745257275088548364400416034343698203722655671303253, + 209160080878632, + 249802309915244, + 25506421756279, + 21888242871839275222246405745257275088548364400416034343698204113021460886030, + 148334520552391, + 21888242871839275222246405745257275088548364400416034343698204013559629591891, + 21888242871839275222246405745257275088548364400416034343698204050163222644547, + 21888242871839275222246405745257275088548364400416034343698203715961739716129, + 21888242871839275222246405745257275088548364400416034343698204144292496986374, + 21888242871839275222246405745257275088548364400416034343698203818546161796784, + 21888242871839275222246405745257275088548364400416034343698203726168655799986, + 275511950524097, + 175959174996071, + 493593036217378, + 149518570372772, + 136187367162909, + 21888242871839275222246405745257275088548364400416034343698204120680374368608, + 6658997084926, + 21888242871839275222246405745257275088548364400416034343698203900887191305012, + 58405864583727, + 21888242871839275222246405745257275088548364400416034343698204147505105749718, + 21888242871839275222246405745257275088548364400416034343698204019892322131536, + 422709224459741, + 47840761872510, + 352237431227665, + 359373162266939, + 489067040437878, + 452670990201145, + 21888242871839275222246405745257275088548364400416034343698203825499846411243, + 558925038763375, + 444764636118479, + 204714033793728, + 21888242871839275222246405745257275088548364400416034343698203789572764876201, + 21888242871839275222246405745257275088548364400416034343698203836883407061301, + 21888242871839275222246405745257275088548364400416034343698203939038985858795, + 81262727221303, + 401383486319480, + 21888242871839275222246405745257275088548364400416034343698204162219871313161, + 21888242871839275222246405745257275088548364400416034343698203628718894394421, + 21888242871839275222246405745257275088548364400416034343698204172965886765524, + 6628946948535, + 21888242871839275222246405745257275088548364400416034343698203712525130962598, + 21888242871839275222246405745257275088548364400416034343698204092834588369504, + 21888242871839275222246405745257275088548364400416034343698203829920151711477, + 253184821338297, + 21888242871839275222246405745257275088548364400416034343698203630503304477501, + 527250490638363, + 21888242871839275222246405745257275088548364400416034343698204097295964362407, + 21888242871839275222246405745257275088548364400416034343698203724732671119423, + 78650045100304, + 21888242871839275222246405745257275088548364400416034343698203901283754166643, + 368124055621059, + 130646832931615, + 309367487026516, + 21888242871839275222246405745257275088548364400416034343698203751663320540337, + 21888242871839275222246405745257275088548364400416034343698204174393543683841, + 21888242871839275222246405745257275088548364400416034343698204125520397559094, + 21888242871839275222246405745257275088548364400416034343698204142510134503966, + 239987241272469, + 21888242871839275222246405745257275088548364400416034343698203746264613643840, + 217955981932924, + 21888242871839275222246405745257275088548364400416034343698203783454982791330, + 290256563241987, + 21888242871839275222246405745257275088548364400416034343698203958732547839521, + 21888242871839275222246405745257275088548364400416034343698204108731079653531, + 94361055214602, + 1163486002550, + 21888242871839275222246405745257275088548364400416034343698203723941748204227, + 21888242871839275222246405745257275088548364400416034343698203941907428489340, + 21888242871839275222246405745257275088548364400416034343698203836160118365606, + 185133667938799, + 21888242871839275222246405745257275088548364400416034343698203930305100550602, + 2488719876090, + 21888242871839275222246405745257275088548364400416034343698203931425428579000, + 413831148245012, + 21888242871839275222246405745257275088548364400416034343698203914779910859617, + 21888242871839275222246405745257275088548364400416034343698203851278785055210, + 21888242871839275222246405745257275088548364400416034343698204176730038911869, + 328938199249290, + 21888242871839275222246405745257275088548364400416034343698203923702739709236, + 21888242871839275222246405745257275088548364400416034343698204090088220538964, + 21888242871839275222246405745257275088548364400416034343698204020209240271312, + 172288461988115, + 482644668464641, + 51902215063850, + 21888242871839275222246405745257275088548364400416034343698204083029936234998, + 21888242871839275222246405745257275088548364400416034343698204049941273792160, + 21888242871839275222246405745257275088548364400416034343698203906168135366935, + 21888242871839275222246405745257275088548364400416034343698204102195487172103, + 21888242871839275222246405745257275088548364400416034343698204063471777239529, + 1355810032988, + 21888242871839275222246405745257275088548364400416034343698203764138728389132, + 21888242871839275222246405745257275088548364400416034343698203821321886515732, + 61156029985194, + 21888242871839275222246405745257275088548364400416034343698203984909070488064, + 245040864691864, + 21888242871839275222246405745257275088548364400416034343698203931976348904850, + 2256110616001, + 369203414297595, + 331604608992684, + 21888242871839275222246405745257275088548364400416034343698203968161020067322, + 21888242871839275222246405745257275088548364400416034343698203715505069408898, + 20542514915894, + 21888242871839275222246405745257275088548364400416034343698203687510004197083, + 21888242871839275222246405745257275088548364400416034343698203749124598922571, + 182266863553259, + 284431337929701, + 21888242871839275222246405745257275088548364400416034343698203649297152996488, + 21888242871839275222246405745257275088548364400416034343698203953662554845012, + 21888242871839275222246405745257275088548364400416034343698203967046206513892, + 21888242871839275222246405745257275088548364400416034343698203675499171827891, + 21888242871839275222246405745257275088548364400416034343698204123486038497041, + 21888242871839275222246405745257275088548364400416034343698203640581707807041, + 21888242871839275222246405745257275088548364400416034343698204166971526982968, + 21888242871839275222246405745257275088548364400416034343698203848524329474133, + 21888242871839275222246405745257275088548364400416034343698203700010595589550, + 21888242871839275222246405745257275088548364400416034343698203923412084614036, + 275171250888077, + 21888242871839275222246405745257275088548364400416034343698204159908526426699, + 21888242871839275222246405745257275088548364400416034343698203682858158314206, + 21888242871839275222246405745257275088548364400416034343698204134318953191695, + 21888242871839275222246405745257275088548364400416034343698203684162427139748, + 79796131192236, + 21888242871839275222246405745257275088548364400416034343698203800522910285543, + 21888242871839275222246405745257275088548364400416034343698204058378679264718, + 21888242871839275222246405745257275088548364400416034343698203680823056988517, + 21888242871839275222246405745257275088548364400416034343698203984889983350781, + 246151733175845, + 21888242871839275222246405745257275088548364400416034343698204125711246790197, + 21888242871839275222246405745257275088548364400416034343698204143803174624358, + 21888242871839275222246405745257275088548364400416034343698203894005614405361, + 21888242871839275222246405745257275088548364400416034343698204079495481478061, + 164201452456629, + 21888242871839275222246405745257275088548364400416034343698204182907354322715, + 21888242871839275222246405745257275088548364400416034343698203885869105600882, + 507964924265430, + 21888242871839275222246405745257275088548364400416034343698204100512939996110, + 60836639714351, + 336562957170815, + 294789622064952, + 85968639336976, + 21888242871839275222246405745257275088548364400416034343698203776313875412063, + 271775608243503, + 312127205894833, + 21888242871839275222246405745257275088548364400416034343698203998878565377252, + 21888242871839275222246405745257275088548364400416034343698203867122274496385, + 21888242871839275222246405745257275088548364400416034343698203933594537177422, + 21888242871839275222246405745257275088548364400416034343698204159591787635552, + 37586380106472, + 178588725770074, + 21888242871839275222246405745257275088548364400416034343698203859007409633964, + 472620122133144, + 348889144205762, + 21888242871839275222246405745257275088548364400416034343698203853938633585987, + 5455647895600, + 420344062059599, + 21888242871839275222246405745257275088548364400416034343698203876579256371742, + 21888242871839275222246405745257275088548364400416034343698204157616677690158, + 279642789007570, + 21888242871839275222246405745257275088548364400416034343698203808820279374166, + 21888242871839275222246405745257275088548364400416034343698204140474374435440, + 143350777316387, + 21888242871839275222246405745257275088548364400416034343698203649968319307803, + 284824189498756, + 21888242871839275222246405745257275088548364400416034343698203924914004519883, + 21888242871839275222246405745257275088548364400416034343698204056652730487591, + 21888242871839275222246405745257275088548364400416034343698204148636492604998, + 427204763481909, + 259189682343939, + 21888242871839275222246405745257275088548364400416034343698203711356655997002, + 484008010143296, + 21888242871839275222246405745257275088548364400416034343698203992674131887819, + 265192402753810, + 21888242871839275222246405745257275088548364400416034343698204073197468671496, + 546975144413152, + 21888242871839275222246405745257275088548364400416034343698204029092731065601, + 21888242871839275222246405745257275088548364400416034343698204039587448864653, + 8636668676053, + 21888242871839275222246405745257275088548364400416034343698203758616235854529, + 217339029099870, + 21888242871839275222246405745257275088548364400416034343698203854537447353516, + 21888242871839275222246405745257275088548364400416034343698204039778031016196, + 501122002445440, + 21888242871839275222246405745257275088548364400416034343698204134736076587887, + 21888242871839275222246405745257275088548364400416034343698203949841404682375, + 21888242871839275222246405745257275088548364400416034343698204064264840750206, + 482061272783119, + 21888242871839275222246405745257275088548364400416034343698203646521585257145, + 540141084901656, + 21888242871839275222246405745257275088548364400416034343698203822854669918634, + 159787425748566, + 479905134230089, + 50197764923817, + 21888242871839275222246405745257275088548364400416034343698203654402882120613, + 93626174198469, + 21888242871839275222246405745257275088548364400416034343698204156618639420287, + 388346026184363, + 21888242871839275222246405745257275088548364400416034343698203781399945400779, + 21888242871839275222246405745257275088548364400416034343698203887817842972807, + 441425356099594, + 21888242871839275222246405745257275088548364400416034343698204025754470029734, + 21888242871839275222246405745257275088548364400416034343698203926167837755480, + 242553955723974, + 10347058459300, + 21888242871839275222246405745257275088548364400416034343698203683329023960186, + 192246199802150, + 497758489028701, + 140033312366294, + 322943773573368, + 21888242871839275222246405745257275088548364400416034343698203929609218314114, + 21888242871839275222246405745257275088548364400416034343698203989766681757063, + 551161532285553, + 21888242871839275222246405745257275088548364400416034343698203961265965898996, + 21888242871839275222246405745257275088548364400416034343698203890844214309871, + 398965908322332, + 21888242871839275222246405745257275088548364400416034343698203833101357542522, + 372247984195597, + 21888242871839275222246405745257275088548364400416034343698203943904822381013, + 21888242871839275222246405745257275088548364400416034343698203689340805019530, + 521455834815077, + 296402984617156, + 502423980950045, + 21888242871839275222246405745257275088548364400416034343698204010741036100428, + 21888242871839275222246405745257275088548364400416034343698203886739145239084, + 21888242871839275222246405745257275088548364400416034343698204140304889538937, + 353195266433204, + 21888242871839275222246405745257275088548364400416034343698204172864926103873, + 21888242871839275222246405745257275088548364400416034343698204110197405767591, + 21888242871839275222246405745257275088548364400416034343698203830443607597002, + 177751520747495, + 140536879732456, + 280498374592380, + 21888242871839275222246405745257275088548364400416034343698203682580072926435, + 21888242871839275222246405745257275088548364400416034343698203947021246738271, + 21888242871839275222246405745257275088548364400416034343698203939658453810336, + 542444886470497, + 519462641523854, + 21888242871839275222246405745257275088548364400416034343698203892292509245546, + 21888242871839275222246405745257275088548364400416034343698203712104827393650, + 21888242871839275222246405745257275088548364400416034343698203741968972320910, + 395993129867590, + 399356796956034, + 155575433528078, + 21888242871839275222246405745257275088548364400416034343698203683389694490827, + 222480546402612, + 297814936789537, + 21888242871839275222246405745257275088548364400416034343698203940322037192050, + 21888242871839275222246405745257275088548364400416034343698203716060660404924, + 21888242871839275222246405745257275088548364400416034343698204034651189031430, + 73863870982521, + 21888242871839275222246405745257275088548364400416034343698203816247251578792, + 21888242871839275222246405745257275088548364400416034343698203825251485252409, + 21888242871839275222246405745257275088548364400416034343698203769660657607133, + 21888242871839275222246405745257275088548364400416034343698203731458910809242, + 386083146855714, + 91606764103592, + 159509775802431, + 261542936606556, + 21888242871839275222246405745257275088548364400416034343698204118426055590268, + 21888242871839275222246405745257275088548364400416034343698203857868809857516, + 21888242871839275222246405745257275088548364400416034343698203715915477144212, + 21888242871839275222246405745257275088548364400416034343698203933371942029152, + 451095243895052, + 21888242871839275222246405745257275088548364400416034343698203679578244125379, + 21888242871839275222246405745257275088548364400416034343698203994768618728702, + 21888242871839275222246405745257275088548364400416034343698203651444416286559, + 7731971934885, + 21888242871839275222246405745257275088548364400416034343698203651908313974535, + 381148409990046, + 21888242871839275222246405745257275088548364400416034343698203704281594755320, + 2704950904992, + 435660027324901, + 337695768176159, + 21888242871839275222246405745257275088548364400416034343698204088832203017231, + 21888242871839275222246405745257275088548364400416034343698203874609849069552, + 347044415711124, + 21888242871839275222246405745257275088548364400416034343698203812022443852246, + 21888242871839275222246405745257275088548364400416034343698203728558768857937, + 21888242871839275222246405745257275088548364400416034343698203626124319763517, + 21888242871839275222246405745257275088548364400416034343698203688465328914829, + 323284882226076, + 21888242871839275222246405745257275088548364400416034343698203730630846328533, + 506409984044483, + 21888242871839275222246405745257275088548364400416034343698203802633805940433, + 313209167690488, + 297113231218441, + 394029403216274, + 111928436583499, + 292697927800480, + 193492553898708, + 276206970482245, + 274785295590816, + 191480018594834, + 487729414755647, + 21888242871839275222246405745257275088548364400416034343698203730986909021435, + 21888242871839275222246405745257275088548364400416034343698203813383157093760, + 21888242871839275222246405745257275088548364400416034343698204089059004962298, + 156399332775259, + 296224325264356, + 97944113345139, + 21888242871839275222246405745257275088548364400416034343698204028634226715027, + 21888242871839275222246405745257275088548364400416034343698203892762169336664, + 324526064165145, + 455681268153398, + 398240119800306, + 235289896124081, + 84676091863630, + 21888242871839275222246405745257275088548364400416034343698203690500664372903, + 279177533400122, + 21888242871839275222246405745257275088548364400416034343698204072080109800547, + 181646900549562, + 21888242871839275222246405745257275088548364400416034343698204052821345680218, + 21888242871839275222246405745257275088548364400416034343698203799895249321301, + 21888242871839275222246405745257275088548364400416034343698203841413595272050, + 451753667757443, + 21888242871839275222246405745257275088548364400416034343698203785241517875768, + 521745706463638, + 21888242871839275222246405745257275088548364400416034343698204120557739943505, + 436236661069856, + 369870311435140, + 21888242871839275222246405745257275088548364400416034343698203835577498789228, + 404902385312261, + 21888242871839275222246405745257275088548364400416034343698203764089138819056, + 21888242871839275222246405745257275088548364400416034343698203925898427437479, + 524880854354390, + 121444728395197, + 535504709168035, + 530232452086816, + 381247743808836, + 222440559890226, + 193914427628903, + 307253630629221, + 21888242871839275222246405745257275088548364400416034343698203914961529006173, + 21888242871839275222246405745257275088548364400416034343698203945307094334402, + 246534438619770, + 337396586049920, + 21888242871839275222246405745257275088548364400416034343698203800617305017211, + 21888242871839275222246405745257275088548364400416034343698203694096604516773, + 21888242871839275222246405745257275088548364400416034343698203659916559913209, + 145274310737623, + 21888242871839275222246405745257275088548364400416034343698203637756396548166, + 444079568075535, + 329425802469758, + 21888242871839275222246405745257275088548364400416034343698203862646672005671, + 21888242871839275222246405745257275088548364400416034343698204029927766227460, + 520389765014174, + 187661549890780, + 235498416063591, + 21888242871839275222246405745257275088548364400416034343698203963474793560295, + 406900096969094, + 21888242871839275222246405745257275088548364400416034343698203914450029485335, + 21888242871839275222246405745257275088548364400416034343698204024071275027458, + 427584138512249, + 295556912790863, + 231760784055426, + 22319550326465, + 21888242871839275222246405745257275088548364400416034343698203883735405362353, + 21888242871839275222246405745257275088548364400416034343698203813730711690348, + 312166459215907, + 7598094347731, + 21888242871839275222246405745257275088548364400416034343698203706254398756179, + 133209471761419, + 21888242871839275222246405745257275088548364400416034343698204092328749935503, + 21888242871839275222246405745257275088548364400416034343698204137680409633075, + 204812128079710, + 37469694408366, + 132372185646754, + 21888242871839275222246405745257275088548364400416034343698203900420233323130, + 21888242871839275222246405745257275088548364400416034343698203751975844148928, + 21888242871839275222246405745257275088548364400416034343698204086237857524110, + 21888242871839275222246405745257275088548364400416034343698204114648402010520, + 249571746296501, + 437949543993322, + 21888242871839275222246405745257275088548364400416034343698203885920177103164, + 21888242871839275222246405745257275088548364400416034343698204130487308740430, + 21888242871839275222246405745257275088548364400416034343698204175995729049690, + 372332181819679, + 21888242871839275222246405745257275088548364400416034343698203675690480690446, + 21888242871839275222246405745257275088548364400416034343698203847787871708061, + 211381857254889, + 25582355399367, + 279952356795790, + 21888242871839275222246405745257275088548364400416034343698203963985168845704, + 465672731745208, + 21888242871839275222246405745257275088548364400416034343698203760764061729071, + 51473769073353, + 21888242871839275222246405745257275088548364400416034343698203657657685511926, + 21888242871839275222246405745257275088548364400416034343698203782620117456901, + 59622903806466, + 21888242871839275222246405745257275088548364400416034343698203830048778856063, + 385113661477178, + 200386674989926, + 346061657426883, + 21888242871839275222246405745257275088548364400416034343698203634556671280413, + 225325035962615, + 468057931375896, + 533861173801792, + 21888242871839275222246405745257275088548364400416034343698204169654238218224, + 399785159541915, + 21888242871839275222246405745257275088548364400416034343698203676943121753111, + 21888242871839275222246405745257275088548364400416034343698203762918092667951, + 21888242871839275222246405745257275088548364400416034343698204139313625905966, + 21888242871839275222246405745257275088548364400416034343698203632619508119257, + 21888242871839275222246405745257275088548364400416034343698203931309407676638, + 21888242871839275222246405745257275088548364400416034343698203754952851868317, + 76153203239649, + 21888242871839275222246405745257275088548364400416034343698203646603464578796, + 541920060400086, + 274430191439966, + 21888242871839275222246405745257275088548364400416034343698204173703588999192, + 404800620608855, + 62325368963510, + 21888242871839275222246405745257275088548364400416034343698204113175965446165, + 21888242871839275222246405745257275088548364400416034343698203694457274141721, + 21888242871839275222246405745257275088548364400416034343698204023549169622242, + 293692679743724, + 164472070009884, + 21888242871839275222246405745257275088548364400416034343698203676191218924871, + 21888242871839275222246405745257275088548364400416034343698204004615800131476, + 21888242871839275222246405745257275088548364400416034343698203765668634329719, + 21888242871839275222246405745257275088548364400416034343698204097055504633973, + 146603245971873, + 21888242871839275222246405745257275088548364400416034343698203738905445788830, + 117656135088371, + 21888242871839275222246405745257275088548364400416034343698204076636922490382, + 113851743325920, + 21888242871839275222246405745257275088548364400416034343698204003874016686275, + 343238927817631, + 21888242871839275222246405745257275088548364400416034343698204038541739271733, + 386202853237816, + 5804387764950, + 185822432784048, + 134645311600121, + 75444260688043, + 189541359674556, + 86887055511212, + 21888242871839275222246405745257275088548364400416034343698203736755572712236, + 21888242871839275222246405745257275088548364400416034343698204163414705284858, + 92146874807476, + 112291537607409, + 494726587630807, + 523753056205289, + 136274901012606, + 501942049648347, + 358070272459626, + 536875038362273, + 322126169053021, + 21888242871839275222246405745257275088548364400416034343698203758958957085534, + 21888242871839275222246405745257275088548364400416034343698203736098626841797, + 411391360104543, + 300431374039643, + 99995011418252, + 383806534339427, + 85574364525884, + 386847313103291, + 422376570924384, + 21888242871839275222246405745257275088548364400416034343698204156500063152043, + 78806483023027, + 21888242871839275222246405745257275088548364400416034343698203861991770680435, + 243813131630560, + 387168128877645, + 506720731546247, + 241034102334610, + 379380632099868, + 538843480271649, + 21888242871839275222246405745257275088548364400416034343698204185146023188342, + 133090345739676, + 21888242871839275222246405745257275088548364400416034343698204125726794368701, + 21888242871839275222246405745257275088548364400416034343698204160395690993399, + 38057754940521, + 21888242871839275222246405745257275088548364400416034343698203774745252005924, + 21888242871839275222246405745257275088548364400416034343698203946687831998715, + 21888242871839275222246405745257275088548364400416034343698203772191675815474, + 485119141967585, + 21888242871839275222246405745257275088548364400416034343698203872334797225799, + 21888242871839275222246405745257275088548364400416034343698203795920453089003, + 307387416903581, + 334676910860379, + 173073165130570, + 73373580191854, + 116647730501949, + 21888242871839275222246405745257275088548364400416034343698203879985315142155, + 184405286079066, + 21888242871839275222246405745257275088548364400416034343698204156322230149386, + 21888242871839275222246405745257275088548364400416034343698204074916830165192, + 21888242871839275222246405745257275088548364400416034343698203838064570165449, + 417027466651439, + 21888242871839275222246405745257275088548364400416034343698203999692012643104, + 21888242871839275222246405745257275088548364400416034343698203651455755674289, + 94710227699836, + 21888242871839275222246405745257275088548364400416034343698204155361702837972, + 21888242871839275222246405745257275088548364400416034343698203867259837735819, + 425999285275166, + 21888242871839275222246405745257275088548364400416034343698204073527868101722, + 21888242871839275222246405745257275088548364400416034343698203799303402315520, + 21888242871839275222246405745257275088548364400416034343698203678870270621498, + 21888242871839275222246405745257275088548364400416034343698203753899384406756, + 249710332223025, + 21888242871839275222246405745257275088548364400416034343698203974436162627536, + 43712075424479, + 372211191068136, + 138280252634552, + 356760345006310, + 21888242871839275222246405745257275088548364400416034343698203717656314105277, + 21888242871839275222246405745257275088548364400416034343698204046936065525280, + 21888242871839275222246405745257275088548364400416034343698203691024187772730, + 21888242871839275222246405745257275088548364400416034343698203899108777499093, + 368613901055761, + 21888242871839275222246405745257275088548364400416034343698203833503897875894, + 21888242871839275222246405745257275088548364400416034343698203799374622028903, + 21888242871839275222246405745257275088548364400416034343698203985449433861125, + 379974303911736, + 21888242871839275222246405745257275088548364400416034343698203920393994696293, + 21888242871839275222246405745257275088548364400416034343698204104908291315871, + 21888242871839275222246405745257275088548364400416034343698203915146673900000, + 401445077064000, + 349684571733154, + 21888242871839275222246405745257275088548364400416034343698204069985529535428, + 369896969188110, + 110875454417887, + 21888242871839275222246405745257275088548364400416034343698204054368042618248, + 162353473741976, + 318843826189801, + 52211437215465, + 21888242871839275222246405745257275088548364400416034343698204157484483394491, + 432511998892224, + 21888242871839275222246405745257275088548364400416034343698203682827182135449, + 21888242871839275222246405745257275088548364400416034343698203730125114417358, + 518518065463134, + 21888242871839275222246405745257275088548364400416034343698203875259817068520, + 21888242871839275222246405745257275088548364400416034343698203973501949482894, + 21888242871839275222246405745257275088548364400416034343698203676694116122139, + 282922967869562, + 183909521787408, + 136795148532570, + 21888242871839275222246405745257275088548364400416034343698204079359001260194, + 21888242871839275222246405745257275088548364400416034343698203907979061140108, + 417639675518864, + 420562704052713, + 21888242871839275222246405745257275088548364400416034343698204151476652062639, + 21888242871839275222246405745257275088548364400416034343698203887420788479097, + 38526638507883, + 21888242871839275222246405745257275088548364400416034343698204087854273018484, + 324176545657186, + 453806651679172, + 90837179045038, + 542375414162329, + 89392703166484, + 135490517507097, + 21888242871839275222246405745257275088548364400416034343698204094666254814662, + 21888242871839275222246405745257275088548364400416034343698203975182829008663, + 21888242871839275222246405745257275088548364400416034343698203641229313221770, + 21888242871839275222246405745257275088548364400416034343698204135172102320805, + 21888242871839275222246405745257275088548364400416034343698203825012439511974, + 21888242871839275222246405745257275088548364400416034343698203625197350748958, + 471586258905785, + 183407219648096, + 69575682569376, + 21888242871839275222246405745257275088548364400416034343698203999683053663078, + 21888242871839275222246405745257275088548364400416034343698203892642678726368, + 21888242871839275222246405745257275088548364400416034343698203648821267736307, + 21888242871839275222246405745257275088548364400416034343698203860890144242899, + 118719547781449, + 21888242871839275222246405745257275088548364400416034343698203809760405770258, + 21888242871839275222246405745257275088548364400416034343698203644813555445182, + 21888242871839275222246405745257275088548364400416034343698203873818966039806, + 237150613044533, + 143721793802607, + 436267399100783, + 298853677936500, + 21888242871839275222246405745257275088548364400416034343698204100606784342483, + 66922289808418, + 217806256829342, + 21888242871839275222246405745257275088548364400416034343698203937929850622171, + 21888242871839275222246405745257275088548364400416034343698204011737108455035, + 21888242871839275222246405745257275088548364400416034343698203854953848400943, + 21888242871839275222246405745257275088548364400416034343698203905715459636566, + 21888242871839275222246405745257275088548364400416034343698203992465066662622, + 239832340841167, + 19923612446776, + 21888242871839275222246405745257275088548364400416034343698203774829943088466, + 21888242871839275222246405745257275088548364400416034343698204172200545486798, + 21888242871839275222246405745257275088548364400416034343698203973887225683421, + 112314683750618, + 21888242871839275222246405745257275088548364400416034343698204039617413092752, + 223573658559615, + 21888242871839275222246405745257275088548364400416034343698203692943124428145, + 480487277285566, + 460831584178267, + 459876406374988, + 21888242871839275222246405745257275088548364400416034343698204068934328877869, + 21888242871839275222246405745257275088548364400416034343698203657715432796526, + 190522355252968, + 366525884187344, + 197751160832936, + 259115895679766, + 21888242871839275222246405745257275088548364400416034343698203921261101410183, + 185476540471544, + 538139345268356, + 374956612303651, + 21888242871839275222246405745257275088548364400416034343698204082261504044179, + 68130892535794, + 21888242871839275222246405745257275088548364400416034343698204092219319174075, + 271221305364099, + 279812085237596, + 97404298103377, + 496462344021813, + 292708576050895, + 21888242871839275222246405745257275088548364400416034343698203804648671400994, + 218667047782727, + 425869947852411, + 59567721737787, + 21888242871839275222246405745257275088548364400416034343698203798013940956091, + 21888242871839275222246405745257275088548364400416034343698204037648134914619, + 21888242871839275222246405745257275088548364400416034343698203976280037499159, + 467979716430047, + 88213292492604, + 21888242871839275222246405745257275088548364400416034343698204033930502482508, + 399268024263084, + 193797691195611, + 292333773801139, + 534232966692495, + 21888242871839275222246405745257275088548364400416034343698204088584186563493, + 21888242871839275222246405745257275088548364400416034343698203885696633999318, + 21888242871839275222246405745257275088548364400416034343698203641131498859395, + 131757883495942, + 21888242871839275222246405745257275088548364400416034343698204128579629978988, + 21888242871839275222246405745257275088548364400416034343698204042351903514533, + 21888242871839275222246405745257275088548364400416034343698203888308095895258, + 510273237191788, + 410424303456273, + 21888242871839275222246405745257275088548364400416034343698203792903743999454, + 460863935556668, + 308924751955728, + 21888242871839275222246405745257275088548364400416034343698204021542378790283, + 117191310851118, + 98841759071663, + 176612520802484, + 21888242871839275222246405745257275088548364400416034343698203820810372264330, + 50548362107345, + 327797198496230, + 21888242871839275222246405745257275088548364400416034343698203755310190641247, + 21888242871839275222246405745257275088548364400416034343698204026535429855935, + 412657953317932, + 118911863674191, + 19785210910139, + 55607936133172, + 476282213266027, + 21888242871839275222246405745257275088548364400416034343698204120449379047117, + 21888242871839275222246405745257275088548364400416034343698204004906942062917, + 21888242871839275222246405745257275088548364400416034343698203723306638280713, + 21888242871839275222246405745257275088548364400416034343698204175734060216021, + 416316439092161, + 21888242871839275222246405745257275088548364400416034343698204009272775567309, + 501467848528164, + 21888242871839275222246405745257275088548364400416034343698204159934454464005, + 250265711144799, + 21888242871839275222246405745257275088548364400416034343698203794094115802620, + 21888242871839275222246405745257275088548364400416034343698203859688228122381, + 197180179688758, + 247874370999384, + 21888242871839275222246405745257275088548364400416034343698204060700819955856, + 279479419491521, + 21888242871839275222246405745257275088548364400416034343698203974004407693779, + 540182200922916, + 215967490305368, + 21888242871839275222246405745257275088548364400416034343698203945145295864038, + 250355948782357, + 21888242871839275222246405745257275088548364400416034343698204072078921765746, + 245047040663997, + 21888242871839275222246405745257275088548364400416034343698203725668471582940, + 487560370310882, + 257631999198796, + 21888242871839275222246405745257275088548364400416034343698203926111545360019, + 128778669335791, + 190018667136490, + 518576135244414, + 21888242871839275222246405745257275088548364400416034343698203694674680969200, + 40650262544009, + 21888242871839275222246405745257275088548364400416034343698204172678177989252, + 21888242871839275222246405745257275088548364400416034343698203983744159784322, + 364731493427385, + 538422776436130, + 189489994949744, + 21888242871839275222246405745257275088548364400416034343698203939899781488761, + 21888242871839275222246405745257275088548364400416034343698204138334916344934, + 21888242871839275222246405745257275088548364400416034343698204131984927627646, + 370325737505743, + 21888242871839275222246405745257275088548364400416034343698204063901412238974, + 21888242871839275222246405745257275088548364400416034343698204144639006078189, + 21888242871839275222246405745257275088548364400416034343698203709583735730900, + 236160206044290, + 38492804710667, + 126814128957366, + 102865059140755, + 485782950229427, + 21888242871839275222246405745257275088548364400416034343698203799402588912460, + 21888242871839275222246405745257275088548364400416034343698203818060025169495, + 285005265225521, + 93555826183891, + 21888242871839275222246405745257275088548364400416034343698203807641461270983, + 80652842580169, + 21888242871839275222246405745257275088548364400416034343698203984121724311976, + 428571727517167, + 492638950232441, + 21888242871839275222246405745257275088548364400416034343698203706014746062498, + 21888242871839275222246405745257275088548364400416034343698203839693873615002, + 21888242871839275222246405745257275088548364400416034343698203879006441545735, + 266159649429265, + 401528509051973, + 21888242871839275222246405745257275088548364400416034343698203969583857104292, + 90342606536935, + 173928926080225, + 21888242871839275222246405745257275088548364400416034343698203624316090594983, + 291705074417366, + 468712513991412, + 508969819737922, + 21888242871839275222246405745257275088548364400416034343698204077451979802155, + 21888242871839275222246405745257275088548364400416034343698203930278112961286, + 39387437996294, + 21888242871839275222246405745257275088548364400416034343698203647153272718848, + 278387472324082, + 364814428698499, + 21888242871839275222246405745257275088548364400416034343698203772277248617920, + 174459272581441, + 21888242871839275222246405745257275088548364400416034343698204153166870986488, + 21888242871839275222246405745257275088548364400416034343698204040836323124452, + 489782220586405, + 120306306436665, + 21888242871839275222246405745257275088548364400416034343698204098708742710883, + 21888242871839275222246405745257275088548364400416034343698203882697228163206, + 466524882998967, + 21888242871839275222246405745257275088548364400416034343698203973357003128290, + 21888242871839275222246405745257275088548364400416034343698204092789308813528, + 413953284136145, + 21888242871839275222246405745257275088548364400416034343698204027809390270726, + 2719782236434, + 164131518131695, + 247245506829955, + 459129712674874, + 326992442705219, + 555648340999157, + 21888242871839275222246405745257275088548364400416034343698204030982850171036, + 21888242871839275222246405745257275088548364400416034343698203672493994988891, + 21888242871839275222246405745257275088548364400416034343698203692606091015492, + 21888242871839275222246405745257275088548364400416034343698203658932117966945, + 11762470186561, + 237558500834277, + 21888242871839275222246405745257275088548364400416034343698203798193909818807, + 21888242871839275222246405745257275088548364400416034343698203690666755113056, + 115188643237827, + 108140884149749, + 21888242871839275222246405745257275088548364400416034343698203633165678203898, + 21888242871839275222246405745257275088548364400416034343698204006052015463497, + 21888242871839275222246405745257275088548364400416034343698203954672686742624, + 21888242871839275222246405745257275088548364400416034343698203945621470840667, + 21888242871839275222246405745257275088548364400416034343698203750847375920742, + 453289822582168, + 21888242871839275222246405745257275088548364400416034343698203849037400308040, + 290792343811603, + 21888242871839275222246405745257275088548364400416034343698204125799878229960, + 21888242871839275222246405745257275088548364400416034343698204062589010156308, + 21888242871839275222246405745257275088548364400416034343698203859994828325624, + 21888242871839275222246405745257275088548364400416034343698204035793146643261, + 21888242871839275222246405745257275088548364400416034343698203770537304782728, + 422554276785176, + 21888242871839275222246405745257275088548364400416034343698204040326284570676, + 21888242871839275222246405745257275088548364400416034343698204163378992302698, + 21888242871839275222246405745257275088548364400416034343698204135774788876774, + 21888242871839275222246405745257275088548364400416034343698203989132484685109, + 549984575651791, + 439603589535261, + 389672641098746, + 227995763934833, + 35427606744757, + 319065935581176, + 294094610491183, + 252070270786770, + 443883588524129, + 21888242871839275222246405745257275088548364400416034343698204053638539604048, + 294520089808705, + 69478206266129, + 21888242871839275222246405745257275088548364400416034343698203801300016991245, + 226385815582058, + 21888242871839275222246405745257275088548364400416034343698203997635643032177, + 21888242871839275222246405745257275088548364400416034343698203695323986568699, + 21888242871839275222246405745257275088548364400416034343698204058087869271561, + 21888242871839275222246405745257275088548364400416034343698203858150929644467, + 335966851315194, + 21888242871839275222246405745257275088548364400416034343698203824634537789307, + 358768820575591, + 449228065374706, + 21888242871839275222246405745257275088548364400416034343698203978694555753536, + 350383649385075, + 21888242871839275222246405745257275088548364400416034343698203811667862149003, + 21888242871839275222246405745257275088548364400416034343698204004915922301419, + 21888242871839275222246405745257275088548364400416034343698203832976054685407, + 21888242871839275222246405745257275088548364400416034343698203709449651878099, + 21888242871839275222246405745257275088548364400416034343698203985076093109560, + 21888242871839275222246405745257275088548364400416034343698204150096702927612, + 23349267635341, + 21888242871839275222246405745257275088548364400416034343698203933205535524007, + 340967232079441, + 21888242871839275222246405745257275088548364400416034343698203875758670368432, + 21888242871839275222246405745257275088548364400416034343698204048137807406924, + 416035549508757, + 21888242871839275222246405745257275088548364400416034343698203934186049034643, + 21888242871839275222246405745257275088548364400416034343698203831172759367203, + 21888242871839275222246405745257275088548364400416034343698203784488999510254, + 55755730924576, + 21888242871839275222246405745257275088548364400416034343698203721742419317025, + 21888242871839275222246405745257275088548364400416034343698203775236523592670, + 21888242871839275222246405745257275088548364400416034343698203931368447773638, + 389000358448833, + 537735302116209, + 125312322378657, + 21888242871839275222246405745257275088548364400416034343698204179565996055512, + 21888242871839275222246405745257275088548364400416034343698204058383953587576, + 21888242871839275222246405745257275088548364400416034343698204091790041764849, + 155578723572696, + 296353597177732, + 280772865779585, + 21888242871839275222246405745257275088548364400416034343698203738990359837382, + 21888242871839275222246405745257275088548364400416034343698203880639581555040, + 204260227057136, + 21888242871839275222246405745257275088548364400416034343698203795414336604618, + 21888242871839275222246405745257275088548364400416034343698203919902569917647, + 109129667360480, + 397275708079787, + 21888242871839275222246405745257275088548364400416034343698204042661111467869, + 49209100564605, + 347186063176497, + 21888242871839275222246405745257275088548364400416034343698203762312532675015, + 21888242871839275222246405745257275088548364400416034343698203936626788027533, + 350089543100240, + 21888242871839275222246405745257275088548364400416034343698203724689849810319, + 21888242871839275222246405745257275088548364400416034343698203668547355134080, + 21888242871839275222246405745257275088548364400416034343698203717256201619268, + 21888242871839275222246405745257275088548364400416034343698204085926747409242, + 21888242871839275222246405745257275088548364400416034343698204096961544843907, + 21888242871839275222246405745257275088548364400416034343698203780837933224939, + 94253117707483, + 6596235604145, + 449974100629832, + 21888242871839275222246405745257275088548364400416034343698203640236167340770, + 21888242871839275222246405745257275088548364400416034343698203859544935672948, + 121825427463911, + 313823387176998, + 21888242871839275222246405745257275088548364400416034343698203902789837668512, + 21888242871839275222246405745257275088548364400416034343698203855755777975343, + 21888242871839275222246405745257275088548364400416034343698203824370475999224, + 21888242871839275222246405745257275088548364400416034343698203785593549530656, + 21888242871839275222246405745257275088548364400416034343698203860506150524271, + 21888242871839275222246405745257275088548364400416034343698203641262849671488, + 21888242871839275222246405745257275088548364400416034343698203684027643696727, + 373142498681517, + 21888242871839275222246405745257275088548364400416034343698203798120270526532, + 519624891143222, + 21888242871839275222246405745257275088548364400416034343698203624175139710679, + 371671966792800, + 21888242871839275222246405745257275088548364400416034343698203985335014476584, + 21888242871839275222246405745257275088548364400416034343698203747450504444236, + 458887188038422, + 21888242871839275222246405745257275088548364400416034343698203781644546446807, + 21888242871839275222246405745257275088548364400416034343698204096542477322298, + 526151305788925, + 512988903279682, + 488830191263688, + 390959856753734, + 69082180624978, + 397758478694777, + 21888242871839275222246405745257275088548364400416034343698203668666057609674, + 21888242871839275222246405745257275088548364400416034343698204083132775784542, + 501918934713424, + 21888242871839275222246405745257275088548364400416034343698203806540168366513, + 1345625238125, + 21888242871839275222246405745257275088548364400416034343698204143029521229746, + 21888242871839275222246405745257275088548364400416034343698203783763233297812, + 12766043914726, + 21888242871839275222246405745257275088548364400416034343698203756589619651455, + 21888242871839275222246405745257275088548364400416034343698203844075634341279, + 21888242871839275222246405745257275088548364400416034343698203686764345438712, + 492295731124109, + 168852198099687, + 345900354850291, + 487163588643896, + 21888242871839275222246405745257275088548364400416034343698203911489906521671, + 21888242871839275222246405745257275088548364400416034343698203958308135712937, + 21888242871839275222246405745257275088548364400416034343698203675181929906188, + 21888242871839275222246405745257275088548364400416034343698203666146210051536, + 21888242871839275222246405745257275088548364400416034343698203728119607419157, + 21888242871839275222246405745257275088548364400416034343698204114484090048607, + 61096995560570, + 230084302931544, + 21888242871839275222246405745257275088548364400416034343698203745469485021638, + 21888242871839275222246405745257275088548364400416034343698203646362220964318, + 528357123494010, + 72266510687772, + 348093084613744, + 21888242871839275222246405745257275088548364400416034343698203694165513466320, + 304787835109512, + 21888242871839275222246405745257275088548364400416034343698203779772229892428, + 23349826067259, + 74591432006333, + 414896026544847, + 455198467269230, + 21888242871839275222246405745257275088548364400416034343698204095785524448906, + 356300352007023, + 285258544107423, + 21888242871839275222246405745257275088548364400416034343698203726465861846138, + 322859864379184, + 21888242871839275222246405745257275088548364400416034343698204071614345987502, + 475334829088303, + 382766049774630, + 21888242871839275222246405745257275088548364400416034343698203873588597513658, + 21888242871839275222246405745257275088548364400416034343698203836604438392444, + 21888242871839275222246405745257275088548364400416034343698204125568333832628, + 100025279551568, + 210966678917702, + 388158301183948, + 21888242871839275222246405745257275088548364400416034343698203725502805054550, + 21888242871839275222246405745257275088548364400416034343698204133352345375940, + 21888242871839275222246405745257275088548364400416034343698204052475535726516, + 183413251431085, + 21888242871839275222246405745257275088548364400416034343698203753190726682001, + 21888242871839275222246405745257275088548364400416034343698203715423568870713, + 21888242871839275222246405745257275088548364400416034343698203687543616389282, + 22918847051695, + 21888242871839275222246405745257275088548364400416034343698203671626218973015, + 21888242871839275222246405745257275088548364400416034343698204135109112559002, + 148074679326533, + 21888242871839275222246405745257275088548364400416034343698203836099337225403, + 21888242871839275222246405745257275088548364400416034343698203906456714019044, + 458318223423852, + 492538684676577, + 10369574167080, + 397550164581029, + 21888242871839275222246405745257275088548364400416034343698203835121833510791, + 21888242871839275222246405745257275088548364400416034343698204065021602495178, + 21888242871839275222246405745257275088548364400416034343698204025324542296794, + 488122892732761, + 11431983496540, + 21888242871839275222246405745257275088548364400416034343698203748214156359769, + 21888242871839275222246405745257275088548364400416034343698203981221987069239, + 21888242871839275222246405745257275088548364400416034343698204085934305409896, + 60924882545025, + 21888242871839275222246405745257275088548364400416034343698204050538046551480, + 21888242871839275222246405745257275088548364400416034343698204018533215325004, + 21888242871839275222246405745257275088548364400416034343698203957396945857746, + 21888242871839275222246405745257275088548364400416034343698204105246886692836, + 21888242871839275222246405745257275088548364400416034343698204180912739557573, + 238012888922460, + 54048360894261, + 21888242871839275222246405745257275088548364400416034343698203971675044855600, + 517070523289015, + 21888242871839275222246405745257275088548364400416034343698204082507838052022, + 156263600857618, + 397447707939992, + 14653315628481, + 21888242871839275222246405745257275088548364400416034343698204060792565185993, + 536735191959587, + 21888242871839275222246405745257275088548364400416034343698204182567319708684, + 325652399832527, + 21888242871839275222246405745257275088548364400416034343698204060848400980327, + 21888242871839275222246405745257275088548364400416034343698203865163946396987, + 525232890783854, + 21888242871839275222246405745257275088548364400416034343698204014937548005725, + 160508081055908, + 21888242871839275222246405745257275088548364400416034343698204122867312545557, + 437242229747705, + 21888242871839275222246405745257275088548364400416034343698204128991424818393, + 379589514853370, + 216285733336574, + 186456120552020, + 74891425747129, + 21888242871839275222246405745257275088548364400416034343698203907943379628300, + 21888242871839275222246405745257275088548364400416034343698204006717103195978, + 21888242871839275222246405745257275088548364400416034343698203705211257098920, + 21888242871839275222246405745257275088548364400416034343698203695693390199687, + 21888242871839275222246405745257275088548364400416034343698203744936166563947, + 106584367424814, + 21888242871839275222246405745257275088548364400416034343698204104510203280654, + 21888242871839275222246405745257275088548364400416034343698203920428027229647, + 21888242871839275222246405745257275088548364400416034343698203775237939094059, + 127134521420942, + 93856290197522, + 224008606363732, + 21888242871839275222246405745257275088548364400416034343698204022610652897992, + 21888242871839275222246405745257275088548364400416034343698204126769320619511, + 497257772419276, + 21888242871839275222246405745257275088548364400416034343698203672791544954090, + 245738619447764, + 177903730982064, + 21888242871839275222246405745257275088548364400416034343698203668558551815318, + 560550540362182, + 213736740154807, + 57292324202421, + 161113641258515, + 21888242871839275222246405745257275088548364400416034343698203931385904613855, + 235261308202593, + 307075313625273, + 272994533105902, + 456746853919350, + 551778477969411, + 218801890802468, + 40906831091726, + 251838995877909, + 437698710405531, + 21888242871839275222246405745257275088548364400416034343698203653030264104855, + 21888242871839275222246405745257275088548364400416034343698204082306606417369, + 535428478688392, + 21888242871839275222246405745257275088548364400416034343698203699194778175991, + 21888242871839275222246405745257275088548364400416034343698203635403176259859, + 21888242871839275222246405745257275088548364400416034343698203933242678061074, + 21888242871839275222246405745257275088548364400416034343698204021888331008447, + 21888242871839275222246405745257275088548364400416034343698204048939059383750, + 295431049582756, + 154370299070039, + 21888242871839275222246405745257275088548364400416034343698204165393620454686, + 21888242871839275222246405745257275088548364400416034343698203702800154748499, + 21888242871839275222246405745257275088548364400416034343698203782166484819182, + 43784489913306, + 266345477662581, + 21888242871839275222246405745257275088548364400416034343698204099703248499400, + 537354113224983, + 21888242871839275222246405745257275088548364400416034343698203943019461800279, + 21888242871839275222246405745257275088548364400416034343698203831844550943670, + 21888242871839275222246405745257275088548364400416034343698204169583667023699, + 58168994985414, + 73733281820306, + 511534409113012, + 133455937143902, + 21888242871839275222246405745257275088548364400416034343698204135774587603219, + 21888242871839275222246405745257275088548364400416034343698204006077921552684, + 365479606380765, + 80567642961121, + 21888242871839275222246405745257275088548364400416034343698204110981983333744, + 28477522641491, + 381570902544184, + 337027851162318, + 21888242871839275222246405745257275088548364400416034343698204011465531574965, + 27585743115230, + 21888242871839275222246405745257275088548364400416034343698203998119487859963, + 74583601497980, + 21888242871839275222246405745257275088548364400416034343698203890180496955981, + 21888242871839275222246405745257275088548364400416034343698203864529859741553, + 392285955139364, + 518689952730550, + 307271652308938, + 21888242871839275222246405745257275088548364400416034343698204106561241362316, + 154038230678532, + 21888242871839275222246405745257275088548364400416034343698203702661902136459, + 21888242871839275222246405745257275088548364400416034343698203710219152520762, + 217793366259270, + 21888242871839275222246405745257275088548364400416034343698203830531035013126, + 21888242871839275222246405745257275088548364400416034343698203666577561400460, + 503381013093078, + 467969757155266, + 21888242871839275222246405745257275088548364400416034343698203660732531438109, + 21888242871839275222246405745257275088548364400416034343698203792607979957468, + 21888242871839275222246405745257275088548364400416034343698204155438644708181, + 21888242871839275222246405745257275088548364400416034343698203659470686684302, + 475881613561205, + 21888242871839275222246405745257275088548364400416034343698203775259231282200, + 21888242871839275222246405745257275088548364400416034343698203753191683707791, + 157447625621157, + 21888242871839275222246405745257275088548364400416034343698203640473994592755, + 21888242871839275222246405745257275088548364400416034343698204125487346290706, + 121402051598280, + 388016279723773, + 21888242871839275222246405745257275088548364400416034343698203759637935597299, + 21888242871839275222246405745257275088548364400416034343698203635038100672042, + 212824989020986, + 272246861652226, + 21888242871839275222246405745257275088548364400416034343698204027765813342476, + 21888242871839275222246405745257275088548364400416034343698204046234311011600, + 21888242871839275222246405745257275088548364400416034343698204158803129399679, + 266439932946310, + 228056267908832, + 21888242871839275222246405745257275088548364400416034343698203974694495458713, + 130942747254564, + 4353717157996, + 21888242871839275222246405745257275088548364400416034343698203660215401642653, + 21888242871839275222246405745257275088548364400416034343698203898043299603161, + 412970191731930, + 509804735877316, + 21888242871839275222246405745257275088548364400416034343698203829201306718107, + 358160918977522, + 127954871521636, + 21888242871839275222246405745257275088548364400416034343698204114889152399131, + 21888242871839275222246405745257275088548364400416034343698204048895756078472, + 265836923557553, + 21888242871839275222246405745257275088548364400416034343698204026289198301979, + 239651256767702, + 21888242871839275222246405745257275088548364400416034343698203879003170508814, + 21888242871839275222246405745257275088548364400416034343698203907148849118179, + 370998791277637, + 383536134329115, + 21888242871839275222246405745257275088548364400416034343698203844396941167862, + 21888242871839275222246405745257275088548364400416034343698203832409873722047, + 552130654940765, + 21888242871839275222246405745257275088548364400416034343698203639690402925944, + 320753590270783, + 21888242871839275222246405745257275088548364400416034343698204106795538881115, + 480631819085401, + 321157224957821, + 21888242871839275222246405745257275088548364400416034343698203889806001323150, + 196140985388385, + 373985425626594, + 21888242871839275222246405745257275088548364400416034343698203912502897743842, + 221740111719685, + 21888242871839275222246405745257275088548364400416034343698203965524961246880, + 21888242871839275222246405745257275088548364400416034343698203676682112361724, + 225983312650228, + 21888242871839275222246405745257275088548364400416034343698203925335490538703, + 21888242871839275222246405745257275088548364400416034343698203689367368910702, + 365584943699687, + 21888242871839275222246405745257275088548364400416034343698203901223020702977, + 328640714977443, + 91802990017759, + 160346207420790, + 21888242871839275222246405745257275088548364400416034343698203928908618820618, + 25853098851123, + 21888242871839275222246405745257275088548364400416034343698204092821860074266, + 103466041072050, + 47784801361542, + 21888242871839275222246405745257275088548364400416034343698204155120337207973, + 21888242871839275222246405745257275088548364400416034343698203938922705140648, + 104799086866328, + 481678488586268, + 138206455497411, + 43836702809597, + 120501940664605, + 117169575408353, + 21888242871839275222246405745257275088548364400416034343698203624289955989087, + 21888242871839275222246405745257275088548364400416034343698203893453726030725, + 79383850497086, + 21888242871839275222246405745257275088548364400416034343698204074375887257440, + 21888242871839275222246405745257275088548364400416034343698203850483927241555, + 372680047741689, + 219823177391862, + 21888242871839275222246405745257275088548364400416034343698204127329296543908, + 21888242871839275222246405745257275088548364400416034343698204061767710591139, + 99544365625258, + 21888242871839275222246405745257275088548364400416034343698203965497306681543, + 410394629963959, + 495347206163996, + 229037104071341, + 285851890061656, + 263171295976198, + 506754240502900, + 264482442230360, + 21888242871839275222246405745257275088548364400416034343698203864806112902127, + 222173064276711, + 21888242871839275222246405745257275088548364400416034343698203855441519475577, + 21888242871839275222246405745257275088548364400416034343698203650507575115672, + 21888242871839275222246405745257275088548364400416034343698203964368526730833, + 21888242871839275222246405745257275088548364400416034343698204099398588813712, + 490899772258119, + 21888242871839275222246405745257275088548364400416034343698203785578125183560, + 21888242871839275222246405745257275088548364400416034343698203945329686642718, + 211532615010737, + 21888242871839275222246405745257275088548364400416034343698203657585433017312, + 64797038968614, + 145934160362198, + 21888242871839275222246405745257275088548364400416034343698203870677254769428, + 488559176760207, + 21888242871839275222246405745257275088548364400416034343698204115989092488050, + 21888242871839275222246405745257275088548364400416034343698203679349049814583, + 512890554331504, + 21888242871839275222246405745257275088548364400416034343698203917431294347316, + 21888242871839275222246405745257275088548364400416034343698203873170303936647, + 21888242871839275222246405745257275088548364400416034343698203752366030702668, + 21888242871839275222246405745257275088548364400416034343698204183282146631386, + 298736626364516, + 73288976177125, + 21888242871839275222246405745257275088548364400416034343698203829450468073786, + 21888242871839275222246405745257275088548364400416034343698204003810981218430, + 21888242871839275222246405745257275088548364400416034343698204166365682098335, + 21888242871839275222246405745257275088548364400416034343698204079435526296906, + 175291674836622, + 465535818388418, + 21888242871839275222246405745257275088548364400416034343698203647615791103066, + 159742530578344, + 21888242871839275222246405745257275088548364400416034343698203979270779695363, + 21888242871839275222246405745257275088548364400416034343698203885431145255541, + 19119766221510, + 383572452173449, + 222149805368439, + 21888242871839275222246405745257275088548364400416034343698203686928598071063, + 103047407137818, + 21888242871839275222246405745257275088548364400416034343698203918253889059708, + 458387144348366, + 21888242871839275222246405745257275088548364400416034343698203705500570700599, + 21888242871839275222246405745257275088548364400416034343698203992642371773922, + 21888242871839275222246405745257275088548364400416034343698203745623390230345, + 10461926308230, + 21888242871839275222246405745257275088548364400416034343698203695479348108910, + 21888242871839275222246405745257275088548364400416034343698204115686817913982, + 21888242871839275222246405745257275088548364400416034343698203978342826654995, + 267285424854257, + 21888242871839275222246405745257275088548364400416034343698204058627715371504, + 77946816543338, + 21888242871839275222246405745257275088548364400416034343698204065337867244038, + 21888242871839275222246405745257275088548364400416034343698203629331409297436, + 309057352911538, + 21888242871839275222246405745257275088548364400416034343698203826326492019726, + 21888242871839275222246405745257275088548364400416034343698203694033776645559, + 21888242871839275222246405745257275088548364400416034343698204002646047890953, + 21888242871839275222246405745257275088548364400416034343698204057065425831130, + 21888242871839275222246405745257275088548364400416034343698203977701848600135, + 127658894745743, + 267211387606676, + 21888242871839275222246405745257275088548364400416034343698204103960204554924, + 514989164334766, + 199071712724821, + 21888242871839275222246405745257275088548364400416034343698203736125675582505, + 262770156871414, + 65718171604252, + 21888242871839275222246405745257275088548364400416034343698203690513888906859, + 21888242871839275222246405745257275088548364400416034343698204140939012862357, + 140598082558126, + 126736050386469, + 101643461196957, + 153097090574281, + 21888242871839275222246405745257275088548364400416034343698203897926771533387, + 255402513947781, + 21888242871839275222246405745257275088548364400416034343698203866994366497763, + 316596699071210, + 151085045330950, + 67125221826597, + 21888242871839275222246405745257275088548364400416034343698203760631020797117, + 21888242871839275222246405745257275088548364400416034343698204080948241617974, + 546160346720945, + 21888242871839275222246405745257275088548364400416034343698204073717988300275, + 21888242871839275222246405745257275088548364400416034343698204164895134812533, + 21888242871839275222246405745257275088548364400416034343698203998123973414269, + 21888242871839275222246405745257275088548364400416034343698204170962158494280, + 315117712734669, + 21888242871839275222246405745257275088548364400416034343698203788293963670051, + 21888242871839275222246405745257275088548364400416034343698203927721066971683, + 230888463153264, + 339495269499631, + 548378581975670, + 236023668754968, + 24106173124766, + 362803429003822, + 171275432844260, + 21888242871839275222246405745257275088548364400416034343698203932408071835254, + 21888242871839275222246405745257275088548364400416034343698203935881039335801, + 541019844671278, + 21888242871839275222246405745257275088548364400416034343698204179177686740676, + 21888242871839275222246405745257275088548364400416034343698203944443858206554, + 549183272839235, + 423176920626497, + 527746284447258, + 21888242871839275222246405745257275088548364400416034343698203979863999329946, + 21888242871839275222246405745257275088548364400416034343698204068087582939944, + 21888242871839275222246405745257275088548364400416034343698204035907164736741, + 21888242871839275222246405745257275088548364400416034343698203800571492060340, + 21888242871839275222246405745257275088548364400416034343698203678049555840756, + 21888242871839275222246405745257275088548364400416034343698203802440361716312, + 434232557718921, + 370027919302333, + 42561581532694, + 21888242871839275222246405745257275088548364400416034343698203624382287903809, + 108481607764185, + 4845774807234, + 21888242871839275222246405745257275088548364400416034343698203712359580396282, + 21888242871839275222246405745257275088548364400416034343698204102663678799360, + 539947349491881, + 21888242871839275222246405745257275088548364400416034343698203971181979438692, + 193736042992588, + 141569114101034, + 21888242871839275222246405745257275088548364400416034343698204151600677988982, + 21888242871839275222246405745257275088548364400416034343698203935240602906734, + 21888242871839275222246405745257275088548364400416034343698204044965842594463, + 21888242871839275222246405745257275088548364400416034343698203756542622243526, + 2807289945644, + 518525691240065, + 384571497246584, + 21888242871839275222246405745257275088548364400416034343698203828110123636669, + 259855004263406, + 330358562359904, + 21888242871839275222246405745257275088548364400416034343698203940817512805164, + 21888242871839275222246405745257275088548364400416034343698204106874806871274, + 146013840924110, + 243209064442205, + 21888242871839275222246405745257275088548364400416034343698204077018670000849, + 104446444082561, + 490908597060431, + 489587397328417, + 1190342640704, + 21888242871839275222246405745257275088548364400416034343698203843438009480747, + 149341111039723, + 411659030946029, + 21888242871839275222246405745257275088548364400416034343698204166327221282407, + 183234022244326, + 21888242871839275222246405745257275088548364400416034343698204175080520158018, + 21888242871839275222246405745257275088548364400416034343698203913055158198491, + 379996763463189, + 21888242871839275222246405745257275088548364400416034343698203887834914041840, + 21888242871839275222246405745257275088548364400416034343698203842106228998369, + 81556484765876, + 412681309544474, + 383708624202518, + 21888242871839275222246405745257275088548364400416034343698203855322488804409, + 21888242871839275222246405745257275088548364400416034343698204174459644890412, + 21888242871839275222246405745257275088548364400416034343698203821259031201158, + 121576451982697, + 21888242871839275222246405745257275088548364400416034343698203989855341317951, + 21888242871839275222246405745257275088548364400416034343698204037704314285590, + 56498706634382, + 21888242871839275222246405745257275088548364400416034343698203838529911580999, + 301336459177530, + 299284858764207, + 21888242871839275222246405745257275088548364400416034343698203642982100586228, + 21888242871839275222246405745257275088548364400416034343698203874761714793513, + 550371830955889, + 186008429585330, + 21888242871839275222246405745257275088548364400416034343698204093368999723455, + 531569101161955, + 70164320770447, + 228242433154828, + 21888242871839275222246405745257275088548364400416034343698203679724323004327, + 354047203125141, + 21888242871839275222246405745257275088548364400416034343698204079893681860728, + 21888242871839275222246405745257275088548364400416034343698204103274142661257, + 21888242871839275222246405745257275088548364400416034343698203955052689873054, + 21888242871839275222246405745257275088548364400416034343698203744091322029716, + 23468578234892, + 36076348862305, + 190035763917855, + 21888242871839275222246405745257275088548364400416034343698203649105320602301, + 21888242871839275222246405745257275088548364400416034343698203654428263565129, + 11931786970182, + 21888242871839275222246405745257275088548364400416034343698204054552387843270, + 21888242871839275222246405745257275088548364400416034343698204160126641157846, + 21888242871839275222246405745257275088548364400416034343698203670998641255125, + 21888242871839275222246405745257275088548364400416034343698203888717998048643, + 21888242871839275222246405745257275088548364400416034343698204129083123591887, + 21888242871839275222246405745257275088548364400416034343698204003125112857428, + 21888242871839275222246405745257275088548364400416034343698204066491289250002, + 21888242871839275222246405745257275088548364400416034343698204048228790106914, + 276026434708835, + 249264410976126, + 21888242871839275222246405745257275088548364400416034343698204153021622627492, + 193986287499557, + 21888242871839275222246405745257275088548364400416034343698203960784475403244, + 21888242871839275222246405745257275088548364400416034343698203695024192083154, + 21888242871839275222246405745257275088548364400416034343698203979780096017793, + 21888242871839275222246405745257275088548364400416034343698203802095842896219, + 515109698780215, + 123939977882613, + 198643995680985, + 21888242871839275222246405745257275088548364400416034343698203886723333259117, + 21888242871839275222246405745257275088548364400416034343698203971152434085959, + 21888242871839275222246405745257275088548364400416034343698203864306433099974, + 21888242871839275222246405745257275088548364400416034343698204088627856641934, + 21888242871839275222246405745257275088548364400416034343698203817594408102998, + 21888242871839275222246405745257275088548364400416034343698203817796068099528, + 21888242871839275222246405745257275088548364400416034343698203979962793664936, + 21888242871839275222246405745257275088548364400416034343698204107352380359078, + 362492681158514, + 21888242871839275222246405745257275088548364400416034343698203704696865339613, + 21888242871839275222246405745257275088548364400416034343698203926173342508297, + 21888242871839275222246405745257275088548364400416034343698203998678894229608, + 21888242871839275222246405745257275088548364400416034343698203802694629223114, + 21888242871839275222246405745257275088548364400416034343698204116568344297625, + 21888242871839275222246405745257275088548364400416034343698203687662084378323, + 557696298480178, + 132723562267137, + 440081020762850, + 531032165773313, + 21888242871839275222246405745257275088548364400416034343698203675916615795620, + 96240018242456, + 21888242871839275222246405745257275088548364400416034343698204149959233134934, + 48364391713591, + 21888242871839275222246405745257275088548364400416034343698203990649940485518, + 21888242871839275222246405745257275088548364400416034343698203643221772181608, + 378099194602488, + 21888242871839275222246405745257275088548364400416034343698203728671525598306, + 200339216434849, + 21888242871839275222246405745257275088548364400416034343698203810477631015250, + 550985415443477, + 21888242871839275222246405745257275088548364400416034343698203656472325809162, + 21888242871839275222246405745257275088548364400416034343698204040696136673080, + 21888242871839275222246405745257275088548364400416034343698203988006156372128, + 73663337214795, + 337718215727549, + 11733140864115, + 21888242871839275222246405745257275088548364400416034343698203914160883800034, + 342410722973997, + 386174045834447, + 91498661796933, + 555653400577978, + 21888242871839275222246405745257275088548364400416034343698203697836292066539, + 21888242871839275222246405745257275088548364400416034343698203912653110117840, + 561948772381259, + 398791642254822, + 21888242871839275222246405745257275088548364400416034343698203861978062789422, + 21888242871839275222246405745257275088548364400416034343698204092119410215367, + 21888242871839275222246405745257275088548364400416034343698203720331524641573, + 21888242871839275222246405745257275088548364400416034343698204164011666051811, + 21888242871839275222246405745257275088548364400416034343698204074837061631728, + 21888242871839275222246405745257275088548364400416034343698203731409444729698, + 527815501858364, + 21888242871839275222246405745257275088548364400416034343698203665976262866123, + 21888242871839275222246405745257275088548364400416034343698203927274055737823, + 175142675762893, + 431493415074196, + 353451897386489, + 359326645044756, + 21888242871839275222246405745257275088548364400416034343698203890712053284047, + 21888242871839275222246405745257275088548364400416034343698203791428325115162, + 22147390018686, + 21888242871839275222246405745257275088548364400416034343698203763262435944131, + 509513047044509, + 21888242871839275222246405745257275088548364400416034343698204024751346536598, + 21888242871839275222246405745257275088548364400416034343698204012936125036751, + 21888242871839275222246405745257275088548364400416034343698203881028225684797, + 11707260056897, + 272388571902822, + 21888242871839275222246405745257275088548364400416034343698203652298580227640, + 421294298468618, + 21888242871839275222246405745257275088548364400416034343698203949692721007177, + 21888242871839275222246405745257275088548364400416034343698204006108972275868, + 21888242871839275222246405745257275088548364400416034343698203969948249066702, + 21888242871839275222246405745257275088548364400416034343698203942627531732731, + 21888242871839275222246405745257275088548364400416034343698203891779035809314, + 21888242871839275222246405745257275088548364400416034343698204008996113646169, + 14324094195843, + 21888242871839275222246405745257275088548364400416034343698203624958346680114, + 388821651831105, + 21888242871839275222246405745257275088548364400416034343698203748212470062972, + 12274123801687, + 21888242871839275222246405745257275088548364400416034343698203651542476219030, + 21888242871839275222246405745257275088548364400416034343698203798944990844687, + 21888242871839275222246405745257275088548364400416034343698203665414097637186, + 21888242871839275222246405745257275088548364400416034343698203855396235196320, + 501536560682924, + 473494687356498, + 547616197940585, + 21888242871839275222246405745257275088548364400416034343698204022594013006228, + 21888242871839275222246405745257275088548364400416034343698203957854017491197, + 107851539859243, + 21888242871839275222246405745257275088548364400416034343698203674135912633155, + 21888242871839275222246405745257275088548364400416034343698204142656593827123, + 21888242871839275222246405745257275088548364400416034343698204082193980358021, + 21888242871839275222246405745257275088548364400416034343698203735234459335894, + 221946802595000, + 45781888216672, + 21888242871839275222246405745257275088548364400416034343698204091270116997899, + 21888242871839275222246405745257275088548364400416034343698204182368284199149, + 21888242871839275222246405745257275088548364400416034343698203947796076989468, + 21888242871839275222246405745257275088548364400416034343698203955286502053834, + 21888242871839275222246405745257275088548364400416034343698204014075288714688, + 373813244058553, + 315578911601095, + 354090006433918, + 253442398907335, + 174899163976177, + 21888242871839275222246405745257275088548364400416034343698204117828624623959, + 78690595977734, + 21888242871839275222246405745257275088548364400416034343698204170931959762326, + 21888242871839275222246405745257275088548364400416034343698204059508655433932, + 21888242871839275222246405745257275088548364400416034343698203681735149876565, + 21888242871839275222246405745257275088548364400416034343698203737018615591165, + 273494457995093, + 21888242871839275222246405745257275088548364400416034343698203787761159507316, + 330711509770702, + 3713685295095, + 21888242871839275222246405745257275088548364400416034343698203777961392206061, + 21888242871839275222246405745257275088548364400416034343698203898398575206149, + 21888242871839275222246405745257275088548364400416034343698203833908335333851, + 278451750426398, + 506338037348592, + 21888242871839275222246405745257275088548364400416034343698204182945259176626, + 453975501163979, + 21888242871839275222246405745257275088548364400416034343698204089520473085111, + 21888242871839275222246405745257275088548364400416034343698203910511669535197, + 21888242871839275222246405745257275088548364400416034343698203653950103616323, + 21888242871839275222246405745257275088548364400416034343698203653138438759235, + 21888242871839275222246405745257275088548364400416034343698203986441439076345, + 11731840588822, + 492935467561526, + 43285265001698, + 65521392147456, + 419142077157880, + 21888242871839275222246405745257275088548364400416034343698203798908388644229, + 21888242871839275222246405745257275088548364400416034343698203820813082393042, + 21888242871839275222246405745257275088548364400416034343698203766713289311429, + 337468103785064, + 193091844868397, + 21888242871839275222246405745257275088548364400416034343698203973341117272770, + 21888242871839275222246405745257275088548364400416034343698203736840076529673, + 21888242871839275222246405745257275088548364400416034343698203645262785890301, + 21888242871839275222246405745257275088548364400416034343698203767130905074080, + 21888242871839275222246405745257275088548364400416034343698204175493238292843, + 467723008381690, + 21888242871839275222246405745257275088548364400416034343698203798219053994571, + 21888242871839275222246405745257275088548364400416034343698203962086251088472, + 21888242871839275222246405745257275088548364400416034343698203757159985451793, + 280039116633655, + 21888242871839275222246405745257275088548364400416034343698203974421896078999, + 21888242871839275222246405745257275088548364400416034343698203832956836904053, + 362266298720234, + 369844004187732, + 21888242871839275222246405745257275088548364400416034343698204109723651086756, + 250248208621606, + 21888242871839275222246405745257275088548364400416034343698203890697295459986, + 21888242871839275222246405745257275088548364400416034343698203856954651603486, + 21888242871839275222246405745257275088548364400416034343698204174374607337523, + 21888242871839275222246405745257275088548364400416034343698203934715386417349, + 21888242871839275222246405745257275088548364400416034343698204146369807044049, + 21888242871839275222246405745257275088548364400416034343698203962561196407697, + 308928351649237, + 441840232679964, + 505988423556347, + 490520301039138, + 418569010484915, + 13828653199492, + 21888242871839275222246405745257275088548364400416034343698203926275786938022, + 270849821621997, + 21888242871839275222246405745257275088548364400416034343698203979228259867056, + 21888242871839275222246405745257275088548364400416034343698203875297155970986, + 419530315240844, + 339491695154158, + 21888242871839275222246405745257275088548364400416034343698203665988643601627, + 21888242871839275222246405745257275088548364400416034343698204109621064519093, + 282962617148161, + 50714062858104, + 552470823868215, + 292906576891504, + 364563650109414, + 449294578144185, + 504075173046061, + 48608150606350, + 21888242871839275222246405745257275088548364400416034343698203899401331734319, + 21888242871839275222246405745257275088548364400416034343698204099792504315008, + 21888242871839275222246405745257275088548364400416034343698203647016933519872, + 21888242871839275222246405745257275088548364400416034343698204160341147596768, + 368419520269034, + 21888242871839275222246405745257275088548364400416034343698203992203071691575, + 21888242871839275222246405745257275088548364400416034343698203940723149830146, + 21888242871839275222246405745257275088548364400416034343698203697999120996086, + 21888242871839275222246405745257275088548364400416034343698203797270059797893, + 21888242871839275222246405745257275088548364400416034343698204180933263424757, + 316678989724590, + 21888242871839275222246405745257275088548364400416034343698204147566715060667, + 525575860633583, + 31884005712445, + 21888242871839275222246405745257275088548364400416034343698203905295914309805, + 187054703378935, + 278553445416402, + 427146210445030, + 21888242871839275222246405745257275088548364400416034343698204081541874456467, + 274960078092978, + 21888242871839275222246405745257275088548364400416034343698203830592990660636, + 360381895232312, + 21888242871839275222246405745257275088548364400416034343698203648034706991495, + 70313078900070, + 21888242871839275222246405745257275088548364400416034343698203930728763399393, + 494156950370111, + 513503602811782, + 264270756517692, + 515232558561180, + 552802402390501, + 21888242871839275222246405745257275088548364400416034343698204105763340236242, + 21888242871839275222246405745257275088548364400416034343698203747725782942220, + 21888242871839275222246405745257275088548364400416034343698203860170240869787, + 50413594177970, + 218700403103588, + 21888242871839275222246405745257275088548364400416034343698203835057714211163, + 21888242871839275222246405745257275088548364400416034343698204068052451580490, + 32927144464609, + 21888242871839275222246405745257275088548364400416034343698203827569309906112, + 87705530494179, + 21888242871839275222246405745257275088548364400416034343698203750113936546759, + 448867541811836, + 21888242871839275222246405745257275088548364400416034343698203741276490344962, + 183628760539688, + 21888242871839275222246405745257275088548364400416034343698203862643221877554, + 21888242871839275222246405745257275088548364400416034343698204167313370949277, + 21888242871839275222246405745257275088548364400416034343698204069520592615829, + 21888242871839275222246405745257275088548364400416034343698204131201476080289, + 21888242871839275222246405745257275088548364400416034343698203704870150064985, + 21888242871839275222246405745257275088548364400416034343698203660979599613039, + 80834769933661, + 21888242871839275222246405745257275088548364400416034343698203740841554191427, + 21888242871839275222246405745257275088548364400416034343698203726810559239948, + 86620644232287, + 507580325566341, + 21888242871839275222246405745257275088548364400416034343698203747348120608404, + 537958746534948, + 21888242871839275222246405745257275088548364400416034343698203721961735254828, + 21888242871839275222246405745257275088548364400416034343698203728680541090447, + 136025107706340, + 21888242871839275222246405745257275088548364400416034343698203877574054332440, + 198134557535041, + 21888242871839275222246405745257275088548364400416034343698203691262174575452, + 106392872506850, + 144411931194116, + 372942700185854, + 21888242871839275222246405745257275088548364400416034343698204048628842405933, + 487032900165439, + 21888242871839275222246405745257275088548364400416034343698203927816742225466, + 93393311498247, + 21888242871839275222246405745257275088548364400416034343698203661432030086544, + 479702135188956, + 21888242871839275222246405745257275088548364400416034343698204046883243237095, + 137412514098759, + 295398681606367, + 311175853859098, + 495619812062397, + 468377265197533, + 72110377303794, + 40292955028749, + 21888242871839275222246405745257275088548364400416034343698203648760891102965, + 213219206023651, + 5893329172581, + 21888242871839275222246405745257275088548364400416034343698204127426117052504, + 552709037404885, + 156157376531316, + 21888242871839275222246405745257275088548364400416034343698204152658955448975, + 496057280374211, + 21888242871839275222246405745257275088548364400416034343698203897827359194383, + 532998811419614, + 21888242871839275222246405745257275088548364400416034343698203728813959676987, + 21888242871839275222246405745257275088548364400416034343698203980772550639132, + 21888242871839275222246405745257275088548364400416034343698203675461084390970, + 21888242871839275222246405745257275088548364400416034343698203920703923422853, + 21888242871839275222246405745257275088548364400416034343698203647194515719424, + 366953308938170, + 364525030724761, + 21888242871839275222246405745257275088548364400416034343698203987973091284517, + 139422433198511, + 21888242871839275222246405745257275088548364400416034343698203840423485047156, + 194158872869514, + 325019686471547, + 282079109575634, + 142643914767051, + 21888242871839275222246405745257275088548364400416034343698204101954862526413, + 21888242871839275222246405745257275088548364400416034343698204070254821249911, + 386889020966958, + 346019901084205, + 340966198112585, + 528648431908943, + 457912488677829, + 498711160735181, + 21888242871839275222246405745257275088548364400416034343698203954271338686601, + 21888242871839275222246405745257275088548364400416034343698203881148738310379, + 404818510626072, + 21888242871839275222246405745257275088548364400416034343698203749163263106054, + 518997467160360, + 151364815722766, + 514150003365001, + 245445034576766, + 21888242871839275222246405745257275088548364400416034343698203904897199843092, + 21888242871839275222246405745257275088548364400416034343698203628266969908494, + 436475759203302, + 127417757836707, + 21888242871839275222246405745257275088548364400416034343698203786798153695165, + 372933784570912, + 21888242871839275222246405745257275088548364400416034343698203923648542631173, + 8821648146756, + 21888242871839275222246405745257275088548364400416034343698204148386385023933, + 408239020002509, + 21888242871839275222246405745257275088548364400416034343698203706917310806955, + 403531943802563, + 463547168402398, + 290518800672116, + 405404377736078, + 172050030307482, + 325952489538589, + 21888242871839275222246405745257275088548364400416034343698204043465942071862, + 21888242871839275222246405745257275088548364400416034343698204033730569095468, + 98041235407071, + 445572370218503, + 21888242871839275222246405745257275088548364400416034343698203851709645090848, + 231983395200731, + 21888242871839275222246405745257275088548364400416034343698203815555222498469, + 28630557928202, + 21888242871839275222246405745257275088548364400416034343698203975658126512847, + 19717636381952, + 21888242871839275222246405745257275088548364400416034343698204100025598666540, + 21888242871839275222246405745257275088548364400416034343698203625025231051063, + 93789145641483, + 255548886453700, + 96212396366897, + 339004317382429, + 21888242871839275222246405745257275088548364400416034343698204066744005744379, + 410683954261845, + 25132253217444, + 21888242871839275222246405745257275088548364400416034343698203639664742736127, + 21888242871839275222246405745257275088548364400416034343698203781802646033161, + 21888242871839275222246405745257275088548364400416034343698204049553137011218, + 21888242871839275222246405745257275088548364400416034343698203680563449731630, + 507270833750812, + 21888242871839275222246405745257275088548364400416034343698203961845269113235, + 538882784899189, + 21888242871839275222246405745257275088548364400416034343698203831720418600995, + 21888242871839275222246405745257275088548364400416034343698204150561937585173, + 479273855204012, + 555650820352164, + 514810630919161, + 21888242871839275222246405745257275088548364400416034343698203919225142363943, + 192647359252982, + 556435752070041, + 21888242871839275222246405745257275088548364400416034343698203697883908019034, + 557490453106161, + 496164184505396, + 21888242871839275222246405745257275088548364400416034343698204154959728032404, + 21888242871839275222246405745257275088548364400416034343698204118223572577180, + 311301443320909, + 21888242871839275222246405745257275088548364400416034343698204117706970606670, + 21888242871839275222246405745257275088548364400416034343698204046412717754572, + 21888242871839275222246405745257275088548364400416034343698204030693383583560, + 8011332639100, + 134697055294462, + 21888242871839275222246405745257275088548364400416034343698203779135610619368, + 91120377116863, + 187153629089964, + 265326205113024, + 21888242871839275222246405745257275088548364400416034343698203989759266897896, + 311226828999152, + 291115403585614, + 21888242871839275222246405745257275088548364400416034343698203831313371447396, + 194332897695337, + 21888242871839275222246405745257275088548364400416034343698203858290536129993, + 21888242871839275222246405745257275088548364400416034343698204155656155269480, + 96679009674038, + 346299969118231, + 21888242871839275222246405745257275088548364400416034343698203892578118836793, + 21888242871839275222246405745257275088548364400416034343698203982852334890496, + 21888242871839275222246405745257275088548364400416034343698203762170470102237, + 261297293006150, + 91533462792888, + 21888242871839275222246405745257275088548364400416034343698203938665643565198, + 21888242871839275222246405745257275088548364400416034343698204055180629731363, + 21888242871839275222246405745257275088548364400416034343698204172250221203502, + 21888242871839275222246405745257275088548364400416034343698204000611767760682, + 21888242871839275222246405745257275088548364400416034343698204148732886169677, + 21888242871839275222246405745257275088548364400416034343698203752589420966075, + 224859196020968, + 21888242871839275222246405745257275088548364400416034343698203897530302090038, + 21888242871839275222246405745257275088548364400416034343698203682408212572857, + 323400846480836, + 21888242871839275222246405745257275088548364400416034343698203958701414696542, + 21888242871839275222246405745257275088548364400416034343698203635189241304893, + 21888242871839275222246405745257275088548364400416034343698203677705320025248, + 21888242871839275222246405745257275088548364400416034343698203675453790716735, + 77569214386292, + 21888242871839275222246405745257275088548364400416034343698203817638986359035, + 369683799321458, + 21888242871839275222246405745257275088548364400416034343698203852939168429948, + 21888242871839275222246405745257275088548364400416034343698203656506604851114, + 21888242871839275222246405745257275088548364400416034343698203729756330859190, + 21888242871839275222246405745257275088548364400416034343698203817801844158333, + 3884614220635, + 21888242871839275222246405745257275088548364400416034343698203723035889113721, + 21888242871839275222246405745257275088548364400416034343698204021265980467684, + 67578693816227, + 21888242871839275222246405745257275088548364400416034343698204086194140056065, + 121904499221134, + 434609436684086, + 394405276708107, + 21888242871839275222246405745257275088548364400416034343698203637423943097086, + 494151562588780, + 21888242871839275222246405745257275088548364400416034343698204116968034616800, + 138927381481044, + 21888242871839275222246405745257275088548364400416034343698203946633596273052, + 322490168583795, + 21888242871839275222246405745257275088548364400416034343698204088927974380095, + 364984079216451, + 21888242871839275222246405745257275088548364400416034343698203954650389804527, + 21888242871839275222246405745257275088548364400416034343698203982688350367690, + 21888242871839275222246405745257275088548364400416034343698203858398312207623, + 512906684243048, + 21888242871839275222246405745257275088548364400416034343698203640434616379199, + 315741142912077, + 21888242871839275222246405745257275088548364400416034343698203711977118907665, + 21888242871839275222246405745257275088548364400416034343698203872526364732927, + 117570576972979, + 162638052150999, + 21888242871839275222246405745257275088548364400416034343698203885873502012987, + 288356920587135, + 501774037315688, + 240767526066432, + 447049223022617, + 21888242871839275222246405745257275088548364400416034343698204117239947144054, + 21888242871839275222246405745257275088548364400416034343698204179628340839562, + 216857003819515, + 98671183987744, + 21888242871839275222246405745257275088548364400416034343698203963523196744380, + 21888242871839275222246405745257275088548364400416034343698204068558749383824, + 348925905967472, + 21888242871839275222246405745257275088548364400416034343698203757067864440811, + 21888242871839275222246405745257275088548364400416034343698204138843674030743, + 21888242871839275222246405745257275088548364400416034343698204073714510574222, + 21888242871839275222246405745257275088548364400416034343698203956525631990556, + 21888242871839275222246405745257275088548364400416034343698203769130008281091, + 355219539988799, + 72065801403531, + 328853282806211, + 438009555710921, + 21888242871839275222246405745257275088548364400416034343698204017501868435596, + 21888242871839275222246405745257275088548364400416034343698203717250345301370, + 21888242871839275222246405745257275088548364400416034343698203664419281233625, + 21888242871839275222246405745257275088548364400416034343698203839054338460338, + 21888242871839275222246405745257275088548364400416034343698203685969981105807, + 299775690139797, + 382190326804257, + 551650054673353, + 21888242871839275222246405745257275088548364400416034343698204115990991242799, + 56165575093835, + 21888242871839275222246405745257275088548364400416034343698204096565897571550, + 21888242871839275222246405745257275088548364400416034343698203747000222069036, + 299154657538490, + 21888242871839275222246405745257275088548364400416034343698203822632961654113, + 338210586326786, + 21192345587946, + 240373700256675, + 21888242871839275222246405745257275088548364400416034343698203813209070453460, + 9956568486896, + 250291338987851, + 21888242871839275222246405745257275088548364400416034343698203674792231642420, + 284301863163938, + 21888242871839275222246405745257275088548364400416034343698203888149028743205, + 21888242871839275222246405745257275088548364400416034343698204175964861386199, + 21888242871839275222246405745257275088548364400416034343698204003246556252036, + 21888242871839275222246405745257275088548364400416034343698203646444560893445, + 21888242871839275222246405745257275088548364400416034343698203829232398325450, + 21888242871839275222246405745257275088548364400416034343698203934527577993453, + 72792592449937, + 318560292424268, + 407035317834485, + 21888242871839275222246405745257275088548364400416034343698203637658254283604, + 21888242871839275222246405745257275088548364400416034343698203687847528938857, + 444941942090535, + 531348804231329, + 21888242871839275222246405745257275088548364400416034343698203883324977352436, + 21888242871839275222246405745257275088548364400416034343698203720946665085915, + 21888242871839275222246405745257275088548364400416034343698203863544248722491, + 21888242871839275222246405745257275088548364400416034343698203863950044734977, + 21888242871839275222246405745257275088548364400416034343698203876597631798682, + 453183875664342, + 21888242871839275222246405745257275088548364400416034343698203626076174948333, + 90675496585392, + 404377708535383, + 94083591723661, + 21888242871839275222246405745257275088548364400416034343698203897019155704625, + 21888242871839275222246405745257275088548364400416034343698203899822429465642, + 486743746877403, + 317813581159617, + 220415548334094, + 263802260823126, + 21888242871839275222246405745257275088548364400416034343698203724735422204797, + 144446279001786, + 40560726985620, + 216553460521811, + 21888242871839275222246405745257275088548364400416034343698203802386021538964, + 288732806539276, + 411812535266935, + 21888242871839275222246405745257275088548364400416034343698204134051841084694, + 250351704780363, + 21888242871839275222246405745257275088548364400416034343698203927081955706753, + 21888242871839275222246405745257275088548364400416034343698203683279557126427, + 79977936736953, + 84733791290867, + 326859508307079, + 21888242871839275222246405745257275088548364400416034343698203892381503823581, + 558967693418088, + 38524276450578, + 440358422113397, + 300559281445186, + 13484675168437, + 21888242871839275222246405745257275088548364400416034343698203924719525873778, + 7960915540284, + 21888242871839275222246405745257275088548364400416034343698203975049254384469, + 21888242871839275222246405745257275088548364400416034343698203965095534493051, + 369187225019674, + 21888242871839275222246405745257275088548364400416034343698203801754155855932, + 80217865109583, + 267040531796744, + 21888242871839275222246405745257275088548364400416034343698203755542196259830, + 131122621003687, + 21888242871839275222246405745257275088548364400416034343698203776729214320597, + 158973830070631, + 425145395893858, + 212163084443079, + 21888242871839275222246405745257275088548364400416034343698203650913204611783, + 21888242871839275222246405745257275088548364400416034343698203703116145650556, + 340045606747985, + 58962978760694, + 296432914052982, + 21888242871839275222246405745257275088548364400416034343698203804255140630223, + 399403512844156, + 21888242871839275222246405745257275088548364400416034343698203638384790795052, + 21888242871839275222246405745257275088548364400416034343698203623835680989357, + 21888242871839275222246405745257275088548364400416034343698203783653505217853, + 108557685889642, + 21888242871839275222246405745257275088548364400416034343698204091019965648994, + 389142946471521, + 394250978378991, + 550385830860135, + 144501710161826, + 283375963302897, + 231654484898600, + 199266262014753, + 242066043130050, + 21888242871839275222246405745257275088548364400416034343698203660946726131707, + 21888242871839275222246405745257275088548364400416034343698203956031727932576, + 21888242871839275222246405745257275088548364400416034343698203723489006014057, + 21888242871839275222246405745257275088548364400416034343698204102977843610314, + 429964667056936, + 21888242871839275222246405745257275088548364400416034343698203973697785141453, + 21888242871839275222246405745257275088548364400416034343698203915666982470071, + 346184888539529, + 166392810840869, + 21888242871839275222246405745257275088548364400416034343698204079981092692879, + 78972105229878, + 432734411782525, + 37151648943902, + 21888242871839275222246405745257275088548364400416034343698203754171500379161, + 65524732364561, + 21888242871839275222246405745257275088548364400416034343698203949162988356936, + 386052746021646, + 76091840471284, + 21888242871839275222246405745257275088548364400416034343698204145269138250009, + 21888242871839275222246405745257275088548364400416034343698203959715474090663, + 21888242871839275222246405745257275088548364400416034343698204004531328868482, + 64893219857597, + 412019462946617, + 484187292458387, + 432603680364918, + 297229460284722, + 307994603628044, + 114383598326922, + 21888242871839275222246405745257275088548364400416034343698203968900896244645, + 21888242871839275222246405745257275088548364400416034343698203806972809311518, + 149312791628939, + 21888242871839275222246405745257275088548364400416034343698204017056948044879, + 21888242871839275222246405745257275088548364400416034343698203762263117318786, + 21888242871839275222246405745257275088548364400416034343698203660864838891748, + 88340202744231, + 281484685815699, + 21888242871839275222246405745257275088548364400416034343698204068984082278510, + 496928255927616, + 21888242871839275222246405745257275088548364400416034343698203823673063473665, + 21888242871839275222246405745257275088548364400416034343698203924424991754232, + 424265858921128, + 21888242871839275222246405745257275088548364400416034343698204055445877313683, + 21888242871839275222246405745257275088548364400416034343698203926620197012158, + 312072615346247, + 21888242871839275222246405745257275088548364400416034343698203725584731513712, + 180870179004897, + 283022126038579, + 21888242871839275222246405745257275088548364400416034343698204077897926587974, + 21888242871839275222246405745257275088548364400416034343698204018280714084619, + 403135434180411, + 212371985745325, + 54260783474578, + 396144929663104, + 548636388404024, + 21888242871839275222246405745257275088548364400416034343698204152311959056009, + 463741129086167, + 21888242871839275222246405745257275088548364400416034343698203729556550680650, + 424070532020258, + 516713788453046, + 188705862773508, + 21888242871839275222246405745257275088548364400416034343698203785537914412370, + 237530025079690, + 21888242871839275222246405745257275088548364400416034343698204170444623557959, + 21888242871839275222246405745257275088548364400416034343698203854577750802416, + 21888242871839275222246405745257275088548364400416034343698204185951320914504, + 21888242871839275222246405745257275088548364400416034343698203759035912694313, + 536776515373505, + 21888242871839275222246405745257275088548364400416034343698203791603654549548, + 552892832316009, + 21888242871839275222246405745257275088548364400416034343698204090368938921821, + 21888242871839275222246405745257275088548364400416034343698203671580482952603, + 21888242871839275222246405745257275088548364400416034343698203730726786259582, + 21888242871839275222246405745257275088548364400416034343698204062819595908132, + 21888242871839275222246405745257275088548364400416034343698203809982216966621, + 3484776213916, + 21888242871839275222246405745257275088548364400416034343698203699980507094641, + 21888242871839275222246405745257275088548364400416034343698203626262709715924, + 21888242871839275222246405745257275088548364400416034343698203668255863346357, + 21888242871839275222246405745257275088548364400416034343698203892293661827216, + 358251225037596, + 21888242871839275222246405745257275088548364400416034343698203915371543088911, + 21888242871839275222246405745257275088548364400416034343698204128450294173581, + 21888242871839275222246405745257275088548364400416034343698203799379541399662, + 21888242871839275222246405745257275088548364400416034343698203743111072024694, + 21888242871839275222246405745257275088548364400416034343698203859537254975245, + 501559307547397, + 357358102949678, + 526435829747236, + 224046392670954, + 21888242871839275222246405745257275088548364400416034343698203766829931859963, + 464559841737803, + 21888242871839275222246405745257275088548364400416034343698203914806016661502, + 21888242871839275222246405745257275088548364400416034343698204134570998308671, + 21888242871839275222246405745257275088548364400416034343698204025035531179324, + 21888242871839275222246405745257275088548364400416034343698203964806715821079, + 21888242871839275222246405745257275088548364400416034343698203981329631686663, + 21888242871839275222246405745257275088548364400416034343698203803373035031923, + 190389696629, + 21888242871839275222246405745257275088548364400416034343698203784960581210552, + 21888242871839275222246405745257275088548364400416034343698204088156104661282, + 21888242871839275222246405745257275088548364400416034343698204141009824071140, + 21888242871839275222246405745257275088548364400416034343698203913474865991607, + 298940539776488, + 214981553998356, + 21888242871839275222246405745257275088548364400416034343698203876621575501645, + 21888242871839275222246405745257275088548364400416034343698204084254573952862, + 21888242871839275222246405745257275088548364400416034343698203756176107734889, + 361942693939788, + 21888242871839275222246405745257275088548364400416034343698204065448729658703, + 21888242871839275222246405745257275088548364400416034343698203736789130351138, + 149776509078332, + 176152731497768, + 21888242871839275222246405745257275088548364400416034343698204147501217559363, + 131532210955150, + 21888242871839275222246405745257275088548364400416034343698203866782787972492, + 271420497303933, + 383861912891511, + 459617388630848, + 21888242871839275222246405745257275088548364400416034343698203712606698157895, + 21888242871839275222246405745257275088548364400416034343698203815442342011825, + 334278309065052, + 210309497387297, + 21888242871839275222246405745257275088548364400416034343698204030514794015102, + 319117094692535, + 21888242871839275222246405745257275088548364400416034343698203873065106794713, + 114128588227378, + 21888242871839275222246405745257275088548364400416034343698203707226370052286, + 21888242871839275222246405745257275088548364400416034343698203682239389780559, + 21888242871839275222246405745257275088548364400416034343698204101192791683190, + 471117660534037, + 431219625117103, + 531697809802389, + 480432330681316, + 384659389442294, + 21888242871839275222246405745257275088548364400416034343698204014520760100713, + 21888242871839275222246405745257275088548364400416034343698203775221024708452, + 21888242871839275222246405745257275088548364400416034343698204101477104521861, + 21888242871839275222246405745257275088548364400416034343698203749904235390641, + 21888242871839275222246405745257275088548364400416034343698204183831663313319, + 21888242871839275222246405745257275088548364400416034343698204138645375084558, + 272085255152871, + 192816292611988, + 21888242871839275222246405745257275088548364400416034343698204183066968913213, + 21888242871839275222246405745257275088548364400416034343698204120676389655862, + 322075781244287, + 21888242871839275222246405745257275088548364400416034343698203822314942553399, + 305760534130550, + 21888242871839275222246405745257275088548364400416034343698204180059756804188, + 247521653508969, + 500741133244189, + 112157114505195, + 21888242871839275222246405745257275088548364400416034343698204176467713094125, + 21888242871839275222246405745257275088548364400416034343698203843863954020088, + 21888242871839275222246405745257275088548364400416034343698204053810111669825, + 21888242871839275222246405745257275088548364400416034343698203663635203184225, + 178304395565882, + 21888242871839275222246405745257275088548364400416034343698204184168851318529, + 21888242871839275222246405745257275088548364400416034343698203814824979625726, + 21888242871839275222246405745257275088548364400416034343698204014388716056340, + 21888242871839275222246405745257275088548364400416034343698203995344587607805, + 21888242871839275222246405745257275088548364400416034343698204134919780373491, + 321018727701360, + 184163595670356, + 21888242871839275222246405745257275088548364400416034343698203955038673627447, + 520046836591026, + 83250112665854, + 21888242871839275222246405745257275088548364400416034343698203810698889385097, + 357751060737284, + 399788078226336, + 193194575731317, + 21888242871839275222246405745257275088548364400416034343698203906284849584630, + 21888242871839275222246405745257275088548364400416034343698203744376867506221, + 178507099894581, + 209600129087714, + 133068432275089, + 21888242871839275222246405745257275088548364400416034343698203753714125545872, + 21888242871839275222246405745257275088548364400416034343698203784061891540906, + 21888242871839275222246405745257275088548364400416034343698203671722551154611, + 21888242871839275222246405745257275088548364400416034343698203888499735864758, + 21888242871839275222246405745257275088548364400416034343698203700520651316398, + 526570593421958, + 21888242871839275222246405745257275088548364400416034343698203759994131381576, + 21888242871839275222246405745257275088548364400416034343698203906441766740406, + 21888242871839275222246405745257275088548364400416034343698203630572024744386, + 27437887361400, + 21888242871839275222246405745257275088548364400416034343698204159153166066394, + 493554998964991, + 21888242871839275222246405745257275088548364400416034343698204042820067097922, + 21888242871839275222246405745257275088548364400416034343698203642642878896106, + 441649977741381, + 21888242871839275222246405745257275088548364400416034343698204044023526226186, + 60739684780773, + 130691636373255, + 21888242871839275222246405745257275088548364400416034343698203897908017131249, + 548623623118429, + 21888242871839275222246405745257275088548364400416034343698203924632692022823, + 21888242871839275222246405745257275088548364400416034343698203917222665057289, + 402251526162406, + 153306619599453, + 53401079525599, + 323168253880224, + 21888242871839275222246405745257275088548364400416034343698203855526034076527, + 21888242871839275222246405745257275088548364400416034343698204178325593775024, + 21888242871839275222246405745257275088548364400416034343698204184926441892110, + 471140541817098, + 64952867519580, + 21888242871839275222246405745257275088548364400416034343698204173754306613501, + 21888242871839275222246405745257275088548364400416034343698203650081022631434, + 21888242871839275222246405745257275088548364400416034343698203771537635548095, + 21888242871839275222246405745257275088548364400416034343698203669629025674056, + 258563447424309, + 21888242871839275222246405745257275088548364400416034343698203899616818364611, + 21888242871839275222246405745257275088548364400416034343698203942347982894441, + 494688745240448, + 130798553582585, + 45052845740619, + 21888242871839275222246405745257275088548364400416034343698204165092751185869, + 21888242871839275222246405745257275088548364400416034343698203787871863327518, + 393344535794064, + 71538979394119, + 21888242871839275222246405745257275088548364400416034343698204008970602633224, + 427083675834236, + 411665947107805, + 451297993174472, + 389688680273139, + 229559850633347, + 178289639387449, + 170544260536974, + 422889374086577, + 15767735808832, + 435808545834718, + 21888242871839275222246405745257275088548364400416034343698203761084779950258, + 21888242871839275222246405745257275088548364400416034343698203669179356492237, + 21888242871839275222246405745257275088548364400416034343698204169387874880522, + 21888242871839275222246405745257275088548364400416034343698204143901784065611, + 439322874147063, + 21888242871839275222246405745257275088548364400416034343698204179547265173051, + 21888242871839275222246405745257275088548364400416034343698204031666926977084, + 21888242871839275222246405745257275088548364400416034343698203996694175349129, + 113678614706370, + 525361175713636, + 21888242871839275222246405745257275088548364400416034343698203944890932571198, + 376231863801340, + 482702835240652, + 21888242871839275222246405745257275088548364400416034343698203695392214057971, + 529514633268787, + 21888242871839275222246405745257275088548364400416034343698203635581998478685, + 491796526647989, + 469344462455730, + 133748143760861, + 432783163328013, + 21888242871839275222246405745257275088548364400416034343698204084629549185091, + 427404113223691, + 10544587137971, + 21888242871839275222246405745257275088548364400416034343698203942393748343111, + 60023712926669, + 68573827237312, + 554671908957060, + 332136268613227, + 21888242871839275222246405745257275088548364400416034343698203678049568764216, + 21888242871839275222246405745257275088548364400416034343698203765217244835352, + 21888242871839275222246405745257275088548364400416034343698204166244579753936, + 492033960647394, + 369271418202933, + 21888242871839275222246405745257275088548364400416034343698204036229928544041, + 21888242871839275222246405745257275088548364400416034343698203929461759337136, + 21888242871839275222246405745257275088548364400416034343698203833198610259742, + 387655034125596, + 530256372852701, + 284328363403992, + 21888242871839275222246405745257275088548364400416034343698203637645659182875, + 365308068546514, + 21888242871839275222246405745257275088548364400416034343698203729553234264645, + 21888242871839275222246405745257275088548364400416034343698203829001082462941, + 21888242871839275222246405745257275088548364400416034343698203950833636899617, + 314311096020770, + 21888242871839275222246405745257275088548364400416034343698204032355582630951, + 124644664471723, + 313007827279156, + 338831909423384, + 158794524724867, + 21888242871839275222246405745257275088548364400416034343698203970762882873699, + 21888242871839275222246405745257275088548364400416034343698203646292472937203, + 21888242871839275222246405745257275088548364400416034343698204122887883300923, + 21888242871839275222246405745257275088548364400416034343698203681810154128510, + 398119004457032, + 44846298123362, + 21888242871839275222246405745257275088548364400416034343698203639842593490501, + 21888242871839275222246405745257275088548364400416034343698203881479591354792, + 488856205970009, + 21888242871839275222246405745257275088548364400416034343698204051531046880240, + 554279133358423, + 540312692996485, + 21888242871839275222246405745257275088548364400416034343698204182984865463575, + 493075362174480, + 158713779335133, + 21888242871839275222246405745257275088548364400416034343698203975982445665945, + 21888242871839275222246405745257275088548364400416034343698204119885783960125, + 21888242871839275222246405745257275088548364400416034343698203627426568877504, + 21888242871839275222246405745257275088548364400416034343698203727787372541127, + 21888242871839275222246405745257275088548364400416034343698203669021468695866, + 133200923282849, + 228623259290948, + 21888242871839275222246405745257275088548364400416034343698203894399885258755, + 558910891666572, + 21888242871839275222246405745257275088548364400416034343698203882254577840633, + 21888242871839275222246405745257275088548364400416034343698203715998289495579, + 475289871736046, + 21888242871839275222246405745257275088548364400416034343698203921014104228053, + 21888242871839275222246405745257275088548364400416034343698204144974032592699, + 555708318974864, + 21888242871839275222246405745257275088548364400416034343698203897183391913807, + 21888242871839275222246405745257275088548364400416034343698204074559466316131, + 21888242871839275222246405745257275088548364400416034343698203837166323225886, + 389763436929073, + 21888242871839275222246405745257275088548364400416034343698204033352931033244, + 21888242871839275222246405745257275088548364400416034343698203942306484222567, + 21888242871839275222246405745257275088548364400416034343698203680451166747071, + 201137150513301, + 21888242871839275222246405745257275088548364400416034343698203775264975672496, + 270866333012344, + 21888242871839275222246405745257275088548364400416034343698204053606037965956, + 173319532782305, + 21888242871839275222246405745257275088548364400416034343698203653032126022298, + 157813453528331, + 47000056583172, + 21888242871839275222246405745257275088548364400416034343698204002102520334842, + 21888242871839275222246405745257275088548364400416034343698203767999441121058, + 21888242871839275222246405745257275088548364400416034343698204085473051348264, + 311679296571757, + 21888242871839275222246405745257275088548364400416034343698204170484260606657, + 102015330091205, + 21888242871839275222246405745257275088548364400416034343698203645805774962862, + 135648820184561, + 21888242871839275222246405745257275088548364400416034343698203631557308383962, + 531981509535967, + 111982797830180, + 186860198903864, + 21888242871839275222246405745257275088548364400416034343698204024009516913589, + 21888242871839275222246405745257275088548364400416034343698204102637744220494, + 21888242871839275222246405745257275088548364400416034343698203897373370883876, + 21888242871839275222246405745257275088548364400416034343698203626281023652043, + 21888242871839275222246405745257275088548364400416034343698203909492659160296, + 180093395358037, + 21888242871839275222246405745257275088548364400416034343698203968166858763450, + 233533232590523, + 155768520532894, + 526109422485732, + 445935410021943, + 359316663699673, + 110711295593009, + 21888242871839275222246405745257275088548364400416034343698203972981783700687, + 21888242871839275222246405745257275088548364400416034343698203919090469540569, + 21888242871839275222246405745257275088548364400416034343698203912769830749476, + 21888242871839275222246405745257275088548364400416034343698203781211541810995, + 21888242871839275222246405745257275088548364400416034343698204089938437146580, + 348580838113482, + 75957820147531, + 348585308243074, + 21888242871839275222246405745257275088548364400416034343698203899580532448725, + 204450508222994, + 21888242871839275222246405745257275088548364400416034343698204076960296233225, + 453761608725858, + 21888242871839275222246405745257275088548364400416034343698203787543724195161, + 21888242871839275222246405745257275088548364400416034343698203848770813985427, + 125975392124296, + 21888242871839275222246405745257275088548364400416034343698203809831767202952, + 21888242871839275222246405745257275088548364400416034343698203693277404764507, + 21888242871839275222246405745257275088548364400416034343698203911478602577912, + 21888242871839275222246405745257275088548364400416034343698203687383131454738, + 21888242871839275222246405745257275088548364400416034343698204163989430309178, + 21888242871839275222246405745257275088548364400416034343698203771214989547744, + 21888242871839275222246405745257275088548364400416034343698203812259354540005, + 339910275560229, + 163531410999537, + 21888242871839275222246405745257275088548364400416034343698204148484440812708, + 21888242871839275222246405745257275088548364400416034343698204015908614097165, + 21888242871839275222246405745257275088548364400416034343698203729633572905199, + 21888242871839275222246405745257275088548364400416034343698204040242538013591, + 21888242871839275222246405745257275088548364400416034343698203637233938821745, + 84741829873347, + 514760264800465, + 21888242871839275222246405745257275088548364400416034343698204161492621772858, + 77124243769411, + 211733512971070, + 352108074730880, + 321043430950014, + 242498698806320, + 86095631992124, + 21888242871839275222246405745257275088548364400416034343698203724234512975540, + 21888242871839275222246405745257275088548364400416034343698203737006824599812, + 18113364339250, + 21888242871839275222246405745257275088548364400416034343698204176759672002247, + 21888242871839275222246405745257275088548364400416034343698204170755075622443, + 21888242871839275222246405745257275088548364400416034343698203920292935598357, + 242775723001906, + 21888242871839275222246405745257275088548364400416034343698204151052442024197, + 21888242871839275222246405745257275088548364400416034343698204028986666387478, + 21888242871839275222246405745257275088548364400416034343698203687495898039759, + 265666592748902, + 361288012549314, + 198525140072949, + 414918135828375, + 21888242871839275222246405745257275088548364400416034343698203692410967771583, + 466973581927410, + 320946260954586, + 333155850619619, + 121407677559519, + 21888242871839275222246405745257275088548364400416034343698203908099150319237, + 316957263827043, + 360727099041668, + 261684066696011, + 345065795170727, + 501448274671583, + 21888242871839275222246405745257275088548364400416034343698204101105698503664, + 21888242871839275222246405745257275088548364400416034343698204181602367099254, + 464625455368725, + 278815591887243, + 277074246531973, + 21888242871839275222246405745257275088548364400416034343698203624955156139893, + 259127225570158, + 276673648768540, + 21888242871839275222246405745257275088548364400416034343698203888558018752233, + 5596759855511, + 307335480458297, + 21888242871839275222246405745257275088548364400416034343698204072629297537225, + 21888242871839275222246405745257275088548364400416034343698203639112564685260, + 21888242871839275222246405745257275088548364400416034343698204161498900043482, + 21888242871839275222246405745257275088548364400416034343698203914281833921442, + 21888242871839275222246405745257275088548364400416034343698203665074378689417, + 195141040294345, + 21888242871839275222246405745257275088548364400416034343698203663994479718058, + 537972181577176, + 21888242871839275222246405745257275088548364400416034343698203940447104026866, + 21888242871839275222246405745257275088548364400416034343698203926149662536997, + 76014260899415, + 21888242871839275222246405745257275088548364400416034343698204091039684954670, + 443520684389194, + 21888242871839275222246405745257275088548364400416034343698203834535681245420, + 21888242871839275222246405745257275088548364400416034343698203966904707561927, + 21888242871839275222246405745257275088548364400416034343698203870976834662767, + 21888242871839275222246405745257275088548364400416034343698203930643940802001, + 21888242871839275222246405745257275088548364400416034343698203976239436723117, + 21888242871839275222246405745257275088548364400416034343698203639192930066491, + 348304463739314, + 21888242871839275222246405745257275088548364400416034343698204152858959726640, + 303146424290202, + 21888242871839275222246405745257275088548364400416034343698204097201466336350, + 21888242871839275222246405745257275088548364400416034343698203909764058425521, + 21888242871839275222246405745257275088548364400416034343698204114405591109267, + 21888242871839275222246405745257275088548364400416034343698203936407869146702, + 21888242871839275222246405745257275088548364400416034343698204152024038826542, + 113036717105453, + 21888242871839275222246405745257275088548364400416034343698203835155199616054, + 403978084962799, + 21888242871839275222246405745257275088548364400416034343698203747452738043621, + 371023409556785, + 66640916992461, + 387119065711557, + 21888242871839275222246405745257275088548364400416034343698203895923499926067, + 21888242871839275222246405745257275088548364400416034343698203724531741879242, + 21888242871839275222246405745257275088548364400416034343698203652928302235199, + 284639442032142, + 130928464038596, + 362702162412050, + 214515468065666, + 21888242871839275222246405745257275088548364400416034343698203776526879264587, + 21888242871839275222246405745257275088548364400416034343698203757300118117352, + 190111218221189, + 21888242871839275222246405745257275088548364400416034343698204025568036772567, + 21888242871839275222246405745257275088548364400416034343698203869268639059281, + 770783905907, + 21888242871839275222246405745257275088548364400416034343698203867742527557637, + 21888242871839275222246405745257275088548364400416034343698203653869403919869, + 237958860793309, + 37355650823907, + 313217252547398, + 21888242871839275222246405745257275088548364400416034343698203824796447692118, + 134262031127288, + 21888242871839275222246405745257275088548364400416034343698204134431612739057, + 366639758881503, + 21888242871839275222246405745257275088548364400416034343698203812799243617826, + 21888242871839275222246405745257275088548364400416034343698203999749257881719, + 21888242871839275222246405745257275088548364400416034343698204121419811527650, + 21888242871839275222246405745257275088548364400416034343698203977906099851630, + 362183312820846, + 391469252517987, + 55710869921717, + 21888242871839275222246405745257275088548364400416034343698203769990225037022, + 21888242871839275222246405745257275088548364400416034343698203709195764286607, + 525975853155302, + 410152129220830, + 96235073588901, + 21888242871839275222246405745257275088548364400416034343698203788255138777029, + 21888242871839275222246405745257275088548364400416034343698203904674959594613, + 21888242871839275222246405745257275088548364400416034343698203711654956026844, + 21888242871839275222246405745257275088548364400416034343698204100477337356066, + 21888242871839275222246405745257275088548364400416034343698203833933461511146, + 21888242871839275222246405745257275088548364400416034343698203949197866259352, + 362187344640972, + 21888242871839275222246405745257275088548364400416034343698203825853686532510, + 234740227054178, + 339826401213673, + 21888242871839275222246405745257275088548364400416034343698203927597027722120, + 21888242871839275222246405745257275088548364400416034343698203977859703071589, + 21888242871839275222246405745257275088548364400416034343698204105645102059417, + 512583566644732, + 116780863118750, + 219187935086473, + 21888242871839275222246405745257275088548364400416034343698203797637911156372, + 234366586336097, + 21888242871839275222246405745257275088548364400416034343698203928577238460389, + 167179069051012, + 507863944457748, + 21888242871839275222246405745257275088548364400416034343698203694965084764936, + 21888242871839275222246405745257275088548364400416034343698203791933295135894, + 53879001400387, + 511522075675275, + 215809786254468, + 216638157451652, + 7372067371693, + 562017023066936, + 278091211626539, + 21888242871839275222246405745257275088548364400416034343698204068735675529401, + 21888242871839275222246405745257275088548364400416034343698203791820458514874, + 535250447778149, + 9382102617774, + 21888242871839275222246405745257275088548364400416034343698203954043116419228, + 21888242871839275222246405745257275088548364400416034343698204005593374782552, + 21888242871839275222246405745257275088548364400416034343698203679837947340509, + 21888242871839275222246405745257275088548364400416034343698204009185902347558, + 21888242871839275222246405745257275088548364400416034343698204079711525694244, + 34846544724842, + 443518968542475, + 21888242871839275222246405745257275088548364400416034343698204096327492341179, + 21888242871839275222246405745257275088548364400416034343698203976372918630733, + 527613730313982, + 21888242871839275222246405745257275088548364400416034343698203707482895850106, + 21888242871839275222246405745257275088548364400416034343698203770548778839850, + 21888242871839275222246405745257275088548364400416034343698203982124944095625, + 383542226799012, + 21888242871839275222246405745257275088548364400416034343698203660181347432643, + 21888242871839275222246405745257275088548364400416034343698204074917536827681, + 21888242871839275222246405745257275088548364400416034343698203898324397513226, + 21888242871839275222246405745257275088548364400416034343698203998043119249991, + 496635416130721, + 297285363373940, + 21888242871839275222246405745257275088548364400416034343698204048174080430745, + 79260706580949, + 21888242871839275222246405745257275088548364400416034343698204070893854637522, + 21888242871839275222246405745257275088548364400416034343698203984881627097470, + 21888242871839275222246405745257275088548364400416034343698203903323881378494, + 21888242871839275222246405745257275088548364400416034343698203655076537253088, + 21888242871839275222246405745257275088548364400416034343698203702753605404982, + 21888242871839275222246405745257275088548364400416034343698204109350426068302, + 21888242871839275222246405745257275088548364400416034343698203839571276711632, + 21888242871839275222246405745257275088548364400416034343698204178147524117760, + 21888242871839275222246405745257275088548364400416034343698203874447118337430, + 21888242871839275222246405745257275088548364400416034343698203750480827128005, + 24079907430277, + 21888242871839275222246405745257275088548364400416034343698203791077268634538, + 21888242871839275222246405745257275088548364400416034343698203796244365451675, + 21888242871839275222246405745257275088548364400416034343698203702191158211766, + 407505871326208, + 21888242871839275222246405745257275088548364400416034343698203776689326903405, + 507409074687090, + 21888242871839275222246405745257275088548364400416034343698203643172827430638, + 21888242871839275222246405745257275088548364400416034343698203910323180148786, + 503430684883384, + 502947963052478, + 21888242871839275222246405745257275088548364400416034343698204107035272408502, + 21888242871839275222246405745257275088548364400416034343698203669591755099504, + 402756783686318, + 21888242871839275222246405745257275088548364400416034343698203973293555086617, + 21888242871839275222246405745257275088548364400416034343698203995420644127589, + 539832317195982, + 439148409531777, + 21888242871839275222246405745257275088548364400416034343698203983711687944867, + 21888242871839275222246405745257275088548364400416034343698204104427495830020, + 21888242871839275222246405745257275088548364400416034343698203793942135996363, + 273586836657801, + 440255383373420, + 21888242871839275222246405745257275088548364400416034343698203874101060340871, + 151991505049542, + 359941775143601, + 469531720960774, + 21888242871839275222246405745257275088548364400416034343698204021357454874126, + 551534982574011, + 21888242871839275222246405745257275088548364400416034343698203834359082915067, + 21888242871839275222246405745257275088548364400416034343698203670681363552094, + 311684558722523, + 58374232157311, + 21888242871839275222246405745257275088548364400416034343698203820223881216903, + 34804151298777, + 21888242871839275222246405745257275088548364400416034343698204166590607513457, + 21888242871839275222246405745257275088548364400416034343698204008920338428192, + 21888242871839275222246405745257275088548364400416034343698203932665721044545, + 21888242871839275222246405745257275088548364400416034343698203977773393557574, + 349393705577994, + 21888242871839275222246405745257275088548364400416034343698203636811303439552, + 21888242871839275222246405745257275088548364400416034343698203777179395529318, + 270207331630781, + 21888242871839275222246405745257275088548364400416034343698203824397676786157, + 96877306541997, + 467477094440957, + 511867393468188, + 463899576041550, + 21888242871839275222246405745257275088548364400416034343698204075863744780174, + 255214879044016, + 141904091440643, + 90609871635252, + 544549672336965, + 352448981788579, + 21888242871839275222246405745257275088548364400416034343698204129925801349347, + 21888242871839275222246405745257275088548364400416034343698203879502283921360, + 21888242871839275222246405745257275088548364400416034343698203866721784761482, + 375333761885908, + 21888242871839275222246405745257275088548364400416034343698203989567111332890, + 270711543769498, + 21888242871839275222246405745257275088548364400416034343698203851290730293444, + 21888242871839275222246405745257275088548364400416034343698204093945030777370, + 21888242871839275222246405745257275088548364400416034343698204071489441951958, + 21888242871839275222246405745257275088548364400416034343698203709017355409416, + 21888242871839275222246405745257275088548364400416034343698203822246194181467, + 547348211158652, + 21888242871839275222246405745257275088548364400416034343698203804511551588881, + 21888242871839275222246405745257275088548364400416034343698203718094182794943, + 81343604568542, + 21888242871839275222246405745257275088548364400416034343698203917738773581863, + 126896553344314, + 422512507788606, + 21888242871839275222246405745257275088548364400416034343698203692013523086964, + 21888242871839275222246405745257275088548364400416034343698203981067995578554, + 21888242871839275222246405745257275088548364400416034343698203830480326517982, + 21888242871839275222246405745257275088548364400416034343698203871171345191078, + 233258502228092, + 21888242871839275222246405745257275088548364400416034343698203627126786893719, + 21888242871839275222246405745257275088548364400416034343698204104081375101638, + 21888242871839275222246405745257275088548364400416034343698203830522933743631, + 399866547415998, + 21888242871839275222246405745257275088548364400416034343698203631093134477233, + 21888242871839275222246405745257275088548364400416034343698203894717005242570, + 21888242871839275222246405745257275088548364400416034343698203708389289957421, + 21888242871839275222246405745257275088548364400416034343698203703534418865515, + 21888242871839275222246405745257275088548364400416034343698203859652035002745, + 21888242871839275222246405745257275088548364400416034343698204075388998637150, + 157051581193295, + 21888242871839275222246405745257275088548364400416034343698204067540128095582, + 198500075172114, + 21888242871839275222246405745257275088548364400416034343698204138341022903136, + 466166052479652, + 68359468090020, + 21888242871839275222246405745257275088548364400416034343698203730351247577016, + 112486129501202, + 25645468844124, + 21888242871839275222246405745257275088548364400416034343698203850907593653592, + 2433978162534, + 274039573338771, + 21888242871839275222246405745257275088548364400416034343698203757863910255667, + 175586476921918, + 21888242871839275222246405745257275088548364400416034343698203973776056234349, + 62589867150536, + 21888242871839275222246405745257275088548364400416034343698203909489027338529, + 526028993567298, + 492390398442462, + 129596373549706, + 191674696556002, + 21888242871839275222246405745257275088548364400416034343698204029339169792002, + 106184222864663, + 414750046673487, + 80385805671797, + 21888242871839275222246405745257275088548364400416034343698203727354452245632, + 386492503777477, + 289714529571248, + 461011588447819, + 21888242871839275222246405745257275088548364400416034343698204028287184436183, + 21888242871839275222246405745257275088548364400416034343698203908334599364619, + 508729010193191, + 248502403319753, + 21888242871839275222246405745257275088548364400416034343698204134505713989737, + 54018207146541, + 42884748278018, + 83148930719285, + 541305743957257, + 21888242871839275222246405745257275088548364400416034343698203741906996617503, + 21888242871839275222246405745257275088548364400416034343698204098958067768562, + 459386858005315, + 21888242871839275222246405745257275088548364400416034343698203730554536552469, + 39343349533180, + 517967207262480, + 283969972225396, + 21888792601737, + 561765083207697, + 477138915276326, + 21888242871839275222246405745257275088548364400416034343698203959039358634858, + 247692441772187, + 21888242871839275222246405745257275088548364400416034343698204021016205691176, + 276463572099491, + 21888242871839275222246405745257275088548364400416034343698204053022930096853, + 21888242871839275222246405745257275088548364400416034343698203828698342706059, + 540306129118894, + 248919523216947, + 21888242871839275222246405745257275088548364400416034343698204130219453572760, + 558739287912984, + 21888242871839275222246405745257275088548364400416034343698203728982188080681, + 84411375064201, + 21888242871839275222246405745257275088548364400416034343698203832679456641039, + 424498333122615, + 327480676208333, + 271114314757771, + 21888242871839275222246405745257275088548364400416034343698203689917800498359, + 21888242871839275222246405745257275088548364400416034343698204064613058881959, + 21888242871839275222246405745257275088548364400416034343698203902800574721594, + 320802954330145, + 186079055544338, + 229284145858671, + 21888242871839275222246405745257275088548364400416034343698204061760749799545, + 7941886484846, + 21888242871839275222246405745257275088548364400416034343698204159909417754889, + 21888242871839275222246405745257275088548364400416034343698203758590410968740, + 288170982890010, + 275461379875897, + 21888242871839275222246405745257275088548364400416034343698203706500626321121, + 21888242871839275222246405745257275088548364400416034343698203962420567436552, + 21888242871839275222246405745257275088548364400416034343698203815722762652382, + 21888242871839275222246405745257275088548364400416034343698203857270223789056, + 21888242871839275222246405745257275088548364400416034343698204051832906646918, + 21888242871839275222246405745257275088548364400416034343698204043839663846337, + 21888242871839275222246405745257275088548364400416034343698204148129840266007, + 21888242871839275222246405745257275088548364400416034343698203997933358211119, + 72321590609427, + 21888242871839275222246405745257275088548364400416034343698203978868885307738, + 21392633186747, + 21888242871839275222246405745257275088548364400416034343698204172719251925201, + 141513845683883, + 32401821471605, + 316569828436118, + 21888242871839275222246405745257275088548364400416034343698203862335632963781, + 21888242871839275222246405745257275088548364400416034343698203800754160576131, + 74180038255402, + 21888242871839275222246405745257275088548364400416034343698204137807417038485, + 475034643407234, + 21888242871839275222246405745257275088548364400416034343698203768881127862809, + 21888242871839275222246405745257275088548364400416034343698204006462766247300, + 164619252912953, + 406950054679220, + 21888242871839275222246405745257275088548364400416034343698204040821258564173, + 21888242871839275222246405745257275088548364400416034343698204024393710588752, + 21888242871839275222246405745257275088548364400416034343698203666223847153313, + 77759737877345, + 355926667309604, + 21888242871839275222246405745257275088548364400416034343698203782945726883326, + 21888242871839275222246405745257275088548364400416034343698203888922186081110, + 80909432266639, + 21888242871839275222246405745257275088548364400416034343698204162055508852097, + 83689800566939, + 21888242871839275222246405745257275088548364400416034343698203943827033631388, + 21888242871839275222246405745257275088548364400416034343698203691851330400831, + 21888242871839275222246405745257275088548364400416034343698203638568171936318, + 276161484531722, + 21888242871839275222246405745257275088548364400416034343698203689497495829484, + 21888242871839275222246405745257275088548364400416034343698204012824682789238, + 21888242871839275222246405745257275088548364400416034343698203676118021702698, + 21888242871839275222246405745257275088548364400416034343698203678216399488208, + 431391675450293, + 116266701215500, + 395330241270907, + 21888242871839275222246405745257275088548364400416034343698204152094193196883, + 21888242871839275222246405745257275088548364400416034343698204170992482933270, + 66076505347077, + 460312261368635, + 520291037776444, + 21888242871839275222246405745257275088548364400416034343698204142435081213948, + 168420367221763, + 21888242871839275222246405745257275088548364400416034343698204113398410037312, + 21888242871839275222246405745257275088548364400416034343698203980962905898040, + 54672316496091, + 220945414395298, + 21888242871839275222246405745257275088548364400416034343698204035443950639631, + 152565294103806, + 21888242871839275222246405745257275088548364400416034343698204069530964277458, + 21888242871839275222246405745257275088548364400416034343698203804314703841170, + 21888242871839275222246405745257275088548364400416034343698203869217714890348, + 288759303219696, + 8855933427742, + 28718308152905, + 21888242871839275222246405745257275088548364400416034343698203953843317532248, + 309101248180929, + 21888242871839275222246405745257275088548364400416034343698203633198469948930, + 397782275810978, + 21888242871839275222246405745257275088548364400416034343698204043974487101019, + 21888242871839275222246405745257275088548364400416034343698204162323822036616, + 21888242871839275222246405745257275088548364400416034343698204160820166802587, + 21888242871839275222246405745257275088548364400416034343698204114828537687511, + 49422282800615, + 21888242871839275222246405745257275088548364400416034343698204028861893789860, + 522620661431490, + 418788697374149, + 21888242871839275222246405745257275088548364400416034343698203754365492893075, + 21888242871839275222246405745257275088548364400416034343698203666396031176678, + 187765809019824, + 482171191012917, + 427534152025251, + 453592623563732, + 91947172518400, + 330515869909323, + 21888242871839275222246405745257275088548364400416034343698203724280690566251, + 21888242871839275222246405745257275088548364400416034343698203921240345950143, + 21888242871839275222246405745257275088548364400416034343698203994256029986807, + 297491815412575, + 21888242871839275222246405745257275088548364400416034343698203932365090527937, + 21888242871839275222246405745257275088548364400416034343698203853192769092017, + 21888242871839275222246405745257275088548364400416034343698203798762261284065, + 21888242871839275222246405745257275088548364400416034343698203719659436107132, + 206472588688360, + 21888242871839275222246405745257275088548364400416034343698203852575972151638, + 21888242871839275222246405745257275088548364400416034343698204133976556030563, + 21888242871839275222246405745257275088548364400416034343698204023446537917625, + 21888242871839275222246405745257275088548364400416034343698203704698702563020, + 21888242871839275222246405745257275088548364400416034343698203836136295924711, + 557348996706894, + 50476084174823, + 555009646138384, + 21888242871839275222246405745257275088548364400416034343698203974810120234467, + 112379890968466, + 439319111878891, + 299265117362536, + 554816948487475, + 21888242871839275222246405745257275088548364400416034343698203769319026395904, + 19804504051945, + 21888242871839275222246405745257275088548364400416034343698204015693081012848, + 205506496350176, + 21888242871839275222246405745257275088548364400416034343698203986237701852985, + 439454886728193, + 484879953448862, + 21888242871839275222246405745257275088548364400416034343698203730828943717155, + 160940737225243, + 21888242871839275222246405745257275088548364400416034343698203780981511177528, + 21888242871839275222246405745257275088548364400416034343698203798927327259218, + 21888242871839275222246405745257275088548364400416034343698203760358064881276, + 21888242871839275222246405745257275088548364400416034343698204030003118712428, + 21888242871839275222246405745257275088548364400416034343698203712387854256488, + 294599667717851, + 21888242871839275222246405745257275088548364400416034343698203872956668834326, + 396571562874925, + 21888242871839275222246405745257275088548364400416034343698203883850899892934, + 73261013367678, + 251028810065545, + 21888242871839275222246405745257275088548364400416034343698204038642493777843, + 362716441963502, + 21888242871839275222246405745257275088548364400416034343698204001121203517254, + 21888242871839275222246405745257275088548364400416034343698204136953507303784, + 21888242871839275222246405745257275088548364400416034343698203905709901992034, + 21888242871839275222246405745257275088548364400416034343698204131757496122680, + 21888242871839275222246405745257275088548364400416034343698203685732996661272, + 21888242871839275222246405745257275088548364400416034343698203871623485133773, + 438693657528110, + 550419984281267, + 21888242871839275222246405745257275088548364400416034343698203965502877879552, + 398536926076530, + 543183748316177, + 65939005335846, + 511175201144605, + 147258819337670, + 21888242871839275222246405745257275088548364400416034343698203753445066380397, + 21888242871839275222246405745257275088548364400416034343698203719497721370203, + 30851376584686, + 21888242871839275222246405745257275088548364400416034343698203692088579984180, + 21888242871839275222246405745257275088548364400416034343698204139287773508926, + 21888242871839275222246405745257275088548364400416034343698203774430868774107, + 80517559579527, + 21888242871839275222246405745257275088548364400416034343698203766915258196988, + 21888242871839275222246405745257275088548364400416034343698203921770990616575, + 355830702167587, + 458931425083875, + 21888242871839275222246405745257275088548364400416034343698204053580384338369, + 385160886520770, + 298376444569082, + 69770810461103, + 331990538527192, + 21888242871839275222246405745257275088548364400416034343698203882194491158935, + 21888242871839275222246405745257275088548364400416034343698203689971617465562, + 428475174266250, + 251862104897451, + 21888242871839275222246405745257275088548364400416034343698204114334454330416, + 21888242871839275222246405745257275088548364400416034343698204121625461091712, + 454031574017146, + 477982713495103, + 513106807459446, + 21888242871839275222246405745257275088548364400416034343698204069644367618316, + 21888242871839275222246405745257275088548364400416034343698203808111774377846, + 404905574864006, + 253544394442507, + 538244746703171, + 21888242871839275222246405745257275088548364400416034343698204103981868235150, + 21888242871839275222246405745257275088548364400416034343698204162601697912594, + 539698245716733, + 311113970734633, + 113418081866767, + 208797249681037, + 2084922459523, + 278829334575137, + 508877021403932, + 488876703693059, + 21888242871839275222246405745257275088548364400416034343698203801973510588221, + 533115966273350, + 45672085578841, + 152587277378040, + 69272032588825, + 21888242871839275222246405745257275088548364400416034343698204159504184454804, + 414310188192301, + 131889708236808, + 241904405819813, + 6827992797031, + 21888242871839275222246405745257275088548364400416034343698204040213037141327, + 287282664404066, + 21888242871839275222246405745257275088548364400416034343698203720707331690284, + 21888242871839275222246405745257275088548364400416034343698203745366152852972, + 275290080817588, + 21888242871839275222246405745257275088548364400416034343698204013793608066835, + 446901688822644, + 21888242871839275222246405745257275088548364400416034343698203938884421653814, + 253265468495387, + 505329942047299, + 42432016604449, + 294178387730478, + 241908511229252, + 21888242871839275222246405745257275088548364400416034343698203820743616654884, + 189187049078359, + 21165203025212, + 21888242871839275222246405745257275088548364400416034343698203637866166528077, + 21888242871839275222246405745257275088548364400416034343698203997318803229466, + 92164807799167, + 53636478432408, + 426911153841755, + 21888242871839275222246405745257275088548364400416034343698204083751786542876, + 228790165377759, + 551822939592811, + 21888242871839275222246405745257275088548364400416034343698203781682078558157, + 21888242871839275222246405745257275088548364400416034343698203967889002536015, + 21888242871839275222246405745257275088548364400416034343698203888026823874613, + 246318990065045, + 21888242871839275222246405745257275088548364400416034343698203692730003305453, + 26773635501702, + 232127461472565, + 21888242871839275222246405745257275088548364400416034343698204065272569299026, + 21888242871839275222246405745257275088548364400416034343698203996327542218256, + 21888242871839275222246405745257275088548364400416034343698204184665489236846, + 21888242871839275222246405745257275088548364400416034343698203908448557711653, + 21888242871839275222246405745257275088548364400416034343698203914723557679226, + 21888242871839275222246405745257275088548364400416034343698204143665261436069, + 21888242871839275222246405745257275088548364400416034343698203835328857561847, + 21888242871839275222246405745257275088548364400416034343698203928917194413357, + 26888457508678, + 21888242871839275222246405745257275088548364400416034343698203911967950826176, + 21888242871839275222246405745257275088548364400416034343698203731493403839864, + 199724824291817, + 21888242871839275222246405745257275088548364400416034343698203631836036599743, + 236597572101824, + 446271250992734, + 21888242871839275222246405745257275088548364400416034343698204175177441684094, + 21888242871839275222246405745257275088548364400416034343698204170590975341506, + 21888242871839275222246405745257275088548364400416034343698203898475342696288, + 21888242871839275222246405745257275088548364400416034343698203892752371605689, + 323937310417262, + 433086664660818, + 21888242871839275222246405745257275088548364400416034343698203666091752478360, + 21888242871839275222246405745257275088548364400416034343698204083731405310608, + 178102458829671, + 21888242871839275222246405745257275088548364400416034343698204142309078194445, + 21888242871839275222246405745257275088548364400416034343698203796094669421089, + 153174649418172, + 195729753596411, + 21888242871839275222246405745257275088548364400416034343698203713856727428858, + 34923402271736, + 480975629037316, + 372708985478949, + 21888242871839275222246405745257275088548364400416034343698204050186190959341, + 155752596797654, + 21888242871839275222246405745257275088548364400416034343698204053074366297356, + 21888242871839275222246405745257275088548364400416034343698203725016280345892, + 448782444324278, + 144069993679272, + 21888242871839275222246405745257275088548364400416034343698203707402904292940, + 21888242871839275222246405745257275088548364400416034343698204167952817419060, + 21888242871839275222246405745257275088548364400416034343698203896042534998985, + 20182113787934, + 21888242871839275222246405745257275088548364400416034343698203835677732413778, + 21888242871839275222246405745257275088548364400416034343698203973509472055569, + 21888242871839275222246405745257275088548364400416034343698204028580688961450, + 21888242871839275222246405745257275088548364400416034343698204148240094591785, + 21888242871839275222246405745257275088548364400416034343698204161743380336508, + 442317206435567, + 225347274732226, + 42912095923459, + 211651049746648, + 21888242871839275222246405745257275088548364400416034343698203903982456144061, + 217565953351105, + 179431320430106, + 21888242871839275222246405745257275088548364400416034343698203740115569897897, + 86322996526069, + 238458489427094, + 21888242871839275222246405745257275088548364400416034343698204170021767058684, + 21888242871839275222246405745257275088548364400416034343698203755932636579092, + 383376603152453, + 21888242871839275222246405745257275088548364400416034343698203636634350887184, + 21888242871839275222246405745257275088548364400416034343698204002355908018202, + 21888242871839275222246405745257275088548364400416034343698203791512973368828, + 470943402961556, + 21888242871839275222246405745257275088548364400416034343698204041862111261122, + 40688539121891, + 21888242871839275222246405745257275088548364400416034343698204142692754757229, + 154403263546970, + 21888242871839275222246405745257275088548364400416034343698204057243143886185, + 393664177127754, + 384765225117499, + 21888242871839275222246405745257275088548364400416034343698204154783983469923, + 21888242871839275222246405745257275088548364400416034343698203705252643147032, + 21888242871839275222246405745257275088548364400416034343698203778416124340434, + 110440687116187, + 481183662579497, + 131384505825222, + 401544849427102, + 540653041591070, + 21888242871839275222246405745257275088548364400416034343698203943302561373965, + 303325785659446, + 169716385233933, + 21888242871839275222246405745257275088548364400416034343698203789780138397340, + 334259640004879, + 173970157797775, + 21888242871839275222246405745257275088548364400416034343698203668398019760814, + 21888242871839275222246405745257275088548364400416034343698204047417749509914, + 21888242871839275222246405745257275088548364400416034343698204050471437145914, + 508995271053575, + 21888242871839275222246405745257275088548364400416034343698203767345380164301, + 21888242871839275222246405745257275088548364400416034343698203808129361820362, + 197648734012191, + 21888242871839275222246405745257275088548364400416034343698203964236058794843, + 290823456753477, + 361613221142387, + 21888242871839275222246405745257275088548364400416034343698204151342046381949, + 21888242871839275222246405745257275088548364400416034343698203977253114766886, + 284713008379757, + 303837629548384, + 21888242871839275222246405745257275088548364400416034343698203958394549851131, + 21888242871839275222246405745257275088548364400416034343698203885180503315171, + 428144530767127, + 21888242871839275222246405745257275088548364400416034343698203946477085862396, + 21888242871839275222246405745257275088548364400416034343698203797634388140469, + 450964790013403, + 21888242871839275222246405745257275088548364400416034343698203813329074778041, + 317816363623262, + 21888242871839275222246405745257275088548364400416034343698203786751676142086, + 21888242871839275222246405745257275088548364400416034343698204073052117075744, + 21888242871839275222246405745257275088548364400416034343698203736459240130649, + 345112255663488, + 21888242871839275222246405745257275088548364400416034343698204141527631875059, + 21888242871839275222246405745257275088548364400416034343698203762778818055391, + 341923335864952, + 259564836273308, + 393153091083694, + 225778604611518, + 21888242871839275222246405745257275088548364400416034343698203838510684010816, + 21888242871839275222246405745257275088548364400416034343698203663773613708214, + 21888242871839275222246405745257275088548364400416034343698204157009868141800, + 21888242871839275222246405745257275088548364400416034343698203876416647893791, + 21888242871839275222246405745257275088548364400416034343698203775469314744258, + 21888242871839275222246405745257275088548364400416034343698203874262723707793, + 79210279162632, + 103964139727258, + 21888242871839275222246405745257275088548364400416034343698204028810768640858, + 21888242871839275222246405745257275088548364400416034343698203939989552164996, + 21888242871839275222246405745257275088548364400416034343698203758754091518707, + 143227063864629, + 21888242871839275222246405745257275088548364400416034343698203944821971147409, + 21888242871839275222246405745257275088548364400416034343698203982920463390804, + 21888242871839275222246405745257275088548364400416034343698203652028623365868, + 21888242871839275222246405745257275088548364400416034343698203787933785497020, + 298148098836759, + 481377557048932, + 21888242871839275222246405745257275088548364400416034343698204073777701497790, + 188724937451184, + 21888242871839275222246405745257275088548364400416034343698203812644330972851, + 125511488495155, + 21888242871839275222246405745257275088548364400416034343698204048091310287279, + 21888242871839275222246405745257275088548364400416034343698203770972085980618, + 156502226885790, + 527438856615936, + 21888242871839275222246405745257275088548364400416034343698204041728381592229, + 21888242871839275222246405745257275088548364400416034343698204137583913728097, + 21888242871839275222246405745257275088548364400416034343698203887859345426677, + 21888242871839275222246405745257275088548364400416034343698204090363073264534, + 450346866649093, + 71376282028251, + 98384810928913, + 426711265470743, + 21888242871839275222246405745257275088548364400416034343698203628902067501171, + 387226679166330, + 458634475219066, + 21888242871839275222246405745257275088548364400416034343698204052741773310956, + 21888242871839275222246405745257275088548364400416034343698203663800084346291, + 142806884174647, + 279945852351793, + 103722015090538, + 405928205030434, + 21888242871839275222246405745257275088548364400416034343698204024794555469458, + 477923677791191, + 435067838880710, + 21888242871839275222246405745257275088548364400416034343698203908113983575712, + 21888242871839275222246405745257275088548364400416034343698203906487286246047, + 21888242871839275222246405745257275088548364400416034343698203784039343876805, + 21888242871839275222246405745257275088548364400416034343698203719051221612983, + 21888242871839275222246405745257275088548364400416034343698204158231329938697, + 21888242871839275222246405745257275088548364400416034343698204139189055077383, + 149176690009934, + 104647671104978, + 21888242871839275222246405745257275088548364400416034343698204058212775597197, + 67688476240144, + 264684222829354, + 21888242871839275222246405745257275088548364400416034343698203703049492293171, + 294448708533434, + 21888242871839275222246405745257275088548364400416034343698203709873396745579, + 21888242871839275222246405745257275088548364400416034343698203707943474341477, + 155963625840044, + 21888242871839275222246405745257275088548364400416034343698203907205395817537, + 29778298837339, + 268499239837528, + 556213579910609, + 363255096887825, + 507961624934829, + 369923126760441, + 21888242871839275222246405745257275088548364400416034343698203707934419896881, + 21888242871839275222246405745257275088548364400416034343698203652445949160083, + 516535904993897, + 115780995439382, + 21888242871839275222246405745257275088548364400416034343698203684943521464423, + 21888242871839275222246405745257275088548364400416034343698203833820554686659, + 21888242871839275222246405745257275088548364400416034343698203861658243984852, + 21888242871839275222246405745257275088548364400416034343698204033152799214479, + 21888242871839275222246405745257275088548364400416034343698203681823822214645, + 21888242871839275222246405745257275088548364400416034343698204017189970168781, + 21888242871839275222246405745257275088548364400416034343698203918969701418158, + 123950334425494, + 21888242871839275222246405745257275088548364400416034343698203888362460032605, + 21888242871839275222246405745257275088548364400416034343698203946138370696691, + 21888242871839275222246405745257275088548364400416034343698203740095359964842, + 21888242871839275222246405745257275088548364400416034343698203762631040862431, + 21888242871839275222246405745257275088548364400416034343698203707841168625498, + 21888242871839275222246405745257275088548364400416034343698204003515492254614, + 21888242871839275222246405745257275088548364400416034343698203869516231137715, + 21888242871839275222246405745257275088548364400416034343698204042320326610608, + 21888242871839275222246405745257275088548364400416034343698204141382774582657, + 386251136798279, + 21888242871839275222246405745257275088548364400416034343698204124292146916150, + 522691262056149, + 21888242871839275222246405745257275088548364400416034343698203820804439069769, + 21888242871839275222246405745257275088548364400416034343698203877116304702614, + 533592282344920, + 422782536707776, + 21888242871839275222246405745257275088548364400416034343698204108532610161129, + 560169802657567, + 21888242871839275222246405745257275088548364400416034343698203951369169358811, + 230024186704109, + 544837800143203, + 130749931340554, + 250058002949891, + 7347572891635, + 181767244426065, + 47621085198431, + 21888242871839275222246405745257275088548364400416034343698203671395288466334, + 21888242871839275222246405745257275088548364400416034343698204028020044845518, + 21888242871839275222246405745257275088548364400416034343698204163566377198644, + 21888242871839275222246405745257275088548364400416034343698203791839252932394, + 245842186172434, + 291853516383329, + 21888242871839275222246405745257275088548364400416034343698204110747205097481, + 21888242871839275222246405745257275088548364400416034343698204009638680367622, + 21888242871839275222246405745257275088548364400416034343698203895035015284980, + 21888242871839275222246405745257275088548364400416034343698204178267063572031, + 262664784555754, + 21888242871839275222246405745257275088548364400416034343698204007898730530721, + 460034192630003, + 143572820350530, + 450032141950929, + 498556205721633, + 21888242871839275222246405745257275088548364400416034343698203751156894815950, + 21888242871839275222246405745257275088548364400416034343698203737968551183222, + 21888242871839275222246405745257275088548364400416034343698203686550182327995, + 21888242871839275222246405745257275088548364400416034343698203855997435610927, + 21888242871839275222246405745257275088548364400416034343698204019629756129456, + 537261238084646, + 34993078955451, + 21888242871839275222246405745257275088548364400416034343698203706459007756618, + 211481422178108, + 300666097032211, + 163200692048068, + 21888242871839275222246405745257275088548364400416034343698204178387446989443, + 209773871450761, + 21888242871839275222246405745257275088548364400416034343698204014344331603778, + 21888242871839275222246405745257275088548364400416034343698203754900410645697, + 21888242871839275222246405745257275088548364400416034343698203874027181814867, + 552398896382534, + 21888242871839275222246405745257275088548364400416034343698203638645467442580, + 21888242871839275222246405745257275088548364400416034343698204026374312291334, + 158111285443650, + 21888242871839275222246405745257275088548364400416034343698203784450434792405, + 197690195005660, + 21888242871839275222246405745257275088548364400416034343698204027970734246178, + 21888242871839275222246405745257275088548364400416034343698203794919778706518, + 21888242871839275222246405745257275088548364400416034343698204074162919546287, + 21888242871839275222246405745257275088548364400416034343698204121417024728908, + 21888242871839275222246405745257275088548364400416034343698203701597939220030, + 407282868833576, + 21888242871839275222246405745257275088548364400416034343698204019363245947342, + 383765347482975, + 21888242871839275222246405745257275088548364400416034343698204056725438886273, + 21888242871839275222246405745257275088548364400416034343698203680200663497557, + 394007747682173, + 382947091167621, + 21888242871839275222246405745257275088548364400416034343698203894144068547219, + 553959089698130, + 7786453953396, + 21888242871839275222246405745257275088548364400416034343698203695111799488855, + 107788883290802, + 30924547481483, + 479714633390324, + 21888242871839275222246405745257275088548364400416034343698204057673923213364, + 526759809958665, + 21888242871839275222246405745257275088548364400416034343698204101314122104672, + 21888242871839275222246405745257275088548364400416034343698204021113610761759, + 41221496949231, + 67934421213175, + 21888242871839275222246405745257275088548364400416034343698203861038418055625, + 21888242871839275222246405745257275088548364400416034343698204016434007199597, + 270082480070706, + 21888242871839275222246405745257275088548364400416034343698204142848868473973, + 478426069586592, + 21888242871839275222246405745257275088548364400416034343698203672973971717526, + 372579821971359, + 21888242871839275222246405745257275088548364400416034343698203997638620579876, + 21888242871839275222246405745257275088548364400416034343698203780677116512169, + 96193501275602, + 21888242871839275222246405745257275088548364400416034343698203749560182985639, + 202784598730446, + 373698369746020, + 298928017834393, + 395564402784093, + 21888242871839275222246405745257275088548364400416034343698204046880825392857, + 151999907536059, + 21888242871839275222246405745257275088548364400416034343698203921816342872450, + 338619188165119, + 397996823995634, + 21888242871839275222246405745257275088548364400416034343698203771135856351414, + 21888242871839275222246405745257275088548364400416034343698203791013498334572, + 368243927419302, + 21888242871839275222246405745257275088548364400416034343698203837394517635856, + 21888242871839275222246405745257275088548364400416034343698204181239739984759, + 21888242871839275222246405745257275088548364400416034343698203727659122347044, + 554011458685651, + 488998141608466, + 21888242871839275222246405745257275088548364400416034343698203972263014967176, + 31969651630815, + 176022958293371, + 247290750862040, + 21888242871839275222246405745257275088548364400416034343698203787649055788309, + 21888242871839275222246405745257275088548364400416034343698204156187793642683, + 233412815307638, + 328608551297353, + 121080839287580, + 21888242871839275222246405745257275088548364400416034343698204095842028592739, + 303542241933378, + 21888242871839275222246405745257275088548364400416034343698204067387399670373, + 21888242871839275222246405745257275088548364400416034343698203993123999696205, + 264130123593615, + 367321446504243, + 21888242871839275222246405745257275088548364400416034343698204016393544196595, + 21888242871839275222246405745257275088548364400416034343698203920681040174058, + 509047153882705, + 21888242871839275222246405745257275088548364400416034343698204174115042951268, + 21888242871839275222246405745257275088548364400416034343698203748167536793502, + 21888242871839275222246405745257275088548364400416034343698204176885433766600, + 21888242871839275222246405745257275088548364400416034343698204050137340699115, + 486831067790379, + 21888242871839275222246405745257275088548364400416034343698203782569774008230, + 119019878505010, + 401039863276423, + 21888242871839275222246405745257275088548364400416034343698203797205208241724, + 312842852823566, + 515570077517298, + 21058100880382, + 124897092190317, + 397967981391423, + 21888242871839275222246405745257275088548364400416034343698203646382083340827, + 21888242871839275222246405745257275088548364400416034343698203683923131803287, + 75061051470578, + 21888242871839275222246405745257275088548364400416034343698204123424850638189, + 21888242871839275222246405745257275088548364400416034343698203703859593730185, + 64982598795946, + 348687461449636, + 480267058844182, + 57780898964710, + 88717462775454, + 21888242871839275222246405745257275088548364400416034343698203722758220670843, + 21888242871839275222246405745257275088548364400416034343698203924664734199445, + 21888242871839275222246405745257275088548364400416034343698203914956064479118, + 341155277567721, + 432875147111002, + 324372807221006, + 46904343877004, + 245146426073507, + 21888242871839275222246405745257275088548364400416034343698204160512408516047, + 9784932671472, + 320297351210301, + 21888242871839275222246405745257275088548364400416034343698203855825240532714, + 39061190261445, + 21888242871839275222246405745257275088548364400416034343698203657965055617832, + 21888242871839275222246405745257275088548364400416034343698204036980914158416, + 21888242871839275222246405745257275088548364400416034343698203759554879781317, + 21888242871839275222246405745257275088548364400416034343698203626504785218535, + 394712708013702, + 21888242871839275222246405745257275088548364400416034343698204043004836712004, + 338516710188212, + 21888242871839275222246405745257275088548364400416034343698203802551335166105, + 21888242871839275222246405745257275088548364400416034343698204024708289892354, + 21888242871839275222246405745257275088548364400416034343698203686172957758088, + 94777643618180, + 21888242871839275222246405745257275088548364400416034343698203805759763005967, + 21888242871839275222246405745257275088548364400416034343698203871873632564009, + 21888242871839275222246405745257275088548364400416034343698204182295215591420, + 504811177843204, + 21888242871839275222246405745257275088548364400416034343698204000158932986634, + 21888242871839275222246405745257275088548364400416034343698203628304242997669, + 441960480670821, + 21888242871839275222246405745257275088548364400416034343698203961154959123782, + 165342828853597, + 21888242871839275222246405745257275088548364400416034343698204004612020929006, + 21888242871839275222246405745257275088548364400416034343698203961353127397178, + 181982730038154, + 21888242871839275222246405745257275088548364400416034343698204068157589488965, + 21888242871839275222246405745257275088548364400416034343698203736170409657568, + 453981972565847, + 21888242871839275222246405745257275088548364400416034343698204096700571514223, + 21888242871839275222246405745257275088548364400416034343698204048994381224252, + 21888242871839275222246405745257275088548364400416034343698203850248270462924, + 130005657773710, + 21888242871839275222246405745257275088548364400416034343698203899427521135111, + 171537010960057, + 21888242871839275222246405745257275088548364400416034343698204022285561691640, + 235104391123799, + 21888242871839275222246405745257275088548364400416034343698203782961673488348, + 21888242871839275222246405745257275088548364400416034343698203956376412471392, + 21888242871839275222246405745257275088548364400416034343698204095554060697275, + 21888242871839275222246405745257275088548364400416034343698204116046895961106, + 392370523874910, + 162352302414361, + 21888242871839275222246405745257275088548364400416034343698204133380100017894, + 60479054804, + 301106446834983, + 561771304057629, + 56881794326710, + 317821615306988, + 505716351262414, + 21888242871839275222246405745257275088548364400416034343698204061622638276584, + 21888242871839275222246405745257275088548364400416034343698204175596258843734, + 1267528227196, + 79019600063391, + 84392613324078, + 21888242871839275222246405745257275088548364400416034343698204015925650497145, + 520927051411263, + 21888242871839275222246405745257275088548364400416034343698203941128164190303, + 21888242871839275222246405745257275088548364400416034343698203875833563523049, + 21888242871839275222246405745257275088548364400416034343698203645522433843961, + 21888242871839275222246405745257275088548364400416034343698204092849332992831, + 21888242871839275222246405745257275088548364400416034343698203963457526815505, + 280755077239025, + 21888242871839275222246405745257275088548364400416034343698204067585663348018, + 21888242871839275222246405745257275088548364400416034343698203631521008224917, + 394130262373036, + 324146982398397, + 21639957672029, + 127629864434139, + 21888242871839275222246405745257275088548364400416034343698204146462824401956, + 61287106027163, + 21888242871839275222246405745257275088548364400416034343698203789573682973876, + 360511438522335, + 21888242871839275222246405745257275088548364400416034343698203729784008375166, + 328197179752711, + 21888242871839275222246405745257275088548364400416034343698203965606518693974, + 21888242871839275222246405745257275088548364400416034343698204141542599425889, + 3363233180473, + 308543505042391, + 21888242871839275222246405745257275088548364400416034343698203902228723625521, + 382661054704692, + 21888242871839275222246405745257275088548364400416034343698203767947887737043, + 21888242871839275222246405745257275088548364400416034343698203906850662523313, + 238731175854390, + 21888242871839275222246405745257275088548364400416034343698203905899038870827, + 90897661656735, + 21888242871839275222246405745257275088548364400416034343698204157204006687225, + 21888242871839275222246405745257275088548364400416034343698203974923447495040, + 210430603008877, + 289868554149333, + 516911901044810, + 21888242871839275222246405745257275088548364400416034343698204183377644239600, + 125033768775931, + 464324523711573, + 21888242871839275222246405745257275088548364400416034343698203720104631212750, + 21888242871839275222246405745257275088548364400416034343698203683787388733597, + 341477910440456, + 21888242871839275222246405745257275088548364400416034343698203766903066791837, + 218114380953718, + 21888242871839275222246405745257275088548364400416034343698203819956085474493, + 242203533315575, + 449371005460523, + 21888242871839275222246405745257275088548364400416034343698204077516512754898, + 556448501627357, + 21888242871839275222246405745257275088548364400416034343698203651311985831476, + 21888242871839275222246405745257275088548364400416034343698203831978872476780, + 21888242871839275222246405745257275088548364400416034343698203987646008266144, + 85140574289457, + 369465408229706, + 21888242871839275222246405745257275088548364400416034343698203626479258864325, + 80795090592823, + 509641729352986, + 248455060557724, + 381964459214103, + 21888242871839275222246405745257275088548364400416034343698203830363488868564, + 21888242871839275222246405745257275088548364400416034343698203777068891446263, + 21888242871839275222246405745257275088548364400416034343698203830230804516266, + 67522629226983, + 21888242871839275222246405745257275088548364400416034343698203721709612723131, + 186655706646797, + 217812439109990, + 38120449230226, + 436936097066861, + 21888242871839275222246405745257275088548364400416034343698203776018496735313, + 21888242871839275222246405745257275088548364400416034343698203939226904009981, + 198592920337511, + 131259202692664, + 301456045973945, + 307697118852572, + 21888242871839275222246405745257275088548364400416034343698203936503195570305, + 393967406808242, + 95054920195313, + 251143381201934, + 432043331440020, + 62608655063446, + 21888242871839275222246405745257275088548364400416034343698203796810331364293, + 35166674049709, + 44584818373303, + 21888242871839275222246405745257275088548364400416034343698203943705064763572, + 21888242871839275222246405745257275088548364400416034343698203839431378768784, + 326430871679698, + 216989818099798, + 21888242871839275222246405745257275088548364400416034343698203703835465082284, + 442720306709611, + 175994784153935, + 21888242871839275222246405745257275088548364400416034343698203663012970700429, + 417557650637150, + 249880905933186, + 185893089552744, + 21888242871839275222246405745257275088548364400416034343698204060506210957703, + 78104451276011, + 516993871037232, + 285594446468781, + 224635052304907, + 468300757651578, + 21888242871839275222246405745257275088548364400416034343698204122425468543552, + 21888242871839275222246405745257275088548364400416034343698204155369798825650, + 343010361285648, + 21888242871839275222246405745257275088548364400416034343698203941346860569447, + 21888242871839275222246405745257275088548364400416034343698203989058612150208, + 18501365231059, + 432475860500123, + 21888242871839275222246405745257275088548364400416034343698203934344124699692, + 483860381704452, + 21888242871839275222246405745257275088548364400416034343698204160682288795328, + 21888242871839275222246405745257275088548364400416034343698204153420206953054, + 21888242871839275222246405745257275088548364400416034343698203636692973975844, + 21888242871839275222246405745257275088548364400416034343698204073762313170641, + 340945890549143, + 21888242871839275222246405745257275088548364400416034343698204167220859020064, + 21888242871839275222246405745257275088548364400416034343698203949657019151893, + 299889702429640, + 153866077337483, + 436076520455252, + 21888242871839275222246405745257275088548364400416034343698203865089807406365, + 427785588307468, + 21888242871839275222246405745257275088548364400416034343698203797764198673174, + 473056770494521, + 254876463930078, + 21888242871839275222246405745257275088548364400416034343698203909781308622920, + 217696632569835, + 21888242871839275222246405745257275088548364400416034343698203952237469236450, + 73946424961731, + 21888242871839275222246405745257275088548364400416034343698203744553778700843, + 475860755887203, + 21888242871839275222246405745257275088548364400416034343698203723377842957195, + 21888242871839275222246405745257275088548364400416034343698203871078235443940, + 21888242871839275222246405745257275088548364400416034343698204001359408079397, + 393530018847396, + 392296287081646, + 325264424412405, + 21888242871839275222246405745257275088548364400416034343698204115626952719615, + 21888242871839275222246405745257275088548364400416034343698203930775747721295, + 21888242871839275222246405745257275088548364400416034343698204140967586255893, + 162062855861343, + 354468460477849, + 21888242871839275222246405745257275088548364400416034343698204083741259301979, + 290023095160878, + 21888242871839275222246405745257275088548364400416034343698203651125845165999, + 21888242871839275222246405745257275088548364400416034343698204061673450120982, + 174421669828879, + 21888242871839275222246405745257275088548364400416034343698203913551264921839, + 21888242871839275222246405745257275088548364400416034343698203685926425814864, + 481069629810125, + 468718432584157, + 278293530671444, + 21888242871839275222246405745257275088548364400416034343698203680833864350913, + 50693741865393, + 21888242871839275222246405745257275088548364400416034343698204182471427293845, + 199632150666280, + 21888242871839275222246405745257275088548364400416034343698204154899088603933, + 21888242871839275222246405745257275088548364400416034343698204033078772044992, + 21888242871839275222246405745257275088548364400416034343698204046719123467387, + 21888242871839275222246405745257275088548364400416034343698203676344983615333, + 21888242871839275222246405745257275088548364400416034343698203765618465773015, + 21888242871839275222246405745257275088548364400416034343698203699504739107494, + 25437375097028, + 21888242871839275222246405745257275088548364400416034343698203781862688054333, + 21888242871839275222246405745257275088548364400416034343698203692086247430449, + 124451698288738, + 193393989674597, + 92128447448968, + 242911333109563, + 21888242871839275222246405745257275088548364400416034343698204097232611969640, + 116347438890220, + 204966860263470, + 1343079806790, + 530031758689221, + 400492558380015, + 486176377494886, + 57957997146278, + 302661343751820, + 21888242871839275222246405745257275088548364400416034343698204099469906530468, + 536506661342894, + 326418245710367, + 21888242871839275222246405745257275088548364400416034343698203954896459016224, + 21888242871839275222246405745257275088548364400416034343698203747393161175419, + 21888242871839275222246405745257275088548364400416034343698204125523633300311, + 21888242871839275222246405745257275088548364400416034343698203954888546395411, + 21888242871839275222246405745257275088548364400416034343698204045552152991559, + 436894271146645, + 21888242871839275222246405745257275088548364400416034343698203731895343182009, + 21888242871839275222246405745257275088548364400416034343698203714665533982457, + 494510313109883, + 101225760115751, + 458901042965030, + 21888242871839275222246405745257275088548364400416034343698204037377170552824, + 474267372600728, + 21888242871839275222246405745257275088548364400416034343698204141730022047432, + 21888242871839275222246405745257275088548364400416034343698203808821452905947, + 21888242871839275222246405745257275088548364400416034343698203802035317337285, + 177433402203229, + 21888242871839275222246405745257275088548364400416034343698203693866946662257, + 21888242871839275222246405745257275088548364400416034343698204123132088141486, + 238249692725887, + 183768473461267, + 539107357338941, + 142452530709344, + 21888242871839275222246405745257275088548364400416034343698203883802412875513, + 214061648794495, + 469311916882818, + 21888242871839275222246405745257275088548364400416034343698203885155405771268, + 307967159116436, + 227077722862633, + 6160279630166, + 294392082527351, + 230008543167120, + 21888242871839275222246405745257275088548364400416034343698203807290936706507, + 21888242871839275222246405745257275088548364400416034343698203883927832436634, + 21888242871839275222246405745257275088548364400416034343698203972039153361507, + 196361629072770, + 362488359331678, + 431607822099748, + 81413642430469, + 454095472524593, + 12714903136952, + 13996966161784, + 21888242871839275222246405745257275088548364400416034343698203711158963586124, + 21888242871839275222246405745257275088548364400416034343698203940336278381295, + 21888242871839275222246405745257275088548364400416034343698203826508325569245, + 152295547426580, + 21888242871839275222246405745257275088548364400416034343698203634019880676808, + 21888242871839275222246405745257275088548364400416034343698204171485188032056, + 347767017872827, + 295031159111760, + 21888242871839275222246405745257275088548364400416034343698203761355617658213, + 472272818043328, + 21888242871839275222246405745257275088548364400416034343698204002015427816946, + 21888242871839275222246405745257275088548364400416034343698203747767374744952, + 26505848266789, + 96789171151815, + 21888242871839275222246405745257275088548364400416034343698204007320251096854, + 21888242871839275222246405745257275088548364400416034343698203838373474724950, + 100124544831134, + 337665767329288, + 21888242871839275222246405745257275088548364400416034343698204086249054706666, + 21888242871839275222246405745257275088548364400416034343698203799419670648825, + 52619906159291, + 21888242871839275222246405745257275088548364400416034343698203992365908749125, + 356506810900580, + 363364298922516, + 21888242871839275222246405745257275088548364400416034343698203641887654170119, + 409050120271752, + 79646908863806, + 253312088102353, + 77981103138435, + 344824463985465, + 21888242871839275222246405745257275088548364400416034343698203957407866067833, + 21888242871839275222246405745257275088548364400416034343698203725714796367434, + 18831389096668, + 273688345026251, + 21888242871839275222246405745257275088548364400416034343698203803250519466996, + 21888242871839275222246405745257275088548364400416034343698203682940034095939, + 21888242871839275222246405745257275088548364400416034343698204088718044183927, + 273592159670369, + 17803385368508, + 120937758783386, + 21888242871839275222246405745257275088548364400416034343698204177171534365676, + 21888242871839275222246405745257275088548364400416034343698203916151844813458, + 21888242871839275222246405745257275088548364400416034343698204110202313872132, + 21888242871839275222246405745257275088548364400416034343698203807491370786055, + 21888242871839275222246405745257275088548364400416034343698203632647540883127, + 95298072701235, + 21888242871839275222246405745257275088548364400416034343698204175433236156337, + 21888242871839275222246405745257275088548364400416034343698203962662424358054, + 509285016501806, + 21888242871839275222246405745257275088548364400416034343698204058392977700983, + 21888242871839275222246405745257275088548364400416034343698204015989294974801, + 21888242871839275222246405745257275088548364400416034343698203970954099337678, + 21888242871839275222246405745257275088548364400416034343698203752199445509367, + 360907577995278, + 21888242871839275222246405745257275088548364400416034343698204091635137199852, + 101877717323522, + 371880584669459, + 313381655817978, + 374198696950740, + 518042577894116, + 280600216504314, + 167767297925093, + 483726661933235, + 21888242871839275222246405745257275088548364400416034343698204159201871239851, + 377823952830619, + 70202641541256, + 542671434522693, + 530304024509900, + 289330103558231, + 354009635727272, + 21888242871839275222246405745257275088548364400416034343698203642939067508408, + 110038950762876, + 399023328378195, + 242140971787071, + 21888242871839275222246405745257275088548364400416034343698203669486084767478, + 540560117603982, + 21888242871839275222246405745257275088548364400416034343698203955275205368177, + 21888242871839275222246405745257275088548364400416034343698203916960051423838, + 21888242871839275222246405745257275088548364400416034343698204134223199564971, + 21888242871839275222246405745257275088548364400416034343698203628713333326259, + 21888242871839275222246405745257275088548364400416034343698203974345477486174, + 21888242871839275222246405745257275088548364400416034343698203967006331170242, + 21888242871839275222246405745257275088548364400416034343698203843434609282472, + 118880640485695, + 21888242871839275222246405745257275088548364400416034343698203702242104730425, + 21888242871839275222246405745257275088548364400416034343698203859284050757739, + 504916554944670, + 487782005184994, + 463866167348660, + 107014225118131, + 21888242871839275222246405745257275088548364400416034343698203637480490987620, + 64076811561227, + 21888242871839275222246405745257275088548364400416034343698204065699371810572, + 345404617874706, + 108418516892801, + 273723071016978, + 21888242871839275222246405745257275088548364400416034343698203882375325653441, + 481586520187010, + 21888242871839275222246405745257275088548364400416034343698203890700057188985, + 21888242871839275222246405745257275088548364400416034343698203927149227751122, + 21888242871839275222246405745257275088548364400416034343698204126009361295123, + 172175506077311, + 21888242871839275222246405745257275088548364400416034343698204125573183497341, + 21888242871839275222246405745257275088548364400416034343698204103577785694554, + 480964679952386, + 359499696768034, + 21888242871839275222246405745257275088548364400416034343698203773299748288066, + 21888242871839275222246405745257275088548364400416034343698204104101435739158, + 21888242871839275222246405745257275088548364400416034343698203800192689466264, + 189915460817992, + 274916786512087, + 77493479369901, + 4746661461838, + 21888242871839275222246405745257275088548364400416034343698203699175429256186, + 21888242871839275222246405745257275088548364400416034343698203959379779218488, + 21888242871839275222246405745257275088548364400416034343698204016020768711827, + 21888242871839275222246405745257275088548364400416034343698203795853702191115, + 21888242871839275222246405745257275088548364400416034343698203697480760642824, + 21888242871839275222246405745257275088548364400416034343698203908853849603830, + 56803691552591, + 514759309292567, + 523891535283314, + 185426098323069, + 21888242871839275222246405745257275088548364400416034343698203848591570788938, + 21888242871839275222246405745257275088548364400416034343698204180087124579502, + 200255965855264, + 544900492755834, + 21888242871839275222246405745257275088548364400416034343698204172683235924386, + 21888242871839275222246405745257275088548364400416034343698204001676872898055, + 21888242871839275222246405745257275088548364400416034343698203849192105287501, + 21888242871839275222246405745257275088548364400416034343698203754407182001722, + 394444337453163, + 21888242871839275222246405745257275088548364400416034343698203759129135095166, + 391981863822088, + 21888242871839275222246405745257275088548364400416034343698203864198737529574, + 304203416969956, + 21888242871839275222246405745257275088548364400416034343698204000835245296990, + 281700898649445, + 123709931371300, + 21888242871839275222246405745257275088548364400416034343698203976032974174329, + 174672826718335, + 21888242871839275222246405745257275088548364400416034343698204036395453305374, + 21888242871839275222246405745257275088548364400416034343698203654303067907055, + 381058457153634, + 447708559042672, + 525378570568389, + 21888242871839275222246405745257275088548364400416034343698203991491108569860, + 149809832866937, + 409420319696247, + 21888242871839275222246405745257275088548364400416034343698204185257077680119, + 21888242871839275222246405745257275088548364400416034343698203738937179926003, + 325323486966202, + 154292052637491, + 499944783172472, + 125177319946873, + 21888242871839275222246405745257275088548364400416034343698204042378686408439, + 365730521806419, + 331150194537144, + 21888242871839275222246405745257275088548364400416034343698203745763061318402, + 21888242871839275222246405745257275088548364400416034343698203727847522028246, + 21888242871839275222246405745257275088548364400416034343698204017955265559736, + 21888242871839275222246405745257275088548364400416034343698203639194060949995, + 21888242871839275222246405745257275088548364400416034343698204141845440327047, + 21888242871839275222246405745257275088548364400416034343698204093800825159038, + 73738021232563, + 183913723165727, + 21888242871839275222246405745257275088548364400416034343698204130138395979961, + 21888242871839275222246405745257275088548364400416034343698203991475861803126, + 21888242871839275222246405745257275088548364400416034343698203910613004991887, + 437340537945766, + 269205878680321, + 430881100265791, + 27403905813884, + 84056432224245, + 21888242871839275222246405745257275088548364400416034343698203663171813978053, + 21888242871839275222246405745257275088548364400416034343698204176379210671892, + 218338209999062, + 21888242871839275222246405745257275088548364400416034343698203884640987939800, + 66362953023603, + 21888242871839275222246405745257275088548364400416034343698203847875574158597, + 551231985527703, + 21888242871839275222246405745257275088548364400416034343698204073776828849359, + 259153775823259, + 275852166333354, + 21888242871839275222246405745257275088548364400416034343698203958203019007931, + 551039971019411, + 99583273905718, + 21888242871839275222246405745257275088548364400416034343698203845015658308850, + 21888242871839275222246405745257275088548364400416034343698204088679039751344, + 308755319055983, + 21888242871839275222246405745257275088548364400416034343698204145112433753514, + 482492245835054, + 21888242871839275222246405745257275088548364400416034343698203979351366373124, + 21888242871839275222246405745257275088548364400416034343698203705291851668165, + 21888242871839275222246405745257275088548364400416034343698204144900347166949, + 150798824357093, + 21888242871839275222246405745257275088548364400416034343698203766010821779477, + 521978184299677, + 21888242871839275222246405745257275088548364400416034343698203699204851773809, + 533768923913080, + 76698865997504, + 199597974047793, + 371984400169227, + 21888242871839275222246405745257275088548364400416034343698203822375464677900, + 21888242871839275222246405745257275088548364400416034343698203901503497877436, + 21888242871839275222246405745257275088548364400416034343698204177495059496592, + 21888242871839275222246405745257275088548364400416034343698203714974626913116, + 243690045086697, + 21888242871839275222246405745257275088548364400416034343698203953158270331703, + 21888242871839275222246405745257275088548364400416034343698204138359638419122, + 379830855934754, + 21888242871839275222246405745257275088548364400416034343698203792199525536405, + 34178106203450, + 21888242871839275222246405745257275088548364400416034343698203974993924564729, + 447418102648743, + 6427160679311, + 21888242871839275222246405745257275088548364400416034343698203828039483689774, + 21888242871839275222246405745257275088548364400416034343698203645881369967885, + 21888242871839275222246405745257275088548364400416034343698203948754429821457, + 21888242871839275222246405745257275088548364400416034343698203653719011381003, + 21888242871839275222246405745257275088548364400416034343698203742100099668232, + 21888242871839275222246405745257275088548364400416034343698203836635898818868, + 21888242871839275222246405745257275088548364400416034343698203650891156108413, + 110708320480285, + 444550675005829, + 440503400705463, + 21888242871839275222246405745257275088548364400416034343698204077839208176117, + 234210747220985, + 10485021799853, + 91906028662911, + 392349455663365, + 165886267313387, + 310461475050235, + 286336062977109, + 362253868488716, + 541841878276205, + 21888242871839275222246405745257275088548364400416034343698203973596041874062, + 132019033399848, + 21888242871839275222246405745257275088548364400416034343698203652343360066033, + 21888242871839275222246405745257275088548364400416034343698203645583008477157, + 21888242871839275222246405745257275088548364400416034343698203976929440707638, + 21888242871839275222246405745257275088548364400416034343698203652729963544791, + 85976017258376, + 64750795776054, + 378424153209090, + 133494433617408, + 21888242871839275222246405745257275088548364400416034343698204097594556720553, + 535042641347992, + 21888242871839275222246405745257275088548364400416034343698203730188458610285, + 21888242871839275222246405745257275088548364400416034343698203702355572410806, + 21888242871839275222246405745257275088548364400416034343698203790110321132809, + 21888242871839275222246405745257275088548364400416034343698204157813384907767, + 327123393673188, + 62052568990380, + 21888242871839275222246405745257275088548364400416034343698204123949055545395, + 355895999785855, + 21888242871839275222246405745257275088548364400416034343698203783379842340135, + 21888242871839275222246405745257275088548364400416034343698204081044566026114, + 244382504048769, + 21888242871839275222246405745257275088548364400416034343698204001362365244780, + 21888242871839275222246405745257275088548364400416034343698203662586804789052, + 21888242871839275222246405745257275088548364400416034343698204105299827492715, + 549383708924461, + 21888242871839275222246405745257275088548364400416034343698203813652802878733, + 307988776021295, + 21888242871839275222246405745257275088548364400416034343698204067546160357092, + 119582667549213, + 245357504708634, + 21888242871839275222246405745257275088548364400416034343698203671380830521967, + 385033240018977, + 21888242871839275222246405745257275088548364400416034343698203912015598837499, + 21888242871839275222246405745257275088548364400416034343698203916736303903707, + 92812039332098, + 515902975992937, + 334066689986414, + 237058214838612, + 21888242871839275222246405745257275088548364400416034343698203727680770909558, + 513850239893946, + 356192178737709, + 181433901617566, + 21888242871839275222246405745257275088548364400416034343698203784384455272439, + 21888242871839275222246405745257275088548364400416034343698203865610002498905, + 21888242871839275222246405745257275088548364400416034343698203841494233234232, + 460362969284652, + 21888242871839275222246405745257275088548364400416034343698203773198271153923, + 21888242871839275222246405745257275088548364400416034343698203767863764032366, + 21888242871839275222246405745257275088548364400416034343698204164380376685287, + 21888242871839275222246405745257275088548364400416034343698203958825879479205, + 293552001420560, + 21888242871839275222246405745257275088548364400416034343698204165642235262260, + 21888242871839275222246405745257275088548364400416034343698203694910532648304, + 21888242871839275222246405745257275088548364400416034343698204181977410250926, + 503233338567986, + 195489864402251, + 21888242871839275222246405745257275088548364400416034343698204089576084917079, + 116619571399690, + 317003353825775, + 96954740514219, + 94872624727680, + 21888242871839275222246405745257275088548364400416034343698203760174076429686, + 265921417012446, + 247851605511185, + 21888242871839275222246405745257275088548364400416034343698203729792664333152, + 21888242871839275222246405745257275088548364400416034343698203643309673818884, + 226415491881939, + 21888242871839275222246405745257275088548364400416034343698203862480900717159, + 338850360387706, + 21888242871839275222246405745257275088548364400416034343698203878071461949438, + 21888242871839275222246405745257275088548364400416034343698203850669761585004, + 40772879079708, + 21888242871839275222246405745257275088548364400416034343698203645698464281294, + 341926794636674, + 21888242871839275222246405745257275088548364400416034343698204073542796519234, + 373681426842843, + 24884605196226, + 71462913900262, + 255457427472487, + 21888242871839275222246405745257275088548364400416034343698204150174721051898, + 21888242871839275222246405745257275088548364400416034343698203823741737131054, + 318119012826544, + 21888242871839275222246405745257275088548364400416034343698203730172739410312, + 331984171911310, + 134562878732557, + 21888242871839275222246405745257275088548364400416034343698203739815781695216, + 153000349730185, + 149434454846017, + 507487500133298, + 21888242871839275222246405745257275088548364400416034343698204013880652819762, + 19171622899770, + 21888242871839275222246405745257275088548364400416034343698203854903520932467, + 317105257383775, + 21888242871839275222246405745257275088548364400416034343698204131479172922963, + 21888242871839275222246405745257275088548364400416034343698203921046768945971, + 21888242871839275222246405745257275088548364400416034343698204000744258301031, + 21888242871839275222246405745257275088548364400416034343698203714681067485173, + 555723193825861, + 21888242871839275222246405745257275088548364400416034343698203892713729178233, + 74743983170720, + 233028590372975, + 466567989638785, + 21888242871839275222246405745257275088548364400416034343698203631768616633258, + 21888242871839275222246405745257275088548364400416034343698203902132637400453, + 200803837099159, + 271336964801371, + 58932901365293, + 449613463106933, + 124455276138533, + 21888242871839275222246405745257275088548364400416034343698203791981810211307, + 21888242871839275222246405745257275088548364400416034343698203835770931176875, + 93787183573060, + 234623659771016, + 21888242871839275222246405745257275088548364400416034343698203932105622723066, + 88750292362883, + 224069622006334, + 318630836321320, + 282208078118575, + 21888242871839275222246405745257275088548364400416034343698203672445039486698, + 21888242871839275222246405745257275088548364400416034343698203993577450375207, + 21888242871839275222246405745257275088548364400416034343698203954131775003298, + 21888242871839275222246405745257275088548364400416034343698204050315198461460, + 307414180856060, + 11996429277140, + 21888242871839275222246405745257275088548364400416034343698204176965618169055, + 209024235085231, + 21888242871839275222246405745257275088548364400416034343698203740554687990745, + 21888242871839275222246405745257275088548364400416034343698204043860491001414, + 21888242871839275222246405745257275088548364400416034343698204002835655192576, + 488919622200400, + 21888242871839275222246405745257275088548364400416034343698203769727208281994, + 476481316261161, + 21888242871839275222246405745257275088548364400416034343698203897194650148902, + 426103418615326, + 21888242871839275222246405745257275088548364400416034343698203696663568633695, + 518371407573591, + 21888242871839275222246405745257275088548364400416034343698204091363106862743, + 21888242871839275222246405745257275088548364400416034343698203775553168011623, + 29886376571064, + 21888242871839275222246405745257275088548364400416034343698204160254868100657, + 21888242871839275222246405745257275088548364400416034343698203665748351027314, + 21888242871839275222246405745257275088548364400416034343698203931166717285596, + 21888242871839275222246405745257275088548364400416034343698204025535718601181, + 21888242871839275222246405745257275088548364400416034343698204153200193736088, + 460744451734216, + 360798747918275, + 517393993937796, + 21888242871839275222246405745257275088548364400416034343698203864599088429234, + 161285989889885, + 21888242871839275222246405745257275088548364400416034343698203986237427204115, + 342093288104478, + 299117542206945, + 380718666217177, + 420211452128126, + 465270834580548, + 21888242871839275222246405745257275088548364400416034343698204121398714754365, + 21888242871839275222246405745257275088548364400416034343698203871688787087280, + 21888242871839275222246405745257275088548364400416034343698203941039030008619, + 21888242871839275222246405745257275088548364400416034343698203920999622190166, + 192143853814517, + 21888242871839275222246405745257275088548364400416034343698203943085512610979, + 21888242871839275222246405745257275088548364400416034343698204143148473335216, + 399713443770886, + 21888242871839275222246405745257275088548364400416034343698203709272448937975, + 152019122881619, + 21888242871839275222246405745257275088548364400416034343698203638160561072139, + 21888242871839275222246405745257275088548364400416034343698203769150562155006, + 21888242871839275222246405745257275088548364400416034343698204000875709201126, + 21888242871839275222246405745257275088548364400416034343698203652862962012592, + 17334204092752, + 21888242871839275222246405745257275088548364400416034343698203948391265053813, + 21888242871839275222246405745257275088548364400416034343698203777592516076497, + 21888242871839275222246405745257275088548364400416034343698204132198916512419, + 240135853913704, + 552975662023771, + 366680102787667, + 3327653246256, + 21888242871839275222246405745257275088548364400416034343698203819549429686401, + 21888242871839275222246405745257275088548364400416034343698203778299510657874, + 218626932505826, + 21888242871839275222246405745257275088548364400416034343698203808403349431217, + 221694305746411, + 21888242871839275222246405745257275088548364400416034343698203945112658228588, + 317953742819909, + 21888242871839275222246405745257275088548364400416034343698203806469233008343, + 112106893981223, + 260990142909628, + 308495366525324, + 21888242871839275222246405745257275088548364400416034343698203840346976840745, + 21888242871839275222246405745257275088548364400416034343698203994550562949581, + 21888242871839275222246405745257275088548364400416034343698203709654480076227, + 236664821949375, + 21888242871839275222246405745257275088548364400416034343698203764248106909855, + 239336523111314, + 21888242871839275222246405745257275088548364400416034343698204184060818989270, + 547277501960897, + 164395770569990, + 21888242871839275222246405745257275088548364400416034343698203763858298495705, + 21888242871839275222246405745257275088548364400416034343698204095933180891201, + 88337900986935, + 21888242871839275222246405745257275088548364400416034343698203707913529395713, + 21888242871839275222246405745257275088548364400416034343698203826247588466486, + 211021423581740, + 21888242871839275222246405745257275088548364400416034343698203719104257890127, + 71504155001324, + 21888242871839275222246405745257275088548364400416034343698203947717791378090, + 21888242871839275222246405745257275088548364400416034343698203926507857301536, + 47301443626035, + 21888242871839275222246405745257275088548364400416034343698203663217118079224, + 516580242167369, + 21888242871839275222246405745257275088548364400416034343698203775067086501146, + 21888242871839275222246405745257275088548364400416034343698203981184968783610, + 180269611035425, + 21888242871839275222246405745257275088548364400416034343698203770016648604737, + 416269333975750, + 21888242871839275222246405745257275088548364400416034343698204006991553931848, + 21888242871839275222246405745257275088548364400416034343698203725000652602303, + 21888242871839275222246405745257275088548364400416034343698203942380336978741, + 21888242871839275222246405745257275088548364400416034343698204112641170722712, + 488547907560103, + 77070250082822, + 21888242871839275222246405745257275088548364400416034343698203804683045423331, + 405782927541392, + 21888242871839275222246405745257275088548364400416034343698203745390552573867, + 265046698850011, + 21888242871839275222246405745257275088548364400416034343698203958796497072619, + 21888242871839275222246405745257275088548364400416034343698204068418513835256, + 21888242871839275222246405745257275088548364400416034343698203681551338271978, + 364510368619778, + 296119246682706, + 21888242871839275222246405745257275088548364400416034343698204086266870936900, + 453437834918293, + 338745044232829, + 345372883769441, + 226746681649296, + 77143134556415, + 452831203053098, + 209932964805720, + 21888242871839275222246405745257275088548364400416034343698204076905262329924, + 534023899240777, + 24195887392567, + 119183784194897, + 558804965574941, + 366745954764741, + 21888242871839275222246405745257275088548364400416034343698203868687973893612, + 21888242871839275222246405745257275088548364400416034343698203946042329773163, + 21888242871839275222246405745257275088548364400416034343698203763951545095431, + 21888242871839275222246405745257275088548364400416034343698203881542964481384, + 21888242871839275222246405745257275088548364400416034343698204149669655804456, + 21888242871839275222246405745257275088548364400416034343698204068204386302127, + 21888242871839275222246405745257275088548364400416034343698203877573792513269, + 236228414675022, + 81319921553427, + 324173789658499, + 182758137355848, + 21888242871839275222246405745257275088548364400416034343698204024847764441601, + 146024831066018, + 405782201912178, + 483900993834433, + 21888242871839275222246405745257275088548364400416034343698203997056214215793, + 321380632384862, + 25924706638108, + 21888242871839275222246405745257275088548364400416034343698203825873822701412, + 379337301530636, + 418011244260052, + 491316784227935, + 21888242871839275222246405745257275088548364400416034343698203649926659663378, + 21888242871839275222246405745257275088548364400416034343698203756640991740414, + 21888242871839275222246405745257275088548364400416034343698203949115730381107, + 21888242871839275222246405745257275088548364400416034343698203967815370726874, + 21888242871839275222246405745257275088548364400416034343698203719585173892207, + 21888242871839275222246405745257275088548364400416034343698203716997745343102, + 21888242871839275222246405745257275088548364400416034343698203898584617118981, + 21888242871839275222246405745257275088548364400416034343698203823492912256697, + 168078404129084, + 222362837256597, + 415504453023244, + 21888242871839275222246405745257275088548364400416034343698203746385441905975, + 21888242871839275222246405745257275088548364400416034343698203671234072260980, + 23032042542280, + 290751580096003, + 27869466199894, + 21888242871839275222246405745257275088548364400416034343698203929986804106622, + 21888242871839275222246405745257275088548364400416034343698204142141201923406, + 21888242871839275222246405745257275088548364400416034343698203799510105866190, + 352352245223887, + 5123079799838, + 21888242871839275222246405745257275088548364400416034343698203854253811557074, + 21888242871839275222246405745257275088548364400416034343698203999711566802737, + 21888242871839275222246405745257275088548364400416034343698203694962990907157, + 21888242871839275222246405745257275088548364400416034343698204176758532232879, + 21888242871839275222246405745257275088548364400416034343698203706962380456499, + 184707457782494, + 319616483574288, + 21888242871839275222246405745257275088548364400416034343698204058318488924750, + 21888242871839275222246405745257275088548364400416034343698204018615093876155, + 470821150904095, + 21888242871839275222246405745257275088548364400416034343698203890242596265691, + 21888242871839275222246405745257275088548364400416034343698203770592413309548, + 21888242871839275222246405745257275088548364400416034343698204113230137245418, + 66211013185568, + 503608749503799, + 21888242871839275222246405745257275088548364400416034343698203652256300787331, + 49152012383393, + 23855578032189, + 21888242871839275222246405745257275088548364400416034343698203703974371266292, + 301909718990234, + 152211898158998, + 21888242871839275222246405745257275088548364400416034343698203696262555654239, + 73577327375681, + 21888242871839275222246405745257275088548364400416034343698203960819717237302, + 21888242871839275222246405745257275088548364400416034343698203638962032508445, + 463368652376048, + 21888242871839275222246405745257275088548364400416034343698204038243620129717, + 21888242871839275222246405745257275088548364400416034343698204060218447261642, + 21888242871839275222246405745257275088548364400416034343698203743966400793501, + 296660635783517, + 17729299196605, + 99577586953612, + 557418466026379, + 21888242871839275222246405745257275088548364400416034343698203801820202575257, + 465653692585905, + 93008283823721, + 410405775523817, + 21888242871839275222246405745257275088548364400416034343698203923266616598946, + 21888242871839275222246405745257275088548364400416034343698204100786292423055, + 153126583233008, + 447541444091096, + 466139428530483, + 21888242871839275222246405745257275088548364400416034343698204046511082716366, + 21888242871839275222246405745257275088548364400416034343698204180144583071672, + 435705874001546, + 48264319089766, + 21888242871839275222246405745257275088548364400416034343698203635376840018817, + 273868580915724, + 21888242871839275222246405745257275088548364400416034343698203867138273512474, + 21888242871839275222246405745257275088548364400416034343698203699567395550961, + 21888242871839275222246405745257275088548364400416034343698203956639442649080, + 21888242871839275222246405745257275088548364400416034343698204100035837281732, + 506158067879204, + 358552814874812, + 520047569883638, + 163311512036864, + 464087728718454, + 21888242871839275222246405745257275088548364400416034343698203805477500584505, + 299321382583303, + 336927288226759, + 21888242871839275222246405745257275088548364400416034343698203733066655064084, + 21888242871839275222246405745257275088548364400416034343698203717284544759288, + 324815464093854, + 21888242871839275222246405745257275088548364400416034343698203819557674082262, + 21888242871839275222246405745257275088548364400416034343698203913952986800280, + 216628468913161, + 21888242871839275222246405745257275088548364400416034343698203863007238042112, + 21888242871839275222246405745257275088548364400416034343698204081030079191915, + 480627903584192, + 21888242871839275222246405745257275088548364400416034343698203624095785859015, + 295494388210523, + 490534471790937, + 21888242871839275222246405745257275088548364400416034343698203722483070010115, + 145205991136803, + 21888242871839275222246405745257275088548364400416034343698204124797985794346, + 368190955048823, + 21888242871839275222246405745257275088548364400416034343698203700632943143713, + 21888242871839275222246405745257275088548364400416034343698203637123595392383, + 21888242871839275222246405745257275088548364400416034343698203813818808400141, + 21888242871839275222246405745257275088548364400416034343698203788385571879315, + 21888242871839275222246405745257275088548364400416034343698204132051398918451, + 163696815210283, + 21888242871839275222246405745257275088548364400416034343698203951805795630608, + 373745443205910, + 143297222296404, + 245951149836917, + 21888242871839275222246405745257275088548364400416034343698204072965912081063, + 21888242871839275222246405745257275088548364400416034343698204144603750451826, + 353595373222844, + 21888242871839275222246405745257275088548364400416034343698203793576050437092, + 21888242871839275222246405745257275088548364400416034343698204062356344946718, + 538378723507351, + 21888242871839275222246405745257275088548364400416034343698203993751494364075, + 21888242871839275222246405745257275088548364400416034343698204103317274379678, + 21888242871839275222246405745257275088548364400416034343698203793046777365292, + 21888242871839275222246405745257275088548364400416034343698203650798213640294, + 21888242871839275222246405745257275088548364400416034343698204139507571934777, + 511516381504024, + 274111137680419, + 318328091324753, + 21888242871839275222246405745257275088548364400416034343698203766437819387667, + 21888242871839275222246405745257275088548364400416034343698203723259919679192, + 21888242871839275222246405745257275088548364400416034343698203952951264461832, + 192799043993183, + 525747158047121, + 210994594880518, + 543328086730820, + 21888242871839275222246405745257275088548364400416034343698203951472202007375, + 21888242871839275222246405745257275088548364400416034343698204161995896507973, + 270461813873521, + 21888242871839275222246405745257275088548364400416034343698203984326971971590, + 21888242871839275222246405745257275088548364400416034343698203681358251191693, + 187099454302444, + 15528833094569, + 21888242871839275222246405745257275088548364400416034343698203778389627068890, + 232102019952156, + 21888242871839275222246405745257275088548364400416034343698203885563624602566, + 21888242871839275222246405745257275088548364400416034343698203796085655531898, + 21888242871839275222246405745257275088548364400416034343698204117583683570541, + 21888242871839275222246405745257275088548364400416034343698203701491265931209, + 505825982010574, + 445951238761492, + 129491462890648, + 21888242871839275222246405745257275088548364400416034343698203730163465632756, + 92429132198134, + 21888242871839275222246405745257275088548364400416034343698203712199263466485, + 21888242871839275222246405745257275088548364400416034343698204158436942064209, + 21888242871839275222246405745257275088548364400416034343698203876304582425729, + 294212685135813, + 21888242871839275222246405745257275088548364400416034343698203790130169585705, + 21888242871839275222246405745257275088548364400416034343698203623747439442391, + 21888242871839275222246405745257275088548364400416034343698203699372702959470, + 21888242871839275222246405745257275088548364400416034343698204135888951570685, + 53694463804105, + 21888242871839275222246405745257275088548364400416034343698204090811382270796, + 21888242871839275222246405745257275088548364400416034343698203749211174730895, + 21888242871839275222246405745257275088548364400416034343698204160390924802855, + 21888242871839275222246405745257275088548364400416034343698203828394006093308, + 21888242871839275222246405745257275088548364400416034343698203647950699049021, + 21888242871839275222246405745257275088548364400416034343698203775327717546574, + 21888242871839275222246405745257275088548364400416034343698203777201632636676, + 21888242871839275222246405745257275088548364400416034343698204171367063751671, + 360660479580842, + 396030821498863, + 21888242871839275222246405745257275088548364400416034343698203941211263993720, + 21888242871839275222246405745257275088548364400416034343698203769115795760275, + 314092784109603, + 21888242871839275222246405745257275088548364400416034343698204044462472431072, + 21888242871839275222246405745257275088548364400416034343698203720812577899589, + 527501568449221, + 385902997781174, + 381474061122690, + 21888242871839275222246405745257275088548364400416034343698203645651145240295, + 364822195705360, + 9458359081537, + 21888242871839275222246405745257275088548364400416034343698203762780944951561, + 198836100417775, + 21888242871839275222246405745257275088548364400416034343698203926399617112275, + 403730137459287, + 119197903802305, + 21888242871839275222246405745257275088548364400416034343698204140148364193615, + 21888242871839275222246405745257275088548364400416034343698204134991821605569, + 21888242871839275222246405745257275088548364400416034343698204128407428148783, + 21888242871839275222246405745257275088548364400416034343698203700478268281422, + 365691064303524, + 21888242871839275222246405745257275088548364400416034343698203796467780577833, + 21888242871839275222246405745257275088548364400416034343698204090875055131377, + 21888242871839275222246405745257275088548364400416034343698203636902191023375, + 21888242871839275222246405745257275088548364400416034343698204123758662876836, + 321107373738352, + 21888242871839275222246405745257275088548364400416034343698203939304702872555, + 474422336927239, + 21888242871839275222246405745257275088548364400416034343698203998721865363311, + 276024510962595, + 201363945731189, + 453461203994606, + 21888242871839275222246405745257275088548364400416034343698204149667364684824, + 421564510169918, + 21888242871839275222246405745257275088548364400416034343698203949139895305232, + 327055977915161, + 246828703496627, + 21888242871839275222246405745257275088548364400416034343698204078860231365493, + 4962447938225, + 21888242871839275222246405745257275088548364400416034343698203652199256328185, + 229814787192397, + 21888242871839275222246405745257275088548364400416034343698203758250836684179, + 21888242871839275222246405745257275088548364400416034343698203917204633726627, + 365689073294515, + 97533940545936, + 27907384751665, + 21888242871839275222246405745257275088548364400416034343698203876864012190662, + 21888242871839275222246405745257275088548364400416034343698204015011624941746, + 21888242871839275222246405745257275088548364400416034343698204030572588839655, + 392848217105581, + 21888242871839275222246405745257275088548364400416034343698203876902178761607, + 21888242871839275222246405745257275088548364400416034343698203979636681216614, + 453013730946119, + 21888242871839275222246405745257275088548364400416034343698203911482013971293, + 21888242871839275222246405745257275088548364400416034343698203679199598733950, + 21888242871839275222246405745257275088548364400416034343698203709567280878088, + 71669070581894, + 21888242871839275222246405745257275088548364400416034343698204002600230600090, + 70127307978918, + 21888242871839275222246405745257275088548364400416034343698203761748703531753, + 11121235967659, + 524625816626272, + 315133567672390, + 223175213868473, + 57141909562161, + 21888242871839275222246405745257275088548364400416034343698203906269841043665, + 461474066868183, + 129432912252729, + 21888242871839275222246405745257275088548364400416034343698204111834704585822, + 505277677565967, + 363221964105168, + 21888242871839275222246405745257275088548364400416034343698203694446837947695, + 490356814834404, + 21888242871839275222246405745257275088548364400416034343698203695307079061126, + 21888242871839275222246405745257275088548364400416034343698203729692057576186, + 340699021212638, + 21888242871839275222246405745257275088548364400416034343698203680985339393056, + 256180231537720, + 21888242871839275222246405745257275088548364400416034343698203917859116965247, + 21888242871839275222246405745257275088548364400416034343698203848357788230486, + 491034111008908, + 21888242871839275222246405745257275088548364400416034343698204074463801176541, + 43460713531014, + 118016379315111, + 333917877174106, + 21888242871839275222246405745257275088548364400416034343698204105164453727411, + 87896917566177, + 21888242871839275222246405745257275088548364400416034343698204141945106749061, + 247687577723555, + 21888242871839275222246405745257275088548364400416034343698203677372309430339, + 21888242871839275222246405745257275088548364400416034343698203899125578968548, + 21888242871839275222246405745257275088548364400416034343698203933471573645356, + 21888242871839275222246405745257275088548364400416034343698203751037086247393, + 196203453603151, + 103129282293675, + 21888242871839275222246405745257275088548364400416034343698204093064919528361, + 21888242871839275222246405745257275088548364400416034343698203956367794803331, + 428031302701726, + 21888242871839275222246405745257275088548364400416034343698203897820036534326, + 21888242871839275222246405745257275088548364400416034343698203834479831788221, + 453930406685677, + 21888242871839275222246405745257275088548364400416034343698203905061737527770, + 284685299070667, + 537603020297523, + 21888242871839275222246405745257275088548364400416034343698203816898750962276, + 21888242871839275222246405745257275088548364400416034343698203645585951697466, + 520553902008294, + 21888242871839275222246405745257275088548364400416034343698203995013768865349, + 559699239319587, + 411641075624793, + 149031187681393, + 21888242871839275222246405745257275088548364400416034343698203755095637963743, + 21888242871839275222246405745257275088548364400416034343698204129671898246412, + 21888242871839275222246405745257275088548364400416034343698203914955556670033, + 454396559234319, + 21888242871839275222246405745257275088548364400416034343698203995809098999181, + 21888242871839275222246405745257275088548364400416034343698203725338038607963, + 109769006812467, + 21888242871839275222246405745257275088548364400416034343698204018487106402452, + 21888242871839275222246405745257275088548364400416034343698204149614027430501, + 472102966625490, + 21888242871839275222246405745257275088548364400416034343698204180274643772197, + 501015265189885, + 395794768084842, + 21888242871839275222246405745257275088548364400416034343698203736418564839145, + 21888242871839275222246405745257275088548364400416034343698203879997514138453, + 272772543530439, + 21888242871839275222246405745257275088548364400416034343698203810501026945851, + 21888242871839275222246405745257275088548364400416034343698203912644279530039, + 21888242871839275222246405745257275088548364400416034343698203809766746374424, + 369484808658574, + 303608498882440, + 21888242871839275222246405745257275088548364400416034343698204186003585657360, + 21888242871839275222246405745257275088548364400416034343698203854782915638913, + 433079748457845, + 430566023851887, + 21888242871839275222246405745257275088548364400416034343698203713798857250957, + 108115280503061, + 21888242871839275222246405745257275088548364400416034343698203801866611518997, + 21888242871839275222246405745257275088548364400416034343698203827350772659838, + 21888242871839275222246405745257275088548364400416034343698203975720036873611, + 21888242871839275222246405745257275088548364400416034343698203807672600289588, + 21888242871839275222246405745257275088548364400416034343698203630421387835570, + 21888242871839275222246405745257275088548364400416034343698203677846385206279, + 346348117604065, + 431781191148681, + 21888242871839275222246405745257275088548364400416034343698203780917373374970, + 47438895275019, + 21888242871839275222246405745257275088548364400416034343698203721677330313877, + 269045841498305, + 21888242871839275222246405745257275088548364400416034343698203681887355717600, + 547675254789926, + 312778335347449, + 434989486631309, + 525996078186384, + 21888242871839275222246405745257275088548364400416034343698203926828174479187, + 342452108315655, + 143704719367767, + 75640645161588, + 21888242871839275222246405745257275088548364400416034343698204070326319988937, + 21888242871839275222246405745257275088548364400416034343698203854310631347496, + 511901027787763, + 186670058384148, + 112980084160866, + 13287266815449, + 21888242871839275222246405745257275088548364400416034343698203739182763383131, + 207920196001353, + 91414097465157, + 21888242871839275222246405745257275088548364400416034343698203881969511626923, + 21888242871839275222246405745257275088548364400416034343698203762676212863899, + 21888242871839275222246405745257275088548364400416034343698204054706827468990, + 83547249522242, + 130240702041283, + 420797701539309, + 161945712000203, + 21888242871839275222246405745257275088548364400416034343698203817520416086823, + 206129572186354, + 493284412095420, + 171865236308625, + 155991209280785, + 21888242871839275222246405745257275088548364400416034343698204037332281372688, + 21888242871839275222246405745257275088548364400416034343698203836053885942826, + 96897772597545, + 21888242871839275222246405745257275088548364400416034343698203726482882713307, + 363129403587497, + 21888242871839275222246405745257275088548364400416034343698204119481167771655, + 40202751874827, + 76573340120668, + 21888242871839275222246405745257275088548364400416034343698204180436435785712, + 21888242871839275222246405745257275088548364400416034343698203924150309500344, + 21888242871839275222246405745257275088548364400416034343698204098637617507567, + 21888242871839275222246405745257275088548364400416034343698203805878328369968, + 21888242871839275222246405745257275088548364400416034343698204065377554284392, + 21888242871839275222246405745257275088548364400416034343698203909178717517947, + 21888242871839275222246405745257275088548364400416034343698204007218421800165, + 21888242871839275222246405745257275088548364400416034343698203714318151359814, + 78322515519086, + 261227308876385, + 21888242871839275222246405745257275088548364400416034343698203988548627363663, + 21888242871839275222246405745257275088548364400416034343698204034922788813182, + 21888242871839275222246405745257275088548364400416034343698203956974449392901, + 21888242871839275222246405745257275088548364400416034343698204169775396465981, + 21888242871839275222246405745257275088548364400416034343698203855051874800111, + 33898554245271, + 21888242871839275222246405745257275088548364400416034343698204109754187576291, + 256960004391305, + 82024199387268, + 86696768912328, + 21888242871839275222246405745257275088548364400416034343698203985743862631301, + 297223731033688, + 287993912552596, + 21888242871839275222246405745257275088548364400416034343698203725419586544471, + 317823639948455, + 60543865335792, + 21888242871839275222246405745257275088548364400416034343698204023883587971453, + 21888242871839275222246405745257275088548364400416034343698204148898392056250, + 466681001600566, + 21888242871839275222246405745257275088548364400416034343698203724953402639310, + 21888242871839275222246405745257275088548364400416034343698203852957210370674, + 21888242871839275222246405745257275088548364400416034343698204088376697640734, + 21888242871839275222246405745257275088548364400416034343698204036941611194876, + 230141292472582, + 21888242871839275222246405745257275088548364400416034343698204176946099897268, + 189515964385649, + 528467216940535, + 378269388815266, + 318113075757316, + 307315414018270, + 135226444923231, + 214844617036641, + 29298826374430, + 292302310017776, + 21888242871839275222246405745257275088548364400416034343698204112283033984771, + 21888242871839275222246405745257275088548364400416034343698203898748908528182, + 30694169901311, + 528906225011900, + 149854486636951, + 475924050125002, + 21888242871839275222246405745257275088548364400416034343698203748616616431601, + 488134457432642, + 349728304627876, + 401035724011646, + 21888242871839275222246405745257275088548364400416034343698203840967184444453, + 77610186415890, + 308169398313451, + 21888242871839275222246405745257275088548364400416034343698203976210389563620, + 21888242871839275222246405745257275088548364400416034343698204115882649015878, + 305832648301395, + 21888242871839275222246405745257275088548364400416034343698203998152353749890, + 354403917473750, + 127762242118268, + 21888242871839275222246405745257275088548364400416034343698203759815748700272, + 21888242871839275222246405745257275088548364400416034343698203862211986408724, + 307877258764113, + 21888242871839275222246405745257275088548364400416034343698203876953460723844, + 21888242871839275222246405745257275088548364400416034343698203655117811301973, + 549655802820095, + 21888242871839275222246405745257275088548364400416034343698203883037458306277, + 121982553961792, + 21888242871839275222246405745257275088548364400416034343698203821780262299389, + 24658591923242, + 21888242871839275222246405745257275088548364400416034343698203685810469839215, + 322125325085270, + 134283010524626, + 21888242871839275222246405745257275088548364400416034343698203851015741912738, + 229685846687194, + 21888242871839275222246405745257275088548364400416034343698203763529323201892, + 18610686640023, + 186304205792131, + 368788594534537, + 286824207393632, + 21888242871839275222246405745257275088548364400416034343698203770594569223458, + 21888242871839275222246405745257275088548364400416034343698203779903015304113, + 170109186800712, + 21888242871839275222246405745257275088548364400416034343698203902275322568115, + 21888242871839275222246405745257275088548364400416034343698203696859913496289, + 323417814354888, + 454533107060024, + 488620776371530, + 86022472822960, + 21888242871839275222246405745257275088548364400416034343698203992477638560806, + 141934514528278, + 345139422917044, + 16720532996926, + 21888242871839275222246405745257275088548364400416034343698204058264903488037, + 21888242871839275222246405745257275088548364400416034343698203955100713859983, + 21888242871839275222246405745257275088548364400416034343698204037088142723112, + 134592224882582, + 21888242871839275222246405745257275088548364400416034343698204099615116609148, + 499928831358102, + 362634309962656, + 21888242871839275222246405745257275088548364400416034343698203831031312728186, + 386378546892774, + 21888242871839275222246405745257275088548364400416034343698203919511938252116, + 129911736792510, + 361671540504814, + 90908356766861, + 21888242871839275222246405745257275088548364400416034343698203677730367705582, + 21888242871839275222246405745257275088548364400416034343698203916850616654672, + 392045049847605, + 21888242871839275222246405745257275088548364400416034343698203852859918232131, + 21888242871839275222246405745257275088548364400416034343698203697534404932562, + 173646216977227, + 21888242871839275222246405745257275088548364400416034343698204003018872575739, + 542775152335514, + 21888242871839275222246405745257275088548364400416034343698204042770935616242, + 144777722511507, + 21888242871839275222246405745257275088548364400416034343698203730784848848575, + 53609963821428, + 351440416135449, + 21888242871839275222246405745257275088548364400416034343698203867751771280076, + 21888242871839275222246405745257275088548364400416034343698203780734244274713, + 21888242871839275222246405745257275088548364400416034343698204046113657860774, + 114650844684946, + 390918057866276, + 443961319265642, + 21888242871839275222246405745257275088548364400416034343698203852806844713368, + 425588686227633, + 505165265989091, + 500967071629242, + 21888242871839275222246405745257275088548364400416034343698204018464660415606, + 286179822960373, + 21888242871839275222246405745257275088548364400416034343698203984586302814793, + 21888242871839275222246405745257275088548364400416034343698203795810920211392, + 186437905925694, + 21888242871839275222246405745257275088548364400416034343698203902707350099114, + 195874748147695, + 21888242871839275222246405745257275088548364400416034343698203663837672830485, + 21888242871839275222246405745257275088548364400416034343698203810758312547669, + 21888242871839275222246405745257275088548364400416034343698203695350633949876, + 21888242871839275222246405745257275088548364400416034343698204149635045277885, + 21888242871839275222246405745257275088548364400416034343698203936694426610916, + 21888242871839275222246405745257275088548364400416034343698204097494736783575, + 21888242871839275222246405745257275088548364400416034343698203975181581760451, + 361152499730949, + 21888242871839275222246405745257275088548364400416034343698203979004372495371, + 415936158389495, + 157822425404506, + 7512258961367, + 501686638943112, + 85604981646990, + 395190390910398, + 21888242871839275222246405745257275088548364400416034343698203887465630313980, + 363786411207049, + 246676912019126, + 247669272717069, + 41770339861266, + 38117098816866, + 21888242871839275222246405745257275088548364400416034343698204133597757845329, + 412612377629540, + 331145189604747, + 21888242871839275222246405745257275088548364400416034343698204096711799811656, + 21888242871839275222246405745257275088548364400416034343698203981896771005371, + 21888242871839275222246405745257275088548364400416034343698203856252196550622, + 21888242871839275222246405745257275088548364400416034343698204163821268837724, + 21888242871839275222246405745257275088548364400416034343698203865106509668446, + 21888242871839275222246405745257275088548364400416034343698204124748721142429, + 521100120059896, + 166160438691078, + 521752800971065, + 93700872006094, + 21888242871839275222246405745257275088548364400416034343698203672787494828051, + 188633605582287, + 497708712069334, + 113626268750179, + 325284977065057, + 493989702974562, + 21888242871839275222246405745257275088548364400416034343698203705865236283551, + 456378997890289, + 21888242871839275222246405745257275088548364400416034343698204068733390903059, + 21888242871839275222246405745257275088548364400416034343698203890116422399771, + 21888242871839275222246405745257275088548364400416034343698203962126419811115, + 21888242871839275222246405745257275088548364400416034343698203924722444438510, + 21888242871839275222246405745257275088548364400416034343698203814188037438053, + 157555745371242, + 21888242871839275222246405745257275088548364400416034343698204006833017543433, + 326333977284969, + 21888242871839275222246405745257275088548364400416034343698203705737093313972, + 114843223278193, + 21888242871839275222246405745257275088548364400416034343698203989166419773698, + 21888242871839275222246405745257275088548364400416034343698203833514099456656, + 21888242871839275222246405745257275088548364400416034343698203747330336097618, + 402298468124715, + 21888242871839275222246405745257275088548364400416034343698204005949060207644, + 21888242871839275222246405745257275088548364400416034343698204096906029217803, + 192039617996033, + 21888242871839275222246405745257275088548364400416034343698204063578486083257, + 512395152888847, + 406078267725701, + 41869880883649, + 445971609013324, + 21888242871839275222246405745257275088548364400416034343698203817293545159042, + 21888242871839275222246405745257275088548364400416034343698204157840109533865, + 354870981213964, + 69799296433147, + 21888242871839275222246405745257275088548364400416034343698204065923947404100, + 500684390573040, + 529078973094189, + 404039851095613, + 178756617660854, + 547715156147389, + 21888242871839275222246405745257275088548364400416034343698204158081034183502, + 21888242871839275222246405745257275088548364400416034343698203925953874488842, + 21888242871839275222246405745257275088548364400416034343698203999823928901580, + 110863345215895, + 490946270621474, + 21888242871839275222246405745257275088548364400416034343698203992819897190082, + 39484404965871, + 492804604330840, + 390697408564594, + 21888242871839275222246405745257275088548364400416034343698204053938003451910, + 353735310887684, + 21888242871839275222246405745257275088548364400416034343698204170677475264529, + 297984858447037, + 21888242871839275222246405745257275088548364400416034343698203800582716959775, + 21888242871839275222246405745257275088548364400416034343698203683881416025639, + 21888242871839275222246405745257275088548364400416034343698204029412943295314, + 239439867241686, + 21888242871839275222246405745257275088548364400416034343698204133886895672146, + 21888242871839275222246405745257275088548364400416034343698203673915735940946, + 21888242871839275222246405745257275088548364400416034343698204008314372150798, + 290511149207950, + 250821751757066, + 21888242871839275222246405745257275088548364400416034343698203795256682322342, + 21888242871839275222246405745257275088548364400416034343698204090803657670923, + 114303441566224, + 21888242871839275222246405745257275088548364400416034343698203895912982701959, + 21888242871839275222246405745257275088548364400416034343698203630589952770426, + 21888242871839275222246405745257275088548364400416034343698203630565285261769, + 21888242871839275222246405745257275088548364400416034343698204165915757632365, + 493788171038019, + 552565920571102, + 21888242871839275222246405745257275088548364400416034343698204096030248136058, + 240797068207542, + 490414555952726, + 21888242871839275222246405745257275088548364400416034343698204112048336032167, + 21888242871839275222246405745257275088548364400416034343698203936300989827731, + 21888242871839275222246405745257275088548364400416034343698203727914261183501, + 372909246030631, + 21888242871839275222246405745257275088548364400416034343698204125092406088882, + 370016009147235, + 64492327071886, + 362686340092391, + 539731432548157, + 344906344296365, + 21888242871839275222246405745257275088548364400416034343698203781461490560002, + 548471197152097, + 21888242871839275222246405745257275088548364400416034343698203990790869730051, + 21888242871839275222246405745257275088548364400416034343698203951064532432905, + 21888242871839275222246405745257275088548364400416034343698203973345210603375, + 224753738451364, + 194835234125680, + 21888242871839275222246405745257275088548364400416034343698203829371221523135, + 21888242871839275222246405745257275088548364400416034343698204022566945881389, + 264760519328607, + 74433484952459, + 458612456347472, + 496724696689755, + 21888242871839275222246405745257275088548364400416034343698204109279768487087, + 21888242871839275222246405745257275088548364400416034343698203821109757880969, + 419856541944215, + 467229997983907, + 76932339384666, + 441089151506465, + 255879107454541, + 21888242871839275222246405745257275088548364400416034343698203680538284874044, + 501020950343754, + 21888242871839275222246405745257275088548364400416034343698203647526228853099, + 373231298234611, + 339470200956746, + 500438756493369, + 21888242871839275222246405745257275088548364400416034343698203798912050969934, + 21888242871839275222246405745257275088548364400416034343698203707165961094932, + 21967582046427, + 427264563406847, + 519812047607115, + 475943971627151, + 21888242871839275222246405745257275088548364400416034343698203842524294590040, + 21888242871839275222246405745257275088548364400416034343698204125691732725550, + 274117010091161, + 21888242871839275222246405745257275088548364400416034343698204107629043343609, + 21888242871839275222246405745257275088548364400416034343698204078712583608131, + 21888242871839275222246405745257275088548364400416034343698204069643213872534, + 333445848564663, + 546720337287373, + 21888242871839275222246405745257275088548364400416034343698203824566387724891, + 559172445909181, + 105411288067010, + 225171225829222, + 516471845464621, + 21888242871839275222246405745257275088548364400416034343698203919938939364172, + 220187198339009, + 425965058570643, + 555301006422109, + 461162978678257, + 21888242871839275222246405745257275088548364400416034343698203970561579135299, + 25495567353404, + 428050440147908, + 21888242871839275222246405745257275088548364400416034343698203698374697076501, + 179643452196191, + 178397166713425, + 303887287364061, + 28789031678583, + 21888242871839275222246405745257275088548364400416034343698203746326809519235, + 317447631073797, + 555405564140345, + 21888242871839275222246405745257275088548364400416034343698203920583277360633, + 239681682207718, + 21888242871839275222246405745257275088548364400416034343698204139905956642962, + 39921516418010, + 21888242871839275222246405745257275088548364400416034343698203892517652925014, + 21888242871839275222246405745257275088548364400416034343698204138255395683252, + 21888242871839275222246405745257275088548364400416034343698204013090446992810, + 21888242871839275222246405745257275088548364400416034343698204142104338174484, + 21888242871839275222246405745257275088548364400416034343698203663781891922528, + 21888242871839275222246405745257275088548364400416034343698203835044903001715, + 21888242871839275222246405745257275088548364400416034343698203746066006725395, + 560098671791363, + 161079429872519, + 186963680858871, + 21888242871839275222246405745257275088548364400416034343698203720932830737266, + 21888242871839275222246405745257275088548364400416034343698203737520114714352, + 272123483510173, + 21888242871839275222246405745257275088548364400416034343698203891936729267213, + 29114029851593, + 193344189565444, + 21888242871839275222246405745257275088548364400416034343698203726586201047875, + 21888242871839275222246405745257275088548364400416034343698203897938133008560, + 21888242871839275222246405745257275088548364400416034343698204032930527762372, + 428668043428138, + 74150852209004, + 284935531211307, + 21888242871839275222246405745257275088548364400416034343698203915197776757243, + 171165916599783, + 542264147677423, + 144171786663787, + 304477681589397, + 21888242871839275222246405745257275088548364400416034343698203643773924936268, + 461838122340690, + 21888242871839275222246405745257275088548364400416034343698204162336783358851, + 21888242871839275222246405745257275088548364400416034343698203636501487875529, + 21888242871839275222246405745257275088548364400416034343698204144744175111202, + 21888242871839275222246405745257275088548364400416034343698203749018865464222, + 147924780363390, + 376380797264313, + 21888242871839275222246405745257275088548364400416034343698203822401926501364, + 21888242871839275222246405745257275088548364400416034343698203750935409201577, + 21888242871839275222246405745257275088548364400416034343698203982954718532940, + 21888242871839275222246405745257275088548364400416034343698204108197107936586, + 433794615972950, + 21888242871839275222246405745257275088548364400416034343698204055088283302618, + 21888242871839275222246405745257275088548364400416034343698204094779985074178, + 135620515377513, + 443962160445692, + 101027733142682, + 21888242871839275222246405745257275088548364400416034343698203948416365261393, + 21888242871839275222246405745257275088548364400416034343698203630843627990097, + 222121491629512, + 530258791480934, + 492650201093553, + 21888242871839275222246405745257275088548364400416034343698204128706072199093, + 217028246408469, + 21888242871839275222246405745257275088548364400416034343698203653692906064337, + 451170608970387, + 114927169742120, + 21888242871839275222246405745257275088548364400416034343698204103741603941811, + 21888242871839275222246405745257275088548364400416034343698204185368928506458, + 21888242871839275222246405745257275088548364400416034343698203655144451638481, + 224852238926999, + 21888242871839275222246405745257275088548364400416034343698204113824103112424, + 516654453454191, + 70829421338895, + 21888242871839275222246405745257275088548364400416034343698203847742612202777, + 21888242871839275222246405745257275088548364400416034343698203732073723759407, + 21888242871839275222246405745257275088548364400416034343698204169220913470555, + 493846919932503, + 76349937274807, + 445057646455201, + 179447959010797, + 21888242871839275222246405745257275088548364400416034343698203683336530761247, + 21888242871839275222246405745257275088548364400416034343698204024827365285307, + 21888242871839275222246405745257275088548364400416034343698203790369752987683, + 205324509123551, + 21888242871839275222246405745257275088548364400416034343698204047256447970840, + 235317327662721, + 21888242871839275222246405745257275088548364400416034343698203868670929872771, + 328859518336, + 21888242871839275222246405745257275088548364400416034343698203701992643568469, + 360631319277868, + 21888242871839275222246405745257275088548364400416034343698203964655468996098, + 21888242871839275222246405745257275088548364400416034343698203778853220113513, + 21888242871839275222246405745257275088548364400416034343698203749576866272575, + 21888242871839275222246405745257275088548364400416034343698204107073857466713, + 21888242871839275222246405745257275088548364400416034343698203659681047229946, + 500516341884642, + 21888242871839275222246405745257275088548364400416034343698204164373722730739, + 506492559807356, + 513845414905656, + 49881753489991, + 21888242871839275222246405745257275088548364400416034343698204074672513434695, + 324310242848154, + 21888242871839275222246405745257275088548364400416034343698203681372239586109, + 263124455062128, + 433102820171481, + 222336319803046, + 494126973121902, + 21888242871839275222246405745257275088548364400416034343698204025913087866725, + 418944724598938, + 530383993101014, + 21888242871839275222246405745257275088548364400416034343698203831093543749382, + 284371075995775, + 336755172590305, + 159341020255943, + 21888242871839275222246405745257275088548364400416034343698204056146518308446, + 169540189189583, + 21888242871839275222246405745257275088548364400416034343698203669098310958317, + 21888242871839275222246405745257275088548364400416034343698204148683470629889, + 154478772582439, + 61924386662855, + 21888242871839275222246405745257275088548364400416034343698203657618701906270, + 21888242871839275222246405745257275088548364400416034343698203784509640610383, + 21888242871839275222246405745257275088548364400416034343698203910885206993580, + 460052240942530, + 487220094928042, + 442892038462989, + 21888242871839275222246405745257275088548364400416034343698203932665089375814, + 169139059378106, + 21888242871839275222246405745257275088548364400416034343698203704570514442258, + 21888242871839275222246405745257275088548364400416034343698203864091928779567, + 21888242871839275222246405745257275088548364400416034343698204038951507004582, + 21888242871839275222246405745257275088548364400416034343698204132441266214091, + 21888242871839275222246405745257275088548364400416034343698203924253909214690, + 21888242871839275222246405745257275088548364400416034343698203665736146253637, + 21888242871839275222246405745257275088548364400416034343698203764106656556989, + 232726308341401, + 21888242871839275222246405745257275088548364400416034343698203704800514615760, + 21888242871839275222246405745257275088548364400416034343698203885764446576144, + 205239814276137, + 21888242871839275222246405745257275088548364400416034343698203636969736827420, + 210864802891287, + 21888242871839275222246405745257275088548364400416034343698203930514694649847, + 21888242871839275222246405745257275088548364400416034343698203714703977707887, + 533667161162257, + 469836890148005, + 470767886854146, + 61956576369741, + 21888242871839275222246405745257275088548364400416034343698204027253336977057, + 21888242871839275222246405745257275088548364400416034343698204022440667527945, + 21888242871839275222246405745257275088548364400416034343698203864409393408287, + 21888242871839275222246405745257275088548364400416034343698203667285472616691, + 324233848675996, + 21888242871839275222246405745257275088548364400416034343698203725391674951349, + 21888242871839275222246405745257275088548364400416034343698204011730783689700, + 21888242871839275222246405745257275088548364400416034343698204075035719875019, + 280561323562069, + 305943863296229, + 544146408586022, + 128131291866562, + 16910284955652, + 338142545096935, + 21888242871839275222246405745257275088548364400416034343698203890051630716104, + 21888242871839275222246405745257275088548364400416034343698203654103299847685, + 21888242871839275222246405745257275088548364400416034343698204109603753239222, + 21888242871839275222246405745257275088548364400416034343698203705193743790686, + 413584028833936, + 21888242871839275222246405745257275088548364400416034343698204024581804231757, + 21888242871839275222246405745257275088548364400416034343698204070289527529262, + 21888242871839275222246405745257275088548364400416034343698204185199512983673, + 466510912957676, + 183461151343272, + 21888242871839275222246405745257275088548364400416034343698203759548360805524, + 377045464452456, + 21888242871839275222246405745257275088548364400416034343698204113401426558002, + 456226098161365, + 21888242871839275222246405745257275088548364400416034343698204005785632179064, + 118874881203551, + 541760037337836, + 334001351679451, + 7907456724160, + 21888242871839275222246405745257275088548364400416034343698203838686263853517, + 165288872567349, + 251984512712658, + 21888242871839275222246405745257275088548364400416034343698203639330973725508, + 21888242871839275222246405745257275088548364400416034343698203711248922276412, + 21888242871839275222246405745257275088548364400416034343698203766390471501639, + 21888242871839275222246405745257275088548364400416034343698203752315551019432, + 128794794580851, + 21888242871839275222246405745257275088548364400416034343698203828162968358432, + 21888242871839275222246405745257275088548364400416034343698203988858178554885, + 489404591232293, + 118981149129040, + 297702300350883, + 21888242871839275222246405745257275088548364400416034343698203913172032273139, + 21888242871839275222246405745257275088548364400416034343698203736014827545156, + 21888242871839275222246405745257275088548364400416034343698204112811052295692, + 4569903122433, + 267214626671307, + 21888242871839275222246405745257275088548364400416034343698204167113887360219, + 21888242871839275222246405745257275088548364400416034343698203667065175859677, + 206265901731729, + 21888242871839275222246405745257275088548364400416034343698203695070528709795, + 507379122228550, + 489615062052322, + 157882937586204, + 21888242871839275222246405745257275088548364400416034343698204099321784121415, + 283666485349446, + 126757115794304, + 21888242871839275222246405745257275088548364400416034343698203794665036873696, + 21888242871839275222246405745257275088548364400416034343698203781601280660221, + 333123575226743, + 21888242871839275222246405745257275088548364400416034343698204153595743157858, + 192364036303385, + 292400416808328, + 21888242871839275222246405745257275088548364400416034343698203763819025562423, + 417664490311441, + 21888242871839275222246405745257275088548364400416034343698203889620620079449, + 21888242871839275222246405745257275088548364400416034343698203713320913113696, + 430142822342810, + 335503215368655, + 21888242871839275222246405745257275088548364400416034343698204028454863497281, + 21888242871839275222246405745257275088548364400416034343698203768519964559089, + 505034182433992, + 21888242871839275222246405745257275088548364400416034343698204114381681917171, + 379457137782675, + 482459175497615, + 96467070249143, + 326476007412636, + 21888242871839275222246405745257275088548364400416034343698204047940154239215, + 227100428956644, + 490902961617383, + 21888242871839275222246405745257275088548364400416034343698203934916342702733, + 21888242871839275222246405745257275088548364400416034343698203702028940856772, + 21888242871839275222246405745257275088548364400416034343698203943292832331808, + 21888242871839275222246405745257275088548364400416034343698204040227253528843, + 21888242871839275222246405745257275088548364400416034343698204098122297759742, + 264155286795353, + 21888242871839275222246405745257275088548364400416034343698203659917588457416, + 543781093002142, + 21888242871839275222246405745257275088548364400416034343698203692892130522184, + 45694987920794, + 72516637462034, + 150499644173567, + 21888242871839275222246405745257275088548364400416034343698203989125564386179, + 337238390531789, + 21888242871839275222246405745257275088548364400416034343698204060349960174425, + 235048553464555, + 79480330886388, + 549812268619105, + 291995300990407, + 21888242871839275222246405745257275088548364400416034343698204020879559435018, + 108250245329826, + 21888242871839275222246405745257275088548364400416034343698203823860556493395, + 91650162274252, + 21888242871839275222246405745257275088548364400416034343698203775427581773959, + 21888242871839275222246405745257275088548364400416034343698204062440468418042, + 21888242871839275222246405745257275088548364400416034343698203724242245242724, + 338280241243312, + 21888242871839275222246405745257275088548364400416034343698203810438206570812, + 21888242871839275222246405745257275088548364400416034343698203917588230998270, + 419595425287053, + 21888242871839275222246405745257275088548364400416034343698204148231381892661, + 21888242871839275222246405745257275088548364400416034343698204157358820285105, + 229463277056484, + 28880291987927, + 199734455624550, + 21888242871839275222246405745257275088548364400416034343698203828776337171960, + 179615073888304, + 21888242871839275222246405745257275088548364400416034343698204122538947867572, + 21888242871839275222246405745257275088548364400416034343698203745522837681196, + 27349395570684, + 21888242871839275222246405745257275088548364400416034343698204009099664165147, + 21888242871839275222246405745257275088548364400416034343698203831856988873947, + 284709662655650, + 21888242871839275222246405745257275088548364400416034343698204083068486115884, + 382048419025027, + 550910090405537, + 21888242871839275222246405745257275088548364400416034343698203736362610940211, + 219716787560690, + 21888242871839275222246405745257275088548364400416034343698203661260771388604, + 21888242871839275222246405745257275088548364400416034343698204172025379978942, + 21888242871839275222246405745257275088548364400416034343698203922098848562611, + 21888242871839275222246405745257275088548364400416034343698203654114312318242, + 21888242871839275222246405745257275088548364400416034343698203890194236357273, + 21888242871839275222246405745257275088548364400416034343698204087718277726174, + 21888242871839275222246405745257275088548364400416034343698203691312449005538, + 21888242871839275222246405745257275088548364400416034343698203664851036704104, + 221163996733885, + 13569944618334, + 156307549055234, + 316319716709246, + 21888242871839275222246405745257275088548364400416034343698204054684001867359, + 356530163834977, + 291455941664769, + 21888242871839275222246405745257275088548364400416034343698203751471286964991, + 21888242871839275222246405745257275088548364400416034343698203914607772843330, + 366954631490939, + 21888242871839275222246405745257275088548364400416034343698204111885069571936, + 21888242871839275222246405745257275088548364400416034343698203877345447048530, + 498949884549618, + 529687408610463, + 21888242871839275222246405745257275088548364400416034343698204012603275071700, + 309692460037021, + 73793301547828, + 57792090328405, + 299707569582405, + 21888242871839275222246405745257275088548364400416034343698204064321387269710, + 116063269996081, + 437962797568010, + 21888242871839275222246405745257275088548364400416034343698204002567415830699, + 21888242871839275222246405745257275088548364400416034343698204128876194832224, + 183163277380703, + 21888242871839275222246405745257275088548364400416034343698203847765883917607, + 21888242871839275222246405745257275088548364400416034343698203849424220713559, + 21888242871839275222246405745257275088548364400416034343698204013869189476584, + 21888242871839275222246405745257275088548364400416034343698203808224369092901, + 21888242871839275222246405745257275088548364400416034343698203698576585443552, + 21888242871839275222246405745257275088548364400416034343698203783998971381239, + 21888242871839275222246405745257275088548364400416034343698203835077377605123, + 260926850993863, + 468711614206486, + 21888242871839275222246405745257275088548364400416034343698203745251110244527, + 333734476844661, + 60650632630338, + 21888242871839275222246405745257275088548364400416034343698204119005262577931, + 21888242871839275222246405745257275088548364400416034343698204168251125448418, + 21888242871839275222246405745257275088548364400416034343698204045366164708546, + 149406480925470, + 21888242871839275222246405745257275088548364400416034343698203841141436673274, + 21888242871839275222246405745257275088548364400416034343698203685056568066143, + 21888242871839275222246405745257275088548364400416034343698203825865632275741, + 21888242871839275222246405745257275088548364400416034343698204116798821978834, + 131115033015817, + 21888242871839275222246405745257275088548364400416034343698203823985149563356, + 227903198765445, + 254621627279297, + 21888242871839275222246405745257275088548364400416034343698204009581244515960, + 530905021433157, + 383342108747540, + 434893801140537, + 315229431791642, + 21888242871839275222246405745257275088548364400416034343698203694621601137726, + 316651583948261, + 310322211131192, + 21888242871839275222246405745257275088548364400416034343698204055601829472226, + 324687258168810, + 65794030437313, + 189270282518405, + 322433691517156, + 21888242871839275222246405745257275088548364400416034343698203878863836710306, + 21888242871839275222246405745257275088548364400416034343698203719887491074811, + 21888242871839275222246405745257275088548364400416034343698204116995564123542, + 21888242871839275222246405745257275088548364400416034343698204064843074770121, + 149003182888767, + 21888242871839275222246405745257275088548364400416034343698203988588593472300, + 15249232429710, + 4999297340452, + 545202145035439, + 167588242087345, + 184896514702521, + 479197615599707, + 52218664650958, + 74005857889833, + 54745048186205, + 377232047713433, + 21888242871839275222246405745257275088548364400416034343698203835187787790909, + 21888242871839275222246405745257275088548364400416034343698204018479562255860, + 21888242871839275222246405745257275088548364400416034343698204043259580034044, + 21888242871839275222246405745257275088548364400416034343698204124456938484089, + 391372457032356, + 439491442348634, + 371520762189560, + 374968181469094, + 21888242871839275222246405745257275088548364400416034343698203836742863558562, + 444388495402594, + 401595590901925, + 558319151163215, + 130520330255469, + 21888242871839275222246405745257275088548364400416034343698203832254593788068, + 158817859214297, + 21888242871839275222246405745257275088548364400416034343698203642162851638634, + 292286596035955, + 21888242871839275222246405745257275088548364400416034343698203938946264732893, + 21888242871839275222246405745257275088548364400416034343698203761882261855201, + 21888242871839275222246405745257275088548364400416034343698204178376522586204, + 424193931631570, + 526762889471778, + 21888242871839275222246405745257275088548364400416034343698203680736635994413, + 21888242871839275222246405745257275088548364400416034343698203939153027916936, + 217694136537641, + 129708967642524, + 21888242871839275222246405745257275088548364400416034343698204038293327602904, + 21888242871839275222246405745257275088548364400416034343698203821911394585951, + 560546609738278, + 21888242871839275222246405745257275088548364400416034343698203948690498595861, + 21888242871839275222246405745257275088548364400416034343698203945076364286636, + 21888242871839275222246405745257275088548364400416034343698203939537955678025, + 558943995533822, + 166268573726969, + 272984197356793, + 21888242871839275222246405745257275088548364400416034343698203937774552856229, + 192726995143533, + 386521048134574, + 419265621402209, + 21888242871839275222246405745257275088548364400416034343698203800863585712816, + 21888242871839275222246405745257275088548364400416034343698204095657893755775, + 142966224860093, + 199147677770149, + 21888242871839275222246405745257275088548364400416034343698203953636080257262, + 21888242871839275222246405745257275088548364400416034343698204011308474330508, + 21888242871839275222246405745257275088548364400416034343698204011823106277077, + 21888242871839275222246405745257275088548364400416034343698203978107839017426, + 21888242871839275222246405745257275088548364400416034343698203736261546036170, + 21888242871839275222246405745257275088548364400416034343698204003454475544452, + 21888242871839275222246405745257275088548364400416034343698204086199281479711, + 21888242871839275222246405745257275088548364400416034343698203941583442481767, + 495573895919837, + 21888242871839275222246405745257275088548364400416034343698204017214290264889, + 333559062717401, + 21888242871839275222246405745257275088548364400416034343698203867594008388654, + 356940675852667, + 395048916284611, + 333775749213493, + 21888242871839275222246405745257275088548364400416034343698203783081610447789, + 175947454993308, + 21888242871839275222246405745257275088548364400416034343698204036304130659042, + 21888242871839275222246405745257275088548364400416034343698203778041729964128, + 121573050196372, + 267384601670308, + 427061494901253, + 98155645326983, + 237493031717752, + 21888242871839275222246405745257275088548364400416034343698203636674093462114, + 21888242871839275222246405745257275088548364400416034343698203872776191171555, + 290783102687274, + 432870988923729, + 490389629491377, + 21888242871839275222246405745257275088548364400416034343698203718932893498802, + 260232368911985, + 416382706358067, + 52497498341283, + 21888242871839275222246405745257275088548364400416034343698204042110553703924, + 397954294053820, + 21888242871839275222246405745257275088548364400416034343698203880621917468593, + 279795779949333, + 21888242871839275222246405745257275088548364400416034343698203991265909680723, + 21888242871839275222246405745257275088548364400416034343698203940744593480456, + 82217631126720, + 322079336634542, + 21888242871839275222246405745257275088548364400416034343698203713824581635212, + 21888242871839275222246405745257275088548364400416034343698203943967572321518, + 21888242871839275222246405745257275088548364400416034343698203837679672567750, + 21888242871839275222246405745257275088548364400416034343698203795658297556639, + 21888242871839275222246405745257275088548364400416034343698203940346744526528, + 482333013686481, + 21888242871839275222246405745257275088548364400416034343698204074263595547048, + 192653652573746, + 380020798606077, + 4552285287430, + 21888242871839275222246405745257275088548364400416034343698204067986476520447, + 392677277940578, + 21888242871839275222246405745257275088548364400416034343698204048998044334595, + 366670067544341, + 234940815411820, + 129978298937451, + 21888242871839275222246405745257275088548364400416034343698204067198710336388, + 521497844067767, + 21888242871839275222246405745257275088548364400416034343698203923150750939511, + 227250905781688, + 21888242871839275222246405745257275088548364400416034343698203747866752366242, + 21888242871839275222246405745257275088548364400416034343698203914280749853945, + 368863106226418, + 21888242871839275222246405745257275088548364400416034343698203867817071041656, + 122956625260080, + 21888242871839275222246405745257275088548364400416034343698203814501061498887, + 21888242871839275222246405745257275088548364400416034343698203890920679238111, + 21888242871839275222246405745257275088548364400416034343698204141053369575424, + 21888242871839275222246405745257275088548364400416034343698203753655778561898, + 295997227617746, + 21888242871839275222246405745257275088548364400416034343698203928106643846953, + 442878051446453, + 21888242871839275222246405745257275088548364400416034343698203877676682562888, + 378387018867513, + 192676078078122, + 413340540745894, + 150310280746248, + 21888242871839275222246405745257275088548364400416034343698204115702253776127, + 521671808787945, + 178816122003337, + 21888242871839275222246405745257275088548364400416034343698204149143622638172, + 434813997567700, + 21888242871839275222246405745257275088548364400416034343698203911543005845043, + 21888242871839275222246405745257275088548364400416034343698203784973878657451, + 478316034430239, + 75748776324872, + 21888242871839275222246405745257275088548364400416034343698203624980669559384, + 21888242871839275222246405745257275088548364400416034343698204086725012078378, + 548523730273259, + 474363048491073, + 358537297772458, + 495668535135313, + 21888242871839275222246405745257275088548364400416034343698203985210886077229, + 369318180899375, + 21888242871839275222246405745257275088548364400416034343698203735929597748383, + 21888242871839275222246405745257275088548364400416034343698203787132601981727, + 394626231451473, + 21888242871839275222246405745257275088548364400416034343698204000921592448635, + 282317617372219, + 21888242871839275222246405745257275088548364400416034343698203910494077596285, + 56656323057643, + 21888242871839275222246405745257275088548364400416034343698204065674966533827, + 172203255956647, + 336164363307834, + 407328675953868, + 282160336056474, + 21888242871839275222246405745257275088548364400416034343698203854747627144002, + 21888242871839275222246405745257275088548364400416034343698203770800626480460, + 21888242871839275222246405745257275088548364400416034343698203770078522164798, + 21888242871839275222246405745257275088548364400416034343698203957942219950193, + 21888242871839275222246405745257275088548364400416034343698203731396595234130, + 30425629914275, + 388027946530918, + 229837627018129, + 51542763976439, + 21888242871839275222246405745257275088548364400416034343698203909150137254266, + 4730022145501, + 21888242871839275222246405745257275088548364400416034343698204081695059503855, + 21888242871839275222246405745257275088548364400416034343698203851015067300639, + 21888242871839275222246405745257275088548364400416034343698203889691927548357, + 21888242871839275222246405745257275088548364400416034343698204091394729886932, + 21888242871839275222246405745257275088548364400416034343698203981237686416024, + 492248197935758, + 151176797941299, + 21888242871839275222246405745257275088548364400416034343698204041603734045871, + 21888242871839275222246405745257275088548364400416034343698203718059830664507, + 21888242871839275222246405745257275088548364400416034343698203792224078992878, + 206057686887146, + 21888242871839275222246405745257275088548364400416034343698203823481517861591, + 21888242871839275222246405745257275088548364400416034343698204132367255406778, + 15161425086277, + 44944298692668, + 21888242871839275222246405745257275088548364400416034343698204154128788778808, + 21888242871839275222246405745257275088548364400416034343698203798381234216130, + 21888242871839275222246405745257275088548364400416034343698203700393110922511, + 479411456902531, + 21888242871839275222246405745257275088548364400416034343698203717801034817791, + 21888242871839275222246405745257275088548364400416034343698203981177809396347, + 21888242871839275222246405745257275088548364400416034343698203816353184848979, + 82564571198120, + 21888242871839275222246405745257275088548364400416034343698203855648300279040, + 21888242871839275222246405745257275088548364400416034343698204109089724125760, + 335282757634073, + 156152284738303, + 29699135226590, + 89330707452317, + 329351059497027, + 552630261734954, + 21888242871839275222246405745257275088548364400416034343698203771997413542347, + 21888242871839275222246405745257275088548364400416034343698203864519917654905, + 21888242871839275222246405745257275088548364400416034343698203752428354188397, + 309347448541561, + 21888242871839275222246405745257275088548364400416034343698203813108864498296, + 229939853086734, + 396648283205865, + 329342615377397, + 21888242871839275222246405745257275088548364400416034343698203782558415682100, + 375780076798719, + 344325798436630, + 105036131903365, + 21888242871839275222246405745257275088548364400416034343698204170359166876602, + 21888242871839275222246405745257275088548364400416034343698203734974801379602, + 367844814942345, + 21888242871839275222246405745257275088548364400416034343698203995306454513347, + 21888242871839275222246405745257275088548364400416034343698203625444879672735, + 41902387170925, + 367265589015167, + 414737563287787, + 439955012627960, + 21888242871839275222246405745257275088548364400416034343698203908945728168027, + 21888242871839275222246405745257275088548364400416034343698203897978249889265, + 448509130021515, + 21888242871839275222246405745257275088548364400416034343698203738331111600648, + 377238181989867, + 349068740609152, + 431609772892351, + 21888242871839275222246405745257275088548364400416034343698204184434358947272, + 21888242871839275222246405745257275088548364400416034343698203911155572220562, + 21888242871839275222246405745257275088548364400416034343698204144863781719586, + 520768441013651, + 21888242871839275222246405745257275088548364400416034343698203952600435053618, + 216175414078399, + 30187171873308, + 75383530195236, + 162091898920409, + 21888242871839275222246405745257275088548364400416034343698204075531070930619, + 21888242871839275222246405745257275088548364400416034343698203675809429963375, + 21888242871839275222246405745257275088548364400416034343698203951483154551120, + 21888242871839275222246405745257275088548364400416034343698203937562961373414, + 284467109537934, + 439166465053179, + 410530339143514, + 458614231514079, + 199086233121298, + 21888242871839275222246405745257275088548364400416034343698203668377358712111, + 21888242871839275222246405745257275088548364400416034343698204150149409160548, + 176747307110206, + 21888242871839275222246405745257275088548364400416034343698204181527828471859, + 19750208397176, + 485920450647, + 227071158885700, + 167336841035846, + 21888242871839275222246405745257275088548364400416034343698203779254239465868, + 21888242871839275222246405745257275088548364400416034343698203782733613542922, + 21888242871839275222246405745257275088548364400416034343698204050655995267181, + 21888242871839275222246405745257275088548364400416034343698203922042186895303, + 21888242871839275222246405745257275088548364400416034343698204153272085642790, + 21888242871839275222246405745257275088548364400416034343698204080163715592508, + 242783233690044, + 21888242871839275222246405745257275088548364400416034343698203818074366574500, + 311962541482595, + 31014761791628, + 21888242871839275222246405745257275088548364400416034343698203987056684817499, + 21888242871839275222246405745257275088548364400416034343698203863214236469409, + 21888242871839275222246405745257275088548364400416034343698204099588405701955, + 21888242871839275222246405745257275088548364400416034343698204032614382855423, + 21888242871839275222246405745257275088548364400416034343698203687107855291985, + 346915988475155, + 21888242871839275222246405745257275088548364400416034343698203961876335922281, + 69450381686337, + 21888242871839275222246405745257275088548364400416034343698203768263314127387, + 451457032704227, + 21888242871839275222246405745257275088548364400416034343698203920028865223517, + 21888242871839275222246405745257275088548364400416034343698203802506499142461, + 21888242871839275222246405745257275088548364400416034343698203769331574377157, + 97030713087007, + 21888242871839275222246405745257275088548364400416034343698204134919452220317, + 35306180853672, + 21888242871839275222246405745257275088548364400416034343698203792354256565301, + 21888242871839275222246405745257275088548364400416034343698203796484649963433, + 319244061144970, + 21888242871839275222246405745257275088548364400416034343698204149578772414960, + 21888242871839275222246405745257275088548364400416034343698203647302289836197, + 21888242871839275222246405745257275088548364400416034343698204137841104071052, + 535325005863343, + 149146182845807, + 21888242871839275222246405745257275088548364400416034343698203982600003490328, + 21888242871839275222246405745257275088548364400416034343698203644105337976000, + 21888242871839275222246405745257275088548364400416034343698204167324720772687, + 21888242871839275222246405745257275088548364400416034343698203806733636277648, + 251340004350713, + 21888242871839275222246405745257275088548364400416034343698204124518210605521, + 21888242871839275222246405745257275088548364400416034343698203861020849736495, + 21888242871839275222246405745257275088548364400416034343698203757854528650575, + 21888242871839275222246405745257275088548364400416034343698203842954137094489, + 21888242871839275222246405745257275088548364400416034343698204148768780359317, + 94485405625279, + 217265495587672, + 21888242871839275222246405745257275088548364400416034343698203882092964309942, + 150532907984678, + 21888242871839275222246405745257275088548364400416034343698203759022411493059, + 21888242871839275222246405745257275088548364400416034343698203831511037775136, + 394213293305813, + 255552560001469, + 21888242871839275222246405745257275088548364400416034343698204000364537875737, + 21888242871839275222246405745257275088548364400416034343698204073111392987811, + 156282387434793, + 412980817191206, + 21888242871839275222246405745257275088548364400416034343698204015065227095806, + 213107940369969, + 138132001345323, + 21888242871839275222246405745257275088548364400416034343698204060172308890145, + 21888242871839275222246405745257275088548364400416034343698203752970232270697, + 21888242871839275222246405745257275088548364400416034343698204160596207076209, + 298258581900316, + 21888242871839275222246405745257275088548364400416034343698203849576489116195, + 500966699225033, + 553963860129946, + 21888242871839275222246405745257275088548364400416034343698203949081523134216, + 91325301170098, + 51104702008419, + 74940241834912, + 21888242871839275222246405745257275088548364400416034343698204087437399768626, + 21888242871839275222246405745257275088548364400416034343698203932911922029973, + 197348538266537, + 518082436280255, + 21888242871839275222246405745257275088548364400416034343698203863311526915641, + 21888242871839275222246405745257275088548364400416034343698203662186781062934, + 481142680161411, + 21888242871839275222246405745257275088548364400416034343698203720221853357772, + 21888242871839275222246405745257275088548364400416034343698203920830138272812, + 21888242871839275222246405745257275088548364400416034343698204049427077773973, + 21888242871839275222246405745257275088548364400416034343698203738195791764689, + 562450566644846, + 21888242871839275222246405745257275088548364400416034343698204134898264885655, + 146685913359229, + 21888242871839275222246405745257275088548364400416034343698203863861517069882, + 81377988822028, + 149191763858834, + 554573855232299, + 158106649096371, + 21888242871839275222246405745257275088548364400416034343698204092792600696032, + 154495006441027, + 21888242871839275222246405745257275088548364400416034343698203792511583918243, + 52038389180889, + 380790117471912, + 21888242871839275222246405745257275088548364400416034343698203921466834110740, + 21888242871839275222246405745257275088548364400416034343698203716836913110276, + 21888242871839275222246405745257275088548364400416034343698204109506974042113, + 552106162173597, + 21888242871839275222246405745257275088548364400416034343698204159584296912682, + 21888242871839275222246405745257275088548364400416034343698204017068797149743, + 151228591836464, + 21888242871839275222246405745257275088548364400416034343698203703309564773160, + 445231624753903, + 519182628985248, + 21888242871839275222246405745257275088548364400416034343698203977730959426186, + 232855523581873, + 7850162510604, + 475943872625960, + 21888242871839275222246405745257275088548364400416034343698203889165678124897, + 21888242871839275222246405745257275088548364400416034343698203880119019941674, + 79279504417594, + 21888242871839275222246405745257275088548364400416034343698203788530578321354, + 292327378135277, + 190545515964518, + 178349814630083, + 21888242871839275222246405745257275088548364400416034343698203879161328370205, + 560480931288911, + 29819844984360, + 559885269267875, + 449127095531204, + 21888242871839275222246405745257275088548364400416034343698203742317525066998, + 21888242871839275222246405745257275088548364400416034343698203801256982357698, + 399468799915533, + 183257931123703, + 21888242871839275222246405745257275088548364400416034343698203892180525888291, + 21888242871839275222246405745257275088548364400416034343698203699935549667018, + 21888242871839275222246405745257275088548364400416034343698204058100294188403, + 530956582455070, + 21888242871839275222246405745257275088548364400416034343698203941944590302825, + 21888242871839275222246405745257275088548364400416034343698204156903880321393, + 21888242871839275222246405745257275088548364400416034343698203795585634063795, + 21888242871839275222246405745257275088548364400416034343698203756602969080121, + 21888242871839275222246405745257275088548364400416034343698203944344412799250, + 21888242871839275222246405745257275088548364400416034343698204066376659346002, + 21888242871839275222246405745257275088548364400416034343698203818831164598290, + 127428070024128, + 21888242871839275222246405745257275088548364400416034343698203677673054450168, + 21888242871839275222246405745257275088548364400416034343698203945428698840426, + 102958624375776, + 21888242871839275222246405745257275088548364400416034343698203813150179789825, + 21888242871839275222246405745257275088548364400416034343698203919217705720863, + 462525492983525, + 502890627031334, + 504893348693631, + 21888242871839275222246405745257275088548364400416034343698203920683193083800, + 400851943668613, + 454167651249217, + 21888242871839275222246405745257275088548364400416034343698203964363995636926, + 21888242871839275222246405745257275088548364400416034343698203697262564850660, + 21888242871839275222246405745257275088548364400416034343698204083893972673654, + 21888242871839275222246405745257275088548364400416034343698203812132946760511, + 21888242871839275222246405745257275088548364400416034343698204177129863345630, + 21888242871839275222246405745257275088548364400416034343698203755655864716943, + 21888242871839275222246405745257275088548364400416034343698203722491296630970, + 21888242871839275222246405745257275088548364400416034343698203807581784675124, + 21888242871839275222246405745257275088548364400416034343698203735487742032470, + 175529257253056, + 178624306712465, + 216885460625718, + 21888242871839275222246405745257275088548364400416034343698204158638255541910, + 70340557325164, + 485016844124719, + 21888242871839275222246405745257275088548364400416034343698204041187650082776, + 21888242871839275222246405745257275088548364400416034343698204111644804280843, + 257477628033714, + 21888242871839275222246405745257275088548364400416034343698204095347148954535, + 21888242871839275222246405745257275088548364400416034343698203930248989802301, + 367685095492075, + 368697392171291, + 453082446491267, + 21888242871839275222246405745257275088548364400416034343698204070393800889509, + 389037133684288, + 21888242871839275222246405745257275088548364400416034343698203874800610214456, + 289862425102398, + 21888242871839275222246405745257275088548364400416034343698203641436082732692, + 21888242871839275222246405745257275088548364400416034343698203670844573081627, + 21888242871839275222246405745257275088548364400416034343698204093840523553573, + 21888242871839275222246405745257275088548364400416034343698203655963815669807, + 21888242871839275222246405745257275088548364400416034343698203682062815839542, + 21888242871839275222246405745257275088548364400416034343698204032359704753089, + 21888242871839275222246405745257275088548364400416034343698203900049879485171, + 83852618214374, + 21888242871839275222246405745257275088548364400416034343698204168683493654540, + 21888242871839275222246405745257275088548364400416034343698204137502070714820, + 159389739415844, + 21888242871839275222246405745257275088548364400416034343698203991224791342607, + 238857502775625, + 21888242871839275222246405745257275088548364400416034343698203720822170204211, + 21888242871839275222246405745257275088548364400416034343698203645235197806170, + 363230139143365, + 21888242871839275222246405745257275088548364400416034343698203666221479183523, + 21888242871839275222246405745257275088548364400416034343698203914099118207261, + 21888242871839275222246405745257275088548364400416034343698203628809306428191, + 71421236285545, + 21888242871839275222246405745257275088548364400416034343698203765556770171261, + 89782372952599, + 21888242871839275222246405745257275088548364400416034343698203627377262040428, + 146079932890473, + 64549580744693, + 295654032784521, + 21888242871839275222246405745257275088548364400416034343698204034530180932059, + 21888242871839275222246405745257275088548364400416034343698204174420016459798, + 21888242871839275222246405745257275088548364400416034343698204081603652929108, + 21888242871839275222246405745257275088548364400416034343698203941573141639363, + 448921432648030, + 21888242871839275222246405745257275088548364400416034343698204129311221934428, + 64420048586577, + 14769531593245, + 21888242871839275222246405745257275088548364400416034343698203744724689197468, + 21888242871839275222246405745257275088548364400416034343698204160732175223916, + 21888242871839275222246405745257275088548364400416034343698203816287951402668, + 120977168401311, + 21888242871839275222246405745257275088548364400416034343698203755034409698489, + 21888242871839275222246405745257275088548364400416034343698203994139011330514, + 524938057475602, + 339127423454384, + 21888242871839275222246405745257275088548364400416034343698203697069115719664, + 504754026393397, + 270481955693884, + 525341242347386, + 433432413426808, + 21888242871839275222246405745257275088548364400416034343698204040364015493040, + 192571020678738, + 21888242871839275222246405745257275088548364400416034343698204143911145503303, + 330678756931772, + 21888242871839275222246405745257275088548364400416034343698203995669809735172, + 149257903171496, + 446059836640516, + 21888242871839275222246405745257275088548364400416034343698204003441006866149, + 260881877392903, + 21888242871839275222246405745257275088548364400416034343698203961344847137375, + 21888242871839275222246405745257275088548364400416034343698204144409498283964, + 21888242871839275222246405745257275088548364400416034343698203864826836788461, + 21888242871839275222246405745257275088548364400416034343698203735002591188828, + 21888242871839275222246405745257275088548364400416034343698204175045308428067, + 21888242871839275222246405745257275088548364400416034343698203874552142915947, + 539270993491335, + 21888242871839275222246405745257275088548364400416034343698203905985545033604, + 21888242871839275222246405745257275088548364400416034343698203819004463675509, + 417818027855474, + 114068358895429, + 21888242871839275222246405745257275088548364400416034343698203870049953564624, + 506615252418850, + 17661955110813, + 468994179770488, + 512630942717200, + 21888242871839275222246405745257275088548364400416034343698204021955307604799, + 553465533802379, + 97781419213646, + 66892134719640, + 21888242871839275222246405745257275088548364400416034343698204058308936968627, + 95869788908121, + 349259788707666, + 21888242871839275222246405745257275088548364400416034343698203918066224206798, + 214601571534743, + 348178886143751, + 316704530760007, + 274946325046102, + 21888242871839275222246405745257275088548364400416034343698204110306580071636, + 95284763257870, + 256095217081026, + 21888242871839275222246405745257275088548364400416034343698203709425287772248, + 1403129093480, + 338548044524191, + 174385791386970, + 398915535557679, + 21888242871839275222246405745257275088548364400416034343698203700511853642955, + 21888242871839275222246405745257275088548364400416034343698203742490553671339, + 21888242871839275222246405745257275088548364400416034343698204036658787548931, + 541618282204368, + 358346540989514, + 15173251188606, + 368335402566208, + 21888242871839275222246405745257275088548364400416034343698203949125401884599, + 5858330938719, + 219075495643687, + 265943825019211, + 21888242871839275222246405745257275088548364400416034343698203643067856501254, + 21888242871839275222246405745257275088548364400416034343698203627855389467191, + 21888242871839275222246405745257275088548364400416034343698203677495033948167, + 21888242871839275222246405745257275088548364400416034343698203785305278033290, + 225826921296967, + 70859494286484, + 21888242871839275222246405745257275088548364400416034343698203828114137439495, + 534283963718660, + 21888242871839275222246405745257275088548364400416034343698203855352201162139, + 21888242871839275222246405745257275088548364400416034343698204116082013010772, + 21888242871839275222246405745257275088548364400416034343698204003228433871454, + 21888242871839275222246405745257275088548364400416034343698204109606563026989, + 225164496621669, + 78123142825623, + 21888242871839275222246405745257275088548364400416034343698203659168581661598, + 21888242871839275222246405745257275088548364400416034343698204162650177910579, + 21888242871839275222246405745257275088548364400416034343698204051056643180692, + 181303662283955, + 21888242871839275222246405745257275088548364400416034343698203912196483251997, + 540336744723769, + 380900446075002, + 21888242871839275222246405745257275088548364400416034343698203953504933918186, + 21888242871839275222246405745257275088548364400416034343698204162294349620253, + 21888242871839275222246405745257275088548364400416034343698203821043203729191, + 27341145559211, + 240156605867457, + 21888242871839275222246405745257275088548364400416034343698203787572369240485, + 517518283617741, + 21888242871839275222246405745257275088548364400416034343698203715036560349616, + 21888242871839275222246405745257275088548364400416034343698203798819522382208, + 21888242871839275222246405745257275088548364400416034343698204091858642465648, + 21888242871839275222246405745257275088548364400416034343698204072432749757874, + 425597170148714, + 254740917662487, + 125384022874797, + 357078430572599, + 355344202174052, + 329539886185466, + 494577758003453, + 185844632844805, + 13502256879049, + 21888242871839275222246405745257275088548364400416034343698204072843201325394, + 21888242871839275222246405745257275088548364400416034343698203790809184574552, + 21888242871839275222246405745257275088548364400416034343698204017462842216155, + 420547935386516, + 175101571325068, + 153265712031710, + 204591926978000, + 257419873119052, + 486064809151018, + 21888242871839275222246405745257275088548364400416034343698204144574184587555, + 146426664639250, + 21888242871839275222246405745257275088548364400416034343698203674611246548836, + 21888242871839275222246405745257275088548364400416034343698203985518399893343, + 21888242871839275222246405745257275088548364400416034343698204168060043674796, + 21888242871839275222246405745257275088548364400416034343698203684762577251810, + 21888242871839275222246405745257275088548364400416034343698204004391930525003, + 399085876538325, + 21888242871839275222246405745257275088548364400416034343698203723522481504414, + 421784206858848, + 535288253541949, + 521270770155019, + 21888242871839275222246405745257275088548364400416034343698204039104688323044, + 21888242871839275222246405745257275088548364400416034343698204046586618272823, + 21888242871839275222246405745257275088548364400416034343698204123244766943679, + 21888242871839275222246405745257275088548364400416034343698203915437643677324, + 266686593432836, + 218858597305053, + 327887779881722, + 21888242871839275222246405745257275088548364400416034343698203994189581689316, + 361490353988641, + 21888242871839275222246405745257275088548364400416034343698203722545031931968, + 478708917748849, + 269931967008903, + 21888242871839275222246405745257275088548364400416034343698203888921221180015, + 21888242871839275222246405745257275088548364400416034343698204170048769548801, + 61531652631330, + 21888242871839275222246405745257275088548364400416034343698203837458562143541, + 21888242871839275222246405745257275088548364400416034343698203818151000439890, + 21888242871839275222246405745257275088548364400416034343698203999761373008196, + 477796616798010, + 21888242871839275222246405745257275088548364400416034343698203950800996094572, + 21888242871839275222246405745257275088548364400416034343698203857795600073548, + 144240493644583, + 21888242871839275222246405745257275088548364400416034343698203659259738529607, + 397932591150769, + 21888242871839275222246405745257275088548364400416034343698203710575308204171, + 21888242871839275222246405745257275088548364400416034343698204074971401460761, + 551457357277489, + 21888242871839275222246405745257275088548364400416034343698204021679774809938, + 21888242871839275222246405745257275088548364400416034343698204161000115845366, + 21888242871839275222246405745257275088548364400416034343698203964087274371549, + 351140461753672, + 232458924910046, + 471898448583181, + 226244998022724, + 21888242871839275222246405745257275088548364400416034343698204183365535332318, + 78490460894972, + 21888242871839275222246405745257275088548364400416034343698203675547817792403, + 21888242871839275222246405745257275088548364400416034343698204152631972347642, + 21888242871839275222246405745257275088548364400416034343698203701344941561638, + 222694321437218, + 21888242871839275222246405745257275088548364400416034343698203927859229773832, + 292242290346454, + 266893905451286, + 21888242871839275222246405745257275088548364400416034343698203818084256272343, + 21888242871839275222246405745257275088548364400416034343698204118774295944422, + 319695232724808, + 156371169199883, + 21888242871839275222246405745257275088548364400416034343698204007950606366915, + 14074694190013, + 316230241001860, + 21888242871839275222246405745257275088548364400416034343698203801774107650503, + 21888242871839275222246405745257275088548364400416034343698204142664548368551, + 21888242871839275222246405745257275088548364400416034343698204050163372656695, + 234443309615742, + 552256783109260, + 21888242871839275222246405745257275088548364400416034343698203925805521759885, + 21888242871839275222246405745257275088548364400416034343698203759415238344855, + 48148578504140, + 21888242871839275222246405745257275088548364400416034343698203766053222853149, + 21888242871839275222246405745257275088548364400416034343698203909642877763320, + 21888242871839275222246405745257275088548364400416034343698203935661346315336, + 21888242871839275222246405745257275088548364400416034343698203956410809238819, + 21888242871839275222246405745257275088548364400416034343698203915807783743617, + 21888242871839275222246405745257275088548364400416034343698203804294877167439, + 107999647255461, + 250883210496177, + 427993173707982, + 434914321178169, + 21888242871839275222246405745257275088548364400416034343698203744369026169252, + 21888242871839275222246405745257275088548364400416034343698203755400737865813, + 21888242871839275222246405745257275088548364400416034343698203907731720128087, + 59471270304527, + 21888242871839275222246405745257275088548364400416034343698203995047179492126, + 21888242871839275222246405745257275088548364400416034343698203655303528207748, + 334725625398542, + 21888242871839275222246405745257275088548364400416034343698203630568762070685, + 21888242871839275222246405745257275088548364400416034343698203950857630743897, + 351808094879117, + 282662172563539, + 21888242871839275222246405745257275088548364400416034343698203983903699257113, + 389708539208989, + 21888242871839275222246405745257275088548364400416034343698203643066310159278, + 21888242871839275222246405745257275088548364400416034343698203931081046615319, + 21888242871839275222246405745257275088548364400416034343698204007373383266209, + 246765103765078, + 416727559202858, + 255015290043630, + 523452455081614, + 21888242871839275222246405745257275088548364400416034343698203850432995828619, + 21888242871839275222246405745257275088548364400416034343698203993428185407935, + 293170801121411, + 267161668157458, + 21888242871839275222246405745257275088548364400416034343698203862324740596494, + 367845664633965, + 21888242871839275222246405745257275088548364400416034343698203935757291926772, + 21888242871839275222246405745257275088548364400416034343698203859232180359083, + 21888242871839275222246405745257275088548364400416034343698203709616553826114, + 20206953123135, + 21888242871839275222246405745257275088548364400416034343698204084147744216600, + 233233340224434, + 145932100457128, + 179578266367240, + 21888242871839275222246405745257275088548364400416034343698204080545173401353, + 21888242871839275222246405745257275088548364400416034343698204014398572555306, + 277953459473502, + 531551154745605, + 21888242871839275222246405745257275088548364400416034343698204083340834072178, + 21888242871839275222246405745257275088548364400416034343698203677685437892355, + 21888242871839275222246405745257275088548364400416034343698203887639163931629, + 21888242871839275222246405745257275088548364400416034343698203807553127713978, + 317626035809148, + 242609229304986, + 21888242871839275222246405745257275088548364400416034343698204027045921914433, + 562039519370175, + 21888242871839275222246405745257275088548364400416034343698203809610926955012, + 21888242871839275222246405745257275088548364400416034343698204151776662505350, + 21888242871839275222246405745257275088548364400416034343698203834655099385072, + 21888242871839275222246405745257275088548364400416034343698203626951033875907, + 21888242871839275222246405745257275088548364400416034343698204127119156831256, + 533047700903161, + 21888242871839275222246405745257275088548364400416034343698203999944293059318, + 333988092061104, + 312912391070901, + 161461935280908, + 21888242871839275222246405745257275088548364400416034343698204080065887136159, + 15175267918646, + 94345509879145, + 365338897357301, + 21888242871839275222246405745257275088548364400416034343698204159570270261191, + 391650391669273, + 21888242871839275222246405745257275088548364400416034343698204168642009671135, + 21888242871839275222246405745257275088548364400416034343698203796270497687360, + 388810828967479, + 21888242871839275222246405745257275088548364400416034343698203658812067371309, + 16476542480155, + 21888242871839275222246405745257275088548364400416034343698203689795267978643, + 21888242871839275222246405745257275088548364400416034343698203982821008420685, + 21888242871839275222246405745257275088548364400416034343698204131835287829561, + 252884610079326, + 21888242871839275222246405745257275088548364400416034343698203654464472981464, + 2243559939975, + 21888242871839275222246405745257275088548364400416034343698204169352791154519, + 21888242871839275222246405745257275088548364400416034343698203783130561210528, + 21888242871839275222246405745257275088548364400416034343698204012933035695604, + 505971812095102, + 253309479147101, + 21888242871839275222246405745257275088548364400416034343698203724155651703862, + 21888242871839275222246405745257275088548364400416034343698204036913812926431, + 218253657565247, + 21888242871839275222246405745257275088548364400416034343698203657235662468655, + 23408593549850, + 21888242871839275222246405745257275088548364400416034343698203727078777499406, + 294287025396655, + 21888242871839275222246405745257275088548364400416034343698203681039889352139, + 113684129895358, + 21888242871839275222246405745257275088548364400416034343698204113974829927617, + 371423479473988, + 21888242871839275222246405745257275088548364400416034343698203999349221143610, + 339543121138830, + 21888242871839275222246405745257275088548364400416034343698203819129891790806, + 21888242871839275222246405745257275088548364400416034343698203694916883807789, + 389878966077784, + 518585319624552, + 21888242871839275222246405745257275088548364400416034343698203751307584015875, + 48010381829593, + 21888242871839275222246405745257275088548364400416034343698203691908800098913, + 21888242871839275222246405745257275088548364400416034343698203752859966132002, + 21888242871839275222246405745257275088548364400416034343698203680527867425222, + 335727374245526, + 190219724273129, + 306990303290623, + 372245884319141, + 234059267145737, + 335324666482237, + 172884778192052, + 21888242871839275222246405745257275088548364400416034343698204054604069581701, + 220568904582270, + 7432417866899, + 21888242871839275222246405745257275088548364400416034343698203750414303097281, + 133018868986654, + 454102621843089, + 179745996506996, + 342667678043323, + 21888242871839275222246405745257275088548364400416034343698204119830257936008, + 21888242871839275222246405745257275088548364400416034343698203849383027438368, + 251939443814992, + 476928167166586, + 21888242871839275222246405745257275088548364400416034343698203753307347288590, + 21888242871839275222246405745257275088548364400416034343698203871672112009194, + 171724718312100, + 21888242871839275222246405745257275088548364400416034343698203973001191262309, + 417502562980675, + 21888242871839275222246405745257275088548364400416034343698204115348922486458, + 389005543367542, + 21888242871839275222246405745257275088548364400416034343698203630106159625323, + 391598133202337, + 21888242871839275222246405745257275088548364400416034343698203674714835868012, + 21888242871839275222246405745257275088548364400416034343698203637470825600438, + 21888242871839275222246405745257275088548364400416034343698203698522852851846, + 21888242871839275222246405745257275088548364400416034343698203844454603274879, + 21888242871839275222246405745257275088548364400416034343698203626241672996712, + 21888242871839275222246405745257275088548364400416034343698203669546663081177, + 21888242871839275222246405745257275088548364400416034343698203667633078404421, + 21888242871839275222246405745257275088548364400416034343698204152855259242820, + 21888242871839275222246405745257275088548364400416034343698204085074653844096, + 371305124764582, + 21888242871839275222246405745257275088548364400416034343698204057619388170935, + 111790740352053, + 33376590953185, + 21888242871839275222246405745257275088548364400416034343698204074221217544062, + 249273259197582, + 85405464811095, + 21888242871839275222246405745257275088548364400416034343698203779296092928980, + 21888242871839275222246405745257275088548364400416034343698203772278894180149, + 472623701422146, + 538012675104970, + 281627598990705, + 168138152587760, + 524668358386399, + 248849243685933, + 21888242871839275222246405745257275088548364400416034343698203970689588399316, + 453212114245927, + 21888242871839275222246405745257275088548364400416034343698203679788468536342, + 389523562286114, + 21888242871839275222246405745257275088548364400416034343698203782476505365238, + 415069701161987, + 21888242871839275222246405745257275088548364400416034343698204077928418707308, + 21888242871839275222246405745257275088548364400416034343698204152138509103828, + 21888242871839275222246405745257275088548364400416034343698203746168480468353, + 259194320921970, + 595958299700, + 21888242871839275222246405745257275088548364400416034343698203872714768852686, + 167003068305460, + 489265937021930, + 515990080098387, + 439056352847238, + 21888242871839275222246405745257275088548364400416034343698204004640760370356, + 30358092643003, + 21888242871839275222246405745257275088548364400416034343698203789712545221690, + 348394499887152, + 39020793030420, + 21888242871839275222246405745257275088548364400416034343698203749932994156721, + 21888242871839275222246405745257275088548364400416034343698203899937739245661, + 21888242871839275222246405745257275088548364400416034343698203731453159034748, + 21888242871839275222246405745257275088548364400416034343698203931445574047010, + 21888242871839275222246405745257275088548364400416034343698203754496009471767, + 61606684471909, + 381318605861798, + 370931923934391, + 21888242871839275222246405745257275088548364400416034343698203731583508522080, + 21888242871839275222246405745257275088548364400416034343698203823252714695396, + 233367687354770, + 302839933288316, + 21888242871839275222246405745257275088548364400416034343698203981560271046067, + 116271318408593, + 429150871462931, + 54124464318279, + 127728723693546, + 21888242871839275222246405745257275088548364400416034343698204003933301037346, + 21888242871839275222246405745257275088548364400416034343698203948640385047306, + 21888242871839275222246405745257275088548364400416034343698204032769966742776, + 21888242871839275222246405745257275088548364400416034343698203876309448230040, + 324036354443846, + 21888242871839275222246405745257275088548364400416034343698204026219306078814, + 21888242871839275222246405745257275088548364400416034343698203679285178051126, + 102581164180846, + 21888242871839275222246405745257275088548364400416034343698203802241026201375, + 397256404792710, + 21888242871839275222246405745257275088548364400416034343698203947821768849522, + 21888242871839275222246405745257275088548364400416034343698203726584831210223, + 21888242871839275222246405745257275088548364400416034343698203939264099035358, + 60636139246276, + 404195115843543, + 21888242871839275222246405745257275088548364400416034343698203984306770795663, + 21888242871839275222246405745257275088548364400416034343698203821468486103487, + 21888242871839275222246405745257275088548364400416034343698203791773316827793, + 416215103091829, + 21888242871839275222246405745257275088548364400416034343698203971335699393395, + 191865453435948, + 182698345399683, + 21888242871839275222246405745257275088548364400416034343698203848919313826973, + 35017026338939, + 2270004807366, + 21888242871839275222246405745257275088548364400416034343698203627861937397158, + 102354681112879, + 205283319706532, + 135940155814037, + 21888242871839275222246405745257275088548364400416034343698203636765017438402, + 179367191266189, + 202130818241231, + 21888242871839275222246405745257275088548364400416034343698204008556433235003, + 21888242871839275222246405745257275088548364400416034343698203835389491749965, + 21888242871839275222246405745257275088548364400416034343698203730953243137304, + 21888242871839275222246405745257275088548364400416034343698203635763500717551, + 227871093318957, + 21888242871839275222246405745257275088548364400416034343698203754234147772715, + 495561196383851, + 21888242871839275222246405745257275088548364400416034343698203790843381081002, + 75949786185310, + 155891821656844, + 220704982784815, + 482264417044398, + 454993957508989, + 491442902662519, + 538274780000698, + 88526474611456, + 246798640175890, + 446529572073539, + 553299985595313, + 356761070155045, + 21888242871839275222246405745257275088548364400416034343698203938454068477684, + 21888242871839275222246405745257275088548364400416034343698204036671622842425, + 21888242871839275222246405745257275088548364400416034343698203853711890378760, + 477717799558545, + 21888242871839275222246405745257275088548364400416034343698203674513804463370, + 21888242871839275222246405745257275088548364400416034343698203892404041491603, + 21888242871839275222246405745257275088548364400416034343698203887840679469641, + 321033690547596, + 21888242871839275222246405745257275088548364400416034343698204043430911012704, + 21888242871839275222246405745257275088548364400416034343698203884275146587975, + 21888242871839275222246405745257275088548364400416034343698203689830937239897, + 355916006915243, + 551994512442183, + 21888242871839275222246405745257275088548364400416034343698203990255522650248, + 21888242871839275222246405745257275088548364400416034343698203809215393849245, + 284816524148613, + 168479638018958, + 21888242871839275222246405745257275088548364400416034343698203710528123179873, + 183187924523399, + 313135661652400, + 549298637690667, + 305259261728635, + 21888242871839275222246405745257275088548364400416034343698204078553116099525, + 441065171031091, + 100137435439447, + 534121193556856, + 21888242871839275222246405745257275088548364400416034343698204108711944735649, + 508365110180314, + 35716810857650, + 60774132188740, + 52476063134399, + 177163264641804, + 21888242871839275222246405745257275088548364400416034343698203782965123777002, + 21888242871839275222246405745257275088548364400416034343698204127572083964910, + 69958475878352, + 368404000612020, + 234926211091602, + 317837466718084, + 21888242871839275222246405745257275088548364400416034343698204091954685343718, + 522168921785469, + 45746775587331, + 21888242871839275222246405745257275088548364400416034343698203867744442192870, + 128171678161263, + 70986043409526, + 229363718528186, + 311547015003821, + 21888242871839275222246405745257275088548364400416034343698203680748032917071, + 147468483788236, + 224956650131850, + 145201729788904, + 10192201642867, + 330966104794393, + 281039899651045, + 117510530209891, + 21888242871839275222246405745257275088548364400416034343698203825764689781718, + 481583436758528, + 40507477996412, + 21888242871839275222246405745257275088548364400416034343698203724778327060614, + 21888242871839275222246405745257275088548364400416034343698203665877716740876, + 21888242871839275222246405745257275088548364400416034343698203792319002617439, + 21888242871839275222246405745257275088548364400416034343698203741814050160256, + 21888242871839275222246405745257275088548364400416034343698203758601388008070, + 269953979500473, + 26554808630773, + 195516593313679, + 21888242871839275222246405745257275088548364400416034343698203972366656204529, + 189066451995333, + 131976998568478, + 100118746248108, + 21888242871839275222246405745257275088548364400416034343698203721072056603275, + 494568570024802, + 21888242871839275222246405745257275088548364400416034343698203978375606740425, + 471880000507940, + 21888242871839275222246405745257275088548364400416034343698204115484737144611, + 21888242871839275222246405745257275088548364400416034343698203928051574457723, + 290804435468984, + 123217677689025, + 457257082463454, + 21888242871839275222246405745257275088548364400416034343698204133705085612605, + 317268141136717, + 436059205088816, + 21888242871839275222246405745257275088548364400416034343698203740933550953119, + 522887430409237, + 21888242871839275222246405745257275088548364400416034343698203705189802809156, + 317580059314792, + 241775937370717, + 385938720085070, + 275567977856284, + 21888242871839275222246405745257275088548364400416034343698203785216908600572, + 21888242871839275222246405745257275088548364400416034343698204130329085234615, + 21888242871839275222246405745257275088548364400416034343698203659446850161849, + 326734375342826, + 188546999206093, + 3170255015507, + 348197051207328, + 491109722706921, + 112343958493087, + 21888242871839275222246405745257275088548364400416034343698203698027077880116, + 21888242871839275222246405745257275088548364400416034343698203924970766859952, + 21888242871839275222246405745257275088548364400416034343698203921624600774966, + 21888242871839275222246405745257275088548364400416034343698203803555808208773, + 21888242871839275222246405745257275088548364400416034343698203849195461482751, + 218596759913170, + 21888242871839275222246405745257275088548364400416034343698203750533510834915, + 85914774003541, + 21888242871839275222246405745257275088548364400416034343698204036980368105172, + 208851592134703, + 21888242871839275222246405745257275088548364400416034343698204147821200079230, + 21888242871839275222246405745257275088548364400416034343698204071573240839168, + 21888242871839275222246405745257275088548364400416034343698204129888523705464, + 306786705197661, + 21888242871839275222246405745257275088548364400416034343698203786386658552700, + 204070749888023, + 21888242871839275222246405745257275088548364400416034343698204138385324879745, + 252016099385805, + 21888242871839275222246405745257275088548364400416034343698204073585626241958, + 21888242871839275222246405745257275088548364400416034343698203790141402838356, + 320516236411969, + 21888242871839275222246405745257275088548364400416034343698204165735746869669, + 246956393251837, + 21888242871839275222246405745257275088548364400416034343698203910229000932647, + 509069702263951, + 21888242871839275222246405745257275088548364400416034343698203685673353771759, + 422203941473547, + 120526925125837, + 21888242871839275222246405745257275088548364400416034343698203709972194634456, + 21888242871839275222246405745257275088548364400416034343698203780455796051195, + 21888242871839275222246405745257275088548364400416034343698203716445210608655, + 25229478751409, + 21888242871839275222246405745257275088548364400416034343698203762753469737224, + 21888242871839275222246405745257275088548364400416034343698204145491874275520, + 21888242871839275222246405745257275088548364400416034343698204087452813582916, + 358126677568839, + 21888242871839275222246405745257275088548364400416034343698203820752297941800, + 21888242871839275222246405745257275088548364400416034343698203775950492852352, + 330528939917122, + 560241170027419, + 174827905435268, + 273390888362948, + 21888242871839275222246405745257275088548364400416034343698204004908833593125, + 21888242871839275222246405745257275088548364400416034343698203851303689161791, + 557973551718414, + 21888242871839275222246405745257275088548364400416034343698203786676084756360, + 433470991171616, + 21888242871839275222246405745257275088548364400416034343698203922217915895256, + 174794831450216, + 21888242871839275222246405745257275088548364400416034343698203985200155860743, + 44537328984373, + 169013134478613, + 21888242871839275222246405745257275088548364400416034343698204118033573938996, + 493117143476895, + 21888242871839275222246405745257275088548364400416034343698204178526358918141, + 21888242871839275222246405745257275088548364400416034343698203905321788865082, + 21888242871839275222246405745257275088548364400416034343698203697195904545445, + 21888242871839275222246405745257275088548364400416034343698204057723221613827, + 147873256011018, + 21888242871839275222246405745257275088548364400416034343698203819393715508980, + 21888242871839275222246405745257275088548364400416034343698203965087720185792, + 331267794323249, + 21888242871839275222246405745257275088548364400416034343698203720541749970309, + 109288656467838, + 431018130830547, + 79896219955432, + 442309945857122, + 204386459657463, + 508992114687251, + 21888242871839275222246405745257275088548364400416034343698203759050414274619, + 21888242871839275222246405745257275088548364400416034343698203671693841375747, + 21888242871839275222246405745257275088548364400416034343698204140580255837226, + 21888242871839275222246405745257275088548364400416034343698204108003968762602, + 434517706403530, + 348415762927668, + 110500536590396, + 345649209093601, + 115501277216790, + 21888242871839275222246405745257275088548364400416034343698203939384968300878, + 21888242871839275222246405745257275088548364400416034343698203926449628229384, + 434041348067274, + 296849309645045, + 21888242871839275222246405745257275088548364400416034343698204076740792545194, + 517397954667120, + 21888242871839275222246405745257275088548364400416034343698204139145514619392, + 21888242871839275222246405745257275088548364400416034343698203651501221005284, + 70870257259503, + 21888242871839275222246405745257275088548364400416034343698203830165279448653, + 21888242871839275222246405745257275088548364400416034343698204116300490014550, + 168265969682499, + 531788097665320, + 21888242871839275222246405745257275088548364400416034343698204036732797553764, + 199615556074781, + 21888242871839275222246405745257275088548364400416034343698203947314220316432, + 21888242871839275222246405745257275088548364400416034343698204010220867192751, + 465931051656556, + 21888242871839275222246405745257275088548364400416034343698203825537868758326, + 21888242871839275222246405745257275088548364400416034343698203863738946037647, + 473191252269275, + 21888242871839275222246405745257275088548364400416034343698203753478615032986, + 21888242871839275222246405745257275088548364400416034343698203883747507178596, + 21888242871839275222246405745257275088548364400416034343698203849280289334483, + 217495542843075, + 38376117325630, + 79196140290300, + 21888242871839275222246405745257275088548364400416034343698203930272990776613, + 21888242871839275222246405745257275088548364400416034343698203699199834141138, + 140673182993734, + 21888242871839275222246405745257275088548364400416034343698203689379512010269, + 307928273665358, + 79451108490322, + 161684351623906, + 391005188845186, + 498045180376221, + 21888242871839275222246405745257275088548364400416034343698203753420947620639, + 54066275470492, + 366407636532481, + 312530570975124, + 487114357296438, + 411141156101476, + 21888242871839275222246405745257275088548364400416034343698204132270672726012, + 276752440493560, + 21888242871839275222246405745257275088548364400416034343698204128642634884258, + 504291014196410, + 328211358502375, + 430610795937499, + 7880621782675, + 341124655975931, + 420901257796995, + 10458351029069, + 21888242871839275222246405745257275088548364400416034343698203860031871379927, + 21888242871839275222246405745257275088548364400416034343698204098453221433051, + 21888242871839275222246405745257275088548364400416034343698203811309607396878, + 473049292350653, + 26958431694419, + 555412566651471, + 377004061231991, + 21888242871839275222246405745257275088548364400416034343698204085233682819037, + 21888242871839275222246405745257275088548364400416034343698203839412701095207, + 21888242871839275222246405745257275088548364400416034343698203671375051475311, + 21888242871839275222246405745257275088548364400416034343698203750120516872669, + 21888242871839275222246405745257275088548364400416034343698204031078180297676, + 21888242871839275222246405745257275088548364400416034343698203926924642965875, + 144583994435080, + 73548377795276, + 21888242871839275222246405745257275088548364400416034343698203656193518732653, + 357944773328807, + 380433657446549, + 362224288075562, + 454177368283147, + 21888242871839275222246405745257275088548364400416034343698203850985089862472, + 520118016281983, + 429068601059086, + 310621475058887, + 21888242871839275222246405745257275088548364400416034343698203807882189714594, + 21888242871839275222246405745257275088548364400416034343698203884720020661316, + 21888242871839275222246405745257275088548364400416034343698203696813934058954, + 21888242871839275222246405745257275088548364400416034343698203838108869054226, + 21888242871839275222246405745257275088548364400416034343698203942501309251000, + 191368878047167, + 147239042477590, + 525998587258302, + 350590536596943, + 44629522368808, + 343341722675709, + 220530953260492, + 527565640044123, + 531398885448211, + 356837439736676, + 29812868230034, + 12133516085802, + 311684610487482, + 207303278297034, + 21888242871839275222246405745257275088548364400416034343698203885569795793577, + 21888242871839275222246405745257275088548364400416034343698204157401166248658, + 422150923523246, + 21888242871839275222246405745257275088548364400416034343698203679890909256540, + 482134709487244, + 21888242871839275222246405745257275088548364400416034343698203822599905648649, + 21888242871839275222246405745257275088548364400416034343698204055509208387477, + 387657099192005, + 21888242871839275222246405745257275088548364400416034343698203973893962499494, + 536376295681709, + 21888242871839275222246405745257275088548364400416034343698203966108395549154, + 86624153430013, + 21888242871839275222246405745257275088548364400416034343698203839188605746048, + 21888242871839275222246405745257275088548364400416034343698204107051344787680, + 275242546867546, + 110040047090212, + 494656423273659, + 21888242871839275222246405745257275088548364400416034343698204067911768532866, + 21888242871839275222246405745257275088548364400416034343698203850645709244785, + 51171490183198, + 21888242871839275222246405745257275088548364400416034343698203830409965332950, + 21888242871839275222246405745257275088548364400416034343698203962592437452745, + 478646648521298, + 21888242871839275222246405745257275088548364400416034343698203632655112713690, + 21888242871839275222246405745257275088548364400416034343698203931761462328880, + 104551975051774, + 21888242871839275222246405745257275088548364400416034343698203757109957830627, + 21888242871839275222246405745257275088548364400416034343698204168879501271673, + 21888242871839275222246405745257275088548364400416034343698204158605418731610, + 21888242871839275222246405745257275088548364400416034343698203688450339555607, + 276069940199371, + 21888242871839275222246405745257275088548364400416034343698203780132169289672, + 21888242871839275222246405745257275088548364400416034343698203685684213336678, + 187684114310713, + 21888242871839275222246405745257275088548364400416034343698203999648762839124, + 211032882390728, + 21888242871839275222246405745257275088548364400416034343698204124182303775575, + 21888242871839275222246405745257275088548364400416034343698204100010320703726, + 272212902955846, + 302946529296989, + 510608622303724, + 21888242871839275222246405745257275088548364400416034343698203970782880699336, + 441699469306965, + 22251740970686, + 21888242871839275222246405745257275088548364400416034343698203810904867831362, + 21888242871839275222246405745257275088548364400416034343698204186171418647411, + 21888242871839275222246405745257275088548364400416034343698203909922483981664, + 105484790562353, + 162901801630345, + 21888242871839275222246405745257275088548364400416034343698203750288681149422, + 57754499317315, + 275440424549929, + 21888242871839275222246405745257275088548364400416034343698204113529180862504, + 17722927652944, + 21888242871839275222246405745257275088548364400416034343698204107925291847590, + 250843083612476, + 522639379851203, + 21888242871839275222246405745257275088548364400416034343698204171686179576329, + 21888242871839275222246405745257275088548364400416034343698203887870388690761, + 146905532709321, + 248114366096236, + 21888242871839275222246405745257275088548364400416034343698203751617779430247, + 155361661985650, + 259035081729179, + 3657649888481, + 337221096723547, + 320011671706591, + 21888242871839275222246405745257275088548364400416034343698203936949076448435, + 21888242871839275222246405745257275088548364400416034343698204074070570421814, + 21888242871839275222246405745257275088548364400416034343698203772103688003445, + 21888242871839275222246405745257275088548364400416034343698203756236057170581, + 267256638383945, + 263606266451530, + 21888242871839275222246405745257275088548364400416034343698204022528227835575, + 253230093921498, + 21888242871839275222246405745257275088548364400416034343698203728193274568790, + 463714264523616, + 314070866530749, + 277012018678000, + 271557918620729, + 507756330618688, + 268324085233640, + 282142590830546, + 263642431092331, + 550006849205717, + 73124695755310, + 21888242871839275222246405745257275088548364400416034343698203744823135482636, + 21888242871839275222246405745257275088548364400416034343698204019579225815960, + 526556705528814, + 48737618156596, + 21888242871839275222246405745257275088548364400416034343698203666424808039036, + 389421609867077, + 215958456841122, + 21888242871839275222246405745257275088548364400416034343698203864259161486230, + 21888242871839275222246405745257275088548364400416034343698204141673042556893, + 21888242871839275222246405745257275088548364400416034343698203988645606721909, + 258770094654589, + 21888242871839275222246405745257275088548364400416034343698204060994439965371, + 307296191423437, + 21888242871839275222246405745257275088548364400416034343698203970667418710866, + 78324621782953, + 21888242871839275222246405745257275088548364400416034343698203885615414351968, + 21888242871839275222246405745257275088548364400416034343698204007218523629395, + 21888242871839275222246405745257275088548364400416034343698204181667347607435, + 21888242871839275222246405745257275088548364400416034343698204045454549879820, + 21888242871839275222246405745257275088548364400416034343698204086585017929862, + 21888242871839275222246405745257275088548364400416034343698203824151170057387, + 21888242871839275222246405745257275088548364400416034343698204053081683931090, + 21888242871839275222246405745257275088548364400416034343698203773713412720070, + 66393182053393, + 214330705759978, + 255126424972940, + 21888242871839275222246405745257275088548364400416034343698204169067842607628, + 21888242871839275222246405745257275088548364400416034343698204016966242363457, + 86099799519899, + 21888242871839275222246405745257275088548364400416034343698203940359641279339, + 21888242871839275222246405745257275088548364400416034343698203722743750652624, + 21888242871839275222246405745257275088548364400416034343698203690375923247748, + 21888242871839275222246405745257275088548364400416034343698204156653637311111, + 88417799853213, + 115277076316180, + 225092693753985, + 267668911737493, + 487866015382550, + 332479972431215, + 273472233187920, + 516831155598205, + 554044999190959, + 21888242871839275222246405745257275088548364400416034343698203968085503464045, + 124006692576390, + 21888242871839275222246405745257275088548364400416034343698203805650118982381, + 21888242871839275222246405745257275088548364400416034343698203863889676553468, + 21888242871839275222246405745257275088548364400416034343698203850730229057933, + 21888242871839275222246405745257275088548364400416034343698204038288110616975, + 873561353775, + 21888242871839275222246405745257275088548364400416034343698204139236657241319, + 157436386106635, + 47470814003779, + 21888242871839275222246405745257275088548364400416034343698203789198487120720, + 320313545637919, + 478103669690300, + 477686773626304, + 21888242871839275222246405745257275088548364400416034343698203647742246730482, + 21888242871839275222246405745257275088548364400416034343698204146404398714747, + 21888242871839275222246405745257275088548364400416034343698203933490256040483, + 537858248831324, + 130445471474418, + 314069607158436, + 21888242871839275222246405745257275088548364400416034343698203788410262712257, + 237633732460162, + 97343322830859, + 21888242871839275222246405745257275088548364400416034343698203947089977238296, + 317602555005174, + 443672719448788, + 21888242871839275222246405745257275088548364400416034343698204090694692735560, + 510119380312632, + 230715579707550, + 21888242871839275222246405745257275088548364400416034343698203653190498317930, + 21888242871839275222246405745257275088548364400416034343698203752886843383299, + 35664879208650, + 360153900533488, + 21888242871839275222246405745257275088548364400416034343698203673968432227645, + 21888242871839275222246405745257275088548364400416034343698204109274185006683, + 243165766975712, + 21888242871839275222246405745257275088548364400416034343698204022080453220796, + 21888242871839275222246405745257275088548364400416034343698203700701674197755, + 304144140842783, + 28399539432844, + 21888242871839275222246405745257275088548364400416034343698203849123560407531, + 261541373715277, + 480972733738827, + 345810849922194, + 21888242871839275222246405745257275088548364400416034343698204134033094553230, + 11489309909973, + 92564158629093, + 258958231826963, + 407406499254379, + 198891278231094, + 21888242871839275222246405745257275088548364400416034343698203933639340187123, + 21888242871839275222246405745257275088548364400416034343698203807829187573862, + 148973857320074, + 21888242871839275222246405745257275088548364400416034343698203909063746590088, + 21888242871839275222246405745257275088548364400416034343698204081250311088219, + 100500607384071, + 21888242871839275222246405745257275088548364400416034343698204027994364051868, + 480606551400626, + 533482322886629, + 21888242871839275222246405745257275088548364400416034343698204111531587018921, + 21888242871839275222246405745257275088548364400416034343698204022800507307324, + 21888242871839275222246405745257275088548364400416034343698203843586269388302, + 21888242871839275222246405745257275088548364400416034343698203880279530393282, + 481562073371145, + 417172548464152, + 113603674755838, + 21888242871839275222246405745257275088548364400416034343698203856884432923591, + 123859583724265, + 112582788481127, + 21888242871839275222246405745257275088548364400416034343698203946378355735126, + 145210467144297, + 21888242871839275222246405745257275088548364400416034343698203660586519624929, + 21888242871839275222246405745257275088548364400416034343698204063500446951230, + 21888242871839275222246405745257275088548364400416034343698203852980107864192, + 57735344950015, + 21888242871839275222246405745257275088548364400416034343698203829538301826441, + 21888242871839275222246405745257275088548364400416034343698203640708119409527, + 21888242871839275222246405745257275088548364400416034343698203662831216404004, + 163998853412582, + 293730759681290, + 21888242871839275222246405745257275088548364400416034343698203853733519939312, + 21888242871839275222246405745257275088548364400416034343698203828786214470409, + 51329063479907, + 190765619861925, + 21888242871839275222246405745257275088548364400416034343698203789338647290498, + 257301079982592, + 526771997313834, + 21888242871839275222246405745257275088548364400416034343698204052402185487908, + 21888242871839275222246405745257275088548364400416034343698203837543908363876, + 60009515576938, + 185777824903999, + 21888242871839275222246405745257275088548364400416034343698204071072032882954, + 21888242871839275222246405745257275088548364400416034343698204071536089193131, + 292104159815869, + 21888242871839275222246405745257275088548364400416034343698203820403023535148, + 21888242871839275222246405745257275088548364400416034343698203968629911737763, + 21888242871839275222246405745257275088548364400416034343698203902272383051840, + 503950554308313, + 14987786180889, + 21888242871839275222246405745257275088548364400416034343698203794513403877155, + 21888242871839275222246405745257275088548364400416034343698204124417433669806, + 21888242871839275222246405745257275088548364400416034343698203798230944109541, + 132191166050997, + 351828261609338, + 254937322139328, + 198876662868990, + 21888242871839275222246405745257275088548364400416034343698203783527306043902, + 502334784053089, + 21888242871839275222246405745257275088548364400416034343698204081859778319106, + 21888242871839275222246405745257275088548364400416034343698204074288658696392, + 21888242871839275222246405745257275088548364400416034343698203792209780106961, + 21888242871839275222246405745257275088548364400416034343698204004954067064776, + 511691107489075, + 21888242871839275222246405745257275088548364400416034343698203748172442025334, + 274083560070650, + 21888242871839275222246405745257275088548364400416034343698204023049563959548, + 21888242871839275222246405745257275088548364400416034343698203988861356769145, + 187382243719569, + 415495319553022, + 21888242871839275222246405745257275088548364400416034343698203683571957643828, + 94847937325839, + 199035047873007, + 245537716738761, + 21888242871839275222246405745257275088548364400416034343698204166905391132348, + 21888242871839275222246405745257275088548364400416034343698204093140829329773, + 21888242871839275222246405745257275088548364400416034343698203746084174568895, + 377069929071880, + 21888242871839275222246405745257275088548364400416034343698203752979245165943, + 21888242871839275222246405745257275088548364400416034343698203761978931579762, + 21888242871839275222246405745257275088548364400416034343698203821040933015721, + 21888242871839275222246405745257275088548364400416034343698203710810708750176, + 340801397639441, + 21888242871839275222246405745257275088548364400416034343698204122392732288769, + 548812805167674, + 21888242871839275222246405745257275088548364400416034343698203820407427570664, + 21888242871839275222246405745257275088548364400416034343698204066344875163970, + 21888242871839275222246405745257275088548364400416034343698204105045162504974, + 186901076632973, + 21888242871839275222246405745257275088548364400416034343698203653202812669468, + 21888242871839275222246405745257275088548364400416034343698203928165727909520, + 21888242871839275222246405745257275088548364400416034343698204012146568585569, + 21888242871839275222246405745257275088548364400416034343698203723291399457508, + 500419121386966, + 21888242871839275222246405745257275088548364400416034343698203850657769685057, + 158792712282839, + 295784968506603, + 21888242871839275222246405745257275088548364400416034343698203641370042393086, + 446118639458213, + 510987522317358, + 138087465878919, + 510463474487823, + 64911842882330, + 147357214246357, + 21888242871839275222246405745257275088548364400416034343698203685059024771873, + 376851523929060, + 341146931831508, + 21888242871839275222246405745257275088548364400416034343698204077362408180495, + 21888242871839275222246405745257275088548364400416034343698204005930761192780, + 175369968104884, + 21888242871839275222246405745257275088548364400416034343698204110497889279744, + 21888242871839275222246405745257275088548364400416034343698204060615355487760, + 21888242871839275222246405745257275088548364400416034343698203854716646497692, + 406698975363739, + 388598801712858, + 409857939729852, + 226974124945009, + 77420964137382, + 50943977587235, + 361465110389089, + 211969378669604, + 21888242871839275222246405745257275088548364400416034343698203861752275420194, + 536126641360220, + 21888242871839275222246405745257275088548364400416034343698203645825396919556, + 21888242871839275222246405745257275088548364400416034343698204116948770655451, + 512584192735222, + 186417940397350, + 21888242871839275222246405745257275088548364400416034343698203872464455746369, + 168862220808105, + 21888242871839275222246405745257275088548364400416034343698203852636070377393, + 21888242871839275222246405745257275088548364400416034343698203971281479556737, + 21888242871839275222246405745257275088548364400416034343698203979744900747331, + 212497151978970, + 399457786695372, + 53032307647575, + 21888242871839275222246405745257275088548364400416034343698204058379512046721, + 37873387984373, + 21888242871839275222246405745257275088548364400416034343698204057097008681894, + 21888242871839275222246405745257275088548364400416034343698203720403534175295, + 149119365662106, + 415833131943613, + 21888242871839275222246405745257275088548364400416034343698203678998482657039, + 440545255342126, + 290389806556511, + 21888242871839275222246405745257275088548364400416034343698203920455255334725, + 21888242871839275222246405745257275088548364400416034343698203909290346165099, + 21888242871839275222246405745257275088548364400416034343698204095940287462628, + 512579688067291, + 21888242871839275222246405745257275088548364400416034343698203931123665547621, + 21888242871839275222246405745257275088548364400416034343698204054285544211124, + 343823156897906, + 21888242871839275222246405745257275088548364400416034343698204076399691963098, + 21888242871839275222246405745257275088548364400416034343698204017344913721761, + 28072187530145, + 21888242871839275222246405745257275088548364400416034343698203896447723372195, + 449199497456819, + 21888242871839275222246405745257275088548364400416034343698203891373337966674, + 50274931287149, + 324103873202170, + 21888242871839275222246405745257275088548364400416034343698203856411051919704, + 21888242871839275222246405745257275088548364400416034343698204054036252678139, + 168301048176483, + 519983313154230, + 310476399667260, + 21888242871839275222246405745257275088548364400416034343698203781533919940889, + 21888242871839275222246405745257275088548364400416034343698204055738201998900, + 21888242871839275222246405745257275088548364400416034343698203626506085364842, + 21888242871839275222246405745257275088548364400416034343698204090931722507281, + 50992475667938, + 21888242871839275222246405745257275088548364400416034343698203744808052763146, + 93907338023355, + 479986705339107, + 476501741438630, + 21888242871839275222246405745257275088548364400416034343698203627896848821310, + 270010697652549, + 21888242871839275222246405745257275088548364400416034343698204014926564484765, + 388061108187657, + 21888242871839275222246405745257275088548364400416034343698203687496466252060, + 333024044711284, + 21888242871839275222246405745257275088548364400416034343698204039999706504218, + 495708353572589, + 206370181440039, + 363888228516691, + 21888242871839275222246405745257275088548364400416034343698204045309462631696, + 21888242871839275222246405745257275088548364400416034343698203749500103348655, + 418328501789474, + 21888242871839275222246405745257275088548364400416034343698203829040303928269, + 445780484717826, + 296561242060390, + 425871230984023, + 21888242871839275222246405745257275088548364400416034343698204067284190758555, + 21888242871839275222246405745257275088548364400416034343698203886270118908140, + 21888242871839275222246405745257275088548364400416034343698203781896235679354, + 182051403837100, + 344268795745773, + 237260320737963, + 543237284155606, + 21888242871839275222246405745257275088548364400416034343698203692387179728586, + 431287672248349, + 21888242871839275222246405745257275088548364400416034343698203865036729702015, + 21888242871839275222246405745257275088548364400416034343698203729853733740482, + 247299991437251, + 442570065248861, + 21888242871839275222246405745257275088548364400416034343698203862226404505311, + 21888242871839275222246405745257275088548364400416034343698204170698629787159, + 118470191533534, + 249477620050236, + 21888242871839275222246405745257275088548364400416034343698204026643562784233, + 21888242871839275222246405745257275088548364400416034343698204001625547186430, + 358748240422366, + 199913578032037, + 258320787425765, + 125316817046418, + 21888242871839275222246405745257275088548364400416034343698203747139758251230, + 21888242871839275222246405745257275088548364400416034343698203683942309777977, + 109539053467161, + 21888242871839275222246405745257275088548364400416034343698204044268307031525, + 21888242871839275222246405745257275088548364400416034343698203759980773193254, + 439854063995157, + 21888242871839275222246405745257275088548364400416034343698203722868591013270, + 21888242871839275222246405745257275088548364400416034343698203735460860352460, + 438737529835568, + 21888242871839275222246405745257275088548364400416034343698203958150510649067, + 21888242871839275222246405745257275088548364400416034343698204101572651991749, + 21888242871839275222246405745257275088548364400416034343698203645327730711720, + 21888242871839275222246405745257275088548364400416034343698203666894398274252, + 27221422827331, + 303584841568221, + 239842691601581, + 21888242871839275222246405745257275088548364400416034343698203821196192317980, + 21888242871839275222246405745257275088548364400416034343698203826390590490719, + 394451441705424, + 21888242871839275222246405745257275088548364400416034343698203988925141015412, + 224950404318325, + 242263055700017, + 111587915158539, + 120198155537601, + 230936288293940, + 223714912852458, + 444761129601077, + 21888242871839275222246405745257275088548364400416034343698204079035760676024, + 21888242871839275222246405745257275088548364400416034343698203738778585982603, + 8328991565662, + 38899111320900, + 21888242871839275222246405745257275088548364400416034343698203934084985998396, + 21888242871839275222246405745257275088548364400416034343698203661961076169340, + 299070343096250, + 21888242871839275222246405745257275088548364400416034343698203785254523792186, + 21888242871839275222246405745257275088548364400416034343698203774318004652915, + 306181306877035, + 21888242871839275222246405745257275088548364400416034343698204168560615156375, + 233704270778981, + 21888242871839275222246405745257275088548364400416034343698203885651201674240, + 93053185312552, + 21888242871839275222246405745257275088548364400416034343698203672512330053184, + 21888242871839275222246405745257275088548364400416034343698204180422395637190, + 517359018869868, + 480725015389922, + 21888242871839275222246405745257275088548364400416034343698204101918389850983, + 21888242871839275222246405745257275088548364400416034343698204010412187998674, + 310316729397026, + 21888242871839275222246405745257275088548364400416034343698203698231053346577, + 512667096534960, + 21888242871839275222246405745257275088548364400416034343698204045949409816329, + 503544604528162, + 447952558173959, + 274227543516642, + 502201551123238, + 21888242871839275222246405745257275088548364400416034343698203747217690081116, + 527166642495923, + 21888242871839275222246405745257275088548364400416034343698203816514092697784, + 283808409463695, + 21888242871839275222246405745257275088548364400416034343698203881683492117962, + 545295288019216, + 449318853787806, + 21888242871839275222246405745257275088548364400416034343698203945436505418298, + 120530176998866, + 552763136868185, + 21888242871839275222246405745257275088548364400416034343698204119646872386337, + 21888242871839275222246405745257275088548364400416034343698204015337947071263, + 486406708978178, + 253160111950056, + 195020276625113, + 21888242871839275222246405745257275088548364400416034343698203679353268153628, + 367153352743148, + 428000628465740, + 21888242871839275222246405745257275088548364400416034343698204128312745692480, + 423474879376823, + 211828818571987, + 21888242871839275222246405745257275088548364400416034343698203919311957424075, + 175495198404153, + 74482115935585, + 21888242871839275222246405745257275088548364400416034343698204138705298676460, + 21888242871839275222246405745257275088548364400416034343698203770570077182377, + 342879957439574, + 232405116145293, + 204063162069959, + 21888242871839275222246405745257275088548364400416034343698204040361920072331, + 60236862325774, + 146623815025365, + 21888242871839275222246405745257275088548364400416034343698203882935169686616, + 21888242871839275222246405745257275088548364400416034343698203884356297394456, + 139920258206827, + 21888242871839275222246405745257275088548364400416034343698203668198924328270, + 412512339609433, + 21888242871839275222246405745257275088548364400416034343698203761928870296828, + 21888242871839275222246405745257275088548364400416034343698203636886225147706, + 21888242871839275222246405745257275088548364400416034343698204017910255550200, + 21888242871839275222246405745257275088548364400416034343698203792291040558318, + 529790130301835, + 21888242871839275222246405745257275088548364400416034343698203941440810436519, + 21888242871839275222246405745257275088548364400416034343698203915699576629570, + 364475084364091, + 21888242871839275222246405745257275088548364400416034343698204083846191195372, + 68634046349613, + 509146229798398, + 9894284725138, + 57296676075739, + 213295612003632, + 347524527888189, + 21888242871839275222246405745257275088548364400416034343698203647802275804796, + 21888242871839275222246405745257275088548364400416034343698203932689502165782, + 21888242871839275222246405745257275088548364400416034343698203863672272667401, + 166088945478458, + 483048620738223, + 111645751835425, + 21888242871839275222246405745257275088548364400416034343698204165175642297469, + 391902261074297, + 423417334296311, + 21888242871839275222246405745257275088548364400416034343698204036922406326397, + 356035482286482, + 181051080935360, + 31828667646952, + 21888242871839275222246405745257275088548364400416034343698203662820440010289, + 368669634416208, + 107815248084070, + 52355848029307, + 21888242871839275222246405745257275088548364400416034343698203919244609990187, + 21888242871839275222246405745257275088548364400416034343698203939667102954525, + 21888242871839275222246405745257275088548364400416034343698203662629771307590, + 21888242871839275222246405745257275088548364400416034343698203825939752919200, + 118951057767751, + 21888242871839275222246405745257275088548364400416034343698204003459116576766, + 356585577807859, + 162967938469112, + 17460616327442, + 493871731548602, + 496030816570658, + 21888242871839275222246405745257275088548364400416034343698204145488171117013, + 21888242871839275222246405745257275088548364400416034343698203761591602027776, + 199786412993036, + 21888242871839275222246405745257275088548364400416034343698204110438472255728, + 21888242871839275222246405745257275088548364400416034343698203754384215941753, + 363405372478226, + 21888242871839275222246405745257275088548364400416034343698203726821890828142, + 21888242871839275222246405745257275088548364400416034343698203755310139897376, + 21888242871839275222246405745257275088548364400416034343698204141890186461706, + 299375404823255, + 83738919325639, + 21888242871839275222246405745257275088548364400416034343698204139433774135352, + 21888242871839275222246405745257275088548364400416034343698203779574168221631, + 21888242871839275222246405745257275088548364400416034343698203684471732954912, + 532174972049929, + 261669235521213, + 354411748258373, + 42231739409087, + 21888242871839275222246405745257275088548364400416034343698204016448053831153, + 21888242871839275222246405745257275088548364400416034343698203983663725023896, + 21888242871839275222246405745257275088548364400416034343698203636787556502630, + 21888242871839275222246405745257275088548364400416034343698204102984451007220, + 69704216639768, + 21888242871839275222246405745257275088548364400416034343698203774936385434283, + 436837737629711, + 21888242871839275222246405745257275088548364400416034343698203791532858487179, + 206258872510938, + 21888242871839275222246405745257275088548364400416034343698203691447299875584, + 21888242871839275222246405745257275088548364400416034343698203650630185668581, + 385360565684692, + 298983130527586, + 21888242871839275222246405745257275088548364400416034343698203722094864335299, + 20533909367366, + 21888242871839275222246405745257275088548364400416034343698203863687230782989, + 21888242871839275222246405745257275088548364400416034343698204158439379355889, + 206615423346892, + 340164214203756, + 21888242871839275222246405745257275088548364400416034343698204122674176929281, + 9186404730856, + 21888242871839275222246405745257275088548364400416034343698204085462944355332, + 35560740725526, + 21888242871839275222246405745257275088548364400416034343698204142371354604761, + 465711210952249, + 9548265927639, + 21888242871839275222246405745257275088548364400416034343698203633284728122011, + 21888242871839275222246405745257275088548364400416034343698204008337725116839, + 21888242871839275222246405745257275088548364400416034343698204147203196622444, + 18721063757753, + 116614018553778, + 21888242871839275222246405745257275088548364400416034343698203986544295956477, + 21888242871839275222246405745257275088548364400416034343698204040257014427378, + 21888242871839275222246405745257275088548364400416034343698203833037679491593, + 21888242871839275222246405745257275088548364400416034343698204156037424836935, + 21888242871839275222246405745257275088548364400416034343698203651609694242765, + 101042541203046, + 555345115307511, + 21888242871839275222246405745257275088548364400416034343698204013830264774168, + 306695813463625, + 21888242871839275222246405745257275088548364400416034343698203878199216817311, + 71132197013730, + 251815308612830, + 15948861053834, + 407668429067028, + 525720075729876, + 21888242871839275222246405745257275088548364400416034343698204172386005127751, + 249345278778412, + 21888242871839275222246405745257275088548364400416034343698203917295047626965, + 424913246510216, + 310136324614968, + 74280466004261, + 448057499366803, + 274771197085534, + 21888242871839275222246405745257275088548364400416034343698203714565227301149, + 207815756346314, + 172807144165807, + 21888242871839275222246405745257275088548364400416034343698203846555747881544, + 21888242871839275222246405745257275088548364400416034343698204102987576051379, + 332160135073874, + 21888242871839275222246405745257275088548364400416034343698203998482630700001, + 411555483653130, + 21888242871839275222246405745257275088548364400416034343698204010581984911730, + 21888242871839275222246405745257275088548364400416034343698204025808765568871, + 21888242871839275222246405745257275088548364400416034343698203842376796714757, + 21888242871839275222246405745257275088548364400416034343698203896277137259170, + 387404757764625, + 21888242871839275222246405745257275088548364400416034343698203667385978898608, + 112760347086652, + 482217818916380, + 21888242871839275222246405745257275088548364400416034343698203884228691753193, + 21888242871839275222246405745257275088548364400416034343698203885529158002865, + 25060639302359, + 21888242871839275222246405745257275088548364400416034343698203646289571927172, + 279950770608807, + 111774398069508, + 346044714529879, + 21888242871839275222246405745257275088548364400416034343698203757236560086485, + 400306035990316, + 498244685560953, + 21888242871839275222246405745257275088548364400416034343698204029383799027635, + 21888242871839275222246405745257275088548364400416034343698203690823298376214, + 21888242871839275222246405745257275088548364400416034343698204018689508961731, + 21888242871839275222246405745257275088548364400416034343698203744332034205353, + 21888242871839275222246405745257275088548364400416034343698203784792474591133, + 59454307911239, + 21888242871839275222246405745257275088548364400416034343698204183715675807106, + 52638289035931, + 495476616227523, + 21888242871839275222246405745257275088548364400416034343698203866289093505739, + 193344252227333, + 21888242871839275222246405745257275088548364400416034343698203953652566889806, + 21888242871839275222246405745257275088548364400416034343698203967402374319078, + 482009408823727, + 21888242871839275222246405745257275088548364400416034343698204113964624108339, + 117220398654089, + 353500303868176, + 344223766334189, + 395851911604222, + 62174842878809, + 77909549605340, + 509252420347501, + 21888242871839275222246405745257275088548364400416034343698204082816270577513, + 312937376434180, + 23397756512702, + 256272523782703, + 245599885411294, + 21888242871839275222246405745257275088548364400416034343698204047346207802042, + 21888242871839275222246405745257275088548364400416034343698203888839808570178, + 21888242871839275222246405745257275088548364400416034343698203933040450766385, + 33244245761325, + 21888242871839275222246405745257275088548364400416034343698203793069509074834, + 136320751120587, + 269572683145645, + 722668267123, + 21888242871839275222246405745257275088548364400416034343698203902507270925683, + 497746401246199, + 21888242871839275222246405745257275088548364400416034343698203693773982220939, + 96961286355803, + 21888242871839275222246405745257275088548364400416034343698203863856228331317, + 59317006766397, + 162143985941978, + 21888242871839275222246405745257275088548364400416034343698203944425698605171, + 21888242871839275222246405745257275088548364400416034343698203672161920244143, + 21888242871839275222246405745257275088548364400416034343698203659370481300277, + 21888242871839275222246405745257275088548364400416034343698203699686609413483, + 488862688658022, + 449879189615078, + 88972724424637, + 21888242871839275222246405745257275088548364400416034343698203689280765151368, + 21888242871839275222246405745257275088548364400416034343698204016587304744410, + 232838653025852, + 472140082786504, + 21888242871839275222246405745257275088548364400416034343698203628567081910627, + 21888242871839275222246405745257275088548364400416034343698204147481847210557, + 21888242871839275222246405745257275088548364400416034343698203660480665547271, + 62716264099405, + 21888242871839275222246405745257275088548364400416034343698203734958559857710, + 555121210701937, + 412638546410224, + 41435676046046, + 21888242871839275222246405745257275088548364400416034343698203971485849117875, + 485655358272650, + 21888242871839275222246405745257275088548364400416034343698204104199375376432, + 188151369345793, + 21888242871839275222246405745257275088548364400416034343698203882537016706242, + 148082488094894, + 546461005063487, + 21888242871839275222246405745257275088548364400416034343698203777634990180854, + 37323147628949, + 21888242871839275222246405745257275088548364400416034343698204132721214702408, + 21888242871839275222246405745257275088548364400416034343698203929744205889088, + 21888242871839275222246405745257275088548364400416034343698203695072482932771, + 193732397760646, + 228618221912911, + 485007123372977, + 389478342699878, + 120899934275055, + 21888242871839275222246405745257275088548364400416034343698203655007316755165, + 20436908315261, + 21888242871839275222246405745257275088548364400416034343698203673804136383403, + 21888242871839275222246405745257275088548364400416034343698204122940193061959, + 21888242871839275222246405745257275088548364400416034343698203847418500893470, + 398484615700161, + 512531909459411, + 205646488028766, + 556137121069366, + 21888242871839275222246405745257275088548364400416034343698203845326935138442, + 38539507459189, + 212365470160775, + 313845180410813, + 21888242871839275222246405745257275088548364400416034343698204000824307510349, + 21888242871839275222246405745257275088548364400416034343698203993861725029359, + 21888242871839275222246405745257275088548364400416034343698204067293309449368, + 21888242871839275222246405745257275088548364400416034343698204019443895626488, + 41346621008248, + 21888242871839275222246405745257275088548364400416034343698203980018795141390, + 21888242871839275222246405745257275088548364400416034343698203698249654721905, + 517327083506697, + 418391893259252, + 35310426663494, + 486383481226283, + 21888242871839275222246405745257275088548364400416034343698204018196361910853, + 21888242871839275222246405745257275088548364400416034343698203748294828461846, + 21888242871839275222246405745257275088548364400416034343698203815839110516199, + 21888242871839275222246405745257275088548364400416034343698203675469770920865, + 21888242871839275222246405745257275088548364400416034343698204001283969507692, + 229418623082915, + 21888242871839275222246405745257275088548364400416034343698204117914584926669, + 522454982515959, + 21888242871839275222246405745257275088548364400416034343698204096235380422067, + 126958073039013, + 21888242871839275222246405745257275088548364400416034343698203826495549575609, + 21888242871839275222246405745257275088548364400416034343698204068566081042907, + 561157334333071, + 21888242871839275222246405745257275088548364400416034343698203750588867390946, + 269582716636879, + 298198034852404, + 321560395695689, + 144619283016527, + 146078100836180, + 453116029102405, + 21888242871839275222246405745257275088548364400416034343698203646965975325814, + 86817114040086, + 21888242871839275222246405745257275088548364400416034343698204072042324633391, + 273763953415046, + 21888242871839275222246405745257275088548364400416034343698203816629617079456, + 21888242871839275222246405745257275088548364400416034343698204049162501165406, + 11831772570370, + 55319044904517, + 21888242871839275222246405745257275088548364400416034343698203728522089144873, + 21888242871839275222246405745257275088548364400416034343698203787136354690684, + 21888242871839275222246405745257275088548364400416034343698203650653622022621, + 21888242871839275222246405745257275088548364400416034343698204028684516364717, + 21888242871839275222246405745257275088548364400416034343698204114658557259557, + 269419553069447, + 332742829683412, + 21888242871839275222246405745257275088548364400416034343698203998965250821669, + 38109643826396, + 57069923068127, + 523933326889746, + 40244681536867, + 21888242871839275222246405745257275088548364400416034343698204022316283343050, + 532588072468382, + 21888242871839275222246405745257275088548364400416034343698204126458226167201, + 21888242871839275222246405745257275088548364400416034343698203864317904836816, + 54890619664082, + 21888242871839275222246405745257275088548364400416034343698203764383078833462, + 433986695819514, + 21888242871839275222246405745257275088548364400416034343698203976555330253884, + 21888242871839275222246405745257275088548364400416034343698204137127865898098, + 21888242871839275222246405745257275088548364400416034343698203914553141342883, + 21888242871839275222246405745257275088548364400416034343698204097465280716743, + 359614939050080, + 157859146969957, + 21888242871839275222246405745257275088548364400416034343698203828634569520142, + 53157303862113, + 390052096145982, + 494785180951591, + 448376161579219, + 480958829099534, + 21888242871839275222246405745257275088548364400416034343698203743243893217981, + 137948127093959, + 21888242871839275222246405745257275088548364400416034343698203756082144538568, + 21888242871839275222246405745257275088548364400416034343698203989157872319663, + 550324231279977, + 34825914353947, + 21888242871839275222246405745257275088548364400416034343698204151010678425234, + 21888242871839275222246405745257275088548364400416034343698203705368473778768, + 412879246365285, + 21888242871839275222246405745257275088548364400416034343698204036708235790083, + 522411101008282, + 214973523960427, + 21888242871839275222246405745257275088548364400416034343698203912618319780980, + 226684209894184, + 553709072560553, + 21888242871839275222246405745257275088548364400416034343698203806943817963570, + 175614080949401, + 21888242871839275222246405745257275088548364400416034343698203910013139931178, + 21888242871839275222246405745257275088548364400416034343698203939447913871886, + 21888242871839275222246405745257275088548364400416034343698203973515095299531, + 87804583967957, + 550182216872886, + 308784678808843, + 21888242871839275222246405745257275088548364400416034343698204045220849095291, + 14453937859524, + 21888242871839275222246405745257275088548364400416034343698203727180686172002, + 439259094328384, + 21888242871839275222246405745257275088548364400416034343698203676778300087854, + 21888242871839275222246405745257275088548364400416034343698204031337128238382, + 21888242871839275222246405745257275088548364400416034343698203770925343978256, + 466893405806750, + 85703599101631, + 310567977023294, + 21888242871839275222246405745257275088548364400416034343698203885759212516460, + 178312440749460, + 165106811114904, + 50241557709390, + 21888242871839275222246405745257275088548364400416034343698203823322009444796, + 21888242871839275222246405745257275088548364400416034343698203731152270031222, + 225524084908588, + 21888242871839275222246405745257275088548364400416034343698204005313348228137, + 21888242871839275222246405745257275088548364400416034343698203944470644313459, + 21888242871839275222246405745257275088548364400416034343698203648149286375822, + 21888242871839275222246405745257275088548364400416034343698204137306381964465, + 21888242871839275222246405745257275088548364400416034343698204039013907393347, + 21888242871839275222246405745257275088548364400416034343698204166881533250133, + 490967149641304, + 84082420478347, + 489955627375217, + 34299309861515, + 395683335327781, + 21888242871839275222246405745257275088548364400416034343698203987800056052996, + 21888242871839275222246405745257275088548364400416034343698204098600590734936, + 102565121690814, + 377961126312509, + 21888242871839275222246405745257275088548364400416034343698203924236398350674, + 21888242871839275222246405745257275088548364400416034343698204171356423345151, + 252566231846044, + 469853065121321, + 341226183467689, + 21888242871839275222246405745257275088548364400416034343698203985780924167893, + 21888242871839275222246405745257275088548364400416034343698203668155936242807, + 21888242871839275222246405745257275088548364400416034343698204136407155222630, + 21888242871839275222246405745257275088548364400416034343698204038186553321623, + 21888242871839275222246405745257275088548364400416034343698203713613738593762, + 306735283360840, + 21888242871839275222246405745257275088548364400416034343698203791705604756408, + 21888242871839275222246405745257275088548364400416034343698204007949886712552, + 383765293382676, + 21888242871839275222246405745257275088548364400416034343698204138843830729106, + 21888242871839275222246405745257275088548364400416034343698203910161829443782, + 498549266311611, + 532050006715400, + 197621649391689, + 537854456576249, + 295413661893393, + 21888242871839275222246405745257275088548364400416034343698204031374485392005, + 461794814584697, + 19675587032719, + 26067216413948, + 300519836913370, + 21888242871839275222246405745257275088548364400416034343698204009666877350346, + 21888242871839275222246405745257275088548364400416034343698204025140077853363, + 21888242871839275222246405745257275088548364400416034343698203952356047732213, + 21888242871839275222246405745257275088548364400416034343698203629298379517451, + 21888242871839275222246405745257275088548364400416034343698203961003223591882, + 21888242871839275222246405745257275088548364400416034343698203970095116359115, + 21888242871839275222246405745257275088548364400416034343698204012755668534908, + 274974277112215, + 158026548381604, + 541680958667715, + 21888242871839275222246405745257275088548364400416034343698203741534957317232, + 21888242871839275222246405745257275088548364400416034343698203634233023111297, + 21888242871839275222246405745257275088548364400416034343698203718108035140270, + 21888242871839275222246405745257275088548364400416034343698203874558516649941, + 81413200802681, + 21888242871839275222246405745257275088548364400416034343698203915148479403332, + 21888242871839275222246405745257275088548364400416034343698203798836111976771, + 21888242871839275222246405745257275088548364400416034343698204167497005603427, + 73764188636509, + 237201009885933, + 21888242871839275222246405745257275088548364400416034343698203717718509779582, + 21888242871839275222246405745257275088548364400416034343698203903948840907665, + 500958447429330, + 21888242871839275222246405745257275088548364400416034343698204158817249239311, + 161645089305669, + 59480720422606, + 21888242871839275222246405745257275088548364400416034343698203748639957110575, + 305522182007460, + 21888242871839275222246405745257275088548364400416034343698204151884987112411, + 152349232489758, + 106597485915831, + 21888242871839275222246405745257275088548364400416034343698203759711853212659, + 270356836734941, + 445342449468632, + 131883650214321, + 21888242871839275222246405745257275088548364400416034343698203685572707953840, + 21888242871839275222246405745257275088548364400416034343698204135940253165066, + 240555209757039, + 315254985500583, + 21888242871839275222246405745257275088548364400416034343698203764193748051567, + 388943347516852, + 21888242871839275222246405745257275088548364400416034343698204098501774054490, + 494715695768226, + 21888242871839275222246405745257275088548364400416034343698203736025523206127, + 21888242871839275222246405745257275088548364400416034343698203640719392317357, + 312611771404448, + 21888242871839275222246405745257275088548364400416034343698204026719499633138, + 21888242871839275222246405745257275088548364400416034343698203974790939378383, + 511554244833961, + 460814456233410, + 158850114365039, + 147964834730352, + 21888242871839275222246405745257275088548364400416034343698204040959369745230, + 438812608372662, + 21888242871839275222246405745257275088548364400416034343698203894719621833884, + 514591744366446, + 21888242871839275222246405745257275088548364400416034343698203922183847842681, + 21888242871839275222246405745257275088548364400416034343698204159061979409909, + 206894442733928, + 21888242871839275222246405745257275088548364400416034343698203721193737829909, + 21888242871839275222246405745257275088548364400416034343698204099516317653099, + 223437465685370, + 543329844650476, + 21888242871839275222246405745257275088548364400416034343698203961691749165867, + 74050597922034, + 21888242871839275222246405745257275088548364400416034343698203643804087327859, + 249141631492450, + 21888242871839275222246405745257275088548364400416034343698204057130264040977, + 264914638182721, + 215503765240833, + 552557586345085, + 21888242871839275222246405745257275088548364400416034343698203875250330794143, + 252274499268402, + 259530568184919, + 186577406350059, + 21888242871839275222246405745257275088548364400416034343698203833447963730089, + 21888242871839275222246405745257275088548364400416034343698203925863860885782, + 21888242871839275222246405745257275088548364400416034343698203800868289822344, + 21888242871839275222246405745257275088548364400416034343698203875343679461735, + 21888242871839275222246405745257275088548364400416034343698203811320436411535, + 21888242871839275222246405745257275088548364400416034343698203783646891506250, + 21888242871839275222246405745257275088548364400416034343698203833093346810754, + 21888242871839275222246405745257275088548364400416034343698204041632784422799, + 156928726698495, + 424546297276968, + 21888242871839275222246405745257275088548364400416034343698203848558927567902, + 21888242871839275222246405745257275088548364400416034343698204075502958387800, + 21888242871839275222246405745257275088548364400416034343698203946835423456618, + 21888242871839275222246405745257275088548364400416034343698204178958873170723, + 396985508361110, + 541120000104448, + 128283909152312, + 161398037582329, + 21888242871839275222246405745257275088548364400416034343698204018889210768943, + 21888242871839275222246405745257275088548364400416034343698204111516738541776, + 21888242871839275222246405745257275088548364400416034343698203661564564919996, + 325485305320015, + 21888242871839275222246405745257275088548364400416034343698203706546295670044, + 21888242871839275222246405745257275088548364400416034343698203685096374339160, + 21888242871839275222246405745257275088548364400416034343698203787382517637478, + 242999248440380, + 21888242871839275222246405745257275088548364400416034343698203787070120569768, + 17075642484170, + 21888242871839275222246405745257275088548364400416034343698203721832222106664, + 21888242871839275222246405745257275088548364400416034343698203629222456525806, + 21888242871839275222246405745257275088548364400416034343698204061425867633243, + 21888242871839275222246405745257275088548364400416034343698203820271677377687, + 491601703742990, + 29155194738746, + 21888242871839275222246405745257275088548364400416034343698203905701663536926, + 496662437037776, + 444302568994898, + 556697634092159, + 21888242871839275222246405745257275088548364400416034343698204112921325717328, + 267391870769737, + 21888242871839275222246405745257275088548364400416034343698204067707522005246, + 21888242871839275222246405745257275088548364400416034343698203706783829018504, + 21888242871839275222246405745257275088548364400416034343698203810162263035267, + 52645161543333, + 21888242871839275222246405745257275088548364400416034343698203744628325352651, + 548453541182078, + 97591731188875, + 21888242871839275222246405745257275088548364400416034343698204169491489992929, + 21888242871839275222246405745257275088548364400416034343698204127603674668534, + 21888242871839275222246405745257275088548364400416034343698203879381198730810, + 21888242871839275222246405745257275088548364400416034343698203726824950739114, + 21888242871839275222246405745257275088548364400416034343698203794241290725816, + 21888242871839275222246405745257275088548364400416034343698203830138062611863, + 259450190595794, + 21888242871839275222246405745257275088548364400416034343698204017453221109731, + 21888242871839275222246405745257275088548364400416034343698203923989539662820, + 264565669452270, + 30736714646870, + 42569997461797, + 21888242871839275222246405745257275088548364400416034343698203776987486085848, + 21888242871839275222246405745257275088548364400416034343698204009712656073341, + 21888242871839275222246405745257275088548364400416034343698203859378639351743, + 473515892941488, + 21888242871839275222246405745257275088548364400416034343698204143680816489292, + 265418579799928, + 21888242871839275222246405745257275088548364400416034343698203862536149306734, + 21888242871839275222246405745257275088548364400416034343698203786692398784428, + 21888242871839275222246405745257275088548364400416034343698203964967443492786, + 357654052526792, + 234550877751848, + 21888242871839275222246405745257275088548364400416034343698204141624879501547, + 364897545407281, + 21888242871839275222246405745257275088548364400416034343698204141355088024563, + 249695874246537, + 21888242871839275222246405745257275088548364400416034343698203720387521916673, + 21888242871839275222246405745257275088548364400416034343698203783387644145173, + 433014032199398, + 452893576676678, + 29482805927396, + 413422281476158, + 536078831116202, + 21888242871839275222246405745257275088548364400416034343698204059166313444388, + 21888242871839275222246405745257275088548364400416034343698204087365038000140, + 21888242871839275222246405745257275088548364400416034343698203872001402456451, + 21888242871839275222246405745257275088548364400416034343698203843963222582543, + 56222395031051, + 21888242871839275222246405745257275088548364400416034343698203922056114256181, + 332367432507374, + 21888242871839275222246405745257275088548364400416034343698203657096119992649, + 21888242871839275222246405745257275088548364400416034343698203942435612696891, + 337858148290989, + 547068804869682, + 21888242871839275222246405745257275088548364400416034343698204129806366434690, + 21888242871839275222246405745257275088548364400416034343698203625057012906916, + 21888242871839275222246405745257275088548364400416034343698203741865822726673, + 117126370105575, + 21888242871839275222246405745257275088548364400416034343698203797091334891715, + 62307026463742, + 21888242871839275222246405745257275088548364400416034343698204065375531458813, + 418082589805491, + 21888242871839275222246405745257275088548364400416034343698204177923696822284, + 179045875111182, + 21888242871839275222246405745257275088548364400416034343698203937855998617748, + 21888242871839275222246405745257275088548364400416034343698204125637602694518, + 21888242871839275222246405745257275088548364400416034343698203900848255534673, + 21888242871839275222246405745257275088548364400416034343698204000936622454767, + 21888242871839275222246405745257275088548364400416034343698204065632200488362, + 24423505340762, + 21888242871839275222246405745257275088548364400416034343698203976552316520064, + 21888242871839275222246405745257275088548364400416034343698203816291965128064, + 21888242871839275222246405745257275088548364400416034343698203641591689339469, + 21888242871839275222246405745257275088548364400416034343698203844930486631092, + 21888242871839275222246405745257275088548364400416034343698203735493989119088, + 21888242871839275222246405745257275088548364400416034343698203628260317414103, + 275794510599000, + 92991696249413, + 499005387023708, + 21888242871839275222246405745257275088548364400416034343698203820104148825327, + 21888242871839275222246405745257275088548364400416034343698203943586015032617, + 21888242871839275222246405745257275088548364400416034343698203880670176172670, + 21888242871839275222246405745257275088548364400416034343698204091927512250788, + 21888242871839275222246405745257275088548364400416034343698203934323788028327, + 21888242871839275222246405745257275088548364400416034343698203827742833612312, + 416548422395381, + 21888242871839275222246405745257275088548364400416034343698203847492422608733, + 345575099947182, + 21888242871839275222246405745257275088548364400416034343698203894469062224829, + 468367617171981, + 285014556114350, + 21888242871839275222246405745257275088548364400416034343698203935269360353775, + 175806126090683, + 413392115756250, + 21888242871839275222246405745257275088548364400416034343698204101998359886077, + 393424146246059, + 488449750122601, + 192880076060550, + 21888242871839275222246405745257275088548364400416034343698203664587850897889, + 448019942591772, + 394689568321730, + 93695198764134, + 369442442112476, + 69175766586371, + 21888242871839275222246405745257275088548364400416034343698203807655555858758, + 21888242871839275222246405745257275088548364400416034343698203711429000668892, + 21888242871839275222246405745257275088548364400416034343698203647030712353051, + 21888242871839275222246405745257275088548364400416034343698203968121472965831, + 21888242871839275222246405745257275088548364400416034343698203918461151980016, + 21888242871839275222246405745257275088548364400416034343698204185710473067137, + 21888242871839275222246405745257275088548364400416034343698204018542600303395, + 53555632965519, + 126585691088022, + 21888242871839275222246405745257275088548364400416034343698203751206450018689, + 21888242871839275222246405745257275088548364400416034343698204045514269569236, + 21888242871839275222246405745257275088548364400416034343698203680298743745598, + 535875318431073, + 21888242871839275222246405745257275088548364400416034343698203731744271997691, + 21888242871839275222246405745257275088548364400416034343698203902349104259212, + 272688800449467, + 21888242871839275222246405745257275088548364400416034343698204168924491071939, + 267314488271034, + 21888242871839275222246405745257275088548364400416034343698203991632063317896, + 21888242871839275222246405745257275088548364400416034343698203860128742380199, + 21888242871839275222246405745257275088548364400416034343698203800877306439462, + 21888242871839275222246405745257275088548364400416034343698203879179961761732, + 21888242871839275222246405745257275088548364400416034343698204001443808411440, + 21888242871839275222246405745257275088548364400416034343698203943623169354782, + 373009713351390, + 21888242871839275222246405745257275088548364400416034343698203796771163362900, + 522898562296306, + 464508251543859, + 293966447684831, + 241586119558238, + 256372935336320, + 21888242871839275222246405745257275088548364400416034343698203644314274775420, + 21888242871839275222246405745257275088548364400416034343698204052807749656490, + 21888242871839275222246405745257275088548364400416034343698203759383846376858, + 21888242871839275222246405745257275088548364400416034343698203980441261009214, + 21888242871839275222246405745257275088548364400416034343698203626254480788368, + 21888242871839275222246405745257275088548364400416034343698203705259289189985, + 559902821678293, + 21888242871839275222246405745257275088548364400416034343698203803007072842897, + 21888242871839275222246405745257275088548364400416034343698203725068915157988, + 141866504394093, + 549034961015799, + 246041175050789, + 21888242871839275222246405745257275088548364400416034343698203862887392547007, + 323635402674444, + 21888242871839275222246405745257275088548364400416034343698204011808308058453, + 509969185204309, + 21888242871839275222246405745257275088548364400416034343698203935476030291415, + 446647167001970, + 314566733586832, + 21888242871839275222246405745257275088548364400416034343698203842109240049577, + 21888242871839275222246405745257275088548364400416034343698204133027402947710, + 21888242871839275222246405745257275088548364400416034343698204083494610086071, + 342332655634013, + 21888242871839275222246405745257275088548364400416034343698203827523866535089, + 21888242871839275222246405745257275088548364400416034343698203894322121205177, + 21888242871839275222246405745257275088548364400416034343698204093163810379250, + 135946262469837, + 171936621053996, + 21888242871839275222246405745257275088548364400416034343698203888764366128127, + 497608229696473, + 21888242871839275222246405745257275088548364400416034343698204004447228922149, + 294205269785483, + 21888242871839275222246405745257275088548364400416034343698203854509322271547, + 268365229236163, + 551237177656332, + 21888242871839275222246405745257275088548364400416034343698203688218564997877, + 289670049255931, + 21888242871839275222246405745257275088548364400416034343698203938022737018593, + 21888242871839275222246405745257275088548364400416034343698203943074006032769, + 277564813896937, + 74247668513284, + 21888242871839275222246405745257275088548364400416034343698203738980314969813, + 21888242871839275222246405745257275088548364400416034343698203854690722943270, + 188153510877664, + 76699908049867, + 505680613663609, + 325263126924094, + 379461713683859, + 274349083254401, + 15281314316678, + 70828553329283, + 21888242871839275222246405745257275088548364400416034343698203710659964205236, + 21888242871839275222246405745257275088548364400416034343698203920266527099428, + 21888242871839275222246405745257275088548364400416034343698204089247195891519, + 491978949042041, + 21888242871839275222246405745257275088548364400416034343698203897820684455305, + 21888242871839275222246405745257275088548364400416034343698204168713550444696, + 21888242871839275222246405745257275088548364400416034343698204174414172920857, + 406349883912821, + 21888242871839275222246405745257275088548364400416034343698203681112892479409, + 180250203028693, + 332309257826725, + 21888242871839275222246405745257275088548364400416034343698203747139825616281, + 21888242871839275222246405745257275088548364400416034343698203729341708634856, + 21888242871839275222246405745257275088548364400416034343698203985893867817870, + 21888242871839275222246405745257275088548364400416034343698203873586138532994, + 183218061503135, + 21888242871839275222246405745257275088548364400416034343698203917511686134616, + 362991212866259, + 21888242871839275222246405745257275088548364400416034343698204124783363053369, + 541037005093802, + 83392600169936, + 87880787658669, + 261707356456179, + 46264459383391, + 59536538218057, + 21888242871839275222246405745257275088548364400416034343698203751675738419747, + 21888242871839275222246405745257275088548364400416034343698203828218799896135, + 21888242871839275222246405745257275088548364400416034343698204045623442030853, + 21888242871839275222246405745257275088548364400416034343698203776573309883900, + 21888242871839275222246405745257275088548364400416034343698204151219536990221, + 377553142719295, + 329233836214528, + 272420167876141, + 391234548803786, + 21888242871839275222246405745257275088548364400416034343698203893135965020896, + 9083917449404, + 21888242871839275222246405745257275088548364400416034343698203662609486018433, + 558719592698165, + 21888242871839275222246405745257275088548364400416034343698203756094552329500, + 21888242871839275222246405745257275088548364400416034343698203853121803120813, + 260226727781960, + 21888242871839275222246405745257275088548364400416034343698203702936768104926, + 495476822923491, + 96552202874697, + 114648840862351, + 341447163882101, + 21888242871839275222246405745257275088548364400416034343698204008403632963855, + 165493602625729, + 21888242871839275222246405745257275088548364400416034343698204095433839388061, + 21888242871839275222246405745257275088548364400416034343698204082440271031650, + 21888242871839275222246405745257275088548364400416034343698203847924510648978, + 21888242871839275222246405745257275088548364400416034343698203716021554014669, + 21888242871839275222246405745257275088548364400416034343698204109435725839011, + 70414289827420, + 308251428476985, + 21888242871839275222246405745257275088548364400416034343698204001788270417245, + 21888242871839275222246405745257275088548364400416034343698203736695918558689, + 21888242871839275222246405745257275088548364400416034343698204077226714636314, + 21888242871839275222246405745257275088548364400416034343698203762767020874974, + 529820178498657, + 21888242871839275222246405745257275088548364400416034343698204077300077598109, + 21888242871839275222246405745257275088548364400416034343698204178799787895379, + 21888242871839275222246405745257275088548364400416034343698203870167117198226, + 21888242871839275222246405745257275088548364400416034343698203935136424257335, + 21888242871839275222246405745257275088548364400416034343698203711773605423690, + 21888242871839275222246405745257275088548364400416034343698203927446405974117, + 116918059279324, + 86787740140255, + 21888242871839275222246405745257275088548364400416034343698203918502961391903, + 440143865332127, + 21888242871839275222246405745257275088548364400416034343698203946406099127504, + 505201837789604, + 436536070351656, + 134347963038044, + 21888242871839275222246405745257275088548364400416034343698204127153949576685, + 58023661497971, + 206009395091180, + 21888242871839275222246405745257275088548364400416034343698203820435485304741, + 101731397242521, + 408241296403456, + 519202004728424, + 21888242871839275222246405745257275088548364400416034343698203869046941556131, + 21888242871839275222246405745257275088548364400416034343698203764527589173231, + 21888242871839275222246405745257275088548364400416034343698203699720830579470, + 21888242871839275222246405745257275088548364400416034343698204068490071935025, + 21888242871839275222246405745257275088548364400416034343698203880789737691550, + 558478109314474, + 509944512954186, + 48100904845107, + 495014172539180, + 21888242871839275222246405745257275088548364400416034343698203786670692186402, + 21888242871839275222246405745257275088548364400416034343698204084802590166706, + 21888242871839275222246405745257275088548364400416034343698204061551813853331, + 21888242871839275222246405745257275088548364400416034343698203960505334784117, + 21888242871839275222246405745257275088548364400416034343698204103453778406367, + 3305445692301, + 21888242871839275222246405745257275088548364400416034343698204021888226038383, + 441154368173451, + 21888242871839275222246405745257275088548364400416034343698203936166218354515, + 250491076419532, + 497961145028294, + 21888242871839275222246405745257275088548364400416034343698204134920575066250, + 21888242871839275222246405745257275088548364400416034343698203690939829551948, + 473594850842666, + 21813039253856, + 21888242871839275222246405745257275088548364400416034343698203866363247085458, + 21888242871839275222246405745257275088548364400416034343698204134793641299882, + 21888242871839275222246405745257275088548364400416034343698203895818072492218, + 235660866730800, + 174799917663385, + 21888242871839275222246405745257275088548364400416034343698204127704848098993, + 21888242871839275222246405745257275088548364400416034343698203854059100564708, + 21888242871839275222246405745257275088548364400416034343698203670938314521159, + 21888242871839275222246405745257275088548364400416034343698203662062016196061, + 427557505355852, + 21888242871839275222246405745257275088548364400416034343698204111187054678633, + 21888242871839275222246405745257275088548364400416034343698203750836826045079, + 241435601515600, + 291747745475078, + 541896937079770, + 533765132303237, + 300334243087174, + 21888242871839275222246405745257275088548364400416034343698203990842876205090, + 21888242871839275222246405745257275088548364400416034343698203747839528707463, + 21888242871839275222246405745257275088548364400416034343698203667883620415075, + 332005635643274, + 21888242871839275222246405745257275088548364400416034343698203725533756015071, + 21888242871839275222246405745257275088548364400416034343698203724523796944320, + 362822627334658, + 429846716641606, + 21888242871839275222246405745257275088548364400416034343698203836180794163599, + 7436184935036, + 184927378921946, + 21888242871839275222246405745257275088548364400416034343698203981716280077094, + 21888242871839275222246405745257275088548364400416034343698203990999972856525, + 42762267804284, + 21888242871839275222246405745257275088548364400416034343698203771440950131349, + 21888242871839275222246405745257275088548364400416034343698203846064636220680, + 391907456358666, + 18962725970231, + 486901156918123, + 21888242871839275222246405745257275088548364400416034343698203718431339773999, + 21888242871839275222246405745257275088548364400416034343698203801035966647238, + 21888242871839275222246405745257275088548364400416034343698203635011664861196, + 21888242871839275222246405745257275088548364400416034343698203940437656539132, + 233793869935912, + 431756881245841, + 21888242871839275222246405745257275088548364400416034343698203683067807890102, + 473186302650414, + 21888242871839275222246405745257275088548364400416034343698203923924362530785, + 21888242871839275222246405745257275088548364400416034343698203636448485722818, + 21888242871839275222246405745257275088548364400416034343698203848734735876355, + 9880545191120, + 21888242871839275222246405745257275088548364400416034343698204044824489422709, + 21888242871839275222246405745257275088548364400416034343698203835071201037243, + 9963705980839, + 21888242871839275222246405745257275088548364400416034343698203725616639656474, + 21888242871839275222246405745257275088548364400416034343698204180934688765744, + 21888242871839275222246405745257275088548364400416034343698204089805088090886, + 397402620570968, + 145830091612856, + 331536763344398, + 21888242871839275222246405745257275088548364400416034343698204032197781020853, + 21888242871839275222246405745257275088548364400416034343698203646698451335911, + 229860614517956, + 21888242871839275222246405745257275088548364400416034343698204137619764858182, + 21888242871839275222246405745257275088548364400416034343698203670501437957221, + 21888242871839275222246405745257275088548364400416034343698204042031370602993, + 21888242871839275222246405745257275088548364400416034343698204062500749155415, + 21888242871839275222246405745257275088548364400416034343698203838264992615145, + 21888242871839275222246405745257275088548364400416034343698203655017647641806, + 21888242871839275222246405745257275088548364400416034343698203954130410087795, + 344231896171749, + 21888242871839275222246405745257275088548364400416034343698203844140371511346, + 21888242871839275222246405745257275088548364400416034343698203685081744992037, + 21888242871839275222246405745257275088548364400416034343698204014109245701634, + 21888242871839275222246405745257275088548364400416034343698203646378387988377, + 297788965338728, + 21888242871839275222246405745257275088548364400416034343698204093099393348910, + 39183369726513, + 359548053698497, + 51218324342049, + 21888242871839275222246405745257275088548364400416034343698204065766555360907, + 389053242010422, + 21888242871839275222246405745257275088548364400416034343698204007924212495860, + 21888242871839275222246405745257275088548364400416034343698203837502388191744, + 133148532937233, + 21888242871839275222246405745257275088548364400416034343698203997450336956579, + 21888242871839275222246405745257275088548364400416034343698203881355519916273, + 21888242871839275222246405745257275088548364400416034343698203929881266820229, + 21888242871839275222246405745257275088548364400416034343698204179740378724482, + 21888242871839275222246405745257275088548364400416034343698203717260743245721, + 21888242871839275222246405745257275088548364400416034343698204131006828259294, + 21888242871839275222246405745257275088548364400416034343698203946475224661346, + 141163159924253, + 21888242871839275222246405745257275088548364400416034343698203636122945882732, + 75340487547137, + 21888242871839275222246405745257275088548364400416034343698203972850771673044, + 21888242871839275222246405745257275088548364400416034343698203998214576177950, + 518912263014003, + 13408109110661, + 21888242871839275222246405745257275088548364400416034343698203708745954464306, + 208495842987881, + 21888242871839275222246405745257275088548364400416034343698203674580487984230, + 337065798313709, + 166001211554231, + 21888242871839275222246405745257275088548364400416034343698203966792704099150, + 228572888350043, + 4909678705375, + 21888242871839275222246405745257275088548364400416034343698203689121112389690, + 396309722749596, + 21888242871839275222246405745257275088548364400416034343698203808609896724143, + 488037489365899, + 21888242871839275222246405745257275088548364400416034343698203746585380075555, + 154327623383913, + 21888242871839275222246405745257275088548364400416034343698203877990745855944, + 409206673302345, + 443765884930340, + 292048863295125, + 21888242871839275222246405745257275088548364400416034343698203935040965365656, + 178381957373660, + 21888242871839275222246405745257275088548364400416034343698204010411887272461, + 342750479201085, + 21888242871839275222246405745257275088548364400416034343698203710813358393908, + 56728463958772, + 337939260182288, + 21888242871839275222246405745257275088548364400416034343698203818371211996866, + 21888242871839275222246405745257275088548364400416034343698203628947065036894, + 367441755324847, + 21888242871839275222246405745257275088548364400416034343698204037779338657779, + 21888242871839275222246405745257275088548364400416034343698204157649149833935, + 369312068538635, + 335808858299399, + 70062600977606, + 21888242871839275222246405745257275088548364400416034343698203663730952330089, + 21888242871839275222246405745257275088548364400416034343698203925621473343450, + 21888242871839275222246405745257275088548364400416034343698203901423288460295, + 21888242871839275222246405745257275088548364400416034343698204005301366767297, + 21888242871839275222246405745257275088548364400416034343698203846206763975085, + 21888242871839275222246405745257275088548364400416034343698203914106458569101, + 172138079000206, + 21888242871839275222246405745257275088548364400416034343698204165110074099448, + 21888242871839275222246405745257275088548364400416034343698204080379866808335, + 21888242871839275222246405745257275088548364400416034343698203677857098426437, + 462121326905785, + 21888242871839275222246405745257275088548364400416034343698203833025522445188, + 21888242871839275222246405745257275088548364400416034343698203881099472065045, + 21888242871839275222246405745257275088548364400416034343698204078071924515828, + 21888242871839275222246405745257275088548364400416034343698203660807443601820, + 21888242871839275222246405745257275088548364400416034343698203977406901349849, + 4553652277679, + 21888242871839275222246405745257275088548364400416034343698204036683429499677, + 205293198369998, + 21888242871839275222246405745257275088548364400416034343698203731089913898912, + 73934500230749, + 155967034332557, + 344538875191265, + 252908962654764, + 371180850903197, + 21888242871839275222246405745257275088548364400416034343698204073741376254314, + 344904899199562, + 194679111126147, + 70562019547993, + 21888242871839275222246405745257275088548364400416034343698203766115255765739, + 21888242871839275222246405745257275088548364400416034343698203671015924164907, + 99277379980453, + 70171846398588, + 134472660125087, + 354578119155863, + 133009581379306, + 21888242871839275222246405745257275088548364400416034343698203635373338483390, + 21888242871839275222246405745257275088548364400416034343698203861193033913752, + 277533713707419, + 21888242871839275222246405745257275088548364400416034343698204106296134086425, + 230220367318990, + 21888242871839275222246405745257275088548364400416034343698203832928240384842, + 341296300168289, + 21888242871839275222246405745257275088548364400416034343698203736291223869671, + 285169288637287, + 21888242871839275222246405745257275088548364400416034343698204173859881297320, + 418801493143549, + 428118908631040, + 21888242871839275222246405745257275088548364400416034343698203840412874450679, + 21888242871839275222246405745257275088548364400416034343698204070460173302350, + 216902626947652, + 411393385142245, + 425737814244687, + 21888242871839275222246405745257275088548364400416034343698203707014949239131, + 21888242871839275222246405745257275088548364400416034343698203756520817417050, + 314210948939858, + 231319123047211, + 216217531667142, + 21888242871839275222246405745257275088548364400416034343698204138402680760194, + 21888242871839275222246405745257275088548364400416034343698204145684551184402, + 522201322640694, + 523990908662695, + 21888242871839275222246405745257275088548364400416034343698204117582911184358, + 21888242871839275222246405745257275088548364400416034343698204139223859278729, + 6025066770624, + 118782263224261, + 21888242871839275222246405745257275088548364400416034343698203879946811013041, + 21888242871839275222246405745257275088548364400416034343698203875273199251762, + 422299073292722, + 21888242871839275222246405745257275088548364400416034343698203851661436547209, + 169169013685880, + 549085882977328, + 291645125327242, + 557957563060506, + 21888242871839275222246405745257275088548364400416034343698204047902685228536, + 21888242871839275222246405745257275088548364400416034343698203758172378850247, + 30723740266494, + 21888242871839275222246405745257275088548364400416034343698204120674123357285, + 543521494051123, + 90531084734681, + 231907143674497, + 62574229559342, + 21888242871839275222246405745257275088548364400416034343698204083397570882827, + 280938577830211, + 451028683080464, + 21888242871839275222246405745257275088548364400416034343698203944076037490374, + 21888242871839275222246405745257275088548364400416034343698203782726680602527, + 277449072459055, + 561963005028188, + 203733678545675, + 322767933985340, + 318373377861708, + 177406056920829, + 21888242871839275222246405745257275088548364400416034343698204162723418366870, + 559816999842638, + 21888242871839275222246405745257275088548364400416034343698203973651126914850, + 21888242871839275222246405745257275088548364400416034343698204139015675917969, + 21888242871839275222246405745257275088548364400416034343698203839807263272632, + 140938716888841, + 21888242871839275222246405745257275088548364400416034343698203891943690746086, + 167992583147243, + 278580454447893, + 66027230698059, + 21888242871839275222246405745257275088548364400416034343698203823628169746773, + 205261974133737, + 12912683375132, + 464940646405399, + 21888242871839275222246405745257275088548364400416034343698204137401606681006, + 21888242871839275222246405745257275088548364400416034343698203727891345580940, + 524030296279392, + 21888242871839275222246405745257275088548364400416034343698204160464870686842, + 21888242871839275222246405745257275088548364400416034343698203884828459947466, + 21888242871839275222246405745257275088548364400416034343698203907727390442477, + 21888242871839275222246405745257275088548364400416034343698203710090283476528, + 21888242871839275222246405745257275088548364400416034343698203839457802048603, + 240336604223383, + 21888242871839275222246405745257275088548364400416034343698204154146030624753, + 21888242871839275222246405745257275088548364400416034343698203875123415730510, + 21888242871839275222246405745257275088548364400416034343698203739880186841743, + 315609094830875, + 418429152908547, + 21888242871839275222246405745257275088548364400416034343698204091977130289591, + 21888242871839275222246405745257275088548364400416034343698203832807144282902, + 516963342746920, + 21888242871839275222246405745257275088548364400416034343698203660391007532727, + 21888242871839275222246405745257275088548364400416034343698204077834050257341, + 21888242871839275222246405745257275088548364400416034343698203947436689737275, + 21888242871839275222246405745257275088548364400416034343698203921953836058096, + 113781623138555, + 206454911150405, + 379627497260278, + 21888242871839275222246405745257275088548364400416034343698203873422542588662, + 132990229157601, + 21888242871839275222246405745257275088548364400416034343698204134045273005223, + 21888242871839275222246405745257275088548364400416034343698203840721071883617, + 448485929914338, + 352466990620433, + 212748509538367, + 21888242871839275222246405745257275088548364400416034343698204084080935271419, + 395474888868477, + 535374903957314, + 80785396562571, + 21888242871839275222246405745257275088548364400416034343698203667229462847722, + 21888242871839275222246405745257275088548364400416034343698203872208802913756, + 61074898329175, + 350746612718023, + 21888242871839275222246405745257275088548364400416034343698204164211432826530, + 24799723126633, + 21888242871839275222246405745257275088548364400416034343698204025748888920627, + 21888242871839275222246405745257275088548364400416034343698204109162439152283, + 502461856106305, + 512406178542040, + 339788051045647, + 470940983321858, + 58868673350397, + 21888242871839275222246405745257275088548364400416034343698204120151536928188, + 473925884013063, + 21888242871839275222246405745257275088548364400416034343698203711543999449962, + 525718535857888, + 21888242871839275222246405745257275088548364400416034343698204010462508067971, + 44410414602786, + 344358237667568, + 21888242871839275222246405745257275088548364400416034343698204004563548986378, + 82272309863073, + 85246840659409, + 21888242871839275222246405745257275088548364400416034343698204125271036154358, + 21888242871839275222246405745257275088548364400416034343698203866941555455993, + 21888242871839275222246405745257275088548364400416034343698203731457788508610, + 26741535501958, + 546706676054747, + 17659176261284, + 21888242871839275222246405745257275088548364400416034343698204137948887490961, + 479716582934560, + 397688850084136, + 194582278594879, + 118477487443432, + 21888242871839275222246405745257275088548364400416034343698203636637026375395, + 278652831061185, + 56286047847443, + 3842767529883, + 183812346475878, + 531047458461529, + 21888242871839275222246405745257275088548364400416034343698203765599607206492, + 21888242871839275222246405745257275088548364400416034343698204176079369902784, + 21888242871839275222246405745257275088548364400416034343698203881488917792425, + 21888242871839275222246405745257275088548364400416034343698203753808388753251, + 497873778798946, + 21888242871839275222246405745257275088548364400416034343698203960495181206981, + 21888242871839275222246405745257275088548364400416034343698204164381016191157, + 426165792454101, + 21888242871839275222246405745257275088548364400416034343698204036152835963209, + 21888242871839275222246405745257275088548364400416034343698203702973602771692, + 21888242871839275222246405745257275088548364400416034343698203859581238135355, + 21888242871839275222246405745257275088548364400416034343698203954377887787344, + 21888242871839275222246405745257275088548364400416034343698204184044331298933, + 21888242871839275222246405745257275088548364400416034343698204157078093552593, + 162388486565276, + 550163733643117, + 21888242871839275222246405745257275088548364400416034343698203752981855207316, + 21888242871839275222246405745257275088548364400416034343698204148276724430694, + 66407340310818, + 493774675355697, + 21888242871839275222246405745257275088548364400416034343698204165719652466840, + 21888242871839275222246405745257275088548364400416034343698204171446847370416, + 21888242871839275222246405745257275088548364400416034343698204155715983924401, + 21888242871839275222246405745257275088548364400416034343698204068834815370064, + 507003501059062, + 434244834641357, + 21888242871839275222246405745257275088548364400416034343698203667211481268192, + 29320793723634, + 21888242871839275222246405745257275088548364400416034343698203855138596259955, + 21888242871839275222246405745257275088548364400416034343698203719680566560371, + 21888242871839275222246405745257275088548364400416034343698204083230430635562, + 21888242871839275222246405745257275088548364400416034343698203952551661779227, + 21888242871839275222246405745257275088548364400416034343698204082024125413587, + 85682138277934, + 21888242871839275222246405745257275088548364400416034343698204099669445823280, + 347151320622893, + 532554668362666, + 301746411240049, + 454878474048262, + 21888242871839275222246405745257275088548364400416034343698204152152979313344, + 386347570536054, + 289496025122421, + 290681177272239, + 21888242871839275222246405745257275088548364400416034343698203896790692857806, + 544237181801712, + 407516646186211, + 476582558686897, + 21888242871839275222246405745257275088548364400416034343698203770335822099206, + 223188238008006, + 270799523981034, + 167830601524901, + 21888242871839275222246405745257275088548364400416034343698204116649972321714, + 21888242871839275222246405745257275088548364400416034343698203743668309863124, + 21888242871839275222246405745257275088548364400416034343698203951960018383654, + 21888242871839275222246405745257275088548364400416034343698203818398624865946, + 21888242871839275222246405745257275088548364400416034343698203764144751939579, + 96272751707698, + 21888242871839275222246405745257275088548364400416034343698204160466517504548, + 237293046416051, + 21888242871839275222246405745257275088548364400416034343698203674769232403992, + 21888242871839275222246405745257275088548364400416034343698203777645624767583, + 815628991649, + 544363313092476, + 361869799229720, + 158298232543327, + 38648331443479, + 21888242871839275222246405745257275088548364400416034343698203851940038591895, + 21888242871839275222246405745257275088548364400416034343698204145565819587168, + 21888242871839275222246405745257275088548364400416034343698203832772246819196, + 21888242871839275222246405745257275088548364400416034343698203761329337088199, + 181356186783525, + 21888242871839275222246405745257275088548364400416034343698203696685881801086, + 462332492135117, + 21888242871839275222246405745257275088548364400416034343698203723197880912913, + 464599015255345, + 21888242871839275222246405745257275088548364400416034343698203902888184833246, + 21888242871839275222246405745257275088548364400416034343698203646635247488876, + 21888242871839275222246405745257275088548364400416034343698204091519918032255, + 21888242871839275222246405745257275088548364400416034343698203698714461507675, + 32896718027314, + 63126812554280, + 21888242871839275222246405745257275088548364400416034343698203872181324920443, + 21888242871839275222246405745257275088548364400416034343698203661911155550005, + 390732464123635, + 21888242871839275222246405745257275088548364400416034343698204144839266632041, + 391861769888240, + 21888242871839275222246405745257275088548364400416034343698203716174797822034, + 351726604144035, + 517202103915060, + 431281169436018, + 21888242871839275222246405745257275088548364400416034343698203989772732823623, + 21888242871839275222246405745257275088548364400416034343698203825605149083167, + 302622015178968, + 383254480053362, + 31000424507695, + 21888242871839275222246405745257275088548364400416034343698204171142249880688, + 148625277689072, + 21888242871839275222246405745257275088548364400416034343698203992652475463254, + 212067376084612, + 21888242871839275222246405745257275088548364400416034343698203718743967659439, + 21888242871839275222246405745257275088548364400416034343698204140908376954123, + 21888242871839275222246405745257275088548364400416034343698203727118436571202, + 21888242871839275222246405745257275088548364400416034343698203747378528714205, + 75944351118910, + 416249906888621, + 21888242871839275222246405745257275088548364400416034343698203746409167072894, + 304843580046569, + 21888242871839275222246405745257275088548364400416034343698203685978878855889, + 21888242871839275222246405745257275088548364400416034343698203882709963389141, + 82154667494329, + 84140703054498, + 21888242871839275222246405745257275088548364400416034343698203972854834607852, + 466308470139632, + 10308151402378, + 416039662960138, + 343926529924261, + 110106387763596, + 488264415449468, + 21888242871839275222246405745257275088548364400416034343698204182491034595640, + 21888242871839275222246405745257275088548364400416034343698203835621071830790, + 518062135730964, + 21888242871839275222246405745257275088548364400416034343698203977816162042257, + 21888242871839275222246405745257275088548364400416034343698204178712218166336, + 21888242871839275222246405745257275088548364400416034343698203668019733892852, + 219729477824077, + 280294135581264, + 193803056010538, + 21888242871839275222246405745257275088548364400416034343698203751442997646729, + 21888242871839275222246405745257275088548364400416034343698203856089999672003, + 21888242871839275222246405745257275088548364400416034343698203871939069449109, + 21888242871839275222246405745257275088548364400416034343698203727720990118625, + 288023793959794, + 390972449946814, + 198978703074227, + 21888242871839275222246405745257275088548364400416034343698203805306929118953, + 344294867059702, + 21888242871839275222246405745257275088548364400416034343698204082040355354045, + 157947394074588, + 89659921121333, + 21888242871839275222246405745257275088548364400416034343698204038134854514794, + 259595336964421, + 7098321087353, + 21888242871839275222246405745257275088548364400416034343698203986510976642140, + 21888242871839275222246405745257275088548364400416034343698203673103839633387, + 21888242871839275222246405745257275088548364400416034343698204125802043388048, + 21888242871839275222246405745257275088548364400416034343698203676374315504542, + 21888242871839275222246405745257275088548364400416034343698203744275203591802, + 194230978002641, + 499627513031725, + 21888242871839275222246405745257275088548364400416034343698203898582546557516, + 32353776785950, + 22026241469953, + 144864415872153, + 21888242871839275222246405745257275088548364400416034343698203818214451330492, + 345873133285391, + 316407226106973, + 21888242871839275222246405745257275088548364400416034343698203634401814737049, + 254694083883378, + 21888242871839275222246405745257275088548364400416034343698203763258982018593, + 188512315892060, + 82727957452723, + 482290133089484, + 211883510508762, + 237812685222523, + 552749884225060, + 417553523556560, + 241293162169287, + 21888242871839275222246405745257275088548364400416034343698203721701321891954, + 21888242871839275222246405745257275088548364400416034343698204120460908199230, + 527629577718603, + 158507523687366, + 21888242871839275222246405745257275088548364400416034343698203860092633301948, + 21888242871839275222246405745257275088548364400416034343698203851249403670113, + 30039822537195, + 21888242871839275222246405745257275088548364400416034343698203995834632798699, + 21888242871839275222246405745257275088548364400416034343698203708479499469251, + 21888242871839275222246405745257275088548364400416034343698204177559525443960, + 21888242871839275222246405745257275088548364400416034343698203699467400688767, + 278213706873298, + 47296809568720, + 21888242871839275222246405745257275088548364400416034343698203915653038695137, + 499684733830321, + 59797209294244, + 232786012089886, + 21888242871839275222246405745257275088548364400416034343698203713566556945787, + 21888242871839275222246405745257275088548364400416034343698203624385180036385, + 469081492646244, + 21888242871839275222246405745257275088548364400416034343698204166933617441966, + 446065361243060, + 181176025682509, + 21888242871839275222246405745257275088548364400416034343698204090772417133680, + 21888242871839275222246405745257275088548364400416034343698204133230886882583, + 21888242871839275222246405745257275088548364400416034343698204038609856629255, + 21888242871839275222246405745257275088548364400416034343698203722166572883763, + 335700634872076, + 137575713197731, + 21888242871839275222246405745257275088548364400416034343698204083186178774089, + 515601141314909, + 121554004149062, + 259562920705310, + 291265771632608, + 21888242871839275222246405745257275088548364400416034343698204014997409366695, + 21888242871839275222246405745257275088548364400416034343698204086861618229077, + 384903485801714, + 107358965248958, + 21888242871839275222246405745257275088548364400416034343698204091512149465830, + 287898875822837, + 21888242871839275222246405745257275088548364400416034343698203676779213938829, + 295286682640463, + 21888242871839275222246405745257275088548364400416034343698203700795218278548, + 21888242871839275222246405745257275088548364400416034343698203719019142474583, + 21888242871839275222246405745257275088548364400416034343698203744543602292065, + 21888242871839275222246405745257275088548364400416034343698203832644852660916, + 21888242871839275222246405745257275088548364400416034343698203735120473928446, + 441322786031208, + 21888242871839275222246405745257275088548364400416034343698204131503330598973, + 53737056901145, + 21888242871839275222246405745257275088548364400416034343698203939892939203439, + 491729878684427, + 507836102540095, + 21888242871839275222246405745257275088548364400416034343698203688630650322532, + 21888242871839275222246405745257275088548364400416034343698203884964180563862, + 21888242871839275222246405745257275088548364400416034343698204152169774138384, + 61804871805300, + 21888242871839275222246405745257275088548364400416034343698203679839401604312, + 7577388242718, + 21888242871839275222246405745257275088548364400416034343698204080752827882144, + 179203586092480, + 21888242871839275222246405745257275088548364400416034343698203896021549371700, + 384175025496637, + 21888242871839275222246405745257275088548364400416034343698203834995646593478, + 21888242871839275222246405745257275088548364400416034343698203818351486229433, + 21888242871839275222246405745257275088548364400416034343698203685895263923556, + 230006469626320, + 21888242871839275222246405745257275088548364400416034343698203679277994040515, + 319773261570692, + 21888242871839275222246405745257275088548364400416034343698203928330374450550, + 46597493020755, + 21888242871839275222246405745257275088548364400416034343698204112125354465161, + 283355344761616, + 268023804355543, + 21888242871839275222246405745257275088548364400416034343698204085884233453357, + 519937270310517, + 21888242871839275222246405745257275088548364400416034343698203663309136311630, + 21888242871839275222246405745257275088548364400416034343698203812115706689481, + 21888242871839275222246405745257275088548364400416034343698204115095790970790, + 21888242871839275222246405745257275088548364400416034343698203978992476236034, + 21888242871839275222246405745257275088548364400416034343698203752718251159046, + 500392850774060, + 21888242871839275222246405745257275088548364400416034343698203847761782701590, + 286675857051792, + 385975320503658, + 21888242871839275222246405745257275088548364400416034343698203773499296444556, + 343377229925226, + 465263098518291, + 392277452481062, + 236041222488127, + 21888242871839275222246405745257275088548364400416034343698204097278599342104, + 120891452643281, + 21888242871839275222246405745257275088548364400416034343698203826374882158554, + 344263093774392, + 34931666782960, + 381477453370193, + 546202367213380, + 303778352013479, + 165496017501707, + 520603610616352, + 21888242871839275222246405745257275088548364400416034343698204024848858133506, + 21888242871839275222246405745257275088548364400416034343698204170453520887672, + 20659739900508, + 21888242871839275222246405745257275088548364400416034343698204161768852730581, + 40647647678875, + 21888242871839275222246405745257275088548364400416034343698203985851596665681, + 294731858004794, + 78707987790468, + 539897821900324, + 131695816851859, + 21888242871839275222246405745257275088548364400416034343698203648567438700145, + 21888242871839275222246405745257275088548364400416034343698203939987600679870, + 21888242871839275222246405745257275088548364400416034343698203709242025098199, + 370399801932701, + 133768875804335, + 21888242871839275222246405745257275088548364400416034343698204140604141637128, + 21888242871839275222246405745257275088548364400416034343698203645821372178352, + 188867711125966, + 21888242871839275222246405745257275088548364400416034343698203625508252622316, + 21888242871839275222246405745257275088548364400416034343698203867795801433001, + 21888242871839275222246405745257275088548364400416034343698203979055523390929, + 21888242871839275222246405745257275088548364400416034343698204028639424687171, + 290962497759528, + 21888242871839275222246405745257275088548364400416034343698203762656938330656, + 21888242871839275222246405745257275088548364400416034343698204160811945460359, + 366583424275512, + 9037640208777, + 188338093791562, + 98458704466510, + 21888242871839275222246405745257275088548364400416034343698203737048639004198, + 21888242871839275222246405745257275088548364400416034343698203912420768036193, + 21888242871839275222246405745257275088548364400416034343698203643430358684756, + 21888242871839275222246405745257275088548364400416034343698204166503427086434, + 21888242871839275222246405745257275088548364400416034343698203834430389389998, + 21888242871839275222246405745257275088548364400416034343698203951859479454956, + 369378226873778, + 21888242871839275222246405745257275088548364400416034343698203772605117044646, + 21888242871839275222246405745257275088548364400416034343698203814035607937312, + 538871512146678, + 194459768274573, + 329941697713814, + 21888242871839275222246405745257275088548364400416034343698204012297251764763, + 21888242871839275222246405745257275088548364400416034343698203744565400928318, + 474191678738347, + 21888242871839275222246405745257275088548364400416034343698204179122856619468, + 361788388406332, + 21888242871839275222246405745257275088548364400416034343698203825612323434434, + 21888242871839275222246405745257275088548364400416034343698204169663522967520, + 311352227082924, + 501144964091446, + 50024618627019, + 21888242871839275222246405745257275088548364400416034343698203730376345299495, + 21888242871839275222246405745257275088548364400416034343698203727089849730865, + 21888242871839275222246405745257275088548364400416034343698203754841979483502, + 298980989863332, + 108057078233307, + 21888242871839275222246405745257275088548364400416034343698203803297661961467, + 383235180922981, + 543009934523424, + 21888242871839275222246405745257275088548364400416034343698203897528700423042, + 21888242871839275222246405745257275088548364400416034343698203763629402630939, + 21888242871839275222246405745257275088548364400416034343698203674632070721569, + 21888242871839275222246405745257275088548364400416034343698203758302860977921, + 21888242871839275222246405745257275088548364400416034343698203833000688237208, + 21888242871839275222246405745257275088548364400416034343698203745994622771931, + 21888242871839275222246405745257275088548364400416034343698203671588659549575, + 405234761661855, + 21888242871839275222246405745257275088548364400416034343698203938606048344834, + 458526386969659, + 225841020956687, + 128233172132201, + 21888242871839275222246405745257275088548364400416034343698203873350745131689, + 356453831969980, + 21888242871839275222246405745257275088548364400416034343698204091086159320778, + 538012670104792, + 402696601782057, + 525370202375105, + 330286933438531, + 21888242871839275222246405745257275088548364400416034343698203837686247236652, + 21888242871839275222246405745257275088548364400416034343698203889731870436500, + 21888242871839275222246405745257275088548364400416034343698203707281316627358, + 21888242871839275222246405745257275088548364400416034343698204001029472017511, + 21888242871839275222246405745257275088548364400416034343698203759981246340775, + 271309283139272, + 21888242871839275222246405745257275088548364400416034343698204127413704273799, + 21888242871839275222246405745257275088548364400416034343698203684323020375369, + 21888242871839275222246405745257275088548364400416034343698204096404749768101, + 290295042856017, + 21888242871839275222246405745257275088548364400416034343698204115609883262304, + 21888242871839275222246405745257275088548364400416034343698203627839667482259, + 379811990360236, + 21888242871839275222246405745257275088548364400416034343698203687847177672395, + 21888242871839275222246405745257275088548364400416034343698204136693374258027, + 21888242871839275222246405745257275088548364400416034343698203930507274466570, + 21888242871839275222246405745257275088548364400416034343698204105170699126832, + 21888242871839275222246405745257275088548364400416034343698203826850076107796, + 299076991723263, + 74509146721556, + 142288968690522, + 405408906002683, + 21888242871839275222246405745257275088548364400416034343698203815143120835228, + 21888242871839275222246405745257275088548364400416034343698203688112667198737, + 21888242871839275222246405745257275088548364400416034343698204094942040166750, + 238381465553709, + 21888242871839275222246405745257275088548364400416034343698203679627998524122, + 21888242871839275222246405745257275088548364400416034343698203630358787507603, + 259486539863327, + 82505647276861, + 21888242871839275222246405745257275088548364400416034343698203954890299557885, + 21888242871839275222246405745257275088548364400416034343698203738309025053209, + 523793210169758, + 124024940690962, + 21888242871839275222246405745257275088548364400416034343698204049645976530565, + 299384593702054, + 21888242871839275222246405745257275088548364400416034343698203711544213453590, + 21888242871839275222246405745257275088548364400416034343698203640532585045311, + 21888242871839275222246405745257275088548364400416034343698204114068037135864, + 269128318743033, + 21888242871839275222246405745257275088548364400416034343698203869182751973424, + 165383107032180, + 21888242871839275222246405745257275088548364400416034343698204172555468088248, + 532892338022490, + 535569005718775, + 21888242871839275222246405745257275088548364400416034343698204031735434584113, + 199092962656334, + 170001127741359, + 21888242871839275222246405745257275088548364400416034343698203846852376921720, + 229749331737893, + 256901888534871, + 368859403035542, + 6498360885357, + 140914288886857, + 545252589496055, + 21888242871839275222246405745257275088548364400416034343698203785934708236271, + 21888242871839275222246405745257275088548364400416034343698204105283144586303, + 21888242871839275222246405745257275088548364400416034343698203924787417967704, + 21888242871839275222246405745257275088548364400416034343698204146701833468044, + 21888242871839275222246405745257275088548364400416034343698203797417204129823, + 21888242871839275222246405745257275088548364400416034343698204088208243500439, + 374010212571816, + 501238604484998, + 557029184462871, + 42627085740167, + 134248580002242, + 27970080343359, + 19874436113835, + 21888242871839275222246405745257275088548364400416034343698203891421977840149, + 266146107601550, + 21888242871839275222246405745257275088548364400416034343698203741855885208497, + 515336025709035, + 83733832634341, + 396598723759806, + 21888242871839275222246405745257275088548364400416034343698203776556739086432, + 21888242871839275222246405745257275088548364400416034343698203744760934544234, + 34364313557630, + 21888242871839275222246405745257275088548364400416034343698203884476746368744, + 21888242871839275222246405745257275088548364400416034343698203772721330576149, + 21888242871839275222246405745257275088548364400416034343698203882458904575920, + 21888242871839275222246405745257275088548364400416034343698203845636978659930, + 559724490408772, + 355217741873345, + 465880905832358, + 21888242871839275222246405745257275088548364400416034343698203830490875172616, + 202905701587876, + 21888242871839275222246405745257275088548364400416034343698203689166495350674, + 21888242871839275222246405745257275088548364400416034343698204121947782573984, + 21888242871839275222246405745257275088548364400416034343698203902534038951483, + 185943321284360, + 431358330911721, + 53854641983619, + 399778973936639, + 21805642583584, + 21888242871839275222246405745257275088548364400416034343698203877337124962263, + 464959094825590, + 21888242871839275222246405745257275088548364400416034343698203972817708727259, + 21888242871839275222246405745257275088548364400416034343698203948616709570544, + 204918305299878, + 323029892268354, + 21888242871839275222246405745257275088548364400416034343698203698769297738703, + 21888242871839275222246405745257275088548364400416034343698203645204843822319, + 21888242871839275222246405745257275088548364400416034343698203695688733996099, + 21888242871839275222246405745257275088548364400416034343698204056250810692767, + 525126631133087, + 282506348459888, + 21888242871839275222246405745257275088548364400416034343698204171443307824450, + 21888242871839275222246405745257275088548364400416034343698204059200137266049, + 463862822882449, + 21888242871839275222246405745257275088548364400416034343698204064430819740383, + 253768832089316, + 351752488359807, + 21888242871839275222246405745257275088548364400416034343698203807884153202798, + 21888242871839275222246405745257275088548364400416034343698203806852537180386, + 306970505685602, + 420035508977888, + 21888242871839275222246405745257275088548364400416034343698204044909360863962, + 21888242871839275222246405745257275088548364400416034343698203745357370493240, + 202582256725007, + 21888242871839275222246405745257275088548364400416034343698203798323988807066, + 21888242871839275222246405745257275088548364400416034343698203654715844616485, + 228000537697342, + 21888242871839275222246405745257275088548364400416034343698204171423197530734, + 450084069540818, + 254518733505093, + 21888242871839275222246405745257275088548364400416034343698203873056948147229, + 496929539770663, + 356509186367619, + 21888242871839275222246405745257275088548364400416034343698203663873194268960, + 21888242871839275222246405745257275088548364400416034343698204054601487105514, + 21888242871839275222246405745257275088548364400416034343698203727346189761456, + 16234315612228, + 400361933863268, + 21888242871839275222246405745257275088548364400416034343698203902540930152609, + 21888242871839275222246405745257275088548364400416034343698203670442998769140, + 403022322705645, + 257829916195792, + 478335320701607, + 21888242871839275222246405745257275088548364400416034343698203790918177357783, + 304826187803729, + 21888242871839275222246405745257275088548364400416034343698203735373143066063, + 451456633384308, + 409822650341273, + 272609436436636, + 21888242871839275222246405745257275088548364400416034343698203630568621314898, + 21888242871839275222246405745257275088548364400416034343698203782532795614468, + 17630684013464, + 345069248682414, + 21888242871839275222246405745257275088548364400416034343698204028061797067195, + 21888242871839275222246405745257275088548364400416034343698203689644281602681, + 226174654854284, + 21888242871839275222246405745257275088548364400416034343698204105427255513439, + 186193295797047, + 21888242871839275222246405745257275088548364400416034343698203757950505744776, + 223313672222731, + 2176892346033, + 106683636891587, + 393161842381755, + 113210844383190, + 21888242871839275222246405745257275088548364400416034343698204005858266937701, + 166484086168372, + 21888242871839275222246405745257275088548364400416034343698203627145933503760, + 21888242871839275222246405745257275088548364400416034343698203753197450463523, + 21888242871839275222246405745257275088548364400416034343698203797833463307458, + 358204264952517, + 21888242871839275222246405745257275088548364400416034343698204067673878528790, + 21888242871839275222246405745257275088548364400416034343698203876769392756210, + 511549443737846, + 21888242871839275222246405745257275088548364400416034343698203725384560881375, + 21888242871839275222246405745257275088548364400416034343698203902489579200427, + 21888242871839275222246405745257275088548364400416034343698203664233811270599, + 212961659267231, + 61912691276675, + 392323800300319, + 21888242871839275222246405745257275088548364400416034343698204124040884276599, + 21888242871839275222246405745257275088548364400416034343698203968342070393443, + 21888242871839275222246405745257275088548364400416034343698203923608147360200, + 21888242871839275222246405745257275088548364400416034343698203653914462176853, + 21888242871839275222246405745257275088548364400416034343698203824141673234749, + 21888242871839275222246405745257275088548364400416034343698203761132185574222, + 21888242871839275222246405745257275088548364400416034343698204040594674407111, + 401552146800506, + 21888242871839275222246405745257275088548364400416034343698203992229977705382, + 433383733170672, + 21888242871839275222246405745257275088548364400416034343698203999777294152877, + 208065433818533, + 308956816382989, + 21888242871839275222246405745257275088548364400416034343698203739287361384145, + 544179140665355, + 522265353944114, + 21888242871839275222246405745257275088548364400416034343698204183138833047088, + 21888242871839275222246405745257275088548364400416034343698203827810184123327, + 21888242871839275222246405745257275088548364400416034343698203980491428914811, + 21888242871839275222246405745257275088548364400416034343698203798714248583448, + 113045520302093, + 19360864457744, + 21888242871839275222246405745257275088548364400416034343698204145416095353215, + 21888242871839275222246405745257275088548364400416034343698203927848568219951, + 21888242871839275222246405745257275088548364400416034343698204089502606288624, + 21888242871839275222246405745257275088548364400416034343698203992289338899522, + 21888242871839275222246405745257275088548364400416034343698204163492634670034, + 21888242871839275222246405745257275088548364400416034343698204170070355507910, + 21888242871839275222246405745257275088548364400416034343698203873592030087350, + 321476847691443, + 21888242871839275222246405745257275088548364400416034343698203808575763913836, + 21888242871839275222246405745257275088548364400416034343698204026476651406548, + 21888242871839275222246405745257275088548364400416034343698203907521043939434, + 521170352373716, + 21888242871839275222246405745257275088548364400416034343698204060262813976532, + 394818132784355, + 21888242871839275222246405745257275088548364400416034343698203934135806723537, + 89882959529165, + 21888242871839275222246405745257275088548364400416034343698203773299879308422, + 353560704053357, + 21888242871839275222246405745257275088548364400416034343698204048883312045583, + 21888242871839275222246405745257275088548364400416034343698204105247755701692, + 484627045534060, + 21888242871839275222246405745257275088548364400416034343698203995035925023616, + 269697466149919, + 404007295159812, + 21888242871839275222246405745257275088548364400416034343698203847019083008186, + 266725038710327, + 21888242871839275222246405745257275088548364400416034343698203632268811656199, + 520735641310967, + 21888242871839275222246405745257275088548364400416034343698204119369052728870, + 21888242871839275222246405745257275088548364400416034343698203759209290760487, + 21888242871839275222246405745257275088548364400416034343698203903409003294442, + 21888242871839275222246405745257275088548364400416034343698203726480761903850, + 398423026663158, + 21888242871839275222246405745257275088548364400416034343698203853184256318634, + 21888242871839275222246405745257275088548364400416034343698203849301367510293, + 322472820549843, + 21888242871839275222246405745257275088548364400416034343698204134799981840330, + 400847857112803, + 113788583462986, + 21888242871839275222246405745257275088548364400416034343698203885627773350895, + 21888242871839275222246405745257275088548364400416034343698203912782449753376, + 21888242871839275222246405745257275088548364400416034343698204049947471297198, + 112451186999583, + 111710116872629, + 521898559796753, + 21888242871839275222246405745257275088548364400416034343698203663701352893029, + 276602227126261, + 21888242871839275222246405745257275088548364400416034343698204120913388211628, + 21888242871839275222246405745257275088548364400416034343698203660854051179779, + 108527816250697, + 21888242871839275222246405745257275088548364400416034343698204165543338299368, + 21888242871839275222246405745257275088548364400416034343698203836948125995153, + 21888242871839275222246405745257275088548364400416034343698203928955875546570, + 335452127497134, + 21888242871839275222246405745257275088548364400416034343698204030019110628993, + 28058936077175, + 442195814628745, + 539410836168953, + 169334843808601, + 21888242871839275222246405745257275088548364400416034343698203660292777736334, + 21888242871839275222246405745257275088548364400416034343698203783490485486853, + 21888242871839275222246405745257275088548364400416034343698203696665739599444, + 225735638817554, + 21888242871839275222246405745257275088548364400416034343698203716804125396049, + 21888242871839275222246405745257275088548364400416034343698204085098803452013, + 21888242871839275222246405745257275088548364400416034343698203971514933796667, + 395853909535495, + 21888242871839275222246405745257275088548364400416034343698203788820690561040, + 275699538431909, + 21888242871839275222246405745257275088548364400416034343698203710940296856454, + 21888242871839275222246405745257275088548364400416034343698204160006115046885, + 21888242871839275222246405745257275088548364400416034343698204132490926526316, + 422040371419932, + 387039071028103, + 387195448138409, + 395167123406801, + 319643053939461, + 21888242871839275222246405745257275088548364400416034343698203831325408684218, + 21888242871839275222246405745257275088548364400416034343698203747855687737910, + 472689052777695, + 327651609349252, + 160591129900300, + 546596118885323, + 491815515003431, + 21888242871839275222246405745257275088548364400416034343698204173825727816746, + 21888242871839275222246405745257275088548364400416034343698204071177675736644, + 27449447800564, + 21888242871839275222246405745257275088548364400416034343698203871092261975699, + 11237790115890, + 375060417336442, + 21888242871839275222246405745257275088548364400416034343698203713738759838610, + 192824624791314, + 21888242871839275222246405745257275088548364400416034343698204179756348949855, + 21888242871839275222246405745257275088548364400416034343698203913925303442556, + 212574626124793, + 425935113088437, + 150417964556458, + 21888242871839275222246405745257275088548364400416034343698204047330660338848, + 549498865260248, + 21888242871839275222246405745257275088548364400416034343698203868608737237240, + 529620032255443, + 14407120568526, + 171573914601566, + 367720697285124, + 21888242871839275222246405745257275088548364400416034343698203853881806662750, + 21888242871839275222246405745257275088548364400416034343698203903990733193435, + 405605188434948, + 21888242871839275222246405745257275088548364400416034343698204124336505504147, + 218832608417567, + 232871836140773, + 21888242871839275222246405745257275088548364400416034343698204008373034774855, + 5838634286285, + 1770456590522, + 379675254182918, + 218975810176211, + 21888242871839275222246405745257275088548364400416034343698203964236430958192, + 507756459061294, + 21888242871839275222246405745257275088548364400416034343698203874670941184037, + 461263214130930, + 21888242871839275222246405745257275088548364400416034343698203889581801137130, + 120039851880669, + 407362822070006, + 21888242871839275222246405745257275088548364400416034343698203906247251706223, + 514617776065459, + 510107162952539, + 503678474789689, + 304001672176002, + 466587898427850, + 21888242871839275222246405745257275088548364400416034343698203828073762994726, + 21888242871839275222246405745257275088548364400416034343698203845579401935372, + 21888242871839275222246405745257275088548364400416034343698203938261693670659, + 126375024452370, + 21888242871839275222246405745257275088548364400416034343698204103701212716031, + 228780095235706, + 501293348193651, + 21888242871839275222246405745257275088548364400416034343698203781190433354908, + 21888242871839275222246405745257275088548364400416034343698203930496111721206, + 6685074744604, + 552325403591570, + 21888242871839275222246405745257275088548364400416034343698204052799089517300, + 456760066713850, + 21888242871839275222246405745257275088548364400416034343698204040184429638405, + 476148877336333, + 21888242871839275222246405745257275088548364400416034343698203698426680877793, + 21888242871839275222246405745257275088548364400416034343698204078954558694304, + 21888242871839275222246405745257275088548364400416034343698203710782193414713, + 58366936253700, + 21888242871839275222246405745257275088548364400416034343698204037989555583729, + 79030150041580, + 184384353682102, + 21888242871839275222246405745257275088548364400416034343698204091794655172650, + 133559005834403, + 71480661381437, + 21888242871839275222246405745257275088548364400416034343698203867236568172267, + 21888242871839275222246405745257275088548364400416034343698203660292950073640, + 147409952315320, + 133820365335167, + 21888242871839275222246405745257275088548364400416034343698204066591963246061, + 21888242871839275222246405745257275088548364400416034343698203993255575371062, + 21888242871839275222246405745257275088548364400416034343698203758896073244902, + 169358462439869, + 21888242871839275222246405745257275088548364400416034343698203802460871443600, + 175719869724673, + 21888242871839275222246405745257275088548364400416034343698203705894436669382, + 21888242871839275222246405745257275088548364400416034343698203903942884210031, + 39401175911798, + 375515849354212, + 81881505478224, + 440483249224709, + 21888242871839275222246405745257275088548364400416034343698203982539412291090, + 273434253247856, + 21888242871839275222246405745257275088548364400416034343698204005828534354987, + 21888242871839275222246405745257275088548364400416034343698203787409127095589, + 21888242871839275222246405745257275088548364400416034343698203810722653432054, + 21888242871839275222246405745257275088548364400416034343698203732304545616628, + 390765452370400, + 546729737807941, + 314801374014860, + 522903811987495, + 21888242871839275222246405745257275088548364400416034343698203959618987320277, + 85906593450326, + 21888242871839275222246405745257275088548364400416034343698203654994633995760, + 21888242871839275222246405745257275088548364400416034343698203705784276019765, + 229092857170850, + 21888242871839275222246405745257275088548364400416034343698203840200010097738, + 21888242871839275222246405745257275088548364400416034343698204147889092944086, + 77239765436120, + 21888242871839275222246405745257275088548364400416034343698203650671783489990, + 497526278564253, + 168183261422302, + 21888242871839275222246405745257275088548364400416034343698203887027150441972, + 21888242871839275222246405745257275088548364400416034343698203663917320875481, + 21888242871839275222246405745257275088548364400416034343698204063016198547739, + 376928872366821, + 385533017793148, + 291691667158588, + 45773428158271, + 69274014403997, + 262383024115323, + 21888242871839275222246405745257275088548364400416034343698203778076932925252, + 21888242871839275222246405745257275088548364400416034343698203711489599068902, + 334146951337140, + 197998817742161, + 21888242871839275222246405745257275088548364400416034343698204023922956047930, + 324201801911837, + 21888242871839275222246405745257275088548364400416034343698203988117468285410, + 21888242871839275222246405745257275088548364400416034343698203772985215456253, + 293826181663256, + 474040518223873, + 469993982283610, + 17141941028603, + 323700953010271, + 499466518142838, + 21888242871839275222246405745257275088548364400416034343698204131573785996781, + 461856950340297, + 21888242871839275222246405745257275088548364400416034343698203890879719644376, + 360067461186383, + 21888242871839275222246405745257275088548364400416034343698203862336411392217, + 4933417387578, + 105354125523843, + 21888242871839275222246405745257275088548364400416034343698203967813670580957, + 21888242871839275222246405745257275088548364400416034343698203814578638956544, + 292549335769403, + 21888242871839275222246405745257275088548364400416034343698203690934071103274, + 257629626372237, + 433778694887737, + 21888242871839275222246405745257275088548364400416034343698203935366322616651, + 260587849628865, + 21888242871839275222246405745257275088548364400416034343698203890413931404981, + 21888242871839275222246405745257275088548364400416034343698203794365187546760, + 302563904335154, + 21888242871839275222246405745257275088548364400416034343698203930643399917803, + 146987926453340, + 21888242871839275222246405745257275088548364400416034343698204164352648851995, + 145470047052099, + 71724647323333, + 21888242871839275222246405745257275088548364400416034343698203956059176982700, + 21888242871839275222246405745257275088548364400416034343698204003904771514351, + 269667861869083, + 21888242871839275222246405745257275088548364400416034343698204024215657212644, + 555408407103086, + 21888242871839275222246405745257275088548364400416034343698203874398068843868, + 257942157877275, + 488548888620990, + 21888242871839275222246405745257275088548364400416034343698203997166825517259, + 21888242871839275222246405745257275088548364400416034343698203707032093964102, + 21888242871839275222246405745257275088548364400416034343698204174263321335484, + 236410709442778, + 491150981128970, + 170652621459016, + 21888242871839275222246405745257275088548364400416034343698203913231770968377, + 426393043095197, + 95866433779937, + 443165519453506, + 21888242871839275222246405745257275088548364400416034343698203746683004251124, + 21888242871839275222246405745257275088548364400416034343698203852998273025979, + 105665658787094, + 245800228148558, + 481616601617845, + 21888242871839275222246405745257275088548364400416034343698203639933789594671, + 21888242871839275222246405745257275088548364400416034343698203976036226424391, + 31578350291739, + 63405189628100, + 21888242871839275222246405745257275088548364400416034343698203851908159601374, + 226876673747627, + 227394429054181, + 21888242871839275222246405745257275088548364400416034343698204101403008107451, + 21888242871839275222246405745257275088548364400416034343698203637423612959892, + 88489352580266, + 21888242871839275222246405745257275088548364400416034343698203713976619986748, + 43067646685243, + 385886417596480, + 21888242871839275222246405745257275088548364400416034343698203996061088801529, + 409109442919875, + 87221613317771, + 21888242871839275222246405745257275088548364400416034343698203992236043106391, + 438053055259220, + 454361273123331, + 124172284179882, + 21888242871839275222246405745257275088548364400416034343698203762242304188017, + 292311344073868, + 348598723543446, + 40198505343260, + 532514076044592, + 294561369223330, + 213142401947685, + 163569767176995, + 21888242871839275222246405745257275088548364400416034343698204018762814002521, + 21888242871839275222246405745257275088548364400416034343698203803904873848912, + 90492844792126, + 200601691200022, + 84771411347524, + 21888242871839275222246405745257275088548364400416034343698203876401161037586, + 158965246960820, + 21888242871839275222246405745257275088548364400416034343698204017805688000259, + 21888242871839275222246405745257275088548364400416034343698203941799927802282, + 73073012771741, + 21888242871839275222246405745257275088548364400416034343698203814099837145189, + 21888242871839275222246405745257275088548364400416034343698204109321691689157, + 21888242871839275222246405745257275088548364400416034343698203819467981847346, + 21888242871839275222246405745257275088548364400416034343698204107040411753908, + 335850334175718, + 21888242871839275222246405745257275088548364400416034343698204059928902139444, + 394262775561467, + 21888242871839275222246405745257275088548364400416034343698204000747189050182, + 21888242871839275222246405745257275088548364400416034343698203711277280103949, + 21888242871839275222246405745257275088548364400416034343698203971328459606423, + 527304297246052, + 21888242871839275222246405745257275088548364400416034343698204128345921524520, + 21888242871839275222246405745257275088548364400416034343698203709309027638549, + 244729642961544, + 460955473495181, + 21888242871839275222246405745257275088548364400416034343698204165016833326621, + 404792891235434, + 21888242871839275222246405745257275088548364400416034343698204174380562701577, + 250821595972533, + 185045121885790, + 317138778434337, + 292878185941941, + 21888242871839275222246405745257275088548364400416034343698203650193779363649, + 305693513144288, + 21888242871839275222246405745257275088548364400416034343698203981419281916751, + 93795642568111, + 297388133208224, + 125917765503720, + 516670892574359, + 501322261641200, + 21888242871839275222246405745257275088548364400416034343698203640360437759680, + 21888242871839275222246405745257275088548364400416034343698203715306199553035, + 21888242871839275222246405745257275088548364400416034343698203821682196565190, + 21888242871839275222246405745257275088548364400416034343698204164181965924625, + 204804288755911, + 21888242871839275222246405745257275088548364400416034343698204167249251694004, + 21888242871839275222246405745257275088548364400416034343698203957147036734738, + 21888242871839275222246405745257275088548364400416034343698203670756480188414, + 52710383544987, + 21888242871839275222246405745257275088548364400416034343698203783241119363553, + 459626897728143, + 554019102687892, + 21888242871839275222246405745257275088548364400416034343698203970873608070284, + 21888242871839275222246405745257275088548364400416034343698203845434132621741, + 108214599624910, + 168491082672063, + 21888242871839275222246405745257275088548364400416034343698204176118493238945, + 211026131666118, + 183393298399513, + 21888242871839275222246405745257275088548364400416034343698203657069305959575, + 160099980159558, + 189519976023893, + 437399218156110, + 229711762200089, + 52527271882499, + 21888242871839275222246405745257275088548364400416034343698204144342089002050, + 58345512314662, + 21888242871839275222246405745257275088548364400416034343698204059360580808214, + 385749612061662, + 21888242871839275222246405745257275088548364400416034343698203792423420415384, + 21888242871839275222246405745257275088548364400416034343698203895425808081996, + 16338302334336, + 210700419864484, + 21888242871839275222246405745257275088548364400416034343698203941031594762102, + 320193440747062, + 21888242871839275222246405745257275088548364400416034343698203642952129658032, + 21888242871839275222246405745257275088548364400416034343698203683166767208342, + 211303044427107, + 544740480713800, + 21888242871839275222246405745257275088548364400416034343698203862932508281660, + 538544461227706, + 373071312142597, + 363946821147843, + 21888242871839275222246405745257275088548364400416034343698204044421901396383, + 62613956036749, + 77399931219597, + 413040179093282, + 225180461609113, + 431456601477296, + 195769248818916, + 56900916650018, + 354088684074656, + 21888242871839275222246405745257275088548364400416034343698204008775066068610, + 21888242871839275222246405745257275088548364400416034343698203863330240381640, + 21888242871839275222246405745257275088548364400416034343698203674947546306388, + 113937609374828, + 345547147955790, + 21888242871839275222246405745257275088548364400416034343698203934601816020195, + 21888242871839275222246405745257275088548364400416034343698203806893274774616, + 21888242871839275222246405745257275088548364400416034343698203667680342075663, + 266085516926623, + 392009253583041, + 21888242871839275222246405745257275088548364400416034343698203866265260345614, + 21888242871839275222246405745257275088548364400416034343698203811240169272505, + 21888242871839275222246405745257275088548364400416034343698204023536183161303, + 540869995423000, + 21888242871839275222246405745257275088548364400416034343698203823732325118987, + 231669924455943, + 254910207425891, + 152918828670175, + 176986516275138, + 441416751502064, + 247294596242136, + 21888242871839275222246405745257275088548364400416034343698204026710681929978, + 250452286507464, + 21888242871839275222246405745257275088548364400416034343698203677386544378513, + 331877418922984, + 522658698217366, + 21888242871839275222246405745257275088548364400416034343698204103034774671331, + 370040477528577, + 21888242871839275222246405745257275088548364400416034343698203980472841834412, + 21888242871839275222246405745257275088548364400416034343698203665720802293709, + 268066419738585, + 205229797615034, + 21888242871839275222246405745257275088548364400416034343698203904069846834606, + 233432857684709, + 21888242871839275222246405745257275088548364400416034343698203970084305471395, + 21888242871839275222246405745257275088548364400416034343698203952665985395897, + 117067214161650, + 453459663406742, + 232394096810921, + 21888242871839275222246405745257275088548364400416034343698203877898531540537, + 21888242871839275222246405745257275088548364400416034343698204050519155711315, + 21888242871839275222246405745257275088548364400416034343698204117048258635828, + 180098037505429, + 21888242871839275222246405745257275088548364400416034343698204173006976885488, + 21888242871839275222246405745257275088548364400416034343698203816767437548147, + 21888242871839275222246405745257275088548364400416034343698204028338026659681, + 91745822826992, + 371641253249161, + 539886334807161, + 21888242871839275222246405745257275088548364400416034343698204054983416535053, + 21888242871839275222246405745257275088548364400416034343698203799020971886462, + 21888242871839275222246405745257275088548364400416034343698203955473547436257, + 120111197853001, + 315835798912650, + 524488383636159, + 21888242871839275222246405745257275088548364400416034343698203649363755647858, + 21888242871839275222246405745257275088548364400416034343698203778146830510956, + 21888242871839275222246405745257275088548364400416034343698203779653293933097, + 21888242871839275222246405745257275088548364400416034343698203929850508070079, + 256070275073283, + 180501243770491, + 21888242871839275222246405745257275088548364400416034343698204111530526263248, + 387259290652466, + 21888242871839275222246405745257275088548364400416034343698204181225467790037, + 21888242871839275222246405745257275088548364400416034343698203682822322677221, + 21888242871839275222246405745257275088548364400416034343698204051337132631971, + 141226537729224, + 187314957923879, + 21888242871839275222246405745257275088548364400416034343698203828398145843857, + 85266489799076, + 21888242871839275222246405745257275088548364400416034343698203668076216498355, + 36585654706550, + 21888242871839275222246405745257275088548364400416034343698203839814078268743, + 21888242871839275222246405745257275088548364400416034343698203935500908127191, + 557635374121313, + 202328036896765, + 21888242871839275222246405745257275088548364400416034343698204119902219693795, + 21888242871839275222246405745257275088548364400416034343698204027202179110258, + 21888242871839275222246405745257275088548364400416034343698204072006403228956, + 55272621402388, + 21888242871839275222246405745257275088548364400416034343698203754408130398287, + 65527348649530, + 208224777610819, + 21888242871839275222246405745257275088548364400416034343698203787790292888617, + 404160542504682, + 21888242871839275222246405745257275088548364400416034343698203799249655884982, + 21888242871839275222246405745257275088548364400416034343698203955725315455283, + 21888242871839275222246405745257275088548364400416034343698203865829512152317, + 21888242871839275222246405745257275088548364400416034343698203664162000461549, + 21888242871839275222246405745257275088548364400416034343698203820613293219405, + 161527463409783, + 21888242871839275222246405745257275088548364400416034343698203682254744648262, + 21888242871839275222246405745257275088548364400416034343698204097741170920991, + 21888242871839275222246405745257275088548364400416034343698204030145159389765, + 21888242871839275222246405745257275088548364400416034343698204103472810589876, + 21888242871839275222246405745257275088548364400416034343698203884703835317845, + 21888242871839275222246405745257275088548364400416034343698203869140422484257, + 21888242871839275222246405745257275088548364400416034343698203961943186270499, + 21888242871839275222246405745257275088548364400416034343698203976145387178764, + 137362016039700, + 21888242871839275222246405745257275088548364400416034343698203630553530680829, + 473684641294423, + 363877772845263, + 21888242871839275222246405745257275088548364400416034343698203884721166446924, + 21888242871839275222246405745257275088548364400416034343698204156884627635867, + 21888242871839275222246405745257275088548364400416034343698203833852239812274, + 69101476236951, + 21888242871839275222246405745257275088548364400416034343698203635728736070024, + 97374188900268, + 192233271028857, + 150205057954995, + 21888242871839275222246405745257275088548364400416034343698203952526528078309, + 248270184737448, + 21888242871839275222246405745257275088548364400416034343698204014283309605527, + 551699345841533, + 21888242871839275222246405745257275088548364400416034343698203809343057233853, + 235524690365109, + 269709474104206, + 21888242871839275222246405745257275088548364400416034343698203852221372682940, + 538939349379872, + 557414760728816, + 524357567353951, + 17134795601539, + 21888242871839275222246405745257275088548364400416034343698204057204063829205, + 21888242871839275222246405745257275088548364400416034343698203722633129940783, + 21888242871839275222246405745257275088548364400416034343698204128147606222577, + 21888242871839275222246405745257275088548364400416034343698203678402236477985, + 21888242871839275222246405745257275088548364400416034343698203843113767581473, + 21888242871839275222246405745257275088548364400416034343698203695032002475602, + 190746490795402, + 530683156708203, + 164648263177831, + 550675174369914, + 445705410670803, + 21888242871839275222246405745257275088548364400416034343698203663361094393135, + 214237729362710, + 21888242871839275222246405745257275088548364400416034343698203893344464890629, + 21888242871839275222246405745257275088548364400416034343698203951258242467733, + 21888242871839275222246405745257275088548364400416034343698204161453360568998, + 268300206769393, + 21888242871839275222246405745257275088548364400416034343698203798938683164039, + 166172011437890, + 21888242871839275222246405745257275088548364400416034343698204134248456537611, + 514127686400357, + 21888242871839275222246405745257275088548364400416034343698203922634387647087, + 21888242871839275222246405745257275088548364400416034343698203856263946650795, + 21888242871839275222246405745257275088548364400416034343698203941902965759273, + 65396098253140, + 500376031003642, + 21888242871839275222246405745257275088548364400416034343698204060876703226307, + 21888242871839275222246405745257275088548364400416034343698203673964426709673, + 333496003796499, + 347677777853799, + 112419638844197, + 21888242871839275222246405745257275088548364400416034343698204014290024366671, + 21888242871839275222246405745257275088548364400416034343698204156010181627245, + 21888242871839275222246405745257275088548364400416034343698204034925654003518, + 293922368630687, + 354213130478599, + 162425210344236, + 561250293400598, + 336326951248832, + 299684699675326, + 21888242871839275222246405745257275088548364400416034343698204152526268395741, + 21888242871839275222246405745257275088548364400416034343698203881884758306747, + 21888242871839275222246405745257275088548364400416034343698204184136800048084, + 417278141856330, + 21888242871839275222246405745257275088548364400416034343698203927794774069568, + 28488578169152, + 21888242871839275222246405745257275088548364400416034343698203814833901124867, + 34852467996474, + 21888242871839275222246405745257275088548364400416034343698203967294972547450, + 95474418243989, + 189426027846911, + 297575628463973, + 21888242871839275222246405745257275088548364400416034343698203660942413740271, + 21888242871839275222246405745257275088548364400416034343698203633073044363095, + 378257919870831, + 311502270168221, + 21888242871839275222246405745257275088548364400416034343698204105905131056081, + 219539960083737, + 242434309460245, + 75332940648542, + 21888242871839275222246405745257275088548364400416034343698203746336728732093, + 4131906569327, + 168602437696941, + 107994119973596, + 21888242871839275222246405745257275088548364400416034343698203765470927262407, + 48288971905254, + 221722303843378, + 156514981180198, + 102607406843768, + 152251135148238, + 81124304232123, + 21888242871839275222246405745257275088548364400416034343698203775557011850533, + 21888242871839275222246405745257275088548364400416034343698203797282870314058, + 21888242871839275222246405745257275088548364400416034343698204092483155096388, + 21888242871839275222246405745257275088548364400416034343698203917250520191453, + 21888242871839275222246405745257275088548364400416034343698204103450413192694, + 362680427949858, + 109492765319948, + 21888242871839275222246405745257275088548364400416034343698204079117861487704, + 21888242871839275222246405745257275088548364400416034343698204011028387495491, + 21888242871839275222246405745257275088548364400416034343698203899771349981626, + 245077782892446, + 21888242871839275222246405745257275088548364400416034343698203996780603938385, + 166059073819578, + 21888242871839275222246405745257275088548364400416034343698204114970842753570, + 21888242871839275222246405745257275088548364400416034343698203742885207881849, + 273407010338038, + 229302251061395, + 21888242871839275222246405745257275088548364400416034343698203953933345994877, + 429781216214629, + 239873549385532, + 244943721144614, + 299182500334093, + 21888242871839275222246405745257275088548364400416034343698204151524230248730, + 544978182360148, + 21888242871839275222246405745257275088548364400416034343698204092263608643870, + 520441728879242, + 416708485991280, + 21888242871839275222246405745257275088548364400416034343698203974335181367996, + 21888242871839275222246405745257275088548364400416034343698203701655004837599, + 326371212248677, + 138675903914737, + 518265907210070, + 21888242871839275222246405745257275088548364400416034343698203640221599147284, + 538589471375663, + 221247053152115, + 457313766804495, + 21888242871839275222246405745257275088548364400416034343698204072636577415245, + 21888242871839275222246405745257275088548364400416034343698203826366020835181, + 21888242871839275222246405745257275088548364400416034343698203647846411755322, + 21888242871839275222246405745257275088548364400416034343698203640057814670622, + 21888242871839275222246405745257275088548364400416034343698204063623427158479, + 21888242871839275222246405745257275088548364400416034343698204096928975594514, + 287787453976674, + 21888242871839275222246405745257275088548364400416034343698203742927920832745, + 21888242871839275222246405745257275088548364400416034343698203682855199361393, + 333223370231984, + 21888242871839275222246405745257275088548364400416034343698203988803652868225, + 21888242871839275222246405745257275088548364400416034343698203667645564279737, + 179411988099522, + 21888242871839275222246405745257275088548364400416034343698203978226066811652, + 21888242871839275222246405745257275088548364400416034343698204056504333144107, + 21888242871839275222246405745257275088548364400416034343698204168685451609744, + 285149792206977, + 475747311289606, + 21888242871839275222246405745257275088548364400416034343698204036378475981874, + 273612689441329, + 238285119245344, + 21888242871839275222246405745257275088548364400416034343698203972710256805799, + 21888242871839275222246405745257275088548364400416034343698203712867054093141, + 190871300513769, + 21888242871839275222246405745257275088548364400416034343698204011361873996785, + 21888242871839275222246405745257275088548364400416034343698203867558833682279, + 21888242871839275222246405745257275088548364400416034343698204043931938997965, + 21888242871839275222246405745257275088548364400416034343698203993778482486227, + 21888242871839275222246405745257275088548364400416034343698203675645146822238, + 74414619443584, + 451616164235463, + 21888242871839275222246405745257275088548364400416034343698204114885382259212, + 21888242871839275222246405745257275088548364400416034343698204152516779337078, + 21888242871839275222246405745257275088548364400416034343698203964615677353997, + 95738411314489, + 21888242871839275222246405745257275088548364400416034343698204031348696652375, + 21888242871839275222246405745257275088548364400416034343698203907281902247916, + 21888242871839275222246405745257275088548364400416034343698203770855084582026, + 21888242871839275222246405745257275088548364400416034343698203818616453064282, + 206584639655986, + 21888242871839275222246405745257275088548364400416034343698203661993644845527, + 378712711874601, + 81750188152533, + 63277359121978, + 186866351082629, + 21888242871839275222246405745257275088548364400416034343698203957084407364604, + 253542623678689, + 21888242871839275222246405745257275088548364400416034343698203761308151689510, + 395000670511179, + 170571186141527, + 46159896428010, + 262777808363223, + 21888242871839275222246405745257275088548364400416034343698204142672365883040, + 21888242871839275222246405745257275088548364400416034343698203938310329720693, + 433205151953446, + 205446576525014, + 384636020755604, + 183106254324574, + 21888242871839275222246405745257275088548364400416034343698204157251173680385, + 21888242871839275222246405745257275088548364400416034343698203784364064179393, + 416406771893745, + 21888242871839275222246405745257275088548364400416034343698204150013453985275, + 124026759314618, + 303199040839025, + 523793858801118, + 114324139773047, + 84457815565148, + 21888242871839275222246405745257275088548364400416034343698204045560900661856, + 21888242871839275222246405745257275088548364400416034343698203999873121970773, + 21888242871839275222246405745257275088548364400416034343698203705823182137959, + 426702712920330, + 21888242871839275222246405745257275088548364400416034343698204040336166493021, + 21888242871839275222246405745257275088548364400416034343698204011469361096581, + 467717006568905, + 21888242871839275222246405745257275088548364400416034343698203781083583499316, + 21888242871839275222246405745257275088548364400416034343698203942445184597327, + 21888242871839275222246405745257275088548364400416034343698204000715245922047, + 158593473991942, + 60136879444997, + 21888242871839275222246405745257275088548364400416034343698203841505337614240, + 21888242871839275222246405745257275088548364400416034343698204108955836584366, + 21888242871839275222246405745257275088548364400416034343698203866162054292491, + 49651102563353, + 21888242871839275222246405745257275088548364400416034343698203828377809692543, + 293868496505160, + 21888242871839275222246405745257275088548364400416034343698203930289358683276, + 316003218438744, + 21888242871839275222246405745257275088548364400416034343698203881917048891451, + 21888242871839275222246405745257275088548364400416034343698203699388793034401, + 21888242871839275222246405745257275088548364400416034343698203732599751487381, + 21888242871839275222246405745257275088548364400416034343698203827516266653244, + 390695014194357, + 21888242871839275222246405745257275088548364400416034343698203672363658756583, + 228174324032595, + 207935332162630, + 141714996979585, + 217772375578522, + 353005810935078, + 21888242871839275222246405745257275088548364400416034343698203691531176961484, + 21888242871839275222246405745257275088548364400416034343698204148466145627315, + 417647961941410, + 261759632080592, + 333649225187620, + 21888242871839275222246405745257275088548364400416034343698203815000188277906, + 17497785064501, + 543882024212188, + 21888242871839275222246405745257275088548364400416034343698203817866726984808, + 376870012657755, + 267678492744029, + 21888242871839275222246405745257275088548364400416034343698203709479809479364, + 21888242871839275222246405745257275088548364400416034343698203915160206345515, + 184225020021291, + 498634496264221, + 21888242871839275222246405745257275088548364400416034343698203686316432337709, + 21888242871839275222246405745257275088548364400416034343698203876832876260552, + 316705185228350, + 21888242871839275222246405745257275088548364400416034343698203660662369084249, + 21888242871839275222246405745257275088548364400416034343698203772661289995399, + 222723365069447, + 21888242871839275222246405745257275088548364400416034343698204095404118115195, + 419255200439120, + 460300603522917, + 106384300656688, + 21888242871839275222246405745257275088548364400416034343698204043472766778453, + 21454248775882, + 21888242871839275222246405745257275088548364400416034343698203761099649534814, + 559374532386874, + 21888242871839275222246405745257275088548364400416034343698203979908453192561, + 21888242871839275222246405745257275088548364400416034343698203761189640945823, + 514051580913157, + 21888242871839275222246405745257275088548364400416034343698204119551340829058, + 364028351197206, + 21888242871839275222246405745257275088548364400416034343698204129437343615033, + 149860147180266, + 21888242871839275222246405745257275088548364400416034343698203731835858106786, + 21888242871839275222246405745257275088548364400416034343698204018278376439394, + 21888242871839275222246405745257275088548364400416034343698203901045860031680, + 21888242871839275222246405745257275088548364400416034343698203996342481544760, + 21888242871839275222246405745257275088548364400416034343698203910465645621786, + 150454634798030, + 421697168825632, + 21888242871839275222246405745257275088548364400416034343698203909822994479050, + 21888242871839275222246405745257275088548364400416034343698204130367315731674, + 133591310726915, + 21888242871839275222246405745257275088548364400416034343698204020599199845458, + 21888242871839275222246405745257275088548364400416034343698203655211089383866, + 379828189815133, + 494830029822425, + 21888242871839275222246405745257275088548364400416034343698203847760809676760, + 339336012967839, + 228829658310604, + 351083964840807, + 209027425995282, + 21888242871839275222246405745257275088548364400416034343698203969654166965149, + 21888242871839275222246405745257275088548364400416034343698204177986973368277, + 21888242871839275222246405745257275088548364400416034343698204175836904798510, + 21888242871839275222246405745257275088548364400416034343698204177238187716026, + 21888242871839275222246405745257275088548364400416034343698204121588888588905, + 433606798019239, + 488938586268655, + 536923675703947, + 21888242871839275222246405745257275088548364400416034343698204116407135144961, + 21888242871839275222246405745257275088548364400416034343698203715130455839692, + 99856257905753, + 184864260910794, + 108241279495853, + 21888242871839275222246405745257275088548364400416034343698204098894102553157, + 157934681585955, + 21888242871839275222246405745257275088548364400416034343698203849525304505463, + 370721424625078, + 322296253438760, + 425139658936868, + 21888242871839275222246405745257275088548364400416034343698203881181298766908, + 44553416059035, + 492745912506868, + 396487783851690, + 468857444336002, + 454384489934260, + 233731323582144, + 30776965131721, + 21888242871839275222246405745257275088548364400416034343698203975185018305565, + 21888242871839275222246405745257275088548364400416034343698204057282742048680, + 375858355148791, + 526460432217457, + 141589111909230, + 264840687981662, + 21888242871839275222246405745257275088548364400416034343698203996224084700503, + 21888242871839275222246405745257275088548364400416034343698203755372101044807, + 366402662171160, + 221972539496751, + 21888242871839275222246405745257275088548364400416034343698203895043577012916, + 147865414073212, + 21888242871839275222246405745257275088548364400416034343698204073748657290981, + 21888242871839275222246405745257275088548364400416034343698204038220390459666, + 39985784748975, + 300140486800345, + 57741778388188, + 21888242871839275222246405745257275088548364400416034343698203995523170142451, + 256291685013123, + 277322701508746, + 455805378146876, + 21888242871839275222246405745257275088548364400416034343698203635586298738848, + 21888242871839275222246405745257275088548364400416034343698203799038298692039, + 21888242871839275222246405745257275088548364400416034343698203875214025292263, + 21888242871839275222246405745257275088548364400416034343698203685844420697289, + 21888242871839275222246405745257275088548364400416034343698204041215428400496, + 21888242871839275222246405745257275088548364400416034343698203840619699650929, + 5346520508415, + 425056719436882, + 277260233954847, + 21888242871839275222246405745257275088548364400416034343698203742139615330322, + 471426158292798, + 237319913025553, + 197409075364034, + 21888242871839275222246405745257275088548364400416034343698203719094146612759, + 21888242871839275222246405745257275088548364400416034343698203734685173024127, + 21888242871839275222246405745257275088548364400416034343698203928934137962324, + 25575814978778, + 82203179247590, + 21888242871839275222246405745257275088548364400416034343698203918585692711693, + 126917786892335, + 21888242871839275222246405745257275088548364400416034343698203921738903762907, + 21888242871839275222246405745257275088548364400416034343698204073421354086331, + 21888242871839275222246405745257275088548364400416034343698203667114974007961, + 21888242871839275222246405745257275088548364400416034343698203824028862830519, + 458977107704909, + 21888242871839275222246405745257275088548364400416034343698203993134859144290, + 71119870747240, + 241450200013052, + 202533738638112, + 433716698440019, + 329259701454520, + 21888242871839275222246405745257275088548364400416034343698203766395531406232, + 21888242871839275222246405745257275088548364400416034343698203626424547438365, + 21888242871839275222246405745257275088548364400416034343698204185281004151354, + 21888242871839275222246405745257275088548364400416034343698203880928003490825, + 21888242871839275222246405745257275088548364400416034343698203828191255727317, + 21888242871839275222246405745257275088548364400416034343698204059946813307190, + 21888242871839275222246405745257275088548364400416034343698204001772688290726, + 21888242871839275222246405745257275088548364400416034343698204158990693799767, + 21888242871839275222246405745257275088548364400416034343698203784997659245481, + 269095559336447, + 289938649195430, + 21888242871839275222246405745257275088548364400416034343698203790370771092712, + 21888242871839275222246405745257275088548364400416034343698203898077380216430, + 420700711563069, + 21888242871839275222246405745257275088548364400416034343698204116594802070540, + 153267413754037, + 207339038434618, + 109592060770135, + 21888242871839275222246405745257275088548364400416034343698203727595700732103, + 234304653738085, + 21888242871839275222246405745257275088548364400416034343698203844332655153643, + 21888242871839275222246405745257275088548364400416034343698204016365720613411, + 359621556815161, + 21888242871839275222246405745257275088548364400416034343698203738713070731918, + 231590410740278, + 264746744956277, + 52570796318909, + 108692010657975, + 286349516460403, + 557889787945479, + 160574398608983, + 116672967768313, + 307209514799216, + 88868193690744, + 21888242871839275222246405745257275088548364400416034343698203886713787769916, + 120999923909736, + 520216362691114, + 21888242871839275222246405745257275088548364400416034343698203834854416662983, + 21888242871839275222246405745257275088548364400416034343698203703390763117911, + 21888242871839275222246405745257275088548364400416034343698203701786001380405, + 204543684648444, + 487386082069602, + 21888242871839275222246405745257275088548364400416034343698203699918752746630, + 138406244394800, + 384899697202530, + 21888242871839275222246405745257275088548364400416034343698203984546393926685, + 323240178121954, + 21888242871839275222246405745257275088548364400416034343698203698489631436006, + 21888242871839275222246405745257275088548364400416034343698203906802426755790, + 21888242871839275222246405745257275088548364400416034343698203750269728700081, + 21888242871839275222246405745257275088548364400416034343698203664472421959625, + 336257187511532, + 490977096653423, + 21888242871839275222246405745257275088548364400416034343698204078526416689760, + 552173645810835, + 425493496207023, + 27708609358032, + 426857151925275, + 249481977524723, + 61865925771637, + 21888242871839275222246405745257275088548364400416034343698203712726914880064, + 21888242871839275222246405745257275088548364400416034343698203764611249974394, + 126452232437512, + 67071644954136, + 21888242871839275222246405745257275088548364400416034343698203928341769846477, + 21888242871839275222246405745257275088548364400416034343698203882491357051206, + 21888242871839275222246405745257275088548364400416034343698204122456015135993, + 188962715200586, + 21888242871839275222246405745257275088548364400416034343698203965187192587457, + 486682876027719, + 241659081907140, + 21888242871839275222246405745257275088548364400416034343698203798680283287642, + 21888242871839275222246405745257275088548364400416034343698204063068438834757, + 132946373394616, + 21888242871839275222246405745257275088548364400416034343698203814035214380169, + 21888242871839275222246405745257275088548364400416034343698204177901101455329, + 21888242871839275222246405745257275088548364400416034343698203999625729761250, + 21888242871839275222246405745257275088548364400416034343698204079699745948114, + 21888242871839275222246405745257275088548364400416034343698203638510489800845, + 462007821362836, + 366474356159812, + 313133029737663, + 21888242871839275222246405745257275088548364400416034343698204008714443128091, + 160912209593996, + 59646005972818, + 21888242871839275222246405745257275088548364400416034343698203904897247983988, + 480825042688336, + 21888242871839275222246405745257275088548364400416034343698203924478133913606, + 21888242871839275222246405745257275088548364400416034343698204184565484180449, + 21888242871839275222246405745257275088548364400416034343698203737434835554484, + 50232183259664, + 21888242871839275222246405745257275088548364400416034343698203891576793867351, + 21888242871839275222246405745257275088548364400416034343698204139473866516160, + 81635348120838, + 21888242871839275222246405745257275088548364400416034343698203867397256566086, + 443994126972923, + 147110138397341, + 21888242871839275222246405745257275088548364400416034343698204096738086856135, + 21888242871839275222246405745257275088548364400416034343698203674002870169428, + 21888242871839275222246405745257275088548364400416034343698204076895489068678, + 21888242871839275222246405745257275088548364400416034343698204061407168080459, + 21888242871839275222246405745257275088548364400416034343698204163817962195200, + 21888242871839275222246405745257275088548364400416034343698203917464366662698, + 21888242871839275222246405745257275088548364400416034343698204093472225654140, + 21888242871839275222246405745257275088548364400416034343698203915867165437932, + 365855878222470, + 21888242871839275222246405745257275088548364400416034343698203751656128028253, + 21888242871839275222246405745257275088548364400416034343698203825598426922089, + 21888242871839275222246405745257275088548364400416034343698204115346350712782, + 24890790499442, + 21888242871839275222246405745257275088548364400416034343698203912742305170466, + 267529578350357, + 200148458943583, + 21888242871839275222246405745257275088548364400416034343698204065476857988886, + 21888242871839275222246405745257275088548364400416034343698203861770645160184, + 21888242871839275222246405745257275088548364400416034343698203851310828298710, + 21888242871839275222246405745257275088548364400416034343698203916467208118789, + 21888242871839275222246405745257275088548364400416034343698203734109279550686, + 21888242871839275222246405745257275088548364400416034343698203911732714156472, + 21888242871839275222246405745257275088548364400416034343698203948578024057966, + 21888242871839275222246405745257275088548364400416034343698203994613833398769, + 21888242871839275222246405745257275088548364400416034343698204184433405201602, + 497715420294014, + 377731830733499, + 408632353654162, + 21888242871839275222246405745257275088548364400416034343698203669806807245662, + 21888242871839275222246405745257275088548364400416034343698203693041786885759, + 21888242871839275222246405745257275088548364400416034343698203627657104577813, + 403590351358937, + 397389243121644, + 287477430384575, + 21888242871839275222246405745257275088548364400416034343698203641251697740208, + 21888242871839275222246405745257275088548364400416034343698204031266938545505, + 21888242871839275222246405745257275088548364400416034343698204065822874262593, + 21888242871839275222246405745257275088548364400416034343698203865832636776483, + 251324013202304, + 440532574892183, + 469079112176829, + 21888242871839275222246405745257275088548364400416034343698203719063372094199, + 61787357633138, + 21888242871839275222246405745257275088548364400416034343698204097890464412800, + 21888242871839275222246405745257275088548364400416034343698204125891734480488, + 21888242871839275222246405745257275088548364400416034343698204040254524909728, + 29860864596862, + 21888242871839275222246405745257275088548364400416034343698204153013752845343, + 21888242871839275222246405745257275088548364400416034343698204105505566977487, + 186137587653856, + 59476917040758, + 342916628226313, + 21888242871839275222246405745257275088548364400416034343698204123309992815201, + 21888242871839275222246405745257275088548364400416034343698204001860671672363, + 347123704535340, + 394626630704258, + 21888242871839275222246405745257275088548364400416034343698203981567115634386, + 152639312825883, + 21888242871839275222246405745257275088548364400416034343698204006026304182289, + 369237499531804, + 21888242871839275222246405745257275088548364400416034343698203727397962373629, + 224229692999185, + 297701580435841, + 21888242871839275222246405745257275088548364400416034343698204137838404424330, + 71773610364336, + 17078609870501, + 21888242871839275222246405745257275088548364400416034343698203831788498716802, + 21888242871839275222246405745257275088548364400416034343698203755874491797886, + 21888242871839275222246405745257275088548364400416034343698204009345408523630, + 341116407539009, + 147253417130367, + 283823876518674, + 21888242871839275222246405745257275088548364400416034343698203959444702936618, + 21888242871839275222246405745257275088548364400416034343698204167339506359195, + 228720411499806, + 21888242871839275222246405745257275088548364400416034343698203894088016495531, + 108251692898511, + 21888242871839275222246405745257275088548364400416034343698203680638683368181, + 58968024259205, + 429026643073998, + 21888242871839275222246405745257275088548364400416034343698204072173005794245, + 420222968208256, + 274360454697146, + 21888242871839275222246405745257275088548364400416034343698204169020185517004, + 21888242871839275222246405745257275088548364400416034343698203819508007986129, + 316611426379916, + 21888242871839275222246405745257275088548364400416034343698204070344793856676, + 239420671912747, + 21888242871839275222246405745257275088548364400416034343698203822756912689326, + 21888242871839275222246405745257275088548364400416034343698203638404793887895, + 21888242871839275222246405745257275088548364400416034343698203973979358230517, + 321238643211040, + 21888242871839275222246405745257275088548364400416034343698203915300548358770, + 310192376839673, + 10772897749190, + 284130751936075, + 21888242871839275222246405745257275088548364400416034343698204139887003202431, + 21888242871839275222246405745257275088548364400416034343698204104372895334407, + 21888242871839275222246405745257275088548364400416034343698203917787198217511, + 21888242871839275222246405745257275088548364400416034343698203822808384663522, + 448855472899392, + 263884943817329, + 21888242871839275222246405745257275088548364400416034343698203988370010111422, + 59285241272333, + 76802569840995, + 182853509800535, + 21888242871839275222246405745257275088548364400416034343698203702028104469183, + 21888242871839275222246405745257275088548364400416034343698203865326774834958, + 497571636624189, + 521629354867968, + 187338940954788, + 21888242871839275222246405745257275088548364400416034343698203797287959924149, + 477662001534176, + 21888242871839275222246405745257275088548364400416034343698203991676312475351, + 21888242871839275222246405745257275088548364400416034343698203829124577943895, + 21888242871839275222246405745257275088548364400416034343698203774024822582654, + 21888242871839275222246405745257275088548364400416034343698204140803240503176, + 21888242871839275222246405745257275088548364400416034343698203878994104222556, + 276175753046924, + 21888242871839275222246405745257275088548364400416034343698204026734864948479, + 484981879008060, + 399355398504640, + 21888242871839275222246405745257275088548364400416034343698204162997796069607, + 21888242871839275222246405745257275088548364400416034343698203879383280901381, + 21888242871839275222246405745257275088548364400416034343698203702079190335614, + 203953239376595, + 21888242871839275222246405745257275088548364400416034343698203700726416838503, + 21888242871839275222246405745257275088548364400416034343698204002027643953375, + 21888242871839275222246405745257275088548364400416034343698204073982006201438, + 21888242871839275222246405745257275088548364400416034343698204055793094280835, + 315293481713665, + 56982448492753, + 21888242871839275222246405745257275088548364400416034343698203992713342903135, + 366849491614153, + 38662375668667, + 21888242871839275222246405745257275088548364400416034343698203933361165047090, + 21888242871839275222246405745257275088548364400416034343698203993082499332852, + 21888242871839275222246405745257275088548364400416034343698204180432775034032, + 79106490270462, + 21888242871839275222246405745257275088548364400416034343698203895870768519067, + 338929416983807, + 294925686591602, + 524998441724067, + 362334830837630, + 21888242871839275222246405745257275088548364400416034343698203801068588258144, + 451995407764699, + 82458259602259, + 21888242871839275222246405745257275088548364400416034343698203648192877620580, + 39376387801398, + 518577478876845, + 21888242871839275222246405745257275088548364400416034343698203771232342457530, + 21888242871839275222246405745257275088548364400416034343698204077410027890987, + 21888242871839275222246405745257275088548364400416034343698203717166343951797, + 21888242871839275222246405745257275088548364400416034343698203970412149741795, + 477819658445983, + 21888242871839275222246405745257275088548364400416034343698203802586088638016, + 21888242871839275222246405745257275088548364400416034343698203846181575727583, + 21888242871839275222246405745257275088548364400416034343698204030554998892953, + 21888242871839275222246405745257275088548364400416034343698203845568608649355, + 214737068485228, + 482952655611154, + 21888242871839275222246405745257275088548364400416034343698204057846010498336, + 500723254124503, + 208557106215323, + 19998447669109, + 539321375895804, + 21888242871839275222246405745257275088548364400416034343698203932533913033774, + 21888242871839275222246405745257275088548364400416034343698203680528616452045, + 515576096705567, + 21888242871839275222246405745257275088548364400416034343698203992636798675368, + 413494340255899, + 21888242871839275222246405745257275088548364400416034343698204142252969132172, + 19839068542384, + 21888242871839275222246405745257275088548364400416034343698204181176463061369, + 21888242871839275222246405745257275088548364400416034343698203689571664387877, + 21888242871839275222246405745257275088548364400416034343698203864713720677645, + 84610961506162, + 119806864275769, + 21888242871839275222246405745257275088548364400416034343698204043118305693915, + 457498006384872, + 21888242871839275222246405745257275088548364400416034343698203726879751310768, + 21888242871839275222246405745257275088548364400416034343698204173577153605120, + 21888242871839275222246405745257275088548364400416034343698203877023888158249, + 21888242871839275222246405745257275088548364400416034343698204104075103158817, + 349650820939712, + 21888242871839275222246405745257275088548364400416034343698204148968406142185, + 21888242871839275222246405745257275088548364400416034343698204069435023858490, + 21888242871839275222246405745257275088548364400416034343698204103776584915447, + 21888242871839275222246405745257275088548364400416034343698203990172037795349, + 252320176108102, + 214195002447595, + 21888242871839275222246405745257275088548364400416034343698204130666416163044, + 492084889305689, + 399296817608281, + 249523133355135, + 21888242871839275222246405745257275088548364400416034343698203846485988085712, + 352074052063501, + 75955419918655, + 21888242871839275222246405745257275088548364400416034343698203777647271293764, + 152093450764502, + 21888242871839275222246405745257275088548364400416034343698204053292347545651, + 12889153809876, + 21888242871839275222246405745257275088548364400416034343698203865733708708995, + 75059162737490, + 21888242871839275222246405745257275088548364400416034343698203827129265598191, + 167237612278165, + 326707705336253, + 21888242871839275222246405745257275088548364400416034343698203925780520799085, + 113017596935847, + 21888242871839275222246405745257275088548364400416034343698204116517307909345, + 418710549938869, + 18911425405906, + 21888242871839275222246405745257275088548364400416034343698203729308188574074, + 21888242871839275222246405745257275088548364400416034343698204168785615999630, + 46484286902356, + 21888242871839275222246405745257275088548364400416034343698204093975130261282, + 21888242871839275222246405745257275088548364400416034343698203712414229530987, + 21888242871839275222246405745257275088548364400416034343698204039323182534848, + 413848892480082, + 21888242871839275222246405745257275088548364400416034343698204029211052660408, + 366943544281588, + 370724031830703, + 21888242871839275222246405745257275088548364400416034343698204132314437822202, + 183026085637191, + 261653886302877, + 21888242871839275222246405745257275088548364400416034343698203868941685606502, + 27563118637750, + 21888242871839275222246405745257275088548364400416034343698203755249445931930, + 75597506739869, + 21888242871839275222246405745257275088548364400416034343698203988617477198762, + 21888242871839275222246405745257275088548364400416034343698203972268599472058, + 448326308766867, + 150578561246857, + 546429029275049, + 21888242871839275222246405745257275088548364400416034343698204168970668019333, + 21888242871839275222246405745257275088548364400416034343698203858190009421248, + 178726019127718, + 21888242871839275222246405745257275088548364400416034343698203869078661802663, + 370300288209357, + 21888242871839275222246405745257275088548364400416034343698203861048327033392, + 21888242871839275222246405745257275088548364400416034343698204122996874748366, + 21888242871839275222246405745257275088548364400416034343698204019607456387012, + 44863053581472, + 21888242871839275222246405745257275088548364400416034343698204153006326366534, + 212645269964602, + 21888242871839275222246405745257275088548364400416034343698203973823439475739, + 557080947425449, + 250406847932133, + 193226843653918, + 368067791877479, + 21888242871839275222246405745257275088548364400416034343698203943274913688329, + 496234469340063, + 437270564346905, + 248506726021202, + 21888242871839275222246405745257275088548364400416034343698203697942242131563, + 545738646885136, + 458286347054203, + 403401241165198, + 21888242871839275222246405745257275088548364400416034343698203630792304136641, + 21888242871839275222246405745257275088548364400416034343698204092891918493900, + 315170934789505, + 21888242871839275222246405745257275088548364400416034343698203692228080686962, + 21888242871839275222246405745257275088548364400416034343698203808777285938752, + 428198156707850, + 21888242871839275222246405745257275088548364400416034343698203752490161273817, + 314235042391923, + 400871356763577, + 21888242871839275222246405745257275088548364400416034343698203747429776983394, + 21888242871839275222246405745257275088548364400416034343698203681106360560336, + 462315244352600, + 21888242871839275222246405745257275088548364400416034343698203897663402928939, + 72493714064788, + 70540742828934, + 21888242871839275222246405745257275088548364400416034343698203791732886360175, + 21888242871839275222246405745257275088548364400416034343698204084035146122649, + 21888242871839275222246405745257275088548364400416034343698203854512879356292, + 21888242871839275222246405745257275088548364400416034343698204140788331368608, + 38400602415219, + 13655364631486, + 517927731346412, + 341908659069944, + 504888110607663, + 21888242871839275222246405745257275088548364400416034343698203767563636541531, + 21888242871839275222246405745257275088548364400416034343698203744291732689906, + 409873832073563, + 546119713913892, + 21888242871839275222246405745257275088548364400416034343698203875273568843650, + 347831906433306, + 351691251604592, + 29690897544315, + 442848249106196, + 8915695537762, + 20594199852147, + 21888242871839275222246405745257275088548364400416034343698203744134188653772, + 21888242871839275222246405745257275088548364400416034343698203841601830673292, + 121216573922986, + 21888242871839275222246405745257275088548364400416034343698203980091633562813, + 21888242871839275222246405745257275088548364400416034343698203863443250123270, + 305893893358431, + 21888242871839275222246405745257275088548364400416034343698204100749322723518, + 523032069663790, + 285182497984955, + 322878405231457, + 21888242871839275222246405745257275088548364400416034343698203705199605124659, + 21888242871839275222246405745257275088548364400416034343698204160101219702804, + 517983691033325, + 21888242871839275222246405745257275088548364400416034343698203865125722624401, + 21888242871839275222246405745257275088548364400416034343698203938523610116886, + 154016315474, + 21888242871839275222246405745257275088548364400416034343698203743547883196737, + 21888242871839275222246405745257275088548364400416034343698204181798642856198, + 50303023738716, + 54530942292211, + 21888242871839275222246405745257275088548364400416034343698203793489320794271, + 21888242871839275222246405745257275088548364400416034343698203724951150333227, + 101312557360456, + 20605331418166, + 366577353007129, + 21888242871839275222246405745257275088548364400416034343698203947038450220504, + 511646578892028, + 94274329050686, + 127151051155916, + 21888242871839275222246405745257275088548364400416034343698203658264835031029, + 21888242871839275222246405745257275088548364400416034343698204117384889836830, + 21888242871839275222246405745257275088548364400416034343698204106215004461964, + 431331929677612, + 245140304102338, + 321812279354893, + 21888242871839275222246405745257275088548364400416034343698203829179096507552, + 21888242871839275222246405745257275088548364400416034343698203630554751708845, + 173567756760734, + 440654476712118, + 418855289962891, + 276197159231895, + 21888242871839275222246405745257275088548364400416034343698203822230936126626, + 21888242871839275222246405745257275088548364400416034343698203964075829526861, + 16477187579861, + 283198399625278, + 21888242871839275222246405745257275088548364400416034343698204058039335773609, + 21888242871839275222246405745257275088548364400416034343698203816577624385190, + 554427802790636, + 193489449179031, + 21888242871839275222246405745257275088548364400416034343698203846843383439910, + 389056011547319, + 259429218036364, + 17682112221184, + 21888242871839275222246405745257275088548364400416034343698203877354850180481, + 21888242871839275222246405745257275088548364400416034343698203716163207438840, + 21888242871839275222246405745257275088548364400416034343698203993211929076079, + 21888242871839275222246405745257275088548364400416034343698203662772206781088, + 21888242871839275222246405745257275088548364400416034343698203644753773246584, + 245532296633745, + 21888242871839275222246405745257275088548364400416034343698204168665099277757, + 21888242871839275222246405745257275088548364400416034343698203687764698677153, + 21888242871839275222246405745257275088548364400416034343698203944382431106956, + 127961945933562, + 322063914111637, + 322187644980724, + 214251186779699, + 309542795436902, + 21888242871839275222246405745257275088548364400416034343698204031581072319740, + 21888242871839275222246405745257275088548364400416034343698204181730020469963, + 21888242871839275222246405745257275088548364400416034343698203694784330420296, + 21888242871839275222246405745257275088548364400416034343698204146290834864127, + 112164007086417, + 325135600675403, + 336920744498486, + 138600936854377, + 203546114886763, + 21888242871839275222246405745257275088548364400416034343698203747718646015875, + 426373873814509, + 21888242871839275222246405745257275088548364400416034343698203786768843513781, + 21888242871839275222246405745257275088548364400416034343698203739938958197947, + 21888242871839275222246405745257275088548364400416034343698203826817615530261, + 128006231212777, + 21888242871839275222246405745257275088548364400416034343698204052786860705891, + 283543996596927, + 21888242871839275222246405745257275088548364400416034343698203695694946148573, + 21888242871839275222246405745257275088548364400416034343698203767692227090933, + 157824638543870, + 21888242871839275222246405745257275088548364400416034343698204178691133188594, + 557290142540738, + 21888242871839275222246405745257275088548364400416034343698203768257547215435, + 288310322919280, + 21888242871839275222246405745257275088548364400416034343698203755338772524355, + 21888242871839275222246405745257275088548364400416034343698204104782707742369, + 21888242871839275222246405745257275088548364400416034343698204139629497483146, + 453517604720127, + 21888242871839275222246405745257275088548364400416034343698203914060994367931, + 21888242871839275222246405745257275088548364400416034343698203626605620946271, + 21888242871839275222246405745257275088548364400416034343698203900431865108825, + 68399231608281, + 21888242871839275222246405745257275088548364400416034343698204028456384263264, + 397477778624672, + 245469110227931, + 406130384993853, + 421490290111083, + 21888242871839275222246405745257275088548364400416034343698203915681156455865, + 21888242871839275222246405745257275088548364400416034343698204117642941897919, + 21888242871839275222246405745257275088548364400416034343698203912268919324723, + 21888242871839275222246405745257275088548364400416034343698204092486460711712, + 122566366955925, + 328700321973685, + 416940254121440, + 21888242871839275222246405745257275088548364400416034343698203814079197551937, + 21888242871839275222246405745257275088548364400416034343698203676616174872655, + 70297017106243, + 21888242871839275222246405745257275088548364400416034343698203894456411915549, + 21888242871839275222246405745257275088548364400416034343698204026053937295004, + 243364390353964, + 21888242871839275222246405745257275088548364400416034343698203741743335846823, + 179061811697626, + 190457706330535, + 3888890808804, + 21888242871839275222246405745257275088548364400416034343698203995639166925066, + 21888242871839275222246405745257275088548364400416034343698203720007062629672, + 21888242871839275222246405745257275088548364400416034343698203634823608111084, + 21888242871839275222246405745257275088548364400416034343698203625205475651329, + 21888242871839275222246405745257275088548364400416034343698203923976566912825, + 280243306107194, + 21888242871839275222246405745257275088548364400416034343698204047194884799791, + 247055956565371, + 1061376686168, + 392743705125862, + 481365984043959, + 358495769584894, + 21888242871839275222246405745257275088548364400416034343698204013194765585332, + 21888242871839275222246405745257275088548364400416034343698204049047742292304, + 21888242871839275222246405745257275088548364400416034343698203719893630510375, + 304270481270586, + 374162035001780, + 21888242871839275222246405745257275088548364400416034343698204155416271812865, + 21888242871839275222246405745257275088548364400416034343698204007167816982445, + 21888242871839275222246405745257275088548364400416034343698203918269248641201, + 21888242871839275222246405745257275088548364400416034343698203991593955044591, + 439436024817900, + 21888242871839275222246405745257275088548364400416034343698204179630089766203, + 21888242871839275222246405745257275088548364400416034343698203992557850090548, + 21888242871839275222246405745257275088548364400416034343698203655137049769992, + 21888242871839275222246405745257275088548364400416034343698203799699021044859, + 45571307647812, + 448455197411312, + 354427164874966, + 21888242871839275222246405745257275088548364400416034343698204153692844480987, + 509765870551251, + 21888242871839275222246405745257275088548364400416034343698204110255245855694, + 444923850349748, + 252651006572672, + 546737416749921, + 21888242871839275222246405745257275088548364400416034343698204161056817433548, + 21888242871839275222246405745257275088548364400416034343698204010904270572991, + 21888242871839275222246405745257275088548364400416034343698203752589950175231, + 536371685748073, + 487348098750328, + 21888242871839275222246405745257275088548364400416034343698204171541528135430, + 21888242871839275222246405745257275088548364400416034343698204075308189532614, + 21888242871839275222246405745257275088548364400416034343698203691197797989653, + 293742336834618, + 21888242871839275222246405745257275088548364400416034343698204060317411259939, + 21888242871839275222246405745257275088548364400416034343698203858275766447062, + 21888242871839275222246405745257275088548364400416034343698203731901376906473, + 21888242871839275222246405745257275088548364400416034343698204121633339752778, + 193091239878334, + 418509775039538, + 21888242871839275222246405745257275088548364400416034343698203701510870456104, + 21888242871839275222246405745257275088548364400416034343698203684802129264207, + 463992480758818, + 21888242871839275222246405745257275088548364400416034343698203640531816260090, + 333297077913758, + 69775358815034, + 21888242871839275222246405745257275088548364400416034343698204119037809797703, + 21888242871839275222246405745257275088548364400416034343698203868200095255667, + 21888242871839275222246405745257275088548364400416034343698204061845680069548, + 21888242871839275222246405745257275088548364400416034343698203894562863756558, + 21888242871839275222246405745257275088548364400416034343698203860172471334153, + 21888242871839275222246405745257275088548364400416034343698203657353449601585, + 21888242871839275222246405745257275088548364400416034343698204136111255430127, + 47858647318701, + 494357599223620, + 21888242871839275222246405745257275088548364400416034343698204101393973604588, + 448948194733231, + 484740808849080, + 443968000637579, + 494351033865938, + 360232139477416, + 154866031397495, + 21888242871839275222246405745257275088548364400416034343698203627945034394287, + 411225327051593, + 21888242871839275222246405745257275088548364400416034343698203645301500010500, + 159120262114593, + 226929619882108, + 25701233983876, + 21888242871839275222246405745257275088548364400416034343698204091407468021499, + 115811002573912, + 21888242871839275222246405745257275088548364400416034343698203983886836916279, + 21888242871839275222246405745257275088548364400416034343698203684239299994910, + 21888242871839275222246405745257275088548364400416034343698204169994613347494, + 398081961204462, + 21888242871839275222246405745257275088548364400416034343698203936416968490943, + 78952092387549, + 47349785275034, + 541149814189696, + 22891150930036, + 21888242871839275222246405745257275088548364400416034343698204012495880157372, + 21888242871839275222246405745257275088548364400416034343698203670105645219562, + 21888242871839275222246405745257275088548364400416034343698203720357167115840, + 275557878801202, + 21888242871839275222246405745257275088548364400416034343698204000064419740669, + 21888242871839275222246405745257275088548364400416034343698203641183656495190, + 23918385202127, + 21888242871839275222246405745257275088548364400416034343698204124744434908443, + 244914090524950, + 544069076487882, + 21888242871839275222246405745257275088548364400416034343698204081604379526776, + 21888242871839275222246405745257275088548364400416034343698203850314484220853, + 21888242871839275222246405745257275088548364400416034343698203740630855877416, + 145020317406338, + 21888242871839275222246405745257275088548364400416034343698203992053196658739, + 21888242871839275222246405745257275088548364400416034343698204141777596050535, + 20717019601407, + 132522883530197, + 21888242871839275222246405745257275088548364400416034343698203776060244525435, + 480327631575222, + 21888242871839275222246405745257275088548364400416034343698203788646062982456, + 110275538009427, + 21888242871839275222246405745257275088548364400416034343698203897046016414763, + 236803753276887, + 21888242871839275222246405745257275088548364400416034343698203880086939345210, + 21888242871839275222246405745257275088548364400416034343698203687694598022833, + 21888242871839275222246405745257275088548364400416034343698203975700285777423, + 21888242871839275222246405745257275088548364400416034343698204078515876889648, + 21888242871839275222246405745257275088548364400416034343698203774252317650366, + 363881341145159, + 554636590274792, + 300517805737315, + 21888242871839275222246405745257275088548364400416034343698203924243070151818, + 541897029270453, + 428655740351176, + 21888242871839275222246405745257275088548364400416034343698204140092333966169, + 547057762089804, + 470921741300786, + 21888242871839275222246405745257275088548364400416034343698204100276285860362, + 546196873771107, + 21888242871839275222246405745257275088548364400416034343698203905166252312437, + 21888242871839275222246405745257275088548364400416034343698203773080555615828, + 21888242871839275222246405745257275088548364400416034343698203688427302652137, + 122403679663344, + 21888242871839275222246405745257275088548364400416034343698203879630962102097, + 30813497982559, + 31446506695026, + 21888242871839275222246405745257275088548364400416034343698204049937834408640, + 495376741087290, + 161912872728222, + 21888242871839275222246405745257275088548364400416034343698204102707076107866, + 289667317545371, + 543924606345076, + 21888242871839275222246405745257275088548364400416034343698203830900995839580, + 407343286995850, + 21888242871839275222246405745257275088548364400416034343698203968209446462252, + 483555393361827, + 464354063411761, + 21888242871839275222246405745257275088548364400416034343698203654363004089878, + 21888242871839275222246405745257275088548364400416034343698204024854832629256, + 21888242871839275222246405745257275088548364400416034343698203712113984623332, + 431137420205939, + 28778064720629, + 21888242871839275222246405745257275088548364400416034343698203890379519204466, + 21888242871839275222246405745257275088548364400416034343698204092053936828304, + 21888242871839275222246405745257275088548364400416034343698203930222229327768, + 233859587120220, + 225874181647442, + 21888242871839275222246405745257275088548364400416034343698204041770877751958, + 21888242871839275222246405745257275088548364400416034343698203985569014387846, + 21888242871839275222246405745257275088548364400416034343698204097689706845261, + 523861328705564, + 21888242871839275222246405745257275088548364400416034343698203999590278970896, + 151362602276049, + 535099093990523, + 21888242871839275222246405745257275088548364400416034343698203946044294815219, + 21888242871839275222246405745257275088548364400416034343698203767695681247163, + 359317904934512, + 21888242871839275222246405745257275088548364400416034343698203737840370998231, + 65212204164993, + 21888242871839275222246405745257275088548364400416034343698204158354683351671, + 21888242871839275222246405745257275088548364400416034343698203777764028089080, + 235219510559296, + 21888242871839275222246405745257275088548364400416034343698204024420984615147, + 21888242871839275222246405745257275088548364400416034343698203856255476055447, + 21888242871839275222246405745257275088548364400416034343698204004421963654292, + 65783493351168, + 21888242871839275222246405745257275088548364400416034343698203946906816839626, + 21888242871839275222246405745257275088548364400416034343698203956110114012065, + 21888242871839275222246405745257275088548364400416034343698203747413785611498, + 321634555498232, + 68911925850160, + 21888242871839275222246405745257275088548364400416034343698203813391333897375, + 21888242871839275222246405745257275088548364400416034343698203727058383891330, + 286648661214984, + 216102200703002, + 145386556496285, + 26926531761891, + 277427778117433, + 288662582494121, + 21888242871839275222246405745257275088548364400416034343698203982903963964613, + 21888242871839275222246405745257275088548364400416034343698203798178795044050, + 21888242871839275222246405745257275088548364400416034343698204133173851110253, + 66236504903446, + 21888242871839275222246405745257275088548364400416034343698203738323414917841, + 21888242871839275222246405745257275088548364400416034343698204113360804107026, + 152715327461406, + 21888242871839275222246405745257275088548364400416034343698203737381261622851, + 65112285636760, + 94537399623129, + 21888242871839275222246405745257275088548364400416034343698203784284109867767, + 21888242871839275222246405745257275088548364400416034343698203988290798005905, + 100674022727392, + 21888242871839275222246405745257275088548364400416034343698204171757163861303, + 21888242871839275222246405745257275088548364400416034343698203985591164931260, + 83726581816751, + 245912126252765, + 21888242871839275222246405745257275088548364400416034343698203893164981636001, + 21888242871839275222246405745257275088548364400416034343698203933133365827047, + 21888242871839275222246405745257275088548364400416034343698203908401376632688, + 46003419033422, + 209984443117016, + 407011661037442, + 370526454122414, + 21888242871839275222246405745257275088548364400416034343698204140775289868924, + 522853479807016, + 21888242871839275222246405745257275088548364400416034343698203934440254064147, + 21888242871839275222246405745257275088548364400416034343698203942233106995378, + 21888242871839275222246405745257275088548364400416034343698204133634287456740, + 21888242871839275222246405745257275088548364400416034343698204148291671392487, + 21888242871839275222246405745257275088548364400416034343698203878193747838874, + 353762677073150, + 290121811497805, + 277762867054661, + 21888242871839275222246405745257275088548364400416034343698203831502278903243, + 61618498631486, + 375265318404974, + 21888242871839275222246405745257275088548364400416034343698203899404210634503, + 371065622078739, + 35402384124567, + 21888242871839275222246405745257275088548364400416034343698203873039041265968, + 542103591837611, + 149493345163230, + 187755439249867, + 21888242871839275222246405745257275088548364400416034343698204054490008873114, + 21888242871839275222246405745257275088548364400416034343698203801408939647977, + 21888242871839275222246405745257275088548364400416034343698203880746669042602, + 142158745427905, + 21888242871839275222246405745257275088548364400416034343698204137208921777060, + 277608370686017, + 21888242871839275222246405745257275088548364400416034343698203900038315170038, + 501429600018422, + 21888242871839275222246405745257275088548364400416034343698203781888136807365, + 176783943904566, + 372416974296066, + 21888242871839275222246405745257275088548364400416034343698203779852974299809, + 21888242871839275222246405745257275088548364400416034343698203985238803680022, + 21888242871839275222246405745257275088548364400416034343698203770867098700786, + 21888242871839275222246405745257275088548364400416034343698203764552877255084, + 162853101498219, + 21888242871839275222246405745257275088548364400416034343698204038885600218140, + 30509424693410, + 21888242871839275222246405745257275088548364400416034343698203646052004036756, + 56053284225436, + 470492933690411, + 430764988924669, + 21888242871839275222246405745257275088548364400416034343698204086491241556917, + 21888242871839275222246405745257275088548364400416034343698203817378493025266, + 174595055479846, + 21888242871839275222246405745257275088548364400416034343698203985321679656945, + 21888242871839275222246405745257275088548364400416034343698203836371958775306, + 420545371137548, + 21888242871839275222246405745257275088548364400416034343698203838374339038390, + 166585070179924, + 36767977594386, + 21888242871839275222246405745257275088548364400416034343698203960302045439642, + 309686316355169, + 561056301130593, + 396760080426276, + 21888242871839275222246405745257275088548364400416034343698203730297042622582, + 446687675696968, + 21888242871839275222246405745257275088548364400416034343698204137908084673200, + 223336069583289, + 230046532809511, + 21888242871839275222246405745257275088548364400416034343698203839594708260600, + 21888242871839275222246405745257275088548364400416034343698204042984273947330, + 21888242871839275222246405745257275088548364400416034343698204129238605195519, + 21888242871839275222246405745257275088548364400416034343698203872559142643297, + 21888242871839275222246405745257275088548364400416034343698203632379479758967, + 101269113986074, + 445664531172270, + 21888242871839275222246405745257275088548364400416034343698204109242543004981, + 560808821211518, + 21888242871839275222246405745257275088548364400416034343698204112341378204209, + 499635864064914, + 21888242871839275222246405745257275088548364400416034343698203829417043853222, + 21888242871839275222246405745257275088548364400416034343698203647870899496141, + 21888242871839275222246405745257275088548364400416034343698203967578056288873, + 457027121868211, + 461695938489086, + 21888242871839275222246405745257275088548364400416034343698203627629167129728, + 21888242871839275222246405745257275088548364400416034343698204094882531861667, + 41398391068700, + 21888242871839275222246405745257275088548364400416034343698203785012048965980, + 21888242871839275222246405745257275088548364400416034343698204091404502009747, + 440384353707979, + 34341163111228, + 21888242871839275222246405745257275088548364400416034343698203999141726940981, + 21888242871839275222246405745257275088548364400416034343698204077275942338864, + 21888242871839275222246405745257275088548364400416034343698204010294682391843, + 214133534888282, + 331379322596806, + 21888242871839275222246405745257275088548364400416034343698203890414803468811, + 248259967396149, + 21888242871839275222246405745257275088548364400416034343698204155628143166060, + 21888242871839275222246405745257275088548364400416034343698203653574916957920, + 21888242871839275222246405745257275088548364400416034343698203700168142450152, + 21888242871839275222246405745257275088548364400416034343698204168881136806140, + 21888242871839275222246405745257275088548364400416034343698204131563194711100, + 488897117452368, + 21888242871839275222246405745257275088548364400416034343698203773809046661776, + 21888242871839275222246405745257275088548364400416034343698204184915693385711, + 21888242871839275222246405745257275088548364400416034343698203780340628928773, + 7481785163421, + 21888242871839275222246405745257275088548364400416034343698204002483055121522, + 21888242871839275222246405745257275088548364400416034343698204005972981263338, + 299557029883176, + 21888242871839275222246405745257275088548364400416034343698203805554216424562, + 21888242871839275222246405745257275088548364400416034343698203758279167391326, + 21888242871839275222246405745257275088548364400416034343698203655038460089568, + 201362528206749, + 310743124685332, + 547338756141696, + 21888242871839275222246405745257275088548364400416034343698204090188122909608, + 21888242871839275222246405745257275088548364400416034343698203749658452268908, + 140248158851302, + 143656794711767, + 80578418211526, + 21888242871839275222246405745257275088548364400416034343698204009931006576343, + 21888242871839275222246405745257275088548364400416034343698203693336719373361, + 45881973076764, + 21888242871839275222246405745257275088548364400416034343698203797180619283894, + 21888242871839275222246405745257275088548364400416034343698203772270127180914, + 21888242871839275222246405745257275088548364400416034343698203665517645008270, + 21888242871839275222246405745257275088548364400416034343698203974430908992082, + 21888242871839275222246405745257275088548364400416034343698203999075749740215, + 208690045581089, + 21888242871839275222246405745257275088548364400416034343698204006948346656744, + 533590203868655, + 254167929249150, + 448170376052340, + 21888242871839275222246405745257275088548364400416034343698204181564053139628, + 21888242871839275222246405745257275088548364400416034343698204082095822345305, + 473509403704214, + 34548797763544, + 21888242871839275222246405745257275088548364400416034343698203712241877501040, + 21888242871839275222246405745257275088548364400416034343698204127968413081869, + 148614107097190, + 21888242871839275222246405745257275088548364400416034343698203636856500751827, + 315818670869905, + 62215632729460, + 21888242871839275222246405745257275088548364400416034343698203741739280414637, + 21888242871839275222246405745257275088548364400416034343698203880765421780720, + 21888242871839275222246405745257275088548364400416034343698203943516728146624, + 551072360702845, + 367259543171337, + 307214230721546, + 290780227932503, + 186491373453637, + 21888242871839275222246405745257275088548364400416034343698204038175036037412, + 60992152354607, + 294106968679179, + 21888242871839275222246405745257275088548364400416034343698203997093729611970, + 21888242871839275222246405745257275088548364400416034343698203735935600694515, + 459914438295497, + 21888242871839275222246405745257275088548364400416034343698204149624912143551, + 21888242871839275222246405745257275088548364400416034343698204140904421360947, + 21888242871839275222246405745257275088548364400416034343698203644250015650091, + 21888242871839275222246405745257275088548364400416034343698203745367017745737, + 21888242871839275222246405745257275088548364400416034343698203928582660459256, + 252771031646143, + 532952605229874, + 413132736980245, + 21888242871839275222246405745257275088548364400416034343698204143423350955787, + 467451350916654, + 469928399507573, + 520109032436022, + 21888242871839275222246405745257275088548364400416034343698203833883425179526, + 310957878973725, + 35653286458687, + 553483205555053, + 488446406188184, + 21888242871839275222246405745257275088548364400416034343698204008651956002674, + 24751767919530, + 21888242871839275222246405745257275088548364400416034343698203965655055931962, + 21888242871839275222246405745257275088548364400416034343698203664146587802928, + 110407647516043, + 21888242871839275222246405745257275088548364400416034343698203744400929717952, + 402071450369644, + 21888242871839275222246405745257275088548364400416034343698203925857211298702, + 335757972831306, + 21888242871839275222246405745257275088548364400416034343698204100412016391934, + 415601056627428, + 21888242871839275222246405745257275088548364400416034343698204031764031985087, + 241313104725535, + 21888242871839275222246405745257275088548364400416034343698204024337291013028, + 325986052168204, + 336647775784667, + 21888242871839275222246405745257275088548364400416034343698204089895798810120, + 21888242871839275222246405745257275088548364400416034343698203708372165586613, + 21888242871839275222246405745257275088548364400416034343698204167262295686675, + 179219987168128, + 21888242871839275222246405745257275088548364400416034343698203706449980434412, + 21888242871839275222246405745257275088548364400416034343698204121562144814212, + 21888242871839275222246405745257275088548364400416034343698203690742737615043, + 529194390295601, + 21888242871839275222246405745257275088548364400416034343698204020330463172106, + 375403342714037, + 11756138039308, + 21888242871839275222246405745257275088548364400416034343698204076134704677380, + 21888242871839275222246405745257275088548364400416034343698204085159798485037, + 498203703980818, + 21888242871839275222246405745257275088548364400416034343698203942627181813979, + 172530287700465, + 293823467323683, + 64044904865903, + 21888242871839275222246405745257275088548364400416034343698203683604123783014, + 430540212820013, + 30294137428987, + 208512931903897, + 481888765517913, + 21888242871839275222246405745257275088548364400416034343698203666424725394158, + 344875812692495, + 339448378795807, + 358897632320610, + 21888242871839275222246405745257275088548364400416034343698203787305343465444, + 21888242871839275222246405745257275088548364400416034343698203931680105114777, + 21888242871839275222246405745257275088548364400416034343698203730706492957019, + 21888242871839275222246405745257275088548364400416034343698203954206350051395, + 84553419333937, + 121764283649852, + 33572844238880, + 21888242871839275222246405745257275088548364400416034343698204038494602680733, + 283597734210543, + 257771302125513, + 352874950060125, + 119385174559269, + 168736665205405, + 156731550404908, + 21888242871839275222246405745257275088548364400416034343698203807236173435702, + 21888242871839275222246405745257275088548364400416034343698204120709646634826, + 21888242871839275222246405745257275088548364400416034343698203948503640730395, + 21888242871839275222246405745257275088548364400416034343698204065294205766075, + 21888242871839275222246405745257275088548364400416034343698203995699422079612, + 21888242871839275222246405745257275088548364400416034343698203796384292053685, + 21888242871839275222246405745257275088548364400416034343698203890219324233067, + 243220278696001, + 380110651804877, + 21888242871839275222246405745257275088548364400416034343698203925449698841542, + 21888242871839275222246405745257275088548364400416034343698203651768316877399, + 303177405903068, + 426849055618272, + 21888242871839275222246405745257275088548364400416034343698203823514561385820, + 209435547658954, + 21888242871839275222246405745257275088548364400416034343698204061433253726478, + 21888242871839275222246405745257275088548364400416034343698203781632806685278, + 400430934891791, + 362890047033515, + 21888242871839275222246405745257275088548364400416034343698203966713294807389, + 215276152171366, + 21888242871839275222246405745257275088548364400416034343698204107791488396370, + 337076332522286, + 231019540212642, + 21888242871839275222246405745257275088548364400416034343698203870005264398287, + 21888242871839275222246405745257275088548364400416034343698203644796675664415, + 21888242871839275222246405745257275088548364400416034343698203985102378383905, + 21888242871839275222246405745257275088548364400416034343698203819684131779472, + 21888242871839275222246405745257275088548364400416034343698203872830845009677, + 21888242871839275222246405745257275088548364400416034343698204157790346983500, + 526273813666299, + 21888242871839275222246405745257275088548364400416034343698203722781530160465, + 21888242871839275222246405745257275088548364400416034343698204143753590056469, + 21888242871839275222246405745257275088548364400416034343698203856951739213436, + 521419680205591, + 21888242871839275222246405745257275088548364400416034343698204136031477353949, + 21888242871839275222246405745257275088548364400416034343698203800609930611518, + 25024876464097, + 21888242871839275222246405745257275088548364400416034343698203794891400897518, + 21888242871839275222246405745257275088548364400416034343698203666909622845866, + 556825439472987, + 548640036928324, + 274460065232216, + 21888242871839275222246405745257275088548364400416034343698203727937309144883, + 298607338046921, + 21888242871839275222246405745257275088548364400416034343698203770139837335393, + 21888242871839275222246405745257275088548364400416034343698203696043818725276, + 21888242871839275222246405745257275088548364400416034343698204157944477001238, + 557116186191088, + 21888242871839275222246405745257275088548364400416034343698204032035055972875, + 21888242871839275222246405745257275088548364400416034343698203624807964539617, + 459965620617058, + 389809026144987, + 522358093591757, + 21888242871839275222246405745257275088548364400416034343698203907324173345186, + 302848755181213, + 445246358188624, + 21888242871839275222246405745257275088548364400416034343698204021107557224967, + 21888242871839275222246405745257275088548364400416034343698203690207048266776, + 180797071181366, + 186488193244936, + 21888242871839275222246405745257275088548364400416034343698204111108425482347, + 104071144003943, + 21888242871839275222246405745257275088548364400416034343698203785537650868367, + 21888242871839275222246405745257275088548364400416034343698203728367177355525, + 544497299779198, + 21888242871839275222246405745257275088548364400416034343698203684258858330939, + 31433600813114, + 21888242871839275222246405745257275088548364400416034343698203740328473930454, + 21888242871839275222246405745257275088548364400416034343698204085574147253565, + 21888242871839275222246405745257275088548364400416034343698203742800903982268, + 523493738380467, + 21888242871839275222246405745257275088548364400416034343698203904585804134267, + 380049590652939, + 21888242871839275222246405745257275088548364400416034343698203667004451635355, + 389005572468836, + 396090971326723, + 419628349420680, + 21888242871839275222246405745257275088548364400416034343698203821918204077257, + 3249267700987, + 21888242871839275222246405745257275088548364400416034343698203724013427932095, + 21888242871839275222246405745257275088548364400416034343698203861172680621409, + 475829110745330, + 518094439966379, + 117522290719963, + 21888242871839275222246405745257275088548364400416034343698203849001019029124, + 500990557846471, + 464885419977616, + 537860556836023, + 452655381573762, + 105374937582492, + 21888242871839275222246405745257275088548364400416034343698204115087579916445, + 21888242871839275222246405745257275088548364400416034343698204176226446695994, + 21888242871839275222246405745257275088548364400416034343698204069875996313924, + 307645722312616, + 21888242871839275222246405745257275088548364400416034343698203645905366197576, + 21888242871839275222246405745257275088548364400416034343698204080497268827714, + 21888242871839275222246405745257275088548364400416034343698204175371858735273, + 347955016474075, + 49121891593951, + 544547862560435, + 509830959267558, + 21888242871839275222246405745257275088548364400416034343698203761663606261197, + 21888242871839275222246405745257275088548364400416034343698203914889632111421, + 21888242871839275222246405745257275088548364400416034343698203883007454403682, + 21888242871839275222246405745257275088548364400416034343698204150899272920387, + 12194856852940, + 319624354088876, + 96922349910456, + 145927810796793, + 21888242871839275222246405745257275088548364400416034343698203754464580396487, + 21888242871839275222246405745257275088548364400416034343698203684372574681806, + 21888242871839275222246405745257275088548364400416034343698204060098564780994, + 21888242871839275222246405745257275088548364400416034343698204053516267190697, + 21888242871839275222246405745257275088548364400416034343698203826985595809365, + 29314107933773, + 21888242871839275222246405745257275088548364400416034343698203977624285936769, + 21888242871839275222246405745257275088548364400416034343698203779142608730258, + 21888242871839275222246405745257275088548364400416034343698203648408148050643, + 319026689722496, + 21888242871839275222246405745257275088548364400416034343698203906816770221475, + 21888242871839275222246405745257275088548364400416034343698203989444877032515, + 262224437806409, + 370744154719282, + 21888242871839275222246405745257275088548364400416034343698203731805603789489, + 62141180770547, + 21888242871839275222246405745257275088548364400416034343698204077008748035026, + 328919729074179, + 2549851842962, + 87664683294264, + 21888242871839275222246405745257275088548364400416034343698203943709946223249, + 256523604933100, + 21888242871839275222246405745257275088548364400416034343698203764215146996991, + 28452247894655, + 21888242871839275222246405745257275088548364400416034343698203927759980298409, + 21888242871839275222246405745257275088548364400416034343698204004663119682538, + 487795801943337, + 21888242871839275222246405745257275088548364400416034343698203882679091192512, + 21888242871839275222246405745257275088548364400416034343698203791844921512435, + 85431302678981, + 21888242871839275222246405745257275088548364400416034343698203653309557251732, + 528196786002559, + 21888242871839275222246405745257275088548364400416034343698204027167865374350, + 558951731790492, + 21888242871839275222246405745257275088548364400416034343698204078629299003420, + 209134142842141, + 541780736995989, + 21888242871839275222246405745257275088548364400416034343698203899325790444855, + 21888242871839275222246405745257275088548364400416034343698203775201185837615, + 21888242871839275222246405745257275088548364400416034343698203698389910041103, + 21888242871839275222246405745257275088548364400416034343698203735991070333746, + 555988364301291, + 21888242871839275222246405745257275088548364400416034343698203772816140426644, + 432911953796263, + 21888242871839275222246405745257275088548364400416034343698203879087938363678, + 335334810435733, + 360191380058617, + 261559473725035, + 21888242871839275222246405745257275088548364400416034343698203789520853833916, + 21888242871839275222246405745257275088548364400416034343698203823370960058628, + 21888242871839275222246405745257275088548364400416034343698204092626248959075, + 449891977769778, + 477382018787256, + 21888242871839275222246405745257275088548364400416034343698204162026366266231, + 340910960526203, + 554013431087518, + 21888242871839275222246405745257275088548364400416034343698204017143474163029, + 378259829053328, + 21888242871839275222246405745257275088548364400416034343698204074377949775038, + 21888242871839275222246405745257275088548364400416034343698203821611449036517, + 21888242871839275222246405745257275088548364400416034343698203820084038986653, + 21888242871839275222246405745257275088548364400416034343698203970212505666955, + 21888242871839275222246405745257275088548364400416034343698203718409539272302, + 21888242871839275222246405745257275088548364400416034343698203777457888250186, + 21888242871839275222246405745257275088548364400416034343698204167257025332799, + 4529995468965, + 21888242871839275222246405745257275088548364400416034343698203865542829860511, + 293625409194780, + 155667347246615, + 490059307901540, + 13489545758811, + 21888242871839275222246405745257275088548364400416034343698203949074741543762, + 494965144366339, + 21888242871839275222246405745257275088548364400416034343698204060329142215258, + 198838328696572, + 21888242871839275222246405745257275088548364400416034343698203691095698962812, + 429842584318881, + 21888242871839275222246405745257275088548364400416034343698204143620785731022, + 50625224410534, + 19233929850023, + 21888242871839275222246405745257275088548364400416034343698203644422882568890, + 384880696677844, + 21888242871839275222246405745257275088548364400416034343698204159704440420025, + 386774476900579, + 135981138019046, + 538748876078964, + 447110235644888, + 21888242871839275222246405745257275088548364400416034343698204078203068811476, + 279832205725944, + 21888242871839275222246405745257275088548364400416034343698203845586632085408, + 21888242871839275222246405745257275088548364400416034343698203726823173750519, + 21888242871839275222246405745257275088548364400416034343698204132552936741649, + 66513968302786, + 369915305215106, + 21888242871839275222246405745257275088548364400416034343698203689739226973330, + 38077683266232, + 384243283324771, + 21888242871839275222246405745257275088548364400416034343698203860686001578729, + 21888242871839275222246405745257275088548364400416034343698204128101074892304, + 21888242871839275222246405745257275088548364400416034343698203979934178290923, + 493657365654034, + 21888242871839275222246405745257275088548364400416034343698203733112940585052, + 21888242871839275222246405745257275088548364400416034343698204175914657809666, + 306669476327541, + 21888242871839275222246405745257275088548364400416034343698203966382837621689, + 457302725064669, + 201163547267924, + 370480476943309, + 21888242871839275222246405745257275088548364400416034343698203633104367292368, + 21888242871839275222246405745257275088548364400416034343698203644950910069124, + 222894080158367, + 21888242871839275222246405745257275088548364400416034343698203673317665109770, + 6603653320424, + 380920531731525, + 21888242871839275222246405745257275088548364400416034343698204182213393760223, + 275427209934537, + 21888242871839275222246405745257275088548364400416034343698203835429299773452, + 95887042270604, + 239003866497471, + 21888242871839275222246405745257275088548364400416034343698204124549026283686, + 457927175549122, + 512341405633472, + 258749875335664, + 21888242871839275222246405745257275088548364400416034343698203863629892077100, + 277538909456405, + 21888242871839275222246405745257275088548364400416034343698203887690872296033, + 21888242871839275222246405745257275088548364400416034343698203713128928210995, + 21888242871839275222246405745257275088548364400416034343698203879692857402175, + 21888242871839275222246405745257275088548364400416034343698204168897872739282, + 77527214621049, + 21888242871839275222246405745257275088548364400416034343698204103363981886002, + 21888242871839275222246405745257275088548364400416034343698203737969126815801, + 21888242871839275222246405745257275088548364400416034343698203953768366119095, + 115829897884985, + 127240572447346, + 508348910746675, + 184077016763025, + 21888242871839275222246405745257275088548364400416034343698204084148976618085, + 21888242871839275222246405745257275088548364400416034343698203799211007573907, + 21888242871839275222246405745257275088548364400416034343698203853987322513680, + 440046759132012, + 24807611554607, + 478193433406446, + 21888242871839275222246405745257275088548364400416034343698203681863868168965, + 21888242871839275222246405745257275088548364400416034343698203867784822262282, + 16822597716347, + 21888242871839275222246405745257275088548364400416034343698203654897453107405, + 21888242871839275222246405745257275088548364400416034343698203808978018815255, + 15536271554104, + 410700834643100, + 108390597315827, + 475116964784730, + 30209674076130, + 21888242871839275222246405745257275088548364400416034343698204025080200043607, + 21888242871839275222246405745257275088548364400416034343698203900759105642698, + 244402872897223, + 391206856827883, + 21888242871839275222246405745257275088548364400416034343698204033043311169294, + 21888242871839275222246405745257275088548364400416034343698203797593882655455, + 21888242871839275222246405745257275088548364400416034343698203638077657872055, + 21888242871839275222246405745257275088548364400416034343698203794666234772904, + 21888242871839275222246405745257275088548364400416034343698204045162416356889, + 21888242871839275222246405745257275088548364400416034343698203837377458999983, + 21888242871839275222246405745257275088548364400416034343698204088744250225848, + 21888242871839275222246405745257275088548364400416034343698203804588743220864, + 290097765119675, + 21888242871839275222246405745257275088548364400416034343698204171970235590643, + 21888242871839275222246405745257275088548364400416034343698203626115495759470, + 21888242871839275222246405745257275088548364400416034343698203975361877261348, + 21888242871839275222246405745257275088548364400416034343698203987686094109160, + 216187389663330, + 21888242871839275222246405745257275088548364400416034343698204154915874856024, + 27836995148512, + 380025426415529, + 533485126298155, + 450535023425827, + 21888242871839275222246405745257275088548364400416034343698203723430834878386, + 120158996926483, + 492374624845226, + 305981374805589, + 143961650909303, + 21888242871839275222246405745257275088548364400416034343698203984893549130283, + 196401633707428, + 21888242871839275222246405745257275088548364400416034343698203846123133681016, + 192112283840782, + 21888242871839275222246405745257275088548364400416034343698204153940901607824, + 21888242871839275222246405745257275088548364400416034343698204087046257713501, + 355157425919354, + 21888242871839275222246405745257275088548364400416034343698203838184575693928, + 21888242871839275222246405745257275088548364400416034343698204031170184885245, + 21888242871839275222246405745257275088548364400416034343698204158355547548259, + 21888242871839275222246405745257275088548364400416034343698204115856731113298, + 284292770817161, + 106614452626720, + 21888242871839275222246405745257275088548364400416034343698204178352950219468, + 21888242871839275222246405745257275088548364400416034343698203642191145958532, + 291974537483799, + 325680196506316, + 88533046392882, + 468184824754342, + 39995659441690, + 21888242871839275222246405745257275088548364400416034343698203930434286052132, + 254447234611995, + 390783225463169, + 323871306828084, + 21888242871839275222246405745257275088548364400416034343698203663237297121855, + 21888242871839275222246405745257275088548364400416034343698203978124990558663, + 461149312008874, + 21888242871839275222246405745257275088548364400416034343698203997938517907847, + 408376646634438, + 438708641790367, + 21888242871839275222246405745257275088548364400416034343698203932341211367932, + 21888242871839275222246405745257275088548364400416034343698204150705097332759, + 21888242871839275222246405745257275088548364400416034343698203931882965351032, + 21888242871839275222246405745257275088548364400416034343698203701984124139951, + 21888242871839275222246405745257275088548364400416034343698204133336985457671, + 21888242871839275222246405745257275088548364400416034343698203657266930710900, + 541190054762933, + 21888242871839275222246405745257275088548364400416034343698203838218135182661, + 42780905848424, + 21888242871839275222246405745257275088548364400416034343698203669939062412863, + 21888242871839275222246405745257275088548364400416034343698204095071346211788, + 21888242871839275222246405745257275088548364400416034343698204154127902492226, + 424013760917967, + 21888242871839275222246405745257275088548364400416034343698203820056116581931, + 454466375395142, + 21888242871839275222246405745257275088548364400416034343698203968933186753807, + 549735242773946, + 250658648186947, + 404397487291039, + 277669801954408, + 21888242871839275222246405745257275088548364400416034343698203908909356098702, + 182457276520538, + 495916438682542, + 21888242871839275222246405745257275088548364400416034343698203768673755198631, + 21888242871839275222246405745257275088548364400416034343698203837827992474719, + 21888242871839275222246405745257275088548364400416034343698203950400059867185, + 258188367318450, + 175243845879995, + 21888242871839275222246405745257275088548364400416034343698203729654513519650, + 92542140156541, + 21888242871839275222246405745257275088548364400416034343698203765538548875900, + 270351189076344, + 405379140148731, + 21888242871839275222246405745257275088548364400416034343698204046066803543266, + 21888242871839275222246405745257275088548364400416034343698204142075649776153, + 21888242871839275222246405745257275088548364400416034343698203740641028392924, + 21888242871839275222246405745257275088548364400416034343698204103642227798700, + 21888242871839275222246405745257275088548364400416034343698204128827194657892, + 21888242871839275222246405745257275088548364400416034343698203735416286923308, + 370334532915198, + 21888242871839275222246405745257275088548364400416034343698204094655591075447, + 273481946595471, + 269033547716943, + 21888242871839275222246405745257275088548364400416034343698203965259758251610, + 150723414479642, + 21888242871839275222246405745257275088548364400416034343698204159779797197594, + 127748128099028, + 21888242871839275222246405745257275088548364400416034343698203803894543984735, + 160601721161301, + 21888242871839275222246405745257275088548364400416034343698204005925472542302, + 219996790635984, + 325056551042868, + 21888242871839275222246405745257275088548364400416034343698204123860735885704, + 21888242871839275222246405745257275088548364400416034343698204149039172910059, + 21888242871839275222246405745257275088548364400416034343698203789287325887420, + 180279487612429, + 21888242871839275222246405745257275088548364400416034343698204050961879321261, + 540699000623125, + 21888242871839275222246405745257275088548364400416034343698203671092136653817, + 21888242871839275222246405745257275088548364400416034343698204140719907365663, + 21888242871839275222246405745257275088548364400416034343698203911622880331153, + 387913373615127, + 21888242871839275222246405745257275088548364400416034343698203960660455364806, + 269516174209776, + 21888242871839275222246405745257275088548364400416034343698204186527409848440, + 21888242871839275222246405745257275088548364400416034343698203781991248828513, + 21888242871839275222246405745257275088548364400416034343698203827362886072776, + 21888242871839275222246405745257275088548364400416034343698203707082945146580, + 327786086404489, + 346744021944683, + 35164194885295, + 21888242871839275222246405745257275088548364400416034343698204035964740250268, + 111245595464502, + 21888242871839275222246405745257275088548364400416034343698203729441475094153, + 22725896348136, + 294679975631284, + 327653895815539, + 21888242871839275222246405745257275088548364400416034343698204079002138776074, + 21888242871839275222246405745257275088548364400416034343698203863724432765734, + 21888242871839275222246405745257275088548364400416034343698203759697592955152, + 354723395290553, + 21888242871839275222246405745257275088548364400416034343698204165814811467086, + 332051565855162, + 21888242871839275222246405745257275088548364400416034343698203867500407523728, + 264199352267570, + 21888242871839275222246405745257275088548364400416034343698203952733653429902, + 21888242871839275222246405745257275088548364400416034343698203997047433177369, + 68153831974977, + 21888242871839275222246405745257275088548364400416034343698203995646604765867, + 351118704437562, + 65876704089650, + 311775483658766, + 21888242871839275222246405745257275088548364400416034343698203758652244233433, + 21888242871839275222246405745257275088548364400416034343698204144718066754433, + 505378571688734, + 498159981870021, + 21888242871839275222246405745257275088548364400416034343698204093161527676750, + 213028637918749, + 306623631942066, + 178582230627647, + 359200847219177, + 21888242871839275222246405745257275088548364400416034343698204034287981932145, + 270477194081108, + 21888242871839275222246405745257275088548364400416034343698204057957569858447, + 77879711133571, + 21888242871839275222246405745257275088548364400416034343698203634682580754273, + 21888242871839275222246405745257275088548364400416034343698203900813730909104, + 419492462370808, + 21888242871839275222246405745257275088548364400416034343698204096955122319273, + 270534088458935, + 21888242871839275222246405745257275088548364400416034343698204054151350658772, + 21888242871839275222246405745257275088548364400416034343698204174796198612918, + 21888242871839275222246405745257275088548364400416034343698203927723200663320, + 235979354596074, + 21888242871839275222246405745257275088548364400416034343698203983310821350716, + 453597056465561, + 21888242871839275222246405745257275088548364400416034343698204004964387444790, + 21888242871839275222246405745257275088548364400416034343698203879646681560544, + 401490664251234, + 487493510747475, + 372994975427021, + 131022644137030, + 21888242871839275222246405745257275088548364400416034343698203830360948800154, + 21888242871839275222246405745257275088548364400416034343698203872058962287828, + 21888242871839275222246405745257275088548364400416034343698204049477701831408, + 21888242871839275222246405745257275088548364400416034343698204115405799971170, + 21888242871839275222246405745257275088548364400416034343698203973952769579469, + 21888242871839275222246405745257275088548364400416034343698203631027895242692, + 98082935950210, + 21888242871839275222246405745257275088548364400416034343698203846323128803417, + 21888242871839275222246405745257275088548364400416034343698203963781565796683, + 21888242871839275222246405745257275088548364400416034343698204046994228288300, + 21888242871839275222246405745257275088548364400416034343698204078260736328357, + 289058498563209, + 281637677225868, + 259241500882943, + 494045516092944, + 21888242871839275222246405745257275088548364400416034343698203937701301092660, + 107755175004521, + 224868131117401, + 319563996000930, + 21888242871839275222246405745257275088548364400416034343698203970987325388255, + 21888242871839275222246405745257275088548364400416034343698204136034479905603, + 522641068808333, + 196063037774395, + 21888242871839275222246405745257275088548364400416034343698203925218683573750, + 21888242871839275222246405745257275088548364400416034343698204161041020005993, + 21888242871839275222246405745257275088548364400416034343698203684401196679927, + 21888242871839275222246405745257275088548364400416034343698203941825266974639, + 192645300272847, + 21888242871839275222246405745257275088548364400416034343698203640010337307136, + 43285208138487, + 21888242871839275222246405745257275088548364400416034343698203729404629435317, + 287220489632502, + 502712018823941, + 517540425157791, + 21888242871839275222246405745257275088548364400416034343698203709361919920654, + 472664989251951, + 552034304033825, + 354212240449047, + 21888242871839275222246405745257275088548364400416034343698203937691386747443, + 21888242871839275222246405745257275088548364400416034343698203657179425899870, + 60835899766158, + 284078214842655, + 546333313791084, + 39613257130302, + 21888242871839275222246405745257275088548364400416034343698203860504366322143, + 413969960070777, + 508290384344943, + 507906755577270, + 297214373721608, + 21888242871839275222246405745257275088548364400416034343698203826739166104367, + 21888242871839275222246405745257275088548364400416034343698203894674639792791, + 21888242871839275222246405745257275088548364400416034343698203858762763737440, + 21888242871839275222246405745257275088548364400416034343698203881494162879587, + 21888242871839275222246405745257275088548364400416034343698203788770689444179, + 21888242871839275222246405745257275088548364400416034343698204097496114287250, + 419669672705487, + 137388814305230, + 21888242871839275222246405745257275088548364400416034343698204134765647935819, + 21888242871839275222246405745257275088548364400416034343698203812767142731602, + 21888242871839275222246405745257275088548364400416034343698204057525676601467, + 21888242871839275222246405745257275088548364400416034343698204165908662181027, + 427049504047225, + 21888242871839275222246405745257275088548364400416034343698203761387797638217, + 79959252451420, + 391261285686586, + 249790551671165, + 21888242871839275222246405745257275088548364400416034343698203942911179635529, + 495723887424946, + 21888242871839275222246405745257275088548364400416034343698203838544844532739, + 21888242871839275222246405745257275088548364400416034343698204183025902112047, + 100837066361937, + 21888242871839275222246405745257275088548364400416034343698203643316308342215, + 520723851141471, + 21888242871839275222246405745257275088548364400416034343698204051599391345541, + 21888242871839275222246405745257275088548364400416034343698204063866964599857, + 327149750798309, + 21888242871839275222246405745257275088548364400416034343698203732646320600465, + 21888242871839275222246405745257275088548364400416034343698204000231342487952, + 369035226837094, + 21888242871839275222246405745257275088548364400416034343698203791562418245913, + 21888242871839275222246405745257275088548364400416034343698203906197677846561, + 21888242871839275222246405745257275088548364400416034343698203694461988467919, + 21888242871839275222246405745257275088548364400416034343698203735433561526558, + 211586818118107, + 21888242871839275222246405745257275088548364400416034343698203889588049058110, + 21888242871839275222246405745257275088548364400416034343698203970002167974401, + 225246088905022, + 94821083638409, + 454186285633825, + 21888242871839275222246405745257275088548364400416034343698203666915509347967, + 230833731741051, + 484610306852276, + 332702861677662, + 231389895228092, + 21888242871839275222246405745257275088548364400416034343698204123471327109393, + 21888242871839275222246405745257275088548364400416034343698203665708947439376, + 274999841166933, + 411714647595904, + 21888242871839275222246405745257275088548364400416034343698203809509647723297, + 135525659391907, + 538874476619878, + 21888242871839275222246405745257275088548364400416034343698204183797427334984, + 21888242871839275222246405745257275088548364400416034343698203676431167200229, + 21888242871839275222246405745257275088548364400416034343698203685819745364371, + 21888242871839275222246405745257275088548364400416034343698203793917587220820, + 354483285542655, + 21888242871839275222246405745257275088548364400416034343698203636901237453762, + 120362599132156, + 534045498772136, + 286367004593340, + 21888242871839275222246405745257275088548364400416034343698203994872081006241, + 509634949739673, + 21888242871839275222246405745257275088548364400416034343698203961587667740391, + 21888242871839275222246405745257275088548364400416034343698204072390810648821, + 21888242871839275222246405745257275088548364400416034343698203897045426058426, + 258398902152751, + 21888242871839275222246405745257275088548364400416034343698203692640496901965, + 21888242871839275222246405745257275088548364400416034343698203970532972384067, + 32435519441113, + 309600405976431, + 542352475842032, + 231600129515943, + 21888242871839275222246405745257275088548364400416034343698204150587280582010, + 21888242871839275222246405745257275088548364400416034343698203865605323548387, + 21888242871839275222246405745257275088548364400416034343698204172184338930289, + 71515687261893, + 21888242871839275222246405745257275088548364400416034343698203700762643147888, + 512680593438966, + 260093575758072, + 21888242871839275222246405745257275088548364400416034343698204034544117024743, + 21888242871839275222246405745257275088548364400416034343698204099671420577193, + 21888242871839275222246405745257275088548364400416034343698203921485338273877, + 428217669090220, + 21888242871839275222246405745257275088548364400416034343698203811891012452419, + 297211963386303, + 21888242871839275222246405745257275088548364400416034343698204058486284146652, + 178138810957277, + 10841532849899, + 270148363792575, + 21888242871839275222246405745257275088548364400416034343698204011160857325490, + 21888242871839275222246405745257275088548364400416034343698203683718063491585, + 21888242871839275222246405745257275088548364400416034343698203746027120491478, + 519177717605571, + 470730937391354, + 488577699583156, + 21888242871839275222246405745257275088548364400416034343698204032914869495056, + 21888242871839275222246405745257275088548364400416034343698203928766496500626, + 21888242871839275222246405745257275088548364400416034343698204101185634037232, + 477071369554225, + 343787156933419, + 21888242871839275222246405745257275088548364400416034343698204006565220239698, + 229881532325218, + 61175790608514, + 21888242871839275222246405745257275088548364400416034343698203713135487947973, + 60091185066857, + 251630030723610, + 21888242871839275222246405745257275088548364400416034343698203700181507387596, + 242753707469785, + 250500230908450, + 21888242871839275222246405745257275088548364400416034343698203978113395613653, + 21888242871839275222246405745257275088548364400416034343698203631572397874098, + 21888242871839275222246405745257275088548364400416034343698203722814101353646, + 364910656498779, + 21888242871839275222246405745257275088548364400416034343698203834214215727390, + 238085642059065, + 149684281303769, + 177737085643133, + 243259738596577, + 21888242871839275222246405745257275088548364400416034343698203824987972722901, + 21888242871839275222246405745257275088548364400416034343698203755076290137995, + 21888242871839275222246405745257275088548364400416034343698204152814485859885, + 21888242871839275222246405745257275088548364400416034343698204036828695363027, + 21888242871839275222246405745257275088548364400416034343698204083500354329318, + 517175345140872, + 21888242871839275222246405745257275088548364400416034343698204177824715789967, + 21888242871839275222246405745257275088548364400416034343698204182343900297793, + 469719847513727, + 495352145837120, + 21888242871839275222246405745257275088548364400416034343698203884263423415274, + 21888242871839275222246405745257275088548364400416034343698203723647567987197, + 21888242871839275222246405745257275088548364400416034343698203841035171452459, + 291566804095013, + 533561305095827, + 21888242871839275222246405745257275088548364400416034343698204093803921439462, + 21888242871839275222246405745257275088548364400416034343698204059129800565209, + 21888242871839275222246405745257275088548364400416034343698203716096340561435, + 383394741187379, + 181001568974169, + 21888242871839275222246405745257275088548364400416034343698203876752657760943, + 153446316269805, + 21888242871839275222246405745257275088548364400416034343698204008603122267252, + 21888242871839275222246405745257275088548364400416034343698204002554557239419, + 21888242871839275222246405745257275088548364400416034343698204131631081870299, + 47399213421918, + 83805411520578, + 406682732451216, + 21888242871839275222246405745257275088548364400416034343698203802633394237347, + 21888242871839275222246405745257275088548364400416034343698203681803263217404, + 281939033476114, + 21888242871839275222246405745257275088548364400416034343698203793614650450061, + 378466330482044, + 251568056455614, + 110989354799475, + 21888242871839275222246405745257275088548364400416034343698203995687799018262, + 21888242871839275222246405745257275088548364400416034343698203757425324627125, + 21888242871839275222246405745257275088548364400416034343698204019468635168020, + 21888242871839275222246405745257275088548364400416034343698203992310757266250, + 91097551936780, + 449450107836666, + 21888242871839275222246405745257275088548364400416034343698203787213986405330, + 535727634435666, + 21888242871839275222246405745257275088548364400416034343698204080808245941709, + 21888242871839275222246405745257275088548364400416034343698204013373929502775, + 2987582514231, + 21888242871839275222246405745257275088548364400416034343698203987086666559283, + 17992233753184, + 21888242871839275222246405745257275088548364400416034343698203700374333776436, + 270402985825461, + 180389986629098, + 21888242871839275222246405745257275088548364400416034343698203805094628217752, + 281450092449216, + 21888242871839275222246405745257275088548364400416034343698204062227468657915, + 21888242871839275222246405745257275088548364400416034343698203927253236273810, + 367105320220516, + 337413476179256, + 871518999601, + 21888242871839275222246405745257275088548364400416034343698203890459384379586, + 21888242871839275222246405745257275088548364400416034343698204077947039804424, + 21888242871839275222246405745257275088548364400416034343698203941447024428739, + 137807379974226, + 52540244361085, + 228635433213818, + 184227883536265, + 21888242871839275222246405745257275088548364400416034343698203951991666557283, + 21888242871839275222246405745257275088548364400416034343698203948635965135940, + 21888242871839275222246405745257275088548364400416034343698203706717560341281, + 21888242871839275222246405745257275088548364400416034343698204064772119267974, + 21888242871839275222246405745257275088548364400416034343698203830737127221921, + 62256437273001, + 21888242871839275222246405745257275088548364400416034343698204096922305380667, + 21888242871839275222246405745257275088548364400416034343698203847611129171381, + 21888242871839275222246405745257275088548364400416034343698204159623047886738, + 488769099082155, + 57575218175148, + 21888242871839275222246405745257275088548364400416034343698203693842270389820, + 21888242871839275222246405745257275088548364400416034343698203848003987030064, + 21888242871839275222246405745257275088548364400416034343698203969820902062963, + 429173111919285, + 21888242871839275222246405745257275088548364400416034343698204181323079996110, + 489920305705379, + 15951825191741, + 208464594313479, + 340367792124020, + 284640622765232, + 343496849746196, + 317742797985085, + 21888242871839275222246405745257275088548364400416034343698203773455878002243, + 21888242871839275222246405745257275088548364400416034343698203946043673360815, + 354478175910192, + 360442244689610, + 21888242871839275222246405745257275088548364400416034343698204178549126748771, + 547618792471266, + 162903224708977, + 21888242871839275222246405745257275088548364400416034343698204037032883707960, + 100470783562473, + 21888242871839275222246405745257275088548364400416034343698203996334238083562, + 21888242871839275222246405745257275088548364400416034343698203980869891537533, + 21888242871839275222246405745257275088548364400416034343698204034696716417485, + 425792544291897, + 497881520839624, + 21888242871839275222246405745257275088548364400416034343698204131127231441833, + 479892340906130, + 377196940224221, + 21888242871839275222246405745257275088548364400416034343698203934080959462126, + 7205903623799, + 21888242871839275222246405745257275088548364400416034343698203685111629395201, + 546016375379362, + 21888242871839275222246405745257275088548364400416034343698204020220498117673, + 21888242871839275222246405745257275088548364400416034343698204022998568628542, + 510512722471751, + 529734122869691, + 21888242871839275222246405745257275088548364400416034343698203906455452026701, + 102359580399639, + 21888242871839275222246405745257275088548364400416034343698204018134676654146, + 21888242871839275222246405745257275088548364400416034343698203838391633136504, + 500763454756920, + 21888242871839275222246405745257275088548364400416034343698204169624931055590, + 21888242871839275222246405745257275088548364400416034343698203734880307877810, + 326091712643145, + 21888242871839275222246405745257275088548364400416034343698203844396736608324, + 27871056428711, + 182557879827957, + 21888242871839275222246405745257275088548364400416034343698204100419472845684, + 21888242871839275222246405745257275088548364400416034343698203839376173403562, + 117400825033313, + 318425249727956, + 28427384199297, + 21888242871839275222246405745257275088548364400416034343698203661504840836250, + 21888242871839275222246405745257275088548364400416034343698203932819882682750, + 21888242871839275222246405745257275088548364400416034343698203869026204437469, + 21888242871839275222246405745257275088548364400416034343698203702594945560027, + 21888242871839275222246405745257275088548364400416034343698203666111658071064, + 21888242871839275222246405745257275088548364400416034343698203707814713431627, + 160765634910669, + 410024082394653, + 21888242871839275222246405745257275088548364400416034343698203681319657784756, + 21888242871839275222246405745257275088548364400416034343698203945436744705789, + 311438348537869, + 438336882639100, + 543293430768892, + 21888242871839275222246405745257275088548364400416034343698203872442935985566, + 21888242871839275222246405745257275088548364400416034343698203905746292616046, + 21888242871839275222246405745257275088548364400416034343698203926926122722369, + 46200460327300, + 454772852395511, + 21888242871839275222246405745257275088548364400416034343698203935239347316578, + 21888242871839275222246405745257275088548364400416034343698203939206223524618, + 544325017756772, + 248629584934461, + 21888242871839275222246405745257275088548364400416034343698203988408041184100, + 165545219405808, + 37699027444740, + 416861632314760, + 21888242871839275222246405745257275088548364400416034343698203780788067408154, + 21888242871839275222246405745257275088548364400416034343698203659362612145860, + 332091891019626, + 21888242871839275222246405745257275088548364400416034343698203953008751318772, + 85580633701904, + 21888242871839275222246405745257275088548364400416034343698204015756304495352, + 256870655710235, + 293306843471263, + 544846147024511, + 368175880502572, + 21888242871839275222246405745257275088548364400416034343698203820399886847233, + 66086793753104, + 21888242871839275222246405745257275088548364400416034343698204014616797032013, + 123754112526355, + 237865656229428, + 453654151129408, + 361162713884059, + 21888242871839275222246405745257275088548364400416034343698203991461358409507, + 21888242871839275222246405745257275088548364400416034343698203944861169283442, + 21888242871839275222246405745257275088548364400416034343698203892405397321960, + 21888242871839275222246405745257275088548364400416034343698203657890271115859, + 207383738588530, + 495310576802137, + 21888242871839275222246405745257275088548364400416034343698203645740198685842, + 273410063693644, + 21888242871839275222246405745257275088548364400416034343698203671505761864997, + 21888242871839275222246405745257275088548364400416034343698203858093942117484, + 383728850859958, + 543930897954995, + 43698568834907, + 21888242871839275222246405745257275088548364400416034343698203662081030609194, + 21888242871839275222246405745257275088548364400416034343698203947694324370331, + 418718099090272, + 21888242871839275222246405745257275088548364400416034343698204093481608383323, + 372512110086882, + 54660633809027, + 535674432564176, + 177791882539253, + 21888242871839275222246405745257275088548364400416034343698203880407055326993, + 75829660598909, + 485688634419563, + 21888242871839275222246405745257275088548364400416034343698203732418899442688, + 447689001056695, + 21888242871839275222246405745257275088548364400416034343698203823096050530579, + 177776745564161, + 194499066489950, + 21888242871839275222246405745257275088548364400416034343698203786475647471601, + 21888242871839275222246405745257275088548364400416034343698203863205641529447, + 21888242871839275222246405745257275088548364400416034343698203629159660854965, + 420321532839034, + 348421621618128, + 8947359989216, + 21888242871839275222246405745257275088548364400416034343698203739813124636828, + 425897310827161, + 287880000112350, + 1734418676396, + 326319325674545, + 278923539600901, + 512511263709289, + 21888242871839275222246405745257275088548364400416034343698203641972925261527, + 495511252071496, + 21888242871839275222246405745257275088548364400416034343698203758903553695456, + 393678755567377, + 21888242871839275222246405745257275088548364400416034343698203905274357526280, + 21888242871839275222246405745257275088548364400416034343698203907074014920861, + 174345171473049, + 21888242871839275222246405745257275088548364400416034343698204107301335688114, + 237202402978065, + 21888242871839275222246405745257275088548364400416034343698203707197582638087, + 21888242871839275222246405745257275088548364400416034343698204073198246519634, + 21888242871839275222246405745257275088548364400416034343698203878058125763811, + 21888242871839275222246405745257275088548364400416034343698203775596589399970, + 21888242871839275222246405745257275088548364400416034343698203805468973467166, + 35518009628718, + 21888242871839275222246405745257275088548364400416034343698203663689474999739, + 210391181647689, + 214478945919270, + 157492062736006, + 550427562271622, + 21888242871839275222246405745257275088548364400416034343698203827734675812570, + 542876515166889, + 334101950681707, + 67347638589579, + 21888242871839275222246405745257275088548364400416034343698204089231046310283, + 397187508185485, + 469569786619223, + 39420720767401, + 216977129409372, + 21888242871839275222246405745257275088548364400416034343698203717370740132827, + 21888242871839275222246405745257275088548364400416034343698204078660784908285, + 113181370652038, + 21888242871839275222246405745257275088548364400416034343698204060979390618792, + 21888242871839275222246405745257275088548364400416034343698204004398919103834, + 548306444370965, + 21888242871839275222246405745257275088548364400416034343698203706381034566680, + 416763259393168, + 36090233445430, + 505648471613057, + 21888242871839275222246405745257275088548364400416034343698203778539404423075, + 89381012817162, + 72307593467314, + 469182018796803, + 21888242871839275222246405745257275088548364400416034343698203901577633565195, + 293469949454602, + 21888242871839275222246405745257275088548364400416034343698203848232395325186, + 117010358741622, + 21888242871839275222246405745257275088548364400416034343698203873159488367951, + 21888242871839275222246405745257275088548364400416034343698204002552012345248, + 21888242871839275222246405745257275088548364400416034343698203994188814729510, + 137662027795292, + 27371434089363, + 238101892146278, + 175138658166622, + 21888242871839275222246405745257275088548364400416034343698203840198567307528, + 21888242871839275222246405745257275088548364400416034343698204141795319411483, + 21888242871839275222246405745257275088548364400416034343698204021757170843409, + 21888242871839275222246405745257275088548364400416034343698203995363670322787, + 538484454649069, + 229661106350759, + 19514742790359, + 274260508235837, + 21888242871839275222246405745257275088548364400416034343698203667488167447273, + 196530616233748, + 21888242871839275222246405745257275088548364400416034343698203635474260872241, + 21888242871839275222246405745257275088548364400416034343698203921732209780805, + 21888242871839275222246405745257275088548364400416034343698203902968258556856, + 79083688892915, + 165163180980587, + 92747242480983, + 21888242871839275222246405745257275088548364400416034343698203944689608176523, + 507231265262079, + 21888242871839275222246405745257275088548364400416034343698203801761996554000, + 21888242871839275222246405745257275088548364400416034343698204161615061741182, + 450769620620527, + 21888242871839275222246405745257275088548364400416034343698203682183453804893, + 526732370645195, + 532802990319270, + 21888242871839275222246405745257275088548364400416034343698203810102184615568, + 459327972149713, + 16569830966013, + 21888242871839275222246405745257275088548364400416034343698204119550117601299, + 61984795671338, + 21888242871839275222246405745257275088548364400416034343698203976079058304282, + 480666311882814, + 21888242871839275222246405745257275088548364400416034343698203847212823027548, + 146503506152659, + 350062669632795, + 21888242871839275222246405745257275088548364400416034343698203656868734585810, + 181540832851834, + 21888242871839275222246405745257275088548364400416034343698203790122371369309, + 87580076541222, + 21888242871839275222246405745257275088548364400416034343698204052068455378036, + 21888242871839275222246405745257275088548364400416034343698203888401604550092, + 21888242871839275222246405745257275088548364400416034343698203994858581490704, + 1684120887552, + 91331179532216, + 21888242871839275222246405745257275088548364400416034343698204123522035776566, + 21888242871839275222246405745257275088548364400416034343698203698965272187703, + 21888242871839275222246405745257275088548364400416034343698203655233677511123, + 292879338638318, + 452254848305830, + 137312531423683, + 6501030112050, + 290799995227327, + 215446955332081, + 21888242871839275222246405745257275088548364400416034343698203918996154362575, + 380295651351981, + 386685557697682, + 197856049270185, + 256481035743323, + 84832532843834, + 327626463606874, + 561243850810138, + 94271962503983, + 509630751279280, + 302912952171362, + 484841951174950, + 21888242871839275222246405745257275088548364400416034343698203991102684600528, + 21888242871839275222246405745257275088548364400416034343698204093323390432750, + 21888242871839275222246405745257275088548364400416034343698203997223279580306, + 403073094333498, + 21888242871839275222246405745257275088548364400416034343698203855493180154841, + 160429635241306, + 410293664030779, + 11709836394715, + 21888242871839275222246405745257275088548364400416034343698203854780083755834, + 217059526227993, + 21888242871839275222246405745257275088548364400416034343698203821282685015276, + 520885285629083, + 112331429141873, + 509487587998608, + 32158487672597, + 21888242871839275222246405745257275088548364400416034343698203987940192394440, + 251226261437697, + 77602150667213, + 21888242871839275222246405745257275088548364400416034343698203942575968612240, + 21888242871839275222246405745257275088548364400416034343698203686633626535913, + 21888242871839275222246405745257275088548364400416034343698203846054332365839, + 21888242871839275222246405745257275088548364400416034343698203700773830603623, + 555463042100481, + 456383726787436, + 538212347140789, + 273973540886202, + 218079215059307, + 96396981696106, + 21888242871839275222246405745257275088548364400416034343698203845122692835269, + 21888242871839275222246405745257275088548364400416034343698203751544202620541, + 21888242871839275222246405745257275088548364400416034343698204083905016389554, + 390958167188261, + 21888242871839275222246405745257275088548364400416034343698204038570797537302, + 21888242871839275222246405745257275088548364400416034343698203882653089963725, + 48141115500640, + 153587692508400, + 21888242871839275222246405745257275088548364400416034343698203853521155808000, + 121382925960914, + 221826838509082, + 260209486617451, + 21888242871839275222246405745257275088548364400416034343698203838059464692266, + 21888242871839275222246405745257275088548364400416034343698203670554432486814, + 35666037411171, + 425329770183347, + 21888242871839275222246405745257275088548364400416034343698203787200265322748, + 117517270145626, + 21888242871839275222246405745257275088548364400416034343698203856508460868307, + 21888242871839275222246405745257275088548364400416034343698204044484233572795, + 554605126308024, + 449589478039759, + 21888242871839275222246405745257275088548364400416034343698203754866815961877, + 21888242871839275222246405745257275088548364400416034343698203910977786479153, + 21888242871839275222246405745257275088548364400416034343698203956084899575371, + 21888242871839275222246405745257275088548364400416034343698203647055981351092, + ]), +]; + +/************************************ +------------------------------------- +pk_generation (CIRCUIT 1 - PUBLIC KEY THRESHOLD BFV) +------------------------------------- +************************************/ + +pub global PK_GENERATION_BIT_EEK: u32 = 5; +pub global PK_GENERATION_BIT_SK: u32 = 1; +pub global PK_GENERATION_BIT_R1: u32 = 14; +pub global PK_GENERATION_BIT_R2: u32 = 50; +pub global PK_GENERATION_BIT_PK: u32 = 50; + +pub global PK_GENERATION_EEK_BOUND: Field = 20; +pub global PK_GENERATION_SK_BOUND: Field = 1; +pub global PK_GENERATION_R1_BOUNDS: [Field; L] = [8192, 8192, 8192, 8192, 8192]; +pub global PK_GENERATION_R2_BOUNDS: [Field; L] = + [562949958631424, 562949957943296, 562949957615616, 562949957550080, 562949957255168]; + +pub global PK_GENERATION_B_ENC: Field = 28147497671065600; + +pub global PK_GENERATION_CONFIGS: PkGenerationConfigs = PkGenerationConfigs::new( + QIS, + PK_GENERATION_EEK_BOUND, + PK_GENERATION_SK_BOUND, + PK_GENERATION_E_SM_BOUND, + PK_GENERATION_R1_BOUNDS, + PK_GENERATION_R2_BOUNDS, +); + +/************************************ +------------------------------------- +pk_aggregation (CIRCUIT 5) +------------------------------------- +************************************/ + +pub global PK_AGGREGATION_BIT_PK: u32 = 50; + +pub global PK_AGGREGATION_CONFIGS: PkAggregationConfigs = PkAggregationConfigs::new(QIS); + +/************************************ +------------------------------------- +user_data_encryption (USED FOR DATA ENCRYPTION) +------------------------------------- +************************************/ + +pub global USER_DATA_ENCRYPTION_BIT_PK: u32 = 50; +pub global USER_DATA_ENCRYPTION_BIT_CT: u32 = 50; +pub global USER_DATA_ENCRYPTION_BIT_U: u32 = 1; +pub global USER_DATA_ENCRYPTION_BIT_E0: u32 = 55; +pub global USER_DATA_ENCRYPTION_BIT_E1: u32 = 5; +pub global USER_DATA_ENCRYPTION_BIT_K: u32 = 10; +pub global USER_DATA_ENCRYPTION_BIT_R1: u32 = 14; +pub global USER_DATA_ENCRYPTION_BIT_R2: u32 = 50; +pub global USER_DATA_ENCRYPTION_BIT_P1: u32 = 14; +pub global USER_DATA_ENCRYPTION_BIT_P2: u32 = 50; + +pub global USER_DATA_ENCRYPTION_K0IS: [Field; L] = + [730709046303589, 514536261560173, 1009932223962416, 496521862559171, 307370676661322]; +pub global USER_DATA_ENCRYPTION_PK_BOUNDS: [Field; L] = + [562949958631424, 562949957943296, 562949957615616, 562949957550080, 562949957255168]; +pub global USER_DATA_ENCRYPTION_E0_BOUND: Field = 28147497671065600; +pub global USER_DATA_ENCRYPTION_E1_BOUND: Field = 20; +pub global USER_DATA_ENCRYPTION_U_BOUND: Field = 1; +pub global USER_DATA_ENCRYPTION_K1_LOW_BOUND: Field = 0; +pub global USER_DATA_ENCRYPTION_K1_UP_BOUND: Field = 999; +pub global USER_DATA_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [8193, 8193, 8193, 8193, 8193]; +pub global USER_DATA_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [8842, 8650, 9090, 8634, 8466]; +pub global USER_DATA_ENCRYPTION_R2_BOUNDS: [Field; L] = + [562949958631424, 562949957943296, 562949957615616, 562949957550080, 562949957255168]; +pub global USER_DATA_ENCRYPTION_P1_BOUNDS: [Field; L] = [8192, 8192, 8192, 8192, 8192]; +pub global USER_DATA_ENCRYPTION_P2_BOUNDS: [Field; L] = + [562949958631424, 562949957943296, 562949957615616, 562949957550080, 562949957255168]; + +/************************************ +------------------------------------- +user_data_encryption_ct0 (CIRCUIT A - CT0 ENCRYPTION) +------------------------------------- +************************************/ + +pub global USER_DATA_ENCRYPTION_CT0_CONFIGS: UserDataEncryptionCt0Configs = UserDataEncryptionCt0Configs::new( + QIS, + USER_DATA_ENCRYPTION_K0IS, + USER_DATA_ENCRYPTION_E0_BOUND, + USER_DATA_ENCRYPTION_U_BOUND, + USER_DATA_ENCRYPTION_R1_LOW_BOUNDS, + USER_DATA_ENCRYPTION_R1_UP_BOUNDS, + USER_DATA_ENCRYPTION_R2_BOUNDS, + USER_DATA_ENCRYPTION_K1_LOW_BOUND, + USER_DATA_ENCRYPTION_K1_UP_BOUND, +); + +/************************************ +------------------------------------- +user_data_encryption_ct1 (CIRCUIT B - CT1 ENCRYPTION) +------------------------------------- +************************************/ + +pub global USER_DATA_ENCRYPTION_CT1_CONFIGS: UserDataEncryptionCt1Configs = UserDataEncryptionCt1Configs::new( + QIS, + USER_DATA_ENCRYPTION_E1_BOUND, + USER_DATA_ENCRYPTION_U_BOUND, + USER_DATA_ENCRYPTION_P1_BOUNDS, + USER_DATA_ENCRYPTION_P2_BOUNDS, +); + +/************************************ +------------------------------------- +share_decryption (CIRCUIT 6 - THRESHOLD BFV SHARE DECRYPTION) +------------------------------------- +************************************/ + +pub global THRESHOLD_SHARE_DECRYPTION_BIT_CT: u32 = 50; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_SK: u32 = 50; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_E_SM: u32 = 50; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_R1: u32 = 63; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_R2: u32 = 50; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_D: u32 = 50; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_D_NATIVE: u32 = 51; + +pub global THRESHOLD_SHARE_DECRYPTION_R1_BOUNDS: [Field; L] = [ + 4611686061108621314, + 4611686055471476738, + 4611686052787122178, + 4611686052250251266, + 4611686049834332162, +]; +pub global THRESHOLD_SHARE_DECRYPTION_R2_BOUNDS: [Field; L] = + [562949958631424, 562949957943296, 562949957615616, 562949957550080, 562949957255168]; + +pub global THRESHOLD_SHARE_DECRYPTION_CONFIGS: ShareDecryptionConfigs = ShareDecryptionConfigs::new( + QIS, + THRESHOLD_SHARE_DECRYPTION_R1_BOUNDS, + THRESHOLD_SHARE_DECRYPTION_R2_BOUNDS, +); + +/************************************ +------------------------------------- +decrypted_shares_aggregation (CIRCUIT 7) +------------------------------------- +************************************/ + +pub global DECRYPTED_SHARES_AGGREGATION_BIT_NOISE: u32 = 240; +pub global DECRYPTED_SHARES_AGGREGATION_BIT_D_NATIVE: u32 = 51; + +pub global DECRYPTED_SHARES_AGGREGATION_CONFIGS: DecryptedSharesAggregationConfigs = + DecryptedSharesAggregationConfigs::new(QIS, PLAINTEXT_MODULUS, Q_INVERSE_MOD_T); diff --git a/circuits/lib/src/configs/secure/dkg.nr b/circuits/lib/src/configs/secure_8192/dkg.nr similarity index 66% rename from circuits/lib/src/configs/secure/dkg.nr rename to circuits/lib/src/configs/secure_8192/dkg.nr index 6a69e39516..a492c0d3d4 100644 --- a/circuits/lib/src/configs/secure/dkg.nr +++ b/circuits/lib/src/configs/secure_8192/dkg.nr @@ -4,24 +4,25 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -pub use crate::configs::secure::threshold::{ +pub use crate::configs::secure_8192::threshold::{ L as L_THRESHOLD, PK_GENERATION_BIT_E_SM as SHARE_COMPUTATION_E_SM_BIT_SECRET, QIS as QIS_THRESHOLD, THRESHOLD_SHARE_DECRYPTION_BIT_SK as SHARE_DECRYPTION_BIT_AGG, }; use crate::core::dkg::share_computation::Configs as ShareComputationConfigs; use crate::core::dkg::share_encryption::Configs as ShareEncryptionConfigs; -// Global configs for DKG secure preset +// Global configs for DKG secure_8192 preset pub global N: u32 = 8192; pub global L: u32 = 2; -pub global QIS: [Field; L] = [576460752303439873, 576460752303702017]; -pub global PLAINTEXT_MODULUS: Field = 144115188098531329; -pub global Q_MOD_T: Field = 8200076927336457; -pub global Q_MOD_T_CENTERED: Field = 8200076927336457; +pub global QIS: [Field; L] = [1152921504606994433, 1152921504607191041]; +pub global PLAINTEXT_MODULUS: Field = 288230376164294657; +pub global Q_MOD_T: Field = 2508586813587465; +pub global Q_MOD_T_CENTERED: Field = 2508586813587465; +pub global DKG_ERROR_BOUND: Field = 20; // Parity matrix is sized for the active committee and the secure-8192 threshold QIS; -// see `committee/{name}/parity_secure.nr`. Re-exported via `committee::active`. -pub use crate::configs::committee::active::PARITY_MATRIX_SECURE as PARITY_MATRIX; +// see `committee/{name}/parity_secure_8192.nr`. Re-exported via `committee::active`. +pub use crate::configs::committee::active::PARITY_MATRIX_SECURE_8192 as PARITY_MATRIX; /************************************ ------------------------------------- @@ -30,8 +31,7 @@ pk (CIRCUIT 0) ************************************/ // pk - bit parameters - -pub global PK_BIT_PK: u32 = 59; +pub global PK_BIT_PK: u32 = 60; /************************************ ------------------------------------- @@ -39,15 +39,13 @@ share_computation_sk (CIRCUIT 2a) ------------------------------------- ************************************/ -// share_computation_sk - bit parameters -pub global SHARE_COMPUTATION_BIT_SHARE: u32 = 58; +pub global SHARE_COMPUTATION_BIT_SHARE: u32 = 59; pub global SHARE_COMPUTATION_SK_BIT_SECRET: u32 = 1; pub global SHARE_COMPUTATION_CHUNK_SIZE: u32 = 512; pub global SHARE_COMPUTATION_N_CHUNKS: u32 = 16; pub global SHARE_COMPUTATION_CHUNKS_PER_BATCH: u32 = 4; pub global SHARE_COMPUTATION_N_BATCHES: u32 = 4; -// share_computation_sk - configs pub global SHARE_COMPUTATION_SK_CONFIGS: ShareComputationConfigs = ShareComputationConfigs::new(QIS_THRESHOLD); @@ -57,7 +55,6 @@ share_computation_e_sm (CIRCUIT 2b) ------------------------------------- ************************************/ -// verify_shares - configs pub global SHARE_COMPUTATION_E_SM_CONFIGS: ShareComputationConfigs = ShareComputationConfigs::new(QIS_THRESHOLD); @@ -68,28 +65,28 @@ share_encryption_e_sm (CIRCUIT 3b) ------------------------------------- ************************************/ -pub global SHARE_ENCRYPTION_BIT_PK: u32 = 59; -pub global SHARE_ENCRYPTION_BIT_CT: u32 = 59; +pub global SHARE_ENCRYPTION_BIT_PK: u32 = 60; +pub global SHARE_ENCRYPTION_BIT_CT: u32 = 60; pub global SHARE_ENCRYPTION_BIT_U: u32 = 1; pub global SHARE_ENCRYPTION_BIT_E0: u32 = 5; pub global SHARE_ENCRYPTION_BIT_E1: u32 = 5; -pub global SHARE_ENCRYPTION_BIT_MSG: u32 = 58; -pub global SHARE_ENCRYPTION_BIT_R1: u32 = 55; -pub global SHARE_ENCRYPTION_BIT_R2: u32 = 59; +pub global SHARE_ENCRYPTION_BIT_MSG: u32 = 59; +pub global SHARE_ENCRYPTION_BIT_R1: u32 = 58; +pub global SHARE_ENCRYPTION_BIT_R2: u32 = 60; pub global SHARE_ENCRYPTION_BIT_P1: u32 = 13; -pub global SHARE_ENCRYPTION_BIT_P2: u32 = 59; +pub global SHARE_ENCRYPTION_BIT_P2: u32 = 60; -pub global SHARE_ENCRYPTION_K0IS: [Field; L] = [240095369310641205, 34620936476510664]; -pub global SHARE_ENCRYPTION_PK_BOUNDS: [Field; L] = [288230376151719936, 288230376151851008]; +pub global SHARE_ENCRYPTION_K0IS: [Field; L] = [362086980741092512, 639891851793844136]; +pub global SHARE_ENCRYPTION_PK_BOUNDS: [Field; L] = [576460752303497216, 576460752303595520]; pub global SHARE_ENCRYPTION_E0_BOUND: Field = 20; pub global SHARE_ENCRYPTION_E1_BOUND: Field = 20; pub global SHARE_ENCRYPTION_U_BOUND: Field = 1; -pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [30011921168555547, 4327617060246757]; -pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [30011921168555547, 4327617060246757]; -pub global SHARE_ENCRYPTION_R2_BOUNDS: [Field; L] = [288230376151719936, 288230376151851008]; +pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [4096, 4096]; +pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [90521745189217441, 159972962955401129]; +pub global SHARE_ENCRYPTION_R2_BOUNDS: [Field; L] = [576460752303497216, 576460752303595520]; pub global SHARE_ENCRYPTION_P1_BOUNDS: [Field; L] = [4096, 4096]; -pub global SHARE_ENCRYPTION_P2_BOUNDS: [Field; L] = [288230376151719936, 288230376151851008]; -pub global SHARE_ENCRYPTION_MSG_BOUND: Field = 144115188098531328; +pub global SHARE_ENCRYPTION_P2_BOUNDS: [Field; L] = [576460752303497216, 576460752303595520]; +pub global SHARE_ENCRYPTION_MSG_BOUND: Field = 288230376164294656; pub global SHARE_ENCRYPTION_CONFIGS: ShareEncryptionConfigs = ShareEncryptionConfigs::new( PLAINTEXT_MODULUS, @@ -115,5 +112,5 @@ share_decryption_e_sm (CIRCUIT 4b - BFV DECRYPTION E_SM) ------------------------------------- ************************************/ -pub global SHARE_DECRYPTION_BIT_MSG: u32 = 58; +pub global SHARE_DECRYPTION_BIT_MSG: u32 = 59; // SHARE_DECRYPTION_BIT_AGG: see `pub use` of `THRESHOLD_SHARE_DECRYPTION_BIT_SK` (C6 `BIT_SK`). diff --git a/circuits/lib/src/configs/secure_8192/mod.nr b/circuits/lib/src/configs/secure_8192/mod.nr new file mode 100644 index 0000000000..7f7f3382b1 --- /dev/null +++ b/circuits/lib/src/configs/secure_8192/mod.nr @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +pub mod dkg; +pub mod threshold; diff --git a/circuits/lib/src/configs/secure/threshold.nr b/circuits/lib/src/configs/secure_8192/threshold.nr similarity index 63% rename from circuits/lib/src/configs/secure/threshold.nr rename to circuits/lib/src/configs/secure_8192/threshold.nr index 3b4819dc60..6fd9050681 100644 --- a/circuits/lib/src/configs/secure/threshold.nr +++ b/circuits/lib/src/configs/secure_8192/threshold.nr @@ -13,24609 +13,24609 @@ use crate::core::threshold::user_data_encryption_ct1::Configs as UserDataEncrypt use crate::math::polynomial::Polynomial; pub use crate::configs::committee::active::{ - SECURE_E_SM_BIT as PK_GENERATION_BIT_E_SM, SECURE_E_SM_BOUND as PK_GENERATION_E_SM_BOUND, + SECURE_8192_E_SM_BIT as PK_GENERATION_BIT_E_SM, + SECURE_8192_E_SM_BOUND as PK_GENERATION_E_SM_BOUND, }; -/// Threshold BFV parameter set search defaults configurations. -/// These are for the SecureThreshold8192 preset. -/// The InsecureThreshold512 preset has been generated manually. -pub global PARAMS_SEARCH_N: Field = 10; +// Global configs for threshold secure_8192 preset +pub global N: u32 = 8192; +pub global L: u32 = 3; +pub global QIS: [Field; L] = [288230376164294657, 288230376162459649, 288230376161738753]; +pub global PLAINTEXT_MODULUS: Field = 1000000; +pub global Q_MOD_T: Field = 964929; +pub global Q_MOD_T_CENTERED: Field = -35071; +pub global Q_INVERSE_MOD_T: Field = 663169; pub global PARAMS_SEARCH_Z: Field = 1000000; +pub global PARAMS_LAMBDA: u32 = 45; +pub global PARAMS_TWO_POW_LAMBDA_PLUS_ONE: Field = 70368744177664; +pub global PARAMS_MULT_DEPTH: u32 = 0; +pub global PARAMS_SMUDGING_B_ENC: Field = 230584300921369395200; pub global CRP: [Polynomial; L] = [ Polynomial::new([ - 64423421191061987, - 56622015395092759, - 32374315637526034, - 21888242871839275222246405745257275088548364400416034343698170623953903783008, - 21888242871839275222246405745257275088548364400416034343698167924918723944886, - 21888242871839275222246405745257275088548364400416034343698170039020879463663, - 21888242871839275222246405745257275088548364400416034343698191622101554370346, - 21888242871839275222246405745257275088548364400416034343698160978528329284337, - 21888242871839275222246405745257275088548364400416034343698151121519908337205, - 27117188331199971, - 21888242871839275222246405745257275088548364400416034343698138795785197148394, - 33486316474189341, - 21888242871839275222246405745257275088548364400416034343698190304071529423312, - 21888242871839275222246405745257275088548364400416034343698156930368310151642, - 21888242871839275222246405745257275088548364400416034343698191477199068173359, - 21888242871839275222246405745257275088548364400416034343698188820478713639261, - 21888242871839275222246405745257275088548364400416034343698175201922837754004, - 58325658285154073, - 1234303892674258, - 66113584951542965, - 21888242871839275222246405745257275088548364400416034343698146750905604049627, - 21888242871839275222246405745257275088548364400416034343698143446485486952679, - 21888242871839275222246405745257275088548364400416034343698177366208111186481, - 21888242871839275222246405745257275088548364400416034343698145762656055157320, - 69188081073774099, - 57241524169430960, - 44191256914891040, - 21888242871839275222246405745257275088548364400416034343698175123243265153158, - 7356127097071390, - 40822303396959568, - 21888242871839275222246405745257275088548364400416034343698175826277842196948, - 21888242871839275222246405745257275088548364400416034343698200634350827138911, - 21888242871839275222246405745257275088548364400416034343698167395959493462357, - 39586395873779654, - 21888242871839275222246405745257275088548364400416034343698162779734854229581, - 21888242871839275222246405745257275088548364400416034343698184175601979111400, - 21888242871839275222246405745257275088548364400416034343698152948293820980912, - 27257909976306219, - 21888242871839275222246405745257275088548364400416034343698181879977697022741, - 63732494607599551, - 21888242871839275222246405745257275088548364400416034343698193850324800785377, - 65909192275324294, - 21888242871839275222246405745257275088548364400416034343698194801069133138728, - 21888242871839275222246405745257275088548364400416034343698157828682394197739, - 66153651070671435, - 21888242871839275222246405745257275088548364400416034343698163768293521913470, - 21888242871839275222246405745257275088548364400416034343698142119236986500660, - 21888242871839275222246405745257275088548364400416034343698158654910173944569, - 21888242871839275222246405745257275088548364400416034343698192106279836410588, - 20639769612488070, - 21888242871839275222246405745257275088548364400416034343698132950485100696359, - 21888242871839275222246405745257275088548364400416034343698193254051044433414, - 21888242871839275222246405745257275088548364400416034343698136337659673287858, - 21888242871839275222246405745257275088548364400416034343698193347584233177019, - 14864365015390095, - 21888242871839275222246405745257275088548364400416034343698169646329036662654, - 21888242871839275222246405745257275088548364400416034343698197910675510197263, - 21888242871839275222246405745257275088548364400416034343698188240001286185385, - 12389785762217050, - 819593963004870, - 64570342475575380, - 28436936789324119, - 62939936694956965, - 21006943663010571, - 31081755278127901, - 21888242871839275222246405745257275088548364400416034343698180920141632982045, - 21888242871839275222246405745257275088548364400416034343698164804964504117972, - 21888242871839275222246405745257275088548364400416034343698178798814296125594, - 6566556134825451, - 63739286081331971, - 45639916891903571, - 32052425739286333, - 860313255296896, - 52913415025313026, - 32404906724304073, - 71102240760568635, - 21888242871839275222246405745257275088548364400416034343698197854528975462866, - 46339424103275645, - 33186069283734273, - 33274328338136123, - 705639839845454, - 62792268116119855, - 33240475656556021, - 21888242871839275222246405745257275088548364400416034343698179570976678660666, - 21888242871839275222246405745257275088548364400416034343698166818189014495144, - 44663636969203409, - 61133843547085591, - 21888242871839275222246405745257275088548364400416034343698140411797941954274, - 41281526873321268, - 21888242871839275222246405745257275088548364400416034343698170003834388229307, - 21888242871839275222246405745257275088548364400416034343698193819513604945617, - 32199073756120895, - 21888242871839275222246405745257275088548364400416034343698136848776993879899, - 34978110997779697, - 69089984429765280, - 24580091788981886, - 21888242871839275222246405745257275088548364400416034343698165724180063230594, - 6605381105813103, - 32984539968472246, - 21888242871839275222246405745257275088548364400416034343698147549152316422888, - 3211716067384261, - 21888242871839275222246405745257275088548364400416034343698201621069229517826, - 21888242871839275222246405745257275088548364400416034343698148312935907541205, - 5554247074221288, - 21888242871839275222246405745257275088548364400416034343698189196315173009532, - 14826337732696643, - 64696653283472657, - 65317601862622216, - 18746902263570017, - 14257782260780569, - 70721014908123464, - 21888242871839275222246405745257275088548364400416034343698150298437888243562, - 9956826279804947, - 21888242871839275222246405745257275088548364400416034343698203684429780661173, - 21888242871839275222246405745257275088548364400416034343698135674350672563255, - 21888242871839275222246405745257275088548364400416034343698184742358656219401, - 66655983703069043, - 21888242871839275222246405745257275088548364400416034343698198927535911642693, - 4412954584622991, - 62117788482932625, - 21888242871839275222246405745257275088548364400416034343698151371180649788817, - 53725238974076828, - 58045189248207350, - 21888242871839275222246405745257275088548364400416034343698133369488697429742, - 21888242871839275222246405745257275088548364400416034343698203510585199022532, - 21888242871839275222246405745257275088548364400416034343698172947063542374871, - 269251930466964, - 21888242871839275222246405745257275088548364400416034343698184097421545521243, - 21888242871839275222246405745257275088548364400416034343698184291427949504128, - 21888242871839275222246405745257275088548364400416034343698156602430723632263, - 71361950874795523, - 2545716483263006, - 57746965916916570, - 29121982480528141, - 16698447288057483, - 21888242871839275222246405745257275088548364400416034343698183808436155950976, - 50115126150775863, - 54063899121447, - 27204412240376033, - 36208196524730761, - 21888242871839275222246405745257275088548364400416034343698133556867949764024, - 21888242871839275222246405745257275088548364400416034343698204120073036062447, - 19293508861655548, - 21888242871839275222246405745257275088548364400416034343698162766555346723294, - 21888242871839275222246405745257275088548364400416034343698145946372515310730, - 2237999468249799, - 21888242871839275222246405745257275088548364400416034343698171703038327078555, - 59050881384014279, - 21888242871839275222246405745257275088548364400416034343698137334598786071320, - 21888242871839275222246405745257275088548364400416034343698140310494935546893, - 21888242871839275222246405745257275088548364400416034343698193622660615430719, - 10935596612436430, - 21888242871839275222246405745257275088548364400416034343698192448033960303567, - 21888242871839275222246405745257275088548364400416034343698142478022325449943, - 29670589427245594, - 21888242871839275222246405745257275088548364400416034343698152625492932385845, - 21888242871839275222246405745257275088548364400416034343698152760048763821755, - 21888242871839275222246405745257275088548364400416034343698141339605342171863, - 21888242871839275222246405745257275088548364400416034343698150602019698384356, - 7437581411199397, - 21888242871839275222246405745257275088548364400416034343698166685367733886110, - 21888242871839275222246405745257275088548364400416034343698146660351275307177, - 21888242871839275222246405745257275088548364400416034343698184667815294736573, - 21906084960355078, - 21888242871839275222246405745257275088548364400416034343698176269552186435212, - 11017269875160965, - 44076573981160937, - 65836161461370156, - 21888242871839275222246405745257275088548364400416034343698145495530682093620, - 39614736857367227, - 21888242871839275222246405745257275088548364400416034343698186461657688728883, - 21888242871839275222246405745257275088548364400416034343698194296657359907841, - 21888242871839275222246405745257275088548364400416034343698149819874151398952, - 46098339849838042, - 21888242871839275222246405745257275088548364400416034343698186529282362588538, - 21888242871839275222246405745257275088548364400416034343698137836374940776624, - 27534362671008859, - 11609327994977698, - 21888242871839275222246405745257275088548364400416034343698138198034309976240, - 59316001969169394, - 52717056242108695, - 33835078628447669, - 13309817226325027, - 21888242871839275222246405745257275088548364400416034343698132546840840640935, - 70513801779071625, - 21888242871839275222246405745257275088548364400416034343698154408845908074380, - 10071696273716743, - 21888242871839275222246405745257275088548364400416034343698166664280609665494, - 9807592408411619, - 53206354103561450, - 21888242871839275222246405745257275088548364400416034343698135763463144799213, - 53314112130859696, - 64882769406172840, - 21888242871839275222246405745257275088548364400416034343698143032418600377432, - 16035665961129771, - 21888242871839275222246405745257275088548364400416034343698162652834605419347, - 19068332681195262, - 35847719497503807, - 27089836444450559, - 67648080094664773, - 21888242871839275222246405745257275088548364400416034343698198170996752506030, - 3434318632793790, - 21888242871839275222246405745257275088548364400416034343698162817105444083130, - 21888242871839275222246405745257275088548364400416034343698197370252240688900, - 39915752953973675, - 67094120689590526, - 4920577061775663, - 4777835344900625, - 50903943596430462, - 46889838921023606, - 21888242871839275222246405745257275088548364400416034343698158442749590589753, - 21888242871839275222246405745257275088548364400416034343698132910958794954200, - 21888242871839275222246405745257275088548364400416034343698139348717064401080, - 24108552803457699, - 68248124404265871, - 21888242871839275222246405745257275088548364400416034343698174958816149768419, - 46704078838810912, - 21888242871839275222246405745257275088548364400416034343698185312887580147678, - 21888242871839275222246405745257275088548364400416034343698134421589494003778, - 59058405749955073, - 21888242871839275222246405745257275088548364400416034343698142185208450291272, - 37820233911398053, - 21888242871839275222246405745257275088548364400416034343698199554351457254102, - 21888242871839275222246405745257275088548364400416034343698137007586582768257, - 21888242871839275222246405745257275088548364400416034343698166754346919930300, - 59891442274354296, - 44784732727945138, - 15154974510371481, - 21888242871839275222246405745257275088548364400416034343698188243092727597260, - 21888242871839275222246405745257275088548364400416034343698138446296020883291, - 27225164177874817, - 3474242573177573, - 31176432100075848, - 21888242871839275222246405745257275088548364400416034343698177505020752214273, - 21888242871839275222246405745257275088548364400416034343698174297665085734226, - 29623544326905278, - 21888242871839275222246405745257275088548364400416034343698171884048476253517, - 48034866344702339, - 11389951801537952, - 54999000360158696, - 67946923703645994, - 37256910282627475, - 2782690785370268, - 21888242871839275222246405745257275088548364400416034343698132339514481920053, - 21888242871839275222246405745257275088548364400416034343698174291440797351498, - 21888242871839275222246405745257275088548364400416034343698162679168265065674, - 21888242871839275222246405745257275088548364400416034343698141138036711585650, - 21888242871839275222246405745257275088548364400416034343698188168548785442434, - 53135751063925536, - 21888242871839275222246405745257275088548364400416034343698194295906837176829, - 32975624545815166, - 21888242871839275222246405745257275088548364400416034343698175588350558031614, - 21888242871839275222246405745257275088548364400416034343698197488659949775822, - 66471705686069065, - 68521129804570668, - 24028958625857962, - 6995618237189577, - 26448892680478385, - 21888242871839275222246405745257275088548364400416034343698136688905569203687, - 21888242871839275222246405745257275088548364400416034343698139616629028469431, - 21888242871839275222246405745257275088548364400416034343698196545314348579025, - 53052234168505607, - 21888242871839275222246405745257275088548364400416034343698194736425191670681, - 21888242871839275222246405745257275088548364400416034343698138235132995111829, - 21888242871839275222246405745257275088548364400416034343698197826424410456783, - 21888242871839275222246405745257275088548364400416034343698182775327030757413, - 45287752005611708, - 14207843588695172, - 21888242871839275222246405745257275088548364400416034343698155816098542918537, - 70115237064839226, - 59944702214875386, - 57164709360937272, - 2863574162062351, - 21888242871839275222246405745257275088548364400416034343698136247010935174287, - 11139979611671613, - 21888242871839275222246405745257275088548364400416034343698165192738003031963, - 21888242871839275222246405745257275088548364400416034343698159779024967765031, - 36497751614881190, - 21888242871839275222246405745257275088548364400416034343698190691677208262647, - 21888242871839275222246405745257275088548364400416034343698152235384574567897, - 7944791025627601, - 56111016203114664, - 30154788514999961, - 35991815738243917, - 21888242871839275222246405745257275088548364400416034343698143010125726306810, - 21888242871839275222246405745257275088548364400416034343698165232241290496272, - 27032064644913470, - 41760309666395853, - 21888242871839275222246405745257275088548364400416034343698136281469904911872, - 21888242871839275222246405745257275088548364400416034343698195220902665586088, - 55026794425228077, - 25846293491741127, - 21888242871839275222246405745257275088548364400416034343698188187965128443299, - 41766506138131781, - 21888242871839275222246405745257275088548364400416034343698170182094775144604, - 59752008407861925, - 21888242871839275222246405745257275088548364400416034343698202941812650528497, - 4279492874867769, - 58382328431798800, - 52373687015494526, - 21888242871839275222246405745257275088548364400416034343698156267764587634361, - 58434461963734953, - 24421644881941891, - 21888242871839275222246405745257275088548364400416034343698196947009981420367, - 21888242871839275222246405745257275088548364400416034343698139320595385831463, - 21888242871839275222246405745257275088548364400416034343698154847306593946856, - 21888242871839275222246405745257275088548364400416034343698177320283588690018, - 53930285079715610, - 21888242871839275222246405745257275088548364400416034343698158575871880072922, - 27340300621808791, - 39447533924717207, - 32617858495660789, - 49934873728738604, - 15567398591643807, - 27992855366871026, - 21888242871839275222246405745257275088548364400416034343698192448230944481516, - 21888242871839275222246405745257275088548364400416034343698203876520099273071, - 1932978734587876, - 9873504768248311, - 21888242871839275222246405745257275088548364400416034343698189467182686618553, - 50385077863596138, - 21888242871839275222246405745257275088548364400416034343698160554388810884291, - 21888242871839275222246405745257275088548364400416034343698150874355020167631, - 21888242871839275222246405745257275088548364400416034343698197188169619203924, - 21888242871839275222246405745257275088548364400416034343698193685690548656600, - 57909895804729759, - 54958899992292389, - 21888242871839275222246405745257275088548364400416034343698181795057140527731, - 21888242871839275222246405745257275088548364400416034343698168700731820250696, - 48213809294138337, - 69940747770653725, - 21888242871839275222246405745257275088548364400416034343698155266558615310571, - 55740168616691060, - 3971773948957453, - 21888242871839275222246405745257275088548364400416034343698159191509819170150, - 21888242871839275222246405745257275088548364400416034343698139802723946781074, - 15100489054253798, - 11981558936633820, - 21888242871839275222246405745257275088548364400416034343698202277953811898486, - 21888242871839275222246405745257275088548364400416034343698148432280079676472, - 31382798834483377, - 21888242871839275222246405745257275088548364400416034343698182031538185876116, - 46837061191883350, - 30671223428185933, - 21888242871839275222246405745257275088548364400416034343698138545639359937295, - 27385048006158136, - 21888242871839275222246405745257275088548364400416034343698176919505937606501, - 705287742418935, - 21888242871839275222246405745257275088548364400416034343698186312816151639433, - 8229852703812228, - 26322744135377165, - 51989026803424149, - 19144336153346286, - 40630202675020208, - 21888242871839275222246405745257275088548364400416034343698186692024759583299, - 21888242871839275222246405745257275088548364400416034343698165491678820834641, - 37708650643572548, - 21888242871839275222246405745257275088548364400416034343698198383402898998759, - 21888242871839275222246405745257275088548364400416034343698153805703770858333, - 21888242871839275222246405745257275088548364400416034343698200767922219772833, - 5665587137172487, - 19394367617315088, - 16186199619739204, - 3819719196993572, - 44264469313125921, - 51696967307823558, - 31013403280844537, - 21888242871839275222246405745257275088548364400416034343698151430545328392930, - 21888242871839275222246405745257275088548364400416034343698147154737294644319, - 68444758386310894, - 21888242871839275222246405745257275088548364400416034343698200037971112471025, - 21888242871839275222246405745257275088548364400416034343698195250778282505739, - 15774637210580516, - 57098898633863555, - 65439476589824111, - 40657769456572767, - 21888242871839275222246405745257275088548364400416034343698159855640175774951, - 21888242871839275222246405745257275088548364400416034343698177167538451439889, - 42626865788180798, - 68829620827800553, - 21888242871839275222246405745257275088548364400416034343698171122169051916352, - 21888242871839275222246405745257275088548364400416034343698156136064138566004, - 36356468029196687, - 21888242871839275222246405745257275088548364400416034343698160608778143908189, - 21888242871839275222246405745257275088548364400416034343698184501583725860518, - 21888242871839275222246405745257275088548364400416034343698186024686251587499, - 48674054422352656, - 21888242871839275222246405745257275088548364400416034343698170486688327252898, - 21888242871839275222246405745257275088548364400416034343698191570515363012785, - 42547361882804966, - 21888242871839275222246405745257275088548364400416034343698139910200813974935, - 21888242871839275222246405745257275088548364400416034343698176162472608403496, - 21888242871839275222246405745257275088548364400416034343698133642364181400714, - 71526098888111893, - 21888242871839275222246405745257275088548364400416034343698157131938550614269, - 21888242871839275222246405745257275088548364400416034343698157610511562579777, - 18180900557727302, - 21888242871839275222246405745257275088548364400416034343698193713029693983690, - 21888242871839275222246405745257275088548364400416034343698195703087740013387, - 17712745299803511, - 21888242871839275222246405745257275088548364400416034343698146917773380117897, - 21888242871839275222246405745257275088548364400416034343698162660840202560537, - 54343775962513245, - 29737448751929781, - 21888242871839275222246405745257275088548364400416034343698159731903057390819, - 21888242871839275222246405745257275088548364400416034343698176716498772608484, - 41989776396766383, - 21888242871839275222246405745257275088548364400416034343698174346193465822340, - 46548184448533912, - 21888242871839275222246405745257275088548364400416034343698171582617021637486, - 18769831667143359, - 11833765801711786, - 21888242871839275222246405745257275088548364400416034343698164954228082997504, - 2728736960989138, - 21888242871839275222246405745257275088548364400416034343698136023251265575349, - 21888242871839275222246405745257275088548364400416034343698166630642026243355, - 21888242871839275222246405745257275088548364400416034343698175681327661484441, - 21888242871839275222246405745257275088548364400416034343698175915844636216554, - 33896950901666289, - 8688602212984399, - 51218423144172535, - 21888242871839275222246405745257275088548364400416034343698176170055863275629, - 21888242871839275222246405745257275088548364400416034343698150665970038531958, - 7897362424277010, - 21888242871839275222246405745257275088548364400416034343698203737776222224288, - 21888242871839275222246405745257275088548364400416034343698203868140069353571, - 28894397753512155, - 26200339356106429, - 17257652748566870, - 48997154297207095, - 21888242871839275222246405745257275088548364400416034343698197223377717449758, - 21888242871839275222246405745257275088548364400416034343698151988874938679387, - 3478964918321174, - 65057942782342970, - 68073778907824955, - 35814872205881976, - 21888242871839275222246405745257275088548364400416034343698190051907036886293, - 4270257217779713, - 21888242871839275222246405745257275088548364400416034343698188567132067985678, - 35536329941325825, - 58335261688681186, - 21888242871839275222246405745257275088548364400416034343698148375472761657227, - 59678327205963253, - 21888242871839275222246405745257275088548364400416034343698178253323814045254, - 21888242871839275222246405745257275088548364400416034343698184590311450336991, - 21888242871839275222246405745257275088548364400416034343698201818065844415500, - 21888242871839275222246405745257275088548364400416034343698179267535421242249, - 63453510050031093, - 8862278857819550, - 54430461969021472, - 23355336572508648, - 21888242871839275222246405745257275088548364400416034343698180784489646290014, - 30745827049213638, - 21888242871839275222246405745257275088548364400416034343698178333858823776093, - 51243112651344132, - 21888242871839275222246405745257275088548364400416034343698177985986877596162, - 21888242871839275222246405745257275088548364400416034343698182566612691621226, - 34412357818680325, - 21888242871839275222246405745257275088548364400416034343698133242229370646966, - 64684320859605107, - 58467789725351962, - 21888242871839275222246405745257275088548364400416034343698133831323707921891, - 21888242871839275222246405745257275088548364400416034343698144788634488822939, - 21888242871839275222246405745257275088548364400416034343698180447716442746512, - 26331196666497689, - 39608581109080867, - 21888242871839275222246405745257275088548364400416034343698183046212579622561, - 21888242871839275222246405745257275088548364400416034343698188672930245904424, - 2289855927111572, - 22475108854540737, - 21888242871839275222246405745257275088548364400416034343698170284329124513170, - 59670240508757943, - 21888242871839275222246405745257275088548364400416034343698198901282721099797, - 70821232855101427, - 36123152400003773, - 21888242871839275222246405745257275088548364400416034343698191562963717429995, - 56524823613255523, - 21888242871839275222246405745257275088548364400416034343698189662496941922518, - 32668058843762019, - 21888242871839275222246405745257275088548364400416034343698173470845151625062, - 21888242871839275222246405745257275088548364400416034343698157489566624475711, - 21888242871839275222246405745257275088548364400416034343698187163973736771297, - 21888242871839275222246405745257275088548364400416034343698191548723167643483, - 21888242871839275222246405745257275088548364400416034343698179348567284531863, - 47419567554856645, - 21888242871839275222246405745257275088548364400416034343698142429466318157985, - 70381530447883520, - 21888242871839275222246405745257275088548364400416034343698168442191881619068, - 21888242871839275222246405745257275088548364400416034343698179262669467751269, - 13758015159308293, - 21888242871839275222246405745257275088548364400416034343698187146564355063510, - 33895531316479454, - 9516144704328850, - 21888242871839275222246405745257275088548364400416034343698145218851307346124, - 21888242871839275222246405745257275088548364400416034343698191346974016320864, - 21888242871839275222246405745257275088548364400416034343698173797817683144289, - 21888242871839275222246405745257275088548364400416034343698158737404243370205, - 21888242871839275222246405745257275088548364400416034343698150869640244619034, - 21888242871839275222246405745257275088548364400416034343698172574027338481725, - 21888242871839275222246405745257275088548364400416034343698191267061979145215, - 14572118546016273, - 41977524579928020, - 21888242871839275222246405745257275088548364400416034343698181268578302158114, - 1607962047151927, - 21888242871839275222246405745257275088548364400416034343698165399399277129630, - 21888242871839275222246405745257275088548364400416034343698155260144534090884, - 21888242871839275222246405745257275088548364400416034343698188033582166770066, - 13392377539022168, - 16418702263735493, - 21888242871839275222246405745257275088548364400416034343698153126813032782565, - 60845095632539543, - 43860444405849478, - 21888242871839275222246405745257275088548364400416034343698147706257119425607, - 17870692999182903, - 69193463416576940, - 65059894925170182, - 63275490246811352, - 21888242871839275222246405745257275088548364400416034343698142048967149546329, - 5471919707927770, - 21888242871839275222246405745257275088548364400416034343698151076936785897189, - 21888242871839275222246405745257275088548364400416034343698135759008173021993, - 21888242871839275222246405745257275088548364400416034343698186985538321330589, - 67633903080505316, - 21888242871839275222246405745257275088548364400416034343698165036213628522953, - 62562665018312651, - 21213615892520860, - 21888242871839275222246405745257275088548364400416034343698152393877979517571, - 61192209985164772, - 23510934456557335, - 52321982086105898, - 21888242871839275222246405745257275088548364400416034343698191861451732601381, - 21888242871839275222246405745257275088548364400416034343698162229533627745061, - 21888242871839275222246405745257275088548364400416034343698139870263978420883, - 14857887833182960, - 21888242871839275222246405745257275088548364400416034343698156590737682098314, - 21888242871839275222246405745257275088548364400416034343698139670018854321216, - 36790812327502944, - 13957496121109217, - 21888242871839275222246405745257275088548364400416034343698144016618078405305, - 21888242871839275222246405745257275088548364400416034343698153200192988908040, - 21888242871839275222246405745257275088548364400416034343698142363040090616979, - 19385153414755848, - 21888242871839275222246405745257275088548364400416034343698168913401175258051, - 26636960279039710, - 21888242871839275222246405745257275088548364400416034343698192400710605623380, - 12013007755365378, - 47870653440761547, - 23821837267426310, - 21888242871839275222246405745257275088548364400416034343698136347857148496433, - 12949167488587765, - 60017826635414356, - 21888242871839275222246405745257275088548364400416034343698184793566886319203, - 21888242871839275222246405745257275088548364400416034343698171723491230661863, - 63685660313455616, - 3063551328425689, - 21888242871839275222246405745257275088548364400416034343698143254701687896828, - 23095507368973193, - 21888242871839275222246405745257275088548364400416034343698135988042337604846, - 21888242871839275222246405745257275088548364400416034343698199847426390158300, - 20027249330368884, - 13595024470049045, - 21888242871839275222246405745257275088548364400416034343698157232463222759702, - 21888242871839275222246405745257275088548364400416034343698151210879430755741, - 44567927190761948, - 21888242871839275222246405745257275088548364400416034343698185404917078917964, - 21888242871839275222246405745257275088548364400416034343698182335447603654799, - 21888242871839275222246405745257275088548364400416034343698143334232428733582, - 21888242871839275222246405745257275088548364400416034343698150928028691476119, - 21888242871839275222246405745257275088548364400416034343698162710900421377001, - 45772955860589409, - 21888242871839275222246405745257275088548364400416034343698191072876136378963, - 34833177612436402, - 9460072500962974, - 41374459034884080, - 11760895672542866, - 21888242871839275222246405745257275088548364400416034343698193479700060910969, - 21888242871839275222246405745257275088548364400416034343698159683260783474956, - 21888242871839275222246405745257275088548364400416034343698176174061001694158, - 41840845326977991, - 21888242871839275222246405745257275088548364400416034343698194573191481958471, - 32964986575537989, - 21888242871839275222246405745257275088548364400416034343698177056854035627323, - 21888242871839275222246405745257275088548364400416034343698152740093353065246, - 21888242871839275222246405745257275088548364400416034343698164166738149357144, - 10773123698376213, - 33884623864882097, - 21888242871839275222246405745257275088548364400416034343698180135627363731202, - 21888242871839275222246405745257275088548364400416034343698153666793578228241, - 64750894206377500, - 21888242871839275222246405745257275088548364400416034343698197190813759449223, - 38215249260765810, - 21888242871839275222246405745257275088548364400416034343698195020926773268190, - 21888242871839275222246405745257275088548364400416034343698156489362946020339, - 53280311899550806, - 47895414651515527, - 70324517785370625, - 41974966249562723, - 21888242871839275222246405745257275088548364400416034343698194573011670909516, - 21888242871839275222246405745257275088548364400416034343698189015778289944768, - 62780054271549181, - 21888242871839275222246405745257275088548364400416034343698149073224960200297, - 21888242871839275222246405745257275088548364400416034343698148125818343034777, - 21888242871839275222246405745257275088548364400416034343698184105411503175068, - 47885004683889630, - 21888242871839275222246405745257275088548364400416034343698182702706865774081, - 52177824881514881, - 9908329363004737, - 21888242871839275222246405745257275088548364400416034343698199008412599027418, - 21888242871839275222246405745257275088548364400416034343698173531406912744886, - 25932464794562340, - 21888242871839275222246405745257275088548364400416034343698173162914973672595, - 21888242871839275222246405745257275088548364400416034343698155676558118875885, - 31262643621748278, - 50286501604117504, - 21888242871839275222246405745257275088548364400416034343698198518154263250545, - 21888242871839275222246405745257275088548364400416034343698187756287196774102, - 21888242871839275222246405745257275088548364400416034343698134251829599426251, - 26322058678336175, - 21888242871839275222246405745257275088548364400416034343698197223426241472635, - 21888242871839275222246405745257275088548364400416034343698145148073643637005, - 26573984719978652, - 21888242871839275222246405745257275088548364400416034343698158603896828626617, - 57243158007449348, - 21888242871839275222246405745257275088548364400416034343698203551244310070266, - 59657851729593408, - 21888242871839275222246405745257275088548364400416034343698173696918473578217, - 21888242871839275222246405745257275088548364400416034343698160372475258328396, - 21888242871839275222246405745257275088548364400416034343698141461479160111460, - 12717407974153949, - 37746104588456946, - 21888242871839275222246405745257275088548364400416034343698181302928894787124, - 4923383146810589, - 21888242871839275222246405745257275088548364400416034343698200629741712821850, - 51251814525836217, - 21888242871839275222246405745257275088548364400416034343698138365177754671451, - 21888242871839275222246405745257275088548364400416034343698192482915605692788, - 21888242871839275222246405745257275088548364400416034343698182290694544376679, - 21888242871839275222246405745257275088548364400416034343698195310602764576385, - 41646388539453381, - 21888242871839275222246405745257275088548364400416034343698193694180011028081, - 21888242871839275222246405745257275088548364400416034343698151090853989664470, - 33221620215244307, - 31141399437176795, - 47122402422245128, - 21888242871839275222246405745257275088548364400416034343698181323751095018154, - 21888242871839275222246405745257275088548364400416034343698190348511560927012, - 21888242871839275222246405745257275088548364400416034343698196240712601985336, - 21888242871839275222246405745257275088548364400416034343698196686362721456693, - 21341788464083172, - 19359554417204352, - 33823136272087538, - 21888242871839275222246405745257275088548364400416034343698148038290856879785, - 46437527061592699, - 2815760314992698, - 21888242871839275222246405745257275088548364400416034343698165261381441413147, - 64573564896593510, - 21888242871839275222246405745257275088548364400416034343698167104152031178979, - 12763450238328408, - 56851854329401103, - 21888242871839275222246405745257275088548364400416034343698172591500737912273, - 21888242871839275222246405745257275088548364400416034343698139114983762816838, - 57508596028443881, - 21888242871839275222246405745257275088548364400416034343698184610046094894940, - 21888242871839275222246405745257275088548364400416034343698155879657000834598, - 21888242871839275222246405745257275088548364400416034343698154340374044834883, - 21888242871839275222246405745257275088548364400416034343698179814046250156670, - 55274787709270929, - 21888242871839275222246405745257275088548364400416034343698180244735374537515, - 21888242871839275222246405745257275088548364400416034343698152711366568872041, - 21888242871839275222246405745257275088548364400416034343698167525540169139342, - 53438565049532552, - 21888242871839275222246405745257275088548364400416034343698185821315344251426, - 41451344022030862, - 55296728129890056, - 39545001679584236, - 68561403449692805, - 21888242871839275222246405745257275088548364400416034343698174133666472036115, - 21888242871839275222246405745257275088548364400416034343698134310664004813208, - 55176729064789219, - 9581938759959576, - 21888242871839275222246405745257275088548364400416034343698161189442002781706, - 21888242871839275222246405745257275088548364400416034343698157074967074557013, - 45861811254821423, - 21888242871839275222246405745257275088548364400416034343698141466475972425510, - 21888242871839275222246405745257275088548364400416034343698163932426729358926, - 21888242871839275222246405745257275088548364400416034343698166326626190272275, - 21888242871839275222246405745257275088548364400416034343698146615236395466979, - 26209219359038758, - 21888242871839275222246405745257275088548364400416034343698193030702025391036, - 21888242871839275222246405745257275088548364400416034343698161843743601953175, - 21888242871839275222246405745257275088548364400416034343698191420633637050190, - 44319902016534671, - 31121454748574153, - 21888242871839275222246405745257275088548364400416034343698192389865762051738, - 21888242871839275222246405745257275088548364400416034343698140202013610588664, - 21888242871839275222246405745257275088548364400416034343698164747704086477387, - 56018241211209664, - 70891246233345161, - 36216338248149665, - 2741512944855023, - 35936950094263826, - 2130030769789257, - 67746487971488679, - 21888242871839275222246405745257275088548364400416034343698150142695687171538, - 45026901052187299, - 21888242871839275222246405745257275088548364400416034343698197084936017822615, - 4882536683580786, - 71369397622965608, - 34213706245107470, - 67897460618675804, - 21888242871839275222246405745257275088548364400416034343698179611391117376559, - 47505358993081829, - 50592270859335420, - 62825597437248982, - 21888242871839275222246405745257275088548364400416034343698185890555835038359, - 68047809717506095, - 28818673352690013, - 64049364075171519, - 22482839495407533, - 15225534234518076, - 5709964867803719, - 21888242871839275222246405745257275088548364400416034343698143250523915025304, - 5369607678601239, - 21888242871839275222246405745257275088548364400416034343698153326045417651376, - 21888242871839275222246405745257275088548364400416034343698156498231377182066, - 19303493397725763, - 43316076704036026, - 21888242871839275222246405745257275088548364400416034343698161854778811565252, - 15958292324157169, - 21888242871839275222246405745257275088548364400416034343698133086123967317592, - 7819064853115945, - 21888242871839275222246405745257275088548364400416034343698165554934544453092, - 21888242871839275222246405745257275088548364400416034343698152470635891830306, - 21888242871839275222246405745257275088548364400416034343698158678649357148662, - 21888242871839275222246405745257275088548364400416034343698166754984722372050, - 53387894826655633, - 21888242871839275222246405745257275088548364400416034343698154843967968431656, - 21888242871839275222246405745257275088548364400416034343698195269324921585029, - 39088175916961957, - 16596767158499185, - 60927772144030683, - 21888242871839275222246405745257275088548364400416034343698195016789111928821, - 21888242871839275222246405745257275088548364400416034343698173049570582325617, - 31890037058696283, - 68918055466105404, - 37132927705024777, - 21888242871839275222246405745257275088548364400416034343698197160890104419523, - 21888242871839275222246405745257275088548364400416034343698184909910561630039, - 52932315320109005, - 21888242871839275222246405745257275088548364400416034343698190535144619297883, - 59704958696767293, - 69792551684462439, - 46588295410189842, - 63790467448471440, - 70412849522197300, - 21888242871839275222246405745257275088548364400416034343698183863670007075350, - 21888242871839275222246405745257275088548364400416034343698194939268883118251, - 21888242871839275222246405745257275088548364400416034343698134513809027230620, - 28362067858739763, - 39656494382212890, - 8599397874906669, - 12334561092894101, - 26089307690612321, - 21888242871839275222246405745257275088548364400416034343698168307885405525206, - 38937831321679522, - 21888242871839275222246405745257275088548364400416034343698167701860758954094, - 38106662040134776, - 21888242871839275222246405745257275088548364400416034343698200300637797882231, - 42317306210740564, - 4182274251753415, - 21888242871839275222246405745257275088548364400416034343698155149307090457595, - 33059149281804558, - 21888242871839275222246405745257275088548364400416034343698139450621559408680, - 21888242871839275222246405745257275088548364400416034343698182460202681299815, - 4264349680720562, - 29714925429706091, - 4050435649592716, - 70636826223659465, - 21888242871839275222246405745257275088548364400416034343698157147284957255018, - 70695028665004665, - 38497544318645014, - 14295443430024971, - 64099954962072597, - 27861929969950774, - 39097785977245126, - 21888242871839275222246405745257275088548364400416034343698140412461153535758, - 59064033353892339, - 21888242871839275222246405745257275088548364400416034343698200970041552686504, - 455720146716521, - 66208696283605221, - 39058862796457633, - 15349068198017620, - 64707392322336300, - 43912537723234199, - 62311898782033576, - 21888242871839275222246405745257275088548364400416034343698135218555336213754, - 21888242871839275222246405745257275088548364400416034343698158750602955314233, - 48569697302209057, - 41256143277875316, - 21703076023433159, - 21888242871839275222246405745257275088548364400416034343698189326950953303525, - 9581005686913881, - 38261190616216397, - 21888242871839275222246405745257275088548364400416034343698169637552614537516, - 1140272459200374, - 17725187019799176, - 21888242871839275222246405745257275088548364400416034343698148499237296887681, - 21888242871839275222246405745257275088548364400416034343698195837931724882691, - 21888242871839275222246405745257275088548364400416034343698138395775232829680, - 31872399738712954, - 21888242871839275222246405745257275088548364400416034343698181561419447794981, - 35170286757111601, - 16887562671229469, - 21888242871839275222246405745257275088548364400416034343698135152508912618711, - 54453530085916968, - 21888242871839275222246405745257275088548364400416034343698138508201147633437, - 21888242871839275222246405745257275088548364400416034343698132315480687919946, - 40083714834757594, - 21888242871839275222246405745257275088548364400416034343698186376873688482787, - 21888242871839275222246405745257275088548364400416034343698144941103115819032, - 41681291998971046, - 37322706496996294, - 21888242871839275222246405745257275088548364400416034343698143408609837846119, - 8325290191109212, - 12907221042024980, - 45949710880649825, - 21888242871839275222246405745257275088548364400416034343698151371524707561449, - 15653747504623749, - 21888242871839275222246405745257275088548364400416034343698181703207700215562, - 21888242871839275222246405745257275088548364400416034343698134087328352128286, - 21888242871839275222246405745257275088548364400416034343698148954441432579475, - 21888242871839275222246405745257275088548364400416034343698196826525795587291, - 23631791113238312, - 63159638567604544, - 21888242871839275222246405745257275088548364400416034343698181251507146569401, - 32141698332074507, - 21888242871839275222246405745257275088548364400416034343698145392150070890994, - 28237613530293227, - 49917889665977975, - 21888242871839275222246405745257275088548364400416034343698163470384251043991, - 21888242871839275222246405745257275088548364400416034343698198477466306508580, - 45423044128817697, - 21888242871839275222246405745257275088548364400416034343698191598406574350613, - 21888242871839275222246405745257275088548364400416034343698150620823970203665, - 58405234533505506, - 40272493644347293, - 21888242871839275222246405745257275088548364400416034343698144169003751501101, - 21888242871839275222246405745257275088548364400416034343698132465655891695527, - 17568740759547627, - 20401828863784565, - 21888242871839275222246405745257275088548364400416034343698180097380043998661, - 22063806073846943, - 21888242871839275222246405745257275088548364400416034343698148100962904513306, - 34714196595475836, - 62086535826385543, - 41097505386380396, - 21888242871839275222246405745257275088548364400416034343698201104251198670269, - 21704680326783130, - 21888242871839275222246405745257275088548364400416034343698173210563344467482, - 21888242871839275222246405745257275088548364400416034343698197918678353121162, - 21888242871839275222246405745257275088548364400416034343698197626812422491244, - 38427015262065760, - 21888242871839275222246405745257275088548364400416034343698156150563867664008, - 21888242871839275222246405745257275088548364400416034343698198470429551053149, - 8314186229555594, - 30999522262752977, - 21888242871839275222246405745257275088548364400416034343698172665306135457634, - 21888242871839275222246405745257275088548364400416034343698139123453455571497, - 21888242871839275222246405745257275088548364400416034343698164321345320868782, - 21888242871839275222246405745257275088548364400416034343698175978125186797861, - 40133031637416466, - 59460437345517998, - 53029331677004807, - 21888242871839275222246405745257275088548364400416034343698139628941716746320, - 21888242871839275222246405745257275088548364400416034343698160694141276921095, - 3897031993941989, - 26400285796948852, - 21888242871839275222246405745257275088548364400416034343698150933702551210031, - 21888242871839275222246405745257275088548364400416034343698201925260283225669, - 21888242871839275222246405745257275088548364400416034343698182520324552277303, - 21888242871839275222246405745257275088548364400416034343698180256190256853465, - 21888242871839275222246405745257275088548364400416034343698194948845801302792, - 45881062504974053, - 54715593091887548, - 21888242871839275222246405745257275088548364400416034343698177626322434204442, - 4758538724638253, - 14339009796449135, - 70255627239332304, - 21888242871839275222246405745257275088548364400416034343698170622797180792339, - 21888242871839275222246405745257275088548364400416034343698180412413645284916, - 28810246634803221, - 21888242871839275222246405745257275088548364400416034343698158063477091021530, - 34328002221818508, - 21888242871839275222246405745257275088548364400416034343698166630027838118973, - 68394530318145785, - 21888242871839275222246405745257275088548364400416034343698171866752211113894, - 6699998169197010, - 52840691275895447, - 16457702935255890, - 21888242871839275222246405745257275088548364400416034343698171764145284078383, - 47470468330433128, - 21888242871839275222246405745257275088548364400416034343698150154021621439875, - 21888242871839275222246405745257275088548364400416034343698184638076130840499, - 21888242871839275222246405745257275088548364400416034343698134420944368134969, - 35827109411124996, - 36817537324973750, - 45173845726553269, - 41769723984785911, - 64041285875608084, - 21888242871839275222246405745257275088548364400416034343698158107937179820126, - 1479061704408246, - 57085493902359411, - 21888242871839275222246405745257275088548364400416034343698143705039823591662, - 22386298712006228, - 21888242871839275222246405745257275088548364400416034343698148139582882045560, - 43211971713421130, - 21888242871839275222246405745257275088548364400416034343698194300208023845861, - 21888242871839275222246405745257275088548364400416034343698158075063998448621, - 57007557113026098, - 21888242871839275222246405745257275088548364400416034343698155469137182664236, - 21888242871839275222246405745257275088548364400416034343698156985046612214550, - 33585880675512549, - 21888242871839275222246405745257275088548364400416034343698150447575999427159, - 21888242871839275222246405745257275088548364400416034343698195019337669381877, - 21888242871839275222246405745257275088548364400416034343698141203180403629146, - 21888242871839275222246405745257275088548364400416034343698156196982735608503, - 22859566986432186, - 21888242871839275222246405745257275088548364400416034343698171499317978387152, - 21888242871839275222246405745257275088548364400416034343698141386924145238368, - 21888242871839275222246405745257275088548364400416034343698134301523017977610, - 58652571807910494, - 21888242871839275222246405745257275088548364400416034343698194576613748817978, - 6727856140520874, - 21888242871839275222246405745257275088548364400416034343698172665966954001735, - 21888242871839275222246405745257275088548364400416034343698193502335977041373, - 60504842948793122, - 21888242871839275222246405745257275088548364400416034343698163345936632018553, - 36222226099701318, - 21888242871839275222246405745257275088548364400416034343698186934960114681817, - 53694113756014645, - 36872172028323984, - 21888242871839275222246405745257275088548364400416034343698151739193508586074, - 25040204252340170, - 39032928877655922, - 21888242871839275222246405745257275088548364400416034343698143242852399874887, - 21888242871839275222246405745257275088548364400416034343698166733337074538736, - 18128285806787718, - 21888242871839275222246405745257275088548364400416034343698177781843434169672, - 21888242871839275222246405745257275088548364400416034343698143247351567739238, - 21888242871839275222246405745257275088548364400416034343698167952114196565883, - 21888242871839275222246405745257275088548364400416034343698138978678419351810, - 21888242871839275222246405745257275088548364400416034343698162007854165827738, - 21888242871839275222246405745257275088548364400416034343698184927308566446967, - 21888242871839275222246405745257275088548364400416034343698199480495971705397, - 21888242871839275222246405745257275088548364400416034343698164494393990051102, - 24753594031535049, - 10905818233201156, - 35555256126077452, - 48810762046855029, - 21888242871839275222246405745257275088548364400416034343698173544006446154389, - 54741543312137883, - 21888242871839275222246405745257275088548364400416034343698190876930009835242, - 21888242871839275222246405745257275088548364400416034343698192644448203018322, - 21888242871839275222246405745257275088548364400416034343698181946365129911642, - 21888242871839275222246405745257275088548364400416034343698157857136568204884, - 61709843678035343, - 62223817231049107, - 21888242871839275222246405745257275088548364400416034343698203231169756672904, - 21888242871839275222246405745257275088548364400416034343698197415406283199289, - 21888242871839275222246405745257275088548364400416034343698147747285967287721, - 28550294404719975, - 21888242871839275222246405745257275088548364400416034343698145808878159653195, - 54897759806868458, - 47298024398048171, - 1075715949710575, - 36032890437556360, - 21888242871839275222246405745257275088548364400416034343698197175171196839171, - 21888242871839275222246405745257275088548364400416034343698202244192365973842, - 21888242871839275222246405745257275088548364400416034343698141029660966013521, - 60410048475649422, - 21888242871839275222246405745257275088548364400416034343698155617907422817883, - 21888242871839275222246405745257275088548364400416034343698172710066049434422, - 21888242871839275222246405745257275088548364400416034343698159200594260445699, - 67631800659722494, - 15187636613017694, - 21888242871839275222246405745257275088548364400416034343698190139081264181051, - 47396813005295668, - 50879527503305932, - 68729326471311677, - 21888242871839275222246405745257275088548364400416034343698185985783264628853, - 15876016658509060, - 59482046272222746, - 21888242871839275222246405745257275088548364400416034343698200134489571606871, - 65383413521185396, - 21888242871839275222246405745257275088548364400416034343698199572486024601226, - 21888242871839275222246405745257275088548364400416034343698140301846466822356, - 21888242871839275222246405745257275088548364400416034343698183584266169127292, - 55273549828472164, - 21888242871839275222246405745257275088548364400416034343698145362273760346859, - 36834667649626508, - 33054406182542944, - 11711315022504248, - 31223485443034754, - 21888242871839275222246405745257275088548364400416034343698155497370119089280, - 21888242871839275222246405745257275088548364400416034343698180697985014750895, - 21888242871839275222246405745257275088548364400416034343698145136728471521824, - 41220687383534429, - 7906555701994018, - 21888242871839275222246405745257275088548364400416034343698175504155930437836, - 21888242871839275222246405745257275088548364400416034343698199792615301159125, - 21888242871839275222246405745257275088548364400416034343698134018262794753439, - 21888242871839275222246405745257275088548364400416034343698143686020762921608, - 37767927997465452, - 56088187889722632, - 21888242871839275222246405745257275088548364400416034343698193456326032554722, - 51261750709758308, - 52871759793947845, - 70454777164607037, - 8127934627243414, - 21888242871839275222246405745257275088548364400416034343698143048855703592645, - 64035399282461551, - 21888242871839275222246405745257275088548364400416034343698132555161215356189, - 69830073796696221, - 71367333277883845, - 18352123711192935, - 36455381223952619, - 21888242871839275222246405745257275088548364400416034343698199224318420979365, - 21888242871839275222246405745257275088548364400416034343698164087836453734688, - 27399057057129951, - 21888242871839275222246405745257275088548364400416034343698180790486262720727, - 2480753733889788, - 21888242871839275222246405745257275088548364400416034343698165519304175749691, - 21888242871839275222246405745257275088548364400416034343698171472501434635266, - 35914253128080478, - 21888242871839275222246405745257275088548364400416034343698176227197976596167, - 21888242871839275222246405745257275088548364400416034343698166790086340114073, - 71014610032814659, - 66696237478902793, - 21999021892723795, - 25106004234934844, - 66529932926172080, - 21888242871839275222246405745257275088548364400416034343698141357275190012365, - 25415739279402299, - 44114793170457853, - 33453542743187451, - 46829801584599947, - 68468956274736627, - 21888242871839275222246405745257275088548364400416034343698150409933160142362, - 21888242871839275222246405745257275088548364400416034343698178147607895555491, - 21888242871839275222246405745257275088548364400416034343698172611668062934374, - 21888242871839275222246405745257275088548364400416034343698143732991892723847, - 28224463022546887, - 21888242871839275222246405745257275088548364400416034343698154642122196363610, - 21888242871839275222246405745257275088548364400416034343698199964908764213744, - 21888242871839275222246405745257275088548364400416034343698135131120138922504, - 21888242871839275222246405745257275088548364400416034343698142842719639220788, - 21888242871839275222246405745257275088548364400416034343698200721021798046811, - 25715300689684395, - 26267103019434565, - 21888242871839275222246405745257275088548364400416034343698183330519790559670, - 21888242871839275222246405745257275088548364400416034343698153090730535941005, - 57617529691275956, - 21888242871839275222246405745257275088548364400416034343698200737227331605344, - 21888242871839275222246405745257275088548364400416034343698142149383536842783, - 22579183888710761, - 21645271466820538, - 21888242871839275222246405745257275088548364400416034343698149924013226469352, - 21888242871839275222246405745257275088548364400416034343698192316335237514742, - 21888242871839275222246405745257275088548364400416034343698150603813049900860, - 21888242871839275222246405745257275088548364400416034343698197507887177392653, - 28472985717091667, - 21888242871839275222246405745257275088548364400416034343698175811275421278197, - 48926402996150801, - 21714993228268948, - 66044758611310423, - 21888242871839275222246405745257275088548364400416034343698178660819735261184, - 36292868086863930, - 21888242871839275222246405745257275088548364400416034343698142265343261090136, - 15143873630286654, - 64911424943445744, - 21888242871839275222246405745257275088548364400416034343698140521403601299366, - 21888242871839275222246405745257275088548364400416034343698179682730704047000, - 21888242871839275222246405745257275088548364400416034343698143876592285330837, - 59024577853662895, - 21888242871839275222246405745257275088548364400416034343698175268244228206015, - 17480753356618372, - 40272710922866793, - 21888242871839275222246405745257275088548364400416034343698150269960912396910, - 21888242871839275222246405745257275088548364400416034343698146964990699310546, - 48637596528109482, - 64889104807425788, - 21888242871839275222246405745257275088548364400416034343698187553537301896960, - 21888242871839275222246405745257275088548364400416034343698192417716484587573, - 27375151863489015, - 21888242871839275222246405745257275088548364400416034343698169382362035461524, - 21888242871839275222246405745257275088548364400416034343698199470807362570937, - 36360358632417006, - 21888242871839275222246405745257275088548364400416034343698148693792279223333, - 21888242871839275222246405745257275088548364400416034343698197128740945877680, - 21888242871839275222246405745257275088548364400416034343698178796921269445076, - 21888242871839275222246405745257275088548364400416034343698146345466319934578, - 21888242871839275222246405745257275088548364400416034343698195508405586585074, - 63245827189812931, - 32292504278773913, - 21888242871839275222246405745257275088548364400416034343698197107875962599128, - 21888242871839275222246405745257275088548364400416034343698171179727700809999, - 2451196286513369, - 19455069766396264, - 21888242871839275222246405745257275088548364400416034343698197716003438970178, - 20935130630879480, - 3854344780668052, - 19218600467763374, - 42011820896563980, - 50531348958957402, - 21888242871839275222246405745257275088548364400416034343698148224954233130834, - 62254940246869893, - 30627949815429245, - 21888242871839275222246405745257275088548364400416034343698138586676328649419, - 27167875315047259, - 21888242871839275222246405745257275088548364400416034343698167163875300402587, - 21888242871839275222246405745257275088548364400416034343698197533393826130755, - 21888242871839275222246405745257275088548364400416034343698191267880223247123, - 21888242871839275222246405745257275088548364400416034343698161554782686619710, - 21888242871839275222246405745257275088548364400416034343698155405693663199206, - 21888242871839275222246405745257275088548364400416034343698159342675975155095, - 33826973811468298, - 21888242871839275222246405745257275088548364400416034343698183070241792626848, - 21888242871839275222246405745257275088548364400416034343698143243550401199282, - 63001260535038685, - 21888242871839275222246405745257275088548364400416034343698149656676196016797, - 21888242871839275222246405745257275088548364400416034343698202187951122763222, - 12924075658903712, - 17330139024898371, - 21888242871839275222246405745257275088548364400416034343698195377273602006763, - 6727573745334344, - 21888242871839275222246405745257275088548364400416034343698196637817875742959, - 21888242871839275222246405745257275088548364400416034343698188159175097770402, - 58075105367342598, - 16729277210691580, - 59755935399743157, - 69004623107686933, - 13109542768028685, - 56777273598198492, - 24502278802079012, - 21888242871839275222246405745257275088548364400416034343698191141412228466490, - 21888242871839275222246405745257275088548364400416034343698192629043464211268, - 62306331631026107, - 21888242871839275222246405745257275088548364400416034343698161685463762359624, - 14995939891390488, - 27133166646474738, - 49219292581969311, - 21888242871839275222246405745257275088548364400416034343698200712972015870206, - 21888242871839275222246405745257275088548364400416034343698173601081588095651, - 21888242871839275222246405745257275088548364400416034343698154290133074060869, - 21888242871839275222246405745257275088548364400416034343698174315977261210103, - 14171886572675729, - 60132496954852621, - 21888242871839275222246405745257275088548364400416034343698187474526236538983, - 37030448554604009, - 16557785543403077, - 62866685595900857, - 36564242853476818, - 21888242871839275222246405745257275088548364400416034343698152633106005166522, - 21888242871839275222246405745257275088548364400416034343698174075586160691401, - 55667845592288754, - 37142777230549000, - 62918307419435683, - 33844504555133799, - 60369146937164990, - 50504062670921094, - 52417510171020998, - 21888242871839275222246405745257275088548364400416034343698184711771957955156, - 21888242871839275222246405745257275088548364400416034343698187602422749846160, - 21888242871839275222246405745257275088548364400416034343698153215328528354942, - 30309613728932959, - 21888242871839275222246405745257275088548364400416034343698159656512991515447, - 63275442451508723, - 31090105572096670, - 21888242871839275222246405745257275088548364400416034343698190522622815910861, - 21888242871839275222246405745257275088548364400416034343698163343658521136902, - 71459823790127704, - 28905954045359681, - 36558103134187989, - 21888242871839275222246405745257275088548364400416034343698179830775636996841, - 21888242871839275222246405745257275088548364400416034343698138130598830779537, - 21888242871839275222246405745257275088548364400416034343698150965572263706644, - 21888242871839275222246405745257275088548364400416034343698140294338550385170, - 21888242871839275222246405745257275088548364400416034343698185073250315383869, - 53835730812797808, - 57679791327672759, - 328787959519198, - 21888242871839275222246405745257275088548364400416034343698189884572555268287, - 7487697417999047, - 43475181117048548, - 43927925072543473, - 21888242871839275222246405745257275088548364400416034343698145041369549846332, - 21888242871839275222246405745257275088548364400416034343698192455357717925540, - 49618651632446291, - 21888242871839275222246405745257275088548364400416034343698135265078826705422, - 21888242871839275222246405745257275088548364400416034343698183458317317089443, - 17213335873833392, - 21888242871839275222246405745257275088548364400416034343698174763782302430971, - 27799374311462342, - 21888242871839275222246405745257275088548364400416034343698172097874581080092, - 4051674901804840, - 21888242871839275222246405745257275088548364400416034343698142015453820798211, - 30501623289659913, - 18994085638218978, - 21888242871839275222246405745257275088548364400416034343698202660322483490629, - 23510801482694082, - 21888242871839275222246405745257275088548364400416034343698145402768796531639, - 4530258404540086, - 34879662301174286, - 30128174856252189, - 21888242871839275222246405745257275088548364400416034343698155220554123258163, - 52462286334197422, - 21888242871839275222246405745257275088548364400416034343698194077668695645924, - 58962100466116640, - 21888242871839275222246405745257275088548364400416034343698189054629619603431, - 21888242871839275222246405745257275088548364400416034343698132335059744028876, - 21888242871839275222246405745257275088548364400416034343698138880720438370079, - 71381725057856637, - 29236542451032577, - 21888242871839275222246405745257275088548364400416034343698164617798020917776, - 7179603467282781, - 24368108039916214, - 21888242871839275222246405745257275088548364400416034343698173041331823219216, - 17284518283276388, - 21888242871839275222246405745257275088548364400416034343698160395847335976547, - 21888242871839275222246405745257275088548364400416034343698136497553788160809, - 21888242871839275222246405745257275088548364400416034343698175383373958102768, - 21888242871839275222246405745257275088548364400416034343698141572069780419090, - 16440329162835291, - 21888242871839275222246405745257275088548364400416034343698147753302549236901, - 21888242871839275222246405745257275088548364400416034343698160411128205229439, - 58443685595447801, - 21888242871839275222246405745257275088548364400416034343698161496799286442701, - 21888242871839275222246405745257275088548364400416034343698150325534459287219, - 46222152315686225, - 36149786564592188, - 21888242871839275222246405745257275088548364400416034343698160499702985717025, - 18100743130640887, - 47433182010119423, - 21888242871839275222246405745257275088548364400416034343698165496786378127221, - 21888242871839275222246405745257275088548364400416034343698188875410576347591, - 21888242871839275222246405745257275088548364400416034343698198474540818064375, - 21888242871839275222246405745257275088548364400416034343698173903191467229027, - 66127327243494225, - 8103113956162029, - 21888242871839275222246405745257275088548364400416034343698157573630201440343, - 21888242871839275222246405745257275088548364400416034343698190590343125601059, - 11697738071342874, - 21888242871839275222246405745257275088548364400416034343698185622796495750938, - 10132257215759319, - 23196548431789731, - 21888242871839275222246405745257275088548364400416034343698158285914596685688, - 21888242871839275222246405745257275088548364400416034343698167902064212399813, - 21888242871839275222246405745257275088548364400416034343698204082993295933757, - 21888242871839275222246405745257275088548364400416034343698201151994131695192, - 46792984387653816, - 16923384803161543, - 56832202413086784, - 21888242871839275222246405745257275088548364400416034343698179259662828879999, - 5320360690360977, - 21888242871839275222246405745257275088548364400416034343698165574862614028739, - 33291428942631697, - 21888242871839275222246405745257275088548364400416034343698152565207208241533, - 60916641359499539, - 46563218848614555, - 21888242871839275222246405745257275088548364400416034343698191997375109302031, - 35023856095261512, - 21888242871839275222246405745257275088548364400416034343698161689267794020981, - 21888242871839275222246405745257275088548364400416034343698154253342341590792, - 4940707407158009, - 26986208300449851, - 71810988991905479, - 21888242871839275222246405745257275088548364400416034343698191354285589361053, - 21888242871839275222246405745257275088548364400416034343698138519911310077459, - 21888242871839275222246405745257275088548364400416034343698181667799094083126, - 21888242871839275222246405745257275088548364400416034343698163343186663385965, - 21888242871839275222246405745257275088548364400416034343698186824431153422017, - 21888242871839275222246405745257275088548364400416034343698189523485256805230, - 14999730103856681, - 21888242871839275222246405745257275088548364400416034343698138694047104877615, - 21888242871839275222246405745257275088548364400416034343698190112124769575548, - 21888242871839275222246405745257275088548364400416034343698196477924754819776, - 63542126333035947, - 21888242871839275222246405745257275088548364400416034343698203617004043409211, - 16707857818687207, - 21888242871839275222246405745257275088548364400416034343698195496570440556965, - 21888242871839275222246405745257275088548364400416034343698200462453309177127, - 21888242871839275222246405745257275088548364400416034343698185445705671874156, - 21888242871839275222246405745257275088548364400416034343698171227671182258721, - 21888242871839275222246405745257275088548364400416034343698157386657036229202, - 21888242871839275222246405745257275088548364400416034343698157517830049949758, - 16537731518133360, - 21888242871839275222246405745257275088548364400416034343698158329151835775430, - 44331745066336328, - 14899191320832269, - 48063892678615021, - 17819088207619850, - 21888242871839275222246405745257275088548364400416034343698142331278267038792, - 21888242871839275222246405745257275088548364400416034343698200887473634676989, - 21888242871839275222246405745257275088548364400416034343698197037953118479543, - 46806780839879167, - 26812765224140920, - 21888242871839275222246405745257275088548364400416034343698175789538846689520, - 21888242871839275222246405745257275088548364400416034343698148572968761674427, - 21888242871839275222246405745257275088548364400416034343698165419989946419949, - 21888242871839275222246405745257275088548364400416034343698165663112529732341, - 21888242871839275222246405745257275088548364400416034343698134719047089028744, - 21888242871839275222246405745257275088548364400416034343698198745549724039002, - 63494723772535630, - 50861387363887902, - 35584468773847517, - 21888242871839275222246405745257275088548364400416034343698152224020483101073, - 21888242871839275222246405745257275088548364400416034343698133535307231409309, - 12654740449352527, - 21888242871839275222246405745257275088548364400416034343698143438707435930037, - 21888242871839275222246405745257275088548364400416034343698148788660741395308, - 25407332579058280, - 21888242871839275222246405745257275088548364400416034343698165079093694067452, - 54554586434600761, - 21888242871839275222246405745257275088548364400416034343698142621874784619522, - 50998019413916027, - 6766047499870660, - 16717540724514123, - 38240820351191527, - 21888242871839275222246405745257275088548364400416034343698174473073130195737, - 21888242871839275222246405745257275088548364400416034343698186369655534421772, - 21888242871839275222246405745257275088548364400416034343698152249606317611836, - 21888242871839275222246405745257275088548364400416034343698173770932113382254, - 11884536511107410, - 24247741379215383, - 21888242871839275222246405745257275088548364400416034343698170126821460141583, - 21888242871839275222246405745257275088548364400416034343698165628266810649859, - 70078551850850778, - 21888242871839275222246405745257275088548364400416034343698198604412244610478, - 39037728615128973, - 21888242871839275222246405745257275088548364400416034343698148674896965370143, - 68563815411141373, - 21888242871839275222246405745257275088548364400416034343698200531996749616833, - 66751148198620088, - 31566394502001832, - 31224394606209879, - 60511114818201492, - 24421304781193086, - 21888242871839275222246405745257275088548364400416034343698201621237992989329, - 21888242871839275222246405745257275088548364400416034343698168033718537794807, - 941718592813428, - 21888242871839275222246405745257275088548364400416034343698180119214301818362, - 12911913979052491, - 51389430483129126, - 68629163829136276, - 1812816529092713, - 65761668066177911, - 21888242871839275222246405745257275088548364400416034343698137494350663741716, - 28310634278523471, - 21888242871839275222246405745257275088548364400416034343698166577978286531048, - 32320958728807105, - 21888242871839275222246405745257275088548364400416034343698202420606608277325, - 21888242871839275222246405745257275088548364400416034343698193205540208598479, - 21888242871839275222246405745257275088548364400416034343698153116276242960366, - 4417565637867779, - 34953397946821622, - 23710552374383630, - 50798670698305039, - 21888242871839275222246405745257275088548364400416034343698161158716078246450, - 21888242871839275222246405745257275088548364400416034343698134615377173643974, - 21888242871839275222246405745257275088548364400416034343698157884890383133031, - 21888242871839275222246405745257275088548364400416034343698161727159202493236, - 28253773509760161, - 21888242871839275222246405745257275088548364400416034343698136108626416902608, - 21888242871839275222246405745257275088548364400416034343698181253017411478021, - 21888242871839275222246405745257275088548364400416034343698198905421543464983, - 53075883677125660, - 25969988555511642, - 21888242871839275222246405745257275088548364400416034343698158478567798108317, - 8044294053832148, - 33499846477188258, - 21888242871839275222246405745257275088548364400416034343698200389436665700666, - 48766026627196414, - 24419091790355274, - 24177504972630254, - 21888242871839275222246405745257275088548364400416034343698135831354074001602, - 21888242871839275222246405745257275088548364400416034343698196512101267781199, - 21888242871839275222246405745257275088548364400416034343698178139134505792128, - 21888242871839275222246405745257275088548364400416034343698170745396160619681, - 21888242871839275222246405745257275088548364400416034343698153866108818862647, - 21888242871839275222246405745257275088548364400416034343698192395280211592953, - 45959724377938879, - 21888242871839275222246405745257275088548364400416034343698174263319692816875, - 21888242871839275222246405745257275088548364400416034343698173589024560453350, - 47559212680862354, - 21888242871839275222246405745257275088548364400416034343698141983661958445293, - 16781822704016599, - 47753103251007725, - 21888242871839275222246405745257275088548364400416034343698155758973483441487, - 21888242871839275222246405745257275088548364400416034343698176117993143211671, - 21888242871839275222246405745257275088548364400416034343698203411347330621187, - 21888242871839275222246405745257275088548364400416034343698192967795111834642, - 21888242871839275222246405745257275088548364400416034343698144115507262641828, - 53860477131675311, - 16951993005902801, - 42198454486620764, - 70947669790682797, - 1906968416578946, - 16485760283480682, - 67400838179851111, - 21888242871839275222246405745257275088548364400416034343698195200644291808432, - 21888242871839275222246405745257275088548364400416034343698156075729540022271, - 21888242871839275222246405745257275088548364400416034343698142356248120877522, - 21888242871839275222246405745257275088548364400416034343698155782803732724213, - 48901868318279064, - 21888242871839275222246405745257275088548364400416034343698151855572352434249, - 21888242871839275222246405745257275088548364400416034343698184521559310365542, - 46700370392843929, - 55284704111178336, - 21888242871839275222246405745257275088548364400416034343698153321634261774935, - 21888242871839275222246405745257275088548364400416034343698194630163346701459, - 21888242871839275222246405745257275088548364400416034343698203965079807424515, - 21888242871839275222246405745257275088548364400416034343698199326657366223270, - 69359596298511744, - 31490348534109277, - 6188981869491643, - 21888242871839275222246405745257275088548364400416034343698202477170030268509, - 39617986168950917, - 29987852848891050, - 21888242871839275222246405745257275088548364400416034343698150738508163662789, - 28970712631271175, - 21888242871839275222246405745257275088548364400416034343698153298796817810489, - 57833556256622270, - 21888242871839275222246405745257275088548364400416034343698183072550729599131, - 10198531307949162, - 61618976202421683, - 21888242871839275222246405745257275088548364400416034343698171299946618919329, - 6550605268793136, - 21888242871839275222246405745257275088548364400416034343698202540471937693639, - 21888242871839275222246405745257275088548364400416034343698139681582132642017, - 3086805574078115, - 63897997265039112, - 21888242871839275222246405745257275088548364400416034343698195239470256633224, - 47465427101570724, - 21888242871839275222246405745257275088548364400416034343698169721485716294024, - 21888242871839275222246405745257275088548364400416034343698184098315199818713, - 4519968894344236, - 21888242871839275222246405745257275088548364400416034343698163634192394069935, - 42304779079518143, - 21888242871839275222246405745257275088548364400416034343698164741127562452265, - 21888242871839275222246405745257275088548364400416034343698146980078155947251, - 21888242871839275222246405745257275088548364400416034343698192592645725385020, - 63325988273827238, - 21888242871839275222246405745257275088548364400416034343698192358790129179791, - 57654651040375044, - 21888242871839275222246405745257275088548364400416034343698178174050219773126, - 6385100953713554, - 12392715214329032, - 45961516445528559, - 61464444756361169, - 30008654050729744, - 33469425765509343, - 11696128033863351, - 46925499188305091, - 35040126241613547, - 21888242871839275222246405745257275088548364400416034343698138967327707275373, - 15451152513842057, - 21888242871839275222246405745257275088548364400416034343698135790333796879208, - 51516346751496316, - 12238827849621115, - 21888242871839275222246405745257275088548364400416034343698156190254861593307, - 31439840306691412, - 21888242871839275222246405745257275088548364400416034343698198516729430227296, - 21888242871839275222246405745257275088548364400416034343698165661156209745103, - 55722743879415435, - 24851141300609759, - 21888242871839275222246405745257275088548364400416034343698153171375543289577, - 35006286052385316, - 15301843933540736, - 21888242871839275222246405745257275088548364400416034343698172044802570431213, - 21888242871839275222246405745257275088548364400416034343698159020402750043081, - 17547726451940173, - 41517519262389577, - 37879504709791833, - 21888242871839275222246405745257275088548364400416034343698159541247918557107, - 21888242871839275222246405745257275088548364400416034343698190041463163106145, - 70653450062965215, - 21888242871839275222246405745257275088548364400416034343698190718962911929179, - 36612442133521171, - 70157462778166625, - 28470394675484407, - 60642333833260844, - 21888242871839275222246405745257275088548364400416034343698163735077332656132, - 21888242871839275222246405745257275088548364400416034343698149172696280068901, - 21888242871839275222246405745257275088548364400416034343698150371804384826642, - 21888242871839275222246405745257275088548364400416034343698193876644654483101, - 21888242871839275222246405745257275088548364400416034343698189653563279010328, - 2579528577352951, - 37638012413597675, - 41664360713090530, - 21888242871839275222246405745257275088548364400416034343698139602834828028802, - 21888242871839275222246405745257275088548364400416034343698148443562174856221, - 64584927633347474, - 21888242871839275222246405745257275088548364400416034343698137696795804724225, - 21888242871839275222246405745257275088548364400416034343698181401681421562586, - 61292983147772398, - 9596966911385280, - 12448480717205719, - 21888242871839275222246405745257275088548364400416034343698176136956682995753, - 21888242871839275222246405745257275088548364400416034343698155751324693712023, - 15634839440764075, - 21888242871839275222246405745257275088548364400416034343698173428147744367796, - 21888242871839275222246405745257275088548364400416034343698178842454139946141, - 21888242871839275222246405745257275088548364400416034343698153687003708848927, - 53983960120983924, - 21888242871839275222246405745257275088548364400416034343698133872607937134270, - 21888242871839275222246405745257275088548364400416034343698150370375467077511, - 53594054209331416, - 61585962539933207, - 21888242871839275222246405745257275088548364400416034343698157875788628085063, - 21888242871839275222246405745257275088548364400416034343698180847912454019953, - 23804810657471030, - 41050074414490477, - 34245773927713675, - 49589778171745620, - 64693399629387588, - 48364480849458973, - 28835099263629113, - 21888242871839275222246405745257275088548364400416034343698197554697219205708, - 21888242871839275222246405745257275088548364400416034343698194252426078496622, - 21888242871839275222246405745257275088548364400416034343698181820874605695977, - 42686616970288905, - 17577883541625352, - 58517374317269848, - 21888242871839275222246405745257275088548364400416034343698143876337473548949, - 21888242871839275222246405745257275088548364400416034343698184556024124578463, - 60295723648993451, - 62184883749344335, - 21888242871839275222246405745257275088548364400416034343698198349025612347953, - 30139761516021220, - 25089952126544358, - 21888242871839275222246405745257275088548364400416034343698165448333744802510, - 6997240628048994, - 43781822208781049, - 21888242871839275222246405745257275088548364400416034343698180159141682491440, - 21888242871839275222246405745257275088548364400416034343698153053527604549982, - 21888242871839275222246405745257275088548364400416034343698172130592486792520, - 21888242871839275222246405745257275088548364400416034343698197018677268551763, - 69180761179601888, - 21888242871839275222246405745257275088548364400416034343698187604472042103380, - 59289588652870781, - 60348271337768660, - 47473979382570059, - 64393468794379020, - 12301571711715854, - 25287552738097622, - 39467223853382795, - 21888242871839275222246405745257275088548364400416034343698177888086628292935, - 50656894741610430, - 21888242871839275222246405745257275088548364400416034343698151668657520729599, - 68657594328970519, - 21888242871839275222246405745257275088548364400416034343698191320394336084776, - 55488651625451655, - 21888242871839275222246405745257275088548364400416034343698156520499193202816, - 21888242871839275222246405745257275088548364400416034343698163501102825478029, - 21888242871839275222246405745257275088548364400416034343698184299224489266672, - 57162209479501076, - 35860753324892790, - 21888242871839275222246405745257275088548364400416034343698200840692876295714, - 27569876606496159, - 31607948039555402, - 21888242871839275222246405745257275088548364400416034343698146282827604354315, - 22633165861636922, - 53133204139432451, - 21888242871839275222246405745257275088548364400416034343698153416550144283106, - 17189632919343218, - 21888242871839275222246405745257275088548364400416034343698199510617146674360, - 21888242871839275222246405745257275088548364400416034343698159106733403830476, - 21888242871839275222246405745257275088548364400416034343698139509212437147246, - 21888242871839275222246405745257275088548364400416034343698169082533637960268, - 21888242871839275222246405745257275088548364400416034343698202032700648001977, - 21888242871839275222246405745257275088548364400416034343698177105226513226213, - 21888242871839275222246405745257275088548364400416034343698170831292111513372, - 65388694941841813, - 21888242871839275222246405745257275088548364400416034343698154088017885951617, - 49098636103205285, - 12161967020114989, - 21152964916325242, - 21888242871839275222246405745257275088548364400416034343698147248470535211715, - 58855794348657816, - 30663426920591900, - 2895661870668625, - 21888242871839275222246405745257275088548364400416034343698162666021097248152, - 21888242871839275222246405745257275088548364400416034343698173890614153419687, - 30102161492304539, - 48246983180140110, - 998191388681107, - 21888242871839275222246405745257275088548364400416034343698202418358247858968, - 21888242871839275222246405745257275088548364400416034343698187797573956493157, - 21888242871839275222246405745257275088548364400416034343698156978750964836336, - 21888242871839275222246405745257275088548364400416034343698192037586861164655, - 21888242871839275222246405745257275088548364400416034343698179904293570432419, - 52913527613388198, - 21888242871839275222246405745257275088548364400416034343698196342634389617485, - 21888242871839275222246405745257275088548364400416034343698132620752555268217, - 21888242871839275222246405745257275088548364400416034343698179202312965895705, - 21888242871839275222246405745257275088548364400416034343698148709111784752397, - 21888242871839275222246405745257275088548364400416034343698152198198987625501, - 10306357486425336, - 33666295547275203, - 12498023835846468, - 27716094346878852, - 21888242871839275222246405745257275088548364400416034343698160924710090802874, - 60285103549465966, - 68717852887908172, - 21888242871839275222246405745257275088548364400416034343698180520825194293908, - 69636271662913309, - 21888242871839275222246405745257275088548364400416034343698197026225554663925, - 21888242871839275222246405745257275088548364400416034343698173307107069729048, - 21888242871839275222246405745257275088548364400416034343698198809971121829801, - 21888242871839275222246405745257275088548364400416034343698137186293291031005, - 21888242871839275222246405745257275088548364400416034343698162859034319925385, - 21888242871839275222246405745257275088548364400416034343698141247223256708645, - 21888242871839275222246405745257275088548364400416034343698174112232548204141, - 21888242871839275222246405745257275088548364400416034343698148067926431399259, - 9106677114950964, - 21888242871839275222246405745257275088548364400416034343698181617689989453740, - 21888242871839275222246405745257275088548364400416034343698140398938646181323, - 21888242871839275222246405745257275088548364400416034343698182333783430267091, - 21888242871839275222246405745257275088548364400416034343698182695707852959128, - 35190036525356303, - 21888242871839275222246405745257275088548364400416034343698175592819596504801, - 21888242871839275222246405745257275088548364400416034343698154342416278339414, - 21888242871839275222246405745257275088548364400416034343698156556192644881886, - 54509474416683374, - 21888242871839275222246405745257275088548364400416034343698191044047142243858, - 21888242871839275222246405745257275088548364400416034343698175784955319211510, - 21888242871839275222246405745257275088548364400416034343698191442555860332044, - 14079320346304885, - 21888242871839275222246405745257275088548364400416034343698132229701823880852, - 21888242871839275222246405745257275088548364400416034343698137739608204409127, - 21888242871839275222246405745257275088548364400416034343698176759698944262379, - 54955146035192833, - 21888242871839275222246405745257275088548364400416034343698189788511109009290, - 21888242871839275222246405745257275088548364400416034343698134286054541311499, - 56596693032495410, - 21888242871839275222246405745257275088548364400416034343698169626515931237592, - 21888242871839275222246405745257275088548364400416034343698156737738797831260, - 14696015956834683, - 15286531466280535, - 17276898037653743, - 67770622752606161, - 21888242871839275222246405745257275088548364400416034343698145440736162604658, - 34024715066146502, - 21888242871839275222246405745257275088548364400416034343698165604045631627867, - 4088154420774489, - 21888242871839275222246405745257275088548364400416034343698171582462494507411, - 21888242871839275222246405745257275088548364400416034343698132703173243090247, - 20442208019934495, - 57269678125893365, - 21888242871839275222246405745257275088548364400416034343698173535920583344263, - 21888242871839275222246405745257275088548364400416034343698167145637703088406, - 4694264922436865, - 28134608808133347, - 21888242871839275222246405745257275088548364400416034343698132210158638693908, - 47565156664650385, - 59411319332593253, - 21888242871839275222246405745257275088548364400416034343698164472917781805304, - 21888242871839275222246405745257275088548364400416034343698152657439189443493, - 55405967643755590, - 21888242871839275222246405745257275088548364400416034343698142134239343814611, - 66831114412822095, - 31073726756240236, - 68123875981956500, - 22479931058199408, - 21888242871839275222246405745257275088548364400416034343698144152407232583445, - 21888242871839275222246405745257275088548364400416034343698193323285232449655, - 67853258156732329, - 21888242871839275222246405745257275088548364400416034343698181172357190024976, - 21888242871839275222246405745257275088548364400416034343698153558669970281223, - 21888242871839275222246405745257275088548364400416034343698149913483266301487, - 36450280642874560, - 25521898965173987, - 65221732346231090, - 71420521389629540, - 21888242871839275222246405745257275088548364400416034343698162952234212355083, - 21888242871839275222246405745257275088548364400416034343698170669942593680376, - 45105666997062658, - 21888242871839275222246405745257275088548364400416034343698176340628440180006, - 42952989599684279, - 21888242871839275222246405745257275088548364400416034343698176800766995364925, - 20712752731754645, - 21888242871839275222246405745257275088548364400416034343698182000859814014176, - 35585087239978213, - 21888242871839275222246405745257275088548364400416034343698149266764258884429, - 61936534241473752, - 4907137331451537, - 21888242871839275222246405745257275088548364400416034343698172434504915280489, - 21888242871839275222246405745257275088548364400416034343698160213455150951947, - 21888242871839275222246405745257275088548364400416034343698152243886455626482, - 62874376926647741, - 21888242871839275222246405745257275088548364400416034343698189477131531741588, - 30455151540221152, - 21888242871839275222246405745257275088548364400416034343698173994047240950286, - 21888242871839275222246405745257275088548364400416034343698143929225846096288, - 23101237712273814, - 21888242871839275222246405745257275088548364400416034343698202445889688163750, - 66483700970120924, - 21888242871839275222246405745257275088548364400416034343698172316969947314892, - 21888242871839275222246405745257275088548364400416034343698181731186315386017, - 59198278497232051, - 21888242871839275222246405745257275088548364400416034343698138768916428518524, - 30051574530869349, - 21888242871839275222246405745257275088548364400416034343698148875589741738768, - 24602852262390621, - 18449059122364987, - 60177856851971495, - 49745996138449081, - 21888242871839275222246405745257275088548364400416034343698196530945547439888, - 21888242871839275222246405745257275088548364400416034343698138997966686452964, - 38842324586275286, - 28042097209991227, - 21888242871839275222246405745257275088548364400416034343698152047376047089664, - 21888242871839275222246405745257275088548364400416034343698154553346797382745, - 70048188833831115, - 45862441407538674, - 28378303356008015, - 6830952263377139, - 2052934218944157, - 28569220155436582, - 45734289398704129, - 50966539925876393, - 6334540507626278, - 67846982574521540, - 21888242871839275222246405745257275088548364400416034343698140520622335459462, - 21888242871839275222246405745257275088548364400416034343698138792245468108106, - 21888242871839275222246405745257275088548364400416034343698197935103370957087, - 4550488277101413, - 21888242871839275222246405745257275088548364400416034343698165222270370504212, - 33483639555396833, - 21888242871839275222246405745257275088548364400416034343698151921362211789930, - 21888242871839275222246405745257275088548364400416034343698166295828451827397, - 21888242871839275222246405745257275088548364400416034343698172117302636398558, - 21888242871839275222246405745257275088548364400416034343698167924670248924250, - 21888242871839275222246405745257275088548364400416034343698145302278066674369, - 21888242871839275222246405745257275088548364400416034343698188131877952753985, - 27752695466473764, - 21888242871839275222246405745257275088548364400416034343698146424500014281258, - 9898562090208657, - 19646622298154161, - 42564648086566850, - 21888242871839275222246405745257275088548364400416034343698165794611061241616, - 21888242871839275222246405745257275088548364400416034343698153754591918362587, - 21888242871839275222246405745257275088548364400416034343698194499058120904945, - 54759492139312873, - 21888242871839275222246405745257275088548364400416034343698153515858175805246, - 21888242871839275222246405745257275088548364400416034343698158939563462460958, - 24402587859218282, - 5014320108666859, - 70858079862499639, - 13849032743754697, - 4765502097783634, - 59525475753885047, - 21888242871839275222246405745257275088548364400416034343698132345952943173412, - 7748637993783338, - 5148589610843610, - 20744209217503503, - 21888242871839275222246405745257275088548364400416034343698198067301091727225, - 28438578863564832, - 2287937596704714, - 29908171743033071, - 1564239979909261, - 21888242871839275222246405745257275088548364400416034343698169333417614310468, - 21888242871839275222246405745257275088548364400416034343698193465324892944260, - 24915302081126899, - 16127737024381494, - 21888242871839275222246405745257275088548364400416034343698184008964727410944, - 21888242871839275222246405745257275088548364400416034343698165770188835388763, - 52258010765322875, - 13552352145471649, - 9531635559269082, - 61060193050888947, - 21888242871839275222246405745257275088548364400416034343698194502010875616216, - 32547619553495336, - 17002402583967648, - 21888242871839275222246405745257275088548364400416034343698200335370458782455, - 31750922046933974, - 6247520842541692, - 21888242871839275222246405745257275088548364400416034343698157651369638050833, - 35070037014918478, - 21888242871839275222246405745257275088548364400416034343698155627472114022226, - 21888242871839275222246405745257275088548364400416034343698158812061298008816, - 16756992337224290, - 62939593770163089, - 23523611303914679, - 21888242871839275222246405745257275088548364400416034343698146707614779484516, - 21888242871839275222246405745257275088548364400416034343698181956258397035682, - 21888242871839275222246405745257275088548364400416034343698141019622273716807, - 21888242871839275222246405745257275088548364400416034343698134721556978178589, - 21888242871839275222246405745257275088548364400416034343698137660428397978655, - 21888242871839275222246405745257275088548364400416034343698160330177897246393, - 21888242871839275222246405745257275088548364400416034343698135675442142972226, - 56147055154807591, - 44784929033930968, - 60273394260058927, - 21888242871839275222246405745257275088548364400416034343698156396694908206932, - 21888242871839275222246405745257275088548364400416034343698168348546054911891, - 20710215482801825, - 21888242871839275222246405745257275088548364400416034343698177749074226067715, - 21888242871839275222246405745257275088548364400416034343698159788014011769060, - 21577285916475491, - 57655767409456169, - 21888242871839275222246405745257275088548364400416034343698147314887064298660, - 21888242871839275222246405745257275088548364400416034343698154313782702090177, - 21888242871839275222246405745257275088548364400416034343698138425717506378436, - 54310265767132794, - 21888242871839275222246405745257275088548364400416034343698178443130447903110, - 57038169128043746, - 40930021345264889, - 12873654338709302, - 25306073231463405, - 1868001792126242, - 21888242871839275222246405745257275088548364400416034343698171661762598702205, - 67932088044290212, - 33284139836039707, - 21888242871839275222246405745257275088548364400416034343698134899756531439859, - 49561374183329655, - 58706861601238311, - 21888242871839275222246405745257275088548364400416034343698161170348807241066, - 21888242871839275222246405745257275088548364400416034343698155183008860198810, - 10863074427192735, - 21888242871839275222246405745257275088548364400416034343698162828160850824046, - 21888242871839275222246405745257275088548364400416034343698169447208504667031, - 21888242871839275222246405745257275088548364400416034343698166554748331915186, - 21888242871839275222246405745257275088548364400416034343698187442137236216372, - 21888242871839275222246405745257275088548364400416034343698137103550001187625, - 21888242871839275222246405745257275088548364400416034343698167300370275988008, - 21888242871839275222246405745257275088548364400416034343698180716720524987752, - 21888242871839275222246405745257275088548364400416034343698157650035268989483, - 49677782692713585, - 63569065315319267, - 45418637686554314, - 21888242871839275222246405745257275088548364400416034343698133531515295371593, - 27051891623709016, - 21888242871839275222246405745257275088548364400416034343698196690387601545216, - 21888242871839275222246405745257275088548364400416034343698136351635344127129, - 45613906584213042, - 43772967172004455, - 21888242871839275222246405745257275088548364400416034343698202816568719339490, - 21888242871839275222246405745257275088548364400416034343698161375214353229581, - 21888242871839275222246405745257275088548364400416034343698164690179509847860, - 58448224767772526, - 21888242871839275222246405745257275088548364400416034343698161001623959781268, - 21888242871839275222246405745257275088548364400416034343698152091837837994219, - 21888242871839275222246405745257275088548364400416034343698169510740285733578, - 21888242871839275222246405745257275088548364400416034343698135363427097199921, - 21888242871839275222246405745257275088548364400416034343698171206284817016537, - 21888242871839275222246405745257275088548364400416034343698182940774433032665, - 60866206189957542, - 66765400623071074, - 21888242871839275222246405745257275088548364400416034343698155269185490149501, - 12475537694594009, - 32217571056332764, - 21888242871839275222246405745257275088548364400416034343698201335290284783207, - 21888242871839275222246405745257275088548364400416034343698139864605211897777, - 24647475650096504, - 59574272884236561, - 21888242871839275222246405745257275088548364400416034343698181427981832831011, - 21888242871839275222246405745257275088548364400416034343698168343261044737918, - 56295466344632514, - 21888242871839275222246405745257275088548364400416034343698199690162647567501, - 42244119701747865, - 64046663412958769, - 21888242871839275222246405745257275088548364400416034343698177431813605722794, - 21888242871839275222246405745257275088548364400416034343698133824888348791270, - 67168252530281809, - 4664659384698386, - 21888242871839275222246405745257275088548364400416034343698185659391052243520, - 63057784697862574, - 21888242871839275222246405745257275088548364400416034343698176742049988689366, - 21888242871839275222246405745257275088548364400416034343698201722372076750855, - 21888242871839275222246405745257275088548364400416034343698157752010589038009, - 11734139705372329, - 9351781213873127, - 21888242871839275222246405745257275088548364400416034343698172906513756318996, - 21888242871839275222246405745257275088548364400416034343698141515631768489199, - 21888242871839275222246405745257275088548364400416034343698179626431250716062, - 21888242871839275222246405745257275088548364400416034343698192495768551765446, - 21888242871839275222246405745257275088548364400416034343698183535611540792067, - 58581658405150402, - 21888242871839275222246405745257275088548364400416034343698181164316195148231, - 23199805682056021, - 60247710931582277, - 55950733424180849, - 44475662888510971, - 56138672791405685, - 21888242871839275222246405745257275088548364400416034343698148182389747001633, - 5021617901750488, - 21888242871839275222246405745257275088548364400416034343698151972079226081787, - 21888242871839275222246405745257275088548364400416034343698137074022697803752, - 41807095126488849, - 21888242871839275222246405745257275088548364400416034343698144194789060607728, - 21888242871839275222246405745257275088548364400416034343698192766662989526782, - 21888242871839275222246405745257275088548364400416034343698196226153019918731, - 21888242871839275222246405745257275088548364400416034343698171745130882490927, - 55658877630210849, - 21888242871839275222246405745257275088548364400416034343698172160113618882970, - 21888242871839275222246405745257275088548364400416034343698140093980492179591, - 7675172070803594, - 21888242871839275222246405745257275088548364400416034343698160117322390481490, - 21888242871839275222246405745257275088548364400416034343698133985226327970470, - 21888242871839275222246405745257275088548364400416034343698150989906856535656, - 28856989193878792, - 21888242871839275222246405745257275088548364400416034343698152494769474971111, - 594819984719580, - 21888242871839275222246405745257275088548364400416034343698175038634149126818, - 21888242871839275222246405745257275088548364400416034343698166089068186612016, - 21888242871839275222246405745257275088548364400416034343698162898865499495559, - 42597089779779779, - 21888242871839275222246405745257275088548364400416034343698159774978215970697, - 21888242871839275222246405745257275088548364400416034343698195439397671255496, - 5230106674631915, - 21888242871839275222246405745257275088548364400416034343698134087513882710622, - 62540103946668679, - 29553412301858591, - 35848599618828792, - 21888242871839275222246405745257275088548364400416034343698177776609801030883, - 21888242871839275222246405745257275088548364400416034343698158826934185021920, - 7241548630467963, - 21888242871839275222246405745257275088548364400416034343698168956610721788803, - 21888242871839275222246405745257275088548364400416034343698160245347494983602, - 21888242871839275222246405745257275088548364400416034343698168559049565646074, - 67317976986966705, - 21888242871839275222246405745257275088548364400416034343698155612677240977051, - 10035864934766267, - 55134160590720967, - 21888242871839275222246405745257275088548364400416034343698150209134853721112, - 47236465219535105, - 71638830880164382, - 21888242871839275222246405745257275088548364400416034343698140350922317396827, - 19797088273251509, - 21888242871839275222246405745257275088548364400416034343698169956155388778396, - 21888242871839275222246405745257275088548364400416034343698142822193996022967, - 19423539077415815, - 21888242871839275222246405745257275088548364400416034343698161799671557201185, - 35305451946439616, - 21888242871839275222246405745257275088548364400416034343698184954017051744782, - 21888242871839275222246405745257275088548364400416034343698180701539531014718, - 13005807413135471, - 21888242871839275222246405745257275088548364400416034343698173757899789394818, - 21888242871839275222246405745257275088548364400416034343698202031705041534486, - 7368608654532007, - 29146628590737826, - 66934210225975211, - 21888242871839275222246405745257275088548364400416034343698196066189050403961, - 21888242871839275222246405745257275088548364400416034343698202743318417435000, - 21888242871839275222246405745257275088548364400416034343698193076144371941471, - 21888242871839275222246405745257275088548364400416034343698194360918560146182, - 66623816745628995, - 20479523056218585, - 21822929812418284, - 21888242871839275222246405745257275088548364400416034343698172184891256456111, - 28159640418876587, - 25952774075364744, - 6677945643683166, - 21888242871839275222246405745257275088548364400416034343698159201277067511490, - 21888242871839275222246405745257275088548364400416034343698173887212498314792, - 7435985557069049, - 21888242871839275222246405745257275088548364400416034343698140274472823887683, - 21888242871839275222246405745257275088548364400416034343698136703665148849674, - 21888242871839275222246405745257275088548364400416034343698176846901293936657, - 21888242871839275222246405745257275088548364400416034343698145425888961951923, - 7246548078207236, - 30039244414731044, - 62221751107027736, - 37596164881704823, - 40589713127998055, - 30485277491817456, - 21888242871839275222246405745257275088548364400416034343698151937090680817117, - 21888242871839275222246405745257275088548364400416034343698173845951990258883, - 21888242871839275222246405745257275088548364400416034343698184469770359684705, - 21888242871839275222246405745257275088548364400416034343698193190753211598470, - 36093916206640443, - 24501339323337685, - 44451651561081511, - 21888242871839275222246405745257275088548364400416034343698139314726750113627, - 21888242871839275222246405745257275088548364400416034343698132576792448909670, - 40091507394095003, - 21888242871839275222246405745257275088548364400416034343698170487265800516575, - 21888242871839275222246405745257275088548364400416034343698165968601914597425, - 21888242871839275222246405745257275088548364400416034343698139634980633740745, - 45633132958358318, - 21888242871839275222246405745257275088548364400416034343698191969426093657239, - 27462706642359312, - 59242637846606672, - 21888242871839275222246405745257275088548364400416034343698150064777662635324, - 21888242871839275222246405745257275088548364400416034343698191316039858256007, - 34694736315001434, - 71781860347046832, - 21888242871839275222246405745257275088548364400416034343698147591566339833536, - 21888242871839275222246405745257275088548364400416034343698202181512124375610, - 21888242871839275222246405745257275088548364400416034343698145149191214498309, - 21888242871839275222246405745257275088548364400416034343698199938447053245971, - 21888242871839275222246405745257275088548364400416034343698191354633237841516, - 21888242871839275222246405745257275088548364400416034343698163625401382591508, - 48140718708889201, - 9411790155556954, - 21888242871839275222246405745257275088548364400416034343698143374178980385262, - 49705802379418497, - 65645154071709579, - 21888242871839275222246405745257275088548364400416034343698192656449004132860, - 21888242871839275222246405745257275088548364400416034343698170713791951798440, - 71051394252220615, - 12225640560729840, - 24488086099714398, - 15909856082972518, - 11475960268847187, - 64649286916286431, - 21888242871839275222246405745257275088548364400416034343698182433906244295712, - 21888242871839275222246405745257275088548364400416034343698146801346914162694, - 21888242871839275222246405745257275088548364400416034343698161291147056239220, - 21888242871839275222246405745257275088548364400416034343698169308389145753550, - 37706902045209485, - 21888242871839275222246405745257275088548364400416034343698195081673604528984, - 21888242871839275222246405745257275088548364400416034343698154564203362633765, - 21888242871839275222246405745257275088548364400416034343698182747725512541422, - 44722225084958216, - 71541565301258330, - 30894205778597424, - 21888242871839275222246405745257275088548364400416034343698173646961177117915, - 21888242871839275222246405745257275088548364400416034343698163045757348325249, - 21888242871839275222246405745257275088548364400416034343698193437455782731286, - 42105322637257513, - 21888242871839275222246405745257275088548364400416034343698189881870287166882, - 61823645647263498, - 15767410580628202, - 21888242871839275222246405745257275088548364400416034343698166556057649541051, - 52647120111279858, - 21888242871839275222246405745257275088548364400416034343698146871132016875054, - 21888242871839275222246405745257275088548364400416034343698175406047413313374, - 21888242871839275222246405745257275088548364400416034343698173093061800587128, - 21888242871839275222246405745257275088548364400416034343698182882281816731029, - 21888242871839275222246405745257275088548364400416034343698143264929004951753, - 48444769047141595, - 21888242871839275222246405745257275088548364400416034343698144962268673239968, - 68031768078559983, - 55961669065344357, - 21888242871839275222246405745257275088548364400416034343698134601793067728915, - 21888242871839275222246405745257275088548364400416034343698160312822918575121, - 21888242871839275222246405745257275088548364400416034343698186448703664010695, - 44499558996949336, - 34350388489653365, - 21888242871839275222246405745257275088548364400416034343698140227143495827021, - 59553050741365491, - 21888242871839275222246405745257275088548364400416034343698175531412525078560, - 21888242871839275222246405745257275088548364400416034343698135893649938691498, - 21888242871839275222246405745257275088548364400416034343698147404630895553237, - 17002994779784128, - 22513716887114589, - 21888242871839275222246405745257275088548364400416034343698178291982396575052, - 34125501561364910, - 21888242871839275222246405745257275088548364400416034343698166384293739682545, - 26878577559196466, - 21888242871839275222246405745257275088548364400416034343698144031708025476385, - 21888242871839275222246405745257275088548364400416034343698132345348763990989, - 21888242871839275222246405745257275088548364400416034343698148838128937962361, - 21888242871839275222246405745257275088548364400416034343698137713375060987655, - 21888242871839275222246405745257275088548364400416034343698144171471514105389, - 21888242871839275222246405745257275088548364400416034343698199609767380012515, - 27682379056884761, - 21888242871839275222246405745257275088548364400416034343698143773421138459351, - 43108368663859873, - 21888242871839275222246405745257275088548364400416034343698186987358500599790, - 21888242871839275222246405745257275088548364400416034343698171147727616098281, - 49236823184958155, - 21888242871839275222246405745257275088548364400416034343698137072318570059374, - 21623979833462706, - 24443262258922598, - 60258363726831659, - 7843464794584510, - 65921119838678288, - 53501292166562619, - 21888242871839275222246405745257275088548364400416034343698135787327779710843, - 27228223263242416, - 9691741120800596, - 35839041298931822, - 39888309391804607, - 10413065965512201, - 21888242871839275222246405745257275088548364400416034343698167834092754396878, - 21888242871839275222246405745257275088548364400416034343698171731323306854922, - 21888242871839275222246405745257275088548364400416034343698189515655869297881, - 21888242871839275222246405745257275088548364400416034343698159714103379493755, - 21888242871839275222246405745257275088548364400416034343698174990246240818332, - 26443502537258696, - 19511302420732223, - 21888242871839275222246405745257275088548364400416034343698178306036412892178, - 21888242871839275222246405745257275088548364400416034343698196838100488436038, - 21888242871839275222246405745257275088548364400416034343698189560262263792977, - 21888242871839275222246405745257275088548364400416034343698150072925960125716, - 18015896996413753, - 46843900221272603, - 17738784362563521, - 47373596802957685, - 37813089671548221, - 21888242871839275222246405745257275088548364400416034343698152367808944480342, - 31986554541403718, - 21888242871839275222246405745257275088548364400416034343698197800821031198999, - 21888242871839275222246405745257275088548364400416034343698174760795738378648, - 68599915300535589, - 12282486627335756, - 26344760514927708, - 21888242871839275222246405745257275088548364400416034343698186000827641007222, - 46745197510881755, - 21888242871839275222246405745257275088548364400416034343698136400005500784083, - 21888242871839275222246405745257275088548364400416034343698162257265171422417, - 22918816215740712, - 21888242871839275222246405745257275088548364400416034343698154301086150144010, - 37762218110895841, - 21888242871839275222246405745257275088548364400416034343698138047413924138723, - 25695076067466205, - 40461715240173666, - 15576153175926408, - 21888242871839275222246405745257275088548364400416034343698159397722906425364, - 26047722407984209, - 21888242871839275222246405745257275088548364400416034343698184307842723544431, - 54938391903015916, - 32155599294868324, - 31356429128967758, - 21888242871839275222246405745257275088548364400416034343698155003407751748990, - 17177361574041004, - 70890645003999685, - 21888242871839275222246405745257275088548364400416034343698153207178463442017, - 28973757526049624, - 21888242871839275222246405745257275088548364400416034343698137449158484736088, - 65033071389451189, - 53410149959820927, - 39424844001355074, - 49018281867397608, - 21888242871839275222246405745257275088548364400416034343698156983117122253250, - 51501693945651594, - 21888242871839275222246405745257275088548364400416034343698181393313016007499, - 36511210065119830, - 18369519217556258, - 21888242871839275222246405745257275088548364400416034343698150163352884241409, - 29416273745172216, - 21888242871839275222246405745257275088548364400416034343698188840796856582462, - 50360420614819082, - 71214132961807758, - 21888242871839275222246405745257275088548364400416034343698136369875592441772, - 49660249435087748, - 71400071724942248, - 20301666792622061, - 34858700075617129, - 21888242871839275222246405745257275088548364400416034343698141005711424398330, - 50363606580712917, - 21888242871839275222246405745257275088548364400416034343698140977158671359024, - 21888242871839275222246405745257275088548364400416034343698141337741196361946, - 62499815682853910, - 21888242871839275222246405745257275088548364400416034343698174275643307236165, - 41999845578590860, - 21888242871839275222246405745257275088548364400416034343698138385749113161790, - 21409374260976753, - 21888242871839275222246405745257275088548364400416034343698199431381616470244, - 33022919636318713, - 8139260913140617, - 36332236996419135, - 42680807064723280, - 21888242871839275222246405745257275088548364400416034343698168602474837685576, - 21888242871839275222246405745257275088548364400416034343698169015274644619826, - 21888242871839275222246405745257275088548364400416034343698190593449136144277, - 21888242871839275222246405745257275088548364400416034343698196892219515959007, - 49369784896217972, - 21888242871839275222246405745257275088548364400416034343698180702356514124550, - 21888242871839275222246405745257275088548364400416034343698152668333512402938, - 21888242871839275222246405745257275088548364400416034343698183340198261103008, - 21888242871839275222246405745257275088548364400416034343698187950046020728811, - 21888242871839275222246405745257275088548364400416034343698143326943088155068, - 21888242871839275222246405745257275088548364400416034343698170368044831865003, - 21888242871839275222246405745257275088548364400416034343698190740530502312613, - 33868333553209594, - 21888242871839275222246405745257275088548364400416034343698191673978275848828, - 28048394699816797, - 25853035355508912, - 21888242871839275222246405745257275088548364400416034343698198239872352871270, - 21888242871839275222246405745257275088548364400416034343698136617388967717662, - 43753253248344116, - 21888242871839275222246405745257275088548364400416034343698143329181881157608, - 21888242871839275222246405745257275088548364400416034343698187161358813155682, - 21888242871839275222246405745257275088548364400416034343698135401483811875880, - 21888242871839275222246405745257275088548364400416034343698158517140906079018, - 21888242871839275222246405745257275088548364400416034343698159931817253528204, - 21888242871839275222246405745257275088548364400416034343698142843139461269625, - 8343981876450050, - 21888242871839275222246405745257275088548364400416034343698141000115942968302, - 21888242871839275222246405745257275088548364400416034343698171558391535593692, - 62720291812638845, - 21888242871839275222246405745257275088548364400416034343698143581101438878692, - 69666142404993597, - 21888242871839275222246405745257275088548364400416034343698159961321139874627, - 21888242871839275222246405745257275088548364400416034343698159604150167503724, - 21888242871839275222246405745257275088548364400416034343698195130041199441146, - 21888242871839275222246405745257275088548364400416034343698198976873000568283, - 21888242871839275222246405745257275088548364400416034343698178880283401373894, - 51021110601348659, - 64504662544409730, - 48513338369948036, - 12594350970289062, - 21888242871839275222246405745257275088548364400416034343698145066027282648438, - 21888242871839275222246405745257275088548364400416034343698195512893589608096, - 21888242871839275222246405745257275088548364400416034343698185887938154295417, - 62729011330440031, - 21888242871839275222246405745257275088548364400416034343698139213991432531419, - 21888242871839275222246405745257275088548364400416034343698143220830703701176, - 21888242871839275222246405745257275088548364400416034343698187203680912731301, - 21888242871839275222246405745257275088548364400416034343698185072291305586785, - 33890995380179794, - 21888242871839275222246405745257275088548364400416034343698172211639346538253, - 21888242871839275222246405745257275088548364400416034343698142682408731580692, - 21888242871839275222246405745257275088548364400416034343698157934696597703560, - 54127792266263775, - 51359253960989559, - 21888242871839275222246405745257275088548364400416034343698132794065387658985, - 17759638393451444, - 21888242871839275222246405745257275088548364400416034343698135373906471677250, - 57446864891886916, - 55160521407695756, - 71289316547173665, - 21888242871839275222246405745257275088548364400416034343698195847019996306518, - 21888242871839275222246405745257275088548364400416034343698138118943022603287, - 3006934714623806, - 20703057748040792, - 41784007472314143, - 21888242871839275222246405745257275088548364400416034343698135347831908832073, - 53606480776632428, - 21888242871839275222246405745257275088548364400416034343698157689863709026425, - 15475906064116961, - 21888242871839275222246405745257275088548364400416034343698157326709505506753, - 45921222781973976, - 21888242871839275222246405745257275088548364400416034343698144866200785915370, - 21888242871839275222246405745257275088548364400416034343698142120530228913095, - 21888242871839275222246405745257275088548364400416034343698147475403190889677, - 21888242871839275222246405745257275088548364400416034343698162832099468356055, - 21888242871839275222246405745257275088548364400416034343698180011730398854543, - 67789863701077849, - 55416388840080916, - 32810263852787351, - 21888242871839275222246405745257275088548364400416034343698159085187762302735, - 39092174177512567, - 68386240158300635, - 8048121820470995, - 27820301015059249, - 31772442522423113, - 6772206263911091, - 44252318172783844, - 21888242871839275222246405745257275088548364400416034343698150968841113371539, - 21888242871839275222246405745257275088548364400416034343698150468006408725645, - 21888242871839275222246405745257275088548364400416034343698154435025444506505, - 21888242871839275222246405745257275088548364400416034343698179088222050581455, - 21888242871839275222246405745257275088548364400416034343698132434853753673705, - 21888242871839275222246405745257275088548364400416034343698137628960075512395, - 285752441739214, - 21888242871839275222246405745257275088548364400416034343698163360596569778491, - 21888242871839275222246405745257275088548364400416034343698150224867651790226, - 21888242871839275222246405745257275088548364400416034343698181669426819490866, - 44768734345271495, - 35655849126073152, - 9324147686699267, - 23400057037138693, - 3643611295818189, - 21888242871839275222246405745257275088548364400416034343698186547980537379943, - 27536476748607843, - 12318679257879599, - 21888242871839275222246405745257275088548364400416034343698136409525851191733, - 21888242871839275222246405745257275088548364400416034343698146658172624658278, - 60244666429229980, - 39491147544665316, - 70159175121747826, - 21888242871839275222246405745257275088548364400416034343698187498862732515671, - 21888242871839275222246405745257275088548364400416034343698160582083625072968, - 21888242871839275222246405745257275088548364400416034343698164030876651393354, - 21888242871839275222246405745257275088548364400416034343698137627482567354150, - 21888242871839275222246405745257275088548364400416034343698173302186022912128, - 63021651816942982, - 21988525954412907, - 21888242871839275222246405745257275088548364400416034343698163354904606560896, - 42966995557239664, - 54412907515509633, - 21888242871839275222246405745257275088548364400416034343698199498946546094986, - 21888242871839275222246405745257275088548364400416034343698170840863798216904, - 24073444721775586, - 21888242871839275222246405745257275088548364400416034343698178030728644368939, - 21888242871839275222246405745257275088548364400416034343698135514659104180507, - 28582513100892405, - 21302406428460693, - 21888242871839275222246405745257275088548364400416034343698198879686235341999, - 21888242871839275222246405745257275088548364400416034343698139257015925290011, - 21888242871839275222246405745257275088548364400416034343698194428977908154645, - 21888242871839275222246405745257275088548364400416034343698144716407430297102, - 21888242871839275222246405745257275088548364400416034343698203638599251972884, - 21888242871839275222246405745257275088548364400416034343698159101852047298975, - 7511207408379590, - 12076602511280907, - 21888242871839275222246405745257275088548364400416034343698173175542546438307, - 21888242871839275222246405745257275088548364400416034343698162471169965377868, - 21888242871839275222246405745257275088548364400416034343698191376571340344083, - 21888242871839275222246405745257275088548364400416034343698137952469239745132, - 42462178564848818, - 13817929499066715, - 1618848693311361, - 49525350846604073, - 21888242871839275222246405745257275088548364400416034343698193205488302250838, - 12664644099150387, - 21888242871839275222246405745257275088548364400416034343698159160986947441883, - 7950956490290018, - 57029770134119750, - 21888242871839275222246405745257275088548364400416034343698201077100995183356, - 62678562850886238, - 49893443785238669, - 70168965304823991, - 21888242871839275222246405745257275088548364400416034343698182383341470650047, - 67314172686967672, - 21888242871839275222246405745257275088548364400416034343698186515260921738195, - 52829390452704536, - 21888242871839275222246405745257275088548364400416034343698192674591051157853, - 21888242871839275222246405745257275088548364400416034343698180143011347689591, - 50682800408445348, - 67723891803687595, - 21888242871839275222246405745257275088548364400416034343698157149259108210236, - 45898882609453975, - 21888242871839275222246405745257275088548364400416034343698191860822076100816, - 21888242871839275222246405745257275088548364400416034343698182773028620892159, - 15409392880243556, - 21888242871839275222246405745257275088548364400416034343698136207494054059686, - 26871073677030089, - 21888242871839275222246405745257275088548364400416034343698199202052096365847, - 21888242871839275222246405745257275088548364400416034343698152715004439544025, - 21888242871839275222246405745257275088548364400416034343698191048493208920470, - 21888242871839275222246405745257275088548364400416034343698185253835685201451, - 21888242871839275222246405745257275088548364400416034343698170697644292162720, - 67118542562201090, - 21888242871839275222246405745257275088548364400416034343698160855228454179978, - 12717088532663137, - 21888242871839275222246405745257275088548364400416034343698192499345430092213, - 21888242871839275222246405745257275088548364400416034343698199097523948991334, - 21888242871839275222246405745257275088548364400416034343698137158483844931089, - 21888242871839275222246405745257275088548364400416034343698144517611149769337, - 21888242871839275222246405745257275088548364400416034343698178505557945897756, - 26807083982607937, - 30080408865613597, - 21888242871839275222246405745257275088548364400416034343698190810786739967325, - 21888242871839275222246405745257275088548364400416034343698173205385882133248, - 21888242871839275222246405745257275088548364400416034343698200659280253797953, - 64862202156780122, - 842116821673563, - 21888242871839275222246405745257275088548364400416034343698160297289427205388, - 21888242871839275222246405745257275088548364400416034343698144266347617155598, - 21888242871839275222246405745257275088548364400416034343698139872483474614378, - 26637711913108402, - 21888242871839275222246405745257275088548364400416034343698166090603508069056, - 1638156940556212, - 21888242871839275222246405745257275088548364400416034343698162327679497974318, - 56235409726624487, - 39253984473283398, - 68876578770614793, - 56765140341647531, - 44556213132627025, - 21888242871839275222246405745257275088548364400416034343698154028631017582593, - 21888242871839275222246405745257275088548364400416034343698192113632646026314, - 21888242871839275222246405745257275088548364400416034343698158486696883511213, - 14670174252949441, - 21888242871839275222246405745257275088548364400416034343698161272948116562522, - 21888242871839275222246405745257275088548364400416034343698180429400634175594, - 44139294718668532, - 57820837632348021, - 21888242871839275222246405745257275088548364400416034343698164262115020454741, - 23475987155954132, - 21888242871839275222246405745257275088548364400416034343698173083441019142326, - 22076605281751353, - 21888242871839275222246405745257275088548364400416034343698174258234319363565, - 21888242871839275222246405745257275088548364400416034343698203796032616594803, - 21888242871839275222246405745257275088548364400416034343698160477580989644487, - 63461392180407410, - 21888242871839275222246405745257275088548364400416034343698157940596553403550, - 16585760194538263, - 49282512634253068, - 21888242871839275222246405745257275088548364400416034343698145626151955419588, - 10779777671410650, - 21888242871839275222246405745257275088548364400416034343698154997235658004817, - 21888242871839275222246405745257275088548364400416034343698149493187413046895, - 21888242871839275222246405745257275088548364400416034343698187151896547155792, - 21888242871839275222246405745257275088548364400416034343698145972017719875859, - 21888242871839275222246405745257275088548364400416034343698160416141176697738, - 18053279787398424, - 21888242871839275222246405745257275088548364400416034343698180863978900054718, - 44871902225119505, - 21888242871839275222246405745257275088548364400416034343698203715625507950370, - 54882629124364925, - 43353778937441563, - 21888242871839275222246405745257275088548364400416034343698159525301830268552, - 41896703648378380, - 21888242871839275222246405745257275088548364400416034343698139844776805447668, - 37785088549405409, - 21888242871839275222246405745257275088548364400416034343698156272307726086247, - 21888242871839275222246405745257275088548364400416034343698190992057959023744, - 33783538961880289, - 34812678633524843, - 55913611863613215, - 21888242871839275222246405745257275088548364400416034343698174884490539235317, - 21888242871839275222246405745257275088548364400416034343698135665649251286962, - 32414126159688928, - 21888242871839275222246405745257275088548364400416034343698133551833675878500, - 21888242871839275222246405745257275088548364400416034343698140009673169734120, - 21888242871839275222246405745257275088548364400416034343698188508936764722100, - 22514692954997495, - 21888242871839275222246405745257275088548364400416034343698134275692423429124, - 21833331754840013, - 21888242871839275222246405745257275088548364400416034343698151036475206599190, - 21888242871839275222246405745257275088548364400416034343698159791956972120525, - 56181323584350753, - 21888242871839275222246405745257275088548364400416034343698164959480057359504, - 37244761492978074, - 21888242871839275222246405745257275088548364400416034343698175592256866942192, - 23859623915598309, - 21888242871839275222246405745257275088548364400416034343698149570938164117767, - 21888242871839275222246405745257275088548364400416034343698180163792831310520, - 21888242871839275222246405745257275088548364400416034343698201331025859936589, - 21888242871839275222246405745257275088548364400416034343698202969409730748946, - 3979559921572367, - 21888242871839275222246405745257275088548364400416034343698176098754737965529, - 21888242871839275222246405745257275088548364400416034343698168923286619072324, - 21888242871839275222246405745257275088548364400416034343698144380517128879866, - 21888242871839275222246405745257275088548364400416034343698197927166488550010, - 30271416501128836, - 11275730401706246, - 7927667122675104, - 66361473036591111, - 61072150278489292, - 21888242871839275222246405745257275088548364400416034343698142253796566962008, - 21888242871839275222246405745257275088548364400416034343698197347334971753447, - 21888242871839275222246405745257275088548364400416034343698145511037512855193, - 21888242871839275222246405745257275088548364400416034343698167139824212522880, - 8341065200914093, - 21888242871839275222246405745257275088548364400416034343698188211760955117916, - 56075626963021794, - 21888242871839275222246405745257275088548364400416034343698149293124645971490, - 21888242871839275222246405745257275088548364400416034343698189200930292500871, - 21888242871839275222246405745257275088548364400416034343698188909455628176368, - 21888242871839275222246405745257275088548364400416034343698146042196025178965, - 21888242871839275222246405745257275088548364400416034343698151677932589839597, - 21888242871839275222246405745257275088548364400416034343698191004998810412017, - 21888242871839275222246405745257275088548364400416034343698161739448519518013, - 21888242871839275222246405745257275088548364400416034343698134754818324369233, - 21888242871839275222246405745257275088548364400416034343698200298147761553055, - 21888242871839275222246405745257275088548364400416034343698185174580222189882, - 21888242871839275222246405745257275088548364400416034343698183970865969046437, - 21888242871839275222246405745257275088548364400416034343698169194873444235705, - 21888242871839275222246405745257275088548364400416034343698184028910460075993, - 21888242871839275222246405745257275088548364400416034343698197749370233155803, - 9730039002692102, - 53276878984293728, - 8820991924679370, - 43810504820673983, - 21888242871839275222246405745257275088548364400416034343698191330691641639747, - 21888242871839275222246405745257275088548364400416034343698136071967195222015, - 21888242871839275222246405745257275088548364400416034343698203163482155405040, - 4451327279056257, - 16107005918930506, - 4877448207475939, - 21888242871839275222246405745257275088548364400416034343698176826342430509482, - 21888242871839275222246405745257275088548364400416034343698171338947396138884, - 21888242871839275222246405745257275088548364400416034343698177642459558641296, - 13190665438291421, - 21888242871839275222246405745257275088548364400416034343698150538926873608213, - 16174603156531713, - 43325754504853362, - 21888242871839275222246405745257275088548364400416034343698146721891547571185, - 46562393661275354, - 21888242871839275222246405745257275088548364400416034343698181899536882716067, - 46036498986611734, - 28701859243365495, - 21888242871839275222246405745257275088548364400416034343698163158797073569078, - 21888242871839275222246405745257275088548364400416034343698155781125701717106, - 21888242871839275222246405745257275088548364400416034343698181962547936755901, - 58129755252331677, - 21888242871839275222246405745257275088548364400416034343698179714909952551791, - 21888242871839275222246405745257275088548364400416034343698162269964813824504, - 21888242871839275222246405745257275088548364400416034343698174627179611602196, - 3148963019294474, - 48546875765407682, - 21888242871839275222246405745257275088548364400416034343698179271470065419058, - 71528777673457254, - 21888242871839275222246405745257275088548364400416034343698153080057282353786, - 21888242871839275222246405745257275088548364400416034343698201023110651052902, - 21888242871839275222246405745257275088548364400416034343698133335456437101018, - 21888242871839275222246405745257275088548364400416034343698176125762485987526, - 21888242871839275222246405745257275088548364400416034343698167756329915616848, - 21888242871839275222246405745257275088548364400416034343698137440347073895965, - 46709532983946011, - 21888242871839275222246405745257275088548364400416034343698145032897880019732, - 21888242871839275222246405745257275088548364400416034343698134781158676938340, - 21888242871839275222246405745257275088548364400416034343698196511270490106324, - 16768805763143818, - 61134992065923459, - 32014487115429868, - 21888242871839275222246405745257275088548364400416034343698177082460906383512, - 21243693607637456, - 21888242871839275222246405745257275088548364400416034343698166757724393485797, - 21888242871839275222246405745257275088548364400416034343698197250098544424365, - 21888242871839275222246405745257275088548364400416034343698143637766127943125, - 54716852858941784, - 21888242871839275222246405745257275088548364400416034343698184975927658240468, - 21888242871839275222246405745257275088548364400416034343698203791771712845326, - 37607234561526517, - 59817843613071679, - 1659017141988985, - 54073486373289181, - 21888242871839275222246405745257275088548364400416034343698192563089746520752, - 65552380073726192, - 28206111002982398, - 21888242871839275222246405745257275088548364400416034343698167829178057565586, - 21888242871839275222246405745257275088548364400416034343698178736401464090814, - 48499399567396019, - 21888242871839275222246405745257275088548364400416034343698193753042369182506, - 21888242871839275222246405745257275088548364400416034343698198976665346789308, - 47048851450177932, - 21888242871839275222246405745257275088548364400416034343698167707575161436552, - 7152896620971156, - 57422087140586331, - 21888242871839275222246405745257275088548364400416034343698164663696281674354, - 67445840890448019, - 21888242871839275222246405745257275088548364400416034343698176634947102293582, - 50661448867049401, - 54953551356614989, - 36457092478992156, - 21888242871839275222246405745257275088548364400416034343698186326358219397201, - 50960949021621236, - 21888242871839275222246405745257275088548364400416034343698173299397517656918, - 42513878706659589, - 37302066637756080, - 21888242871839275222246405745257275088548364400416034343698154945768504078494, - 28712404521497229, - 21888242871839275222246405745257275088548364400416034343698174094133028578748, - 21888242871839275222246405745257275088548364400416034343698167720690367836620, - 20120318532765048, - 21888242871839275222246405745257275088548364400416034343698164903903179777393, - 21888242871839275222246405745257275088548364400416034343698176160407939376925, - 58257970886838380, - 21888242871839275222246405745257275088548364400416034343698146510691546701307, - 54908540578787391, - 21888242871839275222246405745257275088548364400416034343698197382300904865859, - 21888242871839275222246405745257275088548364400416034343698187595724797873626, - 21888242871839275222246405745257275088548364400416034343698156887638164742881, - 21888242871839275222246405745257275088548364400416034343698139924698259495020, - 21888242871839275222246405745257275088548364400416034343698167672267096583552, - 21888242871839275222246405745257275088548364400416034343698148954526895123076, - 21888242871839275222246405745257275088548364400416034343698139534762128420553, - 32637648816911688, - 46886841334998277, - 21888242871839275222246405745257275088548364400416034343698188537003360243742, - 21888242871839275222246405745257275088548364400416034343698153076858732455533, - 21888242871839275222246405745257275088548364400416034343698194484809240791000, - 21888242871839275222246405745257275088548364400416034343698197960317011918649, - 16434878322264465, - 21888242871839275222246405745257275088548364400416034343698140768354794404428, - 21888242871839275222246405745257275088548364400416034343698149472543838448094, - 21888242871839275222246405745257275088548364400416034343698174243860877226166, - 21888242871839275222246405745257275088548364400416034343698133051186760613407, - 559479289466384, - 21888242871839275222246405745257275088548364400416034343698139858650939864409, - 57027323709182431, - 55188603286337448, - 51628143451064864, - 21888242871839275222246405745257275088548364400416034343698134057650769527899, - 60695484882281633, - 21888242871839275222246405745257275088548364400416034343698171213018195834969, - 36220460532832103, - 21888242871839275222246405745257275088548364400416034343698183027101427619587, - 21888242871839275222246405745257275088548364400416034343698180719265412197913, - 55182791054121964, - 6791361767502748, - 21888242871839275222246405745257275088548364400416034343698151765948666827354, - 15808727766473333, - 38845008161624160, - 21888242871839275222246405745257275088548364400416034343698144311066096487445, - 21844652386430997, - 59997469649123411, - 21888242871839275222246405745257275088548364400416034343698177619987505422961, - 21888242871839275222246405745257275088548364400416034343698163020867152394735, - 22988766302106317, - 21888242871839275222246405745257275088548364400416034343698142884893677467720, - 21888242871839275222246405745257275088548364400416034343698173834954414211080, - 39387346821078676, - 39732163409980434, - 21888242871839275222246405745257275088548364400416034343698147312952608731626, - 29966010291843750, - 2719874685464040, - 21888242871839275222246405745257275088548364400416034343698200632699153931639, - 50004038017214700, - 21888242871839275222246405745257275088548364400416034343698197656734297557049, - 19545213560071537, - 21888242871839275222246405745257275088548364400416034343698188100613774085760, - 21888242871839275222246405745257275088548364400416034343698177278206710828637, - 10348521531248588, - 4092550978899420, - 30459883070994079, - 40732700546637339, - 21888242871839275222246405745257275088548364400416034343698199375160947992948, - 21888242871839275222246405745257275088548364400416034343698181046019941858684, - 21888242871839275222246405745257275088548364400416034343698167892343242756725, - 69728380675366880, - 21888242871839275222246405745257275088548364400416034343698188099982931579160, - 21888242871839275222246405745257275088548364400416034343698146787029880292270, - 39626290911857445, - 70328447387584581, - 21888242871839275222246405745257275088548364400416034343698179558423405309111, - 36564866024394964, - 21888242871839275222246405745257275088548364400416034343698145965104931487362, - 21888242871839275222246405745257275088548364400416034343698198673079130349440, - 8947639003775674, - 64050125487292192, - 40848479770912927, - 70540994583437992, - 28591904458150700, - 47170091147617377, - 68865340526665445, - 21888242871839275222246405745257275088548364400416034343698182323167689647990, - 21888242871839275222246405745257275088548364400416034343698203835422734212130, - 21888242871839275222246405745257275088548364400416034343698161722172085949482, - 50740955272375952, - 50136109394710980, - 21888242871839275222246405745257275088548364400416034343698146916604352882266, - 781560708665746, - 21888242871839275222246405745257275088548364400416034343698190276515799641471, - 51276796228791400, - 30943307798979814, - 61226420663963477, - 21888242871839275222246405745257275088548364400416034343698148621693372663628, - 21888242871839275222246405745257275088548364400416034343698142892401772583873, - 21888242871839275222246405745257275088548364400416034343698156399315812818444, - 70872834212035109, - 3207477460588275, - 56018974080244363, - 20185748215540093, - 15934796574911933, - 21888242871839275222246405745257275088548364400416034343698152881399792959629, - 52232467402888229, - 2607629785995601, - 19317242839065873, - 26075818216463461, - 51747360846511870, - 21888242871839275222246405745257275088548364400416034343698175480014617542301, - 21888242871839275222246405745257275088548364400416034343698198963013151927909, - 21888242871839275222246405745257275088548364400416034343698139239274716167923, - 21888242871839275222246405745257275088548364400416034343698180412093813896973, - 21888242871839275222246405745257275088548364400416034343698155306260451282823, - 12023710196537395, - 21888242871839275222246405745257275088548364400416034343698134934862243881607, - 21888242871839275222246405745257275088548364400416034343698138342991438490609, - 21888242871839275222246405745257275088548364400416034343698150792002913535004, - 21888242871839275222246405745257275088548364400416034343698192606292120827694, - 54212363988299355, - 8949953293105195, - 30331300424203204, - 408741561147215, - 21888242871839275222246405745257275088548364400416034343698142733335747947929, - 9192355696303290, - 21888242871839275222246405745257275088548364400416034343698146307953133432473, - 21888242871839275222246405745257275088548364400416034343698175627193204158567, - 71523649576153565, - 38197286104581619, - 46666849125755046, - 49881368496319587, - 21888242871839275222246405745257275088548364400416034343698148304141762578289, - 21888242871839275222246405745257275088548364400416034343698187368009260077257, - 30098882598723566, - 21888242871839275222246405745257275088548364400416034343698163740758614553117, - 21888242871839275222246405745257275088548364400416034343698160818551443746510, - 21888242871839275222246405745257275088548364400416034343698140197045453846551, - 21888242871839275222246405745257275088548364400416034343698141246141928751479, - 21888242871839275222246405745257275088548364400416034343698137318538780328041, - 21888242871839275222246405745257275088548364400416034343698184390562797525152, - 35492366391998353, - 21888242871839275222246405745257275088548364400416034343698170366403930664198, - 7623731354420377, - 21888242871839275222246405745257275088548364400416034343698183498470402237617, - 52225242591435670, - 47793584663155451, - 21888242871839275222246405745257275088548364400416034343698155640848147599284, - 68690672516230852, - 21888242871839275222246405745257275088548364400416034343698183739208377218960, - 25930625833182939, - 21888242871839275222246405745257275088548364400416034343698183383977099911542, - 4726010573708922, - 60469223569212809, - 21888242871839275222246405745257275088548364400416034343698149248043158136187, - 42738056266662282, - 21888242871839275222246405745257275088548364400416034343698173865289981078123, - 21888242871839275222246405745257275088548364400416034343698192549133037720194, - 44214765238123445, - 43132663610918438, - 56171664808026552, - 34858620465698311, - 21888242871839275222246405745257275088548364400416034343698195694604512122648, - 21888242871839275222246405745257275088548364400416034343698133613027957159660, - 1234831195613410, - 60346001451314745, - 21888242871839275222246405745257275088548364400416034343698202811728473677017, - 29861860216260580, - 34235079223081201, - 21888242871839275222246405745257275088548364400416034343698203318097599837710, - 63691385305051566, - 21888242871839275222246405745257275088548364400416034343698134172734858305860, - 21888242871839275222246405745257275088548364400416034343698168952263688877965, - 54905176690450302, - 21888242871839275222246405745257275088548364400416034343698187505326767739998, - 21888242871839275222246405745257275088548364400416034343698179257618072574237, - 47746355651827183, - 21888242871839275222246405745257275088548364400416034343698173952379016810942, - 21888242871839275222246405745257275088548364400416034343698202280540745678785, - 42505978081846252, - 33610823979991738, - 21888242871839275222246405745257275088548364400416034343698161391745559843884, - 21888242871839275222246405745257275088548364400416034343698153773536863157838, - 21888242871839275222246405745257275088548364400416034343698135059319303894195, - 21888242871839275222246405745257275088548364400416034343698132491230830771680, - 2267405541006136, - 29408311316689636, - 20173660813378776, - 31075357199619344, - 21888242871839275222246405745257275088548364400416034343698196924998122598350, - 58605174967016601, - 21888242871839275222246405745257275088548364400416034343698160076942443477251, - 33348581876381092, - 34043109756686316, - 21888242871839275222246405745257275088548364400416034343698157837402436914584, - 21888242871839275222246405745257275088548364400416034343698188177918828837875, - 43177129586840832, - 62585336509671172, - 44686884444988235, - 44384830760294128, - 10430767775287872, - 49585963967229193, - 53144259190294031, - 25257421831647684, - 21888242871839275222246405745257275088548364400416034343698148067449316686082, - 21888242871839275222246405745257275088548364400416034343698132262498945704725, - 21888242871839275222246405745257275088548364400416034343698159164660037495841, - 21888242871839275222246405745257275088548364400416034343698175033239278049116, - 21888242871839275222246405745257275088548364400416034343698164280369552356416, - 21721436428120960, - 9118320707024208, - 21888242871839275222246405745257275088548364400416034343698203546525073413034, - 21888242871839275222246405745257275088548364400416034343698182964715464229835, - 21888242871839275222246405745257275088548364400416034343698164370190649593694, - 21888242871839275222246405745257275088548364400416034343698141704878664846300, - 21888242871839275222246405745257275088548364400416034343698152638597236174922, - 3254163670374369, - 14322083987720543, - 57335362337091678, - 14948849686381603, - 47906231401676844, - 21888242871839275222246405745257275088548364400416034343698179161781711357190, - 64241415392916465, - 20773439828129458, - 37714189188613859, - 21888242871839275222246405745257275088548364400416034343698165646195070233101, - 21888242871839275222246405745257275088548364400416034343698186013226924976547, - 21888242871839275222246405745257275088548364400416034343698138346031654203930, - 21888242871839275222246405745257275088548364400416034343698203530152734542636, - 12687134812868908, - 3557280066394654, - 53986219021784722, - 36085251999241248, - 21888242871839275222246405745257275088548364400416034343698159465035348651554, - 51084903851851166, - 21888242871839275222246405745257275088548364400416034343698160012258190456215, - 6169400044169288, - 21888242871839275222246405745257275088548364400416034343698192249851395329384, - 21888242871839275222246405745257275088548364400416034343698147776896424157107, - 21888242871839275222246405745257275088548364400416034343698155496286520800716, - 21888242871839275222246405745257275088548364400416034343698192737938438558797, - 1976818515666460, - 21888242871839275222246405745257275088548364400416034343698151721709210721085, - 21888242871839275222246405745257275088548364400416034343698186691696741187345, - 45818276410911558, - 21888242871839275222246405745257275088548364400416034343698191053555228536793, - 36530241554549501, - 67377346045960849, - 3624108884836582, - 36749653324543880, - 49332413335677478, - 8849930376083281, - 21888242871839275222246405745257275088548364400416034343698195866059576699737, - 21888242871839275222246405745257275088548364400416034343698184217725689521698, - 21888242871839275222246405745257275088548364400416034343698177769627332850229, - 3616160471950654, - 21888242871839275222246405745257275088548364400416034343698201521041043768805, - 21888242871839275222246405745257275088548364400416034343698143262845648410190, - 62151582492519712, - 21888242871839275222246405745257275088548364400416034343698132178645023545972, - 56264590043362390, - 21888242871839275222246405745257275088548364400416034343698166159890547645694, - 21888242871839275222246405745257275088548364400416034343698138868482627656418, - 21888242871839275222246405745257275088548364400416034343698145843299847113417, - 21888242871839275222246405745257275088548364400416034343698193658563714137706, - 33229980608243059, - 21888242871839275222246405745257275088548364400416034343698202927929562317060, - 21888242871839275222246405745257275088548364400416034343698148767929670652693, - 21888242871839275222246405745257275088548364400416034343698162088205057813974, - 21888242871839275222246405745257275088548364400416034343698160676088073948173, - 21888242871839275222246405745257275088548364400416034343698173940904771087428, - 62054607978664422, - 21888242871839275222246405745257275088548364400416034343698132827273172928250, - 21888242871839275222246405745257275088548364400416034343698155864352122139161, - 21888242871839275222246405745257275088548364400416034343698174275773583212492, - 21888242871839275222246405745257275088548364400416034343698185721500825636856, - 21888242871839275222246405745257275088548364400416034343698166281171298347490, - 21888242871839275222246405745257275088548364400416034343698187695108527306166, - 21888242871839275222246405745257275088548364400416034343698139024659855703288, - 63694750861748052, - 21888242871839275222246405745257275088548364400416034343698178866212534801125, - 21888242871839275222246405745257275088548364400416034343698145908423406350883, - 35086326471860678, - 21888242871839275222246405745257275088548364400416034343698186953862858660016, - 21888242871839275222246405745257275088548364400416034343698158764308317744480, - 851012740049685, - 33364463775737565, - 39303548275000166, - 60478944982445794, - 63104337226444905, - 48654857733740446, - 47281262483627243, - 21888242871839275222246405745257275088548364400416034343698181303192499679553, - 21888242871839275222246405745257275088548364400416034343698195556837560937194, - 39611420696938395, - 21888242871839275222246405745257275088548364400416034343698186421726265761679, - 21888242871839275222246405745257275088548364400416034343698200886769521853840, - 16492435906827896, - 41953069385882761, - 47963013410514875, - 64633424025166168, - 21227281407348018, - 21888242871839275222246405745257275088548364400416034343698135692260151724720, - 21888242871839275222246405745257275088548364400416034343698154115952874473764, - 21888242871839275222246405745257275088548364400416034343698179393598176537198, - 15806922384783081, - 21888242871839275222246405745257275088548364400416034343698161334251764002466, - 58067744263548548, - 61295108694568717, - 57439557294861539, - 29682622314537650, - 53116311160523616, - 61047216627305605, - 21888242871839275222246405745257275088548364400416034343698202361527121537003, - 21888242871839275222246405745257275088548364400416034343698157526215351047585, - 21888242871839275222246405745257275088548364400416034343698189185633861059814, - 6847127012401517, - 21888242871839275222246405745257275088548364400416034343698173025814178189623, - 39754702662596511, - 63963165116590301, - 63035988199467284, - 36383025752829397, - 23737394672572357, - 21888242871839275222246405745257275088548364400416034343698176780933066708815, - 21888242871839275222246405745257275088548364400416034343698200777425588703771, - 22831683625024398, - 21888242871839275222246405745257275088548364400416034343698163186880767945962, - 21888242871839275222246405745257275088548364400416034343698138962697914566963, - 25618039670144083, - 30896882408213266, - 21888242871839275222246405745257275088548364400416034343698168086056168658033, - 21735294176455582, - 21888242871839275222246405745257275088548364400416034343698195862045551556372, - 21362753934878820, - 16788666060478141, - 59594181105114771, - 69625294174026031, - 23213136900180190, - 23309640825802899, - 21888242871839275222246405745257275088548364400416034343698143085343513806919, - 18333492955623825, - 21888242871839275222246405745257275088548364400416034343698194421017930507768, - 21888242871839275222246405745257275088548364400416034343698187857377384884213, - 7455631930102203, - 38056742544149151, - 21888242871839275222246405745257275088548364400416034343698143682386930551100, - 53861928451183398, - 21888242871839275222246405745257275088548364400416034343698134604053515635198, - 1365354334573773, - 64566783063521801, - 21888242871839275222246405745257275088548364400416034343698161214218590656279, - 37007176469676865, - 31880993686030128, - 21888242871839275222246405745257275088548364400416034343698147073140828757178, - 59711539335535535, - 21888242871839275222246405745257275088548364400416034343698148962525578195919, - 21888242871839275222246405745257275088548364400416034343698185032023375187512, - 21888242871839275222246405745257275088548364400416034343698165161845831438328, - 21888242871839275222246405745257275088548364400416034343698189717658232428695, - 21888242871839275222246405745257275088548364400416034343698144934166611847522, - 62635898980331017, - 21888242871839275222246405745257275088548364400416034343698145760085426673813, - 28025142824473921, - 20178860192093580, - 21888242871839275222246405745257275088548364400416034343698141259137858884867, - 21888242871839275222246405745257275088548364400416034343698178288390585613548, - 21888242871839275222246405745257275088548364400416034343698157809741363169197, - 37373275030022073, - 21888242871839275222246405745257275088548364400416034343698195435646606951178, - 21888242871839275222246405745257275088548364400416034343698171799549742767269, - 21888242871839275222246405745257275088548364400416034343698182054473749173591, - 21888242871839275222246405745257275088548364400416034343698140404247262708356, - 21888242871839275222246405745257275088548364400416034343698179770699612830409, - 21888242871839275222246405745257275088548364400416034343698167903635749346384, - 21888242871839275222246405745257275088548364400416034343698201238294815228755, - 21888242871839275222246405745257275088548364400416034343698146141819958091645, - 21888242871839275222246405745257275088548364400416034343698189771013203698052, - 8052754476073530, - 71465393595881720, - 21888242871839275222246405745257275088548364400416034343698192201810260033680, - 46035295139523602, - 68376745248962559, - 21888242871839275222246405745257275088548364400416034343698185692184550597651, - 21888242871839275222246405745257275088548364400416034343698172760710557655166, - 21888242871839275222246405745257275088548364400416034343698194445287266071226, - 21888242871839275222246405745257275088548364400416034343698177650401480267308, - 21888242871839275222246405745257275088548364400416034343698184022505395691996, - 63295743898072190, - 4653945783065029, - 21888242871839275222246405745257275088548364400416034343698166305912307397188, - 53674117571306163, - 31200585754665376, - 26644414801304373, - 18718615717934022, - 60076633695858419, - 60612980838835765, - 11123990711113875, - 23074004563347414, - 21888242871839275222246405745257275088548364400416034343698144925948897663342, - 69426514191980864, - 8978311722582624, - 12312506921450683, - 37575501581962544, - 513492590747193, - 19557779008396167, - 21888242871839275222246405745257275088548364400416034343698148631189400009373, - 38753302060932311, - 65882964701625554, - 21888242871839275222246405745257275088548364400416034343698174955546585496978, - 38928717337933198, - 21888242871839275222246405745257275088548364400416034343698175458567000056932, - 62191823316429232, - 1558605573685138, - 44594777639295508, - 62095103256913409, - 6625885798178921, - 21888242871839275222246405745257275088548364400416034343698182625817795506972, - 20473750772462607, - 21888242871839275222246405745257275088548364400416034343698170396087307498224, - 21888242871839275222246405745257275088548364400416034343698162377164336172950, - 21888242871839275222246405745257275088548364400416034343698186880683212422198, - 16589658470709900, - 61638643458163254, - 21888242871839275222246405745257275088548364400416034343698142055077356562525, - 21888242871839275222246405745257275088548364400416034343698143280725572396896, - 21888242871839275222246405745257275088548364400416034343698165867525369059135, - 21888242871839275222246405745257275088548364400416034343698143855982862075022, - 21888242871839275222246405745257275088548364400416034343698141304979418007631, - 12642801223703759, - 37680644594310419, - 21888242871839275222246405745257275088548364400416034343698172304007405532093, - 21888242871839275222246405745257275088548364400416034343698140283362194403819, - 21888242871839275222246405745257275088548364400416034343698203787166461203095, - 21888242871839275222246405745257275088548364400416034343698164451072028382641, - 16832020771032664, - 21888242871839275222246405745257275088548364400416034343698138229362355249808, - 21888242871839275222246405745257275088548364400416034343698185209710179556035, - 53874437788478831, - 19551283259587993, - 21888242871839275222246405745257275088548364400416034343698160460018911503716, - 47842606939592821, - 21888242871839275222246405745257275088548364400416034343698167505413272994863, - 54302186520774879, - 21888242871839275222246405745257275088548364400416034343698151772003631086115, - 2020680887032525, - 48051611927915743, - 21888242871839275222246405745257275088548364400416034343698197881074571551565, - 19246956201227233, - 39981626569396058, - 62119159775885761, - 21888242871839275222246405745257275088548364400416034343698178461996077594296, - 21888242871839275222246405745257275088548364400416034343698190471843969401862, - 21888242871839275222246405745257275088548364400416034343698158221951785578408, - 1914475691063087, - 21888242871839275222246405745257275088548364400416034343698149349508399203982, - 21888242871839275222246405745257275088548364400416034343698161625600311882142, - 21888242871839275222246405745257275088548364400416034343698185363229162786754, - 21888242871839275222246405745257275088548364400416034343698199392827971570164, - 36780510480142217, - 21888242871839275222246405745257275088548364400416034343698180077365970810577, - 70744302281894399, - 21229475737441110, - 38374392401405300, - 13555982515049938, - 52082520839176735, - 21888242871839275222246405745257275088548364400416034343698191331869746338551, - 10934387612675810, - 52345777993765638, - 21888242871839275222246405745257275088548364400416034343698195112341067711685, - 21888242871839275222246405745257275088548364400416034343698135803685609119840, - 21888242871839275222246405745257275088548364400416034343698189440484198787993, - 21888242871839275222246405745257275088548364400416034343698168347888418964802, - 21888242871839275222246405745257275088548364400416034343698132442851351955701, - 55414692277274180, - 57397547613629731, - 14041715953807122, - 21888242871839275222246405745257275088548364400416034343698140227826893715874, - 21888242871839275222246405745257275088548364400416034343698136177096013211543, - 9241942853541440, - 21888242871839275222246405745257275088548364400416034343698202347306995954522, - 52724920227309146, - 35646871403930680, - 43090268917284805, - 21888242871839275222246405745257275088548364400416034343698137924282544756648, - 36091989819855314, - 21888242871839275222246405745257275088548364400416034343698195876411073922209, - 47668734148459914, - 66301482612662296, - 21888242871839275222246405745257275088548364400416034343698143434969194834753, - 34257562938916517, - 36528204947112358, - 24829285221785241, - 42280294548121517, - 21888242871839275222246405745257275088548364400416034343698132235397911894980, - 18611069955775813, - 21888242871839275222246405745257275088548364400416034343698200692528118836684, - 21888242871839275222246405745257275088548364400416034343698151927197282739110, - 64004487276156766, - 21888242871839275222246405745257275088548364400416034343698150075896501781111, - 31854477940000341, - 68389843024204895, - 21888242871839275222246405745257275088548364400416034343698163503055166342163, - 54631538503241483, - 20452400847353016, - 21888242871839275222246405745257275088548364400416034343698177908194555175549, - 68715904242265861, - 21888242871839275222246405745257275088548364400416034343698172897457394504250, - 17115868179157405, - 21888242871839275222246405745257275088548364400416034343698180063476881443564, - 58111022070736934, - 47086845073508820, - 4048427687794748, - 34505413201895512, - 21888242871839275222246405745257275088548364400416034343698188620408382605829, - 18447263115929355, - 5476379822569424, - 21888242871839275222246405745257275088548364400416034343698138883725888107047, - 21888242871839275222246405745257275088548364400416034343698203604526811068012, - 21888242871839275222246405745257275088548364400416034343698203911468573402660, - 21888242871839275222246405745257275088548364400416034343698135846127697155127, - 34040746379263180, - 46206677921769233, - 13492937224659639, - 21888242871839275222246405745257275088548364400416034343698144900803697254812, - 21888242871839275222246405745257275088548364400416034343698182577039121664156, - 21888242871839275222246405745257275088548364400416034343698156390618986462381, - 21888242871839275222246405745257275088548364400416034343698162318737410965113, - 21888242871839275222246405745257275088548364400416034343698148605983170868830, - 21888242871839275222246405745257275088548364400416034343698177077907520055737, - 21888242871839275222246405745257275088548364400416034343698150259142732435000, - 21888242871839275222246405745257275088548364400416034343698177786370639464746, - 21888242871839275222246405745257275088548364400416034343698189590900853386910, - 1760097752864636, - 21888242871839275222246405745257275088548364400416034343698157887717534916957, - 66173640801556986, - 21888242871839275222246405745257275088548364400416034343698166592893681796550, - 39058430999366554, - 21888242871839275222246405745257275088548364400416034343698137101337462111923, - 71185043427653745, - 21888242871839275222246405745257275088548364400416034343698147005503823237031, - 3579096815153000, - 57375908538422756, - 21888242871839275222246405745257275088548364400416034343698150677612800336537, - 37702193308701986, - 21888242871839275222246405745257275088548364400416034343698185391307843031964, - 57293886651448638, - 32812266399920622, - 21888242871839275222246405745257275088548364400416034343698194314340387394496, - 55781518086369249, - 50997268678466483, - 1032915177243738, - 21888242871839275222246405745257275088548364400416034343698189554857358529366, - 38703086123442081, - 21888242871839275222246405745257275088548364400416034343698189735650327197033, - 22201499602415305, - 152760179023133, - 21888242871839275222246405745257275088548364400416034343698185410629358930232, - 21888242871839275222246405745257275088548364400416034343698169543627860416281, - 48030983538953404, - 21888242871839275222246405745257275088548364400416034343698191587467352474230, - 21888242871839275222246405745257275088548364400416034343698192917977455287788, - 21888242871839275222246405745257275088548364400416034343698147635881832640676, - 21888242871839275222246405745257275088548364400416034343698197628792212640657, - 21888242871839275222246405745257275088548364400416034343698184322421680351761, - 50010624952355328, - 16485189491763650, - 6890772309619538, - 21888242871839275222246405745257275088548364400416034343698182775432512412402, - 21888242871839275222246405745257275088548364400416034343698175518907290103955, - 21888242871839275222246405745257275088548364400416034343698204180717891108243, - 32734851375169480, - 61767110613967770, - 16508247922428033, - 22823400431784751, - 70637155054844718, - 21888242871839275222246405745257275088548364400416034343698199621616910612567, - 1691146824233456, - 60171136150659196, - 21888242871839275222246405745257275088548364400416034343698162148183818200168, - 21888242871839275222246405745257275088548364400416034343698197162059940813881, - 52211590191685748, - 14573983995129358, - 21888242871839275222246405745257275088548364400416034343698155482346342069469, - 66875230131080881, - 21888242871839275222246405745257275088548364400416034343698145935973686856324, - 21888242871839275222246405745257275088548364400416034343698191736958475133858, - 21888242871839275222246405745257275088548364400416034343698153474529549986280, - 13831416797640043, - 21888242871839275222246405745257275088548364400416034343698183909241104109162, - 21888242871839275222246405745257275088548364400416034343698149737884839930483, - 43444263710696953, - 21888242871839275222246405745257275088548364400416034343698191813680934435903, - 21888242871839275222246405745257275088548364400416034343698141742421728732669, - 21888242871839275222246405745257275088548364400416034343698162113071565523408, - 21888242871839275222246405745257275088548364400416034343698167606414678329641, - 19856786026213951, - 21888242871839275222246405745257275088548364400416034343698168543378762902608, - 21888242871839275222246405745257275088548364400416034343698135971305431725687, - 25035058227790121, - 21888242871839275222246405745257275088548364400416034343698192739539246970525, - 5839033360841068, - 21888242871839275222246405745257275088548364400416034343698186491800546076960, - 21888242871839275222246405745257275088548364400416034343698151609748054698463, - 21888242871839275222246405745257275088548364400416034343698147797183807356195, - 32620477323977757, - 10619504958069300, - 70748471169817890, - 21888242871839275222246405745257275088548364400416034343698160815067470656073, - 21888242871839275222246405745257275088548364400416034343698193642772022334973, - 58123135855751239, - 21888242871839275222246405745257275088548364400416034343698171255225283493617, - 33292616492898946, - 21888242871839275222246405745257275088548364400416034343698164069640604906234, - 21888242871839275222246405745257275088548364400416034343698165403289495715643, - 69402747257239157, - 47908888619848965, - 21888242871839275222246405745257275088548364400416034343698150647891647045380, - 21888242871839275222246405745257275088548364400416034343698178154792180149370, - 26614921919508781, - 21888242871839275222246405745257275088548364400416034343698154956313327978381, - 29179458862424384, - 56118900707369288, - 21888242871839275222246405745257275088548364400416034343698201361671736623166, - 21888242871839275222246405745257275088548364400416034343698181270069454142663, - 16132200132707040, - 10467999811619086, - 21888242871839275222246405745257275088548364400416034343698192806649923826786, - 7781193223096819, - 21888242871839275222246405745257275088548364400416034343698187876375218002695, - 30045286408295627, - 30872736697509741, - 14840193445082626, - 21888242871839275222246405745257275088548364400416034343698157784575970488799, - 21888242871839275222246405745257275088548364400416034343698186267885354922647, - 21888242871839275222246405745257275088548364400416034343698192962276684188363, - 21888242871839275222246405745257275088548364400416034343698171693499621111776, - 21888242871839275222246405745257275088548364400416034343698184955768137905086, - 66921453289346925, - 12561204746372217, - 42725428448712950, - 58552228039979343, - 21888242871839275222246405745257275088548364400416034343698159213746683573517, - 68347357475079609, - 9181053245131924, - 44999344344617323, - 21888242871839275222246405745257275088548364400416034343698164218689226414517, - 58254430690548365, - 21888242871839275222246405745257275088548364400416034343698156816435653739248, - 23991138155347822, - 21888242871839275222246405745257275088548364400416034343698186126361506500548, - 30170609104475387, - 21888242871839275222246405745257275088548364400416034343698174905123551735711, - 21888242871839275222246405745257275088548364400416034343698139839403358500894, - 21888242871839275222246405745257275088548364400416034343698148247241451347296, - 36393772976114923, - 21888242871839275222246405745257275088548364400416034343698162536742615845131, - 916166495200270, - 33775766585243865, - 21888242871839275222246405745257275088548364400416034343698134962551301240775, - 21888242871839275222246405745257275088548364400416034343698188085010281316261, - 21888242871839275222246405745257275088548364400416034343698197581176304694886, - 13561692109570397, - 16949056605991396, - 21888242871839275222246405745257275088548364400416034343698195999615171250121, - 21888242871839275222246405745257275088548364400416034343698144821667566023735, - 2895117150724040, - 21888242871839275222246405745257275088548364400416034343698153287391013377348, - 67386016030440459, - 21888242871839275222246405745257275088548364400416034343698164707287796989281, - 21888242871839275222246405745257275088548364400416034343698141551401371046778, - 19515470799626381, - 8180011094154258, - 21888242871839275222246405745257275088548364400416034343698155656523018002285, - 63620713796419182, - 20790150499366539, - 44518255962214442, - 45561251543368255, - 21888242871839275222246405745257275088548364400416034343698141104479729171230, - 21888242871839275222246405745257275088548364400416034343698177984014675942993, - 48629011156641257, - 10132902467873400, - 57558458959503835, - 47277522505016085, - 2977171996169990, - 21888242871839275222246405745257275088548364400416034343698177110018318482033, - 21888242871839275222246405745257275088548364400416034343698163843258563189596, - 38383370502626184, - 21888242871839275222246405745257275088548364400416034343698157624376892418236, - 6117404091806544, - 29259356283871656, - 21888242871839275222246405745257275088548364400416034343698146711661790348662, - 12921851228203473, - 21888242871839275222246405745257275088548364400416034343698198927862481052854, - 59496333440543509, - 69370908423315898, - 21888242871839275222246405745257275088548364400416034343698196915029042267357, - 33595929076337894, - 69638078388982920, - 21888242871839275222246405745257275088548364400416034343698137944415027729262, - 11500204634716388, - 51210751862660931, - 21888242871839275222246405745257275088548364400416034343698194666204981076021, - 38136724308106753, - 21888242871839275222246405745257275088548364400416034343698164073278632976066, - 21888242871839275222246405745257275088548364400416034343698186518524102884087, - 21888242871839275222246405745257275088548364400416034343698171904069398249934, - 21888242871839275222246405745257275088548364400416034343698189282348783154835, - 3757504370781227, - 63498173029267813, - 48815229982771466, - 21888242871839275222246405745257275088548364400416034343698184997132516086914, - 70686065888156296, - 4721601034561265, - 21888242871839275222246405745257275088548364400416034343698144789513681346104, - 49568511425203760, - 21888242871839275222246405745257275088548364400416034343698189740180377128444, - 39081335322758460, - 21888242871839275222246405745257275088548364400416034343698134917244823846838, - 21888242871839275222246405745257275088548364400416034343698137951972277475416, - 21888242871839275222246405745257275088548364400416034343698133222906081961239, - 21888242871839275222246405745257275088548364400416034343698176164647055210473, - 21888242871839275222246405745257275088548364400416034343698179636957634619892, - 21888242871839275222246405745257275088548364400416034343698174851854394989221, - 20928201232644485, - 21888242871839275222246405745257275088548364400416034343698174473331854593408, - 21888242871839275222246405745257275088548364400416034343698183681442031973299, - 21888242871839275222246405745257275088548364400416034343698146284324062219139, - 21888242871839275222246405745257275088548364400416034343698182519514857683127, - 21888242871839275222246405745257275088548364400416034343698184655692934260060, - 21888242871839275222246405745257275088548364400416034343698168714689858228575, - 21888242871839275222246405745257275088548364400416034343698180215883125885015, - 69401326673063953, - 60928193937210622, - 21888242871839275222246405745257275088548364400416034343698165889846703156470, - 35764110228684983, - 21888242871839275222246405745257275088548364400416034343698148442697632973507, - 41019283594132001, - 23879428368962208, - 21888242871839275222246405745257275088548364400416034343698133396568871204291, - 16142585205514060, - 30009938154765139, - 21888242871839275222246405745257275088548364400416034343698171978457254432460, - 61697693140598601, - 21888242871839275222246405745257275088548364400416034343698196424261259977993, - 16502426249976131, - 60131358379281143, - 21888242871839275222246405745257275088548364400416034343698166353730292611346, - 21888242871839275222246405745257275088548364400416034343698193729526470722378, - 21888242871839275222246405745257275088548364400416034343698146827099043441683, - 16745942475992007, - 65044678475086121, - 21888242871839275222246405745257275088548364400416034343698155823436221981344, - 65002056098606197, - 21888242871839275222246405745257275088548364400416034343698182544815423791457, - 12616776660625240, - 22643060356771167, - 64928771435245939, - 40631371707344097, - 33988508189271653, - 21888242871839275222246405745257275088548364400416034343698200128652606410073, - 49315006655753014, - 21888242871839275222246405745257275088548364400416034343698179162977666225896, - 21888242871839275222246405745257275088548364400416034343698197725857394101147, - 28849028142353638, - 21888242871839275222246405745257275088548364400416034343698139495083381222883, - 21888242871839275222246405745257275088548364400416034343698159252364314199130, - 64198588090172540, - 21888242871839275222246405745257275088548364400416034343698171659238723163662, - 21888242871839275222246405745257275088548364400416034343698175385635117583310, - 21888242871839275222246405745257275088548364400416034343698188046882408385392, - 24791966747973592, - 21888242871839275222246405745257275088548364400416034343698175251153785208676, - 21888242871839275222246405745257275088548364400416034343698145016913435508399, - 21888242871839275222246405745257275088548364400416034343698159617861434587918, - 21888242871839275222246405745257275088548364400416034343698152989244467985224, - 21888242871839275222246405745257275088548364400416034343698192065600396768778, - 63057335777094776, - 36870790205854070, - 21888242871839275222246405745257275088548364400416034343698136612690709696688, - 21888242871839275222246405745257275088548364400416034343698133048348353798007, - 47305037764894310, - 49696882401083861, - 21888242871839275222246405745257275088548364400416034343698176089070633067299, - 21888242871839275222246405745257275088548364400416034343698188814235462784858, - 21888242871839275222246405745257275088548364400416034343698172972150627038991, - 46132904139218827, - 11358689090986080, - 14932770094967490, - 5632410311236149, - 662570540143487, - 6146164128043249, - 30929732936083759, - 12923144306365191, - 21888242871839275222246405745257275088548364400416034343698178778402334150669, - 66049722661486506, - 10560831872961117, - 45498085159485566, - 22813936521752594, - 21888242871839275222246405745257275088548364400416034343698148139983222464390, - 21888242871839275222246405745257275088548364400416034343698185497964880390403, - 21888242871839275222246405745257275088548364400416034343698186515157649648083, - 121202509608652, - 21888242871839275222246405745257275088548364400416034343698166067420442694471, - 21888242871839275222246405745257275088548364400416034343698145224582254661953, - 31070065445745375, - 21888242871839275222246405745257275088548364400416034343698181150648742629414, - 21888242871839275222246405745257275088548364400416034343698147593893653629040, - 21888242871839275222246405745257275088548364400416034343698144804887971195315, - 21888242871839275222246405745257275088548364400416034343698173252605498127704, - 21888242871839275222246405745257275088548364400416034343698159790764692793436, - 50248319367079782, - 65077524641520552, - 21888242871839275222246405745257275088548364400416034343698161786083619625593, - 21888242871839275222246405745257275088548364400416034343698132844666635748704, - 21888242871839275222246405745257275088548364400416034343698153549364006109530, - 4097233510694967, - 4055412736933065, - 15907872898272901, - 71208520772383418, - 2022226332659120, - 21888242871839275222246405745257275088548364400416034343698138531720320553385, - 21888242871839275222246405745257275088548364400416034343698189805424328483065, - 21888242871839275222246405745257275088548364400416034343698166385804898920135, - 21888242871839275222246405745257275088548364400416034343698184458671332999436, - 12316513056562442, - 21888242871839275222246405745257275088548364400416034343698156634862320949943, - 23125850687335931, - 21888242871839275222246405745257275088548364400416034343698146765422411542760, - 21888242871839275222246405745257275088548364400416034343698200734243899717466, - 34442508017006939, - 49694801216641735, - 71949823019679534, - 68587007630405648, - 21888242871839275222246405745257275088548364400416034343698138462563958953431, - 21888242871839275222246405745257275088548364400416034343698196743103821219272, - 4110306029373508, - 17219972089629596, - 21888242871839275222246405745257275088548364400416034343698139255394477223392, - 29130536528129102, - 14445986992602580, - 21888242871839275222246405745257275088548364400416034343698148496271569519438, - 41239663677374444, - 21888242871839275222246405745257275088548364400416034343698203687802742421623, - 4947357059389240, - 21888242871839275222246405745257275088548364400416034343698176797900406640045, - 36019308495984484, - 21888242871839275222246405745257275088548364400416034343698189667672061604472, - 30558923571561045, - 21888242871839275222246405745257275088548364400416034343698167295805614106119, - 21888242871839275222246405745257275088548364400416034343698175593892367405376, - 21888242871839275222246405745257275088548364400416034343698159346921423466792, - 21888242871839275222246405745257275088548364400416034343698180990448133823020, - 21888242871839275222246405745257275088548364400416034343698155677023805046585, - 21888242871839275222246405745257275088548364400416034343698201141186246875541, - 70738516804576715, - 53443598709633800, - 47924514145080403, - 21888242871839275222246405745257275088548364400416034343698164552902061116622, - 21888242871839275222246405745257275088548364400416034343698152959566847048527, - 14977974304187047, - 31303765035401382, - 65917145886691442, - 21888242871839275222246405745257275088548364400416034343698198668102079865370, - 33006891407457093, - 21888242871839275222246405745257275088548364400416034343698162746810403928110, - 21888242871839275222246405745257275088548364400416034343698148656913044940032, - 21888242871839275222246405745257275088548364400416034343698183746649285075637, - 63504415514729721, - 53494156859818333, - 21888242871839275222246405745257275088548364400416034343698187206675375849875, - 21888242871839275222246405745257275088548364400416034343698153198086001134927, - 21888242871839275222246405745257275088548364400416034343698174574770165589925, - 60743563660024862, - 44534568197657361, - 67387500145808494, - 21888242871839275222246405745257275088548364400416034343698165909578624116893, - 50366143968100625, - 21888242871839275222246405745257275088548364400416034343698168442330547921513, - 48382765456044513, - 45397645382885667, - 21888242871839275222246405745257275088548364400416034343698199551304174082650, - 21888242871839275222246405745257275088548364400416034343698173879170073875272, - 56451131060452922, - 11143208491260138, - 21888242871839275222246405745257275088548364400416034343698182864468346327816, - 21888242871839275222246405745257275088548364400416034343698146577197469697147, - 21888242871839275222246405745257275088548364400416034343698178408057668874616, - 10692290033742368, - 69211408709545471, - 15945650430143383, - 21888242871839275222246405745257275088548364400416034343698185890217249353445, - 21888242871839275222246405745257275088548364400416034343698135862032564484336, - 21888242871839275222246405745257275088548364400416034343698175996957538781473, - 21888242871839275222246405745257275088548364400416034343698156492162026119422, - 70778043766541450, - 21888242871839275222246405745257275088548364400416034343698162290942408089409, - 21888242871839275222246405745257275088548364400416034343698154731328221760877, - 21888242871839275222246405745257275088548364400416034343698165557509399837926, - 21888242871839275222246405745257275088548364400416034343698138260955214397418, - 46841483316349345, - 1680871087762000, - 33224330659619951, - 70262628905243947, - 21888242871839275222246405745257275088548364400416034343698190127230426637752, - 21888242871839275222246405745257275088548364400416034343698185258236727604184, - 55533478194127523, - 21888242871839275222246405745257275088548364400416034343698199727827076109418, - 2569887741466512, - 21888242871839275222246405745257275088548364400416034343698177377307551974084, - 51827852432880972, - 68661088127175161, - 21888242871839275222246405745257275088548364400416034343698201410693554267910, - 69994221520255670, - 2129384508510748, - 12708392496155275, - 55773040857509340, - 21888242871839275222246405745257275088548364400416034343698188502212452569368, - 21888242871839275222246405745257275088548364400416034343698134305283350265076, - 68860153082683492, - 23748147697231108, - 21888242871839275222246405745257275088548364400416034343698151063989541566978, - 21888242871839275222246405745257275088548364400416034343698193223609533678767, - 21888242871839275222246405745257275088548364400416034343698164373618491681036, - 21888242871839275222246405745257275088548364400416034343698200698972956879737, - 21888242871839275222246405745257275088548364400416034343698180202718951210365, - 67614945282200822, - 25222674519478295, - 21888242871839275222246405745257275088548364400416034343698150967171853682116, - 21888242871839275222246405745257275088548364400416034343698196974045919763824, - 25017614230277333, - 7811459105094891, - 21888242871839275222246405745257275088548364400416034343698193299981972622558, - 735282704833452, - 37052438037380718, - 31150149861064503, - 21888242871839275222246405745257275088548364400416034343698152729043498241298, - 21888242871839275222246405745257275088548364400416034343698160348744356040393, - 21888242871839275222246405745257275088548364400416034343698136118409324035061, - 30567525813287882, - 38166582884418228, - 32007876987281704, - 54999663102362591, - 21888242871839275222246405745257275088548364400416034343698171702908541950405, - 66587105553410363, - 21888242871839275222246405745257275088548364400416034343698148226988464028345, - 4749627351783252, - 21888242871839275222246405745257275088548364400416034343698152581309466100384, - 21888242871839275222246405745257275088548364400416034343698146074498886747621, - 21888242871839275222246405745257275088548364400416034343698173430299575000168, - 21888242871839275222246405745257275088548364400416034343698200687926097946398, - 3266378487758611, - 21888242871839275222246405745257275088548364400416034343698161028851231016043, - 21888242871839275222246405745257275088548364400416034343698177767384296546767, - 21888242871839275222246405745257275088548364400416034343698189412773552515557, - 60294346404017567, - 21888242871839275222246405745257275088548364400416034343698142326250320992435, - 39057463918328677, - 22233423185025399, - 21888242871839275222246405745257275088548364400416034343698140124547763601798, - 21888242871839275222246405745257275088548364400416034343698170455526337162744, - 39254688703609371, - 6933764162093490, - 21888242871839275222246405745257275088548364400416034343698198127645368334576, - 60358927680668823, - 41053320779828152, - 37045143887225720, - 64539459463841827, - 21888242871839275222246405745257275088548364400416034343698195343081187098456, - 41687739979916335, - 21888242871839275222246405745257275088548364400416034343698202211566810220228, - 46619998782917471, - 19585611371052582, - 21888242871839275222246405745257275088548364400416034343698189207337021196927, - 21888242871839275222246405745257275088548364400416034343698199509810699144475, - 59201240960728542, - 21888242871839275222246405745257275088548364400416034343698139337457634683746, - 21888242871839275222246405745257275088548364400416034343698193970235787840263, - 21888242871839275222246405745257275088548364400416034343698193660184486091229, - 21888242871839275222246405745257275088548364400416034343698160899713467248990, - 47759996193249543, - 21888242871839275222246405745257275088548364400416034343698156595183419619803, - 21888242871839275222246405745257275088548364400416034343698164680694863453328, - 68998513957366533, - 21888242871839275222246405745257275088548364400416034343698199571252877628514, - 21888242871839275222246405745257275088548364400416034343698171180683721822000, - 67758837792275279, - 32928486033970468, - 41326226147469476, - 21888242871839275222246405745257275088548364400416034343698155071704573893412, - 15724566923401764, - 21888242871839275222246405745257275088548364400416034343698168311534862174479, - 21888242871839275222246405745257275088548364400416034343698198764937317973052, - 21888242871839275222246405745257275088548364400416034343698147625212117374441, - 51964340260412618, - 21888242871839275222246405745257275088548364400416034343698194876666154697958, - 21888242871839275222246405745257275088548364400416034343698169239642932874631, - 22052400155293013, - 21888242871839275222246405745257275088548364400416034343698198511446220832762, - 5449844862727863, - 67157330807509725, - 21888242871839275222246405745257275088548364400416034343698157787309421300158, - 21888242871839275222246405745257275088548364400416034343698160850524956296428, - 62837203024081763, - 21888242871839275222246405745257275088548364400416034343698155714824251845134, - 56554298334700727, - 26324683260006174, - 27381279947507139, - 43479223540145929, - 12541623444780805, - 52913893285603481, - 21888242871839275222246405745257275088548364400416034343698171119392446145263, - 14080778503623849, - 63837812484372303, - 21888242871839275222246405745257275088548364400416034343698142493128555082168, - 40617323998146159, - 21888242871839275222246405745257275088548364400416034343698151136186384121653, - 46054416252311742, - 21888242871839275222246405745257275088548364400416034343698165826672005201460, - 21888242871839275222246405745257275088548364400416034343698170171386906868386, - 36243285364022854, - 53992950710904513, - 21888242871839275222246405745257275088548364400416034343698201064834479204705, - 64829061989758208, - 47260587151841759, - 21888242871839275222246405745257275088548364400416034343698180535635586965823, - 65894748776498045, - 21888242871839275222246405745257275088548364400416034343698134292499409034761, - 63335895297125621, - 21888242871839275222246405745257275088548364400416034343698178270291949218442, - 21888242871839275222246405745257275088548364400416034343698201139219654712772, - 21888242871839275222246405745257275088548364400416034343698199643993702801630, - 21888242871839275222246405745257275088548364400416034343698165969799284572955, - 21888242871839275222246405745257275088548364400416034343698198793167042113654, - 21888242871839275222246405745257275088548364400416034343698200777264524128214, - 21888242871839275222246405745257275088548364400416034343698204022775788730185, - 21888242871839275222246405745257275088548364400416034343698198925192995877002, - 21888242871839275222246405745257275088548364400416034343698147990184038703816, - 21888242871839275222246405745257275088548364400416034343698189651947602868792, - 7847687203880416, - 21888242871839275222246405745257275088548364400416034343698194501359727937352, - 59535460989760935, - 67145019267177850, - 26948785249947683, - 21888242871839275222246405745257275088548364400416034343698135266037476062115, - 21888242871839275222246405745257275088548364400416034343698171364320472616120, - 21888242871839275222246405745257275088548364400416034343698172414803678304398, - 69996045468952701, - 19525589251598237, - 58526420569200528, - 21888242871839275222246405745257275088548364400416034343698199101926383507638, - 21888242871839275222246405745257275088548364400416034343698182478094603668445, - 42865027593126174, - 21888242871839275222246405745257275088548364400416034343698200600531142489667, - 21888242871839275222246405745257275088548364400416034343698156422153000090956, - 1861029228155987, - 21888242871839275222246405745257275088548364400416034343698179535047259120359, - 21888242871839275222246405745257275088548364400416034343698139883697257566857, - 15549255056833897, - 21888242871839275222246405745257275088548364400416034343698165135612575705954, - 47952222398584860, - 6844407263065089, - 51700617012931472, - 21888242871839275222246405745257275088548364400416034343698159698305098104593, - 54538054948231252, - 21888242871839275222246405745257275088548364400416034343698132144284044998028, - 6983403479984219, - 43595416382622462, - 43617647494403636, - 21888242871839275222246405745257275088548364400416034343698142526642262436369, - 35552787058930759, - 21888242871839275222246405745257275088548364400416034343698191640586831803843, - 21888242871839275222246405745257275088548364400416034343698138660620954931439, - 41277103821436183, - 54224985569501091, - 61963412615175490, - 21888242871839275222246405745257275088548364400416034343698190230854787173330, - 57935070413387176, - 21888242871839275222246405745257275088548364400416034343698143156784035951797, - 42137044561378184, - 5098109286076222, - 21888242871839275222246405745257275088548364400416034343698175848546603496477, - 21888242871839275222246405745257275088548364400416034343698156159322356395690, - 58208675779247933, - 21888242871839275222246405745257275088548364400416034343698161666899983327823, - 29253190952115541, - 21888242871839275222246405745257275088548364400416034343698149781825265273758, - 9954458007715613, - 21888242871839275222246405745257275088548364400416034343698190568888701565811, - 9091315270177305, - 24248103536090056, - 33026240993019061, - 28877498277970718, - 21888242871839275222246405745257275088548364400416034343698152263307986845068, - 53359909819881064, - 21888242871839275222246405745257275088548364400416034343698136151637037257067, - 52997233002675350, - 15278380201802805, - 17397956151458726, - 21888242871839275222246405745257275088548364400416034343698196750816439043958, - 32041351179845085, - 21888242871839275222246405745257275088548364400416034343698182537928326171151, - 21888242871839275222246405745257275088548364400416034343698147819492378706544, - 21888242871839275222246405745257275088548364400416034343698150767630905136283, - 34516714454623320, - 21888242871839275222246405745257275088548364400416034343698154318214380859741, - 60397195512144973, - 12032190132433361, - 21888242871839275222246405745257275088548364400416034343698153487349731136182, - 69210660518191290, - 21888242871839275222246405745257275088548364400416034343698164338855910197959, - 21888242871839275222246405745257275088548364400416034343698153275572627398866, - 9707957734259673, - 69773508036157108, - 21888242871839275222246405745257275088548364400416034343698162023660971751258, - 21888242871839275222246405745257275088548364400416034343698140428364574940964, - 21888242871839275222246405745257275088548364400416034343698156484407764845040, - 3105648422513461, - 21888242871839275222246405745257275088548364400416034343698161234030714214153, - 21888242871839275222246405745257275088548364400416034343698167260729893331145, - 21888242871839275222246405745257275088548364400416034343698169540140308170849, - 33914799777909444, - 4067066471849786, - 12672708853587710, - 21888242871839275222246405745257275088548364400416034343698163357585943303871, - 10824507661201417, - 20074793010257093, - 21888242871839275222246405745257275088548364400416034343698135516784460578023, - 21888242871839275222246405745257275088548364400416034343698149570236533864467, - 40524676741404062, - 21888242871839275222246405745257275088548364400416034343698175758370615159576, - 1162612728785063, - 11407234343119242, - 34351314441574238, - 21888242871839275222246405745257275088548364400416034343698188740152666968807, - 61354301174289910, - 21888242871839275222246405745257275088548364400416034343698150997339897564369, - 21888242871839275222246405745257275088548364400416034343698150144766874285493, - 21888242871839275222246405745257275088548364400416034343698168287138242930401, - 21888242871839275222246405745257275088548364400416034343698155315386234257578, - 21888242871839275222246405745257275088548364400416034343698181656227420094527, - 21888242871839275222246405745257275088548364400416034343698136413100734709631, - 21888242871839275222246405745257275088548364400416034343698145638288430455196, - 21888242871839275222246405745257275088548364400416034343698140203416479169555, - 20462673444814387, - 21888242871839275222246405745257275088548364400416034343698161961695151541985, - 21888242871839275222246405745257275088548364400416034343698171305418128872478, - 19375337481506114, - 21888242871839275222246405745257275088548364400416034343698174798343713475564, - 21888242871839275222246405745257275088548364400416034343698193102350126098755, - 40678947570622431, - 50636763752524330, - 21888242871839275222246405745257275088548364400416034343698172670491383271778, - 35566938644237325, - 55979999607641763, - 21888242871839275222246405745257275088548364400416034343698167629942208289673, - 56413150331900305, - 33562209204150340, - 21888242871839275222246405745257275088548364400416034343698200074660576048363, - 21888242871839275222246405745257275088548364400416034343698197345813682913660, - 21888242871839275222246405745257275088548364400416034343698167006302625790211, - 21888242871839275222246405745257275088548364400416034343698172875854543199211, - 32020809997412674, - 51915596634209449, - 21888242871839275222246405745257275088548364400416034343698135345248663949837, - 21888242871839275222246405745257275088548364400416034343698159155842709489092, - 21888242871839275222246405745257275088548364400416034343698136681151155858028, - 21888242871839275222246405745257275088548364400416034343698162930123213775315, - 21888242871839275222246405745257275088548364400416034343698132944353595264804, - 8331524982610479, - 5159910860017428, - 21888242871839275222246405745257275088548364400416034343698193463195876084585, - 21888242871839275222246405745257275088548364400416034343698155285219994503115, - 36142972475879050, - 21888242871839275222246405745257275088548364400416034343698196596718722781504, - 33628682713226996, - 21888242871839275222246405745257275088548364400416034343698161038623343133972, - 21888242871839275222246405745257275088548364400416034343698132293745796837180, - 21888242871839275222246405745257275088548364400416034343698181716943805842829, - 21888242871839275222246405745257275088548364400416034343698141962666948549585, - 21888242871839275222246405745257275088548364400416034343698161491423332365372, - 21888242871839275222246405745257275088548364400416034343698133272815377127086, - 21888242871839275222246405745257275088548364400416034343698135078098454699327, - 17772204796136343, - 18006673545397879, - 21888242871839275222246405745257275088548364400416034343698154468199040027172, - 21888242871839275222246405745257275088548364400416034343698166455441215425821, - 33839091828815983, - 43115959186601940, - 21888242871839275222246405745257275088548364400416034343698136708710595182359, - 53364780026173554, - 21888242871839275222246405745257275088548364400416034343698164455855096894432, - 21888242871839275222246405745257275088548364400416034343698177543909757720071, - 21888242871839275222246405745257275088548364400416034343698184378690542262743, - 34075162558018587, - 21888242871839275222246405745257275088548364400416034343698170812069767395930, - 21888242871839275222246405745257275088548364400416034343698198002184664468632, - 43526144096309276, - 59838606163149233, - 21888242871839275222246405745257275088548364400416034343698140993885043542841, - 21888242871839275222246405745257275088548364400416034343698139915279018897699, - 21888242871839275222246405745257275088548364400416034343698134214442943027170, - 10558642228893519, - 22362864999299892, - 45264081245732275, - 30123426304150360, - 21888242871839275222246405745257275088548364400416034343698142220344343112018, - 21888242871839275222246405745257275088548364400416034343698148952091282811095, - 38499215791274445, - 21888242871839275222246405745257275088548364400416034343698152561335675024001, - 21888242871839275222246405745257275088548364400416034343698164600573566004140, - 29111593697086852, - 21888242871839275222246405745257275088548364400416034343698185096317987274383, - 48337496163926475, - 21888242871839275222246405745257275088548364400416034343698198799875186573780, - 34486836499124622, - 31453328607858762, - 21888242871839275222246405745257275088548364400416034343698155750679249084069, - 23830476385409047, - 33244471665036047, - 69837153421526738, - 4895369757235806, - 21888242871839275222246405745257275088548364400416034343698160234800423514517, - 27246147006277844, - 21888242871839275222246405745257275088548364400416034343698178458624101155009, - 21888242871839275222246405745257275088548364400416034343698163606963948212178, - 21888242871839275222246405745257275088548364400416034343698194262054459484386, - 56802860286783161, - 6183479161659552, - 24617032140800016, - 21888242871839275222246405745257275088548364400416034343698134035587141380537, - 26145843239698923, - 21888242871839275222246405745257275088548364400416034343698160030449705792692, - 16249989794039228, - 21888242871839275222246405745257275088548364400416034343698189830063834383305, - 21888242871839275222246405745257275088548364400416034343698181870976065958477, - 53919596899473173, - 22780381091579440, - 28128850742475758, - 46751138823690952, - 21888242871839275222246405745257275088548364400416034343698182614436848201474, - 37238660526035587, - 21888242871839275222246405745257275088548364400416034343698185031607503856636, - 21888242871839275222246405745257275088548364400416034343698191190933481666129, - 21888242871839275222246405745257275088548364400416034343698182829440697339376, - 4482946049626619, - 21888242871839275222246405745257275088548364400416034343698182424249408347135, - 30815108717791518, - 21888242871839275222246405745257275088548364400416034343698150497422922153854, - 21888242871839275222246405745257275088548364400416034343698194708204683299112, - 12851215226338386, - 14104915635931847, - 21888242871839275222246405745257275088548364400416034343698200894881794822789, - 21888242871839275222246405745257275088548364400416034343698183827127705205835, - 21888242871839275222246405745257275088548364400416034343698182587737489008585, - 34249372593089867, - 32783017282460824, - 21888242871839275222246405745257275088548364400416034343698175068447524970660, - 56218396596289057, - 21888242871839275222246405745257275088548364400416034343698148841764355460917, - 66264912311214091, - 21888242871839275222246405745257275088548364400416034343698184625712834963363, - 21888242871839275222246405745257275088548364400416034343698148553226930518071, - 32291199093094781, - 21888242871839275222246405745257275088548364400416034343698185847890003397638, - 21888242871839275222246405745257275088548364400416034343698200692470710928809, - 21888242871839275222246405745257275088548364400416034343698191939290079274770, - 46899419932605063, - 21888242871839275222246405745257275088548364400416034343698167570698230622376, - 21888242871839275222246405745257275088548364400416034343698156599137939001116, - 21888242871839275222246405745257275088548364400416034343698158314176298830897, - 1712999802312233, - 34833625157770476, - 158092037610336, - 21888242871839275222246405745257275088548364400416034343698181614470334400314, - 65724345303127381, - 20889771220119769, - 10002080568326628, - 39023453142608208, - 57792368656568766, - 21888242871839275222246405745257275088548364400416034343698134415002210101450, - 21888242871839275222246405745257275088548364400416034343698159560822343524814, - 21888242871839275222246405745257275088548364400416034343698189576043552268357, - 21888242871839275222246405745257275088548364400416034343698140421761296600562, - 21888242871839275222246405745257275088548364400416034343698151177131715356704, - 68029166277157431, - 32209757048955903, - 21888242871839275222246405745257275088548364400416034343698172053021550229502, - 21888242871839275222246405745257275088548364400416034343698136435255081497528, - 31602191995276320, - 42498796515783604, - 25571475207180902, - 71756253644973415, - 21888242871839275222246405745257275088548364400416034343698197472823169150938, - 31303975544435820, - 21888242871839275222246405745257275088548364400416034343698201468906877410369, - 33664349571410978, - 21888242871839275222246405745257275088548364400416034343698197162614129850250, - 48632245026611762, - 39306894909892084, - 21888242871839275222246405745257275088548364400416034343698176296489960577612, - 24239842123915688, - 42404172484872985, - 39360576707543707, - 37500942230822655, - 21888242871839275222246405745257275088548364400416034343698148462123597661178, - 21888242871839275222246405745257275088548364400416034343698177239493498180095, - 21888242871839275222246405745257275088548364400416034343698150567819414981847, - 29118653139445079, - 3074422288709387, - 28664406029732340, - 21888242871839275222246405745257275088548364400416034343698133431724868600036, - 21888242871839275222246405745257275088548364400416034343698184899843015695187, - 21888242871839275222246405745257275088548364400416034343698159637051738991649, - 21888242871839275222246405745257275088548364400416034343698197204917504358244, - 21888242871839275222246405745257275088548364400416034343698181827966233405679, - 64740500998852531, - 28615118481276738, - 13956374570951284, - 50009387020382217, - 3667358853944822, - 21888242871839275222246405745257275088548364400416034343698178316488695048808, - 37779486176600679, - 21888242871839275222246405745257275088548364400416034343698202949232676495735, - 20298103380322235, - 29097791022230213, - 67659164171731790, - 1178437803938457, - 21888242871839275222246405745257275088548364400416034343698134443698724115194, - 21888242871839275222246405745257275088548364400416034343698199586319947065044, - 4044016278708760, - 40366311129513605, - 21888242871839275222246405745257275088548364400416034343698162289285434469007, - 21888242871839275222246405745257275088548364400416034343698181899256377680641, - 42899920060805558, - 21888242871839275222246405745257275088548364400416034343698160624698488660495, - 21888242871839275222246405745257275088548364400416034343698178470292762675502, - 21888242871839275222246405745257275088548364400416034343698161604327210378044, - 59374351989748367, - 21888242871839275222246405745257275088548364400416034343698135149893457582870, - 21888242871839275222246405745257275088548364400416034343698148437899671838568, - 21888242871839275222246405745257275088548364400416034343698159170973755969086, - 31692103868491673, - 21888242871839275222246405745257275088548364400416034343698153997423896226198, - 48587214281211196, - 21888242871839275222246405745257275088548364400416034343698170554062654404094, - 21888242871839275222246405745257275088548364400416034343698169125206900030547, - 21888242871839275222246405745257275088548364400416034343698173651169724024759, - 21888242871839275222246405745257275088548364400416034343698160219632367455899, - 21888242871839275222246405745257275088548364400416034343698172928611326872168, - 21888242871839275222246405745257275088548364400416034343698194892569551235888, - 21888242871839275222246405745257275088548364400416034343698160155877371096279, - 1797512898011482, - 21888242871839275222246405745257275088548364400416034343698151169174082709409, - 23210319956038727, - 21888242871839275222246405745257275088548364400416034343698176131719650689546, - 21888242871839275222246405745257275088548364400416034343698146178526750368945, - 21888242871839275222246405745257275088548364400416034343698146608610317884115, - 6224884494362651, - 21888242871839275222246405745257275088548364400416034343698169194927200225113, - 21888242871839275222246405745257275088548364400416034343698180511880796056789, - 16112772133231778, - 57721949722734159, - 28113293007625743, - 40165724285372319, - 21888242871839275222246405745257275088548364400416034343698191161294231682040, - 21888242871839275222246405745257275088548364400416034343698169738773472091900, - 21888242871839275222246405745257275088548364400416034343698189575737447799817, - 21888242871839275222246405745257275088548364400416034343698181560722233921478, - 18749547094342225, - 29103893283872284, - 60534011403716940, - 1534613040624135, - 15566800025345287, - 70873340817022610, - 21888242871839275222246405745257275088548364400416034343698139595125533644052, - 21888242871839275222246405745257275088548364400416034343698193356068134054391, - 21888242871839275222246405745257275088548364400416034343698163437303596317466, - 71906043907415321, - 21888242871839275222246405745257275088548364400416034343698196470685818802411, - 7026980819953125, - 62932750974794009, - 56448469439279556, - 53969793328318637, - 21888242871839275222246405745257275088548364400416034343698158134178188741821, - 25490356712317206, - 28165493810821028, - 34373347980654706, - 24233178643548355, - 51395361097542099, - 21888242871839275222246405745257275088548364400416034343698170095897262628851, - 53956311531768402, - 21888242871839275222246405745257275088548364400416034343698194738621733025444, - 30689039262802413, - 21888242871839275222246405745257275088548364400416034343698166660750072979021, - 23038340688860531, - 42543907059552632, - 36608426296072906, - 21888242871839275222246405745257275088548364400416034343698177683625186443521, - 66816755968681168, - 21888242871839275222246405745257275088548364400416034343698183008742693886538, - 20951134155188623, - 18703673868998619, - 34765349012014520, - 33640816468355183, - 21888242871839275222246405745257275088548364400416034343698200548346157421508, - 21888242871839275222246405745257275088548364400416034343698201645731614351462, - 21888242871839275222246405745257275088548364400416034343698162552345450706442, - 21888242871839275222246405745257275088548364400416034343698146856173961450120, - 2279823088076562, - 69704030988707313, - 21888242871839275222246405745257275088548364400416034343698146221734328541396, - 21888242871839275222246405745257275088548364400416034343698199709066159253820, - 1580596862105842, - 21888242871839275222246405745257275088548364400416034343698147867864109420183, - 59074788648042854, - 21888242871839275222246405745257275088548364400416034343698140497833724346764, - 21888242871839275222246405745257275088548364400416034343698177080219055008205, - 21888242871839275222246405745257275088548364400416034343698139935830505980909, - 21888242871839275222246405745257275088548364400416034343698180456104807917049, - 59986809607883127, - 65561275027719475, - 41246405961151312, - 51197596436664618, - 21888242871839275222246405745257275088548364400416034343698161207689647544304, - 18200119399383319, - 21888242871839275222246405745257275088548364400416034343698181022394538147994, - 21888242871839275222246405745257275088548364400416034343698157713630019554710, - 8205285408702073, - 13938346511589888, - 6731499070760162, - 26926228731418651, - 40497030253339159, - 21888242871839275222246405745257275088548364400416034343698178611641975024274, - 30685489200614296, - 21888242871839275222246405745257275088548364400416034343698136638433311322632, - 21888242871839275222246405745257275088548364400416034343698159278059730051777, - 71245770208662838, - 64671377948855033, - 21888242871839275222246405745257275088548364400416034343698167229752685058123, - 21888242871839275222246405745257275088548364400416034343698203294207637047907, - 21888242871839275222246405745257275088548364400416034343698141394783695022929, - 21888242871839275222246405745257275088548364400416034343698178241654959198888, - 40048500200421865, - 62179644505894250, - 18407279500784332, - 21888242871839275222246405745257275088548364400416034343698190379712896198050, - 21888242871839275222246405745257275088548364400416034343698189404505896661570, - 57359253014948790, - 59235948117263963, - 21888242871839275222246405745257275088548364400416034343698200023698148762204, - 61140204003968737, - 71229068281358935, - 21888242871839275222246405745257275088548364400416034343698169668933404978385, - 40802346650208825, - 21888242871839275222246405745257275088548364400416034343698184322530660577914, - 21888242871839275222246405745257275088548364400416034343698190415303369675209, - 21888242871839275222246405745257275088548364400416034343698142675934448391084, - 21888242871839275222246405745257275088548364400416034343698143535737074099200, - 21888242871839275222246405745257275088548364400416034343698139857138377737190, - 21888242871839275222246405745257275088548364400416034343698193020298614349686, - 21888242871839275222246405745257275088548364400416034343698165506164019884616, - 61805524659260143, - 50865307170891882, - 21888242871839275222246405745257275088548364400416034343698182095406241786549, - 17074991707535313, - 21888242871839275222246405745257275088548364400416034343698160905018373489415, - 21888242871839275222246405745257275088548364400416034343698166584223760526151, - 24922492033497694, - 21888242871839275222246405745257275088548364400416034343698195868293466608800, - 21888242871839275222246405745257275088548364400416034343698155268320802635866, - 65464236432542043, - 38961187450891570, - 21888242871839275222246405745257275088548364400416034343698179683642121850238, - 21888242871839275222246405745257275088548364400416034343698157489854152531564, - 21888242871839275222246405745257275088548364400416034343698186045690130791706, - 8114145627895374, - 39385107248097821, - 67474826441067434, - 21888242871839275222246405745257275088548364400416034343698178689210485658852, - 28173198169731747, - 21888242871839275222246405745257275088548364400416034343698149366746892272822, - 21888242871839275222246405745257275088548364400416034343698150071431482697823, - 21888242871839275222246405745257275088548364400416034343698182769645506082933, - 21888242871839275222246405745257275088548364400416034343698169328523259202740, - 25927649112047043, - 9958625749665675, - 33391935497570338, - 21888242871839275222246405745257275088548364400416034343698175583694001289288, - 21888242871839275222246405745257275088548364400416034343698195188773180360629, - 8148015001671971, - 9283715903320702, - 7633450010226824, - 21888242871839275222246405745257275088548364400416034343698165709242358474160, - 26874355903729681, - 51430744835611710, - 40087593104975829, - 21888242871839275222246405745257275088548364400416034343698203064327100353026, - 33457463677789540, - 15822328450536987, - 21888242871839275222246405745257275088548364400416034343698201861369313174284, - 21888242871839275222246405745257275088548364400416034343698189507358058834158, - 21888242871839275222246405745257275088548364400416034343698146822410282761854, - 58415370438625321, - 39338837893996456, - 21888242871839275222246405745257275088548364400416034343698181659845425376772, - 36451297259982151, - 21888242871839275222246405745257275088548364400416034343698141245096323938942, - 21888242871839275222246405745257275088548364400416034343698198558282123987949, - 27701389573053815, - 21888242871839275222246405745257275088548364400416034343698133632945463844341, - 36188850467421716, - 976680434874591, - 21888242871839275222246405745257275088548364400416034343698172093613576120628, - 21888242871839275222246405745257275088548364400416034343698156953250790340983, - 17658371524858870, - 21888242871839275222246405745257275088548364400416034343698186692089160868246, - 53252537195868797, - 21888242871839275222246405745257275088548364400416034343698146880181029677686, - 21888242871839275222246405745257275088548364400416034343698168668683039001398, - 771180088935628, - 69561522658653933, - 16294884747268670, - 21888242871839275222246405745257275088548364400416034343698172049978914842181, - 21888242871839275222246405745257275088548364400416034343698176207342776292001, - 51158299761721034, - 43527353944255329, - 21888242871839275222246405745257275088548364400416034343698191975266981769374, - 21888242871839275222246405745257275088548364400416034343698172619358314496341, - 67923016313235215, - 21888242871839275222246405745257275088548364400416034343698195646706269845517, - 21888242871839275222246405745257275088548364400416034343698201768562241824565, - 21888242871839275222246405745257275088548364400416034343698168170530523843495, - 21888242871839275222246405745257275088548364400416034343698143514181384233326, - 34216062098148915, - 67441446781052094, - 70536226611844553, - 21888242871839275222246405745257275088548364400416034343698145678952640914604, - 47170414775508831, - 21020937124132706, - 61582913412500568, - 21888242871839275222246405745257275088548364400416034343698193431275253384187, - 29779759400536093, - 21888242871839275222246405745257275088548364400416034343698139517007856582195, - 53723807313504396, - 68460263027802106, - 21888242871839275222246405745257275088548364400416034343698194213894257636743, - 21888242871839275222246405745257275088548364400416034343698136030127112984493, - 28546244816802295, - 21888242871839275222246405745257275088548364400416034343698143762755362285494, - 44347415819582468, - 53482804917705712, - 35534707340626292, - 36088019060475572, - 21888242871839275222246405745257275088548364400416034343698137663501815773094, - 21888242871839275222246405745257275088548364400416034343698133154142118543646, - 57345525973997166, - 66100920596188929, - 21888242871839275222246405745257275088548364400416034343698163519471710144302, - 21888242871839275222246405745257275088548364400416034343698145589387013148046, - 59551323171403953, - 71503763492550355, - 21888242871839275222246405745257275088548364400416034343698180183584047271297, - 13274604757730083, - 18511151418151835, - 21888242871839275222246405745257275088548364400416034343698196199250106030970, - 33586470672396635, - 21888242871839275222246405745257275088548364400416034343698181646161692494297, - 21888242871839275222246405745257275088548364400416034343698164681404959621020, - 24626969911382001, - 30685127914445026, - 21888242871839275222246405745257275088548364400416034343698150939976859095315, - 21888242871839275222246405745257275088548364400416034343698191622206928046603, - 21888242871839275222246405745257275088548364400416034343698142919069757081418, - 21888242871839275222246405745257275088548364400416034343698203253307864403137, - 21888242871839275222246405745257275088548364400416034343698145607346050489771, - 198842503647781, - 21888242871839275222246405745257275088548364400416034343698164161248132575224, - 21888242871839275222246405745257275088548364400416034343698151954378517006589, - 21888242871839275222246405745257275088548364400416034343698185563260656171142, - 21888242871839275222246405745257275088548364400416034343698132839437509925087, - 1104551742980220, - 30603407918940945, - 45421394526987550, - 7412893079372664, - 31617553452515286, - 21888242871839275222246405745257275088548364400416034343698156758008369506743, - 53220725807043758, - 17398971187611642, - 27912822660626582, - 57440907774999756, - 21888242871839275222246405745257275088548364400416034343698147116135729277259, - 7392406949103845, - 21888242871839275222246405745257275088548364400416034343698145955227422949477, - 21888242871839275222246405745257275088548364400416034343698193314613557643313, - 39553971552846040, - 52873586916638020, - 21888242871839275222246405745257275088548364400416034343698199698194956003415, - 21888242871839275222246405745257275088548364400416034343698147976682756323250, - 22328846941566022, - 17928600596384425, - 46768627562498357, - 64453261758295633, - 28216829329646928, - 21888242871839275222246405745257275088548364400416034343698167880359638917910, - 36775740608863585, - 21888242871839275222246405745257275088548364400416034343698196612073633340236, - 38867465439609447, - 44042555217832562, - 21888242871839275222246405745257275088548364400416034343698164474123613909496, - 54910397273572906, - 61353254102345316, - 65223085639132396, - 21888242871839275222246405745257275088548364400416034343698144322161261900548, - 21888242871839275222246405745257275088548364400416034343698184517385113426540, - 21888242871839275222246405745257275088548364400416034343698187271742798268831, - 27481952514306817, - 21888242871839275222246405745257275088548364400416034343698143148029596127895, - 5536142427794395, - 56525512906385995, - 21888242871839275222246405745257275088548364400416034343698187025764157576103, - 21888242871839275222246405745257275088548364400416034343698201759718873299916, - 21888242871839275222246405745257275088548364400416034343698192641681053463306, - 21888242871839275222246405745257275088548364400416034343698147736826630750618, - 28775444164040849, - 52850566622583608, - 41713724402807469, - 21888242871839275222246405745257275088548364400416034343698158414766637966679, - 21888242871839275222246405745257275088548364400416034343698199679620899512834, - 24280646282352479, - 53615071797040116, - 21888242871839275222246405745257275088548364400416034343698154241592024688351, - 33176179976155471, - 21888242871839275222246405745257275088548364400416034343698179782270541207837, - 36308385704392737, - 21888242871839275222246405745257275088548364400416034343698155174424726825723, - 21888242871839275222246405745257275088548364400416034343698178877814914881736, - 47348537815093721, - 24323928649562408, - 21888242871839275222246405745257275088548364400416034343698179232491596994174, - 21888242871839275222246405745257275088548364400416034343698170015455376561884, - 21888242871839275222246405745257275088548364400416034343698140189692016376057, - 9662119729364107, - 37966941970109833, - 22859295167348131, - 21872721851564115, - 31920988195479952, - 21888242871839275222246405745257275088548364400416034343698188535945084858196, - 21888242871839275222246405745257275088548364400416034343698181603577250906190, - 35335569522919678, - 69052935445494700, - 43156653407876287, - 9331146596195295, - 21888242871839275222246405745257275088548364400416034343698195465224966356009, - 21888242871839275222246405745257275088548364400416034343698151836829838283867, - 21888242871839275222246405745257275088548364400416034343698146062152218565423, - 21888242871839275222246405745257275088548364400416034343698158305287791969645, - 21888242871839275222246405745257275088548364400416034343698200807133276883445, - 70751986175475020, - 21888242871839275222246405745257275088548364400416034343698175574231072740765, - 21888242871839275222246405745257275088548364400416034343698199706718854890507, - 63488481965173842, - 5924043536381913, - 21888242871839275222246405745257275088548364400416034343698159882573476989567, - 21888242871839275222246405745257275088548364400416034343698184146682710921778, - 56173722112614855, - 21888242871839275222246405745257275088548364400416034343698192413323224122877, - 21888242871839275222246405745257275088548364400416034343698164150594597042832, - 21888242871839275222246405745257275088548364400416034343698192984773950033823, - 48853611894018665, - 46303483398652774, - 21888242871839275222246405745257275088548364400416034343698196782543520356488, - 21888242871839275222246405745257275088548364400416034343698166379772564286961, - 19860419014482933, - 21888242871839275222246405745257275088548364400416034343698157132754425647361, - 33849246424584205, - 21888242871839275222246405745257275088548364400416034343698134388559897628189, - 21888242871839275222246405745257275088548364400416034343698136185947164773174, - 48697829163301780, - 21888242871839275222246405745257275088548364400416034343698178926190889375604, - 24863830324180462, - 21888242871839275222246405745257275088548364400416034343698163559126501156861, - 49728986707810754, - 62930251770355393, - 21888242871839275222246405745257275088548364400416034343698139441342077955962, - 21888242871839275222246405745257275088548364400416034343698135891740194287705, - 21888242871839275222246405745257275088548364400416034343698192594127414171832, - 21888242871839275222246405745257275088548364400416034343698165739290657167657, - 21888242871839275222246405745257275088548364400416034343698186027123106103590, - 21888242871839275222246405745257275088548364400416034343698157874918369824407, - 21888242871839275222246405745257275088548364400416034343698199625344290112526, - 21888242871839275222246405745257275088548364400416034343698147293753701873338, - 21888242871839275222246405745257275088548364400416034343698132635686410095693, - 21888242871839275222246405745257275088548364400416034343698149611568779709077, - 21851735329510789, - 21888242871839275222246405745257275088548364400416034343698170416239789090739, - 1474562165747537, - 44169252545133344, - 1601414060388673, - 21888242871839275222246405745257275088548364400416034343698154748058392916417, - 21888242871839275222246405745257275088548364400416034343698183886146302047548, - 21888242871839275222246405745257275088548364400416034343698148591284322323700, - 52575228077724654, - 21888242871839275222246405745257275088548364400416034343698173112818610913376, - 21888242871839275222246405745257275088548364400416034343698141229836481918108, - 21888242871839275222246405745257275088548364400416034343698171171173112931449, - 21888242871839275222246405745257275088548364400416034343698170103392737971936, - 15376799028757238, - 35684222305564513, - 49801450564640904, - 25920236827621208, - 21888242871839275222246405745257275088548364400416034343698197930167026675353, - 45272371741101034, - 8140922026867209, - 21888242871839275222246405745257275088548364400416034343698135946550275306324, - 17926886497310297, - 21888242871839275222246405745257275088548364400416034343698133136128853685078, - 21888242871839275222246405745257275088548364400416034343698193283880241792153, - 19008285694612348, - 21888242871839275222246405745257275088548364400416034343698169887644027272872, - 21888242871839275222246405745257275088548364400416034343698137277787918942236, - 71723655925673182, - 21888242871839275222246405745257275088548364400416034343698173454710602627891, - 65507674876904109, - 62448470123312576, - 68328754446492270, - 21888242871839275222246405745257275088548364400416034343698156663395315453603, - 55574305779249304, - 38880720625906092, - 24822157103123086, - 21888242871839275222246405745257275088548364400416034343698139276531942792377, - 48888346570183806, - 6065944210917941, - 26259587317104666, - 21888242871839275222246405745257275088548364400416034343698139408159964793245, - 21888242871839275222246405745257275088548364400416034343698140090592599665581, - 64548617980937993, - 21888242871839275222246405745257275088548364400416034343698161713425166827682, - 2227668070573435, - 9281813471242570, - 71005132815226030, - 21888242871839275222246405745257275088548364400416034343698200891519873046316, - 21888242871839275222246405745257275088548364400416034343698173895727285197133, - 21888242871839275222246405745257275088548364400416034343698189854493349743203, - 21888242871839275222246405745257275088548364400416034343698133478362126293740, - 21888242871839275222246405745257275088548364400416034343698143698056874962202, - 21070836178611706, - 48338992768619166, - 42342702443110471, - 58178564791686902, - 21888242871839275222246405745257275088548364400416034343698192665938668853497, - 21888242871839275222246405745257275088548364400416034343698188283404510652167, - 32769445395391834, - 21888242871839275222246405745257275088548364400416034343698143451595205582675, - 21888242871839275222246405745257275088548364400416034343698173332230658109083, - 21888242871839275222246405745257275088548364400416034343698193997248919708124, - 63099727090952140, - 24599854154634740, - 33454499355045268, - 21888242871839275222246405745257275088548364400416034343698139046217908252913, - 8382065850530897, - 65260089140309988, - 21888242871839275222246405745257275088548364400416034343698175045129706179149, - 21888242871839275222246405745257275088548364400416034343698183957086398294240, - 10386903769630139, - 45222675359467289, - 5330219402045741, - 19286789917587331, - 51244920611883872, - 37202175451652076, - 21888242871839275222246405745257275088548364400416034343698188540696567771714, - 25219645511871896, - 21888242871839275222246405745257275088548364400416034343698177300742165600550, - 21888242871839275222246405745257275088548364400416034343698139700198403014908, - 21888242871839275222246405745257275088548364400416034343698168241990925958728, - 21888242871839275222246405745257275088548364400416034343698139392219097707441, - 21888242871839275222246405745257275088548364400416034343698190624528124623441, - 21888242871839275222246405745257275088548364400416034343698180366249786051852, - 17422263244395824, - 7229638533122673, - 57769149617115225, - 69266757221590977, - 21888242871839275222246405745257275088548364400416034343698198798139531929347, - 56905703885934011, - 29152414969394240, - 31800479489264499, - 60033627168652671, - 59586343449845842, - 21888242871839275222246405745257275088548364400416034343698173102847055645990, - 37797616461923217, - 21888242871839275222246405745257275088548364400416034343698171356967867006818, - 43222698336520159, - 33059507126907964, - 3407603130035766, - 21888242871839275222246405745257275088548364400416034343698194136436082369764, - 35887198636476578, - 44791472362253489, - 21888242871839275222246405745257275088548364400416034343698165202882905798115, - 31506206513009610, - 23761474286890141, - 51020930004530346, - 44558499278563248, - 21888242871839275222246405745257275088548364400416034343698158373574635149218, - 66020915724696251, - 30075411619158523, - 21888242871839275222246405745257275088548364400416034343698143020883174537275, - 50635850020837799, - 55574407558264574, - 21888242871839275222246405745257275088548364400416034343698194564861656070095, - 35065114011769541, - 21888242871839275222246405745257275088548364400416034343698186018244334934787, - 21888242871839275222246405745257275088548364400416034343698142809920089190263, - 21888242871839275222246405745257275088548364400416034343698169194918644196022, - 21888242871839275222246405745257275088548364400416034343698172313169794702300, - 14157195307412354, - 33573062982539425, - 50789189408803519, - 71136189447689407, - 67187729007813978, - 6259516313114088, - 21888242871839275222246405745257275088548364400416034343698181403671754794275, - 21888242871839275222246405745257275088548364400416034343698187603696242350389, - 56607465492902575, - 4156802176740910, - 21888242871839275222246405745257275088548364400416034343698145843533059868212, - 21888242871839275222246405745257275088548364400416034343698153230502932981033, - 21888242871839275222246405745257275088548364400416034343698183658096635360292, - 21888242871839275222246405745257275088548364400416034343698190355330216872729, - 68602951347152626, - 21888242871839275222246405745257275088548364400416034343698203237107821273521, - 53304082271302485, - 21888242871839275222246405745257275088548364400416034343698132529987501254509, - 21888242871839275222246405745257275088548364400416034343698179143260309417909, - 21888242871839275222246405745257275088548364400416034343698153592497138796198, - 37000806267034693, - 21888242871839275222246405745257275088548364400416034343698174747428279709028, - 15785667666706156, - 284094431651357, - 21888242871839275222246405745257275088548364400416034343698146276288231363025, - 53936874966076757, - 21888242871839275222246405745257275088548364400416034343698133664284680625422, - 21888242871839275222246405745257275088548364400416034343698195581019037209747, - 35678427755494643, - 21888242871839275222246405745257275088548364400416034343698192882398174391510, - 21888242871839275222246405745257275088548364400416034343698191895366484918892, - 21888242871839275222246405745257275088548364400416034343698172057047620666897, - 21888242871839275222246405745257275088548364400416034343698147335987096856261, - 14346903321458783, - 21888242871839275222246405745257275088548364400416034343698201445404372823413, - 21888242871839275222246405745257275088548364400416034343698177157385631432238, - 20643196553912030, - 21888242871839275222246405745257275088548364400416034343698170485121031620919, - 69936433308071538, - 46858568536744312, - 21888242871839275222246405745257275088548364400416034343698134225909530629535, - 34893077785462643, - 21888242871839275222246405745257275088548364400416034343698154559302990522572, - 21888242871839275222246405745257275088548364400416034343698186486948296304236, - 21888242871839275222246405745257275088548364400416034343698163571937968398011, - 21888242871839275222246405745257275088548364400416034343698149409579356959677, - 21888242871839275222246405745257275088548364400416034343698159815474331491470, - 21888242871839275222246405745257275088548364400416034343698177497123903761363, - 14889289248036322, - 40740415949429248, - 8788213120142218, - 65191401985955205, - 47974620833280811, - 15261498131544184, - 21888242871839275222246405745257275088548364400416034343698149706661424306859, - 21888242871839275222246405745257275088548364400416034343698177759601508453249, - 55417697441324324, - 21888242871839275222246405745257275088548364400416034343698187284965206989564, - 59384291791137060, - 30027710095197794, - 21888242871839275222246405745257275088548364400416034343698167380218512555694, - 13668416953712488, - 38865984113334146, - 21888242871839275222246405745257275088548364400416034343698154101134880199388, - 21888242871839275222246405745257275088548364400416034343698163721627235749339, - 21888242871839275222246405745257275088548364400416034343698149371429096409765, - 21888242871839275222246405745257275088548364400416034343698187685107673273958, - 21888242871839275222246405745257275088548364400416034343698138186667802890645, - 33952176675656036, - 71777588588216385, - 21888242871839275222246405745257275088548364400416034343698139950789535429578, - 35360387132650762, - 980607960562232, - 21888242871839275222246405745257275088548364400416034343698151688650171436826, - 69933512812650243, - 21888242871839275222246405745257275088548364400416034343698176885464793405878, - 21888242871839275222246405745257275088548364400416034343698172450951480739703, - 51765157103389987, - 303442246225891, - 21888242871839275222246405745257275088548364400416034343698177844003915804265, - 50180322670854456, - 21888242871839275222246405745257275088548364400416034343698190452532429125225, - 22612000761818838, - 66383975129307613, - 59753013844837768, - 21888242871839275222246405745257275088548364400416034343698146522946142448560, - 21888242871839275222246405745257275088548364400416034343698193342374120699615, - 21888242871839275222246405745257275088548364400416034343698164483943704731843, - 21888242871839275222246405745257275088548364400416034343698202244035017975773, - 6333159268266146, - 30234192085666961, - 21888242871839275222246405745257275088548364400416034343698143159236691042161, - 21888242871839275222246405745257275088548364400416034343698140188105426405546, - 21888242871839275222246405745257275088548364400416034343698148586873121664202, - 21888242871839275222246405745257275088548364400416034343698197377199760307992, - 21114426230617574, - 21888242871839275222246405745257275088548364400416034343698182983762458146269, - 35352304041067415, - 21888242871839275222246405745257275088548364400416034343698152321652573163060, - 21316929362933658, - 21888242871839275222246405745257275088548364400416034343698200154916058849728, - 24602525405578057, - 21888242871839275222246405745257275088548364400416034343698152542819112424970, - 21888242871839275222246405745257275088548364400416034343698191417830676419282, - 57994317841876922, - 21888242871839275222246405745257275088548364400416034343698164438468759650463, - 21888242871839275222246405745257275088548364400416034343698181848170818481953, - 21888242871839275222246405745257275088548364400416034343698155119502899861258, - 37129753203374058, - 15405069717125541, - 21594760945210740, - 21888242871839275222246405745257275088548364400416034343698142961042101931866, - 21888242871839275222246405745257275088548364400416034343698197457217189002169, - 21888242871839275222246405745257275088548364400416034343698198850907934612083, - 21888242871839275222246405745257275088548364400416034343698147624679692648534, - 60802358142890242, - 21888242871839275222246405745257275088548364400416034343698202102808717711922, - 55548827086638507, - 21888242871839275222246405745257275088548364400416034343698136500080306911034, - 3709782554969537, - 21888242871839275222246405745257275088548364400416034343698182719351124653746, - 30297823107846456, - 21888242871839275222246405745257275088548364400416034343698137624666192837514, - 21888242871839275222246405745257275088548364400416034343698163495479985959539, - 21888242871839275222246405745257275088548364400416034343698146667704850763523, - 21888242871839275222246405745257275088548364400416034343698145608097003175557, - 21888242871839275222246405745257275088548364400416034343698155421891949754812, - 21888242871839275222246405745257275088548364400416034343698159694517062515341, - 39193326495900, - 21888242871839275222246405745257275088548364400416034343698185999278409673574, - 21888242871839275222246405745257275088548364400416034343698169101164918995988, - 21888242871839275222246405745257275088548364400416034343698154936035238872851, - 21888242871839275222246405745257275088548364400416034343698146912823022107108, - 21888242871839275222246405745257275088548364400416034343698141005314452998499, - 26627443606380898, - 21888242871839275222246405745257275088548364400416034343698196269906206736554, - 25475916107174828, - 66774114427384837, - 31835785697777063, - 21888242871839275222246405745257275088548364400416034343698143457901184607253, - 49754878194836111, - 9596815685480439, - 57012972001882145, - 43703617786447857, - 21888242871839275222246405745257275088548364400416034343698157546819067590550, - 50820148387017561, - 14253048831857464, - 21888242871839275222246405745257275088548364400416034343698193773473088144581, - 32167947596966769, - 10722374009990759, - 21888242871839275222246405745257275088548364400416034343698156607493493021576, - 21888242871839275222246405745257275088548364400416034343698196637195572720498, - 21888242871839275222246405745257275088548364400416034343698161103140491148337, - 21888242871839275222246405745257275088548364400416034343698151993122270749004, - 21888242871839275222246405745257275088548364400416034343698203283890528724052, - 31590760985941523, - 59336972831284113, - 21888242871839275222246405745257275088548364400416034343698177728179892618794, - 21888242871839275222246405745257275088548364400416034343698162787814711247076, - 11455995984755552, - 15854475639022791, - 21888242871839275222246405745257275088548364400416034343698146608165574431628, - 12001551173095387, - 21888242871839275222246405745257275088548364400416034343698135317283969454100, - 35911127223616011, - 21888242871839275222246405745257275088548364400416034343698162109624664923547, - 4090373145896753, - 21888242871839275222246405745257275088548364400416034343698137870440415581829, - 21103416403171079, - 21888242871839275222246405745257275088548364400416034343698144667897212617024, - 21888242871839275222246405745257275088548364400416034343698179964654409375265, - 46269755063103285, - 5868527870610714, - 21888242871839275222246405745257275088548364400416034343698180139336288924739, - 21888242871839275222246405745257275088548364400416034343698159920711883693545, - 2900814982821335, - 21888242871839275222246405745257275088548364400416034343698157052769516132540, - 38282008452902630, - 21888242871839275222246405745257275088548364400416034343698138728462288002926, - 21888242871839275222246405745257275088548364400416034343698145386326027481636, - 67453230068389596, - 49044829555850816, - 21888242871839275222246405745257275088548364400416034343698136105612915019819, - 21888242871839275222246405745257275088548364400416034343698190731349312214624, - 63311700866820567, - 21888242871839275222246405745257275088548364400416034343698200224682149569161, - 21888242871839275222246405745257275088548364400416034343698191655526499123663, - 21888242871839275222246405745257275088548364400416034343698181209631393094679, - 69913085206879580, - 62262456252361163, - 62173550433225595, - 31610354757188319, - 21888242871839275222246405745257275088548364400416034343698151085563908918772, - 33673041126626554, - 21888242871839275222246405745257275088548364400416034343698161622307224089583, - 14813162504443996, - 52049673333817328, - 21888242871839275222246405745257275088548364400416034343698152498726287530820, - 9290603056021549, - 19801230964669452, - 21888242871839275222246405745257275088548364400416034343698200074300002647258, - 21888242871839275222246405745257275088548364400416034343698194466913512735351, - 15715636846228434, - 21888242871839275222246405745257275088548364400416034343698184150344120203954, - 21888242871839275222246405745257275088548364400416034343698135328534848398027, - 21888242871839275222246405745257275088548364400416034343698133220966799247467, - 56063665804296655, - 15466262168874294, - 21888242871839275222246405745257275088548364400416034343698175979600953473445, - 55139888511580852, - 39272980044908377, - 21888242871839275222246405745257275088548364400416034343698140764123354685441, - 64416774973878873, - 41102817867140898, - 21888242871839275222246405745257275088548364400416034343698154405191694983181, - 21888242871839275222246405745257275088548364400416034343698139414823157666419, - 14297701063051039, - 34206032818666727, - 37659116842116431, - 21888242871839275222246405745257275088548364400416034343698194194067491526506, - 22479724360172723, - 1157986564893147, - 21888242871839275222246405745257275088548364400416034343698197888531621090877, - 21888242871839275222246405745257275088548364400416034343698139064193619586493, - 21888242871839275222246405745257275088548364400416034343698132751164401516776, - 10956430259546417, - 69998789013957466, - 46490775419504974, - 21888242871839275222246405745257275088548364400416034343698177515586674042502, - 21888242871839275222246405745257275088548364400416034343698203131012585775820, - 21888242871839275222246405745257275088548364400416034343698135071262390465269, - 46601695956139026, - 21888242871839275222246405745257275088548364400416034343698170087136066201201, - 38324405926982904, - 21888242871839275222246405745257275088548364400416034343698194385811042178336, - 63687656685597217, - 21888242871839275222246405745257275088548364400416034343698190504456159333791, - 47231256948577906, - 67833427021104622, - 66328709068648053, - 21888242871839275222246405745257275088548364400416034343698137421447129858890, - 21888242871839275222246405745257275088548364400416034343698200697620774668829, - 21888242871839275222246405745257275088548364400416034343698185456260377651609, - 21888242871839275222246405745257275088548364400416034343698186735568319151593, - 21888242871839275222246405745257275088548364400416034343698142260767326330751, - 21888242871839275222246405745257275088548364400416034343698140514603283635721, - 21888242871839275222246405745257275088548364400416034343698198914354776473336, - 21888242871839275222246405745257275088548364400416034343698152709718271560097, - 21888242871839275222246405745257275088548364400416034343698156239740900770956, - 8860759683975268, - 20716087991129548, - 60701441863675860, - 5157946913183417, - 49635863153183668, - 1437305846181211, - 7035439334554522, - 21888242871839275222246405745257275088548364400416034343698143986812718881723, - 21888242871839275222246405745257275088548364400416034343698194681708252641582, - 21888242871839275222246405745257275088548364400416034343698183463108520193571, - 44978155074980039, - 36515219356144346, - 67355921894145894, - 21888242871839275222246405745257275088548364400416034343698182320757663059725, - 20967379609910059, - 26065476847292753, - 17475694775191487, - 15322538409449902, - 11358794996084341, - 21888242871839275222246405745257275088548364400416034343698150730182087030288, - 21888242871839275222246405745257275088548364400416034343698180560172144309100, - 21888242871839275222246405745257275088548364400416034343698153476632849353224, - 21888242871839275222246405745257275088548364400416034343698139221700317564929, - 36143906938094803, - 21888242871839275222246405745257275088548364400416034343698157157309107279681, - 21888242871839275222246405745257275088548364400416034343698133857479193356993, - 21888242871839275222246405745257275088548364400416034343698165024758073660662, - 39464786036005824, - 21888242871839275222246405745257275088548364400416034343698171766689331320510, - 21888242871839275222246405745257275088548364400416034343698152387045390356074, - 21888242871839275222246405745257275088548364400416034343698191136895007974920, - 21888242871839275222246405745257275088548364400416034343698181994860434930523, - 53581685770927585, - 16120753323070065, - 6667358252899505, - 40904724169175294, - 58672496583318978, - 13512151263335123, - 21888242871839275222246405745257275088548364400416034343698177838727840712581, - 56551091380329086, - 21888242871839275222246405745257275088548364400416034343698144984629364073557, - 66390703267485737, - 21888242871839275222246405745257275088548364400416034343698171195853172291163, - 21888242871839275222246405745257275088548364400416034343698142074406283433687, - 21888242871839275222246405745257275088548364400416034343698135184047713495924, - 20167932254157865, - 68616665662903440, - 21888242871839275222246405745257275088548364400416034343698151316768606137503, - 21888242871839275222246405745257275088548364400416034343698156804846361218509, - 44436079160100867, - 38973558171464159, - 55209699161996165, - 24636674730029856, - 21888242871839275222246405745257275088548364400416034343698140923246003204182, - 27463311277191619, - 21888242871839275222246405745257275088548364400416034343698152286208210392458, - 21888242871839275222246405745257275088548364400416034343698147807556007400007, - 21888242871839275222246405745257275088548364400416034343698147893509081061729, - 6026275188545639, - 21888242871839275222246405745257275088548364400416034343698183121143181967613, - 21888242871839275222246405745257275088548364400416034343698146898014747156417, - 70673488221151840, - 21888242871839275222246405745257275088548364400416034343698158118432923531161, - 58362273323128551, - 34415721833877900, - 6652846190039318, - 22778373093480793, - 21888242871839275222246405745257275088548364400416034343698172307994235684545, - 21888242871839275222246405745257275088548364400416034343698172390949402100034, - 21888242871839275222246405745257275088548364400416034343698188266656872193474, - 21888242871839275222246405745257275088548364400416034343698146810171202550369, - 21888242871839275222246405745257275088548364400416034343698155219349601213333, - 4983871586448547, - 51744251169399233, - 36569688531825369, - 50933614294668295, - 21888242871839275222246405745257275088548364400416034343698145057069547378778, - 21888242871839275222246405745257275088548364400416034343698198780081970932088, - 21888242871839275222246405745257275088548364400416034343698165269475067148058, - 21888242871839275222246405745257275088548364400416034343698162256542414823301, - 21888242871839275222246405745257275088548364400416034343698190863107920009332, - 21888242871839275222246405745257275088548364400416034343698157232347667170498, - 32975216159823753, - 43640234677514331, - 39704032901397316, - 44996292977907352, - 21888242871839275222246405745257275088548364400416034343698182251111243568052, - 58231867626075490, - 24074136184573878, - 21888242871839275222246405745257275088548364400416034343698146427961965810395, - 63464897793509202, - 21888242871839275222246405745257275088548364400416034343698191788250071866030, - 21888242871839275222246405745257275088548364400416034343698187360970820160865, - 21888242871839275222246405745257275088548364400416034343698185479315118436625, - 20292500026416566, - 21888242871839275222246405745257275088548364400416034343698142137637005361164, - 21888242871839275222246405745257275088548364400416034343698194530591031259110, - 52243123316078111, - 71792615982716989, - 21888242871839275222246405745257275088548364400416034343698147940772861320430, - 21888242871839275222246405745257275088548364400416034343698158379076927068826, - 38875868435909997, - 32948386714542842, - 21888242871839275222246405745257275088548364400416034343698198435763941285079, - 21888242871839275222246405745257275088548364400416034343698155158936767988817, - 21888242871839275222246405745257275088548364400416034343698190005233334981665, - 65125583591959210, - 24208103398216840, - 57576300291858947, - 27912813826693957, - 33309618504365017, - 21888242871839275222246405745257275088548364400416034343698195319733846317862, - 21888242871839275222246405745257275088548364400416034343698150287412026509877, - 8693705674977421, - 31990581107049644, - 71919512216492520, - 21888242871839275222246405745257275088548364400416034343698149688489247509648, - 43962913963313571, - 15674438169067634, - 15443089403866264, - 21888242871839275222246405745257275088548364400416034343698190248755477971510, - 40580557438822972, - 21888242871839275222246405745257275088548364400416034343698147501732871265568, - 58654505852218764, - 69056314623288176, - 21415486349655458, - 21888242871839275222246405745257275088548364400416034343698177502224943981773, - 63155845703826686, - 5562437730204288, - 21888242871839275222246405745257275088548364400416034343698149792758527511244, - 21888242871839275222246405745257275088548364400416034343698160437611668895313, - 41734968820331487, - 21888242871839275222246405745257275088548364400416034343698150639381809102090, - 35558992259685274, - 59780120624503814, - 53788731166908257, - 21888242871839275222246405745257275088548364400416034343698198021240976285719, - 20172183587861298, - 21888242871839275222246405745257275088548364400416034343698160760207766965201, - 29898059019280158, - 21888242871839275222246405745257275088548364400416034343698182857868826536318, - 21888242871839275222246405745257275088548364400416034343698148651083493618516, - 47790237849075896, - 44787959252474085, - 18675333756645443, - 27643617138142983, - 21888242871839275222246405745257275088548364400416034343698147147059708701418, - 21888242871839275222246405745257275088548364400416034343698155181267095734307, - 21888242871839275222246405745257275088548364400416034343698188679988920328921, - 72012016245268129, - 21888242871839275222246405745257275088548364400416034343698141349099826418809, - 65473264570921916, - 16005106476180993, - 21888242871839275222246405745257275088548364400416034343698196959593643959434, - 21888242871839275222246405745257275088548364400416034343698172558937229706544, - 26008353596870240, - 21888242871839275222246405745257275088548364400416034343698179056136029949561, - 21888242871839275222246405745257275088548364400416034343698174919110078782548, - 21888242871839275222246405745257275088548364400416034343698170730208285522652, - 21888242871839275222246405745257275088548364400416034343698201549763556017677, - 16205054897784692, - 29029629645609638, - 21888242871839275222246405745257275088548364400416034343698186342250747670701, - 45858217442089606, - 21888242871839275222246405745257275088548364400416034343698184756821675363819, - 34119221860064838, - 16826609406207248, - 21888242871839275222246405745257275088548364400416034343698138092636157231361, - 21888242871839275222246405745257275088548364400416034343698145818445786205421, - 21888242871839275222246405745257275088548364400416034343698177867035592237481, - 21888242871839275222246405745257275088548364400416034343698163005099658480554, - 17189604121795167, - 21888242871839275222246405745257275088548364400416034343698133215499751670612, - 21888242871839275222246405745257275088548364400416034343698166527847615618209, - 50740026025839313, - 18407581588472328, - 48722204965480608, - 42129181474703097, - 21888242871839275222246405745257275088548364400416034343698144334068808526268, - 21888242871839275222246405745257275088548364400416034343698164725400692402391, - 21888242871839275222246405745257275088548364400416034343698202022690372352046, - 21880767491068675, - 21888242871839275222246405745257275088548364400416034343698183212392718131719, - 21888242871839275222246405745257275088548364400416034343698167249256323901084, - 21888242871839275222246405745257275088548364400416034343698156484696151659006, - 60546160858062736, - 39097262509740539, - 21888242871839275222246405745257275088548364400416034343698180264650941082174, - 63363872267598910, - 21888242871839275222246405745257275088548364400416034343698146027477071488383, - 4363348447564932, - 21888242871839275222246405745257275088548364400416034343698193147809654811320, - 6054992815329316, - 21888242871839275222246405745257275088548364400416034343698198171281921392806, - 21888242871839275222246405745257275088548364400416034343698184756293432971980, - 61442594914817097, - 30473215663900109, - 21888242871839275222246405745257275088548364400416034343698198293543242888432, - 21888242871839275222246405745257275088548364400416034343698199215629623212195, - 21888242871839275222246405745257275088548364400416034343698141635291129152191, - 28547010845792412, - 21888242871839275222246405745257275088548364400416034343698192436208357223768, - 69316070780767671, - 45571648121779711, - 24256089777546646, - 21888242871839275222246405745257275088548364400416034343698189293523089519972, - 21888242871839275222246405745257275088548364400416034343698164475469716215909, - 21888242871839275222246405745257275088548364400416034343698148246981814966456, - 26694191470567150, - 21888242871839275222246405745257275088548364400416034343698152334151634520745, - 21888242871839275222246405745257275088548364400416034343698143547139557990162, - 21888242871839275222246405745257275088548364400416034343698146256466982431847, - 867828987013278, - 21888242871839275222246405745257275088548364400416034343698158775802465963530, - 21888242871839275222246405745257275088548364400416034343698133476196671446913, - 20571568480825008, - 61357077078005417, - 55672361144917429, - 57864387931558044, - 21888242871839275222246405745257275088548364400416034343698192596011663392358, - 21888242871839275222246405745257275088548364400416034343698149119824498370679, - 21888242871839275222246405745257275088548364400416034343698176525365772191914, - 18727196167869902, - 23101259522087585, - 38139023674166729, - 21888242871839275222246405745257275088548364400416034343698173567272377479483, - 21888242871839275222246405745257275088548364400416034343698140213604452676951, - 50745484772003692, - 67476670569761878, - 21888242871839275222246405745257275088548364400416034343698156199175018580400, - 21888242871839275222246405745257275088548364400416034343698189767864187527283, - 21888242871839275222246405745257275088548364400416034343698148512402818063044, - 21888242871839275222246405745257275088548364400416034343698157587818549540938, - 21888242871839275222246405745257275088548364400416034343698144997165744431281, - 45418632320894987, - 9568590595721839, - 21888242871839275222246405745257275088548364400416034343698192597129269712338, - 21888242871839275222246405745257275088548364400416034343698151399193827676923, - 16663774782988521, - 21888242871839275222246405745257275088548364400416034343698171214205620479491, - 21888242871839275222246405745257275088548364400416034343698197624564100182053, - 41651107810098868, - 29399803589459827, - 15500041508614558, - 21888242871839275222246405745257275088548364400416034343698132248098006913149, - 42992930372174962, - 63677035791465883, - 2859204664342533, - 19667464868620741, - 58784563859955890, - 21888242871839275222246405745257275088548364400416034343698194637081002506196, - 67406495625325172, - 37889031782060556, - 21888242871839275222246405745257275088548364400416034343698168137276733941811, - 38336815580455493, - 32813051482302560, - 21888242871839275222246405745257275088548364400416034343698179903735468519667, - 21888242871839275222246405745257275088548364400416034343698195557881748833214, - 62965874233397292, - 56363606096382758, - 21888242871839275222246405745257275088548364400416034343698158456613360094963, - 71415373289529019, - 21888242871839275222246405745257275088548364400416034343698162054229889213834, - 68452051100865466, - 57654679363238452, - 21888242871839275222246405745257275088548364400416034343698195817417407252443, - 21888242871839275222246405745257275088548364400416034343698146831287778756922, - 64998078597950229, - 21888242871839275222246405745257275088548364400416034343698156861433738254519, - 32635172600583230, - 21888242871839275222246405745257275088548364400416034343698140453789773014672, - 21888242871839275222246405745257275088548364400416034343698180221419637093959, - 64317190478882419, - 21888242871839275222246405745257275088548364400416034343698198339825453328078, - 42493803994598249, - 69622180506859280, - 39207169578041261, - 21888242871839275222246405745257275088548364400416034343698167329715604827609, - 9850466473124958, - 8903743565163167, - 21888242871839275222246405745257275088548364400416034343698179955848537889183, - 42990994768584688, - 71425219948260765, - 21888242871839275222246405745257275088548364400416034343698182933567823070368, - 55239189424330095, - 21888242871839275222246405745257275088548364400416034343698164111213711277945, - 21888242871839275222246405745257275088548364400416034343698195618740917238632, - 21888242871839275222246405745257275088548364400416034343698179823116640139166, - 31351217590821734, - 28315035672000035, - 21888242871839275222246405745257275088548364400416034343698170957053375193866, - 21888242871839275222246405745257275088548364400416034343698150664938045315684, - 21888242871839275222246405745257275088548364400416034343698136035699538159816, - 21888242871839275222246405745257275088548364400416034343698201718738193506030, - 32539049027107797, - 7092443959240484, - 39350261552138355, - 22168353167167562, - 21888242871839275222246405745257275088548364400416034343698187069011789065222, - 15056297479568539, - 21888242871839275222246405745257275088548364400416034343698178512602972009907, - 21888242871839275222246405745257275088548364400416034343698170450919625959054, - 21888242871839275222246405745257275088548364400416034343698194601944671373209, - 21888242871839275222246405745257275088548364400416034343698152059551807366401, - 21888242871839275222246405745257275088548364400416034343698155422733509517497, - 55550332696338323, - 58053976758515661, - 58266364843833621, - 43265815704331963, - 21888242871839275222246405745257275088548364400416034343698165563983806225831, - 21888242871839275222246405745257275088548364400416034343698178308351152433435, - 21888242871839275222246405745257275088548364400416034343698190691569519523453, - 21888242871839275222246405745257275088548364400416034343698162364688839333271, - 6976798146269996, - 57587915353683982, - 21888242871839275222246405745257275088548364400416034343698181513822252050000, - 15505809544278707, - 60949109563116543, - 20258499247877808, - 8450842750685236, - 11786166402973214, - 21888242871839275222246405745257275088548364400416034343698158904329386562305, - 5848581190106617, - 21888242871839275222246405745257275088548364400416034343698134715602995389540, - 21888242871839275222246405745257275088548364400416034343698201388722014591253, - 54549320746939514, - 25880407145287974, - 51092655046211139, - 4572148186932309, - 21888242871839275222246405745257275088548364400416034343698143940077261942045, - 21888242871839275222246405745257275088548364400416034343698197101317066276482, - 16297020027843262, - 21888242871839275222246405745257275088548364400416034343698137452974745923325, - 21888242871839275222246405745257275088548364400416034343698134387011280987886, - 49015031026485484, - 27320815943809805, - 29053423732354882, - 7724064797110501, - 21888242871839275222246405745257275088548364400416034343698146740372415017709, - 19644534362183373, - 32717789512983701, - 57078537732202078, - 21888242871839275222246405745257275088548364400416034343698181084684086674830, - 21888242871839275222246405745257275088548364400416034343698187225108955851679, - 64695887111308969, - 21888242871839275222246405745257275088548364400416034343698170417528453412684, - 12728685104138388, - 21888242871839275222246405745257275088548364400416034343698190978187243433984, - 21888242871839275222246405745257275088548364400416034343698182509758459046947, - 7619291623835460, - 48174266212594048, - 21888242871839275222246405745257275088548364400416034343698159779881610275109, - 21888242871839275222246405745257275088548364400416034343698188565379859776105, - 21888242871839275222246405745257275088548364400416034343698181634317415857828, - 21888242871839275222246405745257275088548364400416034343698145027720817689248, - 21888242871839275222246405745257275088548364400416034343698201689167551710516, - 46385869108605896, - 47285278940758223, - 64637146311345406, - 28160547162292550, - 21888242871839275222246405745257275088548364400416034343698171016733558091106, - 42303950305099683, - 11865895261187439, - 18197788499987707, - 21888242871839275222246405745257275088548364400416034343698147788298401726320, - 21888242871839275222246405745257275088548364400416034343698189590591238266214, - 21888242871839275222246405745257275088548364400416034343698201131912526488433, - 21888242871839275222246405745257275088548364400416034343698188489966536618148, - 52355337937110111, - 21888242871839275222246405745257275088548364400416034343698136716738550429287, - 23419551696482764, - 21888242871839275222246405745257275088548364400416034343698133453890948165001, - 64080281309106370, - 21888242871839275222246405745257275088548364400416034343698153040632912119868, - 62355321278012608, - 52688478793118336, - 64609518768900177, - 65012117444149524, - 21888242871839275222246405745257275088548364400416034343698150162016389499918, - 19027492513356557, - 21888242871839275222246405745257275088548364400416034343698141260168482199474, - 63033299256842477, - 39064025666929067, - 3127679193923171, - 17246625052130435, - 16399414872544986, - 21888242871839275222246405745257275088548364400416034343698170976004224439917, - 51761075920519454, - 21888242871839275222246405745257275088548364400416034343698150511491715794893, - 21888242871839275222246405745257275088548364400416034343698143672859517126345, - 21888242871839275222246405745257275088548364400416034343698202184623708399000, - 62035199561839647, - 21888242871839275222246405745257275088548364400416034343698156764227770435927, - 21888242871839275222246405745257275088548364400416034343698196207489922237717, - 12538197358630756, - 12436986105805289, - 21888242871839275222246405745257275088548364400416034343698166735564968570170, - 21888242871839275222246405745257275088548364400416034343698160514822820601806, - 62723591509923920, - 49344505514712948, - 21888242871839275222246405745257275088548364400416034343698155459812483496140, - 21888242871839275222246405745257275088548364400416034343698177891652511232046, - 9848836812093964, - 52683926733041991, - 21888242871839275222246405745257275088548364400416034343698188649224129006772, - 21888242871839275222246405745257275088548364400416034343698200299427978380995, - 21888242871839275222246405745257275088548364400416034343698188002190840538253, - 310917331714309, - 21888242871839275222246405745257275088548364400416034343698180838686575790543, - 21888242871839275222246405745257275088548364400416034343698173891456717117250, - 11780892233713655, - 21198723918613794, - 7259951809131336, - 37013042755911030, - 47716909802109137, - 12164160262133538, - 21888242871839275222246405745257275088548364400416034343698193364620490274657, - 63616316476111005, - 67838357339835166, - 21888242871839275222246405745257275088548364400416034343698178100104258090794, - 21888242871839275222246405745257275088548364400416034343698149255523201001419, - 55010114962766932, - 50264969739291922, - 16929091676962353, - 37349813567282366, - 21888242871839275222246405745257275088548364400416034343698182108017751256940, - 21888242871839275222246405745257275088548364400416034343698196316431765301060, - 61311890827313596, - 21888242871839275222246405745257275088548364400416034343698135020201685333686, - 21888242871839275222246405745257275088548364400416034343698198285315327480427, - 21888242871839275222246405745257275088548364400416034343698168352808703723534, - 21888242871839275222246405745257275088548364400416034343698158001349804570152, - 21888242871839275222246405745257275088548364400416034343698186977641913884322, - 35627370041993624, - 69108816349403630, - 21888242871839275222246405745257275088548364400416034343698158049499923618202, - 31523545479058423, - 26814193085761691, - 24373229163456938, - 10947618647103690, - 58048336638421707, - 29854847223084590, - 1223689285269036, - 21888242871839275222246405745257275088548364400416034343698158325996229175088, - 27268403080338021, - 414394639229584, - 21888242871839275222246405745257275088548364400416034343698178869229234351348, - 21888242871839275222246405745257275088548364400416034343698202198924566204418, - 21888242871839275222246405745257275088548364400416034343698138266773733353901, - 21888242871839275222246405745257275088548364400416034343698150439064763055607, - 21888242871839275222246405745257275088548364400416034343698202946925623884088, - 47259974055103468, - 7454802299941054, - 66246446442982059, - 21888242871839275222246405745257275088548364400416034343698192158335550880804, - 21888242871839275222246405745257275088548364400416034343698147375526685498961, - 21888242871839275222246405745257275088548364400416034343698193181077931755894, - 13865642122399308, - 21888242871839275222246405745257275088548364400416034343698180652737076837509, - 21888242871839275222246405745257275088548364400416034343698161142633187583169, - 11705501737194590, - 21888242871839275222246405745257275088548364400416034343698192336256458599829, - 21888242871839275222246405745257275088548364400416034343698141108065010570681, - 21888242871839275222246405745257275088548364400416034343698181124732082096584, - 21888242871839275222246405745257275088548364400416034343698191955912829107580, - 27751341611965846, - 21888242871839275222246405745257275088548364400416034343698159222396396889971, - 21888242871839275222246405745257275088548364400416034343698167832587970514405, - 19425864991836590, - 23242420560459429, - 17384375461210163, - 71008828483662324, - 3606763815860619, - 21888242871839275222246405745257275088548364400416034343698164606644398983081, - 21888242871839275222246405745257275088548364400416034343698138594033828055940, - 37200525298879298, - 21888242871839275222246405745257275088548364400416034343698146390970915800678, - 31387819225063184, - 53344081247745258, - 21888242871839275222246405745257275088548364400416034343698146030947794894320, - 21888242871839275222246405745257275088548364400416034343698172208666767481770, - 15605570857632872, - 21888242871839275222246405745257275088548364400416034343698184999784925230938, - 20639246096919969, - 59939299351253733, - 55861317865367084, - 21888242871839275222246405745257275088548364400416034343698135769726660341414, - 61455535287423195, - 19462719837479944, - 21888242871839275222246405745257275088548364400416034343698133148729026283132, - 21888242871839275222246405745257275088548364400416034343698159111911418410801, - 61806183268201304, - 13028101189172526, - 8211421639325295, - 17245386487929571, - 21888242871839275222246405745257275088548364400416034343698166004507208777384, - 37863701749183826, - 21888242871839275222246405745257275088548364400416034343698180041245283446359, - 21888242871839275222246405745257275088548364400416034343698156546933878836863, - 32430175814060041, - 64532977456053166, - 21888242871839275222246405745257275088548364400416034343698194388845236767857, - 21888242871839275222246405745257275088548364400416034343698198173134843301304, - 21888242871839275222246405745257275088548364400416034343698142794316744802397, - 21888242871839275222246405745257275088548364400416034343698194971457670791572, - 21888242871839275222246405745257275088548364400416034343698185063230314418022, - 39082223098186165, - 21888242871839275222246405745257275088548364400416034343698154214813232293850, - 52320193107038792, - 21888242871839275222246405745257275088548364400416034343698153539695495383903, - 46336581630730291, - 16542447245747042, - 21888242871839275222246405745257275088548364400416034343698195398568671196713, - 42836035936627069, - 21888242871839275222246405745257275088548364400416034343698170014758621289196, - 31735900627910415, - 38292101919062370, - 41327260163747771, - 21888242871839275222246405745257275088548364400416034343698139388655100218499, - 25593020254817326, - 21888242871839275222246405745257275088548364400416034343698154359510436968232, - 60461078055114906, - 18593680312124980, - 68426441189531412, - 19930183879039231, - 66958068225103781, - 19058164258125206, - 49275821437538937, - 6379035501374056, - 21888242871839275222246405745257275088548364400416034343698160911229700980735, - 65768792129726836, - 21888242871839275222246405745257275088548364400416034343698190913776988164589, - 37045218004711361, - 21888242871839275222246405745257275088548364400416034343698183194385525525637, - 21888242871839275222246405745257275088548364400416034343698137990239790053720, - 21888242871839275222246405745257275088548364400416034343698167247755735766087, - 19458938072615036, - 21888242871839275222246405745257275088548364400416034343698199616419960560562, - 21888242871839275222246405745257275088548364400416034343698202777612928156063, - 58225942194748671, - 56858004868136269, - 16968040095118700, - 21888242871839275222246405745257275088548364400416034343698134094813775746963, - 59135670438981476, - 9874696528495667, - 21888242871839275222246405745257275088548364400416034343698201674989816560006, - 43563961676622525, - 21888242871839275222246405745257275088548364400416034343698158045533785642773, - 1872531704105816, - 8718347875126699, - 46157718138070357, - 32646226766849837, - 39084531049961752, - 41594918168420559, - 64736019891582483, - 21888242871839275222246405745257275088548364400416034343698195718294087631353, - 21888242871839275222246405745257275088548364400416034343698141746016449694670, - 21888242871839275222246405745257275088548364400416034343698160545578885894750, - 57753747879572023, - 21888242871839275222246405745257275088548364400416034343698146167320589144164, - 51311007126710442, - 60784181370469686, - 63408893430977630, - 23034057342713135, - 7853064295164191, - 6741299064535965, - 21888242871839275222246405745257275088548364400416034343698199943789345692856, - 21888242871839275222246405745257275088548364400416034343698142688811456422051, - 21888242871839275222246405745257275088548364400416034343698166942076820434873, - 22798574468179846, - 29297672526250092, - 34916739389558296, - 21888242871839275222246405745257275088548364400416034343698154028572686669299, - 21888242871839275222246405745257275088548364400416034343698185801719984976422, - 21888242871839275222246405745257275088548364400416034343698187209808324489096, - 21888242871839275222246405745257275088548364400416034343698194434997596295111, - 47869339746612259, - 69067597583927074, - 52952866323144602, - 21888242871839275222246405745257275088548364400416034343698138008808889896748, - 21888242871839275222246405745257275088548364400416034343698184753854261715550, - 21888242871839275222246405745257275088548364400416034343698172577592460088917, - 21888242871839275222246405745257275088548364400416034343698195982721197827392, - 21888242871839275222246405745257275088548364400416034343698181080198756169469, - 52515946940677156, - 21888242871839275222246405745257275088548364400416034343698178497164999038051, - 69000194947798476, - 21888242871839275222246405745257275088548364400416034343698166629457603876554, - 11471688039374041, - 21888242871839275222246405745257275088548364400416034343698138652647366158361, - 13799333927317815, - 21888242871839275222246405745257275088548364400416034343698162441862090618778, - 21888242871839275222246405745257275088548364400416034343698195222538248798872, - 68070816178349589, - 21888242871839275222246405745257275088548364400416034343698191606880370583021, - 21888242871839275222246405745257275088548364400416034343698140163588929302103, - 628197466545334, - 50444120263712388, - 28436374213542115, - 5007912685577116, - 21888242871839275222246405745257275088548364400416034343698197700505452387525, - 21888242871839275222246405745257275088548364400416034343698164314022906506953, - 33006585140744849, - 21888242871839275222246405745257275088548364400416034343698171981692150581989, - 12338678088897041, - 21888242871839275222246405745257275088548364400416034343698157095947460008544, - 10569707703403846, - 26492118008679992, - 16793584315453610, - 18845099279775557, - 6366621015755529, - 70367377702092503, - 21888242871839275222246405745257275088548364400416034343698196122092460055186, - 40336050415409503, - 62598887068821147, - 21888242871839275222246405745257275088548364400416034343698193743642419912070, - 42009569796271699, - 25663705599653476, - 21888242871839275222246405745257275088548364400416034343698160041534330154407, - 21888242871839275222246405745257275088548364400416034343698145678858804187456, - 39400394045366410, - 21888242871839275222246405745257275088548364400416034343698158315082543188462, - 21888242871839275222246405745257275088548364400416034343698160474652284652628, - 16319701902431012, - 68972840740866459, - 65379915692611319, - 9390453131479926, - 69933688578426819, - 21888242871839275222246405745257275088548364400416034343698170005013294989943, - 21888242871839275222246405745257275088548364400416034343698135445773970618381, - 21888242871839275222246405745257275088548364400416034343698135785299174058804, - 21888242871839275222246405745257275088548364400416034343698177448225216960507, - 37225508504007714, - 67638826789433297, - 21888242871839275222246405745257275088548364400416034343698200472748683931729, - 21888242871839275222246405745257275088548364400416034343698187886272723959812, - 21888242871839275222246405745257275088548364400416034343698143712487392263693, - 21888242871839275222246405745257275088548364400416034343698186017419408298505, - 21888242871839275222246405745257275088548364400416034343698146194384295145193, - 21888242871839275222246405745257275088548364400416034343698184897760940399380, - 21888242871839275222246405745257275088548364400416034343698171711100664327790, - 2770867950190181, - 21888242871839275222246405745257275088548364400416034343698198169649460836146, - 21888242871839275222246405745257275088548364400416034343698169701704467911653, - 21888242871839275222246405745257275088548364400416034343698159418402682084058, - 11168351203262543, - 38079901836271046, - 21888242871839275222246405745257275088548364400416034343698203999431850334435, - 21888242871839275222246405745257275088548364400416034343698185187899998967374, - 21888242871839275222246405745257275088548364400416034343698194789391507178431, - 41310537114012570, - 21888242871839275222246405745257275088548364400416034343698157879461203932841, - 21888242871839275222246405745257275088548364400416034343698132945884166872908, - 21888242871839275222246405745257275088548364400416034343698184219636225587951, - 49745498283845800, - 54597791625821293, - 21888242871839275222246405745257275088548364400416034343698203095423616128547, - 51179757633386677, - 21888242871839275222246405745257275088548364400416034343698162753093907900434, - 61190193983711371, - 21888242871839275222246405745257275088548364400416034343698144527164376531695, - 21888242871839275222246405745257275088548364400416034343698138042464040504864, - 42287958276931304, - 21888242871839275222246405745257275088548364400416034343698194421501091393950, - 2602928928438211, - 60861728692228626, - 21888242871839275222246405745257275088548364400416034343698184021430532456893, - 47594143263863169, - 21888242871839275222246405745257275088548364400416034343698199986604599346576, - 21888242871839275222246405745257275088548364400416034343698152527279058678368, - 43395651429696561, - 21888242871839275222246405745257275088548364400416034343698157546277655281325, - 20806326539148673, - 21888242871839275222246405745257275088548364400416034343698154021860821581185, - 32485533594867413, - 33233809013334672, - 21888242871839275222246405745257275088548364400416034343698181931449515583527, - 21888242871839275222246405745257275088548364400416034343698167453239840939225, - 45269061725447363, - 51427677121824643, - 21888242871839275222246405745257275088548364400416034343698192067747502119276, - 54989596561452900, - 21888242871839275222246405745257275088548364400416034343698139907917038919031, - 68429871919404589, - 21888242871839275222246405745257275088548364400416034343698134538992125574297, - 21888242871839275222246405745257275088548364400416034343698170458043005812566, - 16697413968074772, - 21888242871839275222246405745257275088548364400416034343698169019595097326426, - 58780826187350308, - 21888242871839275222246405745257275088548364400416034343698182527980418842244, - 71478624896564716, - 7127332262759260, - 42262401166795532, - 21888242871839275222246405745257275088548364400416034343698160324180666616655, - 21888242871839275222246405745257275088548364400416034343698174576883660434291, - 21888242871839275222246405745257275088548364400416034343698181699993975407239, - 32503114102163204, - 34317289046062828, - 21888242871839275222246405745257275088548364400416034343698136234809310232670, - 44176996190977735, - 21888242871839275222246405745257275088548364400416034343698158353071457786483, - 21888242871839275222246405745257275088548364400416034343698143649874271093421, - 21888242871839275222246405745257275088548364400416034343698187860386667462010, - 21888242871839275222246405745257275088548364400416034343698157177783057858029, - 37039053221797059, - 21888242871839275222246405745257275088548364400416034343698200501348678246253, - 4851203419265857, - 21888242871839275222246405745257275088548364400416034343698141367341226896714, - 21888242871839275222246405745257275088548364400416034343698191601403181399579, - 21888242871839275222246405745257275088548364400416034343698189704533083891567, - 21888242871839275222246405745257275088548364400416034343698183470424472288899, - 21888242871839275222246405745257275088548364400416034343698146989974991233736, - 21888242871839275222246405745257275088548364400416034343698144668402237750792, - 21888242871839275222246405745257275088548364400416034343698200719873757006945, - 50247888840621860, - 21888242871839275222246405745257275088548364400416034343698132161209899048155, - 58030917820249439, - 21888242871839275222246405745257275088548364400416034343698159767627108849869, - 64416442929255345, - 71002679827226851, - 21888242871839275222246405745257275088548364400416034343698156936174402020337, - 13112860907740371, - 21888242871839275222246405745257275088548364400416034343698173698932393029280, - 21888242871839275222246405745257275088548364400416034343698189611246298689718, - 35908205729528236, - 20020021369330887, - 61154173879110148, - 22907722803742446, - 5753160939165795, - 21888242871839275222246405745257275088548364400416034343698182250590690981359, - 65932839287427887, - 25279372875453841, - 14265249403980653, - 23195999120712313, - 10164460684940385, - 21888242871839275222246405745257275088548364400416034343698166697838202273313, - 21888242871839275222246405745257275088548364400416034343698141892042260144892, - 64486198486462573, - 68240049828707428, - 49237465100460644, - 17377239910806518, - 11122545268395112, - 22037903079246668, - 21888242871839275222246405745257275088548364400416034343698187944328458041509, - 15493947603092669, - 21888242871839275222246405745257275088548364400416034343698165798388681886427, - 48719738359647197, - 61431028891084085, - 21888242871839275222246405745257275088548364400416034343698137925786773236739, - 21888242871839275222246405745257275088548364400416034343698165240832183578550, - 18449583001171995, - 36308964265653069, - 21888242871839275222246405745257275088548364400416034343698183172772897355407, - 56127052151610713, - 21888242871839275222246405745257275088548364400416034343698184216448511340706, - 66782849592661993, - 45446583729113810, - 21888242871839275222246405745257275088548364400416034343698196606586993884407, - 27324430610441488, - 29687710651359993, - 21888242871839275222246405745257275088548364400416034343698204102521448732485, - 2920505968859705, - 6604524552563991, - 32608434040152903, - 30142413583105131, - 21888242871839275222246405745257275088548364400416034343698175219380166334567, - 53449550891028943, - 21888242871839275222246405745257275088548364400416034343698139466726872345009, - 459327426445955, - 46151483706100651, - 21888242871839275222246405745257275088548364400416034343698200629829414198948, - 21888242871839275222246405745257275088548364400416034343698165999111071924744, - 21888242871839275222246405745257275088548364400416034343698162339649945282687, - 1552178532455325, - 66061022796507270, - 21888242871839275222246405745257275088548364400416034343698176684213602234272, - 14923075079373583, - 656061016182524, - 38981735828590451, - 21888242871839275222246405745257275088548364400416034343698199162790343386562, - 21888242871839275222246405745257275088548364400416034343698190909328590849542, - 54955682940247483, - 41370998528535015, - 63642384106248249, - 21888242871839275222246405745257275088548364400416034343698177646000232369599, - 41647072931362228, - 21888242871839275222246405745257275088548364400416034343698190358120100326335, - 9851812181649484, - 21888242871839275222246405745257275088548364400416034343698194553297522075055, - 27859713490310438, - 21888242871839275222246405745257275088548364400416034343698191103051366043039, - 21888242871839275222246405745257275088548364400416034343698140263706328007794, - 32675430811642649, - 61947436381803167, - 37382262321901052, - 21888242871839275222246405745257275088548364400416034343698187376114524482072, - 21888242871839275222246405745257275088548364400416034343698196812572059026094, - 19694060526944805, - 41279365586655119, - 67585568652918216, - 21888242871839275222246405745257275088548364400416034343698145980475420751518, - 21888242871839275222246405745257275088548364400416034343698153815347287079336, - 21888242871839275222246405745257275088548364400416034343698185727634785395893, - 60491355638251432, - 9392689356989074, - 21888242871839275222246405745257275088548364400416034343698191750013497980057, - 63772001551859709, - 53521329482082947, - 61693595421459714, - 66509736754889760, - 21888242871839275222246405745257275088548364400416034343698136327559470118076, - 21888242871839275222246405745257275088548364400416034343698149478196182156603, - 21888242871839275222246405745257275088548364400416034343698173624335499844836, - 21888242871839275222246405745257275088548364400416034343698186698036925766737, - 21888242871839275222246405745257275088548364400416034343698140550384778079066, - 21888242871839275222246405745257275088548364400416034343698167802862343035911, - 41340060417670019, - 21888242871839275222246405745257275088548364400416034343698179174323080921942, - 21888242871839275222246405745257275088548364400416034343698191629943359321155, - 68726312571367782, - 21888242871839275222246405745257275088548364400416034343698182400937929231015, - 21888242871839275222246405745257275088548364400416034343698183092166470530396, - 21888242871839275222246405745257275088548364400416034343698154731949732349056, - 21888242871839275222246405745257275088548364400416034343698169758934020924240, - 21888242871839275222246405745257275088548364400416034343698150897277655934469, - 21888242871839275222246405745257275088548364400416034343698181685374419591670, - 21888242871839275222246405745257275088548364400416034343698202260647005497616, - 21888242871839275222246405745257275088548364400416034343698157198095230827361, - 21888242871839275222246405745257275088548364400416034343698143551463917303176, - 26104311508293893, - 10720537886495352, - 63774378852664897, - 21167400674098168, - 21888242871839275222246405745257275088548364400416034343698197365335753961817, - 15823597230707356, - 69467153017916834, - 63989900101106024, - 21888242871839275222246405745257275088548364400416034343698198488551118610557, - 21888242871839275222246405745257275088548364400416034343698185539271643353025, - 13658441274615533, - 21888242871839275222246405745257275088548364400416034343698149794521851126215, - 21888242871839275222246405745257275088548364400416034343698174595595929152150, - 34165665575574616, - 21888242871839275222246405745257275088548364400416034343698176327902057918678, - 8223151107458315, - 21888242871839275222246405745257275088548364400416034343698150413440714993498, - 21888242871839275222246405745257275088548364400416034343698150153322477805222, - 30037326871977571, - 21888242871839275222246405745257275088548364400416034343698202450634446777825, - 21888242871839275222246405745257275088548364400416034343698173075936077965447, - 33728028542874452, - 3735395397290621, - 21888242871839275222246405745257275088548364400416034343698200519576884643431, - 4255802987636844, - 21888242871839275222246405745257275088548364400416034343698133290399133651914, - 21888242871839275222246405745257275088548364400416034343698158019689011706113, - 21888242871839275222246405745257275088548364400416034343698188057637224522916, - 21888242871839275222246405745257275088548364400416034343698155420536146789702, - 13973128322874233, - 9740202436193528, - 9375230002736732, - 24765713102696845, - 21888242871839275222246405745257275088548364400416034343698164030759141034152, - 55467103508615178, - 26941752980575974, - 44455460835846670, - 48405029030803755, - 22810187945459656, - 18296445284634164, - 21888242871839275222246405745257275088548364400416034343698133866669210405611, - 21888242871839275222246405745257275088548364400416034343698196736379385171723, - 21888242871839275222246405745257275088548364400416034343698169000740718034338, - 11663237355005348, - 21888242871839275222246405745257275088548364400416034343698184623066324154407, - 21888242871839275222246405745257275088548364400416034343698132216638378745416, - 22264146464235325, - 21888242871839275222246405745257275088548364400416034343698174966715598703903, - 21888242871839275222246405745257275088548364400416034343698165107926693568866, - 48573155927722563, - 21888242871839275222246405745257275088548364400416034343698159994529475067921, - 67980463474127051, - 21888242871839275222246405745257275088548364400416034343698155293276157075274, - 40414683915162509, - 21888242871839275222246405745257275088548364400416034343698159811498672487218, - 21888242871839275222246405745257275088548364400416034343698174423883354745012, - 21888242871839275222246405745257275088548364400416034343698133302038307704080, - 21888242871839275222246405745257275088548364400416034343698199699252889760260, - 21888242871839275222246405745257275088548364400416034343698150626994730733943, - 6356147272417723, - 21888242871839275222246405745257275088548364400416034343698159931694270469755, - 21888242871839275222246405745257275088548364400416034343698150289605214837612, - 21227355286869263, - 21888242871839275222246405745257275088548364400416034343698169045028065740367, - 54592886416181402, - 10498845181243245, - 7673258612433743, - 26723911824134286, - 42935634111301393, - 21888242871839275222246405745257275088548364400416034343698189310038155307900, - 21888242871839275222246405745257275088548364400416034343698154278037642663823, - 21888242871839275222246405745257275088548364400416034343698199261048607051220, - 21888242871839275222246405745257275088548364400416034343698164554830232127510, - 21888242871839275222246405745257275088548364400416034343698139049204758077012, - 21888242871839275222246405745257275088548364400416034343698199251459836755538, - 21888242871839275222246405745257275088548364400416034343698149933937445160146, - 21888242871839275222246405745257275088548364400416034343698140473058908596447, - 21888242871839275222246405745257275088548364400416034343698151742206512846906, - 21888242871839275222246405745257275088548364400416034343698136751828429768131, - 23666560260563583, - 21888242871839275222246405745257275088548364400416034343698158318524072887989, - 9432618026124854, - 21888242871839275222246405745257275088548364400416034343698190861493080085791, - 21888242871839275222246405745257275088548364400416034343698161909198113463591, - 21888242871839275222246405745257275088548364400416034343698152295030902775462, - 21888242871839275222246405745257275088548364400416034343698171962379617711976, - 21888242871839275222246405745257275088548364400416034343698180858320828581830, - 17369515576119608, - 21888242871839275222246405745257275088548364400416034343698197721014977129503, - 21888242871839275222246405745257275088548364400416034343698136972654279773197, - 63661022220915256, - 21888242871839275222246405745257275088548364400416034343698145990731915308093, - 27024663913701233, - 21888242871839275222246405745257275088548364400416034343698170033956521019772, - 21888242871839275222246405745257275088548364400416034343698153309012761663817, - 24548743517532692, - 59097099610188231, - 21888242871839275222246405745257275088548364400416034343698164877602409900856, - 32198431205012149, - 21888242871839275222246405745257275088548364400416034343698184133857738354838, - 21888242871839275222246405745257275088548364400416034343698133305502103151952, - 21888242871839275222246405745257275088548364400416034343698192340099431029071, - 11534649940023753, - 21888242871839275222246405745257275088548364400416034343698183199943903335159, - 62724918776179693, - 12060672352427835, - 59749528575973564, - 21888242871839275222246405745257275088548364400416034343698188867987356694264, - 33761937005782458, - 22892623978903073, - 21223219883090062, - 21903237691654891, - 21888242871839275222246405745257275088548364400416034343698203459238957531717, - 21888242871839275222246405745257275088548364400416034343698183063219139092791, - 21888242871839275222246405745257275088548364400416034343698157430627383093966, - 61998536068839202, - 43882169949496539, - 51102311534066080, - 21888242871839275222246405745257275088548364400416034343698163354482699737564, - 21888242871839275222246405745257275088548364400416034343698194464708456648076, - 7431913209282624, - 21888242871839275222246405745257275088548364400416034343698146819438778155601, - 21888242871839275222246405745257275088548364400416034343698187044263237403352, - 21888242871839275222246405745257275088548364400416034343698203520168585960451, - 21888242871839275222246405745257275088548364400416034343698154063488355981685, - 26034624143659568, - 50222039712772709, - 21888242871839275222246405745257275088548364400416034343698153264437564735739, - 21888242871839275222246405745257275088548364400416034343698159889349134841159, - 21888242871839275222246405745257275088548364400416034343698149799823800008620, - 29796332229841460, - 30663229398177988, - 21888242871839275222246405745257275088548364400416034343698192928482487745640, - 37208848495355317, - 21888242871839275222246405745257275088548364400416034343698151708730336346801, - 21888242871839275222246405745257275088548364400416034343698193777185175444275, - 21888242871839275222246405745257275088548364400416034343698165713189693639370, - 21888242871839275222246405745257275088548364400416034343698200315054935299098, - 21888242871839275222246405745257275088548364400416034343698173170570071794064, - 21160747286207869, - 18522037689531783, - 21888242871839275222246405745257275088548364400416034343698202711755642850052, - 45821620181528326, - 21888242871839275222246405745257275088548364400416034343698133528297095261527, - 21888242871839275222246405745257275088548364400416034343698148403808847616126, - 37667357314095136, - 21888242871839275222246405745257275088548364400416034343698156803981763694901, - 52541858580310802, - 58596923741287197, - 4223409216644564, - 21888242871839275222246405745257275088548364400416034343698164017750970861617, - 22923672725108831, - 21909848328175593, - 21888242871839275222246405745257275088548364400416034343698189615148124906680, - 49831484071249078, - 21888242871839275222246405745257275088548364400416034343698140929815557028861, - 21888242871839275222246405745257275088548364400416034343698192423478894147044, - 21888242871839275222246405745257275088548364400416034343698186058355719379027, - 69093172219779927, - 21888242871839275222246405745257275088548364400416034343698185969330884453304, - 4999812866546827, - 21888242871839275222246405745257275088548364400416034343698146325884723771406, - 70028839536853859, - 3961603536487470, - 21888242871839275222246405745257275088548364400416034343698145705651705029054, - 21888242871839275222246405745257275088548364400416034343698181371145346831836, - 21888242871839275222246405745257275088548364400416034343698183104864188660336, - 21888242871839275222246405745257275088548364400416034343698186052011223015749, - 21888242871839275222246405745257275088548364400416034343698157858503966763844, - 1819533252448350, - 21576610121809435, - 21888242871839275222246405745257275088548364400416034343698190268966214890574, - 31293002838755958, - 21888242871839275222246405745257275088548364400416034343698136960316732278499, - 66325430371934816, - 67148397950625278, - 21888242871839275222246405745257275088548364400416034343698191593994831175905, - 21888242871839275222246405745257275088548364400416034343698148535223378935609, - 21888242871839275222246405745257275088548364400416034343698168482828852671722, - 21888242871839275222246405745257275088548364400416034343698172421091621178420, - 21888242871839275222246405745257275088548364400416034343698203379232754944507, - 21888242871839275222246405745257275088548364400416034343698146762456106915810, - 45414887831542786, - 21888242871839275222246405745257275088548364400416034343698146237650529220718, - 21888242871839275222246405745257275088548364400416034343698194486460110962359, - 21888242871839275222246405745257275088548364400416034343698162652709863309990, - 21888242871839275222246405745257275088548364400416034343698168654662910018188, - 21834114694706893, - 21888242871839275222246405745257275088548364400416034343698140950774520335253, - 21888242871839275222246405745257275088548364400416034343698142081767731575119, - 56592348711696039, - 21888242871839275222246405745257275088548364400416034343698172855908687771139, - 21888242871839275222246405745257275088548364400416034343698194936950140046295, - 21888242871839275222246405745257275088548364400416034343698189043139820867469, - 21888242871839275222246405745257275088548364400416034343698160829619293361627, - 21888242871839275222246405745257275088548364400416034343698198824493911327151, - 25116967912406439, - 21888242871839275222246405745257275088548364400416034343698169756742832998250, - 53165965473228136, - 955679059266261, - 21888242871839275222246405745257275088548364400416034343698203596294424351740, - 21888242871839275222246405745257275088548364400416034343698132799442799192575, - 17850773017073967, - 21888242871839275222246405745257275088548364400416034343698184306527756557686, - 52437652855655692, - 21888242871839275222246405745257275088548364400416034343698189254859295109653, - 22389397607817359, - 21888242871839275222246405745257275088548364400416034343698193545216931149627, - 21888242871839275222246405745257275088548364400416034343698190656881293264460, - 21888242871839275222246405745257275088548364400416034343698142246799994260384, - 5247430687884189, - 53782263383302273, - 70456405521368774, - 21888242871839275222246405745257275088548364400416034343698197718080470721744, - 21888242871839275222246405745257275088548364400416034343698156884726395324627, - 21888242871839275222246405745257275088548364400416034343698197467834535454502, - 41958449062914697, - 21888242871839275222246405745257275088548364400416034343698200013859870668237, - 21888242871839275222246405745257275088548364400416034343698173228181137880637, - 21888242871839275222246405745257275088548364400416034343698176557381415597428, - 21888242871839275222246405745257275088548364400416034343698132576777154467331, - 21888242871839275222246405745257275088548364400416034343698174960257284146190, - 13832878095638537, - 70742214297166211, - 21888242871839275222246405745257275088548364400416034343698135850778926542691, - 21888242871839275222246405745257275088548364400416034343698174538699634951419, - 45067088268589187, - 3790423346112284, - 32540949545036236, - 21888242871839275222246405745257275088548364400416034343698174743343280721026, - 21015685894237633, - 40219442358288882, - 21888242871839275222246405745257275088548364400416034343698174056484423893870, - 7742780658858660, - 21888242871839275222246405745257275088548364400416034343698190786549242918865, - 2480272149441814, - 29866924980031490, - 21888242871839275222246405745257275088548364400416034343698150859594092617912, - 59778384048420571, - 21888242871839275222246405745257275088548364400416034343698182905013459335590, - 21888242871839275222246405745257275088548364400416034343698182050679684274903, - 21888242871839275222246405745257275088548364400416034343698164046313545919004, - 11787053787855393, - 65996016771405557, - 21888242871839275222246405745257275088548364400416034343698172842501272080825, - 41331483055310096, - 15538659015340717, - 21888242871839275222246405745257275088548364400416034343698182841666180424098, - 59402329946546461, - 41597687586656152, - 21888242871839275222246405745257275088548364400416034343698159132534740864843, - 71526991688667796, - 6392208556329204, - 21461384599898641, - 30593261958673131, - 60141553949707441, - 33297338413686593, - 62984862964773479, - 21888242871839275222246405745257275088548364400416034343698138813381715320303, - 21888242871839275222246405745257275088548364400416034343698185945572567657465, - 51396102083719208, - 21888242871839275222246405745257275088548364400416034343698179077563153297594, - 21888242871839275222246405745257275088548364400416034343698176196990064624849, - 2678589015247017, - 67570005910248115, - 25434668835511294, - 21888242871839275222246405745257275088548364400416034343698186203294559894266, - 70627934445587670, - 46011641270030134, - 4877298476863718, - 21888242871839275222246405745257275088548364400416034343698172672864453169378, - 69223406039290432, - 21888242871839275222246405745257275088548364400416034343698190975514736752358, - 21888242871839275222246405745257275088548364400416034343698189562441893656988, - 21888242871839275222246405745257275088548364400416034343698202999190332603153, - 21888242871839275222246405745257275088548364400416034343698187895021130109283, - 12058512250675260, - 21888242871839275222246405745257275088548364400416034343698148240699407465937, - 21888242871839275222246405745257275088548364400416034343698190885320428731965, - 25734710891641248, - 21888242871839275222246405745257275088548364400416034343698187105626482319546, - 21888242871839275222246405745257275088548364400416034343698157153898429672815, - 21888242871839275222246405745257275088548364400416034343698177261157445135913, - 21888242871839275222246405745257275088548364400416034343698176920337795769591, - 21888242871839275222246405745257275088548364400416034343698182529656166846928, - 65350780633458110, - 25739525204181395, - 21888242871839275222246405745257275088548364400416034343698200660653762024803, - 38152461595384645, - 32769284414874955, - 8119183658116020, - 56895565897194323, - 33660880838714612, - 21888242871839275222246405745257275088548364400416034343698143078385859084080, - 21888242871839275222246405745257275088548364400416034343698158742314937127136, - 21888242871839275222246405745257275088548364400416034343698146415032449045175, - 21888242871839275222246405745257275088548364400416034343698176162726683089034, - 21888242871839275222246405745257275088548364400416034343698137182464588937132, - 10811111073086715, - 7798262048909319, - 21888242871839275222246405745257275088548364400416034343698169848346436961302, - 6201481865815069, - 861634119302389, - 21888242871839275222246405745257275088548364400416034343698195914243186442799, - 21888242871839275222246405745257275088548364400416034343698165637134807739820, - 5599056880446352, - 21888242871839275222246405745257275088548364400416034343698152373887342194100, - 21888242871839275222246405745257275088548364400416034343698163111310937749815, - 21888242871839275222246405745257275088548364400416034343698168407040561419105, - 53724484502543195, - 21888242871839275222246405745257275088548364400416034343698142814378378115270, - 21888242871839275222246405745257275088548364400416034343698197398255192800869, - 54917160565326093, - 21888242871839275222246405745257275088548364400416034343698166243846009702596, - 21888242871839275222246405745257275088548364400416034343698141748288939225203, - 65087607119519757, - 21888242871839275222246405745257275088548364400416034343698167220692965687604, - 40483270865415572, - 21888242871839275222246405745257275088548364400416034343698187607055374975336, - 31980974978096069, - 21888242871839275222246405745257275088548364400416034343698151938426547871026, - 21888242871839275222246405745257275088548364400416034343698189314171293737582, - 21888242871839275222246405745257275088548364400416034343698193791960497564257, - 6712848639096666, - 21888242871839275222246405745257275088548364400416034343698189504195868551269, - 21888242871839275222246405745257275088548364400416034343698182231936373312827, - 24080123474252237, - 41848793900520657, - 20578308308349462, - 59030858576222443, - 16641547984529942, - 58392287894908027, - 25466955294919097, - 21888242871839275222246405745257275088548364400416034343698173690617477178013, - 65738057538723832, - 21888242871839275222246405745257275088548364400416034343698149851638893924424, - 21888242871839275222246405745257275088548364400416034343698147894043967847245, - 21888242871839275222246405745257275088548364400416034343698182314574103134453, - 60889601977227557, - 21888242871839275222246405745257275088548364400416034343698177329695442201140, - 26318441430348009, - 21888242871839275222246405745257275088548364400416034343698183609175337386513, - 61443008315969022, - 21888242871839275222246405745257275088548364400416034343698169025979809462354, - 21888242871839275222246405745257275088548364400416034343698188796981325414102, - 21888242871839275222246405745257275088548364400416034343698137970475385649836, - 22292693800847846, - 19628511379284951, - 21888242871839275222246405745257275088548364400416034343698148023930816653955, - 21888242871839275222246405745257275088548364400416034343698160447437767234134, - 21888242871839275222246405745257275088548364400416034343698175927309875313303, - 18730729701603971, - 21888242871839275222246405745257275088548364400416034343698165015497200024199, - 21888242871839275222246405745257275088548364400416034343698201193303063029190, - 8109593454500296, - 21888242871839275222246405745257275088548364400416034343698136120758065670896, - 21888242871839275222246405745257275088548364400416034343698153298038949506345, - 36835716354774463, - 32382207315815822, - 21888242871839275222246405745257275088548364400416034343698179996242015913605, - 21888242871839275222246405745257275088548364400416034343698185916308675009903, - 21888242871839275222246405745257275088548364400416034343698201086170049848874, - 24951980812128153, - 21888242871839275222246405745257275088548364400416034343698148765917873221727, - 21888242871839275222246405745257275088548364400416034343698170857887780617826, - 35045824955336127, - 21888242871839275222246405745257275088548364400416034343698201981599886368114, - 33881234297580213, - 21815228014218868, - 26743174159640620, - 926965691112397, - 13668979796191874, - 49985208678675445, - 21888242871839275222246405745257275088548364400416034343698135359692116661303, - 21888242871839275222246405745257275088548364400416034343698179794672580895554, - 21888242871839275222246405745257275088548364400416034343698193783449411831783, - 21888242871839275222246405745257275088548364400416034343698163074017594723427, - 14016031169138006, - 66893537434092094, - 21888242871839275222246405745257275088548364400416034343698152268276989455089, - 21888242871839275222246405745257275088548364400416034343698190389639857859507, - 21888242871839275222246405745257275088548364400416034343698184757940384718734, - 60920932245920850, - 21888242871839275222246405745257275088548364400416034343698183813658996582388, - 21888242871839275222246405745257275088548364400416034343698188732485124829435, - 24489770991411055, - 32565302341008344, - 13392291393009780, - 21888242871839275222246405745257275088548364400416034343698185960310814235664, - 2531362120011028, - 13213854952518287, - 43119860626478521, - 21888242871839275222246405745257275088548364400416034343698169584659031655398, - 22472931538856583, - 59791634320785646, - 14568430879847178, - 46044605557356020, - 67720815609522489, - 21888242871839275222246405745257275088548364400416034343698150058316075652988, - 36146609971604286, - 21888242871839275222246405745257275088548364400416034343698137411199494881472, - 42755090866473444, - 21888242871839275222246405745257275088548364400416034343698185011770974912108, - 40591022289270280, - 21888242871839275222246405745257275088548364400416034343698155596794057516477, - 21888242871839275222246405745257275088548364400416034343698169533458764304986, - 21888242871839275222246405745257275088548364400416034343698160004871244226733, - 21888242871839275222246405745257275088548364400416034343698153136421154196115, - 28656592570189367, - 51331941404975731, - 21888242871839275222246405745257275088548364400416034343698196411439590746381, - 21888242871839275222246405745257275088548364400416034343698166906210100220532, - 60819045612952500, - 20242626756626850, - 21888242871839275222246405745257275088548364400416034343698138092837496256099, - 10645786113048361, - 22361263303673524, - 55059076410092639, - 39522785686653100, - 55946597202566013, - 21888242871839275222246405745257275088548364400416034343698178855453711546167, - 2787341558670014, - 21888242871839275222246405745257275088548364400416034343698160915035911008472, - 30344450334123682, - 21888242871839275222246405745257275088548364400416034343698163074680160028424, - 21888242871839275222246405745257275088548364400416034343698179650988519069777, - 20916295743488491, - 27918407435271002, - 21888242871839275222246405745257275088548364400416034343698185177673982407058, - 21888242871839275222246405745257275088548364400416034343698158872221814712564, - 37943038261285623, - 4285155099444772, - 21888242871839275222246405745257275088548364400416034343698203564122977064014, - 21888242871839275222246405745257275088548364400416034343698188006503307129849, - 21888242871839275222246405745257275088548364400416034343698132509274299241624, - 21888242871839275222246405745257275088548364400416034343698185657706214271864, - 21888242871839275222246405745257275088548364400416034343698172628995017748288, - 43967481928349852, - 27085699458294623, - 21888242871839275222246405745257275088548364400416034343698176103383376158250, - 21888242871839275222246405745257275088548364400416034343698190828840628440063, - 21888242871839275222246405745257275088548364400416034343698154661075876377197, - 61990936431016179, - 21888242871839275222246405745257275088548364400416034343698196232150645434962, - 21888242871839275222246405745257275088548364400416034343698202380665414270953, - 21888242871839275222246405745257275088548364400416034343698180039990930565528, - 21888242871839275222246405745257275088548364400416034343698196880287105883331, - 46042794440116202, - 21888242871839275222246405745257275088548364400416034343698203360522941581191, - 39473281909676843, - 21888242871839275222246405745257275088548364400416034343698168910093307782775, - 21888242871839275222246405745257275088548364400416034343698159629691613248412, - 68623752704744710, - 21888242871839275222246405745257275088548364400416034343698179591516081759165, - 65336907594019919, - 4917471230387896, - 18496534217440939, - 52744998111541216, - 17275893101507804, - 21888242871839275222246405745257275088548364400416034343698140989421226744194, - 21476293013224021, - 21888242871839275222246405745257275088548364400416034343698157929970608376745, - 21888242871839275222246405745257275088548364400416034343698138325563564363122, - 8428551532120390, - 31516057564867008, - 32249573329051079, - 21888242871839275222246405745257275088548364400416034343698139086093811685233, - 21888242871839275222246405745257275088548364400416034343698162496961924197127, - 6925198990001671, - 21888242871839275222246405745257275088548364400416034343698173323364567854375, - 21888242871839275222246405745257275088548364400416034343698196518887634332754, - 21888242871839275222246405745257275088548364400416034343698135764745717970400, - 63406316431243204, - 21888242871839275222246405745257275088548364400416034343698149799777255354034, - 21888242871839275222246405745257275088548364400416034343698199831784087686297, - 21888242871839275222246405745257275088548364400416034343698141644063303141234, - 21888242871839275222246405745257275088548364400416034343698156824706795224492, - 611956688301252, - 10801578558453724, - 21888242871839275222246405745257275088548364400416034343698148103077232652721, - 21888242871839275222246405745257275088548364400416034343698146264644710643153, - 21888242871839275222246405745257275088548364400416034343698190556212112466970, - 21888242871839275222246405745257275088548364400416034343698145943261952193492, - 8169498910298418, - 21888242871839275222246405745257275088548364400416034343698163948129296686455, - 21888242871839275222246405745257275088548364400416034343698202920670399611651, - 21888242871839275222246405745257275088548364400416034343698160174605730866637, - 21888242871839275222246405745257275088548364400416034343698197125905029942273, - 41173695056811730, - 45561641008709493, - 21888242871839275222246405745257275088548364400416034343698160983997535893997, - 21888242871839275222246405745257275088548364400416034343698198251953617349989, - 52766991452579944, - 26215276531365769, - 46803688174714977, - 21888242871839275222246405745257275088548364400416034343698154879577033571375, - 21888242871839275222246405745257275088548364400416034343698192723315415446051, - 21888242871839275222246405745257275088548364400416034343698132671907455826354, - 21023562548809711, - 884825737161209, - 32508067173776534, - 38676259207869478, - 67754615134336102, - 19620185470983331, - 56263205744000962, - 36036877305882260, - 11437772478625523, - 21888242871839275222246405745257275088548364400416034343698156231198532853074, - 45803147395289453, - 44217614946905495, - 28529717763075972, - 21888242871839275222246405745257275088548364400416034343698134370909712834933, - 59537318472388754, - 55538641765268163, - 21888242871839275222246405745257275088548364400416034343698192656710601437006, - 9292395676649205, - 64097977634220214, - 31368041704398700, - 21888242871839275222246405745257275088548364400416034343698192411713610500220, - 2460810823651410, - 38434525162655199, - 21888242871839275222246405745257275088548364400416034343698167016352989816309, - 21888242871839275222246405745257275088548364400416034343698157943877727533873, - 21888242871839275222246405745257275088548364400416034343698146816395568916096, - 21888242871839275222246405745257275088548364400416034343698151847150080106625, - 21888242871839275222246405745257275088548364400416034343698164604931681080650, - 21888242871839275222246405745257275088548364400416034343698174678967322923515, - 21888242871839275222246405745257275088548364400416034343698168108801109370781, - 1933658942404659, - 61201671906501366, - 22118180943044753, - 35135169812725758, - 1423952497734624, - 21888242871839275222246405745257275088548364400416034343698188979302007545380, - 21888242871839275222246405745257275088548364400416034343698194430001133635140, - 21888242871839275222246405745257275088548364400416034343698137327498783276634, - 50640275715356560, - 21888242871839275222246405745257275088548364400416034343698184392320198901204, - 14758014528684326, - 21888242871839275222246405745257275088548364400416034343698187253550297746590, - 46283451462626589, - 68008306073840292, - 38438197311924631, - 46600990385769263, - 2673845867004264, - 3157704245416235, - 21888242871839275222246405745257275088548364400416034343698148630350134502809, - 21888242871839275222246405745257275088548364400416034343698193892823215399280, - 60720243588176517, - 21888242871839275222246405745257275088548364400416034343698178816895811543106, - 21888242871839275222246405745257275088548364400416034343698192448577504359617, - 21888242871839275222246405745257275088548364400416034343698188042393048326253, - 64000084707849799, - 50545852042144312, - 21888242871839275222246405745257275088548364400416034343698132543409495907231, - 21888242871839275222246405745257275088548364400416034343698200649091864869131, - 21888242871839275222246405745257275088548364400416034343698145694717790029664, - 21888242871839275222246405745257275088548364400416034343698192240325963920843, - 35242283221482280, - 21888242871839275222246405745257275088548364400416034343698155491633614399604, - 43738882847216025, - 37605447058880704, - 21888242871839275222246405745257275088548364400416034343698174788174014299394, - 56727872980177590, - 67713837824170361, - 21888242871839275222246405745257275088548364400416034343698162320533925016369, - 71519535197905391, - 21888242871839275222246405745257275088548364400416034343698195951081771653029, - 21888242871839275222246405745257275088548364400416034343698173788898698101787, - 21888242871839275222246405745257275088548364400416034343698170945951500849098, - 21888242871839275222246405745257275088548364400416034343698188934069732049389, - 21888242871839275222246405745257275088548364400416034343698174980986977048469, - 58882528231120859, - 63217647224982178, - 21888242871839275222246405745257275088548364400416034343698196920924608052525, - 56944781408712058, - 63856601198350871, - 21888242871839275222246405745257275088548364400416034343698146112163117140209, - 33499565732382805, - 24988346561516281, - 21888242871839275222246405745257275088548364400416034343698137393920379251878, - 21888242871839275222246405745257275088548364400416034343698176053348117133586, - 30383653361714725, - 1323679055419334, - 57493740864471803, - 21165456836237456, - 18149518416303582, - 21888242871839275222246405745257275088548364400416034343698169474988742841434, - 21888242871839275222246405745257275088548364400416034343698191494354013000965, - 28660527974913091, - 28304085087920955, - 21888242871839275222246405745257275088548364400416034343698168580492550616479, - 67235835422360793, - 18941714207050410, - 21888242871839275222246405745257275088548364400416034343698143319778210913338, - 21888242871839275222246405745257275088548364400416034343698145229501467672043, - 39359131588546149, - 21888242871839275222246405745257275088548364400416034343698191044431210121846, - 25274812410009110, - 39220868962364120, - 21888242871839275222246405745257275088548364400416034343698157240151657284985, - 21888242871839275222246405745257275088548364400416034343698187613557490704564, - 63810360131110678, - 21888242871839275222246405745257275088548364400416034343698151200919229162207, - 21888242871839275222246405745257275088548364400416034343698138512764324490517, - 21888242871839275222246405745257275088548364400416034343698177562300897419453, - 18472105450695675, - 21888242871839275222246405745257275088548364400416034343698195515641258254237, - 54909776792183979, - 61119691520732544, - 21888242871839275222246405745257275088548364400416034343698157941458335682123, - 39194817036519232, - 31668031318606895, - 21888242871839275222246405745257275088548364400416034343698159374005507306119, - 44183870821639169, - 36012469109539846, - 65682245808808931, - 21888242871839275222246405745257275088548364400416034343698199669723058510932, - 21888242871839275222246405745257275088548364400416034343698133643657154650006, - 69510145178964461, - 41765395465605781, - 19133368881358551, - 21888242871839275222246405745257275088548364400416034343698167398988954190987, - 71736878116674163, - 21888242871839275222246405745257275088548364400416034343698151873325784747076, - 21888242871839275222246405745257275088548364400416034343698175409355620759677, - 21888242871839275222246405745257275088548364400416034343698150819601893376588, - 19825280202480938, - 38045485049179271, - 21888242871839275222246405745257275088548364400416034343698160502065093433626, - 41315045771915482, - 21888242871839275222246405745257275088548364400416034343698201540880294409240, - 21888242871839275222246405745257275088548364400416034343698159554016957096990, - 21888242871839275222246405745257275088548364400416034343698195096195085550475, - 3828071975504468, - 9879957778152499, - 21888242871839275222246405745257275088548364400416034343698173340090563814778, - 21888242871839275222246405745257275088548364400416034343698180796565108323013, - 21888242871839275222246405745257275088548364400416034343698186833352388523324, - 21888242871839275222246405745257275088548364400416034343698194566959225819559, - 21888242871839275222246405745257275088548364400416034343698186854068608862549, - 60843737204368942, - 21888242871839275222246405745257275088548364400416034343698150433297454406896, - 12141044806050, - 21888242871839275222246405745257275088548364400416034343698191376882188272169, - 21888242871839275222246405745257275088548364400416034343698192474301086096755, - 21888242871839275222246405745257275088548364400416034343698173499536235724992, - 56867195233768882, - 21888242871839275222246405745257275088548364400416034343698199440374992909734, - 66645788719300817, - 21888242871839275222246405745257275088548364400416034343698145177129280974323, - 21888242871839275222246405745257275088548364400416034343698190398320363622880, - 19874959228356537, - 21888242871839275222246405745257275088548364400416034343698198838181855692662, - 21888242871839275222246405745257275088548364400416034343698198784660684651701, - 15125723467028063, - 21888242871839275222246405745257275088548364400416034343698202069021764451219, - 58959438851244223, - 52401336834015491, - 21888242871839275222246405745257275088548364400416034343698164270661562683471, - 21888242871839275222246405745257275088548364400416034343698195478959981506790, - 21888242871839275222246405745257275088548364400416034343698200174242635405385, - 60519244174358674, - 3209914303530466, - 21888242871839275222246405745257275088548364400416034343698164015735816469836, - 41186987250595116, - 21888242871839275222246405745257275088548364400416034343698154078974447149966, - 21888242871839275222246405745257275088548364400416034343698183979416982431667, - 21888242871839275222246405745257275088548364400416034343698148708219056999151, - 59149541434577599, - 53156044751661677, - 21888242871839275222246405745257275088548364400416034343698200595948304467395, - 21888242871839275222246405745257275088548364400416034343698140506421084336362, - 21888242871839275222246405745257275088548364400416034343698162409577462837831, - 21888242871839275222246405745257275088548364400416034343698137708490658152850, - 17949475747106911, - 21888242871839275222246405745257275088548364400416034343698170095442217883594, - 6754024695010175, - 21888242871839275222246405745257275088548364400416034343698144955817216426992, - 21888242871839275222246405745257275088548364400416034343698147352196598658520, - 15995882878688933, - 21888242871839275222246405745257275088548364400416034343698175942356270477053, - 49322158345776783, - 21888242871839275222246405745257275088548364400416034343698152185230541900452, - 15585608677404117, - 21888242871839275222246405745257275088548364400416034343698169691413691623667, - 55493570638704195, - 68782681380364078, - 50601459127630174, - 44592690196678286, - 21888242871839275222246405745257275088548364400416034343698140540014616813034, - 10950152548624756, - 21888242871839275222246405745257275088548364400416034343698159494062798688689, - 62951673049102242, - 35631348864228104, - 50937224748594407, - 4401099365330634, - 21888242871839275222246405745257275088548364400416034343698176110849691034214, - 21888242871839275222246405745257275088548364400416034343698158028763019174666, - 21182091003895610, - 21888242871839275222246405745257275088548364400416034343698199988999953087054, - 44091454182478820, - 21888242871839275222246405745257275088548364400416034343698177935584631745496, - 21888242871839275222246405745257275088548364400416034343698183219621316942686, - 60290277634418683, - 40973175786981273, - 16233829200760182, - 21888242871839275222246405745257275088548364400416034343698161548013826740830, - 21888242871839275222246405745257275088548364400416034343698172994859056076576, - 21888242871839275222246405745257275088548364400416034343698195822312725348343, - 56727222257841168, - 6926709017336239, - 34576181219088018, - 26993511345871361, - 50545466790917371, - 69728456291644503, - 21888242871839275222246405745257275088548364400416034343698188801929759920446, - 2691085821257578, - 58375608046755220, - 43322425209981105, - 21888242871839275222246405745257275088548364400416034343698141157658486173404, - 21888242871839275222246405745257275088548364400416034343698148109464292411328, - 4100572990383953, - 21888242871839275222246405745257275088548364400416034343698188004108992087231, - 21888242871839275222246405745257275088548364400416034343698159658306674591383, - 65649753101541905, - 64659841588473371, - 21888242871839275222246405745257275088548364400416034343698161592637437400816, - 21888242871839275222246405745257275088548364400416034343698144173667997349266, - 21888242871839275222246405745257275088548364400416034343698150786278350273285, - 21888242871839275222246405745257275088548364400416034343698137880662479791299, - 21888242871839275222246405745257275088548364400416034343698196939678650736328, - 20569680750068163, - 21888242871839275222246405745257275088548364400416034343698184694024946979032, - 6968117871445749, - 21888242871839275222246405745257275088548364400416034343698146681210548376644, - 18418254572519373, - 21887135310724028, - 61875718480584001, - 31836320183874110, - 21888242871839275222246405745257275088548364400416034343698160862573834077409, - 32013103474401942, - 67802788282221299, - 53537486745608999, - 69510528203290655, - 21888242871839275222246405745257275088548364400416034343698175641167000346025, - 21888242871839275222246405745257275088548364400416034343698197149027236944704, - 23583151828255149, - 21888242871839275222246405745257275088548364400416034343698189039784279071630, - 21888242871839275222246405745257275088548364400416034343698184635990816503903, - 41012729362597623, - 57857372207334734, - 21888242871839275222246405745257275088548364400416034343698162030580015914750, - 21888242871839275222246405745257275088548364400416034343698194639926528248214, - 21888242871839275222246405745257275088548364400416034343698141617903413892439, - 4122354946755395, - 27462694328022735, - 21888242871839275222246405745257275088548364400416034343698134519675483356652, - 21888242871839275222246405745257275088548364400416034343698198978518454224209, - 59041332209004955, - 21888242871839275222246405745257275088548364400416034343698151696606767009900, - 5029746307775578, - 21888242871839275222246405745257275088548364400416034343698192739166439655448, - 21888242871839275222246405745257275088548364400416034343698200600467380609044, - 21888242871839275222246405745257275088548364400416034343698191476225187192448, - 71535029158076987, - 21888242871839275222246405745257275088548364400416034343698149228112945289517, - 16918969426038454, - 6916859767648216, - 21888242871839275222246405745257275088548364400416034343698167571904536272521, - 31480487269682594, - 21888242871839275222246405745257275088548364400416034343698144490322845993717, - 24151261675313905, - 60126042052375244, - 68895477564870664, - 4761441936506325, - 46422161994224703, - 21888242871839275222246405745257275088548364400416034343698172644065620401488, - 23428377627218092, - 2229375687772940, - 25883930423695040, - 21888242871839275222246405745257275088548364400416034343698139169023857447219, - 37390081546162651, - 70075829432681737, - 21888242871839275222246405745257275088548364400416034343698198741975248084260, - 21888242871839275222246405745257275088548364400416034343698189806857468564735, - 35183835864118132, - 42246286655014889, - 17470909291489153, - 31265326940634874, - 21888242871839275222246405745257275088548364400416034343698170801895852701222, - 18287995584293386, - 21888242871839275222246405745257275088548364400416034343698179227074094577205, - 21888242871839275222246405745257275088548364400416034343698188471421878949834, - 21888242871839275222246405745257275088548364400416034343698185203109337780372, - 39399471458072579, - 21888242871839275222246405745257275088548364400416034343698171039221448924297, - 21888242871839275222246405745257275088548364400416034343698132275353811749934, - 24650828633344577, - 62435573001337957, - 56238030184223695, - 51602048101912331, - 21888242871839275222246405745257275088548364400416034343698167894160396179560, - 70395916485826296, - 21888242871839275222246405745257275088548364400416034343698177461322305463344, - 21888242871839275222246405745257275088548364400416034343698138225009333243362, - 41596027684712753, - 67438955877010701, - 30726310755084002, - 21888242871839275222246405745257275088548364400416034343698203874606286697675, - 21888242871839275222246405745257275088548364400416034343698178357794174520190, - 11453406674312991, - 23273719043370281, - 68228853707409136, - 21888242871839275222246405745257275088548364400416034343698190591001037819682, - 21888242871839275222246405745257275088548364400416034343698185294224749996494, - 21888242871839275222246405745257275088548364400416034343698185264816503208000, - 21888242871839275222246405745257275088548364400416034343698140468232330834762, - 21888242871839275222246405745257275088548364400416034343698198740438216910801, - 64462771771903976, - 70166161318589960, - 21888242871839275222246405745257275088548364400416034343698164953324534672870, - 21888242871839275222246405745257275088548364400416034343698146212174502491688, - 21888242871839275222246405745257275088548364400416034343698135075314630625907, - 21888242871839275222246405745257275088548364400416034343698140238383586229325, - 1906342957368091, - 21888242871839275222246405745257275088548364400416034343698173311260951883200, - 25387434704703383, - 21888242871839275222246405745257275088548364400416034343698183703441601555502, - 50426315352621671, - 21888242871839275222246405745257275088548364400416034343698179450504628970813, - 71482797666697776, - 63731847982809966, - 70171664332649533, - 21888242871839275222246405745257275088548364400416034343698138467685549846327, - 21888242871839275222246405745257275088548364400416034343698145533958123699466, - 27124120366587444, - 71881566379385679, - 64661848481577680, - 17993648478581763, - 21888242871839275222246405745257275088548364400416034343698200537836039634820, - 14486454047964327, - 21888242871839275222246405745257275088548364400416034343698181268462423766492, - 66753652724645225, - 54782923774196692, - 57353226142895274, - 21888242871839275222246405745257275088548364400416034343698201819743692853527, - 21888242871839275222246405745257275088548364400416034343698202362799874379667, - 21888242871839275222246405745257275088548364400416034343698143364987454977351, - 21888242871839275222246405745257275088548364400416034343698143673141728333683, - 21888242871839275222246405745257275088548364400416034343698171995519996582215, - 21888242871839275222246405745257275088548364400416034343698184967864262929731, - 21888242871839275222246405745257275088548364400416034343698179123203722656775, - 62933740829563554, - 14348895373243051, - 21888242871839275222246405745257275088548364400416034343698188796658510112009, - 21888242871839275222246405745257275088548364400416034343698173342901185475211, - 13591226558149755, - 8498248623215360, - 40615366235274101, - 21888242871839275222246405745257275088548364400416034343698152487185005192873, - 56947104374468061, - 21888242871839275222246405745257275088548364400416034343698155725024337165253, - 45993663787041327, - 8571486988127685, - 14229514451334607, - 21888242871839275222246405745257275088548364400416034343698149539979138081087, - 46280550177297682, - 30785597302585678, - 21888242871839275222246405745257275088548364400416034343698148612269730267034, - 21888242871839275222246405745257275088548364400416034343698171105636068086754, - 21888242871839275222246405745257275088548364400416034343698134259854549704516, - 21888242871839275222246405745257275088548364400416034343698147662529977293265, - 65922321579760681, - 21888242871839275222246405745257275088548364400416034343698158328821183604828, - 14380733855251616, - 21888242871839275222246405745257275088548364400416034343698154810093855878949, - 21888242871839275222246405745257275088548364400416034343698182306062699097585, - 58894675233826037, - 21888242871839275222246405745257275088548364400416034343698154750488617071897, - 11608064606088694, - 21888242871839275222246405745257275088548364400416034343698158457310320584519, - 21888242871839275222246405745257275088548364400416034343698170689453663143430, - 8180250649128358, - 21888242871839275222246405745257275088548364400416034343698204147641487906356, - 40709930346375106, - 39088122125997190, - 21888242871839275222246405745257275088548364400416034343698156344126079234790, - 70576909804329416, - 28143177579761085, - 48718051476215162, - 46600430265081800, - 21888242871839275222246405745257275088548364400416034343698198666957670202131, - 18740286198884891, - 11406403214437898, - 34573597239616426, - 24570078487285799, - 49588619912998001, - 19642461952151461, - 5468846833617995, - 21888242871839275222246405745257275088548364400416034343698193849807952261129, - 21888242871839275222246405745257275088548364400416034343698195473803869957105, - 21888242871839275222246405745257275088548364400416034343698193027048820152347, - 21888242871839275222246405745257275088548364400416034343698173959559066321859, - 21888242871839275222246405745257275088548364400416034343698184482784833005906, - 12830523410621285, - 65494459442023217, - 57864812804512781, - 63522747475887432, - 29666376142598946, - 12348336069495428, - 21888242871839275222246405745257275088548364400416034343698202371232403315143, - 21888242871839275222246405745257275088548364400416034343698164800228908294587, - 40031986289935488, - 43445832048972742, - 10392246783984353, - 18361976272548631, - 21888242871839275222246405745257275088548364400416034343698168820802267856979, - 21888242871839275222246405745257275088548364400416034343698171679527461502895, - 27190943613234733, - 21888242871839275222246405745257275088548364400416034343698155006146817747857, - 62181282893983781, - 54216129208292260, - 8883912593335282, - 53733589395957827, - 14878119542443771, - 21888242871839275222246405745257275088548364400416034343698172195618687298028, - 67492542001201532, - 21888242871839275222246405745257275088548364400416034343698196147767274184550, - 52770539607352987, - 67088032023766847, - 21888242871839275222246405745257275088548364400416034343698147757333795134737, - 47076822169502726, - 10937810035370965, - 21888242871839275222246405745257275088548364400416034343698178387891439852127, - 21888242871839275222246405745257275088548364400416034343698152798427953377718, - 21888242871839275222246405745257275088548364400416034343698142772037888106162, - 8654653923434933, - 21888242871839275222246405745257275088548364400416034343698176893264437718910, - 18193097177770455, - 21888242871839275222246405745257275088548364400416034343698160739599736030753, - 7051586425965166, - 30287965209800376, - 21888242871839275222246405745257275088548364400416034343698136929288143627416, - 6712877908749213, - 21888242871839275222246405745257275088548364400416034343698176530309835210121, - 21888242871839275222246405745257275088548364400416034343698139930308136092250, - 10447302051273173, - 21888242871839275222246405745257275088548364400416034343698156691748867335919, - 21888242871839275222246405745257275088548364400416034343698141070958110106218, - 21888242871839275222246405745257275088548364400416034343698164336631450907999, - 46111166235222714, - 21888242871839275222246405745257275088548364400416034343698177234378421855116, - 56346586525497612, - 17125447684428467, - 43087294056139272, - 44976894916772348, - 67296473299714468, - 21888242871839275222246405745257275088548364400416034343698147885719789628686, - 37857715343239666, - 21888242871839275222246405745257275088548364400416034343698162377700657563309, - 46147192596026657, - 33603349211589623, - 38123156269349766, - 39504107024903350, - 21888242871839275222246405745257275088548364400416034343698197700757559667176, - 8489402664326767, - 18995767422818699, - 21888242871839275222246405745257275088548364400416034343698154903048235566749, - 21888242871839275222246405745257275088548364400416034343698132858873470936429, - 29390147230980787, - 21888242871839275222246405745257275088548364400416034343698199030201983229866, - 21888242871839275222246405745257275088548364400416034343698133966924980412698, - 62423353698564866, - 47260607905640879, - 21888242871839275222246405745257275088548364400416034343698159049375337025508, - 57563738170968996, - 61439432204704246, - 53205582798218880, - 21888242871839275222246405745257275088548364400416034343698134036951063936468, - 21888242871839275222246405745257275088548364400416034343698142110561720280813, - 21888242871839275222246405745257275088548364400416034343698155165365953652833, - 21888242871839275222246405745257275088548364400416034343698190169519655409808, - 21888242871839275222246405745257275088548364400416034343698137472480936233404, - 66260783350530565, - 15334532275441128, - 21888242871839275222246405745257275088548364400416034343698194687956188637691, - 70848754937034279, - 21888242871839275222246405745257275088548364400416034343698136945069133821478, - 7292853832618370, - 2664764876084010, - 21888242871839275222246405745257275088548364400416034343698186254675024555149, - 21888242871839275222246405745257275088548364400416034343698169371187338960820, - 37176292639718081, - 15888672154599985, - 21888242871839275222246405745257275088548364400416034343698173155864554362833, - 21888242871839275222246405745257275088548364400416034343698149823199263795634, - 21888242871839275222246405745257275088548364400416034343698167885872392895094, - 26206438821416689, - 21888242871839275222246405745257275088548364400416034343698197437585772740880, - 61699555338121326, - 58802970594887854, - 21888242871839275222246405745257275088548364400416034343698197092589749154021, - 12434267791097116, - 21888242871839275222246405745257275088548364400416034343698180345716319574857, - 21888242871839275222246405745257275088548364400416034343698202417598470465699, - 21888242871839275222246405745257275088548364400416034343698180595506873030448, - 21888242871839275222246405745257275088548364400416034343698198128211668917270, - 6196939714097681, - 21888242871839275222246405745257275088548364400416034343698156356286737105666, - 21888242871839275222246405745257275088548364400416034343698174679074457476809, - 21888242871839275222246405745257275088548364400416034343698147223604481590687, - 21888242871839275222246405745257275088548364400416034343698195907893103621060, - 52946091377442695, - 67496602336500509, - 64101030966391821, - 43442204676074766, - 27764716510390746, - 21888242871839275222246405745257275088548364400416034343698153794794156855551, - 21888242871839275222246405745257275088548364400416034343698132695574377492371, - 21888242871839275222246405745257275088548364400416034343698148596636189416878, - 21888242871839275222246405745257275088548364400416034343698156488928486644040, - 21888242871839275222246405745257275088548364400416034343698135008479413781890, - 21888242871839275222246405745257275088548364400416034343698157741494489896957, - 56149066921125723, - 33383692161220177, - 21888242871839275222246405745257275088548364400416034343698192994779128219862, - 46327998105606457, - 21888242871839275222246405745257275088548364400416034343698140755838998091176, - 49622623435600960, - 39056742388114998, - 21888242871839275222246405745257275088548364400416034343698203394855326274639, - 28878725572300129, - 21888242871839275222246405745257275088548364400416034343698175450548462620160, - 13227941778332868, - 50453132657277822, - 21888242871839275222246405745257275088548364400416034343698150226012418043428, - 21888242871839275222246405745257275088548364400416034343698186978110148958785, - 14599311028427712, - 27469065830850958, - 21888242871839275222246405745257275088548364400416034343698190849322088031023, - 10025523974699972, - 53089488996379564, - 43264409820918931, - 10056440910811955, - 21888242871839275222246405745257275088548364400416034343698179164258149739205, - 472667408665462, - 21888242871839275222246405745257275088548364400416034343698156969254262064202, - 21888242871839275222246405745257275088548364400416034343698157490025918650646, - 37888875308403936, - 21888242871839275222246405745257275088548364400416034343698138821744679364662, - 21888242871839275222246405745257275088548364400416034343698145166822014693983, - 21888242871839275222246405745257275088548364400416034343698134747411121823386, - 64805865142663655, - 21888242871839275222246405745257275088548364400416034343698171481880920253108, - 21888242871839275222246405745257275088548364400416034343698183853201222939801, - 32527714246599440, - 21888242871839275222246405745257275088548364400416034343698190349444851146549, - 687296438949890, - 54043482475703461, - 21888242871839275222246405745257275088548364400416034343698198787771279593908, - 37166247659750974, - 13783587074024495, - 12904985492280614, - 57242909193023150, - 21888242871839275222246405745257275088548364400416034343698149213823386730979, - 21888242871839275222246405745257275088548364400416034343698182068401203038599, - 24907589852409711, - 21888242871839275222246405745257275088548364400416034343698160138202621539904, - 60490594709637943, - 21888242871839275222246405745257275088548364400416034343698159728110353647623, - 38408012099799224, - 61429868052636637, - 21888242871839275222246405745257275088548364400416034343698153718429101791740, - 21888242871839275222246405745257275088548364400416034343698184748837451052801, - 47388103514337188, - 21511809187889383, - 703306692859469, - 59118394872894100, - 21888242871839275222246405745257275088548364400416034343698163815340307014767, - 34477657906113508, - 19691726622886079, - 48304987787344388, - 21888242871839275222246405745257275088548364400416034343698181319075734340927, - 21888242871839275222246405745257275088548364400416034343698204149810046854009, - 21888242871839275222246405745257275088548364400416034343698162610208088795169, - 28899133554390192, - 30181089440519198, - 42628634528471422, - 21888242871839275222246405745257275088548364400416034343698186411351081704842, - 21888242871839275222246405745257275088548364400416034343698175725754330264453, - 21888242871839275222246405745257275088548364400416034343698142709059989770624, - 34026112540764544, - 52456280286183387, - 1815284304128435, - 69711246912221237, - 64958280325192644, - 12709516005452643, - 35598855647329799, - 21888242871839275222246405745257275088548364400416034343698196537576030462618, - 3754745853437995, - 21888242871839275222246405745257275088548364400416034343698162275010702554209, - 39411399837127317, - 27566941006888132, - 41048730606064138, - 22840164692521662, - 3422756537937856, - 21888242871839275222246405745257275088548364400416034343698189021027793674176, - 21888242871839275222246405745257275088548364400416034343698147236689128736875, - 21888242871839275222246405745257275088548364400416034343698166308570611783153, - 21888242871839275222246405745257275088548364400416034343698163983186863097114, - 21888242871839275222246405745257275088548364400416034343698191865141713583356, - 21888242871839275222246405745257275088548364400416034343698176181082224981611, - 27536595700425367, - 21888242871839275222246405745257275088548364400416034343698194307223579586954, - 21888242871839275222246405745257275088548364400416034343698199565999209656447, - 21888242871839275222246405745257275088548364400416034343698153783964411411946, - 21888242871839275222246405745257275088548364400416034343698152231027132982558, - 8793202989018629, - 21888242871839275222246405745257275088548364400416034343698183229757709673599, - 21888242871839275222246405745257275088548364400416034343698178116039879298110, - 7277745820294279, - 21888242871839275222246405745257275088548364400416034343698177004048278802522, - 9845235629998114, - 54833759189796229, - 48247177622446036, - 51185405085325890, - 21888242871839275222246405745257275088548364400416034343698178027404094697672, - 21888242871839275222246405745257275088548364400416034343698157575979554471492, - 65551802626532396, - 21888242871839275222246405745257275088548364400416034343698135812083084939185, - 2678870520369229, - 21888242871839275222246405745257275088548364400416034343698167057157837584742, - 21888242871839275222246405745257275088548364400416034343698138112823882208038, - 14064168991605592, - 35133494819529172, - 21888242871839275222246405745257275088548364400416034343698165051524889830608, - 21888242871839275222246405745257275088548364400416034343698136489040583876079, - 28755995290841727, - 9095644981958610, - 2998456982079738, - 33515117476570289, - 35769642330810188, - 21888242871839275222246405745257275088548364400416034343698192665620630844004, - 21888242871839275222246405745257275088548364400416034343698155682132338417718, - 64679883205256006, - 55762789468366938, - 21888242871839275222246405745257275088548364400416034343698155441206933920398, - 3636981595686603, - 32188743114108633, - 3374813895993887, - 21888242871839275222246405745257275088548364400416034343698181230988140332005, - 21888242871839275222246405745257275088548364400416034343698170602998457934238, - 21888242871839275222246405745257275088548364400416034343698179922942591055082, - 27483795078025673, - 37264732343137527, - 61292744005414170, - 71626140043750474, - 21888242871839275222246405745257275088548364400416034343698188860467024137958, - 21888242871839275222246405745257275088548364400416034343698187617128442839492, - 21888242871839275222246405745257275088548364400416034343698160932707211960228, - 21888242871839275222246405745257275088548364400416034343698147245232691236250, - 45684236519847588, - 14220473831420785, - 56749004098592099, - 21888242871839275222246405745257275088548364400416034343698200547061910454302, - 38281289660248193, - 49032102154111837, - 21888242871839275222246405745257275088548364400416034343698182755812955048915, - 46632309034525247, - 21888242871839275222246405745257275088548364400416034343698170927308113380665, - 14468713318049404, - 21888242871839275222246405745257275088548364400416034343698189741040001441555, - 21888242871839275222246405745257275088548364400416034343698165919645418105359, - 21888242871839275222246405745257275088548364400416034343698141480032019438270, - 21888242871839275222246405745257275088548364400416034343698203063108399694657, - 21888242871839275222246405745257275088548364400416034343698160692815834811728, - 44654894061937012, - 8671748119650862, - 21888242871839275222246405745257275088548364400416034343698163009215076017722, - 1432267480028933, - 13705892043880495, - 11563779867049903, - 15426643242725153, - 35508623061398682, - 64865911892188054, - 21888242871839275222246405745257275088548364400416034343698139147264788591575, - 21888242871839275222246405745257275088548364400416034343698145421858772922171, - 45926619894350980, - 21888242871839275222246405745257275088548364400416034343698140666537835183800, - 62728703974392128, - 21888242871839275222246405745257275088548364400416034343698168120604311665175, - 21888242871839275222246405745257275088548364400416034343698172534171077164747, - 21888242871839275222246405745257275088548364400416034343698153820077249103864, - 8160332406341557, - 47972733944319793, - 57680294835534174, - 60882287111503455, - 71548895615083558, - 21888242871839275222246405745257275088548364400416034343698182001484926421625, - 38385624303198953, - 21888242871839275222246405745257275088548364400416034343698147814798786079279, - 31744464030576497, - 57960738723290076, - 67878295408215492, - 12841982995082765, - 22684791945829646, - 21888242871839275222246405745257275088548364400416034343698194304878295767094, - 30981969262481720, - 63703897712414557, - 30507446244203484, - 12573932699651329, - 56504810341967104, - 60538394388087359, - 21888242871839275222246405745257275088548364400416034343698163801004458562901, - 65631514018785288, - 21888242871839275222246405745257275088548364400416034343698179065889163329187, - 21888242871839275222246405745257275088548364400416034343698139935854595993842, - 21888242871839275222246405745257275088548364400416034343698140490048798762265, - 6972756877281222, - 21888242871839275222246405745257275088548364400416034343698164010581556498217, - 21888242871839275222246405745257275088548364400416034343698188414860015307843, - 6357932894195521, - 21888242871839275222246405745257275088548364400416034343698191269518726231672, - 21888242871839275222246405745257275088548364400416034343698154173207571002659, - 48973780117657162, - 21888242871839275222246405745257275088548364400416034343698137609015999140947, - 30596069983767049, - 54396613038722924, - 21888242871839275222246405745257275088548364400416034343698174886563239900275, - 21888242871839275222246405745257275088548364400416034343698197729020138139540, - 55793638311285166, - 21888242871839275222246405745257275088548364400416034343698186726822863906140, - 27175791653660180, - 21888242871839275222246405745257275088548364400416034343698174192639612686173, - 21888242871839275222246405745257275088548364400416034343698142218315697846635, - 21888242871839275222246405745257275088548364400416034343698180018229757695347, - 20894876822590736, - 21888242871839275222246405745257275088548364400416034343698164298420287510261, - 54045716079286191, - 72007619658736785, - 21888242871839275222246405745257275088548364400416034343698155679276456715651, - 21888242871839275222246405745257275088548364400416034343698156358190036202247, - 21888242871839275222246405745257275088548364400416034343698166025456362767953, - 21888242871839275222246405745257275088548364400416034343698165332289732049066, - 38639202321731139, - 65582194564744056, - 58248123788040598, - 21888242871839275222246405745257275088548364400416034343698162914319692055182, - 49455517506551663, - 21888242871839275222246405745257275088548364400416034343698135387405972723829, - 21888242871839275222246405745257275088548364400416034343698198310055497560874, - 21888242871839275222246405745257275088548364400416034343698175700210257484613, - 21888242871839275222246405745257275088548364400416034343698169603891446822384, - 28831002511874933, - 22290662531207991, - 43717461441838076, - 21888242871839275222246405745257275088548364400416034343698176307092141077591, - 21888242871839275222246405745257275088548364400416034343698147816274393589871, - 21888242871839275222246405745257275088548364400416034343698149921676743495364, - 21888242871839275222246405745257275088548364400416034343698134444181375597670, - 49670025953496332, - 15207106078126222, - 21888242871839275222246405745257275088548364400416034343698134471470304050701, - 21888242871839275222246405745257275088548364400416034343698186671071475618449, - 21888242871839275222246405745257275088548364400416034343698144750531645503591, - 53567812946687619, - 21888242871839275222246405745257275088548364400416034343698165069685329819044, - 21888242871839275222246405745257275088548364400416034343698175415089388868840, - 21888242871839275222246405745257275088548364400416034343698143280155364258331, - 21888242871839275222246405745257275088548364400416034343698184532846349262352, - 20399639841791348, - 19052450252186871, - 63134581099860275, - 46007845775422003, - 1745612878299286, - 60959885250484017, - 21888242871839275222246405745257275088548364400416034343698153896288276166953, - 36667691962047326, - 41676595748216008, - 11950584402243603, - 21888242871839275222246405745257275088548364400416034343698158102732024730256, - 21888242871839275222246405745257275088548364400416034343698167810908305398784, - 2873789229726297, - 50433656176515361, - 21888242871839275222246405745257275088548364400416034343698174804856661998351, - 46969877360036394, - 3970492507662350, - 21888242871839275222246405745257275088548364400416034343698145113018228593691, - 41137099613725198, - 15260619806961139, - 50249388536797613, - 36037625541639733, - 20422924223829683, - 21888242871839275222246405745257275088548364400416034343698187802882711144129, - 8703102102905949, - 21888242871839275222246405745257275088548364400416034343698143676662471197853, - 21888242871839275222246405745257275088548364400416034343698134552648344703436, - 15093027011724130, - 21888242871839275222246405745257275088548364400416034343698156360771621103202, - 23227947644488151, - 22003330941423287, - 54171054278525224, - 21888242871839275222246405745257275088548364400416034343698166059398433229306, - 21888242871839275222246405745257275088548364400416034343698148406868369255349, - 12049824882821914, - 31472785937880595, - 17088123231491466, - 30843019262206773, - 21888242871839275222246405745257275088548364400416034343698202969597893954879, - 68122111343453492, - 36925209935671046, - 21888242871839275222246405745257275088548364400416034343698175538239763079309, - 37261465111607063, - 21888242871839275222246405745257275088548364400416034343698161192814461423139, - 46911291766490658, - 16918619453788412, - 11546737196557829, - 25155138136046959, - 39091710956850137, - 21888242871839275222246405745257275088548364400416034343698142686351090064103, - 15867340331540852, - 21888242871839275222246405745257275088548364400416034343698172225785416245765, - 21888242871839275222246405745257275088548364400416034343698191139453594360282, - 8772894565589020, - 21888242871839275222246405745257275088548364400416034343698138559434596714230, - 21888242871839275222246405745257275088548364400416034343698201223315214913122, - 21888242871839275222246405745257275088548364400416034343698203095794860119471, - 21888242871839275222246405745257275088548364400416034343698165928114648351778, - 39635194827675697, - 21888242871839275222246405745257275088548364400416034343698190008386827652386, - 28935071740843463, - 21888242871839275222246405745257275088548364400416034343698151296511974566894, - 3566885253970762, - 21888242871839275222246405745257275088548364400416034343698201672443232069340, - 21888242871839275222246405745257275088548364400416034343698133081051732983842, - 21888242871839275222246405745257275088548364400416034343698185142228509808205, - 9979066822532753, - 50311303266518314, - 54792245929345647, - 21888242871839275222246405745257275088548364400416034343698144131260060362016, - 41339004439707557, - 21930541787430483, - 21888242871839275222246405745257275088548364400416034343698143305456221222703, - 33694370589088387, - 21888242871839275222246405745257275088548364400416034343698199109230375032541, - 21888242871839275222246405745257275088548364400416034343698188382160320804905, - 21888242871839275222246405745257275088548364400416034343698188019337448789936, - 7566286600678903, - 33172907395280249, - 21888242871839275222246405745257275088548364400416034343698181529034159514645, - 35171725398402875, - 21888242871839275222246405745257275088548364400416034343698195346617607478442, - 21888242871839275222246405745257275088548364400416034343698198443388045154188, - 58861133321263141, - 21888242871839275222246405745257275088548364400416034343698187567817254997878, - 37397289662566861, - 18431260147813900, - 21888242871839275222246405745257275088548364400416034343698154046521277399399, - 21888242871839275222246405745257275088548364400416034343698193253331916709167, - 12163393563427553, - 21888242871839275222246405745257275088548364400416034343698164444009988760645, - 59501846958314968, - 21888242871839275222246405745257275088548364400416034343698165283482370077178, - 21888242871839275222246405745257275088548364400416034343698177677755654553604, - 40901175738179375, - 45527209939399828, - 21888242871839275222246405745257275088548364400416034343698148092795867625551, - 21888242871839275222246405745257275088548364400416034343698171112964857187066, - 21888242871839275222246405745257275088548364400416034343698161624794051089018, - 62789771595046660, - 21888242871839275222246405745257275088548364400416034343698196861622535274200, - 21055577525219251, - 16691539232701660, - 52638215409348639, - 15341245191570615, - 21888242871839275222246405745257275088548364400416034343698135647285546460796, - 38894000934654427, - 25415036325543079, - 4394711056911684, - 21888242871839275222246405745257275088548364400416034343698196481251124482870, - 58980186326654335, - 21888242871839275222246405745257275088548364400416034343698158734497940032888, - 48710076317112294, - 25991044305942946, - 21888242871839275222246405745257275088548364400416034343698152391916272678903, - 71461287868152280, - 9314727754831288, - 21888242871839275222246405745257275088548364400416034343698186592488752107981, - 21888242871839275222246405745257275088548364400416034343698143653737082651693, - 70404891819623494, - 55156786671185964, - 18770149220363800, - 21888242871839275222246405745257275088548364400416034343698167098284703500541, - 21888242871839275222246405745257275088548364400416034343698186496093041018504, - 21888242871839275222246405745257275088548364400416034343698203396710640065961, - 11974767517297927, - 21888242871839275222246405745257275088548364400416034343698148652249475484372, - 21888242871839275222246405745257275088548364400416034343698166761222126636518, - 47887476928374503, - 21888242871839275222246405745257275088548364400416034343698154508688036352048, - 21888242871839275222246405745257275088548364400416034343698176103409979386175, - 21888242871839275222246405745257275088548364400416034343698162135549207647159, - 41167122610313960, - 21888242871839275222246405745257275088548364400416034343698172684390727573240, - 40209962657201742, - 33045727626962909, - 18807260542488073, - 21888242871839275222246405745257275088548364400416034343698136360061876207841, - 58269772826622301, - 19294487035014461, - 62349810833140239, - 43365340335507464, - 17052976385045002, - 31515594895167105, - 59362481060675624, - 42583141095401856, - 21888242871839275222246405745257275088548364400416034343698180218054273769936, - 10370274857245518, - 27460882035612924, - 21888242871839275222246405745257275088548364400416034343698134917153342169333, - 12946641129536093, - 21888242871839275222246405745257275088548364400416034343698176139377011904993, - 21888242871839275222246405745257275088548364400416034343698202054328177215456, - 44514024662639401, - 58879254417687353, - 38449877308162388, - 19053153010620297, - 25006154815988574, - 21888242871839275222246405745257275088548364400416034343698174382720346460757, - 8503689137863008, - 21888242871839275222246405745257275088548364400416034343698199252420980476637, - 21888242871839275222246405745257275088548364400416034343698175213463325097945, - 21888242871839275222246405745257275088548364400416034343698186713289651582842, - 21888242871839275222246405745257275088548364400416034343698193876758182843590, - 21888242871839275222246405745257275088548364400416034343698193185985866377929, - 21888242871839275222246405745257275088548364400416034343698144750159022152783, - 21888242871839275222246405745257275088548364400416034343698143430702597517356, - 21913780402338551, - 55780250426891110, - 56618515740197095, - 60784563139491364, - 54119638510031071, - 16691554474961641, - 22240730152881973, - 21888242871839275222246405745257275088548364400416034343698134001260339246704, - 48444707554524429, - 1504449910432321, - 21888242871839275222246405745257275088548364400416034343698145067819545453881, - 21888242871839275222246405745257275088548364400416034343698176367106070766070, - 21888242871839275222246405745257275088548364400416034343698185682904755867512, - 21888242871839275222246405745257275088548364400416034343698180112683229747389, - 21888242871839275222246405745257275088548364400416034343698166437589465379362, - 27732823288722148, - 7146890082241048, - 21888242871839275222246405745257275088548364400416034343698170185394450565526, - 3432578339145158, - 21888242871839275222246405745257275088548364400416034343698178581395063659720, - 35796662543225569, - 12168200811699365, - 8241231605899555, - 32816012886347480, - 21888242871839275222246405745257275088548364400416034343698142042703547555424, - 59105580970636586, - 21888242871839275222246405745257275088548364400416034343698135232063389404732, - 50273013447935984, - 51247884868707476, - 21888242871839275222246405745257275088548364400416034343698161451241093481059, - 21888242871839275222246405745257275088548364400416034343698162417856428345402, - 21888242871839275222246405745257275088548364400416034343698184443475110742050, - 7253413261521933, - 21888242871839275222246405745257275088548364400416034343698157751897223594574, - 67680063411187501, - 21888242871839275222246405745257275088548364400416034343698141130048303988331, - 35712562216075962, - 21888242871839275222246405745257275088548364400416034343698178683976356087395, - 21888242871839275222246405745257275088548364400416034343698152136094711233510, - 66378538359901687, - 21888242871839275222246405745257275088548364400416034343698200471573567440116, - 31229395187587071, - 21888242871839275222246405745257275088548364400416034343698147857459848759400, - 21888242871839275222246405745257275088548364400416034343698173579974905605818, - 52069786266833920, - 64789997577740582, - 13499524392764135, - 1760015362722699, - 21888242871839275222246405745257275088548364400416034343698186608107632516017, - 21888242871839275222246405745257275088548364400416034343698149779627948870563, - 14550908522493740, - 9854964117800944, - 37012021654821105, - 21888242871839275222246405745257275088548364400416034343698191859849910606227, - 66462311380637994, - 49797137261987466, - 33245930715515601, - 21888242871839275222246405745257275088548364400416034343698152737615201950683, - 21888242871839275222246405745257275088548364400416034343698173076074058594065, - 21888242871839275222246405745257275088548364400416034343698201493949930109098, - 21888242871839275222246405745257275088548364400416034343698155183310906562203, - 21888242871839275222246405745257275088548364400416034343698134193532581005157, - 21888242871839275222246405745257275088548364400416034343698176981461806077942, - 66960265431114755, - 21888242871839275222246405745257275088548364400416034343698190846964933771517, - 23472451485086851, - 20387359900634559, - 593852054432826, - 2200117999304811, - 16183369116043430, - 21888242871839275222246405745257275088548364400416034343698175891002324802800, - 63511164133716051, - 21888242871839275222246405745257275088548364400416034343698154069650914477980, - 40374518302060013, - 21888242871839275222246405745257275088548364400416034343698198475394525517087, - 21888242871839275222246405745257275088548364400416034343698196787392117478261, - 51675826191867061, - 44878091328622748, - 21888242871839275222246405745257275088548364400416034343698198452864458295704, - 21888242871839275222246405745257275088548364400416034343698178438451103292882, - 21888242871839275222246405745257275088548364400416034343698137599231034098776, - 3432464220204443, - 21888242871839275222246405745257275088548364400416034343698195452951013470071, - 21888242871839275222246405745257275088548364400416034343698173069117297848943, - 51966087117109913, - 21888242871839275222246405745257275088548364400416034343698185010599940789787, - 51579466412377676, - 21888242871839275222246405745257275088548364400416034343698200416268289897789, - 21888242871839275222246405745257275088548364400416034343698164423700937387601, - 41881608313585970, - 21888242871839275222246405745257275088548364400416034343698204098652261705340, - 25722613934094943, - 18835841235576992, - 21888242871839275222246405745257275088548364400416034343698142198403232327919, - 4947037461537175, - 21888242871839275222246405745257275088548364400416034343698193989298988975726, - 53302419852984611, - 44702861226244115, - 30104081827077850, - 26991442079295158, - 21888242871839275222246405745257275088548364400416034343698197178372861659557, - 1770158028788440, - 21888242871839275222246405745257275088548364400416034343698162764051452439880, - 61445221330353126, - 10792081968893536, - 21888242871839275222246405745257275088548364400416034343698173799762496653447, - 33862581645641597, - 63052065361038300, - 29619799528195125, - 21888242871839275222246405745257275088548364400416034343698149302968689688627, - 21888242871839275222246405745257275088548364400416034343698182746517056113319, - 15670506831920738, - 21888242871839275222246405745257275088548364400416034343698143683287556095759, - 24342150771847818, - 63462291373719383, - 21888242871839275222246405745257275088548364400416034343698133380158651493423, - 71465783076766667, - 21888242871839275222246405745257275088548364400416034343698159230901379127349, - 68333177519040672, - 71417719303374238, - 12928055454034191, - 35102658234229110, - 70215337543451974, - 27701192673010696, - 21888242871839275222246405745257275088548364400416034343698148985562180552765, - 21888242871839275222246405745257275088548364400416034343698162261391555029803, - 45875926669188459, - 21888242871839275222246405745257275088548364400416034343698178822231296418447, - 21888242871839275222246405745257275088548364400416034343698170454555297949931, - 48767548348191150, - 21888242871839275222246405745257275088548364400416034343698191652863275595625, - 21888242871839275222246405745257275088548364400416034343698195638806880144539, - 41116610600465653, - 21888242871839275222246405745257275088548364400416034343698137941454110752415, - 62799069019170171, - 56695038696643213, - 21888242871839275222246405745257275088548364400416034343698148825613137003481, - 21888242871839275222246405745257275088548364400416034343698169487038089662214, - 21888242871839275222246405745257275088548364400416034343698143334143942902079, - 21888242871839275222246405745257275088548364400416034343698178462055842212465, - 65364444094056317, - 38393424700631139, - 46734247528166388, - 53134955318864622, - 21888242871839275222246405745257275088548364400416034343698143900448908611197, - 21888242871839275222246405745257275088548364400416034343698167215620056535230, - 21888242871839275222246405745257275088548364400416034343698157187998891258161, - 49134515195852555, - 31071829959094261, - 56168036770708907, - 21888242871839275222246405745257275088548364400416034343698160822112670894175, - 57346634228773471, - 21888242871839275222246405745257275088548364400416034343698143955818592115315, - 59082963590307346, - 2543447952600760, - 21888242871839275222246405745257275088548364400416034343698193427665111796614, - 21888242871839275222246405745257275088548364400416034343698190490068054892380, - 21888242871839275222246405745257275088548364400416034343698168723060067833179, - 10988891770943100, - 33570671903885997, - 16483998278346268, - 31917240300929272, - 21888242871839275222246405745257275088548364400416034343698145058275363041528, - 35650143911076278, - 10806807481870990, - 14813745356481604, - 31069557470626673, - 63720774407922645, - 21888242871839275222246405745257275088548364400416034343698176904104137125347, - 69978948340536628, - 55578407996984711, - 21888242871839275222246405745257275088548364400416034343698198720160620191705, - 21888242871839275222246405745257275088548364400416034343698164436081809566369, - 51223478537529149, - 64257678184199084, - 21888242871839275222246405745257275088548364400416034343698176577406225645204, - 4953663894860657, - 42269835285062990, - 21888242871839275222246405745257275088548364400416034343698199718705602674731, - 16922129236377714, - 9993362530007990, - 55350348428579088, - 21888242871839275222246405745257275088548364400416034343698181432152892173664, - 22791589816043419, - 45476707827456472, - 6940301530592856, - 21888242871839275222246405745257275088548364400416034343698181892641247070270, - 57050444146694491, - 37333270157132787, - 21888242871839275222246405745257275088548364400416034343698199484545896769833, - 54012977961664322, - 50360891575546243, - 71424221036745411, - 67174095874042816, - 72055904477465005, - 21888242871839275222246405745257275088548364400416034343698149152806533272842, - 20550052366606966, - 21888242871839275222246405745257275088548364400416034343698195462183073919159, - 20927220251603428, - 21888242871839275222246405745257275088548364400416034343698160156247119630925, - 21379269801824568, - 70194246418972519, - 21888242871839275222246405745257275088548364400416034343698186920710692581775, - 19679786953064164, - 21888242871839275222246405745257275088548364400416034343698144639727047154916, - 8169979599118880, - 21888242871839275222246405745257275088548364400416034343698185760997048890452, - 61825629639020970, - 21888242871839275222246405745257275088548364400416034343698170525264261414027, - 59284142126242845, - 39955623804605565, - 7896185049294343, - 21888242871839275222246405745257275088548364400416034343698172954654566421803, - 21888242871839275222246405745257275088548364400416034343698134627957276706040, - 39126353339342858, - 5391317462736892, - 35942711622317085, - 59176796306809871, - 21888242871839275222246405745257275088548364400416034343698181047963105556071, - 65504219828531844, - 21888242871839275222246405745257275088548364400416034343698177880732288239852, - 21888242871839275222246405745257275088548364400416034343698151605899646351273, - 41284244234419820, - 45686323095256097, - 39653200025145974, - 38305407300044353, - 3747786327382815, - 22486946156054988, - 21888242871839275222246405745257275088548364400416034343698165187162405908455, - 63037194369060953, - 21888242871839275222246405745257275088548364400416034343698136417944919542698, - 21888242871839275222246405745257275088548364400416034343698202010090989461579, - 50085955758814075, - 54936384396879584, - 21888242871839275222246405745257275088548364400416034343698182256533271894684, - 21888242871839275222246405745257275088548364400416034343698203876054211160192, - 21888242871839275222246405745257275088548364400416034343698135311026900916316, - 21888242871839275222246405745257275088548364400416034343698170302569476263429, - 21888242871839275222246405745257275088548364400416034343698136299808627825951, - 60638765100068641, - 63147777077195006, - 21888242871839275222246405745257275088548364400416034343698156969010170505927, - 14311484095541817, - 21888242871839275222246405745257275088548364400416034343698150301291180029587, - 21888242871839275222246405745257275088548364400416034343698143069398740333585, - 21888242871839275222246405745257275088548364400416034343698170704910585530331, - 21888242871839275222246405745257275088548364400416034343698184546095181198682, - 21888242871839275222246405745257275088548364400416034343698188187040470853589, - 21888242871839275222246405745257275088548364400416034343698177231022927709887, - 21888242871839275222246405745257275088548364400416034343698184281226693640055, - 31544707660934974, - 21888242871839275222246405745257275088548364400416034343698162200107682215738, - 31601664359300251, - 66792865831061285, - 21888242871839275222246405745257275088548364400416034343698172860700601023559, - 66060422168133982, - 21888242871839275222246405745257275088548364400416034343698171811406630986590, - 21888242871839275222246405745257275088548364400416034343698149072638436892022, - 36972725108009190, - 36008249256681950, - 21888242871839275222246405745257275088548364400416034343698134968157911475751, - 21888242871839275222246405745257275088548364400416034343698171470402587888639, - 40938423814349547, - 19372036527021464, - 65618380477239247, - 46679308354294423, - 48178914604210491, - 21888242871839275222246405745257275088548364400416034343698139924755019911821, - 21888242871839275222246405745257275088548364400416034343698134593756151740383, - 21888242871839275222246405745257275088548364400416034343698175242393346723539, - 40769745463054358, - 21888242871839275222246405745257275088548364400416034343698140612178198357705, - 43760998080744563, - 21888242871839275222246405745257275088548364400416034343698184698659081274547, - 56649687308863051, - 30875114861738827, - 21888242871839275222246405745257275088548364400416034343698195923322151750854, - 60692381912551769, - 24088589077989643, - 42306456024489432, - 21888242871839275222246405745257275088548364400416034343698165641977732566299, - 62429320863885228, - 51578233789303142, - 21888242871839275222246405745257275088548364400416034343698196137056754226376, - 21888242871839275222246405745257275088548364400416034343698144070518352637910, - 21888242871839275222246405745257275088548364400416034343698150354489841227940, - 21888242871839275222246405745257275088548364400416034343698199491874433764886, - 48062811765158142, - 41930354850294978, - 21888242871839275222246405745257275088548364400416034343698136450495428777228, - 21888242871839275222246405745257275088548364400416034343698141301329818715178, - 21888242871839275222246405745257275088548364400416034343698195800537776914153, - 21888242871839275222246405745257275088548364400416034343698177682240027604781, - 13113124517782539, - 60603306678510815, - 21888242871839275222246405745257275088548364400416034343698137594300465936477, - 21888242871839275222246405745257275088548364400416034343698167565845450360095, - 21888242871839275222246405745257275088548364400416034343698165761646862297805, - 21888242871839275222246405745257275088548364400416034343698199350309536250723, - 64890804978994285, - 42549980995055516, - 37477206715377989, - 21888242871839275222246405745257275088548364400416034343698196482656198078784, - 21888242871839275222246405745257275088548364400416034343698155143333492711554, - 21888242871839275222246405745257275088548364400416034343698192595713702748565, - 67395492571076362, - 21888242871839275222246405745257275088548364400416034343698143933536102468675, - 41732784375639111, - 39665438265865916, - 62452392103943024, - 21888242871839275222246405745257275088548364400416034343698168898276431543563, - 21888242871839275222246405745257275088548364400416034343698173816694390824387, - 21888242871839275222246405745257275088548364400416034343698132620648392825301, - 21888242871839275222246405745257275088548364400416034343698202866194756594455, - 50944086875562380, - 21888242871839275222246405745257275088548364400416034343698163696319764295532, - 58055770453220754, - 67155796873318471, - 70411873369452313, - 65860135911604045, - 21888242871839275222246405745257275088548364400416034343698203366298451306484, - 21888242871839275222246405745257275088548364400416034343698173520998413074445, - 17395891834949973, - 12175522010888204, - 32552542065467530, - 32379837061208756, - 55756810735006093, - 1003696720701621, - 21888242871839275222246405745257275088548364400416034343698193224861307725980, - 46280028435252880, - 62149194768129352, - 4378616721043449, - 49492303096824649, - 21888242871839275222246405745257275088548364400416034343698159814101064947733, - 66459388206152724, - 21888242871839275222246405745257275088548364400416034343698180257248236528121, - 13015480099275358, - 21888242871839275222246405745257275088548364400416034343698189383691259980136, - 21888242871839275222246405745257275088548364400416034343698175853423094475126, - 52319544629840367, - 21888242871839275222246405745257275088548364400416034343698150666642782258197, - 49245633778994824, - 22740374384338961, - 21888242871839275222246405745257275088548364400416034343698161492920884756713, - 23855121985371094, - 21888242871839275222246405745257275088548364400416034343698200230475439950830, - 38609719374515236, - 21888242871839275222246405745257275088548364400416034343698183479278725465070, - 21888242871839275222246405745257275088548364400416034343698183517825346389890, - 11453612970769040, - 21888242871839275222246405745257275088548364400416034343698149672998605987905, - 18819907755913588, - 21888242871839275222246405745257275088548364400416034343698193820033184947232, - 38937377286135940, - 21888242871839275222246405745257275088548364400416034343698141834760332919602, - 21888242871839275222246405745257275088548364400416034343698202002462321875936, - 21888242871839275222246405745257275088548364400416034343698139447693859970098, - 21888242871839275222246405745257275088548364400416034343698203448254529195965, - 21888242871839275222246405745257275088548364400416034343698158600294017543958, - 68826496077239858, - 21888242871839275222246405745257275088548364400416034343698202020830153252589, - 12527875428505828, - 21888242871839275222246405745257275088548364400416034343698182501836939359342, - 46343897076666934, - 21888242871839275222246405745257275088548364400416034343698180902573306554988, - 21888242871839275222246405745257275088548364400416034343698169160238802142533, - 55098493519787033, - 51484075698387542, - 69324185351968365, - 21888242871839275222246405745257275088548364400416034343698195979688969043771, - 30730999739611690, - 21888242871839275222246405745257275088548364400416034343698198077658375960757, - 21888242871839275222246405745257275088548364400416034343698174397636043386160, - 9848215052535446, - 21888242871839275222246405745257275088548364400416034343698146926319031179593, - 63159699566680274, - 21888242871839275222246405745257275088548364400416034343698181894709299483745, - 27229123902236616, - 21888242871839275222246405745257275088548364400416034343698142838704038157960, - 21888242871839275222246405745257275088548364400416034343698147925516383824295, - 21888242871839275222246405745257275088548364400416034343698155956905709297973, - 21888242871839275222246405745257275088548364400416034343698148109451839084392, - 20251698780412217, - 42761125299070367, - 21888242871839275222246405745257275088548364400416034343698135278585818331988, - 21888242871839275222246405745257275088548364400416034343698158583666941763335, - 21888242871839275222246405745257275088548364400416034343698134704110470114876, - 23324220062110155, - 62526536225349501, - 48677718747008479, - 21888242871839275222246405745257275088548364400416034343698153946180614062939, - 17363745204744382, - 21888242871839275222246405745257275088548364400416034343698150399952578680677, - 64289520062742500, - 61012735099291011, - 24300278639779739, - 21888242871839275222246405745257275088548364400416034343698193079027476760493, - 24173741188619036, - 26686638201439305, - 34830977369625067, - 21888242871839275222246405745257275088548364400416034343698182050658915430047, - 38760637703734726, - 21888242871839275222246405745257275088548364400416034343698194647637492601612, - 34985630896815485, - 21888242871839275222246405745257275088548364400416034343698203380852014845550, - 28882088589349489, - 17605603311642837, - 60584138896030666, - 21888242871839275222246405745257275088548364400416034343698138650608781169376, - 54503388152401493, - 21888242871839275222246405745257275088548364400416034343698156469239531583626, - 7232654895593703, - 52650263108332616, - 21888242871839275222246405745257275088548364400416034343698187233252761088066, - 21888242871839275222246405745257275088548364400416034343698164439937758126973, - 23403893892804756, - 43930652261372525, - 21888242871839275222246405745257275088548364400416034343698150338132461682528, - 21888242871839275222246405745257275088548364400416034343698194339038848406863, - 29239925634949982, - 21888242871839275222246405745257275088548364400416034343698194299441448431546, - 27214110141306408, - 21888242871839275222246405745257275088548364400416034343698175827066989560874, - 21888242871839275222246405745257275088548364400416034343698180519023122629741, - 31094419339432672, - 51274866535779677, - 21888242871839275222246405745257275088548364400416034343698173521719477864552, - 23711652169429711, - 27175203647696624, - 21951569025597369, - 21888242871839275222246405745257275088548364400416034343698137746197075050511, - 21888242871839275222246405745257275088548364400416034343698202432201601940594, - 21888242871839275222246405745257275088548364400416034343698194998726567047285, - 21888242871839275222246405745257275088548364400416034343698150814641025153440, - 21888242871839275222246405745257275088548364400416034343698160580976879205709, - 21888242871839275222246405745257275088548364400416034343698155472779396890288, - 21888242871839275222246405745257275088548364400416034343698194349474383312244, - 10323934809569515, - 66207374477711233, - 21888242871839275222246405745257275088548364400416034343698179191346571029894, - 27357697554385487, - 21888242871839275222246405745257275088548364400416034343698198540511947049104, - 66120171741369683, - 7569018118089527, - 44581034258900079, - 52020455362929030, - 29940724252043218, - 21888242871839275222246405745257275088548364400416034343698173430288317877010, - 45604179144462829, - 3322855849604762, - 21888242871839275222246405745257275088548364400416034343698134443822130170111, - 21888242871839275222246405745257275088548364400416034343698139376330754094268, - 21888242871839275222246405745257275088548364400416034343698149256405344864204, - 42383356943003581, - 21888242871839275222246405745257275088548364400416034343698171588555437457199, - 21888242871839275222246405745257275088548364400416034343698198135203328017254, - 3855938006117623, - 47453674516233074, - 21888242871839275222246405745257275088548364400416034343698191240444525487233, - 46902630318828510, - 21888242871839275222246405745257275088548364400416034343698138696070790788087, - 21888242871839275222246405745257275088548364400416034343698151518488964888218, - 21888242871839275222246405745257275088548364400416034343698156822583581169345, - 53488763572706010, - 58528373462065889, - 45610789149612084, - 35591211085900635, - 21888242871839275222246405745257275088548364400416034343698156680334336552472, - 39547679345651672, - 16455819077339020, - 47807771669815912, - 21888242871839275222246405745257275088548364400416034343698176749284700420892, - 21888242871839275222246405745257275088548364400416034343698155042561555898257, - 21888242871839275222246405745257275088548364400416034343698194288550286818921, - 21888242871839275222246405745257275088548364400416034343698190571304025453046, - 25937168134029733, - 21888242871839275222246405745257275088548364400416034343698132922431033667500, - 41857444519212068, - 43144468590649103, - 21888242871839275222246405745257275088548364400416034343698200832958824277693, - 21888242871839275222246405745257275088548364400416034343698164041858725528516, - 58318754204999676, - 41022731803498041, - 21888242871839275222246405745257275088548364400416034343698189969802322000994, - 21888242871839275222246405745257275088548364400416034343698136079507844490503, - 21888242871839275222246405745257275088548364400416034343698191087987920545932, - 21888242871839275222246405745257275088548364400416034343698194931420993815577, - 21888242871839275222246405745257275088548364400416034343698145712525067006547, - 70373112445344584, - 21888242871839275222246405745257275088548364400416034343698168980301801326341, - 21888242871839275222246405745257275088548364400416034343698138075211898516026, - 21888242871839275222246405745257275088548364400416034343698183348073026004463, - 64722092160303808, - 21888242871839275222246405745257275088548364400416034343698137699986048808871, - 21888242871839275222246405745257275088548364400416034343698165011563742097935, - 50776074650610762, - 23075463374321462, - 21888242871839275222246405745257275088548364400416034343698164246876836241415, - 23162176637166535, - 21888242871839275222246405745257275088548364400416034343698176097715023723190, - 37037538662013944, - 14353656602137109, - 21888242871839275222246405745257275088548364400416034343698168293405332457675, - 51961043277329050, - 66413915447302459, - 5065385673934031, - 21888242871839275222246405745257275088548364400416034343698163802655715802249, - 21888242871839275222246405745257275088548364400416034343698195096221571539783, - 21888242871839275222246405745257275088548364400416034343698179361421283014459, - 21888242871839275222246405745257275088548364400416034343698150244275605626630, - 58756264148069557, - 21888242871839275222246405745257275088548364400416034343698180383538592722893, - 21888242871839275222246405745257275088548364400416034343698154362453545264488, - 21888242871839275222246405745257275088548364400416034343698141096882099881424, - 21888242871839275222246405745257275088548364400416034343698141252405169542873, - 21888242871839275222246405745257275088548364400416034343698179627424928666117, - 38753898382920793, - 42342329331888898, - 21888242871839275222246405745257275088548364400416034343698191495613495766487, - 67377689123948263, - 3014432373117588, - 19188674705805804, - 21888242871839275222246405745257275088548364400416034343698193168007557869811, - 15466014881375352, - 21888242871839275222246405745257275088548364400416034343698183920841327741340, - 21888242871839275222246405745257275088548364400416034343698132492898510082007, - 19716842480894658, - 21888242871839275222246405745257275088548364400416034343698135348318938749824, - 26602333636693407, - 47734593593487848, - 21888242871839275222246405745257275088548364400416034343698155297954337921913, - 21888242871839275222246405745257275088548364400416034343698140505260141880617, - 21888242871839275222246405745257275088548364400416034343698195169228333835126, - 38610458814910800, - 64690389506078793, - 11184808386016842, - 42143503877878814, - 29066699691535369, - 31819362699020232, - 21888242871839275222246405745257275088548364400416034343698168253591741008138, - 21888242871839275222246405745257275088548364400416034343698155039936006871449, - 21888242871839275222246405745257275088548364400416034343698177713681763854957, - 26994472305288436, - 54841903446975159, - 1271268916946206, - 62392529842544270, - 13001323414907737, - 41357483530549725, - 21888242871839275222246405745257275088548364400416034343698188381873281978134, - 11830508237122703, - 21888242871839275222246405745257275088548364400416034343698171711272946739968, - 21888242871839275222246405745257275088548364400416034343698143432284359651623, - 8897172847520648, - 11752051072721785, - 60397838304625300, - 11878483804926744, - 21888242871839275222246405745257275088548364400416034343698140198684544704091, - 64457778982203709, - 21888242871839275222246405745257275088548364400416034343698147646506070208545, - 21888242871839275222246405745257275088548364400416034343698172360586148750548, - 21888242871839275222246405745257275088548364400416034343698174370728301346129, - 21888242871839275222246405745257275088548364400416034343698152712724189963930, - 21888242871839275222246405745257275088548364400416034343698184994984556535967, - 21888242871839275222246405745257275088548364400416034343698155263628833304583, - 56877233539227412, - 21888242871839275222246405745257275088548364400416034343698169303135038767798, - 21888242871839275222246405745257275088548364400416034343698179837026116035834, - 21888242871839275222246405745257275088548364400416034343698188490596056770184, - 62870716440225306, - 58857976396831799, - 24564468330932725, - 21888242871839275222246405745257275088548364400416034343698138459361999337119, - 21888242871839275222246405745257275088548364400416034343698188753204461043279, - 52625158912037614, - 21888242871839275222246405745257275088548364400416034343698187367921241823711, - 7895712124704309, - 21888242871839275222246405745257275088548364400416034343698132426330170810561, - 24642794672641777, - 21888242871839275222246405745257275088548364400416034343698168130765721145199, - 21888242871839275222246405745257275088548364400416034343698134873709003181923, - 21888242871839275222246405745257275088548364400416034343698198248686961400564, - 34190881517995870, - 34885553804885957, - 21888242871839275222246405745257275088548364400416034343698149155308773849059, - 21888242871839275222246405745257275088548364400416034343698154850685564655220, - 55979414553401460, - 21888242871839275222246405745257275088548364400416034343698171434689149092055, - 21888242871839275222246405745257275088548364400416034343698181655413443165548, - 21888242871839275222246405745257275088548364400416034343698196498440135103309, - 36790443853130308, - 36874951071795828, - 21888242871839275222246405745257275088548364400416034343698179665005594818231, - 51354830298717209, - 21888242871839275222246405745257275088548364400416034343698159350274862261550, - 21888242871839275222246405745257275088548364400416034343698159455425803075422, - 17307203089375577, - 21888242871839275222246405745257275088548364400416034343698168079839008340182, - 55388207151847615, - 21888242871839275222246405745257275088548364400416034343698139477571805118320, - 21888242871839275222246405745257275088548364400416034343698135143389212392603, - 57649641485036326, - 15138220213757345, - 18808421704865927, - 21888242871839275222246405745257275088548364400416034343698145143684154468281, - 37557460630498640, - 25271176045887040, - 21888242871839275222246405745257275088548364400416034343698143636101161580276, - 21888242871839275222246405745257275088548364400416034343698145997915872947815, - 15249788260171557, - 21888242871839275222246405745257275088548364400416034343698171269665102412632, - 21888242871839275222246405745257275088548364400416034343698157026495677595886, - 24783350830816912, - 5394269486063444, - 1924757248808188, - 61806397708118990, - 21888242871839275222246405745257275088548364400416034343698140571269737481480, - 21888242871839275222246405745257275088548364400416034343698173960495428056021, - 21888242871839275222246405745257275088548364400416034343698133174192754836179, - 16490249024769607, - 70619864001827782, - 4926978294224381, - 21888242871839275222246405745257275088548364400416034343698151497956173163100, - 21888242871839275222246405745257275088548364400416034343698139676809160945993, - 59731953165944872, - 21888242871839275222246405745257275088548364400416034343698157487374092156614, - 41825222259306282, - 21888242871839275222246405745257275088548364400416034343698167619851781905564, - 25709763064933297, - 21888242871839275222246405745257275088548364400416034343698141377445471149139, - 21888242871839275222246405745257275088548364400416034343698185660746913499947, - 21888242871839275222246405745257275088548364400416034343698186798859049686502, - 48792820106513862, - 21888242871839275222246405745257275088548364400416034343698193032735265574761, - 26615165869389893, - 21888242871839275222246405745257275088548364400416034343698143747839194216590, - 21888242871839275222246405745257275088548364400416034343698133989871672951457, - 21888242871839275222246405745257275088548364400416034343698151469128055265772, - 12144158265033106, - 21888242871839275222246405745257275088548364400416034343698172920357630458565, - 46146142586474753, - 42280029772076675, - 63023218465313515, - 21888242871839275222246405745257275088548364400416034343698181470370794311114, - 21888242871839275222246405745257275088548364400416034343698184715504605052122, - 26639909383525001, - 21888242871839275222246405745257275088548364400416034343698203384576860685118, - 21888242871839275222246405745257275088548364400416034343698161716249165910972, - 21888242871839275222246405745257275088548364400416034343698139990025714091062, - 13616585052438853, - 21888242871839275222246405745257275088548364400416034343698169902553005827757, - 21888242871839275222246405745257275088548364400416034343698135749333241212955, - 7291797892816794, - 56875330045936567, - 3882371626556934, - 14920496456492685, - 24562456562706969, - 32768995337507349, - 21888242871839275222246405745257275088548364400416034343698158139256456657411, - 13129589247122529, - 21888242871839275222246405745257275088548364400416034343698151960961901448558, - 21888242871839275222246405745257275088548364400416034343698188778581572947220, - 3693806986862975, - 21888242871839275222246405745257275088548364400416034343698133635812006702508, - 60829381143455743, - 21888242871839275222246405745257275088548364400416034343698183337776156001929, - 24430924926916890, - 8552257001354965, - 21888242871839275222246405745257275088548364400416034343698149888263939661643, - 21888242871839275222246405745257275088548364400416034343698158950460285832351, - 69964441443610343, - 7329327922948372, - 8038417740368593, - 64325200432941407, - 56193883151187524, - 52818469782462406, - 21888242871839275222246405745257275088548364400416034343698188688417707031232, - 21888242871839275222246405745257275088548364400416034343698134494434514230160, - 21888242871839275222246405745257275088548364400416034343698156805435021118951, - 20001275961214122, - 21888242871839275222246405745257275088548364400416034343698204143258916776374, - 21888242871839275222246405745257275088548364400416034343698137027258440576539, - 21888242871839275222246405745257275088548364400416034343698162785663271147198, - 19265777588737431, - 21888242871839275222246405745257275088548364400416034343698155825090980962945, - 21888242871839275222246405745257275088548364400416034343698138253371634077534, - 21888242871839275222246405745257275088548364400416034343698171627651913589074, - 21888242871839275222246405745257275088548364400416034343698145423910666976790, - 52309250524053669, - 3891335252788215, - 21888242871839275222246405745257275088548364400416034343698187553609247686436, - 34152590913615662, - 21888242871839275222246405745257275088548364400416034343698181241464495893175, - 32943022275838063, - 64660742743566233, - 21888242871839275222246405745257275088548364400416034343698182127232861398314, - 21888242871839275222246405745257275088548364400416034343698173029016036749150, - 21888242871839275222246405745257275088548364400416034343698158785140933440796, - 55387913687820750, - 21888242871839275222246405745257275088548364400416034343698151324789408934833, - 3971047380174435, - 3942229414791824, - 21888242871839275222246405745257275088548364400416034343698143854067533357874, - 21888242871839275222246405745257275088548364400416034343698146606027540428054, - 21888242871839275222246405745257275088548364400416034343698201872587564280755, - 9558931184870205, - 21888242871839275222246405745257275088548364400416034343698180778117141423249, - 48110276478868478, - 50610636869174203, - 32475550652010407, - 53047494625388614, - 21888242871839275222246405745257275088548364400416034343698132280702912202192, - 21888242871839275222246405745257275088548364400416034343698174528162831098476, - 10850808864021486, - 21888242871839275222246405745257275088548364400416034343698152614589445762071, - 21888242871839275222246405745257275088548364400416034343698141140516636590369, - 21888242871839275222246405745257275088548364400416034343698157476225571651799, - 25883030035688062, - 21888242871839275222246405745257275088548364400416034343698172603546573182559, - 53503394316249195, - 69307022778124052, - 44933640425449395, - 69181545538976908, - 21888242871839275222246405745257275088548364400416034343698195277860284881905, - 57725297696705988, - 40096964261295161, - 21888242871839275222246405745257275088548364400416034343698165404013931271293, - 25276689169852245, - 21888242871839275222246405745257275088548364400416034343698183048258862304012, - 35306629587461782, - 21888242871839275222246405745257275088548364400416034343698139566927184470193, - 21888242871839275222246405745257275088548364400416034343698190980296328224198, - 69542077369032976, - 26537567756810200, - 21888242871839275222246405745257275088548364400416034343698172957823701829612, - 21888242871839275222246405745257275088548364400416034343698162265841164361511, - 8605599804878293, - 47626147998300044, - 71822492124588903, - 25546893410087954, - 21888242871839275222246405745257275088548364400416034343698183299344054816398, - 66075512184610275, - 21888242871839275222246405745257275088548364400416034343698180588915745087735, - 21888242871839275222246405745257275088548364400416034343698178625337072859997, - 21888242871839275222246405745257275088548364400416034343698188407824781955131, - 21864667784973991, - 17908648409184976, - 70287590315977397, - 21888242871839275222246405745257275088548364400416034343698185208457538790979, - 62801609672900557, - 21888242871839275222246405745257275088548364400416034343698184678682561210653, - 21888242871839275222246405745257275088548364400416034343698191565332864751299, - 21888242871839275222246405745257275088548364400416034343698186130162519760113, - 31482708012562132, - 21888242871839275222246405745257275088548364400416034343698183961307520878324, - 15364914830864744, - 59690120081883288, - 29160091860007961, - 14461294986249883, - 38408865146509299, - 21888242871839275222246405745257275088548364400416034343698178272901189776728, - 46518395697499413, - 21888242871839275222246405745257275088548364400416034343698164382122844280084, - 21888242871839275222246405745257275088548364400416034343698171511273586822194, - 23995619975105635, - 21888242871839275222246405745257275088548364400416034343698202350563812813941, - 34164748843037792, - 21888242871839275222246405745257275088548364400416034343698152206142371050900, - 35935352072648381, - 15055183507148199, - 21888242871839275222246405745257275088548364400416034343698178783262998884780, - 3783876646333894, - 21888242871839275222246405745257275088548364400416034343698140791036987200563, - 33722238014215572, - 21888242871839275222246405745257275088548364400416034343698135377792297204035, - 49440154347727604, - 21888242871839275222246405745257275088548364400416034343698201858442134904898, - 5008145322523631, - 63611248200192947, - 49012516726893165, - 21888242871839275222246405745257275088548364400416034343698190167674304563147, - 21888242871839275222246405745257275088548364400416034343698134851569919064852, - 896943795684759, - 21888242871839275222246405745257275088548364400416034343698165779460174161650, - 21888242871839275222246405745257275088548364400416034343698177908300914758249, - 406489610692938, - 17774961379575767, - 21888242871839275222246405745257275088548364400416034343698150621429553020398, - 21452933086531047, - 12612204389426360, - 21888242871839275222246405745257275088548364400416034343698187828470851330363, - 69596062598366073, - 58668823389485121, - 21888242871839275222246405745257275088548364400416034343698182657583603992461, - 65816637973916160, - 21888242871839275222246405745257275088548364400416034343698194013517331358663, - 21888242871839275222246405745257275088548364400416034343698180237097058978317, - 41827516905995015, - 39804353582045089, - 21888242871839275222246405745257275088548364400416034343698163324623597807839, - 21888242871839275222246405745257275088548364400416034343698151258482404121302, - 21888242871839275222246405745257275088548364400416034343698198826968672629841, - 35775434665711086, - 21888242871839275222246405745257275088548364400416034343698194203170726151256, - 21888242871839275222246405745257275088548364400416034343698164797353499070480, - 21888242871839275222246405745257275088548364400416034343698135458963597900480, - 25072466141202972, - 3544041416379199, - 50106137163750624, - 46902948112967850, - 21888242871839275222246405745257275088548364400416034343698171193775962577775, - 21888242871839275222246405745257275088548364400416034343698194440219224719011, - 21888242871839275222246405745257275088548364400416034343698177770632938253416, - 21888242871839275222246405745257275088548364400416034343698153003658153289423, - 21888242871839275222246405745257275088548364400416034343698172291761584623150, - 60298947160680920, - 21888242871839275222246405745257275088548364400416034343698152203357700997319, - 27518556064688337, - 21888242871839275222246405745257275088548364400416034343698198460734669642973, - 61012474615705535, - 21888242871839275222246405745257275088548364400416034343698139317597041003136, - 21888242871839275222246405745257275088548364400416034343698201514782686274576, - 21888242871839275222246405745257275088548364400416034343698172392749315279856, - 24500175115802284, - 55386504264005500, - 21888242871839275222246405745257275088548364400416034343698197581302164321822, - 21888242871839275222246405745257275088548364400416034343698160908597008649122, - 21888242871839275222246405745257275088548364400416034343698180131168023317787, - 21888242871839275222246405745257275088548364400416034343698165356114381833642, - 22223652406593130, - 21888242871839275222246405745257275088548364400416034343698181651469810254425, - 21888242871839275222246405745257275088548364400416034343698181798399850342159, - 13278818489045963, - 21888242871839275222246405745257275088548364400416034343698183696203552568005, - 21888242871839275222246405745257275088548364400416034343698198263380815583493, - 31046234928833626, - 21888242871839275222246405745257275088548364400416034343698136827404711291283, - 21888242871839275222246405745257275088548364400416034343698155653581053255061, - 21888242871839275222246405745257275088548364400416034343698178590228228557510, - 53365390625693161, - 17464472354906329, - 21888242871839275222246405745257275088548364400416034343698196735293151498745, - 23658775926935516, - 39125249731329033, - 21888242871839275222246405745257275088548364400416034343698194985429308604627, - 54408232496012222, - 48223983061532088, - 21888242871839275222246405745257275088548364400416034343698168057425926275887, - 21888242871839275222246405745257275088548364400416034343698162865595663616056, - 21888242871839275222246405745257275088548364400416034343698191763892255570603, - 21888242871839275222246405745257275088548364400416034343698138768600524096920, - 8718060755435795, - 18256381428282582, - 21888242871839275222246405745257275088548364400416034343698196437442498507226, - 36384786549546722, - 21888242871839275222246405745257275088548364400416034343698165286091617580174, - 21888242871839275222246405745257275088548364400416034343698159409647488990086, - 21888242871839275222246405745257275088548364400416034343698154044914177498362, - 9509611458230556, - 18318669469218284, - 21888242871839275222246405745257275088548364400416034343698177333984732997241, - 7229920557506398, - 21888242871839275222246405745257275088548364400416034343698136846634109898935, - 21888242871839275222246405745257275088548364400416034343698164070344972633569, - 63043623614491499, - 21888242871839275222246405745257275088548364400416034343698142560096251911320, - 48113118400455052, - 14785369192421477, - 21888242871839275222246405745257275088548364400416034343698189625966142360646, - 54659735408042199, - 62167166883000193, - 21888242871839275222246405745257275088548364400416034343698142441905503863673, - 64434168220619101, - 60138569032125598, - 67242880612660636, - 21888242871839275222246405745257275088548364400416034343698172134788777330736, - 7864119555322022, - 26559985617544056, - 21888242871839275222246405745257275088548364400416034343698165664327641250029, - 19298509098282713, - 21888242871839275222246405745257275088548364400416034343698139236918228195249, - 45502823575937178, - 21888242871839275222246405745257275088548364400416034343698142275750709336966, - 21888242871839275222246405745257275088548364400416034343698163488237109137874, - 5682056985901787, - 21888242871839275222246405745257275088548364400416034343698177865552294000763, - 20324522377535512, - 21888242871839275222246405745257275088548364400416034343698168587652285698580, - 21888242871839275222246405745257275088548364400416034343698182587327806585738, - 21888242871839275222246405745257275088548364400416034343698172753675012718673, - 21888242871839275222246405745257275088548364400416034343698176559592697738049, - 50594964696592823, - 58469453741563125, - 21888242871839275222246405745257275088548364400416034343698146183698030847629, - 21888242871839275222246405745257275088548364400416034343698151619089141645741, - 13450996829580127, - 21888242871839275222246405745257275088548364400416034343698147321119088222004, - 47059284772102753, - 21888242871839275222246405745257275088548364400416034343698144277772990710034, - 63884611578031010, - 21888242871839275222246405745257275088548364400416034343698152005054585596371, - 41660465124933170, - 21888242871839275222246405745257275088548364400416034343698159583236144268904, - 22292421960285169, - 21888242871839275222246405745257275088548364400416034343698144187908026851230, - 21888242871839275222246405745257275088548364400416034343698182033556899134677, - 21888242871839275222246405745257275088548364400416034343698165407680592635594, - 21888242871839275222246405745257275088548364400416034343698173985377662017929, - 51027469020981117, - 21888242871839275222246405745257275088548364400416034343698178558525827360049, - 21888242871839275222246405745257275088548364400416034343698195764349390746773, - 21888242871839275222246405745257275088548364400416034343698184252002550065582, - 5357510745783797, - 70334222867521136, - 21888242871839275222246405745257275088548364400416034343698199712294735890547, - 11553295341945003, - 21888242871839275222246405745257275088548364400416034343698142690159426726397, - 49117983542119829, - 29215435512483628, - 21888242871839275222246405745257275088548364400416034343698135600108523266526, - 21888242871839275222246405745257275088548364400416034343698132797711548386711, - 70464531664224662, - 8601496457173741, - 21888242871839275222246405745257275088548364400416034343698185082422423996496, - 21888242871839275222246405745257275088548364400416034343698180835317984733626, - 21888242871839275222246405745257275088548364400416034343698169283584521432860, - 21888242871839275222246405745257275088548364400416034343698132286515255045986, - 21888242871839275222246405745257275088548364400416034343698187506215232976830, - 861512157946574, - 21888242871839275222246405745257275088548364400416034343698139143220954854643, - 21888242871839275222246405745257275088548364400416034343698192951345686399897, - 3561749956949976, - 49381106783765095, - 21888242871839275222246405745257275088548364400416034343698188962925206067704, - 21888242871839275222246405745257275088548364400416034343698148914025732374434, - 1159140712855032, - 3603372538455594, - 21888242871839275222246405745257275088548364400416034343698168411352138914176, - 21888242871839275222246405745257275088548364400416034343698195421418771271049, - 60174046866515319, - 45246941853672364, - 11091895253713314, - 32256785349466496, - 21888242871839275222246405745257275088548364400416034343698194552608207148153, - 10913077577100440, - 21888242871839275222246405745257275088548364400416034343698195320983343470346, - 29736406260002052, - 21888242871839275222246405745257275088548364400416034343698159729573329535021, - 25200349217194051, - 21888242871839275222246405745257275088548364400416034343698196091544839867574, - 53159471829742621, - 21888242871839275222246405745257275088548364400416034343698159587603171748840, - 21888242871839275222246405745257275088548364400416034343698155504437713635896, - 55589199770838065, - 21888242871839275222246405745257275088548364400416034343698191101105739329606, - 21888242871839275222246405745257275088548364400416034343698177984677183495712, - 21888242871839275222246405745257275088548364400416034343698159046594868557268, - 21888242871839275222246405745257275088548364400416034343698149807110960096187, - 21888242871839275222246405745257275088548364400416034343698164991533869080238, - 21888242871839275222246405745257275088548364400416034343698148468557167039003, - 14549406443016473, - 21888242871839275222246405745257275088548364400416034343698157011585764408595, - 30139639625666136, - 43719795699192288, - 63322972608495180, - 21888242871839275222246405745257275088548364400416034343698148898741249709648, - 21888242871839275222246405745257275088548364400416034343698153012860524718643, - 24328091979736720, - 21888242871839275222246405745257275088548364400416034343698188646963528277651, - 21888242871839275222246405745257275088548364400416034343698182045734233664838, - 21888242871839275222246405745257275088548364400416034343698187679689211989595, - 21888242871839275222246405745257275088548364400416034343698161625961478445290, - 21888242871839275222246405745257275088548364400416034343698149056991334085226, - 71948548806647117, - 26978240007367284, - 21888242871839275222246405745257275088548364400416034343698192573448981214700, - 16178912960518684, - 57918207375430371, - 21888242871839275222246405745257275088548364400416034343698188539571941218603, - 23988417818756136, - 32771953090513043, - 21888242871839275222246405745257275088548364400416034343698168281731953852101, - 21888242871839275222246405745257275088548364400416034343698161860758219005317, - 55855744688253748, - 21888242871839275222246405745257275088548364400416034343698173797470748649345, - 21888242871839275222246405745257275088548364400416034343698185471309764825208, - 21888242871839275222246405745257275088548364400416034343698162090502719246076, - 21888242871839275222246405745257275088548364400416034343698139061185959623726, - 21888242871839275222246405745257275088548364400416034343698134527683106523517, - 21888242871839275222246405745257275088548364400416034343698182463386753072868, - 21888242871839275222246405745257275088548364400416034343698155950497328388064, - 21888242871839275222246405745257275088548364400416034343698169806195324040862, - 11904207827155898, - 21888242871839275222246405745257275088548364400416034343698170685193603299707, - 21888242871839275222246405745257275088548364400416034343698148049907944598375, - 53888192471883043, - 21888242871839275222246405745257275088548364400416034343698184124094538971072, - 44705631365743087, - 64874541437062637, - 42575839255782171, - 21959604574133033, - 21888242871839275222246405745257275088548364400416034343698201924225628182499, - 21888242871839275222246405745257275088548364400416034343698167313528307963256, - 21888242871839275222246405745257275088548364400416034343698150775183391868375, - 30743946847998025, - 10473305698794685, - 6491888169783368, - 8101861674626210, - 21888242871839275222246405745257275088548364400416034343698177762332790091430, - 38274733087227723, - 21888242871839275222246405745257275088548364400416034343698179012709594851044, - 21888242871839275222246405745257275088548364400416034343698160547476884219097, - 21888242871839275222246405745257275088548364400416034343698142283509523896937, - 21888242871839275222246405745257275088548364400416034343698174361155755619498, - 48935759026104590, - 52902531051004920, - 21888242871839275222246405745257275088548364400416034343698160294694105519725, - 21888242871839275222246405745257275088548364400416034343698192367194779243658, - 21888242871839275222246405745257275088548364400416034343698188814053296733028, - 40228331398646494, - 60796906036240527, - 21888242871839275222246405745257275088548364400416034343698152671580544029171, - 21888242871839275222246405745257275088548364400416034343698173164243731242543, - 21162392812802037, - 39614160254159909, - 21888242871839275222246405745257275088548364400416034343698162351335157577143, - 21888242871839275222246405745257275088548364400416034343698133330351245773888, - 21888242871839275222246405745257275088548364400416034343698144204301860951107, - 8996725164400836, - 21888242871839275222246405745257275088548364400416034343698138300777867352421, - 50447107903382732, - 21888242871839275222246405745257275088548364400416034343698169059048641329446, - 30994537822416196, - 20948559822419025, - 21888242871839275222246405745257275088548364400416034343698164485663393204898, - 21888242871839275222246405745257275088548364400416034343698146466516705194016, - 14656578033528667, - 46488625417151195, - 21888242871839275222246405745257275088548364400416034343698138358471224254830, - 65536070855407, - 21888242871839275222246405745257275088548364400416034343698159628463175729902, - 24728536406949775, - 41755509147742023, - 21888242871839275222246405745257275088548364400416034343698173588000200735764, - 21888242871839275222246405745257275088548364400416034343698180291074848882139, - 54360620775186714, - 49704183503943770, - 21888242871839275222246405745257275088548364400416034343698190997550056335645, - 21888242871839275222246405745257275088548364400416034343698196090644853859263, - 21888242871839275222246405745257275088548364400416034343698203537667904773641, - 64853668125089681, - 21888242871839275222246405745257275088548364400416034343698182757636380466171, - 4341220291592995, - 21888242871839275222246405745257275088548364400416034343698143149823064096801, - 21888242871839275222246405745257275088548364400416034343698168570760182584741, - 21888242871839275222246405745257275088548364400416034343698138797443339523798, - 21888242871839275222246405745257275088548364400416034343698177196480680558091, - 48308684724535444, - 21888242871839275222246405745257275088548364400416034343698145341606896412025, - 36030808731713681, - 21888242871839275222246405745257275088548364400416034343698195795788245801223, - 30082248301188242, - 39470696423654363, - 21888242871839275222246405745257275088548364400416034343698156243142569029529, - 65489331743783223, - 2690620831772299, - 21888242871839275222246405745257275088548364400416034343698147467623210361258, - 21888242871839275222246405745257275088548364400416034343698159395096457116729, - 21888242871839275222246405745257275088548364400416034343698136521183702753469, - 61713784358576942, - 21888242871839275222246405745257275088548364400416034343698194211757986734518, - 26151644629805396, - 21888242871839275222246405745257275088548364400416034343698133823656964778969, - 43395982795984523, - 21888242871839275222246405745257275088548364400416034343698159813820167915595, - 12134038164133728, - 21888242871839275222246405745257275088548364400416034343698153058834006232210, - 21888242871839275222246405745257275088548364400416034343698159669207443931552, - 21888242871839275222246405745257275088548364400416034343698133659411220582687, - 21888242871839275222246405745257275088548364400416034343698139466369577366991, - 33626269135525680, - 19216389935556021, - 21888242871839275222246405745257275088548364400416034343698151400150428565442, - 21888242871839275222246405745257275088548364400416034343698164875939359713381, - 21888242871839275222246405745257275088548364400416034343698145306451518258826, - 16054148629572900, - 12030273182366037, - 21888242871839275222246405745257275088548364400416034343698185765855551034926, - 70098677981147685, - 21888242871839275222246405745257275088548364400416034343698139925024756860309, - 45842814213295663, - 35028641029221802, - 55590377102804399, - 69149099221555894, - 46524521938745475, - 30368752745051055, - 5844941081413120, - 29423998553463871, - 1612341918946514, - 8099935211072620, - 21888242871839275222246405745257275088548364400416034343698200030653034298689, - 21888242871839275222246405745257275088548364400416034343698183063921914852722, - 21888242871839275222246405745257275088548364400416034343698198565379566866209, - 14932196853356187, - 64968499613569658, - 21888242871839275222246405745257275088548364400416034343698192033050328779991, - 21888242871839275222246405745257275088548364400416034343698151800523536411700, - 21888242871839275222246405745257275088548364400416034343698152705072338475745, - 21888242871839275222246405745257275088548364400416034343698194038942147547181, - 21888242871839275222246405745257275088548364400416034343698188869201940302285, - 21888242871839275222246405745257275088548364400416034343698201683436132942624, - 21888242871839275222246405745257275088548364400416034343698155561755875394761, - 32771779140281883, - 21888242871839275222246405745257275088548364400416034343698184936620245194817, - 21888242871839275222246405745257275088548364400416034343698141047701505972766, - 21888242871839275222246405745257275088548364400416034343698183054363410462616, - 21888242871839275222246405745257275088548364400416034343698164861767946425770, - 59913048400330205, - 21888242871839275222246405745257275088548364400416034343698137609331402294269, - 21888242871839275222246405745257275088548364400416034343698178015469518100072, - 21888242871839275222246405745257275088548364400416034343698190038645906466604, - 70736522387480736, - 21888242871839275222246405745257275088548364400416034343698201935798174040527, - 26031747703798141, - 21888242871839275222246405745257275088548364400416034343698141176638641275124, - 21888242871839275222246405745257275088548364400416034343698176407390811221132, - 45080200007077947, - 28342842837124014, - 16356390802172708, - 21888242871839275222246405745257275088548364400416034343698176230072280182930, - 21888242871839275222246405745257275088548364400416034343698173892877239607219, - 21888242871839275222246405745257275088548364400416034343698194406197410269123, - 21888242871839275222246405745257275088548364400416034343698189674221144045352, - 21888242871839275222246405745257275088548364400416034343698143980044420984285, - 69368103162080072, - 21888242871839275222246405745257275088548364400416034343698136896794746225848, - 21888242871839275222246405745257275088548364400416034343698167329580491565067, - 33430413639409957, - 21888242871839275222246405745257275088548364400416034343698158032781339978692, - 21888242871839275222246405745257275088548364400416034343698157206076317753472, - 21888242871839275222246405745257275088548364400416034343698152070512976552329, - 21888242871839275222246405745257275088548364400416034343698186477196005050920, - 21888242871839275222246405745257275088548364400416034343698174504278703191378, - 21888242871839275222246405745257275088548364400416034343698169569474852755351, - 748915307617000, - 52357730455448367, - 21888242871839275222246405745257275088548364400416034343698162970312126149871, - 21888242871839275222246405745257275088548364400416034343698192042526196283490, - 49156864588738167, - 31745090185430279, - 21888242871839275222246405745257275088548364400416034343698169848033191511098, - 44355371632099883, - 23573834782342017, - 5333092208018910, - 52588840222315720, - 63791379588793742, - 63475725372428435, - 24884641440081152, - 21888242871839275222246405745257275088548364400416034343698164181452248154691, - 21888242871839275222246405745257275088548364400416034343698178687828259673778, - 21888242871839275222246405745257275088548364400416034343698158388147933910213, - 21888242871839275222246405745257275088548364400416034343698193982292976495478, - 21888242871839275222246405745257275088548364400416034343698171168798344746951, - 21888242871839275222246405745257275088548364400416034343698189260488156411111, - 32209746734690452, - 46496621234523791, - 14440302204601629, - 21888242871839275222246405745257275088548364400416034343698172152505544698103, - 21888242871839275222246405745257275088548364400416034343698151055583075522230, - 21888242871839275222246405745257275088548364400416034343698196320091778657571, - 21888242871839275222246405745257275088548364400416034343698165158730445868609, - 25928228634405406, - 21888242871839275222246405745257275088548364400416034343698139853461170793706, - 12298705082399672, - 21888242871839275222246405745257275088548364400416034343698162726981335112707, - 25343155997071584, - 44208360953572218, - 43236934929137202, - 21888242871839275222246405745257275088548364400416034343698199499944330130705, - 62682631535785102, - 21888242871839275222246405745257275088548364400416034343698132868573190252927, - 13167324866760961, - 40417271104053781, - 21888242871839275222246405745257275088548364400416034343698144891509677552815, - 21888242871839275222246405745257275088548364400416034343698139327316663171575, - 21888242871839275222246405745257275088548364400416034343698177396306219325716, - 7432528504326304, - 19907031419533723, - 21888242871839275222246405745257275088548364400416034343698167284130540527976, - 11031503488660571, - 21888242871839275222246405745257275088548364400416034343698132341511379118594, - 15861930890305061, - 21888242871839275222246405745257275088548364400416034343698200263707138223631, - 21888242871839275222246405745257275088548364400416034343698199225437396381637, - 48050627269011322, - 15709809748833579, - 21888242871839275222246405745257275088548364400416034343698200950237226034186, - 21888242871839275222246405745257275088548364400416034343698167549187910108648, - 5403145910425632, - 21888242871839275222246405745257275088548364400416034343698204141248161657842, - 21888242871839275222246405745257275088548364400416034343698165642027357687635, - 21888242871839275222246405745257275088548364400416034343698150591771877726119, - 68656856864536192, - 21888242871839275222246405745257275088548364400416034343698134659451436985917, - 21888242871839275222246405745257275088548364400416034343698143185223550552080, - 21888242871839275222246405745257275088548364400416034343698194973507078255324, - 21888242871839275222246405745257275088548364400416034343698178078091996761447, - 51468383170716315, - 21888242871839275222246405745257275088548364400416034343698147787034421777178, - 53494016575850978, - 21888242871839275222246405745257275088548364400416034343698179802394997915181, - 27458998562317648, - 47534507584943973, - 48650965465976719, - 31585616864076044, - 42823061429250380, - 23707349603639616, - 21888242871839275222246405745257275088548364400416034343698156886924442800746, - 58452504297983941, - 7667594056260984, - 19794592647868635, - 21888242871839275222246405745257275088548364400416034343698187135719857477007, - 21888242871839275222246405745257275088548364400416034343698157448119622161462, - 51714612284839930, - 54427787492777474, - 42005194250087271, - 28713813728234571, - 21888242871839275222246405745257275088548364400416034343698147378900671192916, - 49824465933168805, - 21888242871839275222246405745257275088548364400416034343698142576907550505247, - 21888242871839275222246405745257275088548364400416034343698176152919496016991, - 64456565019808020, - 21888242871839275222246405745257275088548364400416034343698185055505465514841, - 21888242871839275222246405745257275088548364400416034343698193541029912710338, - 38238084300982950, - 50827245704503505, - 65172072387298025, - 17874962507436744, - 21888242871839275222246405745257275088548364400416034343698141018977496853010, - 21888242871839275222246405745257275088548364400416034343698140105817720505336, - 3559636384164320, - 64149282388576057, - 21888242871839275222246405745257275088548364400416034343698133737389680925790, - 21888242871839275222246405745257275088548364400416034343698153294868065187197, - 21888242871839275222246405745257275088548364400416034343698176779398915138204, - 33921714810674854, - 45839398013406226, - 51032109826298882, - 27271808631082803, - 21888242871839275222246405745257275088548364400416034343698141570302419888323, - 21888242871839275222246405745257275088548364400416034343698149579812271283029, - 70364036706626004, - 68250182154668840, - 66747038075010982, - 21888242871839275222246405745257275088548364400416034343698134389979811407459, - 21888242871839275222246405745257275088548364400416034343698157449846151320476, - 21888242871839275222246405745257275088548364400416034343698168155869612427199, - 1857313634483748, - 7717312353433279, - 21888242871839275222246405745257275088548364400416034343698136410011397152478, - 21888242871839275222246405745257275088548364400416034343698189590055331370199, - 21888242871839275222246405745257275088548364400416034343698162712736299595912, - 21888242871839275222246405745257275088548364400416034343698139526218601893794, - 62212446460608633, - 56157025561090140, - 17333235174369305, - 61956307653694569, - 21888242871839275222246405745257275088548364400416034343698200705618286373968, - 21888242871839275222246405745257275088548364400416034343698184181130559343887, - 33308232860304493, - 21888242871839275222246405745257275088548364400416034343698191890541350257585, - 21888242871839275222246405745257275088548364400416034343698157331717536040822, - 60046773947061690, - 65572256988847337, - 7958215777946291, - 48282563823046158, - 21888242871839275222246405745257275088548364400416034343698142160785357086388, - 67210882224493496, - 53186035535045010, - 59638222224220571, - 1350836414611013, - 21888242871839275222246405745257275088548364400416034343698164626201518613533, - 21888242871839275222246405745257275088548364400416034343698202082065427645672, - 7346581969482691, - 31751791679238291, - 21888242871839275222246405745257275088548364400416034343698151599327871516383, - 21888242871839275222246405745257275088548364400416034343698151407257889662688, - 35296485846901635, - 21888242871839275222246405745257275088548364400416034343698203596771676431569, - 21888242871839275222246405745257275088548364400416034343698145698931340221687, - 21888242871839275222246405745257275088548364400416034343698173313966634663898, - 21888242871839275222246405745257275088548364400416034343698151635692525459004, - 51919881838457504, - 21888242871839275222246405745257275088548364400416034343698168625534488072109, - 13952122002191435, - 21888242871839275222246405745257275088548364400416034343698163354707374111826, - 48654003231032878, - 21888242871839275222246405745257275088548364400416034343698180313232803064428, - 21888242871839275222246405745257275088548364400416034343698158695017120719323, - 58863824179780106, - 21888242871839275222246405745257275088548364400416034343698150091706759890686, - 36353975255501208, - 21888242871839275222246405745257275088548364400416034343698141366876943120392, - 16658403694413794, - 54991957470125811, - 15653880267328195, - 21888242871839275222246405745257275088548364400416034343698192158611284219908, - 21888242871839275222246405745257275088548364400416034343698159266861600472161, - 21888242871839275222246405745257275088548364400416034343698192112972817719781, - 45781206259317980, - 64204309866849626, - 34400247557762853, - 2587184214185428, - 8178275271675580, - 25343106744281652, - 21888242871839275222246405745257275088548364400416034343698153108387954453386, - 21888242871839275222246405745257275088548364400416034343698138931243384632940, - 13260914168792247, - 21888242871839275222246405745257275088548364400416034343698139736946790668502, - 21888242871839275222246405745257275088548364400416034343698159278646630560370, - 21888242871839275222246405745257275088548364400416034343698180925907086711776, - 24881949985608292, - 47598301039669602, - 21888242871839275222246405745257275088548364400416034343698156541297035239506, - 21888242871839275222246405745257275088548364400416034343698148860956870018745, + 21888242871839275222246405745257275088548364400416034343698149462769572117960, + 53189326064471220, + 21888242871839275222246405745257275088548364400416034343698173656095076746683, + 21888242871839275222246405745257275088548364400416034343698131117909202879804, + 21888242871839275222246405745257275088548364400416034343698173957193735012180, + 21888242871839275222246405745257275088548364400416034343698162211422761394941, + 21888242871839275222246405745257275088548364400416034343698183345705036068385, + 21888242871839275222246405745257275088548364400416034343698141127078110176283, + 50720034758843966, + 21888242871839275222246405745257275088548364400416034343698142904023777561088, + 21888242871839275222246405745257275088548364400416034343698124688333044759095, + 21888242871839275222246405745257275088548364400416034343698151029007334837048, + 132208858211667707, + 21888242871839275222246405745257275088548364400416034343698197722027282158966, + 63870795037861173, + 133410696365627450, + 21888242871839275222246405745257275088548364400416034343698189813885599939675, + 21888242871839275222246405745257275088548364400416034343698168025738392563539, + 21888242871839275222246405745257275088548364400416034343698165989808088094640, + 21888242871839275222246405745257275088548364400416034343698179161896872002246, + 4714198220783450, + 21888242871839275222246405745257275088548364400416034343698167292690112611220, + 21888242871839275222246405745257275088548364400416034343698142471651022696419, + 21888242871839275222246405745257275088548364400416034343698075373069986652048, + 102177847246435959, + 8321879441118076, + 21888242871839275222246405745257275088548364400416034343698184812635848526295, + 21888242871839275222246405745257275088548364400416034343698137129836302601551, + 112963069076169120, + 32307067800103852, + 21888242871839275222246405745257275088548364400416034343698144008544146308969, + 38531233622689741, + 21888242871839275222246405745257275088548364400416034343698114142023313243266, + 21888242871839275222246405745257275088548364400416034343698137462675411400234, + 108574518779231305, + 21888242871839275222246405745257275088548364400416034343698100108320126022015, + 59976868084255044, + 73291535138903350, + 21888242871839275222246405745257275088548364400416034343698202387611392076091, + 21888242871839275222246405745257275088548364400416034343698192884238793272959, + 80136178358501598, + 21888242871839275222246405745257275088548364400416034343698197957302141660735, + 21888242871839275222246405745257275088548364400416034343698160888669784373013, + 32652972080428867, + 90567509195884284, + 96442168104763027, + 21888242871839275222246405745257275088548364400416034343698187203302189390570, + 121398677588377345, + 137527075850765332, + 21888242871839275222246405745257275088548364400416034343698139802526247229637, + 21888242871839275222246405745257275088548364400416034343698191784897447033471, + 86950088181785060, + 21888242871839275222246405745257275088548364400416034343698174721803808427029, + 21888242871839275222246405745257275088548364400416034343698138006014231374486, + 60560905479655173, + 21888242871839275222246405745257275088548364400416034343698173544596605514497, + 91428285356199736, + 8071373846453721, + 123879259339880479, + 21888242871839275222246405745257275088548364400416034343698135279273641407414, + 69331818627346085, + 21888242871839275222246405745257275088548364400416034343698076569336279541230, + 94772166680166211, + 5156370355451646, + 60426284138810465, + 108251321723001587, + 21888242871839275222246405745257275088548364400416034343698119769756255217198, + 11499555930562141, + 21888242871839275222246405745257275088548364400416034343698192351034085715956, + 79431240165944760, + 111880780777594885, + 21888242871839275222246405745257275088548364400416034343698068718954014260622, + 21888242871839275222246405745257275088548364400416034343698101066342965063203, + 21888242871839275222246405745257275088548364400416034343698128954656709465661, + 92080677704670960, + 21888242871839275222246405745257275088548364400416034343698100094310665814608, + 77701775340491682, + 21888242871839275222246405745257275088548364400416034343698165421512990411904, + 21888242871839275222246405745257275088548364400416034343698074716439748372294, + 85590981072496093, + 18216225031796724, + 69705233123581094, + 21888242871839275222246405745257275088548364400416034343698190863811109309246, + 21888242871839275222246405745257275088548364400416034343698187930550127581688, + 141417089670174585, + 21888242871839275222246405745257275088548364400416034343698172607896658621999, + 121957137240529308, + 21888242871839275222246405745257275088548364400416034343698100690718164656115, + 21888242871839275222246405745257275088548364400416034343698178020155217987298, + 21888242871839275222246405745257275088548364400416034343698192765185577145606, + 21888242871839275222246405745257275088548364400416034343698122613480501147962, + 101023526000947199, + 21888242871839275222246405745257275088548364400416034343698135897862021793223, + 50207058497405417, + 21888242871839275222246405745257275088548364400416034343698199537636136980036, + 21888242871839275222246405745257275088548364400416034343698101535611816280590, + 21888242871839275222246405745257275088548364400416034343698112888106363687370, + 21888242871839275222246405745257275088548364400416034343698202713967485064251, + 21888242871839275222246405745257275088548364400416034343698116090709940953530, + 21888242871839275222246405745257275088548364400416034343698117077903832471056, + 32584942406367676, + 21888242871839275222246405745257275088548364400416034343698092028889189017130, + 21888242871839275222246405745257275088548364400416034343698080520892835213666, + 139692013281522100, + 39439278226959473, + 105318920076770366, + 21888242871839275222246405745257275088548364400416034343698117859984519627607, + 21142084041774402, + 21888242871839275222246405745257275088548364400416034343698123171000621071318, + 114808208949081153, + 1612679524424657, + 664555738713716, + 21888242871839275222246405745257275088548364400416034343698195075503465886321, + 21888242871839275222246405745257275088548364400416034343698060315685755836598, + 21888242871839275222246405745257275088548364400416034343698104768327512579778, + 21888242871839275222246405745257275088548364400416034343698189179025980223014, + 21888242871839275222246405745257275088548364400416034343698122398034408893394, + 21888242871839275222246405745257275088548364400416034343698159408368672285061, + 21888242871839275222246405745257275088548364400416034343698075631511560197247, + 21888242871839275222246405745257275088548364400416034343698076145146419319844, + 24847240325014659, + 114893071628529026, + 21888242871839275222246405745257275088548364400416034343698092406800955141513, + 31007124132454639, + 26657819683452454, + 21888242871839275222246405745257275088548364400416034343698132576927243956725, + 58572244275977314, + 89800478056004442, + 21888242871839275222246405745257275088548364400416034343698068913827477441147, + 137620755130741316, + 21888242871839275222246405745257275088548364400416034343698123188656187991103, + 59380885857802029, + 21888242871839275222246405745257275088548364400416034343698126604549653222732, + 21888242871839275222246405745257275088548364400416034343698162971892403078748, + 21888242871839275222246405745257275088548364400416034343698117481454728108324, + 18973482016005697, + 97518656516410480, + 21888242871839275222246405745257275088548364400416034343698071593375892337249, + 21888242871839275222246405745257275088548364400416034343698094302103355526490, + 51849006120486887, + 21888242871839275222246405745257275088548364400416034343698124765177603684546, + 21888242871839275222246405745257275088548364400416034343698148607302619667253, + 114846709833271006, + 24711281137332478, + 21888242871839275222246405745257275088548364400416034343698095878234279933780, + 101753306782831740, + 21888242871839275222246405745257275088548364400416034343698191854552363166236, + 21888242871839275222246405745257275088548364400416034343698162370617906802733, + 21888242871839275222246405745257275088548364400416034343698126884638291783191, + 126894835561988368, + 45005069622399694, + 82522367280349965, + 142715063427281591, + 76594819992892854, + 21888242871839275222246405745257275088548364400416034343698064017524321011002, + 47150184308320307, + 21888242871839275222246405745257275088548364400416034343698077271365707601577, + 21888242871839275222246405745257275088548364400416034343698191945400969179550, + 73179709715694548, + 78935948583138241, + 111079767923745572, + 21888242871839275222246405745257275088548364400416034343698110266335020187759, + 73567984527067056, + 4860274522340394, + 21888242871839275222246405745257275088548364400416034343698153715132247829178, + 116728521496782522, + 78731819595436713, + 21701877916892897, + 53330729785359961, + 4771679032266374, + 86869705997323855, + 82245825242501477, + 21888242871839275222246405745257275088548364400416034343698190660469401435645, + 21888242871839275222246405745257275088548364400416034343698121104340966246619, + 21888242871839275222246405745257275088548364400416034343698104144781875741107, + 21888242871839275222246405745257275088548364400416034343698189777370271717860, + 115124240633573977, + 53385349239876370, + 21888242871839275222246405745257275088548364400416034343698126907226452816025, + 122853011244266992, + 119342514033433909, + 86932962708436380, + 21888242871839275222246405745257275088548364400416034343698075336569260154877, + 85021990884432791, + 13263763814791815, + 45273304056729563, + 126316944366245386, + 72558655474920078, + 35018884074563599, + 64821851701021333, + 21888242871839275222246405745257275088548364400416034343698132457556275141107, + 34729629893170002, + 21888242871839275222246405745257275088548364400416034343698170686069962016020, + 21888242871839275222246405745257275088548364400416034343698077576957506597428, + 21888242871839275222246405745257275088548364400416034343698169620603413072269, + 21888242871839275222246405745257275088548364400416034343698084757386193361488, + 21888242871839275222246405745257275088548364400416034343698137576986473422771, + 140339239471447538, + 109026642958794534, + 21888242871839275222246405745257275088548364400416034343698071705325191888444, + 21888242871839275222246405745257275088548364400416034343698178182921080619063, + 21888242871839275222246405745257275088548364400416034343698101641521300903206, + 100223759884776239, + 107123672052100553, + 21888242871839275222246405745257275088548364400416034343698145436200841153231, + 21888242871839275222246405745257275088548364400416034343698173559576449969849, + 91667134094922772, + 21888242871839275222246405745257275088548364400416034343698183489973891915794, + 21888242871839275222246405745257275088548364400416034343698103858057802044381, + 128605339879362988, + 56272156484685419, + 58362940804617318, + 21888242871839275222246405745257275088548364400416034343698196547941536762378, + 68772654330857421, + 92181214424313664, + 21888242871839275222246405745257275088548364400416034343698155363308707599058, + 21888242871839275222246405745257275088548364400416034343698162892912803329675, + 21888242871839275222246405745257275088548364400416034343698196290125623450117, + 9274075797847074, + 21888242871839275222246405745257275088548364400416034343698095697320716075873, + 21888242871839275222246405745257275088548364400416034343698060244267718677952, + 21888242871839275222246405745257275088548364400416034343698156991675973282257, + 137629062985834842, + 21888242871839275222246405745257275088548364400416034343698160895612436118908, + 21888242871839275222246405745257275088548364400416034343698199130184259780330, + 46955544712587766, + 21888242871839275222246405745257275088548364400416034343698128729799623611650, + 21888242871839275222246405745257275088548364400416034343698144731219940842430, + 81800161642063685, + 57034667817816376, + 21888242871839275222246405745257275088548364400416034343698199843295947038901, + 21888242871839275222246405745257275088548364400416034343698156516392223408880, + 133218556837270530, + 40472764772992781, + 21888242871839275222246405745257275088548364400416034343698118308882748489865, + 21888242871839275222246405745257275088548364400416034343698166528964641500640, + 21888242871839275222246405745257275088548364400416034343698100597485019608587, + 86557001239257865, + 21888242871839275222246405745257275088548364400416034343698132473719290392669, + 127002735422476976, + 10226680285508109, + 52906226406495719, + 81147863546643855, + 21888242871839275222246405745257275088548364400416034343698140935009656144714, + 21888242871839275222246405745257275088548364400416034343698172631544219316337, + 72553977190196936, + 21888242871839275222246405745257275088548364400416034343698130064759441026999, + 21888242871839275222246405745257275088548364400416034343698095531007628624949, + 118266081371936544, + 21888242871839275222246405745257275088548364400416034343698203890964833170928, + 21888242871839275222246405745257275088548364400416034343698106996699946296907, + 9765030267754225, + 83794449317364914, + 70698271551592856, + 21888242871839275222246405745257275088548364400416034343698073818156727692754, + 124243601597528649, + 21888242871839275222246405745257275088548364400416034343698137011717558378432, + 43953333300284814, + 104086706314581632, + 127148682767280097, + 77087381589080380, + 44873472146231400, + 86868725614183026, + 37838791904041812, + 111398089091490586, + 85634563454259350, + 21888242871839275222246405745257275088548364400416034343698141277084647619134, + 21888242871839275222246405745257275088548364400416034343698141448971519437036, + 37341714414983557, + 21888242871839275222246405745257275088548364400416034343698120715235824901830, + 21888242871839275222246405745257275088548364400416034343698146038126196872917, + 21888242871839275222246405745257275088548364400416034343698104393609319060515, + 101919815297365576, + 21888242871839275222246405745257275088548364400416034343698125706944941903159, + 21888242871839275222246405745257275088548364400416034343698162937279556704866, + 21888242871839275222246405745257275088548364400416034343698137943075031220013, + 21888242871839275222246405745257275088548364400416034343698127961837318707654, + 29047295758057482, + 21888242871839275222246405745257275088548364400416034343698070130364826884151, + 21888242871839275222246405745257275088548364400416034343698122324411353589201, + 21888242871839275222246405745257275088548364400416034343698128203376299708764, + 52372111633704851, + 21888242871839275222246405745257275088548364400416034343698067479763183684584, + 71309540960611482, + 21888242871839275222246405745257275088548364400416034343698112502124363636570, + 118357925307200996, + 21888242871839275222246405745257275088548364400416034343698203221666390032094, + 21888242871839275222246405745257275088548364400416034343698076878852501846237, + 21888242871839275222246405745257275088548364400416034343698112011857043591777, + 24081972250337798, + 43516142408258300, + 21888242871839275222246405745257275088548364400416034343698083004370136824190, + 102235594313397723, + 21888242871839275222246405745257275088548364400416034343698178451098237370089, + 21888242871839275222246405745257275088548364400416034343698080943813570086743, + 53940893690303790, + 21888242871839275222246405745257275088548364400416034343698169847451887931963, + 21888242871839275222246405745257275088548364400416034343698188839996052282951, + 140475936929697570, + 70161987976889184, + 111683075578078737, + 3957600711509023, + 60150082613238959, + 120671746845617176, + 21888242871839275222246405745257275088548364400416034343698137163679725626947, + 21888242871839275222246405745257275088548364400416034343698109980277292629617, + 38895649518677206, + 121581530340519122, + 39310058710315528, + 21888242871839275222246405745257275088548364400416034343698128989541183815400, + 21888242871839275222246405745257275088548364400416034343698155090274415492254, + 21888242871839275222246405745257275088548364400416034343698128764348327532022, + 21888242871839275222246405745257275088548364400416034343698151928725494287421, + 21888242871839275222246405745257275088548364400416034343698079210207448320996, + 21888242871839275222246405745257275088548364400416034343698104940421497256916, + 34492838888714123, + 21888242871839275222246405745257275088548364400416034343698135356633104097575, + 82116669600514767, + 13988806539233778, + 21888242871839275222246405745257275088548364400416034343698097067498467511370, + 21888242871839275222246405745257275088548364400416034343698075755676888905980, + 79386294001069052, + 21888242871839275222246405745257275088548364400416034343698125792335368173626, + 118144256770542079, + 21888242871839275222246405745257275088548364400416034343698158267962412032794, + 8420899994043273, + 21888242871839275222246405745257275088548364400416034343698117816825641171291, + 136990197290183627, + 21888242871839275222246405745257275088548364400416034343698174522388814488227, + 137995171584582186, + 21888242871839275222246405745257275088548364400416034343698174902465535608172, + 21888242871839275222246405745257275088548364400416034343698175394811565132995, + 140415586028309399, + 110357557333952117, + 91185012933724071, + 21888242871839275222246405745257275088548364400416034343698185643905312670308, + 567510327611217, + 4474397834922728, + 21888242871839275222246405745257275088548364400416034343698076030887496084355, + 21888242871839275222246405745257275088548364400416034343698163755162185777490, + 21888242871839275222246405745257275088548364400416034343698073156306572285221, + 21888242871839275222246405745257275088548364400416034343698135431969063118639, + 18937953327386071, + 21888242871839275222246405745257275088548364400416034343698179911166409797231, + 21888242871839275222246405745257275088548364400416034343698099373167429369368, + 51985104537663187, + 21888242871839275222246405745257275088548364400416034343698087885912348185383, + 61275721730162963, + 128437003560367844, + 21888242871839275222246405745257275088548364400416034343698129022481452069122, + 67953928184883087, + 21888242871839275222246405745257275088548364400416034343698106365396033333838, + 58246082320798675, + 21888242871839275222246405745257275088548364400416034343698175862007279389016, + 123241959673086508, + 137031194200292381, + 21888242871839275222246405745257275088548364400416034343698063969085038729879, + 131021941347745036, + 21888242871839275222246405745257275088548364400416034343698063293884102211481, + 21888242871839275222246405745257275088548364400416034343698141526946209032979, + 33594935810959257, + 21362909834110301, + 21888242871839275222246405745257275088548364400416034343698080575099924349150, + 21888242871839275222246405745257275088548364400416034343698181351418125870276, + 21888242871839275222246405745257275088548364400416034343698168091363277383244, + 142878129752164471, + 21888242871839275222246405745257275088548364400416034343698191201657164519120, + 27582386106547011, + 10781906789256230, + 21888242871839275222246405745257275088548364400416034343698098059108672995988, + 21888242871839275222246405745257275088548364400416034343698064740285336433619, + 55839374266647321, + 21888242871839275222246405745257275088548364400416034343698179441091489033359, + 21888242871839275222246405745257275088548364400416034343698198904954528137373, + 21888242871839275222246405745257275088548364400416034343698098032661265611902, + 21888242871839275222246405745257275088548364400416034343698163509855883933767, + 92533355551585803, + 23806806173013867, + 21888242871839275222246405745257275088548364400416034343698168436959364440470, + 21888242871839275222246405745257275088548364400416034343698098982430936412147, + 13000947239791547, + 21888242871839275222246405745257275088548364400416034343698152085346853811552, + 106108222064898705, + 141303923220984967, + 52917656292217294, + 21888242871839275222246405745257275088548364400416034343698181628416862143212, + 75531114858979865, + 4608310570202226, + 29981808977085561, + 21888242871839275222246405745257275088548364400416034343698084049605342657207, + 21875980683999253, + 91597283288309323, + 19477671336561538, + 112670780398692456, + 21888242871839275222246405745257275088548364400416034343698067987548534702793, + 21888242871839275222246405745257275088548364400416034343698088458485835673794, + 100620480440782826, + 21888242871839275222246405745257275088548364400416034343698148525736423685485, + 21888242871839275222246405745257275088548364400416034343698128056756801953257, + 4249378069708907, + 78500556821568582, + 21888242871839275222246405745257275088548364400416034343698127943684250370924, + 100953585461631091, + 21888242871839275222246405745257275088548364400416034343698129781211503702818, + 4668574970862436, + 21734264882570544, + 21888242871839275222246405745257275088548364400416034343698063680972271377498, + 102405545421086944, + 117814806642417341, + 21888242871839275222246405745257275088548364400416034343698152810477190128656, + 42833509478195842, + 21888242871839275222246405745257275088548364400416034343698156738380394907411, + 21888242871839275222246405745257275088548364400416034343698137914995810944845, + 143702391201451098, + 21888242871839275222246405745257275088548364400416034343698188128261429818079, + 40460310974945437, + 31718646504362989, + 140455079363688253, + 21888242871839275222246405745257275088548364400416034343698196269129264181334, + 21888242871839275222246405745257275088548364400416034343698142645519920216897, + 138228434143904639, + 21888242871839275222246405745257275088548364400416034343698162910122792851889, + 11802852494102314, + 133886664434025639, + 20778544753402369, + 5639475493900722, + 21888242871839275222246405745257275088548364400416034343698142197764870349944, + 26756563658839692, + 73664468803071925, + 21888242871839275222246405745257275088548364400416034343698143359370361953032, + 21888242871839275222246405745257275088548364400416034343698194916002634252928, + 21888242871839275222246405745257275088548364400416034343698174531633816797685, + 21888242871839275222246405745257275088548364400416034343698094138750508557627, + 8126589508110300, + 21888242871839275222246405745257275088548364400416034343698177852742360720049, + 21888242871839275222246405745257275088548364400416034343698093404593306268545, + 15154257809910138, + 21888242871839275222246405745257275088548364400416034343698095899519436363340, + 21888242871839275222246405745257275088548364400416034343698152296073347877958, + 21888242871839275222246405745257275088548364400416034343698132017581992210494, + 21677868934509425, + 21888242871839275222246405745257275088548364400416034343698195305811485526146, + 21888242871839275222246405745257275088548364400416034343698197221408766117787, + 98978740746172092, + 76224888361457518, + 21888242871839275222246405745257275088548364400416034343698191641866722498799, + 142941500262552511, + 21888242871839275222246405745257275088548364400416034343698151059894321527482, + 21888242871839275222246405745257275088548364400416034343698132361040355061850, + 21888242871839275222246405745257275088548364400416034343698127845139377836908, + 22353770718436901, + 21888242871839275222246405745257275088548364400416034343698126050273600801482, + 21888242871839275222246405745257275088548364400416034343698079358383557756605, + 21888242871839275222246405745257275088548364400416034343698203086745551797817, + 21888242871839275222246405745257275088548364400416034343698077221272166867885, + 21888242871839275222246405745257275088548364400416034343698131018761033675598, + 21888242871839275222246405745257275088548364400416034343698147043620322107698, + 21888242871839275222246405745257275088548364400416034343698081290691076319918, + 21888242871839275222246405745257275088548364400416034343698184902917079614725, + 142830316832413903, + 26646959202629400, + 89577029354844182, + 21888242871839275222246405745257275088548364400416034343698073375514983801721, + 44794621574372378, + 52414961867014395, + 63091826961449412, + 34474136022957302, + 134627220700398710, + 21888242871839275222246405745257275088548364400416034343698157484775658855346, + 94077234869220524, + 21888242871839275222246405745257275088548364400416034343698100249640066758897, + 10282517276006419, + 21888242871839275222246405745257275088548364400416034343698099850168858053003, + 68743699016655134, + 82876562056234757, + 21888242871839275222246405745257275088548364400416034343698107307317283020563, + 21888242871839275222246405745257275088548364400416034343698110975652621821113, + 35460005122248506, + 21888242871839275222246405745257275088548364400416034343698174450955313924960, + 29581115283831151, + 5520318376901827, + 114457749926624336, + 133750572004152270, + 111601249671517596, + 21888242871839275222246405745257275088548364400416034343698166204986930041619, + 21888242871839275222246405745257275088548364400416034343698073680798426037032, + 21888242871839275222246405745257275088548364400416034343698087173201800152205, + 21888242871839275222246405745257275088548364400416034343698067297873203819434, + 21888242871839275222246405745257275088548364400416034343698106929004926168370, + 60520451565726016, + 72562610437924143, + 21888242871839275222246405745257275088548364400416034343698179328469245764238, + 21888242871839275222246405745257275088548364400416034343698167660253942689648, + 113900012685485626, + 96913553280891891, + 21888242871839275222246405745257275088548364400416034343698075245240037441059, + 21888242871839275222246405745257275088548364400416034343698130615965649114773, + 43840428122321604, + 52076969953578372, + 21888242871839275222246405745257275088548364400416034343698095314983004706833, + 46407034880078458, + 21888242871839275222246405745257275088548364400416034343698163269516078349952, + 72231946394099916, + 129641557791335673, + 71525008711805587, + 21888242871839275222246405745257275088548364400416034343698109464657645369314, + 21888242871839275222246405745257275088548364400416034343698163259036115900234, + 21888242871839275222246405745257275088548364400416034343698183572500367006379, + 21888242871839275222246405745257275088548364400416034343698066062774532727170, + 83446793254535152, + 21888242871839275222246405745257275088548364400416034343698142063846212003914, + 7455108684367477, + 143698634221553205, + 21888242871839275222246405745257275088548364400416034343698195381253498071553, + 21888242871839275222246405745257275088548364400416034343698123452255889974092, + 21888242871839275222246405745257275088548364400416034343698150750393183278925, + 21888242871839275222246405745257275088548364400416034343698140383472749620610, + 122527172151529267, + 21888242871839275222246405745257275088548364400416034343698166025228774081750, + 21888242871839275222246405745257275088548364400416034343698120690362801714212, + 133080044117669270, + 21888242871839275222246405745257275088548364400416034343698131988498947349609, + 17018643065747226, + 136195147849884421, + 36039212444521476, + 21888242871839275222246405745257275088548364400416034343698135119118818142083, + 76630220849423501, + 68264531995481533, + 21888242871839275222246405745257275088548364400416034343698183539218531012121, + 29082321115121549, + 88744489741964616, + 21888242871839275222246405745257275088548364400416034343698158239590088084228, + 112077447909447387, + 21888242871839275222246405745257275088548364400416034343698098801908986071399, + 21888242871839275222246405745257275088548364400416034343698109623096722015273, + 57891971436833930, + 21888242871839275222246405745257275088548364400416034343698135339211527375747, + 21888242871839275222246405745257275088548364400416034343698160385771271115077, + 21888242871839275222246405745257275088548364400416034343698096456321025686114, + 21888242871839275222246405745257275088548364400416034343698192528053346007179, + 102824694576870278, + 21888242871839275222246405745257275088548364400416034343698095057391897538223, + 21888242871839275222246405745257275088548364400416034343698062057478015632973, + 118819841252938196, + 21888242871839275222246405745257275088548364400416034343698076085576908005506, + 20781617975524982, + 23039983975416729, + 21888242871839275222246405745257275088548364400416034343698126074500390460649, + 78835603110706141, + 21888242871839275222246405745257275088548364400416034343698167442494381501239, + 115924578762819021, + 112777133049700870, + 21888242871839275222246405745257275088548364400416034343698149518858126797879, + 31953345744750958, + 2358304852131079, + 35571567307019481, + 110059047409031866, + 8367616742537415, + 21888242871839275222246405745257275088548364400416034343698145621520341320050, + 21888242871839275222246405745257275088548364400416034343698112631946199057295, + 21888242871839275222246405745257275088548364400416034343698146457077968254938, + 3007286682285917, + 55573820082522851, + 21888242871839275222246405745257275088548364400416034343698168928788491882502, + 21888242871839275222246405745257275088548364400416034343698067535409915958140, + 21888242871839275222246405745257275088548364400416034343698190832387713509656, + 42628725959259640, + 21888242871839275222246405745257275088548364400416034343698086641067970758316, + 107522249959649287, + 21888242871839275222246405745257275088548364400416034343698102711003242937860, + 21888242871839275222246405745257275088548364400416034343698193975603586157651, + 1979713860474042, + 21888242871839275222246405745257275088548364400416034343698096393563284226437, + 114850446340239689, + 21888242871839275222246405745257275088548364400416034343698150200516968313413, + 88620415011374198, + 21888242871839275222246405745257275088548364400416034343698185183701228802270, + 142357654949492537, + 21888242871839275222246405745257275088548364400416034343698097066169027674023, + 67935442069957487, + 118401545783870862, + 47483038425007202, + 122453130417843190, + 21888242871839275222246405745257275088548364400416034343698174493170499859188, + 115937800761086220, + 31002214771857409, + 21888242871839275222246405745257275088548364400416034343698150811478702330084, + 51841296113558775, + 109842107800404500, + 21888242871839275222246405745257275088548364400416034343698107158917872361380, + 19717726957992172, + 90131677605119554, + 21888242871839275222246405745257275088548364400416034343698098421465953156775, + 21888242871839275222246405745257275088548364400416034343698156272588684071029, + 21888242871839275222246405745257275088548364400416034343698114501377625167497, + 102996618742413158, + 56019234414223829, + 128301106950943277, + 9229628769942938, + 87893519712786045, + 21888242871839275222246405745257275088548364400416034343698163226866672845267, + 88850477329367543, + 21888242871839275222246405745257275088548364400416034343698121976531488881406, + 21888242871839275222246405745257275088548364400416034343698131171490588143745, + 53333290466860725, + 21888242871839275222246405745257275088548364400416034343698178116416767815362, + 21888242871839275222246405745257275088548364400416034343698138268985865598160, + 21888242871839275222246405745257275088548364400416034343698119472469678933938, + 21888242871839275222246405745257275088548364400416034343698070886354138741142, + 22362069141475166, + 21888242871839275222246405745257275088548364400416034343698070109130834399958, + 21888242871839275222246405745257275088548364400416034343698110668446622872122, + 84291412394548947, + 21888242871839275222246405745257275088548364400416034343698113894443814848065, + 122320449834415081, + 21888242871839275222246405745257275088548364400416034343698095852394764989604, + 21888242871839275222246405745257275088548364400416034343698106636334660227166, + 61275186303984818, + 124335265257540188, + 70952885380875819, + 110632571751370990, + 21888242871839275222246405745257275088548364400416034343698093852346601412219, + 52279834584815775, + 92406967712591618, + 41957194204829865, + 21888242871839275222246405745257275088548364400416034343698095387614161626988, + 21888242871839275222246405745257275088548364400416034343698145682155001197686, + 66767548595859644, + 141556690349408402, + 44980756593878285, + 21888242871839275222246405745257275088548364400416034343698098168254380989751, + 21888242871839275222246405745257275088548364400416034343698096198321483948964, + 65040306104173105, + 20387024757860568, + 21888242871839275222246405745257275088548364400416034343698061386934645416125, + 134404609437373766, + 135034438530217810, + 121731327028796897, + 44593988687623201, + 102974920010813057, + 21888242871839275222246405745257275088548364400416034343698119347617643003405, + 21888242871839275222246405745257275088548364400416034343698159149515057678912, + 21888242871839275222246405745257275088548364400416034343698120906422150354518, + 21888242871839275222246405745257275088548364400416034343698152663411417773460, + 129326630318530179, + 142427652504243586, + 85748022471874163, + 21888242871839275222246405745257275088548364400416034343698066150851413570932, + 106781917073883843, + 38465021687329894, + 80423898928281209, + 21888242871839275222246405745257275088548364400416034343698139711087488774111, + 99133239789435861, + 41022651486007192, + 21888242871839275222246405745257275088548364400416034343698147499712418797044, + 21888242871839275222246405745257275088548364400416034343698185198350064426875, + 21888242871839275222246405745257275088548364400416034343698086995290612538361, + 68608003472811822, + 21888242871839275222246405745257275088548364400416034343698175349100633920071, + 28785553521272277, + 21888242871839275222246405745257275088548364400416034343698067279549852548495, + 34860976196921276, + 85933265874456459, + 21888242871839275222246405745257275088548364400416034343698070836204305296350, + 12968967707052059, + 21888242871839275222246405745257275088548364400416034343698188161738991521157, + 97705408596298788, + 21888242871839275222246405745257275088548364400416034343698175877952046550393, + 57887286661805134, + 48754185466663487, + 131919319855933434, + 21888242871839275222246405745257275088548364400416034343698073587903118064182, + 10587479123490903, + 21888242871839275222246405745257275088548364400416034343698114231387547901875, + 21888242871839275222246405745257275088548364400416034343698068489620693826319, + 139436626367141906, + 21888242871839275222246405745257275088548364400416034343698125071525869092207, + 30815966104909985, + 73589225603799630, + 58032183783779132, + 46153473630774375, + 21888242871839275222246405745257275088548364400416034343698116944105182268904, + 66749251057430976, + 144053217833915217, + 21888242871839275222246405745257275088548364400416034343698140342512926052180, + 21888242871839275222246405745257275088548364400416034343698132118640247258071, + 129970815362667707, + 21888242871839275222246405745257275088548364400416034343698151031421759486074, + 31955806958854267, + 43316815349279116, + 16062600712147077, + 21888242871839275222246405745257275088548364400416034343698147319053726807889, + 21888242871839275222246405745257275088548364400416034343698123889076629622583, + 115980196298270847, + 130421221056226648, + 48911588369747970, + 21888242871839275222246405745257275088548364400416034343698126117083201005916, + 114670821482840024, + 84301538326421511, + 21888242871839275222246405745257275088548364400416034343698140217108559024796, + 21888242871839275222246405745257275088548364400416034343698136020994444925197, + 21888242871839275222246405745257275088548364400416034343698138232225080219053, + 87963188218967199, + 21888242871839275222246405745257275088548364400416034343698082626962150898228, + 21888242871839275222246405745257275088548364400416034343698107922436592632996, + 21888242871839275222246405745257275088548364400416034343698201096124607742232, + 21888242871839275222246405745257275088548364400416034343698102673498366550966, + 130303473507255449, + 21888242871839275222246405745257275088548364400416034343698119545879061209773, + 81127293601966065, + 31197793871683876, + 21888242871839275222246405745257275088548364400416034343698191200346284273719, + 21888242871839275222246405745257275088548364400416034343698088733797626632510, + 32701871511358176, + 95324035995716109, + 100430149829135082, + 5159647892867999, + 21888242871839275222246405745257275088548364400416034343698099942212777942251, + 21888242871839275222246405745257275088548364400416034343698083418064078707667, + 21888242871839275222246405745257275088548364400416034343698135341331646144872, + 21888242871839275222246405745257275088548364400416034343698148565383703735286, + 12387691851176937, + 21888242871839275222246405745257275088548364400416034343698191573107990287087, + 71090981483465711, + 21888242871839275222246405745257275088548364400416034343698148718290551112588, + 3529914530062791, + 877132149591769, + 21888242871839275222246405745257275088548364400416034343698108330017325900838, + 75214057060546030, + 140762437461850292, + 21888242871839275222246405745257275088548364400416034343698078565425257906611, + 21888242871839275222246405745257275088548364400416034343698121834180055834750, + 21888242871839275222246405745257275088548364400416034343698065169034682271955, + 21888242871839275222246405745257275088548364400416034343698163679261399974168, + 122031305209483932, + 70032462343492688, + 67837109687037883, + 21888242871839275222246405745257275088548364400416034343698086224559362748542, + 18353334100380388, + 38509967298121084, + 21888242871839275222246405745257275088548364400416034343698171088787073479106, + 46129510677816538, + 111747255163490717, + 21888242871839275222246405745257275088548364400416034343698116893373739938085, + 21888242871839275222246405745257275088548364400416034343698176859030385453905, + 20258025697137469, + 10724435370763870, + 87521672217809290, + 97456419571538661, + 21888242871839275222246405745257275088548364400416034343698089641482829362822, + 21888242871839275222246405745257275088548364400416034343698076713470881659814, + 90713352442777118, + 21888242871839275222246405745257275088548364400416034343698063005213562626875, + 21888242871839275222246405745257275088548364400416034343698129982872514900480, + 30927978890031932, + 21888242871839275222246405745257275088548364400416034343698202148526465565595, + 21888242871839275222246405745257275088548364400416034343698151675902574103480, + 12464826883242502, + 21888242871839275222246405745257275088548364400416034343698185535149186684777, + 38248861278134709, + 46362278956798613, + 21888242871839275222246405745257275088548364400416034343698104994051218922319, + 21888242871839275222246405745257275088548364400416034343698158842958573559848, + 21888242871839275222246405745257275088548364400416034343698186322574516345452, + 57831243507090450, + 21888242871839275222246405745257275088548364400416034343698118096492014261498, + 27087116438855899, + 90208403930649998, + 57044505698420024, + 21888242871839275222246405745257275088548364400416034343698198916387813647732, + 21888242871839275222246405745257275088548364400416034343698158764497782575775, + 21888242871839275222246405745257275088548364400416034343698195701388221648000, + 21888242871839275222246405745257275088548364400416034343698073028789947816923, + 27515171317726088, + 32118162768465096, + 21888242871839275222246405745257275088548364400416034343698145245992877434179, + 21888242871839275222246405745257275088548364400416034343698105075004692221228, + 21888242871839275222246405745257275088548364400416034343698157952516225319592, + 21888242871839275222246405745257275088548364400416034343698167628526517386625, + 26491071093562589, + 21888242871839275222246405745257275088548364400416034343698183894753986743631, + 3355028375301033, + 65140266235044784, + 21888242871839275222246405745257275088548364400416034343698196513683090672581, + 21888242871839275222246405745257275088548364400416034343698174531014316984635, + 118127415636331643, + 51434988859148101, + 47348568273733227, + 49986445575843467, + 8783994835747523, + 116904205527074430, + 81603636769076950, + 21888242871839275222246405745257275088548364400416034343698145666486259735890, + 77078752790801975, + 44024403603205154, + 21888242871839275222246405745257275088548364400416034343698127966746278413126, + 26857533249427706, + 21888242871839275222246405745257275088548364400416034343698154698966877605758, + 21888242871839275222246405745257275088548364400416034343698133142005438235269, + 21888242871839275222246405745257275088548364400416034343698200545164110982625, + 89763191600386007, + 21888242871839275222246405745257275088548364400416034343698110388905697512343, + 21888242871839275222246405745257275088548364400416034343698098002383730917635, + 29581576195196459, + 21888242871839275222246405745257275088548364400416034343698147522032951225685, + 21888242871839275222246405745257275088548364400416034343698074434697256070987, + 21888242871839275222246405745257275088548364400416034343698161210486573883988, + 67639134763222243, + 21888242871839275222246405745257275088548364400416034343698082944423226101226, + 24147514795132597, + 21888242871839275222246405745257275088548364400416034343698118555381222750345, + 15199405541815952, + 484175660358305, + 21888242871839275222246405745257275088548364400416034343698170092387494023755, + 21888242871839275222246405745257275088548364400416034343698089709513484790813, + 42576409546519340, + 58752060747511050, + 98366179736191124, + 71017444088513088, + 116498018261690449, + 21888242871839275222246405745257275088548364400416034343698122858439274060990, + 53527346445803233, + 79014959105356438, + 21888242871839275222246405745257275088548364400416034343698129079793256398185, + 108896265002707561, + 64874904484065112, + 37193904475499260, + 21888242871839275222246405745257275088548364400416034343698179424479235186581, + 45140450810695179, + 21888242871839275222246405745257275088548364400416034343698142067094817965387, + 21888242871839275222246405745257275088548364400416034343698176538189425311567, + 109897128613809813, + 21888242871839275222246405745257275088548364400416034343698107707702591252024, + 71911054356338817, + 21888242871839275222246405745257275088548364400416034343698116463571056958720, + 128885057361223709, + 21888242871839275222246405745257275088548364400416034343698183036621763783164, + 21888242871839275222246405745257275088548364400416034343698185379325385444405, + 21888242871839275222246405745257275088548364400416034343698079116321749287962, + 21888242871839275222246405745257275088548364400416034343698172482495191861756, + 35194075102204337, + 81399065289047360, + 21888242871839275222246405745257275088548364400416034343698119232421099741395, + 66664294523666926, + 21888242871839275222246405745257275088548364400416034343698118994252194715136, + 21888242871839275222246405745257275088548364400416034343698147971804916064890, + 54109775324733961, + 21888242871839275222246405745257275088548364400416034343698106165014224175899, + 21888242871839275222246405745257275088548364400416034343698195306459811066676, + 122011319467906589, + 21888242871839275222246405745257275088548364400416034343698204152760428420597, + 88881255194376878, + 21888242871839275222246405745257275088548364400416034343698119676008306275385, + 21888242871839275222246405745257275088548364400416034343698090440341811984990, + 73983790973535339, + 27886582986623459, + 21888242871839275222246405745257275088548364400416034343698095022316267076589, + 38739226815473976, + 21888242871839275222246405745257275088548364400416034343698075593604160651295, + 76421282582677658, + 115023257625334357, + 47705613500460291, + 21888242871839275222246405745257275088548364400416034343698101311657468904457, + 27841903911562294, + 89473695009239470, + 123173276398362105, + 21888242871839275222246405745257275088548364400416034343698161459742980307156, + 21888242871839275222246405745257275088548364400416034343698069082564557920019, + 65113018020305075, + 21888242871839275222246405745257275088548364400416034343698153913427579047619, + 50908270770485557, + 21888242871839275222246405745257275088548364400416034343698076788144188670608, + 21888242871839275222246405745257275088548364400416034343698145044092830260696, + 21888242871839275222246405745257275088548364400416034343698141900346775335271, + 138505169733136509, + 21888242871839275222246405745257275088548364400416034343698098986374674709396, + 1381415819524372, + 21888242871839275222246405745257275088548364400416034343698068842044949847851, + 22923150908938805, + 25842293482816996, + 132726482185940543, + 21888242871839275222246405745257275088548364400416034343698073109491520334329, + 52708390063895092, + 2018680124755546, + 74926355770636481, + 28831114992612813, + 9629895609276515, + 109918451469006607, + 21888242871839275222246405745257275088548364400416034343698199045886722712578, + 21888242871839275222246405745257275088548364400416034343698179962576189317899, + 85760712462255122, + 21888242871839275222246405745257275088548364400416034343698094862510301077876, + 21888242871839275222246405745257275088548364400416034343698122070580656734144, + 21888242871839275222246405745257275088548364400416034343698181848370134555272, + 78948217277132909, + 1046533853673736, + 21888242871839275222246405745257275088548364400416034343698121427589500547900, + 89612658064660028, + 30566393600716416, + 21888242871839275222246405745257275088548364400416034343698101891909831457827, + 78573338004970179, + 21888242871839275222246405745257275088548364400416034343698155531101616281620, + 143973180435832033, + 21888242871839275222246405745257275088548364400416034343698172410118243696783, + 21888242871839275222246405745257275088548364400416034343698198650479472217727, + 9311942169438248, + 98806746449006209, + 101355434830857048, + 21888242871839275222246405745257275088548364400416034343698200162236355841620, + 21888242871839275222246405745257275088548364400416034343698147598312302978514, + 21888242871839275222246405745257275088548364400416034343698154864661135400928, + 21888242871839275222246405745257275088548364400416034343698136410034305515040, + 21888242871839275222246405745257275088548364400416034343698136201512025187764, + 21888242871839275222246405745257275088548364400416034343698173497848148184497, + 57975599395188019, + 112534029354278027, + 21888242871839275222246405745257275088548364400416034343698137980045702207104, + 21888242871839275222246405745257275088548364400416034343698087122768579209568, + 54586379154469845, + 21888242871839275222246405745257275088548364400416034343698083574896287743140, + 21888242871839275222246405745257275088548364400416034343698086195355593665058, + 21888242871839275222246405745257275088548364400416034343698153016736286572602, + 21888242871839275222246405745257275088548364400416034343698182856667564890344, + 41882922530018880, + 116157938297041390, + 86553625885008729, + 21888242871839275222246405745257275088548364400416034343698104261756409697700, + 21888242871839275222246405745257275088548364400416034343698096554581049192087, + 16305768300925858, + 21888242871839275222246405745257275088548364400416034343698104567830114320722, + 132150204469531145, + 120189565150633555, + 21888242871839275222246405745257275088548364400416034343698061822555398054582, + 21888242871839275222246405745257275088548364400416034343698111949634759437115, + 21888242871839275222246405745257275088548364400416034343698198026862817631963, + 40510537706717648, + 25981456773551908, + 21888242871839275222246405745257275088548364400416034343698164500094732250769, + 75984385633798218, + 46965715871748436, + 110618049220511906, + 43205391661993902, + 12334864669695638, + 49908313730640044, + 9325437878373066, + 88439573691007897, + 18941119370094792, + 21888242871839275222246405745257275088548364400416034343698078357182927274468, + 21888242871839275222246405745257275088548364400416034343698186128175256203876, + 21888242871839275222246405745257275088548364400416034343698071636055204854395, + 134952904628316859, + 130297626477142030, + 106504990903477196, + 1800652836974951, + 21888242871839275222246405745257275088548364400416034343698092862111321537792, + 21888242871839275222246405745257275088548364400416034343698149322678070520484, + 21888242871839275222246405745257275088548364400416034343698063635762979553848, + 21888242871839275222246405745257275088548364400416034343698105559768098135327, + 21888242871839275222246405745257275088548364400416034343698136195685371875627, + 21888242871839275222246405745257275088548364400416034343698143793971126879710, + 21888242871839275222246405745257275088548364400416034343698135410438647331386, + 50128134930881202, + 21888242871839275222246405745257275088548364400416034343698150622812741218221, + 21888242871839275222246405745257275088548364400416034343698122121239587985551, + 96701867295166841, + 21888242871839275222246405745257275088548364400416034343698148519912395951322, + 56209791393962601, + 34676743155043327, + 62930137188718709, + 58429351261855081, + 21888242871839275222246405745257275088548364400416034343698111475359004165222, + 124890034839922995, + 31278154778434812, + 124300746776320810, + 34079124700956014, + 21888242871839275222246405745257275088548364400416034343698170220138994530643, + 87515632541787660, + 21888242871839275222246405745257275088548364400416034343698193487888133260214, + 21888242871839275222246405745257275088548364400416034343698086145073669142686, + 21888242871839275222246405745257275088548364400416034343698115724158261259491, + 21888242871839275222246405745257275088548364400416034343698122015199591149012, + 87681473224100764, + 21888242871839275222246405745257275088548364400416034343698084958095151838642, + 5859664450123405, + 96265977520894716, + 66409234251072616, + 21888242871839275222246405745257275088548364400416034343698085302123375323170, + 23014103042240504, + 97039861748996271, + 21888242871839275222246405745257275088548364400416034343698073450043033903840, + 30928462637632078, + 56793475328317067, + 77223527286083720, + 21888242871839275222246405745257275088548364400416034343698074117384958833182, + 21888242871839275222246405745257275088548364400416034343698073114892668043036, + 21888242871839275222246405745257275088548364400416034343698195834217247020008, + 21888242871839275222246405745257275088548364400416034343698150277937436523329, + 21888242871839275222246405745257275088548364400416034343698113899671796884480, + 14280695680519312, + 37066369471957591, + 14516236388967106, + 9574880385855404, + 105032976483910961, + 4902873416138058, + 21888242871839275222246405745257275088548364400416034343698202536695041508949, + 21888242871839275222246405745257275088548364400416034343698126076869769962903, + 28275945628614566, + 128919950132592169, + 68460785631643622, + 82860393273336777, + 21888242871839275222246405745257275088548364400416034343698190479629172618211, + 134408145516258977, + 21888242871839275222246405745257275088548364400416034343698142403960301841930, + 118992730725115295, + 21888242871839275222246405745257275088548364400416034343698203440623974814491, + 112794655526659965, + 132614504096639007, + 65644799874110127, + 127146442688114476, + 21888242871839275222246405745257275088548364400416034343698128132609129077684, + 64938689709336701, + 21888242871839275222246405745257275088548364400416034343698196629736543666230, + 49578182836691548, + 21888242871839275222246405745257275088548364400416034343698181786009509933644, + 21888242871839275222246405745257275088548364400416034343698062249599890919265, + 13407205915541662, + 21888242871839275222246405745257275088548364400416034343698099115261523722750, + 21888242871839275222246405745257275088548364400416034343698078014207946983689, + 97291858972471569, + 21888242871839275222246405745257275088548364400416034343698182923340869274850, + 21888242871839275222246405745257275088548364400416034343698091234826742069102, + 21888242871839275222246405745257275088548364400416034343698166414898755241577, + 15774239526625281, + 10531651974107384, + 115294170994626325, + 21888242871839275222246405745257275088548364400416034343698187436642455994942, + 21888242871839275222246405745257275088548364400416034343698165853394344700592, + 27440292841798309, + 21888242871839275222246405745257275088548364400416034343698126662384791265406, + 36291413674259529, + 2377218898349363, + 55048371074128697, + 21888242871839275222246405745257275088548364400416034343698116976499032536998, + 21888242871839275222246405745257275088548364400416034343698121398208307427433, + 21888242871839275222246405745257275088548364400416034343698095173064296010939, + 81705733792669435, + 58493182001647806, + 103916843313828581, + 32707567076242026, + 21888242871839275222246405745257275088548364400416034343698075843977352195180, + 21888242871839275222246405745257275088548364400416034343698199526137050704219, + 21888242871839275222246405745257275088548364400416034343698139392587714309754, + 21888242871839275222246405745257275088548364400416034343698140944812698395092, + 21888242871839275222246405745257275088548364400416034343698140009645012775604, + 21888242871839275222246405745257275088548364400416034343698090499398039943528, + 46947935821021414, + 118484632255622495, + 138721119889807135, + 21888242871839275222246405745257275088548364400416034343698124020131016897284, + 102442740179932847, + 21888242871839275222246405745257275088548364400416034343698135069368116544150, + 21888242871839275222246405745257275088548364400416034343698083317087027944238, + 21888242871839275222246405745257275088548364400416034343698162238614782987729, + 21888242871839275222246405745257275088548364400416034343698135786484500511745, + 21888242871839275222246405745257275088548364400416034343698085960471320101976, + 79375504918981869, + 21888242871839275222246405745257275088548364400416034343698096076484299647690, + 21888242871839275222246405745257275088548364400416034343698102003056380722097, + 68606559314052309, + 127349111083067041, + 21888242871839275222246405745257275088548364400416034343698152354939507829223, + 21888242871839275222246405745257275088548364400416034343698114167975080370553, + 29321284313296800, + 134227766400524044, + 23441663576918360, + 21888242871839275222246405745257275088548364400416034343698153514562440554682, + 88688477347571141, + 21888242871839275222246405745257275088548364400416034343698146220582185114137, + 21888242871839275222246405745257275088548364400416034343698096524788834879999, + 21888242871839275222246405745257275088548364400416034343698116777386119699401, + 21888242871839275222246405745257275088548364400416034343698143166405345705125, + 61970326689430384, + 62953973716813349, + 22793960138546367, + 21888242871839275222246405745257275088548364400416034343698176635322691894629, + 21888242871839275222246405745257275088548364400416034343698195933349182148434, + 83010061763077896, + 67701076746964874, + 136140630533776247, + 21888242871839275222246405745257275088548364400416034343698193830363334715852, + 21888242871839275222246405745257275088548364400416034343698072451001923527992, + 32714775394745829, + 44432838821018721, + 2840538871558630, + 77651418090897224, + 21888242871839275222246405745257275088548364400416034343698121173625598179590, + 21888242871839275222246405745257275088548364400416034343698150995534181315326, + 21888242871839275222246405745257275088548364400416034343698128217656163262444, + 125424875372600158, + 21888242871839275222246405745257275088548364400416034343698109504196387325098, + 99875390381871250, + 106018292907639522, + 21888242871839275222246405745257275088548364400416034343698139093631972102774, + 21888242871839275222246405745257275088548364400416034343698094061207898506479, + 127236812477551738, + 98669617894486680, + 2977575131567302, + 21888242871839275222246405745257275088548364400416034343698116546211501327135, + 427440665228044, + 143312892939840739, + 37376546126047525, + 21888242871839275222246405745257275088548364400416034343698078010604480102625, + 65770281544686922, + 21888242871839275222246405745257275088548364400416034343698176745041350407115, + 21888242871839275222246405745257275088548364400416034343698147141336081557252, + 21888242871839275222246405745257275088548364400416034343698201164463972580167, + 21888242871839275222246405745257275088548364400416034343698197037547631233586, + 142219484039339704, + 12466350657409594, + 21888242871839275222246405745257275088548364400416034343698129897287226979842, + 21888242871839275222246405745257275088548364400416034343698070812748708259556, + 21888242871839275222246405745257275088548364400416034343698109224796312632255, + 21888242871839275222246405745257275088548364400416034343698186139803875273443, + 89276157318299733, + 75092979358561190, + 19947556866468387, + 115501157217193945, + 21888242871839275222246405745257275088548364400416034343698153140254052902180, + 103663996663417681, + 21888242871839275222246405745257275088548364400416034343698073913937837389241, + 21888242871839275222246405745257275088548364400416034343698128989299788571989, + 21888242871839275222246405745257275088548364400416034343698142700061332805512, + 139200355433621723, + 21888242871839275222246405745257275088548364400416034343698110989394663065811, + 38305991976500580, + 46696120790665459, + 21888242871839275222246405745257275088548364400416034343698086734569006231674, + 21888242871839275222246405745257275088548364400416034343698172310776893821297, + 142567761534269599, + 77465552001744963, + 21888242871839275222246405745257275088548364400416034343698106568030953466270, + 21888242871839275222246405745257275088548364400416034343698166276597725045646, + 21888242871839275222246405745257275088548364400416034343698152538681874080970, + 45733034756575226, + 134083407988989694, + 93694127491293828, + 21888242871839275222246405745257275088548364400416034343698180144780195973843, + 4530836869140245, + 21888242871839275222246405745257275088548364400416034343698158127990098499859, + 21888242871839275222246405745257275088548364400416034343698061786184235448148, + 21888242871839275222246405745257275088548364400416034343698084868342250493920, + 21888242871839275222246405745257275088548364400416034343698091737612330464110, + 21888242871839275222246405745257275088548364400416034343698097870086008814597, + 21888242871839275222246405745257275088548364400416034343698154177891318824254, + 21888242871839275222246405745257275088548364400416034343698198401605757669037, + 21888242871839275222246405745257275088548364400416034343698198536019415984458, + 67347681648917852, + 4638712819469538, + 36752626158262851, + 21888242871839275222246405745257275088548364400416034343698099859784578404168, + 21888242871839275222246405745257275088548364400416034343698062758610724558975, + 21888242871839275222246405745257275088548364400416034343698140308029723628621, + 21888242871839275222246405745257275088548364400416034343698176890902916580383, + 44415811715885318, + 77688942987664494, + 21888242871839275222246405745257275088548364400416034343698105764552256662317, + 38450426651107877, + 21888242871839275222246405745257275088548364400416034343698145479583908213677, + 21888242871839275222246405745257275088548364400416034343698073717032584552873, + 114482884689143384, + 3853349549790495, + 21888242871839275222246405745257275088548364400416034343698153414747793315368, + 82321875528713253, + 21888242871839275222246405745257275088548364400416034343698117421141026305560, + 21888242871839275222246405745257275088548364400416034343698147044262381514610, + 76634180201478934, + 21888242871839275222246405745257275088548364400416034343698196579521880839377, + 21888242871839275222246405745257275088548364400416034343698159213900457020422, + 21888242871839275222246405745257275088548364400416034343698110600181125357812, + 21888242871839275222246405745257275088548364400416034343698146071714510758015, + 55414308329977059, + 17188370896149991, + 21888242871839275222246405745257275088548364400416034343698200908016154376518, + 21888242871839275222246405745257275088548364400416034343698140696389321558881, + 21888242871839275222246405745257275088548364400416034343698161889566194574791, + 21888242871839275222246405745257275088548364400416034343698072913531870915507, + 143576544577528915, + 11034678300414154, + 36155518392535530, + 21888242871839275222246405745257275088548364400416034343698092922576547346719, + 17261273305552540, + 21888242871839275222246405745257275088548364400416034343698156445689100806426, + 21888242871839275222246405745257275088548364400416034343698088463482565749167, + 21888242871839275222246405745257275088548364400416034343698125754598410875080, + 44642237649275102, + 21888242871839275222246405745257275088548364400416034343698125921718844033858, + 21888242871839275222246405745257275088548364400416034343698094844230504095801, + 21888242871839275222246405745257275088548364400416034343698158406575011926088, + 21888242871839275222246405745257275088548364400416034343698061715039232797577, + 21888242871839275222246405745257275088548364400416034343698156901318069451189, + 21888242871839275222246405745257275088548364400416034343698203252198582002054, + 21888242871839275222246405745257275088548364400416034343698189948989048195829, + 876033565174943, + 83467946881051132, + 21888242871839275222246405745257275088548364400416034343698142208661260340872, + 21888242871839275222246405745257275088548364400416034343698179091564511626500, + 69307760052302493, + 21888242871839275222246405745257275088548364400416034343698202961448872506253, + 21888242871839275222246405745257275088548364400416034343698087172911403619634, + 21888242871839275222246405745257275088548364400416034343698142673219955802843, + 21888242871839275222246405745257275088548364400416034343698117544358501129825, + 21888242871839275222246405745257275088548364400416034343698172634593734054390, + 39496153423646304, + 21888242871839275222246405745257275088548364400416034343698138358679020521433, + 131350189886024782, + 21888242871839275222246405745257275088548364400416034343698203911563784077582, + 21888242871839275222246405745257275088548364400416034343698171019099396870348, + 137362532551519883, + 28787189438202465, + 21888242871839275222246405745257275088548364400416034343698146320024446475907, + 21888242871839275222246405745257275088548364400416034343698063423552401196481, + 61097632095485170, + 21888242871839275222246405745257275088548364400416034343698104993554911731576, + 73765718923184673, + 110892910800221710, + 138747209471842339, + 21888242871839275222246405745257275088548364400416034343698077008397458619440, + 106789339842228218, + 21888242871839275222246405745257275088548364400416034343698065057198202551167, + 122434129077119883, + 21888242871839275222246405745257275088548364400416034343698158134671339174799, + 55097579432595683, + 21888242871839275222246405745257275088548364400416034343698195560313891746290, + 21888242871839275222246405745257275088548364400416034343698133359335043648093, + 21888242871839275222246405745257275088548364400416034343698178471446212112843, + 21888242871839275222246405745257275088548364400416034343698108548904148560571, + 28668054126294744, + 21888242871839275222246405745257275088548364400416034343698084636948284640472, + 4068195003993246, + 21888242871839275222246405745257275088548364400416034343698078681699600114235, + 21888242871839275222246405745257275088548364400416034343698188511763674446194, + 21888242871839275222246405745257275088548364400416034343698112978075451578474, + 21888242871839275222246405745257275088548364400416034343698062187357573263331, + 21888242871839275222246405745257275088548364400416034343698196939922582010099, + 21888242871839275222246405745257275088548364400416034343698106254597812376741, + 21888242871839275222246405745257275088548364400416034343698171063646360802364, + 37156557658895594, + 21888242871839275222246405745257275088548364400416034343698167056748898273550, + 18046944328484232, + 48037134352477777, + 21888242871839275222246405745257275088548364400416034343698203786008501875415, + 21888242871839275222246405745257275088548364400416034343698185242726080304447, + 21888242871839275222246405745257275088548364400416034343698154848332408187634, + 21888242871839275222246405745257275088548364400416034343698097024035834859915, + 21888242871839275222246405745257275088548364400416034343698089550816692606499, + 21888242871839275222246405745257275088548364400416034343698068538890777965440, + 110976315299679853, + 10751616205024263, + 21888242871839275222246405745257275088548364400416034343698133770182537634472, + 21888242871839275222246405745257275088548364400416034343698081123287650853212, + 139302262014223720, + 21888242871839275222246405745257275088548364400416034343698083158584353467743, + 127583709070517228, + 138028353657979191, + 21888242871839275222246405745257275088548364400416034343698083915576581378080, + 30042762957593610, + 2804272515331384, + 21888242871839275222246405745257275088548364400416034343698124130981360956944, + 21888242871839275222246405745257275088548364400416034343698061611115107566566, + 21888242871839275222246405745257275088548364400416034343698143235249372802131, + 21888242871839275222246405745257275088548364400416034343698095545616551442813, + 43527091667306472, + 2096345902515993, + 132999647125696831, + 89186163948610667, + 62873057628045694, + 21888242871839275222246405745257275088548364400416034343698086478744460097852, + 21888242871839275222246405745257275088548364400416034343698164457252416427695, + 21888242871839275222246405745257275088548364400416034343698199317466271929480, + 21888242871839275222246405745257275088548364400416034343698188603261488473738, + 21888242871839275222246405745257275088548364400416034343698146481184343192355, + 87215165392511936, + 21888242871839275222246405745257275088548364400416034343698201418418322728507, + 21888242871839275222246405745257275088548364400416034343698075011452960956932, + 21888242871839275222246405745257275088548364400416034343698092468577414798380, + 110002894740562406, + 107296401676113393, + 71390125023695818, + 93963670582309136, + 111520196492012970, + 21888242871839275222246405745257275088548364400416034343698183527507165137510, + 93798302803538806, + 21888242871839275222246405745257275088548364400416034343698187612229418453887, + 54759792402395276, + 136858794285559465, + 21888242871839275222246405745257275088548364400416034343698113881156691763847, + 21888242871839275222246405745257275088548364400416034343698196731556045641102, + 21888242871839275222246405745257275088548364400416034343698134618247405052919, + 95233040293905680, + 29635279580275330, + 11279590983561203, + 126751247231855701, + 21888242871839275222246405745257275088548364400416034343698066270301469217811, + 90010505220492444, + 21888242871839275222246405745257275088548364400416034343698133325065599114008, + 21888242871839275222246405745257275088548364400416034343698114396255813622296, + 16359014399399739, + 21888242871839275222246405745257275088548364400416034343698125437583945731128, + 21888242871839275222246405745257275088548364400416034343698186036492374964449, + 21888242871839275222246405745257275088548364400416034343698151447313000907391, + 21888242871839275222246405745257275088548364400416034343698068429079226320595, + 21888242871839275222246405745257275088548364400416034343698161174889142054927, + 87557881667157639, + 143160619885441330, + 41478408288480282, + 21888242871839275222246405745257275088548364400416034343698179373450155582478, + 21888242871839275222246405745257275088548364400416034343698197206722343367889, + 86562359338739372, + 107945335038138255, + 21888242871839275222246405745257275088548364400416034343698142516714025524239, + 21888242871839275222246405745257275088548364400416034343698159603136849721684, + 21888242871839275222246405745257275088548364400416034343698180463612186447092, + 21888242871839275222246405745257275088548364400416034343698060499334498008125, + 128041831528593432, + 34041408570329518, + 21888242871839275222246405745257275088548364400416034343698088074072574037443, + 31338085295870534, + 89799394551569890, + 112967976772891464, + 21888242871839275222246405745257275088548364400416034343698091104141341772051, + 21888242871839275222246405745257275088548364400416034343698100125455275368324, + 21888242871839275222246405745257275088548364400416034343698061173562505001289, + 98463261153964231, + 21888242871839275222246405745257275088548364400416034343698111987963517284217, + 21251655284359253, + 108331799347187162, + 21888242871839275222246405745257275088548364400416034343698137678526545017861, + 13577162226737114, + 21888242871839275222246405745257275088548364400416034343698089430219077038162, + 93575830259161684, + 21888242871839275222246405745257275088548364400416034343698189783775444430326, + 21888242871839275222246405745257275088548364400416034343698157606353636252410, + 21888242871839275222246405745257275088548364400416034343698096656026946708762, + 21888242871839275222246405745257275088548364400416034343698159726230014880291, + 21888242871839275222246405745257275088548364400416034343698178520042881655776, + 21888242871839275222246405745257275088548364400416034343698166278093351691228, + 21888242871839275222246405745257275088548364400416034343698141781803545589857, + 96101831999053803, + 21888242871839275222246405745257275088548364400416034343698118687530949325678, + 101138574320535188, + 21888242871839275222246405745257275088548364400416034343698079090382785092515, + 113314471283492114, + 66624206028206975, + 115566099316066076, + 21888242871839275222246405745257275088548364400416034343698092010597938442593, + 80264064530925129, + 53696557050618728, + 120284290712723748, + 21888242871839275222246405745257275088548364400416034343698191813198742139231, + 21888242871839275222246405745257275088548364400416034343698146904597681669274, + 126501465314486300, + 21888242871839275222246405745257275088548364400416034343698071797497328437867, + 21888242871839275222246405745257275088548364400416034343698151740915864399378, + 128670260933251421, + 21888242871839275222246405745257275088548364400416034343698134514520052402090, + 40774421323890023, + 105221900624186778, + 21888242871839275222246405745257275088548364400416034343698132588825423526889, + 21888242871839275222246405745257275088548364400416034343698174328174637800502, + 96580191626936217, + 21888242871839275222246405745257275088548364400416034343698164583200346859329, + 136651737430184409, + 21888242871839275222246405745257275088548364400416034343698154361822421785517, + 21888242871839275222246405745257275088548364400416034343698187212842800914668, + 21888242871839275222246405745257275088548364400416034343698133365530783552472, + 21888242871839275222246405745257275088548364400416034343698117693324886672383, + 21888242871839275222246405745257275088548364400416034343698158631333044035409, + 21888242871839275222246405745257275088548364400416034343698140364328930904992, + 21888242871839275222246405745257275088548364400416034343698144037892757160251, + 63172213060931941, + 21888242871839275222246405745257275088548364400416034343698116849202132891055, + 21888242871839275222246405745257275088548364400416034343698204154111889312419, + 21888242871839275222246405745257275088548364400416034343698115217358454829244, + 105217441512476611, + 138586897327387881, + 45692618966221473, + 21888242871839275222246405745257275088548364400416034343698122898368426398949, + 21888242871839275222246405745257275088548364400416034343698064855464463335323, + 81967167943377455, + 21888242871839275222246405745257275088548364400416034343698191886744405483922, + 21888242871839275222246405745257275088548364400416034343698150384933604237832, + 21888242871839275222246405745257275088548364400416034343698122646703312534297, + 21888242871839275222246405745257275088548364400416034343698194677884143044985, + 115015744960913488, + 21888242871839275222246405745257275088548364400416034343698145232927259652982, + 21888242871839275222246405745257275088548364400416034343698185869962899636042, + 50254895080198936, + 106555138576847680, + 34397034806725581, + 127247200198080909, + 37867917886613533, + 21888242871839275222246405745257275088548364400416034343698140243236733536773, + 21888242871839275222246405745257275088548364400416034343698076838670940921490, + 21888242871839275222246405745257275088548364400416034343698143439811982017008, + 21888242871839275222246405745257275088548364400416034343698117935393985013869, + 21888242871839275222246405745257275088548364400416034343698173511331090149995, + 29471164336384242, + 21888242871839275222246405745257275088548364400416034343698066778668640250536, + 21888242871839275222246405745257275088548364400416034343698109203621333022738, + 59687354847843271, + 21888242871839275222246405745257275088548364400416034343698146556350646662493, + 16066938710438679, + 21888242871839275222246405745257275088548364400416034343698091436777043164156, + 21888242871839275222246405745257275088548364400416034343698095168107787728799, + 115242856581473423, + 21888242871839275222246405745257275088548364400416034343698115683877637823329, + 21888242871839275222246405745257275088548364400416034343698165507559818643047, + 136664709775338613, + 21888242871839275222246405745257275088548364400416034343698101171440269960832, + 21888242871839275222246405745257275088548364400416034343698188514372200743281, + 77723071117283828, + 67872676264233274, + 21888242871839275222246405745257275088548364400416034343698064592895881914336, + 21888242871839275222246405745257275088548364400416034343698199352975636277759, + 21888242871839275222246405745257275088548364400416034343698096313220905635688, + 21888242871839275222246405745257275088548364400416034343698167399177835573985, + 21888242871839275222246405745257275088548364400416034343698088369773209672577, + 95169401421990438, + 132349170115928933, + 57785056665998409, + 21888242871839275222246405745257275088548364400416034343698201889359938134208, + 21888242871839275222246405745257275088548364400416034343698176593539731315101, + 95959896786623859, + 12382621680930644, + 115281589060030749, + 21888242871839275222246405745257275088548364400416034343698166627677624471255, + 21888242871839275222246405745257275088548364400416034343698093011915173463020, + 44610739375297372, + 21888242871839275222246405745257275088548364400416034343698076925791888137310, + 70133023046580130, + 21888242871839275222246405745257275088548364400416034343698110080767725878577, + 89183907720256121, + 21888242871839275222246405745257275088548364400416034343698153091896695255442, + 44510158455762828, + 21888242871839275222246405745257275088548364400416034343698084311132588879150, + 137724930278263964, + 94328571722592954, + 21888242871839275222246405745257275088548364400416034343698190309297391329885, + 9525687636179038, + 21888242871839275222246405745257275088548364400416034343698145698616512051531, + 16330459082312621, + 21888242871839275222246405745257275088548364400416034343698109630931314113486, + 16461644987951998, + 21888242871839275222246405745257275088548364400416034343698119451333990245657, + 70314450208078613, + 27625364500876168, + 100975022239106637, + 21888242871839275222246405745257275088548364400416034343698193465037902086315, + 65370392160048201, + 21888242871839275222246405745257275088548364400416034343698129243076136458613, + 120387296978525733, + 7919373193006572, + 105977385036839216, + 21888242871839275222246405745257275088548364400416034343698193972101342763273, + 21888242871839275222246405745257275088548364400416034343698177911064069230590, + 21888242871839275222246405745257275088548364400416034343698106943886771380242, + 95233500328875585, + 21888242871839275222246405745257275088548364400416034343698170871685914961357, + 73220206783760725, + 21888242871839275222246405745257275088548364400416034343698093767339027998102, + 134343317429347677, + 21888242871839275222246405745257275088548364400416034343698195349324208763336, + 34638929799239070, + 97155928296446697, + 21888242871839275222246405745257275088548364400416034343698091559279931776743, + 21888242871839275222246405745257275088548364400416034343698109471804105309079, + 84147496207481827, + 6778255225278696, + 21888242871839275222246405745257275088548364400416034343698077781927076226504, + 21888242871839275222246405745257275088548364400416034343698133469191884376455, + 21888242871839275222246405745257275088548364400416034343698159366457919103488, + 21888242871839275222246405745257275088548364400416034343698148944956757379271, + 115560876776160371, + 70848058915082232, + 31402677273097976, + 64581497104575875, + 5186128890147379, + 21888242871839275222246405745257275088548364400416034343698140198196249738275, + 21888242871839275222246405745257275088548364400416034343698087904097000308328, + 21888242871839275222246405745257275088548364400416034343698168028941010581997, + 21888242871839275222246405745257275088548364400416034343698109516194536989662, + 21888242871839275222246405745257275088548364400416034343698181215149675612190, + 49049934407667438, + 4522968932982280, + 2744727225722930, + 104370913588662170, + 21888242871839275222246405745257275088548364400416034343698138386397462902957, + 28577403833352315, + 21888242871839275222246405745257275088548364400416034343698064388191241855686, + 39435682299009709, + 94068070041595914, + 10971704398926420, + 21888242871839275222246405745257275088548364400416034343698158865923230081958, + 12726008656763194, + 42359488142630103, + 125444977926518937, + 21888242871839275222246405745257275088548364400416034343698111994512580129737, + 68744211604166802, + 21888242871839275222246405745257275088548364400416034343698088054805593964119, + 109885581988149440, + 21888242871839275222246405745257275088548364400416034343698110774947518585357, + 21888242871839275222246405745257275088548364400416034343698086201558293024186, + 112572553578440598, + 21888242871839275222246405745257275088548364400416034343698143237058732842574, + 40105355489514348, + 21888242871839275222246405745257275088548364400416034343698151158067334600763, + 51916001938873901, + 104023411471789396, + 16824475128482801, + 21888242871839275222246405745257275088548364400416034343698165688705428392978, + 86377191383059779, + 21888242871839275222246405745257275088548364400416034343698115989621510060735, + 21888242871839275222246405745257275088548364400416034343698139253783873321781, + 71838994664724122, + 90083157267493938, + 7535173834631477, + 48181294121201483, + 21888242871839275222246405745257275088548364400416034343698111394743657088282, + 21888242871839275222246405745257275088548364400416034343698185109723965298722, + 21888242871839275222246405745257275088548364400416034343698156933411520285099, + 49329228435560587, + 21888242871839275222246405745257275088548364400416034343698198008631240134445, + 38023575835437394, + 50701324246911203, + 137363773069039125, + 21888242871839275222246405745257275088548364400416034343698164789756594139353, + 21888242871839275222246405745257275088548364400416034343698188726977077411327, + 21888242871839275222246405745257275088548364400416034343698130001020187984864, + 21888242871839275222246405745257275088548364400416034343698153020709714155731, + 123838771810854802, + 41481556045151401, + 21888242871839275222246405745257275088548364400416034343698197026532137197785, + 21888242871839275222246405745257275088548364400416034343698078494891502187581, + 22568314653594862, + 10939021135249880, + 76124574128231832, + 72224402725947190, + 58397102228203055, + 87768100910199241, + 97600434609967260, + 21888242871839275222246405745257275088548364400416034343698109696748988700258, + 79226081564094618, + 21888242871839275222246405745257275088548364400416034343698145130067934825242, + 21888242871839275222246405745257275088548364400416034343698109146635009672455, + 21888242871839275222246405745257275088548364400416034343698136116394643257413, + 35739064083422814, + 21888242871839275222246405745257275088548364400416034343698083790314062274084, + 21888242871839275222246405745257275088548364400416034343698197530797430073646, + 87454100912831302, + 105207496237369397, + 142141835939174888, + 21888242871839275222246405745257275088548364400416034343698203455999919279747, + 21888242871839275222246405745257275088548364400416034343698113775821015295957, + 21888242871839275222246405745257275088548364400416034343698108974367542560251, + 21888242871839275222246405745257275088548364400416034343698079349460227870739, + 21888242871839275222246405745257275088548364400416034343698159968832101295873, + 100778404706040833, + 30454080643596834, + 105707845562787088, + 44088380205395217, + 21888242871839275222246405745257275088548364400416034343698101502232092907721, + 21888242871839275222246405745257275088548364400416034343698125543170128054888, + 21888242871839275222246405745257275088548364400416034343698161539074021945826, + 136322990568646361, + 21888242871839275222246405745257275088548364400416034343698106810850340525905, + 21888242871839275222246405745257275088548364400416034343698162499662170752793, + 27001107748088138, + 21888242871839275222246405745257275088548364400416034343698191834422561678224, + 21888242871839275222246405745257275088548364400416034343698098904910956604317, + 125950932686047235, + 21888242871839275222246405745257275088548364400416034343698186960504055193302, + 21888242871839275222246405745257275088548364400416034343698060560413627294233, + 143820185709451820, + 46599091474528778, + 21888242871839275222246405745257275088548364400416034343698158223177655574864, + 21888242871839275222246405745257275088548364400416034343698092974180009351909, + 61198921783315218, + 136677693180904133, + 21888242871839275222246405745257275088548364400416034343698182993273592562599, + 89527607116590329, + 21888242871839275222246405745257275088548364400416034343698136123353331284808, + 33195650392423623, + 133160197443102549, + 21888242871839275222246405745257275088548364400416034343698196569090177447426, + 21888242871839275222246405745257275088548364400416034343698069154401989081335, + 55985314234349996, + 4511522779174731, + 119094544069027101, + 21888242871839275222246405745257275088548364400416034343698064620110252515001, + 42735304299580257, + 21888242871839275222246405745257275088548364400416034343698167924744401270845, + 21888242871839275222246405745257275088548364400416034343698160641878299826054, + 21888242871839275222246405745257275088548364400416034343698194139409741646496, + 21888242871839275222246405745257275088548364400416034343698068897552498069923, + 126506141440110963, + 106532345045211322, + 141542842693561580, + 78480006735227386, + 135867212809010621, + 21888242871839275222246405745257275088548364400416034343698094307112458610853, + 3584286175125184, + 3378987452030716, + 38901675285241042, + 88316977150706079, + 141829625298870742, + 21888242871839275222246405745257275088548364400416034343698144160948679074658, + 52431244876702988, + 21888242871839275222246405745257275088548364400416034343698193665282397640517, + 3123553978807687, + 131351284529626391, + 21888242871839275222246405745257275088548364400416034343698111577586990886056, + 21888242871839275222246405745257275088548364400416034343698115233838757318029, + 19011242693415512, + 32820152092026138, + 59068747484188057, + 21888242871839275222246405745257275088548364400416034343698200117460175087645, + 116084085361399000, + 1333757895894456, + 23171771661048250, + 21888242871839275222246405745257275088548364400416034343698139890384338549408, + 118395873656954525, + 21888242871839275222246405745257275088548364400416034343698164761639786162414, + 83980838454948238, + 66068281601024361, + 25627497033829449, + 21888242871839275222246405745257275088548364400416034343698100146705843996782, + 30571061531528488, + 21888242871839275222246405745257275088548364400416034343698193261313637158287, + 21888242871839275222246405745257275088548364400416034343698124670771727063716, + 21888242871839275222246405745257275088548364400416034343698060307319973697729, + 114055935465463282, + 77181473771902363, + 76681077659097921, + 21888242871839275222246405745257275088548364400416034343698087404309408039457, + 133709419088506559, + 90744377076165295, + 108880490474397316, + 21888242871839275222246405745257275088548364400416034343698114404292927160814, + 33605715472197708, + 21888242871839275222246405745257275088548364400416034343698079456558151159122, + 21888242871839275222246405745257275088548364400416034343698159662207143360282, + 21888242871839275222246405745257275088548364400416034343698093997040360521956, + 96051816447784999, + 21888242871839275222246405745257275088548364400416034343698194795634986055799, + 32826015519752884, + 56145868357340525, + 21888242871839275222246405745257275088548364400416034343698169900311663791421, + 56866837001371486, + 133385591184595766, + 140749976464898644, + 23270982135186688, + 132225052974686371, + 21888242871839275222246405745257275088548364400416034343698179105559368580418, + 130863537279157728, + 21888242871839275222246405745257275088548364400416034343698118266716089958057, + 21888242871839275222246405745257275088548364400416034343698106133434542225018, + 21888242871839275222246405745257275088548364400416034343698105411069516816116, + 132134174394507455, + 21888242871839275222246405745257275088548364400416034343698153024942390490476, + 26853372763473240, + 21888242871839275222246405745257275088548364400416034343698131472098282463160, + 21888242871839275222246405745257275088548364400416034343698128223867910240427, + 21888242871839275222246405745257275088548364400416034343698146503674820306586, + 126054783384485894, + 82032080065155621, + 21888242871839275222246405745257275088548364400416034343698091710638991130083, + 21888242871839275222246405745257275088548364400416034343698065293455732758059, + 21888242871839275222246405745257275088548364400416034343698124320599090782956, + 21888242871839275222246405745257275088548364400416034343698168438373011583123, + 1462610498525998, + 21888242871839275222246405745257275088548364400416034343698147228109675121838, + 21888242871839275222246405745257275088548364400416034343698113073642343915908, + 18562620002869877, + 142066725978960340, + 15618412404771743, + 53836008643993429, + 21888242871839275222246405745257275088548364400416034343698095045901990922283, + 33233104851011973, + 121009201493127622, + 134561031381212698, + 140249936941011015, + 21888242871839275222246405745257275088548364400416034343698194418143400414862, + 90473107482205993, + 21888242871839275222246405745257275088548364400416034343698195752146452739203, + 67665802626161381, + 21888242871839275222246405745257275088548364400416034343698092243455512643956, + 21888242871839275222246405745257275088548364400416034343698070367011631540981, + 134031139859879532, + 21888242871839275222246405745257275088548364400416034343698172503435088601381, + 77166256121915400, + 21888242871839275222246405745257275088548364400416034343698183630913246870303, + 21888242871839275222246405745257275088548364400416034343698180524783429774726, + 21888242871839275222246405745257275088548364400416034343698166501328386582685, + 24367943897333819, + 38313267754752216, + 21888242871839275222246405745257275088548364400416034343698089371222641471601, + 21888242871839275222246405745257275088548364400416034343698125853406780780260, + 21888242871839275222246405745257275088548364400416034343698097744611210061400, + 87468316054423704, + 144102875168179461, + 31968217671760481, + 21888242871839275222246405745257275088548364400416034343698114512941921469474, + 21888242871839275222246405745257275088548364400416034343698106266075091778219, + 21888242871839275222246405745257275088548364400416034343698115866553858470300, + 927139807411541, + 21888242871839275222246405745257275088548364400416034343698185888416518439807, + 21888242871839275222246405745257275088548364400416034343698160806806191310907, + 113218067791938352, + 21888242871839275222246405745257275088548364400416034343698171742360437654859, + 5815325643026097, + 41225878862986814, + 21888242871839275222246405745257275088548364400416034343698064085641699561580, + 21888242871839275222246405745257275088548364400416034343698184034499217227090, + 21888242871839275222246405745257275088548364400416034343698062695859209899978, + 68848822444335848, + 21888242871839275222246405745257275088548364400416034343698154527030868142377, + 21888242871839275222246405745257275088548364400416034343698137110800640804856, + 21888242871839275222246405745257275088548364400416034343698120869548147660543, + 137268275085514733, + 21888242871839275222246405745257275088548364400416034343698133823325671547129, + 21888242871839275222246405745257275088548364400416034343698200322024068103716, + 40256386293338104, + 71385927403592087, + 89829905262377284, + 21888242871839275222246405745257275088548364400416034343698151748231758393049, + 7878169066496182, + 71754725220837992, + 47993280872889467, + 21888242871839275222246405745257275088548364400416034343698178351543364600186, + 21888242871839275222246405745257275088548364400416034343698144478725558278847, + 10089048863018666, + 21888242871839275222246405745257275088548364400416034343698195703389921083911, + 21888242871839275222246405745257275088548364400416034343698093958667637138398, + 21888242871839275222246405745257275088548364400416034343698077348899624094766, + 21888242871839275222246405745257275088548364400416034343698083668972436134154, + 21888242871839275222246405745257275088548364400416034343698187872599919709701, + 68086815943355759, + 21888242871839275222246405745257275088548364400416034343698066167402559953992, + 89805094769850265, + 15652297329348118, + 94738436681557456, + 125043665161176162, + 21888242871839275222246405745257275088548364400416034343698106540077723514596, + 21888242871839275222246405745257275088548364400416034343698201474400127931050, + 80108935856655333, + 118377588157561574, + 21888242871839275222246405745257275088548364400416034343698105160956097376959, + 21888242871839275222246405745257275088548364400416034343698063984301247617792, + 21888242871839275222246405745257275088548364400416034343698126704435440563796, + 87277552642509277, + 77312491044351534, + 21888242871839275222246405745257275088548364400416034343698186108274570299390, + 133044967933556694, + 140456384577257868, + 21888242871839275222246405745257275088548364400416034343698173934541232798772, + 21888242871839275222246405745257275088548364400416034343698142487878038469206, + 21888242871839275222246405745257275088548364400416034343698145870421968625517, + 21888242871839275222246405745257275088548364400416034343698174557773931347235, + 21888242871839275222246405745257275088548364400416034343698095961931237222526, + 21888242871839275222246405745257275088548364400416034343698137301318563578779, + 126139362192957135, + 53008341046487037, + 21888242871839275222246405745257275088548364400416034343698191294276635807583, + 62860206414539010, + 21888242871839275222246405745257275088548364400416034343698193797697136735528, + 43485613916322711, + 21888242871839275222246405745257275088548364400416034343698065806340733538687, + 52228883521537431, + 95972191724384488, + 21888242871839275222246405745257275088548364400416034343698176534319834723988, + 135504301750801235, + 21888242871839275222246405745257275088548364400416034343698141482093996206799, + 11980442010322286, + 130730852746856634, + 91739811543050225, + 21888242871839275222246405745257275088548364400416034343698062407222747965020, + 21888242871839275222246405745257275088548364400416034343698102415608511863230, + 17261690915706976, + 21888242871839275222246405745257275088548364400416034343698161805214969019473, + 12134305262422611, + 6059202362710165, + 21888242871839275222246405745257275088548364400416034343698170283681075602331, + 21888242871839275222246405745257275088548364400416034343698068795398744852288, + 21888242871839275222246405745257275088548364400416034343698114186687887700323, + 27145152975915916, + 26282363602560103, + 27928599664791012, + 21888242871839275222246405745257275088548364400416034343698188351037272260760, + 67646507608786817, + 17751736473955450, + 23695820065247801, + 66369007835746727, + 21888242871839275222246405745257275088548364400416034343698102305066246687319, + 21888242871839275222246405745257275088548364400416034343698076879563787857840, + 21888242871839275222246405745257275088548364400416034343698167148837504662230, + 21888242871839275222246405745257275088548364400416034343698162909528293535099, + 16997189899881367, + 21888242871839275222246405745257275088548364400416034343698183226908787474068, + 100197781041006306, + 21888242871839275222246405745257275088548364400416034343698092695014371741786, + 21888242871839275222246405745257275088548364400416034343698082274773142734203, + 21888242871839275222246405745257275088548364400416034343698106567759146524199, + 21888242871839275222246405745257275088548364400416034343698172620160745418352, + 122897492109001090, + 21888242871839275222246405745257275088548364400416034343698096715945736790340, + 21888242871839275222246405745257275088548364400416034343698085874133903572859, + 34279078902372580, + 97388734648269322, + 126964018138045489, + 21888242871839275222246405745257275088548364400416034343698077106232983025467, + 21888242871839275222246405745257275088548364400416034343698074799450615286686, + 21888242871839275222246405745257275088548364400416034343698061287546001978444, + 52208778138795360, + 94473720202514767, + 50365769015136565, + 106117663101405236, + 21888242871839275222246405745257275088548364400416034343698170301945360980060, + 21888242871839275222246405745257275088548364400416034343698094944935366265820, + 68188876557217165, + 13779189842675774, + 21888242871839275222246405745257275088548364400416034343698194413024195250478, + 21888242871839275222246405745257275088548364400416034343698165136143571999981, + 21888242871839275222246405745257275088548364400416034343698145313267093037204, + 21888242871839275222246405745257275088548364400416034343698108906795146699141, + 41529294369401088, + 21888242871839275222246405745257275088548364400416034343698111570642539002832, + 21888242871839275222246405745257275088548364400416034343698078320594694399920, + 18089341627858559, + 21888242871839275222246405745257275088548364400416034343698198226518168764826, + 31716893053635164, + 21888242871839275222246405745257275088548364400416034343698188817813422446810, + 109556382162878669, + 134382710845359113, + 130673358715795150, + 21888242871839275222246405745257275088548364400416034343698086205736120077581, + 70846893524331807, + 21888242871839275222246405745257275088548364400416034343698169678858937798427, + 135649721159451400, + 21888242871839275222246405745257275088548364400416034343698133709692868304694, + 21888242871839275222246405745257275088548364400416034343698192306999442508804, + 21888242871839275222246405745257275088548364400416034343698067315346938796614, + 21888242871839275222246405745257275088548364400416034343698176119043823510356, + 6464728013577000, + 21888242871839275222246405745257275088548364400416034343698180839601599738100, + 8393294188488625, + 21888242871839275222246405745257275088548364400416034343698068660565284218669, + 21888242871839275222246405745257275088548364400416034343698129461165049019358, + 21888242871839275222246405745257275088548364400416034343698092857437804129384, + 102959108096146788, + 21888242871839275222246405745257275088548364400416034343698144087415240650299, + 21888242871839275222246405745257275088548364400416034343698140964233701270312, + 21888242871839275222246405745257275088548364400416034343698192183355104249296, + 21888242871839275222246405745257275088548364400416034343698164251953248819772, + 40408020745176146, + 21888242871839275222246405745257275088548364400416034343698172503700243905170, + 21888242871839275222246405745257275088548364400416034343698196825523034400323, + 71803886527644608, + 122644396062661546, + 112968218063288432, + 18697301010814754, + 21888242871839275222246405745257275088548364400416034343698158879090677343295, + 21888242871839275222246405745257275088548364400416034343698108847619163973043, + 21888242871839275222246405745257275088548364400416034343698124767731853221126, + 10789054864976689, + 21888242871839275222246405745257275088548364400416034343698133831143012456851, + 26878591343264998, + 21888242871839275222246405745257275088548364400416034343698136429033161991276, + 130506543992079854, + 21888242871839275222246405745257275088548364400416034343698201292283648065149, + 32606639504323976, + 124148096259692541, + 21888242871839275222246405745257275088548364400416034343698119443667288577855, + 84527674861308929, + 38825780299821052, + 68058258432548370, + 21888242871839275222246405745257275088548364400416034343698189087500284277354, + 22750580832406077, + 137417086640045197, + 21888242871839275222246405745257275088548364400416034343698187454539895289850, + 21888242871839275222246405745257275088548364400416034343698078936137119132589, + 111097766682742870, + 35049901764706185, + 21888242871839275222246405745257275088548364400416034343698143662043895937532, + 21888242871839275222246405745257275088548364400416034343698158446512471308731, + 25672085338130505, + 131591353937985755, + 31788945166489805, + 113180426834679725, + 21888242871839275222246405745257275088548364400416034343698173701460869559977, + 126036370988200591, + 21888242871839275222246405745257275088548364400416034343698160409897975347635, + 131348904517940022, + 21888242871839275222246405745257275088548364400416034343698176992637299774327, + 42940908414296182, + 21888242871839275222246405745257275088548364400416034343698172299254304704050, + 121146845495994903, + 21888242871839275222246405745257275088548364400416034343698164535515459600645, + 21888242871839275222246405745257275088548364400416034343698118578712962135785, + 134531603864764618, + 92893788133308030, + 21888242871839275222246405745257275088548364400416034343698139868102221160961, + 21888242871839275222246405745257275088548364400416034343698183871985819691457, + 49902207122961668, + 21888242871839275222246405745257275088548364400416034343698179355963489326519, + 128401538135437182, + 84351740908545528, + 114552441506359602, + 21888242871839275222246405745257275088548364400416034343698167132674499131693, + 21888242871839275222246405745257275088548364400416034343698158994881142934696, + 21888242871839275222246405745257275088548364400416034343698102757348620448995, + 21888242871839275222246405745257275088548364400416034343698070358063185641829, + 1330369754884486, + 21888242871839275222246405745257275088548364400416034343698145845837653793137, + 21888242871839275222246405745257275088548364400416034343698117058635246082507, + 21888242871839275222246405745257275088548364400416034343698145178503722772778, + 21888242871839275222246405745257275088548364400416034343698180992562558837049, + 136869051241145413, + 21888242871839275222246405745257275088548364400416034343698157618588906372273, + 137471703970941216, + 119693062068266087, + 136897765387798268, + 122064226204975891, + 21888242871839275222246405745257275088548364400416034343698118391318112256557, + 62595052812195547, + 21888242871839275222246405745257275088548364400416034343698168232307848628505, + 68591909975828840, + 21888242871839275222246405745257275088548364400416034343698153676881181251035, + 124478821825008754, + 42922217120770629, + 21888242871839275222246405745257275088548364400416034343698078859559671380332, + 21888242871839275222246405745257275088548364400416034343698195643224112077897, + 43146800956299899, + 131825844430724988, + 114661369923176858, + 107128542785576212, + 142242904624520444, + 21888242871839275222246405745257275088548364400416034343698117861973413185953, + 21888242871839275222246405745257275088548364400416034343698109702323382953565, + 96307224085608269, + 21888242871839275222246405745257275088548364400416034343698189622182646998475, + 21888242871839275222246405745257275088548364400416034343698168697020988616788, + 21888242871839275222246405745257275088548364400416034343698165387574326702555, + 21888242871839275222246405745257275088548364400416034343698117703888649168392, + 104243680145060350, + 21888242871839275222246405745257275088548364400416034343698203229351122033712, + 21888242871839275222246405745257275088548364400416034343698169418397273698062, + 106734965096004169, + 10507780513705558, + 21888242871839275222246405745257275088548364400416034343698132865973338879822, + 65518208379034168, + 21888242871839275222246405745257275088548364400416034343698075571884810976631, + 21888242871839275222246405745257275088548364400416034343698198536019943460472, + 77494734591013902, + 41166292121764891, + 21888242871839275222246405745257275088548364400416034343698077919520780400996, + 96819456164336463, + 111154245438511033, + 140344474842427468, + 21888242871839275222246405745257275088548364400416034343698114731444492613194, + 21888242871839275222246405745257275088548364400416034343698136671415098759065, + 2665260507277763, + 21888242871839275222246405745257275088548364400416034343698157790327633372125, + 21888242871839275222246405745257275088548364400416034343698139296725767494873, + 21888242871839275222246405745257275088548364400416034343698155062449991629998, + 2007597354252986, + 21888242871839275222246405745257275088548364400416034343698187685940882970028, + 46503771893069987, + 21888242871839275222246405745257275088548364400416034343698153443315220007927, + 21888242871839275222246405745257275088548364400416034343698159030312090332103, + 28763856812269828, + 14937612877888591, + 21888242871839275222246405745257275088548364400416034343698083310652005274263, + 118175870516349408, + 21888242871839275222246405745257275088548364400416034343698143544426653130030, + 56536172686977983, + 21888242871839275222246405745257275088548364400416034343698091275256758350224, + 52103885990700394, + 133452557789726542, + 21888242871839275222246405745257275088548364400416034343698153391909133218519, + 115794245901835968, + 89730623604871963, + 25335512357980539, + 21888242871839275222246405745257275088548364400416034343698155914242314896873, + 21888242871839275222246405745257275088548364400416034343698062351657469811676, + 21888242871839275222246405745257275088548364400416034343698192882041338058249, + 21888242871839275222246405745257275088548364400416034343698166224787570866977, + 21888242871839275222246405745257275088548364400416034343698095632957403223244, + 21888242871839275222246405745257275088548364400416034343698068904234679940164, + 21888242871839275222246405745257275088548364400416034343698162337223116989639, + 21888242871839275222246405745257275088548364400416034343698127867321376381007, + 65149681249953303, + 21888242871839275222246405745257275088548364400416034343698062527519399281047, + 64113042667663056, + 21888242871839275222246405745257275088548364400416034343698068722885886401523, + 21888242871839275222246405745257275088548364400416034343698089142982408564797, + 21888242871839275222246405745257275088548364400416034343698141470828006702119, + 21888242871839275222246405745257275088548364400416034343698088456021451343972, + 96407984116817858, + 241794564377192, + 88799979798123463, + 21888242871839275222246405745257275088548364400416034343698119417106499921283, + 96423190249936068, + 21888242871839275222246405745257275088548364400416034343698088269284728680185, + 75814375006405330, + 62618422186656121, + 40559142455859122, + 21888242871839275222246405745257275088548364400416034343698144423729589319367, + 21888242871839275222246405745257275088548364400416034343698138605126899984938, + 21888242871839275222246405745257275088548364400416034343698085907420702388926, + 117283458096086745, + 21888242871839275222246405745257275088548364400416034343698067811708186938783, + 90637313944886608, + 21888242871839275222246405745257275088548364400416034343698203888440852104342, + 37132598132127970, + 21888242871839275222246405745257275088548364400416034343698101268756682166495, + 71504240167174005, + 21888242871839275222246405745257275088548364400416034343698154868565072291288, + 6530253872031589, + 21888242871839275222246405745257275088548364400416034343698172989237310245782, + 113593886205621345, + 21888242871839275222246405745257275088548364400416034343698137183504965264494, + 21888242871839275222246405745257275088548364400416034343698066847742520823842, + 129782981523061395, + 94427427598072875, + 21888242871839275222246405745257275088548364400416034343698140560321888928736, + 41505101483255081, + 21888242871839275222246405745257275088548364400416034343698099940392434759109, + 21888242871839275222246405745257275088548364400416034343698142810777928130113, + 21888242871839275222246405745257275088548364400416034343698120417744433430121, + 21888242871839275222246405745257275088548364400416034343698148454260330805795, + 1680541964844648, + 18976610487527288, + 21888242871839275222246405745257275088548364400416034343698082841356394585064, + 46765775937190752, + 15333877176613495, + 18788389120333847, + 40168264111733619, + 21888242871839275222246405745257275088548364400416034343698159479143262983594, + 21888242871839275222246405745257275088548364400416034343698085037108148088821, + 21888242871839275222246405745257275088548364400416034343698145567006415725489, + 96765120558507783, + 21888242871839275222246405745257275088548364400416034343698198783563674461829, + 21888242871839275222246405745257275088548364400416034343698081105049849562604, + 100497663119992699, + 74209811613542192, + 21888242871839275222246405745257275088548364400416034343698137393770896536151, + 21888242871839275222246405745257275088548364400416034343698148465681674598509, + 21888242871839275222246405745257275088548364400416034343698154477820750841101, + 134038302511708936, + 94195391871892741, + 21888242871839275222246405745257275088548364400416034343698150739682735249946, + 105683293963076702, + 59461431610123048, + 21888242871839275222246405745257275088548364400416034343698142163463383205266, + 43475308118997832, + 21888242871839275222246405745257275088548364400416034343698102548509653112340, + 21888242871839275222246405745257275088548364400416034343698132139368760944569, + 21888242871839275222246405745257275088548364400416034343698087360717761870822, + 58436501991380432, + 21888242871839275222246405745257275088548364400416034343698132095348189112239, + 21888242871839275222246405745257275088548364400416034343698098161013104019944, + 81469587662689622, + 21888242871839275222246405745257275088548364400416034343698088457795344927210, + 43186533795237291, + 111590854611604099, + 21888242871839275222246405745257275088548364400416034343698125978177545512743, + 21888242871839275222246405745257275088548364400416034343698172130034917276284, + 21888242871839275222246405745257275088548364400416034343698169227158245664677, + 74152727323570806, + 4221744258558674, + 136136129427325318, + 21888242871839275222246405745257275088548364400416034343698199493050761392696, + 58996927332909725, + 21888242871839275222246405745257275088548364400416034343698191235450809817999, + 21888242871839275222246405745257275088548364400416034343698080847254403819367, + 21888242871839275222246405745257275088548364400416034343698099493240688920231, + 21888242871839275222246405745257275088548364400416034343698175366505767398453, + 139236294427411227, + 142663179709237291, + 40474175629671605, + 21888242871839275222246405745257275088548364400416034343698185627667361812663, + 21888242871839275222246405745257275088548364400416034343698064837995356766020, + 12709201824543982, + 54147621302957851, + 21888242871839275222246405745257275088548364400416034343698186889198697885623, + 21888242871839275222246405745257275088548364400416034343698100122799961096820, + 21888242871839275222246405745257275088548364400416034343698191171561064512322, + 27294357743215346, + 51887826056783752, + 54835897861237400, + 21888242871839275222246405745257275088548364400416034343698105274985750232658, + 21888242871839275222246405745257275088548364400416034343698080312397494578622, + 84779633440119073, + 62756906003206457, + 81099765669380042, + 100027991594418007, + 3251428668081684, + 102893400813341391, + 21888242871839275222246405745257275088548364400416034343698096100789419913256, + 122490842766415674, + 21888242871839275222246405745257275088548364400416034343698135687794984053295, + 21888242871839275222246405745257275088548364400416034343698088951819252235600, + 21888242871839275222246405745257275088548364400416034343698143863080187546591, + 21888242871839275222246405745257275088548364400416034343698155016092002819682, + 93245439366276757, + 21888242871839275222246405745257275088548364400416034343698127470968759424759, + 21888242871839275222246405745257275088548364400416034343698140208727769752354, + 89341326642124956, + 80973225087152885, + 79522770968458589, + 116620574007235770, + 98867539122072309, + 21888242871839275222246405745257275088548364400416034343698190153812227077804, + 21888242871839275222246405745257275088548364400416034343698095060272481443474, + 21888242871839275222246405745257275088548364400416034343698186319557582236316, + 21888242871839275222246405745257275088548364400416034343698184902043577704410, + 21888242871839275222246405745257275088548364400416034343698083573241734930499, + 92023762195577274, + 108151585958374587, + 21888242871839275222246405745257275088548364400416034343698143944003895056858, + 21888242871839275222246405745257275088548364400416034343698115747972932668261, + 21888242871839275222246405745257275088548364400416034343698181293124504079305, + 39119625885364342, + 21888242871839275222246405745257275088548364400416034343698154692968516471657, + 21888242871839275222246405745257275088548364400416034343698086838004976690297, + 21888242871839275222246405745257275088548364400416034343698067244174460615801, + 21888242871839275222246405745257275088548364400416034343698136277821743287301, + 21888242871839275222246405745257275088548364400416034343698138065403991506337, + 48137937009397198, + 21888242871839275222246405745257275088548364400416034343698087261345492245490, + 56240017458796602, + 130946960152688729, + 21888242871839275222246405745257275088548364400416034343698087770071203519549, + 21888242871839275222246405745257275088548364400416034343698100611823923250980, + 17326047318994158, + 21888242871839275222246405745257275088548364400416034343698123655749215378233, + 86081369691250332, + 46425385098735945, + 21888242871839275222246405745257275088548364400416034343698140827550735232896, + 128169232619633834, + 141083175037284914, + 21888242871839275222246405745257275088548364400416034343698144629585742108105, + 21888242871839275222246405745257275088548364400416034343698200397316320608648, + 49563661267180609, + 21888242871839275222246405745257275088548364400416034343698092999643695021050, + 21888242871839275222246405745257275088548364400416034343698197027641913218355, + 116234141113177861, + 21888242871839275222246405745257275088548364400416034343698060551098451520320, + 17072221191261002, + 21888242871839275222246405745257275088548364400416034343698198128120741414494, + 21888242871839275222246405745257275088548364400416034343698167336973829790959, + 12310510523530733, + 21888242871839275222246405745257275088548364400416034343698188475656637377869, + 21888242871839275222246405745257275088548364400416034343698083882732564108247, + 27289510532316619, + 21888242871839275222246405745257275088548364400416034343698199287455884220211, + 21888242871839275222246405745257275088548364400416034343698169150083798809776, + 21888242871839275222246405745257275088548364400416034343698141785113287676015, + 119330299526986334, + 83261960250428086, + 21888242871839275222246405745257275088548364400416034343698078123137773872721, + 21888242871839275222246405745257275088548364400416034343698157818590000117002, + 130796637678954369, + 21888242871839275222246405745257275088548364400416034343698149493251609590449, + 21888242871839275222246405745257275088548364400416034343698113767446591774708, + 21888242871839275222246405745257275088548364400416034343698190664503454126037, + 41432059431011078, + 21888242871839275222246405745257275088548364400416034343698107002281460121183, + 11908616698406353, + 36543493605580555, + 21888242871839275222246405745257275088548364400416034343698069823428254439838, + 21888242871839275222246405745257275088548364400416034343698168214332802380168, + 100617567683001608, + 21888242871839275222246405745257275088548364400416034343698138947193628288698, + 112568038855825112, + 25453178263840900, + 13341580168885968, + 21888242871839275222246405745257275088548364400416034343698158899588880702741, + 21888242871839275222246405745257275088548364400416034343698189531957932287770, + 21888242871839275222246405745257275088548364400416034343698197013845803996656, + 21888242871839275222246405745257275088548364400416034343698173137178620751640, + 22743124768864584, + 27445220621169741, + 21888242871839275222246405745257275088548364400416034343698139536477448264936, + 21888242871839275222246405745257275088548364400416034343698159474827581833954, + 21888242871839275222246405745257275088548364400416034343698155566065845747541, + 21888242871839275222246405745257275088548364400416034343698183428522307189184, + 21888242871839275222246405745257275088548364400416034343698103340886315222501, + 112052934121941365, + 122051375610011431, + 139966860026865676, + 71234508063781158, + 21888242871839275222246405745257275088548364400416034343698075707522702970511, + 95384282471855140, + 21888242871839275222246405745257275088548364400416034343698078544543647204889, + 105253187241418158, + 21888242871839275222246405745257275088548364400416034343698175447813992881490, + 21888242871839275222246405745257275088548364400416034343698121745436554913788, + 35534757048856847, + 138361533906480900, + 21888242871839275222246405745257275088548364400416034343698195735472315687131, + 141878290346200594, + 21888242871839275222246405745257275088548364400416034343698165368711383982644, + 44286325370845360, + 21888242871839275222246405745257275088548364400416034343698165647729524872053, + 21888242871839275222246405745257275088548364400416034343698193368824070353254, + 71888771539318382, + 21888242871839275222246405745257275088548364400416034343698131772986086071539, + 21888242871839275222246405745257275088548364400416034343698111865062629843600, + 137420968401867135, + 21888242871839275222246405745257275088548364400416034343698064434923309434166, + 21888242871839275222246405745257275088548364400416034343698073475513520656248, + 21888242871839275222246405745257275088548364400416034343698095355328442712724, + 22426379190587442, + 21888242871839275222246405745257275088548364400416034343698100994790470470249, + 62181552458247718, + 21888242871839275222246405745257275088548364400416034343698066459975115279281, + 21888242871839275222246405745257275088548364400416034343698199192399576658698, + 47302754728204973, + 138762810288794755, + 9690208859263422, + 61815222994621166, + 21888242871839275222246405745257275088548364400416034343698102557250512717788, + 21888242871839275222246405745257275088548364400416034343698074136406291610064, + 139323420453113631, + 90136221148383179, + 86411763911055015, + 18922131549865264, + 21888242871839275222246405745257275088548364400416034343698116313454553457622, + 79382035535978231, + 5016755885355364, + 70906513613207662, + 95265818133310793, + 21888242871839275222246405745257275088548364400416034343698075413882422160434, + 133374145095427048, + 21888242871839275222246405745257275088548364400416034343698203856591593405762, + 21888242871839275222246405745257275088548364400416034343698146137103238456744, + 21888242871839275222246405745257275088548364400416034343698148012929018320189, + 21888242871839275222246405745257275088548364400416034343698077435048835204506, + 21888242871839275222246405745257275088548364400416034343698195097825318831496, + 107616318384179890, + 21888242871839275222246405745257275088548364400416034343698118101734025639042, + 21888242871839275222246405745257275088548364400416034343698107033981510250729, + 17919036127709937, + 21888242871839275222246405745257275088548364400416034343698143199852309733888, + 21888242871839275222246405745257275088548364400416034343698145135154110869488, + 71473038764790081, + 21888242871839275222246405745257275088548364400416034343698078746921127909274, + 34501170838482656, + 62760543078220702, + 8237812994265407, + 21888242871839275222246405745257275088548364400416034343698060641391946774083, + 21888242871839275222246405745257275088548364400416034343698201263989275640839, + 88960319387278232, + 67256742417123581, + 140448838681380466, + 21888242871839275222246405745257275088548364400416034343698072092937740111563, + 21888242871839275222246405745257275088548364400416034343698095540226178948532, + 112395718043632931, + 21888242871839275222246405745257275088548364400416034343698155698653440265721, + 46345020490925122, + 143949645739941794, + 21888242871839275222246405745257275088548364400416034343698081141337391491232, + 21888242871839275222246405745257275088548364400416034343698131488058159213336, + 38418021650235049, + 116797017081451858, + 21888242871839275222246405745257275088548364400416034343698163712590223041536, + 21888242871839275222246405745257275088548364400416034343698168486751942649470, + 21888242871839275222246405745257275088548364400416034343698151269893934110212, + 21888242871839275222246405745257275088548364400416034343698068647752962627836, + 47823133913312557, + 7887080524826510, + 21888242871839275222246405745257275088548364400416034343698163735700925150171, + 21888242871839275222246405745257275088548364400416034343698190332678347345478, + 21888242871839275222246405745257275088548364400416034343698141733097543898048, + 72143473298753954, + 71407522319712362, + 43244521701112761, + 21888242871839275222246405745257275088548364400416034343698116857683597783267, + 21888242871839275222246405745257275088548364400416034343698162512254463014750, + 128509345862764303, + 21888242871839275222246405745257275088548364400416034343698160100703243155181, + 21888242871839275222246405745257275088548364400416034343698096754801043109953, + 96713175024404592, + 476631369732752, + 21888242871839275222246405745257275088548364400416034343698087187804785536117, + 11921884643401692, + 53950315071949211, + 21888242871839275222246405745257275088548364400416034343698102248352797431296, + 40073626245648773, + 124681319471459747, + 128649070314100480, + 27712744335119062, + 21888242871839275222246405745257275088548364400416034343698107582348270489043, + 48457551816683521, + 21888242871839275222246405745257275088548364400416034343698117277413410275724, + 13373244264685289, + 15209925310189577, + 48414203294619292, + 21888242871839275222246405745257275088548364400416034343698149465044146522326, + 81028307665780681, + 21888242871839275222246405745257275088548364400416034343698191414469701294246, + 118640716647348296, + 48013607590944140, + 21888242871839275222246405745257275088548364400416034343698063513454819455324, + 21888242871839275222246405745257275088548364400416034343698147097460944880910, + 21888242871839275222246405745257275088548364400416034343698163146602804662665, + 21888242871839275222246405745257275088548364400416034343698184118718097228534, + 21888242871839275222246405745257275088548364400416034343698086171513472139504, + 21888242871839275222246405745257275088548364400416034343698113405704313417014, + 79087673013813100, + 21888242871839275222246405745257275088548364400416034343698154771233917373048, + 21888242871839275222246405745257275088548364400416034343698128577376998754836, + 138342985365721563, + 21888242871839275222246405745257275088548364400416034343698203709380182078865, + 29616422009576123, + 63080238893346206, + 21888242871839275222246405745257275088548364400416034343698174443308912880906, + 8875149143570738, + 21888242871839275222246405745257275088548364400416034343698113654014783998817, + 24211653451735853, + 49379530616260874, + 21888242871839275222246405745257275088548364400416034343698094724126807314513, + 1167952244182779, + 127379920398659088, + 105299367073540964, + 96917023906024695, + 21888242871839275222246405745257275088548364400416034343698088173136658475816, + 21888242871839275222246405745257275088548364400416034343698160415014909645477, + 41805253488287731, + 21888242871839275222246405745257275088548364400416034343698067026029219782043, + 28978446406042004, + 21888242871839275222246405745257275088548364400416034343698070581004581075299, + 21888242871839275222246405745257275088548364400416034343698099885432295625813, + 40517518381446305, + 4183128673243934, + 21888242871839275222246405745257275088548364400416034343698182959222670751047, + 51853706519076924, + 21888242871839275222246405745257275088548364400416034343698148069732817965856, + 134173824064732926, + 100139920488252955, + 21888242871839275222246405745257275088548364400416034343698098279035958091403, + 21888242871839275222246405745257275088548364400416034343698199069034308821696, + 21888242871839275222246405745257275088548364400416034343698110010245072299844, + 83984669543347014, + 21888242871839275222246405745257275088548364400416034343698085924270254453700, + 8093838383012917, + 21888242871839275222246405745257275088548364400416034343698201285223578107202, + 59328194224334562, + 62250432646350665, + 21888242871839275222246405745257275088548364400416034343698142302686755559915, + 85598988949452681, + 52274758983098501, + 21888242871839275222246405745257275088548364400416034343698164404987064969484, + 130897482829068634, + 22104026505514186, + 21888242871839275222246405745257275088548364400416034343698195260561865060080, + 24499368230234795, + 21888242871839275222246405745257275088548364400416034343698139522667375705892, + 21888242871839275222246405745257275088548364400416034343698122857752347874233, + 21888242871839275222246405745257275088548364400416034343698094534440537562218, + 21888242871839275222246405745257275088548364400416034343698086114953671872114, + 110121594767317293, + 55603761982327053, + 21888242871839275222246405745257275088548364400416034343698153143208349170386, + 52577457960690533, + 21888242871839275222246405745257275088548364400416034343698179086596199821394, + 21888242871839275222246405745257275088548364400416034343698151439338038395092, + 21888242871839275222246405745257275088548364400416034343698123383893092304024, + 21888242871839275222246405745257275088548364400416034343698118077621670184054, + 140191892320273115, + 21888242871839275222246405745257275088548364400416034343698131230583576862252, + 21888242871839275222246405745257275088548364400416034343698148265425767506854, + 21888242871839275222246405745257275088548364400416034343698070715490192078223, + 84108096716641882, + 21888242871839275222246405745257275088548364400416034343698110877997797023222, + 37906076569307697, + 21888242871839275222246405745257275088548364400416034343698191378168007906654, + 21888242871839275222246405745257275088548364400416034343698098166094666279409, + 21888242871839275222246405745257275088548364400416034343698153047791955937110, + 21888242871839275222246405745257275088548364400416034343698078860095631253566, + 20358378932768342, + 21888242871839275222246405745257275088548364400416034343698171759821633885356, + 114533570752372731, + 21888242871839275222246405745257275088548364400416034343698182744178844949783, + 21888242871839275222246405745257275088548364400416034343698090889556948131121, + 56585852591962022, + 88359793964111434, + 9029090461640525, + 134176715124778825, + 21888242871839275222246405745257275088548364400416034343698201706172367902223, + 82988774764744509, + 9150931674919980, + 61517683014977501, + 842450910518945, + 50228626129180798, + 21888242871839275222246405745257275088548364400416034343698133564658573474162, + 37926893187037195, + 30289415068516758, + 21888242871839275222246405745257275088548364400416034343698074040909882250216, + 27658993961152087, + 33115467665694940, + 124194804716118709, + 21888242871839275222246405745257275088548364400416034343698073529330790182197, + 116510290688024972, + 21888242871839275222246405745257275088548364400416034343698170382923864418312, + 42285501879030268, + 21888242871839275222246405745257275088548364400416034343698161181123066135449, + 41096515239860467, + 79245062465322256, + 21888242871839275222246405745257275088548364400416034343698106629738246776219, + 133315655609342377, + 21888242871839275222246405745257275088548364400416034343698179456304473972906, + 21888242871839275222246405745257275088548364400416034343698110306159767364419, + 125996561472329365, + 21888242871839275222246405745257275088548364400416034343698178461944884163461, + 21888242871839275222246405745257275088548364400416034343698191599681581628265, + 37382206570280332, + 124822883380678852, + 21888242871839275222246405745257275088548364400416034343698147458555096821781, + 21888242871839275222246405745257275088548364400416034343698085005490020753110, + 118583766442302639, + 21888242871839275222246405745257275088548364400416034343698126765674651385383, + 67726423612587189, + 50827095007778839, + 21888242871839275222246405745257275088548364400416034343698091405232239362731, + 21888242871839275222246405745257275088548364400416034343698091271307502371172, + 21888242871839275222246405745257275088548364400416034343698105287184040947437, + 13440465110749470, + 82861945976373538, + 6553800365370721, + 21888242871839275222246405745257275088548364400416034343698117419308839987725, + 21888242871839275222246405745257275088548364400416034343698078114137118903893, + 21888242871839275222246405745257275088548364400416034343698156372605953402403, + 21888242871839275222246405745257275088548364400416034343698138444074726220674, + 21888242871839275222246405745257275088548364400416034343698068189152878440557, + 102370648771330473, + 21888242871839275222246405745257275088548364400416034343698167232459114503003, + 2138003051582746, + 21888242871839275222246405745257275088548364400416034343698200283827134758062, + 21888242871839275222246405745257275088548364400416034343698108723561309990405, + 23652859317125597, + 21888242871839275222246405745257275088548364400416034343698151393097082316337, + 21888242871839275222246405745257275088548364400416034343698112433830516691065, + 46902698818386593, + 21888242871839275222246405745257275088548364400416034343698182770427807907306, + 10829741768688986, + 70848155191134991, + 45888595466628834, + 8883109038498446, + 124834337582866576, + 102698675745229963, + 50807445574899927, + 21888242871839275222246405745257275088548364400416034343698160219880305441953, + 21888242871839275222246405745257275088548364400416034343698129503998463680277, + 21888242871839275222246405745257275088548364400416034343698159018685600247434, + 72311463243170334, + 21888242871839275222246405745257275088548364400416034343698060449453470669365, + 21888242871839275222246405745257275088548364400416034343698118005342766542382, + 47366563378138980, + 21888242871839275222246405745257275088548364400416034343698188902344523713745, + 87427159129112148, + 21888242871839275222246405745257275088548364400416034343698105849847224911942, + 48033875265819438, + 80839623148372104, + 21888242871839275222246405745257275088548364400416034343698105517143100979602, + 21888242871839275222246405745257275088548364400416034343698154871421330777856, + 21888242871839275222246405745257275088548364400416034343698175150088572202643, + 21888242871839275222246405745257275088548364400416034343698140637116442507351, + 21888242871839275222246405745257275088548364400416034343698083903112317345644, + 21888242871839275222246405745257275088548364400416034343698172043683284932099, + 90206439393685929, + 21888242871839275222246405745257275088548364400416034343698122180157487390896, + 21888242871839275222246405745257275088548364400416034343698109266162241858227, + 21888242871839275222246405745257275088548364400416034343698105796897363045145, + 13246427247400712, + 98636548027546346, + 21888242871839275222246405745257275088548364400416034343698075078566774024453, + 21888242871839275222246405745257275088548364400416034343698163970308873542551, + 21888242871839275222246405745257275088548364400416034343698195607441722936325, + 5297328798951245, + 111445422161598857, + 21888242871839275222246405745257275088548364400416034343698104295819836382637, + 73955651575835492, + 119362575224602612, + 91136149471222425, + 21888242871839275222246405745257275088548364400416034343698130577646081713530, + 21888242871839275222246405745257275088548364400416034343698097683485929651036, + 21888242871839275222246405745257275088548364400416034343698113139894157911783, + 113010629179899229, + 21888242871839275222246405745257275088548364400416034343698131694004152004871, + 105126015979518787, + 10143480648680282, + 21888242871839275222246405745257275088548364400416034343698096726721478330284, + 21888242871839275222246405745257275088548364400416034343698135342980753561417, + 21888242871839275222246405745257275088548364400416034343698156924293290597007, + 30538622473785412, + 94645770089736403, + 21888242871839275222246405745257275088548364400416034343698168263851227082683, + 21888242871839275222246405745257275088548364400416034343698060733382865495496, + 21888242871839275222246405745257275088548364400416034343698123739296016420732, + 21888242871839275222246405745257275088548364400416034343698164263467771294203, + 42307683988874859, + 95275470440030813, + 85527045194064422, + 124030622942513538, + 30919294104568812, + 21888242871839275222246405745257275088548364400416034343698079350443941604852, + 21888242871839275222246405745257275088548364400416034343698164850926607293378, + 21888242871839275222246405745257275088548364400416034343698074342158072689043, + 51831753791774279, + 62341487469204741, + 100751667779747883, + 21888242871839275222246405745257275088548364400416034343698111760562312385259, + 25579776109795398, + 68963595127204614, + 21888242871839275222246405745257275088548364400416034343698061292383405341572, + 21888242871839275222246405745257275088548364400416034343698106186812535709444, + 21888242871839275222246405745257275088548364400416034343698126060522584633362, + 61974314497864366, + 11065039025047473, + 118170803180811440, + 100665647892247395, + 21888242871839275222246405745257275088548364400416034343698099910776881592063, + 21888242871839275222246405745257275088548364400416034343698152386496791346754, + 21888242871839275222246405745257275088548364400416034343698135303177062658555, + 21888242871839275222246405745257275088548364400416034343698177910420308699389, + 21888242871839275222246405745257275088548364400416034343698089175194031469090, + 48014003412028074, + 105055987806991671, + 52315980076356610, + 21888242871839275222246405745257275088548364400416034343698085644717509174239, + 76161659896132722, + 21888242871839275222246405745257275088548364400416034343698171723571178763371, + 1768538013893760, + 63334837733582880, + 15111230044110908, + 140782598371736590, + 23163307122826806, + 21888242871839275222246405745257275088548364400416034343698189896795755688751, + 129288963200959422, + 21888242871839275222246405745257275088548364400416034343698097733564225967347, + 66256502993697294, + 21888242871839275222246405745257275088548364400416034343698199280023887564273, + 21888242871839275222246405745257275088548364400416034343698109270593501761011, + 22324712848097575, + 12409747040586775, + 48383619336508089, + 41357749320244366, + 124530510535306414, + 21888242871839275222246405745257275088548364400416034343698150934539820180674, + 21888242871839275222246405745257275088548364400416034343698118944612664271660, + 103354698754703291, + 21888242871839275222246405745257275088548364400416034343698098563608049631004, + 45935553697566350, + 133592119038085936, + 16889817411910908, + 21888242871839275222246405745257275088548364400416034343698141864844051413125, + 21888242871839275222246405745257275088548364400416034343698164675981056960587, + 21888242871839275222246405745257275088548364400416034343698113434775806772726, + 33156034009048001, + 135580173291121632, + 21888242871839275222246405745257275088548364400416034343698175965749805132324, + 123942291962976402, + 21888242871839275222246405745257275088548364400416034343698087315710301449560, + 21888242871839275222246405745257275088548364400416034343698202920656136111915, + 109546980729523485, + 11461850607400670, + 58450667388105527, + 41299574758808271, + 53846333065690689, + 8627323266505266, + 541324413396204, + 21888242871839275222246405745257275088548364400416034343698140893578104827446, + 21888242871839275222246405745257275088548364400416034343698063405590780389406, + 21888242871839275222246405745257275088548364400416034343698153106699401148368, + 129585455208405931, + 21888242871839275222246405745257275088548364400416034343698114031877699356598, + 21888242871839275222246405745257275088548364400416034343698118823558595844278, + 104304605033755724, + 21888242871839275222246405745257275088548364400416034343698180097440194990784, + 21888242871839275222246405745257275088548364400416034343698128852061320784098, + 21888242871839275222246405745257275088548364400416034343698074192095715276924, + 49408241687533594, + 21888242871839275222246405745257275088548364400416034343698098512646275517223, + 28129079174168700, + 21888242871839275222246405745257275088548364400416034343698134306058442800219, + 1960158297088486, + 125738308216817199, + 108816537276731261, + 23417202204724486, + 7954465670718192, + 34643540576707829, + 21888242871839275222246405745257275088548364400416034343698156424417210580029, + 21888242871839275222246405745257275088548364400416034343698119396464622560409, + 8994279026401263, + 13236849278432967, + 21888242871839275222246405745257275088548364400416034343698148869462537051400, + 21888242871839275222246405745257275088548364400416034343698105898294657061833, + 128836017829216262, + 21888242871839275222246405745257275088548364400416034343698115404409509832751, + 138930358546199473, + 42322889689318087, + 21888242871839275222246405745257275088548364400416034343698144821677413188869, + 14124335221175744, + 21888242871839275222246405745257275088548364400416034343698190448550234201342, + 21888242871839275222246405745257275088548364400416034343698152045852155632705, + 21888242871839275222246405745257275088548364400416034343698116492579524034824, + 21888242871839275222246405745257275088548364400416034343698124879010476214875, + 138936765479734417, + 60350239063746326, + 48798182046121965, + 12724305425953366, + 21888242871839275222246405745257275088548364400416034343698191961409860982790, + 85587422004503646, + 21888242871839275222246405745257275088548364400416034343698103820760229073608, + 21888242871839275222246405745257275088548364400416034343698102589144538063821, + 21888242871839275222246405745257275088548364400416034343698084505204133081426, + 21888242871839275222246405745257275088548364400416034343698168559524949590376, + 21888242871839275222246405745257275088548364400416034343698161346845330442227, + 21888242871839275222246405745257275088548364400416034343698201389783944830019, + 7182152322627971, + 21888242871839275222246405745257275088548364400416034343698124331308927378853, + 21888242871839275222246405745257275088548364400416034343698113526611526367099, + 21888242871839275222246405745257275088548364400416034343698070480680258766695, + 133693540408383960, + 110749170503026407, + 99126957733848694, + 63684114529789223, + 21888242871839275222246405745257275088548364400416034343698069084260211767756, + 21888242871839275222246405745257275088548364400416034343698060751973859826279, + 21888242871839275222246405745257275088548364400416034343698141561068673903075, + 58390298229671878, + 128749521202276641, + 77964501484370880, + 21888242871839275222246405745257275088548364400416034343698153765150736840391, + 21888242871839275222246405745257275088548364400416034343698189530920263316663, + 21888242871839275222246405745257275088548364400416034343698122691647373816539, + 21309515989511334, + 21888242871839275222246405745257275088548364400416034343698132277365211715070, + 42208099526909721, + 25550256511667295, + 21888242871839275222246405745257275088548364400416034343698175056846493369817, + 21888242871839275222246405745257275088548364400416034343698162757068706710572, + 21888242871839275222246405745257275088548364400416034343698066609003040194063, + 32671690728614423, + 128503084255590122, + 21888242871839275222246405745257275088548364400416034343698107721557340886399, + 21888242871839275222246405745257275088548364400416034343698173115998807819592, + 55262443762046755, + 21888242871839275222246405745257275088548364400416034343698156676813013178100, + 21888242871839275222246405745257275088548364400416034343698112627471213708872, + 21888242871839275222246405745257275088548364400416034343698112975291123929877, + 21888242871839275222246405745257275088548364400416034343698119772417400506496, + 21888242871839275222246405745257275088548364400416034343698075990197023806197, + 21888242871839275222246405745257275088548364400416034343698195805032128423486, + 21888242871839275222246405745257275088548364400416034343698106520449607031763, + 119834813211754066, + 21888242871839275222246405745257275088548364400416034343698178735366722420623, + 20254877835794710, + 131299031364830683, + 21888242871839275222246405745257275088548364400416034343698203076811586707781, + 52848645483237545, + 21888242871839275222246405745257275088548364400416034343698177224898015604536, + 21888242871839275222246405745257275088548364400416034343698090705570255148391, + 95376121914376625, + 21888242871839275222246405745257275088548364400416034343698145719318433501706, + 5685826146441105, + 21888242871839275222246405745257275088548364400416034343698146982194329015280, + 2564205264161226, + 52118046275421772, + 93322002433225866, + 119895525317649726, + 112008821279979052, + 27547009354674318, + 21888242871839275222246405745257275088548364400416034343698120007644359702693, + 21888242871839275222246405745257275088548364400416034343698148170043978793995, + 98689378032281958, + 21888242871839275222246405745257275088548364400416034343698121500839321900011, + 131310954876610068, + 21888242871839275222246405745257275088548364400416034343698143592269929286791, + 21888242871839275222246405745257275088548364400416034343698182650273308391190, + 54117831413099640, + 21888242871839275222246405745257275088548364400416034343698129606081569578537, + 21888242871839275222246405745257275088548364400416034343698143979697396864964, + 21888242871839275222246405745257275088548364400416034343698130089349179592838, + 21888242871839275222246405745257275088548364400416034343698064585113156627682, + 37156299580890031, + 21888242871839275222246405745257275088548364400416034343698133522008963709794, + 1862153116053087, + 80070112209382390, + 21888242871839275222246405745257275088548364400416034343698078473192208656370, + 21888242871839275222246405745257275088548364400416034343698179916251251593427, + 98763620944131921, + 21888242871839275222246405745257275088548364400416034343698151934861961688518, + 122402501111936683, + 21888242871839275222246405745257275088548364400416034343698108644509851848383, + 21888242871839275222246405745257275088548364400416034343698073655793671233894, + 21888242871839275222246405745257275088548364400416034343698102959847910881613, + 3746669792970374, + 21888242871839275222246405745257275088548364400416034343698077836345233532792, + 101486716868648318, + 39724761108725081, + 14873636658117692, + 21888242871839275222246405745257275088548364400416034343698145618013891315268, + 95910274900269164, + 21888242871839275222246405745257275088548364400416034343698196002973158335912, + 88495440876429819, + 21888242871839275222246405745257275088548364400416034343698155758257751217137, + 75066334278306225, + 21888242871839275222246405745257275088548364400416034343698201927121225199817, + 21888242871839275222246405745257275088548364400416034343698070667520606215132, + 31883331660948988, + 21888242871839275222246405745257275088548364400416034343698090129361694002944, + 137888439451438623, + 70453312892173509, + 107660368304190501, + 69629553190583060, + 21888242871839275222246405745257275088548364400416034343698085206210096979311, + 55554250785812350, + 21156423769810308, + 21888242871839275222246405745257275088548364400416034343698084965345113726360, + 21888242871839275222246405745257275088548364400416034343698197029628566122839, + 21888242871839275222246405745257275088548364400416034343698098572168312455130, + 42341568021034414, + 78186624152076567, + 21888242871839275222246405745257275088548364400416034343698075635629428371638, + 8636745841793215, + 84296455371770578, + 21888242871839275222246405745257275088548364400416034343698130342041636349805, + 21888242871839275222246405745257275088548364400416034343698112427947197604881, + 21888242871839275222246405745257275088548364400416034343698178523119513053728, + 21888242871839275222246405745257275088548364400416034343698158237134511052909, + 135133245286458996, + 36731758673246865, + 84011197499024659, + 21888242871839275222246405745257275088548364400416034343698101553406803701218, + 21888242871839275222246405745257275088548364400416034343698076905560947510807, + 21888242871839275222246405745257275088548364400416034343698189656554619674632, + 70972595928843592, + 108947173083757454, + 118123360024816587, + 21888242871839275222246405745257275088548364400416034343698071024409830259696, + 126845581799875025, + 81753698711230751, + 123860081140069134, + 52646211531078767, + 39601239720175810, + 70445070724928218, + 1346639435643105, + 21888242871839275222246405745257275088548364400416034343698098090046975274242, + 21888242871839275222246405745257275088548364400416034343698083685957202600571, + 21888242871839275222246405745257275088548364400416034343698110974375878135262, + 21888242871839275222246405745257275088548364400416034343698109141999263477345, + 21888242871839275222246405745257275088548364400416034343698117848325253822005, + 60076473755917364, + 78911270334786947, + 89269185029035696, + 21888242871839275222246405745257275088548364400416034343698103727106814907209, + 21888242871839275222246405745257275088548364400416034343698143490383380916395, + 21888242871839275222246405745257275088548364400416034343698169008927693192362, + 64983415904793261, + 21888242871839275222246405745257275088548364400416034343698176949354681354309, + 21888242871839275222246405745257275088548364400416034343698130625612548731152, + 21888242871839275222246405745257275088548364400416034343698076586834078372635, + 21888242871839275222246405745257275088548364400416034343698114745047630271398, + 129643588756275351, + 21888242871839275222246405745257275088548364400416034343698167606819749775265, + 21888242871839275222246405745257275088548364400416034343698105266584585198523, + 82914524486986155, + 77681394232916171, + 124124854104724389, + 32618753653446164, + 21888242871839275222246405745257275088548364400416034343698120440127529199608, + 6184385463208589, + 84673577003845394, + 131930251567518316, + 27610571300845918, + 6273414988553082, + 98578977233986243, + 21888242871839275222246405745257275088548364400416034343698119300602033731703, + 53143148786750870, + 67556229180817258, + 115939632375248952, + 21888242871839275222246405745257275088548364400416034343698185923429607188477, + 21888242871839275222246405745257275088548364400416034343698081831402733280591, + 21888242871839275222246405745257275088548364400416034343698093993342956259703, + 21888242871839275222246405745257275088548364400416034343698126329216051332639, + 21888242871839275222246405745257275088548364400416034343698195722535671303348, + 61906160625182647, + 21888242871839275222246405745257275088548364400416034343698093170332775062086, + 101738337868473793, + 59511398475978244, + 21888242871839275222246405745257275088548364400416034343698165884565815397494, + 21888242871839275222246405745257275088548364400416034343698157015696648814828, + 21888242871839275222246405745257275088548364400416034343698141093740639100724, + 21888242871839275222246405745257275088548364400416034343698117832342764293167, + 49524438964129951, + 76005424194773202, + 90943120480508158, + 123572833119319067, + 21888242871839275222246405745257275088548364400416034343698113976178745621217, + 53894289057578642, + 51340361621710393, + 21888242871839275222246405745257275088548364400416034343698191713816814410132, + 21888242871839275222246405745257275088548364400416034343698173784863225669373, + 21888242871839275222246405745257275088548364400416034343698172450308953336460, + 21888242871839275222246405745257275088548364400416034343698183371951741075624, + 21888242871839275222246405745257275088548364400416034343698121952097403079274, + 21888242871839275222246405745257275088548364400416034343698194961075136668290, + 21888242871839275222246405745257275088548364400416034343698136186530021986266, + 91972698272663726, + 21888242871839275222246405745257275088548364400416034343698178502162244741307, + 21888242871839275222246405745257275088548364400416034343698094124961880475408, + 21888242871839275222246405745257275088548364400416034343698078729215766325893, + 11121837061762717, + 70309024644150150, + 121210168738139111, + 21888242871839275222246405745257275088548364400416034343698113339555455609695, + 21888242871839275222246405745257275088548364400416034343698069948790718053106, + 21888242871839275222246405745257275088548364400416034343698100425673920726455, + 21888242871839275222246405745257275088548364400416034343698094883815223838360, + 33495900088751535, + 8191682095179006, + 20151118519436657, + 21888242871839275222246405745257275088548364400416034343698071107830573456374, + 134074465327432738, + 21888242871839275222246405745257275088548364400416034343698185875374157723379, + 21888242871839275222246405745257275088548364400416034343698141776140063580190, + 21888242871839275222246405745257275088548364400416034343698172074104668041138, + 33931283263136604, + 139173648724671518, + 138810993616890739, + 21888242871839275222246405745257275088548364400416034343698064329504831269979, + 92201416010760363, + 119571473617423792, + 68118557563902550, + 69959296517790333, + 132660711678955387, + 21888242871839275222246405745257275088548364400416034343698183008441765042184, + 21888242871839275222246405745257275088548364400416034343698103072167583952113, + 21888242871839275222246405745257275088548364400416034343698192493625210576060, + 48848749611852399, + 21888242871839275222246405745257275088548364400416034343698139794455960394434, + 21888242871839275222246405745257275088548364400416034343698157888732098434191, + 45188820736905148, + 21888242871839275222246405745257275088548364400416034343698137961361494605095, + 21888242871839275222246405745257275088548364400416034343698126127643801807827, + 32443365727723969, + 21888242871839275222246405745257275088548364400416034343698075401145201311091, + 37881574979277078, + 21888242871839275222246405745257275088548364400416034343698161191328092604463, + 120971144237997567, + 74267013122705795, + 21888242871839275222246405745257275088548364400416034343698162158803239636438, + 81159284853041804, + 39009817306696712, + 21888242871839275222246405745257275088548364400416034343698131282677766788428, + 103920894270073983, + 21888242871839275222246405745257275088548364400416034343698090238506417411732, + 35923182718534129, + 21888242871839275222246405745257275088548364400416034343698144107788080196140, + 21918018260940719, + 21888242871839275222246405745257275088548364400416034343698152207847832986380, + 81821269182361482, + 7326281743542331, + 118645239341946148, + 65216311435184915, + 21888242871839275222246405745257275088548364400416034343698197791287410874717, + 21888242871839275222246405745257275088548364400416034343698127012055358299318, + 21888242871839275222246405745257275088548364400416034343698062959543277940758, + 21888242871839275222246405745257275088548364400416034343698181543862621840456, + 21888242871839275222246405745257275088548364400416034343698064342185495417934, + 21888242871839275222246405745257275088548364400416034343698114620701385178414, + 67288091901901702, + 84924686032341316, + 21888242871839275222246405745257275088548364400416034343698083532576367980748, + 21888242871839275222246405745257275088548364400416034343698090975491548820275, + 126301513445773046, + 2856748605391801, + 21888242871839275222246405745257275088548364400416034343698077429675755292215, + 21888242871839275222246405745257275088548364400416034343698143863841785173391, + 109111498292435054, + 21888242871839275222246405745257275088548364400416034343698162412037824411490, + 60120078090618055, + 118969424045740756, + 21888242871839275222246405745257275088548364400416034343698150447699988153270, + 21888242871839275222246405745257275088548364400416034343698144475709632204011, + 1787997121100647, + 21888242871839275222246405745257275088548364400416034343698132804800657660553, + 101433732801841360, + 21888242871839275222246405745257275088548364400416034343698125397783898732877, + 17005577812804517, + 21888242871839275222246405745257275088548364400416034343698154088176222624363, + 21888242871839275222246405745257275088548364400416034343698182896051070362769, + 21888242871839275222246405745257275088548364400416034343698160550906780250802, + 21888242871839275222246405745257275088548364400416034343698060122949526969340, + 118004040075778874, + 71336978756529329, + 21888242871839275222246405745257275088548364400416034343698189606122517039763, + 21888242871839275222246405745257275088548364400416034343698161177569456085663, + 7650701109982072, + 107944295371215014, + 21888242871839275222246405745257275088548364400416034343698069618461404521390, + 87532024505364858, + 134107321622640077, + 21888242871839275222246405745257275088548364400416034343698101378797058188775, + 21888242871839275222246405745257275088548364400416034343698062372393634671689, + 122724948671781755, + 21888242871839275222246405745257275088548364400416034343698167039952449289897, + 74973583594269601, + 21888242871839275222246405745257275088548364400416034343698123607684328348999, + 21888242871839275222246405745257275088548364400416034343698167510185080795004, + 40661577184884365, + 21888242871839275222246405745257275088548364400416034343698141525543915786225, + 60025382935059854, + 47128059627538323, + 21888242871839275222246405745257275088548364400416034343698203954595654036033, + 21888242871839275222246405745257275088548364400416034343698065696091336926857, + 21888242871839275222246405745257275088548364400416034343698123742136893293372, + 21888242871839275222246405745257275088548364400416034343698173310901583399683, + 119321672157698207, + 23049178860182648, + 65991236633918560, + 21888242871839275222246405745257275088548364400416034343698094376204613704955, + 39983665113167760, + 21888242871839275222246405745257275088548364400416034343698181525319601697832, + 38182823172033125, + 21888242871839275222246405745257275088548364400416034343698074546651682618962, + 21888242871839275222246405745257275088548364400416034343698167959652096568174, + 21888242871839275222246405745257275088548364400416034343698185268135897494266, + 99828913627035334, + 21888242871839275222246405745257275088548364400416034343698121026520432964105, + 21888242871839275222246405745257275088548364400416034343698180526450315104621, + 21888242871839275222246405745257275088548364400416034343698148071292739162607, + 21888242871839275222246405745257275088548364400416034343698065136468720257935, + 61789080391677642, + 64607900748588069, + 21888242871839275222246405745257275088548364400416034343698180444795170605475, + 21888242871839275222246405745257275088548364400416034343698131436077868744491, + 58880319060041791, + 21888242871839275222246405745257275088548364400416034343698141771352729275627, + 21888242871839275222246405745257275088548364400416034343698154790279728965778, + 21888242871839275222246405745257275088548364400416034343698166950608164407470, + 4275366211288328, + 21888242871839275222246405745257275088548364400416034343698095271878113725478, + 79986982273508042, + 24294809196639543, + 21888242871839275222246405745257275088548364400416034343698185303507566898834, + 51808295897453027, + 21888242871839275222246405745257275088548364400416034343698100444440449033663, + 82149458497634767, + 53494547735825051, + 14936632076367919, + 21888242871839275222246405745257275088548364400416034343698156621318346674120, + 35608242957467659, + 21888242871839275222246405745257275088548364400416034343698064015700320300309, + 112394983677300679, + 21888242871839275222246405745257275088548364400416034343698170613185445869030, + 21888242871839275222246405745257275088548364400416034343698075006091343521386, + 33118173958777861, + 54918053355714534, + 21888242871839275222246405745257275088548364400416034343698105779625637088941, + 21888242871839275222246405745257275088548364400416034343698078709367346290669, + 21888242871839275222246405745257275088548364400416034343698092272942796215613, + 134463185858496451, + 21888242871839275222246405745257275088548364400416034343698129131330137530209, + 79973335860114793, + 21888242871839275222246405745257275088548364400416034343698120394622901491102, + 22239890766467543, + 21888242871839275222246405745257275088548364400416034343698113597912253871387, + 113416382392914189, + 21888242871839275222246405745257275088548364400416034343698104214909265993946, + 60289004325252836, + 100533386411698820, + 60574481000363330, + 114346871618658390, + 75976287885079403, + 21888242871839275222246405745257275088548364400416034343698157460804148127852, + 21888242871839275222246405745257275088548364400416034343698180366474310763454, + 64006048796531529, + 31255145883454853, + 21888242871839275222246405745257275088548364400416034343698175220118370319585, + 21888242871839275222246405745257275088548364400416034343698101537073946472805, + 21888242871839275222246405745257275088548364400416034343698126077825841370998, + 21888242871839275222246405745257275088548364400416034343698097783375040416586, + 21888242871839275222246405745257275088548364400416034343698070488345262264066, + 21888242871839275222246405745257275088548364400416034343698144748566159305393, + 21888242871839275222246405745257275088548364400416034343698149581950798338129, + 21888242871839275222246405745257275088548364400416034343698195062421890280424, + 21888242871839275222246405745257275088548364400416034343698124706818194634295, + 21888242871839275222246405745257275088548364400416034343698146544796695249482, + 21888242871839275222246405745257275088548364400416034343698071194908588816715, + 48903078298143754, + 21888242871839275222246405745257275088548364400416034343698150673425939868395, + 21888242871839275222246405745257275088548364400416034343698141370878355307255, + 21888242871839275222246405745257275088548364400416034343698077880775193318192, + 21888242871839275222246405745257275088548364400416034343698091629763672264478, + 9047245752328413, + 21888242871839275222246405745257275088548364400416034343698184324221911001228, + 24536552279419825, + 100592719174627492, + 80443590393660268, + 21888242871839275222246405745257275088548364400416034343698191334040677606616, + 21888242871839275222246405745257275088548364400416034343698141421172827180715, + 118439492341811187, + 29969512975531938, + 139648002362994219, + 30970982971348360, + 129477349083973575, + 109640442480534590, + 21888242871839275222246405745257275088548364400416034343698154886862120931235, + 67116081901611365, + 21888242871839275222246405745257275088548364400416034343698177722254658582680, + 21888242871839275222246405745257275088548364400416034343698161688893861090603, + 21888242871839275222246405745257275088548364400416034343698183195493381458465, + 31598408064825217, + 72530164678673296, + 136033276621983304, + 21888242871839275222246405745257275088548364400416034343698178584704979715533, + 21888242871839275222246405745257275088548364400416034343698105407639972414825, + 21888242871839275222246405745257275088548364400416034343698177297857405846500, + 21888242871839275222246405745257275088548364400416034343698081278324797425618, + 21888242871839275222246405745257275088548364400416034343698103914533016313296, + 57534644193559588, + 21888242871839275222246405745257275088548364400416034343698114213842425576314, + 21888242871839275222246405745257275088548364400416034343698196483023373884284, + 21888242871839275222246405745257275088548364400416034343698173029253661115868, + 56534353826786656, + 21888242871839275222246405745257275088548364400416034343698189827614072471837, + 39326447856374478, + 63897011326006702, + 134123101420086256, + 135037221389848057, + 21888242871839275222246405745257275088548364400416034343698195720059797320225, + 139120661856279009, + 21888242871839275222246405745257275088548364400416034343698173878902768260293, + 21888242871839275222246405745257275088548364400416034343698122978074885127111, + 68547818036759617, + 67213468285768546, + 118917238931090326, + 21888242871839275222246405745257275088548364400416034343698111429147509558048, + 21888242871839275222246405745257275088548364400416034343698074577848767307490, + 33297695943632838, + 92798120935406757, + 21888242871839275222246405745257275088548364400416034343698167697551820498895, + 69746506365618822, + 21888242871839275222246405745257275088548364400416034343698189830587349636187, + 124588028894933812, + 21888242871839275222246405745257275088548364400416034343698099940350955930669, + 21888242871839275222246405745257275088548364400416034343698070782613768296320, + 21888242871839275222246405745257275088548364400416034343698154161007825752108, + 22636703042995393, + 21888242871839275222246405745257275088548364400416034343698095951210158273259, + 58051673623474090, + 84142297193582412, + 21888242871839275222246405745257275088548364400416034343698132273932464324062, + 28327529191017785, + 21888242871839275222246405745257275088548364400416034343698103520825394215579, + 21888242871839275222246405745257275088548364400416034343698196253304404222954, + 52825739403652581, + 21888242871839275222246405745257275088548364400416034343698202297295013837317, + 21888242871839275222246405745257275088548364400416034343698087480320602573128, + 1195400420889321, + 21888242871839275222246405745257275088548364400416034343698096246597428847120, + 21888242871839275222246405745257275088548364400416034343698073171075823859013, + 21888242871839275222246405745257275088548364400416034343698096962717019608573, + 59504841592232982, + 21888242871839275222246405745257275088548364400416034343698128432095425533379, + 21888242871839275222246405745257275088548364400416034343698178911421451201976, + 21888242871839275222246405745257275088548364400416034343698094308388115803238, + 56977946844172911, + 130213240009434754, + 21888242871839275222246405745257275088548364400416034343698161584554523257964, + 21888242871839275222246405745257275088548364400416034343698193695707684701012, + 21888242871839275222246405745257275088548364400416034343698190797467806160580, + 119224576658308859, + 21888242871839275222246405745257275088548364400416034343698164614391513409987, + 126886607115370131, + 21888242871839275222246405745257275088548364400416034343698160233872514649005, + 20020622515025188, + 21888242871839275222246405745257275088548364400416034343698139679550345555739, + 30078847870704409, + 21888242871839275222246405745257275088548364400416034343698145864528851833397, + 21888242871839275222246405745257275088548364400416034343698100891250515688703, + 21888242871839275222246405745257275088548364400416034343698101369838248549477, + 21888242871839275222246405745257275088548364400416034343698203218531475285564, + 21888242871839275222246405745257275088548364400416034343698173996929896069645, + 21888242871839275222246405745257275088548364400416034343698097524426059262577, + 21888242871839275222246405745257275088548364400416034343698131440118681429466, + 95392127222829101, + 49509479314768615, + 11002840303026188, + 21888242871839275222246405745257275088548364400416034343698142507138681666195, + 21888242871839275222246405745257275088548364400416034343698190954883136560047, + 21888242871839275222246405745257275088548364400416034343698062426821609201646, + 1218658818774482, + 21888242871839275222246405745257275088548364400416034343698148428085054309719, + 21888242871839275222246405745257275088548364400416034343698142118322548396319, + 21888242871839275222246405745257275088548364400416034343698116390765247467900, + 21888242871839275222246405745257275088548364400416034343698160356501177869707, + 38574424709441199, + 21888242871839275222246405745257275088548364400416034343698140689661355476719, + 21888242871839275222246405745257275088548364400416034343698173016723059096869, + 17869572739510086, + 21888242871839275222246405745257275088548364400416034343698158484582781842430, + 21888242871839275222246405745257275088548364400416034343698192471583674334555, + 75061113265177512, + 21888242871839275222246405745257275088548364400416034343698167552901627883080, + 21888242871839275222246405745257275088548364400416034343698082287443828747363, + 21888242871839275222246405745257275088548364400416034343698060735614224870673, + 80540315813861815, + 21888242871839275222246405745257275088548364400416034343698098653284926997739, + 21888242871839275222246405745257275088548364400416034343698148611072973205648, + 112243905564474921, + 21888242871839275222246405745257275088548364400416034343698199418123727902890, + 21888242871839275222246405745257275088548364400416034343698107289717647079744, + 21888242871839275222246405745257275088548364400416034343698192063224976692892, + 144110670908411988, + 21888242871839275222246405745257275088548364400416034343698147305577069779670, + 76713627233176832, + 74200330018063060, + 21888242871839275222246405745257275088548364400416034343698134332321077731294, + 83582943829700927, + 21888242871839275222246405745257275088548364400416034343698183606401213692483, + 88599337154516066, + 110401697928239500, + 49405074577175768, + 55087998576885411, + 21888242871839275222246405745257275088548364400416034343698089006260998024093, + 21888242871839275222246405745257275088548364400416034343698131418831326911002, + 21888242871839275222246405745257275088548364400416034343698156343208873047917, + 21888242871839275222246405745257275088548364400416034343698173124759509127968, + 21888242871839275222246405745257275088548364400416034343698083007263903385516, + 133146380149193973, + 137294482785750822, + 32512031504565968, + 88917723271937626, + 57933981877591858, + 21888242871839275222246405745257275088548364400416034343698082731727000158337, + 44299057057925756, + 12939754475592356, + 80778894247552167, + 40350243988379089, + 21888242871839275222246405745257275088548364400416034343698189464148577793011, + 21888242871839275222246405745257275088548364400416034343698107813825276634493, + 21888242871839275222246405745257275088548364400416034343698099088790476970393, + 103854037062911767, + 21888242871839275222246405745257275088548364400416034343698177122203062401954, + 106802543944239967, + 21888242871839275222246405745257275088548364400416034343698085662323237121135, + 137712909031980891, + 134705642347074323, + 46866526079720706, + 21888242871839275222246405745257275088548364400416034343698174513171253414831, + 27689207316657354, + 110712706595230653, + 76941957349862163, + 21888242871839275222246405745257275088548364400416034343698089148760808187060, + 21888242871839275222246405745257275088548364400416034343698197836098066024280, + 117374391268501089, + 12919399217203223, + 21888242871839275222246405745257275088548364400416034343698196568567235649830, + 21888242871839275222246405745257275088548364400416034343698204055358418481150, + 48459170705966292, + 21888242871839275222246405745257275088548364400416034343698112494364564949049, + 21888242871839275222246405745257275088548364400416034343698072453955226452804, + 21888242871839275222246405745257275088548364400416034343698127227923315073421, + 21888242871839275222246405745257275088548364400416034343698061833695237078979, + 21888242871839275222246405745257275088548364400416034343698196418800907773057, + 4183449289887070, + 132292741206604951, + 21888242871839275222246405745257275088548364400416034343698107336723550220299, + 82468297132321591, + 21888242871839275222246405745257275088548364400416034343698185587799465092023, + 17380821386893318, + 21888242871839275222246405745257275088548364400416034343698178250798010708984, + 21888242871839275222246405745257275088548364400416034343698193770159745206622, + 21888242871839275222246405745257275088548364400416034343698107210569444829030, + 124294762967651380, + 21888242871839275222246405745257275088548364400416034343698104842825556885037, + 67646183051668003, + 125957726174401687, + 87060387197180525, + 21888242871839275222246405745257275088548364400416034343698159020369925318579, + 21888242871839275222246405745257275088548364400416034343698094935876686608290, + 21888242871839275222246405745257275088548364400416034343698150376196204462752, + 11446007525176306, + 21888242871839275222246405745257275088548364400416034343698127272258675727501, + 125012289995409895, + 143791759039589542, + 21888242871839275222246405745257275088548364400416034343698187832257256325536, + 30046514641931604, + 37448873084424288, + 76737706106856416, + 9324927766752637, + 21845721925852987, + 105731872190673990, + 62724766160953962, + 21888242871839275222246405745257275088548364400416034343698086925081435237778, + 21888242871839275222246405745257275088548364400416034343698102441322162488014, + 54637291999501090, + 21888242871839275222246405745257275088548364400416034343698093275337846206565, + 18123369848008945, + 55842863069150032, + 21888242871839275222246405745257275088548364400416034343698179862695579380507, + 48026892886504135, + 21888242871839275222246405745257275088548364400416034343698088418535438778960, + 25794800137762092, + 21903774812753974, + 21888242871839275222246405745257275088548364400416034343698115474822077351166, + 21888242871839275222246405745257275088548364400416034343698172251215375209058, + 104604853058387536, + 21888242871839275222246405745257275088548364400416034343698136117392221933586, + 21888242871839275222246405745257275088548364400416034343698070872305087148599, + 21888242871839275222246405745257275088548364400416034343698172925764948738131, + 21888242871839275222246405745257275088548364400416034343698191579422005112124, + 44000960157155475, + 21888242871839275222246405745257275088548364400416034343698181746055349927549, + 26707442562236907, + 21888242871839275222246405745257275088548364400416034343698092757538674280642, + 21888242871839275222246405745257275088548364400416034343698177493224901105000, + 21888242871839275222246405745257275088548364400416034343698187163603406859696, + 21888242871839275222246405745257275088548364400416034343698185454491120209409, + 21888242871839275222246405745257275088548364400416034343698097737175177472163, + 21888242871839275222246405745257275088548364400416034343698100089994654183061, + 40415528844491556, + 21888242871839275222246405745257275088548364400416034343698152971892088549206, + 21888242871839275222246405745257275088548364400416034343698097755188991375613, + 10766291266350580, + 21888242871839275222246405745257275088548364400416034343698193294634405418247, + 21888242871839275222246405745257275088548364400416034343698069452112538618304, + 21888242871839275222246405745257275088548364400416034343698163854491526586688, + 58425622784738800, + 21888242871839275222246405745257275088548364400416034343698122361584474739260, + 21888242871839275222246405745257275088548364400416034343698144983130148304067, + 21888242871839275222246405745257275088548364400416034343698199389511042475771, + 46118878950140033, + 83893707741059591, + 132279666074021879, + 21888242871839275222246405745257275088548364400416034343698201370893253269172, + 21888242871839275222246405745257275088548364400416034343698188844409504799224, + 48819398703133182, + 21888242871839275222246405745257275088548364400416034343698143640504457291932, + 45753456783261139, + 30100923344369043, + 98370307246088749, + 21888242871839275222246405745257275088548364400416034343698121890275653905504, + 21888242871839275222246405745257275088548364400416034343698173845776900620354, + 11507359149018906, + 27681538515965677, + 21888242871839275222246405745257275088548364400416034343698122913422932354727, + 21888242871839275222246405745257275088548364400416034343698062999293889589883, + 66979629240064939, + 38523046995347824, + 32460880243575940, + 21888242871839275222246405745257275088548364400416034343698092466261700840774, + 21888242871839275222246405745257275088548364400416034343698141117301304199116, + 78494783708986927, + 21888242871839275222246405745257275088548364400416034343698170172093906589474, + 67373634155500263, + 16071747522839250, + 21888242871839275222246405745257275088548364400416034343698186564407245545539, + 47090905529037051, + 111294926104320507, + 28713180619619476, + 118173082561310817, + 116770434728559718, + 45135827999263024, + 21888242871839275222246405745257275088548364400416034343698075725180036029091, + 98947064680886636, + 77035484445938320, + 21888242871839275222246405745257275088548364400416034343698151892561647285032, + 94998665253711567, + 21888242871839275222246405745257275088548364400416034343698139880243617782989, + 80111039453963096, + 18264777529378186, + 21888242871839275222246405745257275088548364400416034343698126429399331708668, + 33904724258456649, + 44762544043043063, + 21888242871839275222246405745257275088548364400416034343698136744354549708548, + 21888242871839275222246405745257275088548364400416034343698186836714701524245, + 98466608287317270, + 21888242871839275222246405745257275088548364400416034343698089665348578355834, + 67481586529146773, + 115721097362025661, + 87652760517801764, + 21888242871839275222246405745257275088548364400416034343698062809058235867471, + 53883053053135364, + 32755235087518906, + 21888242871839275222246405745257275088548364400416034343698131949930362675632, + 140912608571669274, + 21888242871839275222246405745257275088548364400416034343698072908421292805941, + 21888242871839275222246405745257275088548364400416034343698179382944969201157, + 77209555602491991, + 21888242871839275222246405745257275088548364400416034343698105695403402778742, + 21888242871839275222246405745257275088548364400416034343698070937729785486620, + 21888242871839275222246405745257275088548364400416034343698063625273568592114, + 38675085321575768, + 48761369020012205, + 21888242871839275222246405745257275088548364400416034343698125718861840754675, + 21888242871839275222246405745257275088548364400416034343698129768446258982524, + 21888242871839275222246405745257275088548364400416034343698075523438439330918, + 21888242871839275222246405745257275088548364400416034343698073302979692290345, + 55122062011794843, + 11289003723289710, + 21888242871839275222246405745257275088548364400416034343698080102530623811383, + 121838989944285677, + 21888242871839275222246405745257275088548364400416034343698088403180547175087, + 21888242871839275222246405745257275088548364400416034343698169866785959172828, + 27454277442789214, + 21888242871839275222246405745257275088548364400416034343698134481752350557475, + 21888242871839275222246405745257275088548364400416034343698070561748539694160, + 21888242871839275222246405745257275088548364400416034343698154334826234965903, + 117920918411865506, + 32521741841309886, + 21888242871839275222246405745257275088548364400416034343698167659308254656514, + 21888242871839275222246405745257275088548364400416034343698142511525763093303, + 21888242871839275222246405745257275088548364400416034343698086097020398564955, + 21888242871839275222246405745257275088548364400416034343698191148207478971514, + 21888242871839275222246405745257275088548364400416034343698063243016022761900, + 21888242871839275222246405745257275088548364400416034343698127502595344844018, + 56739524298775476, + 21888242871839275222246405745257275088548364400416034343698060378516626083845, + 21888242871839275222246405745257275088548364400416034343698189002694143968457, + 46548578351778929, + 7029025272713768, + 98606565967620537, + 41180769900353979, + 46554720488307979, + 84770493534828717, + 21888242871839275222246405745257275088548364400416034343698125057780678614597, + 21888242871839275222246405745257275088548364400416034343698167988160052140451, + 83795223211542635, + 100806849814475138, + 100146212211636609, + 80624934974186552, + 91563288750989305, + 94849056709576301, + 21888242871839275222246405745257275088548364400416034343698099600211517594539, + 21888242871839275222246405745257275088548364400416034343698064937470577960757, + 14840184764520133, + 21888242871839275222246405745257275088548364400416034343698202648281236447768, + 99571693155931925, + 21888242871839275222246405745257275088548364400416034343698083747288564024387, + 27810103207120665, + 14530103410271152, + 21888242871839275222246405745257275088548364400416034343698163222171698957104, + 21888242871839275222246405745257275088548364400416034343698113057596612674192, + 62439594716224879, + 34065763899126250, + 124003517372272305, + 3273994071114391, + 21888242871839275222246405745257275088548364400416034343698191481720742395517, + 21888242871839275222246405745257275088548364400416034343698091116644600904306, + 59656018713664939, + 21888242871839275222246405745257275088548364400416034343698139401654940360566, + 21888242871839275222246405745257275088548364400416034343698151125756747950501, + 21888242871839275222246405745257275088548364400416034343698136478219674420490, + 21888242871839275222246405745257275088548364400416034343698087273356568975391, + 21888242871839275222246405745257275088548364400416034343698116772738326667466, + 124778802211148215, + 126846457717564675, + 21888242871839275222246405745257275088548364400416034343698071787375237824776, + 104342739447692783, + 70548435149803960, + 21888242871839275222246405745257275088548364400416034343698063640512579367637, + 61904024412704890, + 21888242871839275222246405745257275088548364400416034343698113618939243751301, + 21888242871839275222246405745257275088548364400416034343698093303453497401812, + 97796171929195378, + 109483486221976103, + 21888242871839275222246405745257275088548364400416034343698146838250953738183, + 62390752852297683, + 21888242871839275222246405745257275088548364400416034343698096543990977847104, + 23086947758419636, + 21888242871839275222246405745257275088548364400416034343698061431604872335870, + 21888242871839275222246405745257275088548364400416034343698111311955982778958, + 21888242871839275222246405745257275088548364400416034343698123268392803265755, + 130968286552268018, + 21888242871839275222246405745257275088548364400416034343698069129475332791311, + 21888242871839275222246405745257275088548364400416034343698100503824624034045, + 21888242871839275222246405745257275088548364400416034343698125851372882435050, + 21888242871839275222246405745257275088548364400416034343698115529889752464012, + 43669831293195702, + 21888242871839275222246405745257275088548364400416034343698078898112490017562, + 21888242871839275222246405745257275088548364400416034343698100279155084612426, + 104353695816467538, + 21888242871839275222246405745257275088548364400416034343698144123355470340760, + 1928500424741557, + 81560115500016937, + 15745238666724527, + 124286798846331493, + 88025581899412731, + 111557649238565344, + 21888242871839275222246405745257275088548364400416034343698082130925225071048, + 21888242871839275222246405745257275088548364400416034343698117691673984296089, + 21888242871839275222246405745257275088548364400416034343698177379500249253241, + 23818794731948867, + 107353015903653301, + 106368221030688515, + 81438320416615473, + 21888242871839275222246405745257275088548364400416034343698067395913020988639, + 39558894779138547, + 107407300699863759, + 28107312241411750, + 98037458292623570, + 21888242871839275222246405745257275088548364400416034343698157328882945677339, + 21888242871839275222246405745257275088548364400416034343698194304659810968311, + 21888242871839275222246405745257275088548364400416034343698120645345353343065, + 21888242871839275222246405745257275088548364400416034343698077147841852355576, + 21888242871839275222246405745257275088548364400416034343698067551915875428111, + 21888242871839275222246405745257275088548364400416034343698060862389536436333, + 21888242871839275222246405745257275088548364400416034343698142734979720927540, + 84333557497716948, + 21888242871839275222246405745257275088548364400416034343698080379798625471319, + 21888242871839275222246405745257275088548364400416034343698143075553370078317, + 21888242871839275222246405745257275088548364400416034343698132254973289062546, + 21888242871839275222246405745257275088548364400416034343698199772002408950425, + 19811177956701139, + 58448835719457573, + 82081681306337512, + 21888242871839275222246405745257275088548364400416034343698097561771957767914, + 9305439627516714, + 21888242871839275222246405745257275088548364400416034343698111738166534546392, + 21888242871839275222246405745257275088548364400416034343698196868597895638798, + 21888242871839275222246405745257275088548364400416034343698155353581286030696, + 21888242871839275222246405745257275088548364400416034343698066590958913837505, + 21888242871839275222246405745257275088548364400416034343698095142455939341688, + 21888242871839275222246405745257275088548364400416034343698168141791843822275, + 21888242871839275222246405745257275088548364400416034343698100802697361664094, + 43718225760411990, + 21888242871839275222246405745257275088548364400416034343698137747031354180771, + 21888242871839275222246405745257275088548364400416034343698088800664134844123, + 51279151670549274, + 21888242871839275222246405745257275088548364400416034343698134164288204445103, + 7055787889279573, + 12227482800272907, + 30314361206603561, + 27320699933309155, + 58517561066685729, + 21888242871839275222246405745257275088548364400416034343698173311453645090058, + 61540970352552363, + 90491971529065300, + 26255958278667519, + 21888242871839275222246405745257275088548364400416034343698141242265443944006, + 127537513420187729, + 124717874311802667, + 21888242871839275222246405745257275088548364400416034343698182488983426753684, + 21888242871839275222246405745257275088548364400416034343698128440831918661793, + 46715344133759581, + 77048099443560113, + 131099151710606605, + 134126872497852395, + 68990852190327993, + 21888242871839275222246405745257275088548364400416034343698163916009889192960, + 21888242871839275222246405745257275088548364400416034343698200391291175719880, + 21888242871839275222246405745257275088548364400416034343698144170062966208357, + 1161096855809920, + 129069114359749613, + 21888242871839275222246405745257275088548364400416034343698073913553494444089, + 21888242871839275222246405745257275088548364400416034343698138090451183485672, + 21888242871839275222246405745257275088548364400416034343698123011984638242613, + 21888242871839275222246405745257275088548364400416034343698129681031821478274, + 21888242871839275222246405745257275088548364400416034343698191762956635640526, + 21888242871839275222246405745257275088548364400416034343698083641005193953710, + 21888242871839275222246405745257275088548364400416034343698168582797889888021, + 21888242871839275222246405745257275088548364400416034343698073893836673813815, + 46164963038745932, + 21888242871839275222246405745257275088548364400416034343698202148662070051220, + 3706527518805590, + 21888242871839275222246405745257275088548364400416034343698110579622362195450, + 21888242871839275222246405745257275088548364400416034343698108996806449357334, + 21888242871839275222246405745257275088548364400416034343698069379273694554873, + 21888242871839275222246405745257275088548364400416034343698070565220419348429, + 129533852700288189, + 21888242871839275222246405745257275088548364400416034343698062875070098928642, + 128508095689589571, + 21888242871839275222246405745257275088548364400416034343698138117038213577436, + 21888242871839275222246405745257275088548364400416034343698119189632635779084, + 21888242871839275222246405745257275088548364400416034343698106098876690566273, + 21888242871839275222246405745257275088548364400416034343698070420077775637995, + 67176325796086082, + 143193674326726321, + 21888242871839275222246405745257275088548364400416034343698107786600802561562, + 107370028687801258, + 21888242871839275222246405745257275088548364400416034343698132554474957560639, + 105027392821164779, + 18063335707860195, + 21888242871839275222246405745257275088548364400416034343698172407918627200726, + 21888242871839275222246405745257275088548364400416034343698157724340964957229, + 19411303126598671, + 21888242871839275222246405745257275088548364400416034343698104934791534957070, + 21888242871839275222246405745257275088548364400416034343698182746933651776009, + 21888242871839275222246405745257275088548364400416034343698102520579574999945, + 41176961836490552, + 21888242871839275222246405745257275088548364400416034343698154117640722379471, + 21888242871839275222246405745257275088548364400416034343698091455353642233064, + 80289090161234246, + 140408864971009546, + 44804913236728357, + 40757253433280111, + 90724417537137047, + 78920486609427841, + 93774692701645766, + 122954881182208698, + 21888242871839275222246405745257275088548364400416034343698119827427162135796, + 21888242871839275222246405745257275088548364400416034343698070367970670528696, + 120853374929503607, + 21888242871839275222246405745257275088548364400416034343698136763186331522301, + 21888242871839275222246405745257275088548364400416034343698127768964247097935, + 21888242871839275222246405745257275088548364400416034343698189803620118484285, + 21888242871839275222246405745257275088548364400416034343698164142009482095299, + 49295213813663041, + 21888242871839275222246405745257275088548364400416034343698125228686118635929, + 21888242871839275222246405745257275088548364400416034343698192706438156589556, + 21888242871839275222246405745257275088548364400416034343698107705642998709315, + 21888242871839275222246405745257275088548364400416034343698181141407797300250, + 28749055942129676, + 21888242871839275222246405745257275088548364400416034343698121821270910579610, + 94569959654752564, + 19143437119232871, + 21888242871839275222246405745257275088548364400416034343698172249996619182679, + 56218643914498010, + 21888242871839275222246405745257275088548364400416034343698185139570882158034, + 21888242871839275222246405745257275088548364400416034343698159910681099593136, + 19162870121143314, + 21888242871839275222246405745257275088548364400416034343698143883148445067582, + 84585096711624935, + 111956724445162100, + 21888242871839275222246405745257275088548364400416034343698200851763546810920, + 21888242871839275222246405745257275088548364400416034343698109976156314396960, + 21888242871839275222246405745257275088548364400416034343698158000535296022553, + 62015141349215326, + 21888242871839275222246405745257275088548364400416034343698069865729237416888, + 21888242871839275222246405745257275088548364400416034343698177442784070932317, + 21888242871839275222246405745257275088548364400416034343698106038397827824471, + 21888242871839275222246405745257275088548364400416034343698099108997099663176, + 68150992051118399, + 21888242871839275222246405745257275088548364400416034343698151237915821708172, + 126850473407756510, + 33328823786918378, + 21888242871839275222246405745257275088548364400416034343698179066783846412257, + 21888242871839275222246405745257275088548364400416034343698148543695934498213, + 21888242871839275222246405745257275088548364400416034343698114443534438673904, + 21888242871839275222246405745257275088548364400416034343698152841556136098125, + 21888242871839275222246405745257275088548364400416034343698118015098142659575, + 21888242871839275222246405745257275088548364400416034343698179362936359925258, + 83589826212135296, + 100300102926288938, + 21888242871839275222246405745257275088548364400416034343698183567923114050480, + 116119181350689230, + 6154417180592826, + 65159395836320990, + 92838499797019966, + 45928307376534253, + 64275414199988772, + 15043614568736747, + 21888242871839275222246405745257275088548364400416034343698133840426446854185, + 84892326195709702, + 118053695314588211, + 21888242871839275222246405745257275088548364400416034343698060459320747825429, + 132008705820367397, + 22422776758919552, + 21888242871839275222246405745257275088548364400416034343698083644827854433470, + 21888242871839275222246405745257275088548364400416034343698089884341940201325, + 92070446426065521, + 21888242871839275222246405745257275088548364400416034343698175038823851546360, + 66302631664059369, + 21888242871839275222246405745257275088548364400416034343698138967457319575185, + 21888242871839275222246405745257275088548364400416034343698189423509773444756, + 21888242871839275222246405745257275088548364400416034343698196249600001025916, + 21888242871839275222246405745257275088548364400416034343698086964247606071781, + 21888242871839275222246405745257275088548364400416034343698189686383702670255, + 65672623534868848, + 1843886157978024, + 68479058178129273, + 33958572174737292, + 21888242871839275222246405745257275088548364400416034343698087332310237743669, + 127468316378245793, + 104541927744461902, + 48758782198828966, + 48184062968427272, + 21888242871839275222246405745257275088548364400416034343698196658567057584615, + 21888242871839275222246405745257275088548364400416034343698104492504388277994, + 21888242871839275222246405745257275088548364400416034343698152013472664879504, + 21888242871839275222246405745257275088548364400416034343698079450871125709288, + 21888242871839275222246405745257275088548364400416034343698160245358634147686, + 21888242871839275222246405745257275088548364400416034343698183302832075132517, + 21888242871839275222246405745257275088548364400416034343698113969305063381343, + 21888242871839275222246405745257275088548364400416034343698129983027280717634, + 93234507217279716, + 16681133650421839, + 21888242871839275222246405745257275088548364400416034343698194515870889994088, + 21888242871839275222246405745257275088548364400416034343698134728117767486725, + 59495890803897411, + 21888242871839275222246405745257275088548364400416034343698198955397090593621, + 21888242871839275222246405745257275088548364400416034343698131146818847599235, + 111745659520416684, + 21888242871839275222246405745257275088548364400416034343698075367046613084585, + 21888242871839275222246405745257275088548364400416034343698199155668118589898, + 25281222301680860, + 21888242871839275222246405745257275088548364400416034343698160402449266385432, + 21888242871839275222246405745257275088548364400416034343698133400864754517274, + 95592455582343247, + 126655746801801177, + 9292379113507433, + 34970606589846514, + 17496770224847135, + 121360595295915573, + 21888242871839275222246405745257275088548364400416034343698198316829437852360, + 75415619775154358, + 21888242871839275222246405745257275088548364400416034343698183690908093855951, + 21888242871839275222246405745257275088548364400416034343698176836493913670483, + 21888242871839275222246405745257275088548364400416034343698107061576097863302, + 21888242871839275222246405745257275088548364400416034343698087982531116417623, + 98142920820387846, + 80371093683137911, + 21888242871839275222246405745257275088548364400416034343698079381118269884049, + 18430357299768729, + 6875049506642925, + 21888242871839275222246405745257275088548364400416034343698135841294993506141, + 35246076119569496, + 21888242871839275222246405745257275088548364400416034343698118180326498809226, + 80377412125179002, + 143565975446386174, + 21888242871839275222246405745257275088548364400416034343698169025668741366886, + 21888242871839275222246405745257275088548364400416034343698173968157135746469, + 30873808210664760, + 21888242871839275222246405745257275088548364400416034343698081737625938939663, + 21888242871839275222246405745257275088548364400416034343698140629415618026016, + 134609906008896928, + 21888242871839275222246405745257275088548364400416034343698064107225290999340, + 118213989164466534, + 21888242871839275222246405745257275088548364400416034343698189264436676074878, + 34437525526181820, + 96874001040548236, + 21888242871839275222246405745257275088548364400416034343698105342686434499321, + 21888242871839275222246405745257275088548364400416034343698103908906084802381, + 115347946559604796, + 21888242871839275222246405745257275088548364400416034343698182581941259820846, + 73940153178042858, + 32104027838118181, + 21888242871839275222246405745257275088548364400416034343698074588406234229103, + 21888242871839275222246405745257275088548364400416034343698127332387319891506, + 112240961149236089, + 12245747341246036, + 21888242871839275222246405745257275088548364400416034343698074020899882038646, + 81209981946828140, + 66751641701374849, + 21888242871839275222246405745257275088548364400416034343698140262480086307625, + 21888242871839275222246405745257275088548364400416034343698155568289297469950, + 21888242871839275222246405745257275088548364400416034343698163963893171675295, + 46542049036180585, + 6433777040256568, + 15841976422918440, + 21888242871839275222246405745257275088548364400416034343698069003487956986529, + 5570035692100103, + 94446130425388690, + 21888242871839275222246405745257275088548364400416034343698119361424738945932, + 21888242871839275222246405745257275088548364400416034343698175897649587198797, + 5027432726550862, + 21888242871839275222246405745257275088548364400416034343698147722254338066261, + 43006358368988222, + 21888242871839275222246405745257275088548364400416034343698172335650323559037, + 48616434582664096, + 21888242871839275222246405745257275088548364400416034343698140151292692069446, + 21888242871839275222246405745257275088548364400416034343698107916959097530465, + 19264084853691600, + 74539636735294809, + 54827391484425420, + 30132595060454919, + 21888242871839275222246405745257275088548364400416034343698062284875048061333, + 114854065615704922, + 125111410975535496, + 21888242871839275222246405745257275088548364400416034343698180937341231569083, + 1823179943405400, + 102107170585326484, + 45659626820522074, + 21888242871839275222246405745257275088548364400416034343698128405974709861888, + 21888242871839275222246405745257275088548364400416034343698134849038661341893, + 21888242871839275222246405745257275088548364400416034343698079845963656794668, + 109429677035654908, + 70988578234233127, + 21213618457622499, + 21888242871839275222246405745257275088548364400416034343698106419302450421286, + 21888242871839275222246405745257275088548364400416034343698114122520970132643, + 21888242871839275222246405745257275088548364400416034343698129965271775143278, + 11455828528506154, + 21888242871839275222246405745257275088548364400416034343698188137297523420319, + 21888242871839275222246405745257275088548364400416034343698158103472878982581, + 139865226860823271, + 99282254777679796, + 21888242871839275222246405745257275088548364400416034343698133577188135507395, + 28767658895150132, + 2640544934106112, + 21888242871839275222246405745257275088548364400416034343698159289572812212513, + 124372318124594041, + 75452429402961667, + 21888242871839275222246405745257275088548364400416034343698187802551792389212, + 90535297144509780, + 121224259226820415, + 21888242871839275222246405745257275088548364400416034343698190909104965954815, + 28330035744071326, + 21888242871839275222246405745257275088548364400416034343698122886371775538895, + 90185107123440864, + 69618420904285298, + 21888242871839275222246405745257275088548364400416034343698078836929327425707, + 21888242871839275222246405745257275088548364400416034343698123973924003391866, + 21888242871839275222246405745257275088548364400416034343698067416052882692037, + 27443383892787588, + 82230903821490272, + 21888242871839275222246405745257275088548364400416034343698114327083497166680, + 139678759655806042, + 21888242871839275222246405745257275088548364400416034343698130557349436096999, + 143679432802783950, + 21888242871839275222246405745257275088548364400416034343698081405440043210331, + 123855294006316557, + 103390110552560160, + 21888242871839275222246405745257275088548364400416034343698134378697967905133, + 21888242871839275222246405745257275088548364400416034343698061298917274915107, + 136319995057613009, + 75187957199772899, + 21888242871839275222246405745257275088548364400416034343698110944772995673965, + 110025697766849490, + 67974183544674351, + 21888242871839275222246405745257275088548364400416034343698131560913374216471, + 21888242871839275222246405745257275088548364400416034343698176964470018256598, + 21888242871839275222246405745257275088548364400416034343698060595364662738826, + 21888242871839275222246405745257275088548364400416034343698202112691744328286, + 39263813001939992, + 21888242871839275222246405745257275088548364400416034343698138712848399559923, + 21888242871839275222246405745257275088548364400416034343698115319837959167088, + 45542520841012527, + 21888242871839275222246405745257275088548364400416034343698060193582565187854, + 4345944905598329, + 38285506700430985, + 21888242871839275222246405745257275088548364400416034343698075865723627448109, + 55691369924562288, + 112519544639390393, + 21888242871839275222246405745257275088548364400416034343698124543988256809198, + 21888242871839275222246405745257275088548364400416034343698081804399318046983, + 21888242871839275222246405745257275088548364400416034343698130759697714466266, + 20578877047023333, + 21888242871839275222246405745257275088548364400416034343698071985307736417283, + 58132991817391640, + 21888242871839275222246405745257275088548364400416034343698155411270804324310, + 21888242871839275222246405745257275088548364400416034343698072227598187446971, + 22527164239755269, + 36961291509595724, + 21888242871839275222246405745257275088548364400416034343698106109417335719614, + 21888242871839275222246405745257275088548364400416034343698176762159121901022, + 21888242871839275222246405745257275088548364400416034343698193963014209896191, + 40674054061407938, + 21888242871839275222246405745257275088548364400416034343698201260121832946049, + 77364429696394089, + 21888242871839275222246405745257275088548364400416034343698189299399861771139, + 21888242871839275222246405745257275088548364400416034343698160465442342493954, + 21888242871839275222246405745257275088548364400416034343698181299212176568762, + 21888242871839275222246405745257275088548364400416034343698145480911436726958, + 21888242871839275222246405745257275088548364400416034343698122109691287484691, + 25100601801447557, + 21888242871839275222246405745257275088548364400416034343698115767007418203526, + 21888242871839275222246405745257275088548364400416034343698163069350765111105, + 21888242871839275222246405745257275088548364400416034343698150327446487082557, + 21888242871839275222246405745257275088548364400416034343698126560188506197736, + 21888242871839275222246405745257275088548364400416034343698166829694337838891, + 66136340702914159, + 21888242871839275222246405745257275088548364400416034343698061265075905733654, + 5630432706019093, + 26467000865433422, + 21888242871839275222246405745257275088548364400416034343698060274334040894561, + 3166108772535637, + 21888242871839275222246405745257275088548364400416034343698105209168118696917, + 116940221649215056, + 21888242871839275222246405745257275088548364400416034343698150084915039912436, + 21888242871839275222246405745257275088548364400416034343698062169582488434067, + 21888242871839275222246405745257275088548364400416034343698137473919392884443, + 21618866570305196, + 45979209953354667, + 21888242871839275222246405745257275088548364400416034343698202234545526367863, + 21888242871839275222246405745257275088548364400416034343698060834914005161907, + 21888242871839275222246405745257275088548364400416034343698113473438591229861, + 5390514713428779, + 21888242871839275222246405745257275088548364400416034343698094103993956190930, + 16459413113583090, + 118952766657469671, + 143265705831165188, + 21888242871839275222246405745257275088548364400416034343698112061395340001162, + 21888242871839275222246405745257275088548364400416034343698084239428409206911, + 21888242871839275222246405745257275088548364400416034343698060263515975234616, + 57511163229979712, + 21888242871839275222246405745257275088548364400416034343698150176309258558255, + 15305911516635196, + 43078249659126817, + 21888242871839275222246405745257275088548364400416034343698136354673029535352, + 21888242871839275222246405745257275088548364400416034343698127112970610968737, + 21757722889152104, + 21888242871839275222246405745257275088548364400416034343698122098751508952410, + 21888242871839275222246405745257275088548364400416034343698183706570186624519, + 102172795941801457, + 21888242871839275222246405745257275088548364400416034343698119036412790015749, + 21888242871839275222246405745257275088548364400416034343698189597888692439731, + 21888242871839275222246405745257275088548364400416034343698168511865506952542, + 21888242871839275222246405745257275088548364400416034343698144864809414331198, + 21888242871839275222246405745257275088548364400416034343698187496385847770730, + 21888242871839275222246405745257275088548364400416034343698183239790453549143, + 21888242871839275222246405745257275088548364400416034343698121139812701821998, + 93491320090492507, + 21888242871839275222246405745257275088548364400416034343698160443795158069356, + 21888242871839275222246405745257275088548364400416034343698137328964891476374, + 136990254440694815, + 125900964267657729, + 67758668964157978, + 19133755167502201, + 21888242871839275222246405745257275088548364400416034343698203822812744648095, + 21888242871839275222246405745257275088548364400416034343698199695176926150951, + 21888242871839275222246405745257275088548364400416034343698086072885024971377, + 60901608327581869, + 112284038099304904, + 21888242871839275222246405745257275088548364400416034343698122146006543493903, + 104444109156494111, + 21888242871839275222246405745257275088548364400416034343698153168513567093819, + 21888242871839275222246405745257275088548364400416034343698063195631174083589, + 21888242871839275222246405745257275088548364400416034343698178886402795654665, + 21888242871839275222246405745257275088548364400416034343698183140663240256591, + 15898458242724468, + 21888242871839275222246405745257275088548364400416034343698104400790254866739, + 59870173939351062, + 21888242871839275222246405745257275088548364400416034343698149104078962402370, + 71021810726088811, + 21888242871839275222246405745257275088548364400416034343698144611789747207108, + 22697826251935069, + 28237905939564384, + 131482702848822884, + 111854441036570513, + 21888242871839275222246405745257275088548364400416034343698164148381660515134, + 21888242871839275222246405745257275088548364400416034343698061472648524777460, + 17860316758769993, + 27452842947466493, + 21888242871839275222246405745257275088548364400416034343698195059409117570077, + 31609423992478491, + 27400205121380173, + 46114252007351132, + 21888242871839275222246405745257275088548364400416034343698178046342300789874, + 125068130385837876, + 84752671057220449, + 62361504794524389, + 56716096254870945, + 102627938916996173, + 21888242871839275222246405745257275088548364400416034343698111245328647839686, + 88419841418939269, + 21888242871839275222246405745257275088548364400416034343698115420937872103730, + 21888242871839275222246405745257275088548364400416034343698116163349630041490, + 21888242871839275222246405745257275088548364400416034343698137667037524780885, + 73455803671022288, + 21888242871839275222246405745257275088548364400416034343698150856386716028040, + 21888242871839275222246405745257275088548364400416034343698181085865395805271, + 21888242871839275222246405745257275088548364400416034343698197362388465386258, + 21888242871839275222246405745257275088548364400416034343698201129886122947307, + 21888242871839275222246405745257275088548364400416034343698182042082036422214, + 6719116169063493, + 55469418061365419, + 22293231400851603, + 52167653517115549, + 21888242871839275222246405745257275088548364400416034343698147392889496858616, + 138312515072973291, + 53377214721386839, + 65461399718362355, + 21888242871839275222246405745257275088548364400416034343698087629028897980724, + 93897389871498380, + 95917260083507582, + 21888242871839275222246405745257275088548364400416034343698153205791992985949, + 123577057282942337, + 7097826005758766, + 40645019815354300, + 51926991131669526, + 21888242871839275222246405745257275088548364400416034343698154361292047004284, + 48953240397032043, + 19069556860485971, + 76259166674892604, + 69669949056402746, + 21888242871839275222246405745257275088548364400416034343698185315527884648189, + 143149712228858330, + 21888242871839275222246405745257275088548364400416034343698136865466481982154, + 21888242871839275222246405745257275088548364400416034343698189662678205112415, + 135177304348274665, + 21888242871839275222246405745257275088548364400416034343698176380329945549651, + 78384195903532390, + 21888242871839275222246405745257275088548364400416034343698141056492632642541, + 137662791941270066, + 7788265835404017, + 129190371362241252, + 21888242871839275222246405745257275088548364400416034343698188564102738109290, + 125832023925571793, + 38369899770410795, + 21888242871839275222246405745257275088548364400416034343698163539910721134844, + 21888242871839275222246405745257275088548364400416034343698098388621027534048, + 21888242871839275222246405745257275088548364400416034343698163170523406267932, + 21888242871839275222246405745257275088548364400416034343698183768253835982463, + 21888242871839275222246405745257275088548364400416034343698075288248329870099, + 67872672646923950, + 35785052060974814, + 104331693148582718, + 9291127178183673, + 21888242871839275222246405745257275088548364400416034343698062713860567243698, + 21888242871839275222246405745257275088548364400416034343698136608466831374244, + 67896238047868481, + 21888242871839275222246405745257275088548364400416034343698104030634675185715, + 21888242871839275222246405745257275088548364400416034343698161240110357299609, + 92355453184314643, + 19462623405813530, + 56937148500523216, + 21888242871839275222246405745257275088548364400416034343698100584806005821154, + 21888242871839275222246405745257275088548364400416034343698068646556584876326, + 21888242871839275222246405745257275088548364400416034343698116749831296840447, + 21888242871839275222246405745257275088548364400416034343698154424218709729579, + 131301465134906518, + 28733253881096340, + 117412467522391150, + 21888242871839275222246405745257275088548364400416034343698074900023438101063, + 68627639952639626, + 30185316766385219, + 86168591886862487, + 21888242871839275222246405745257275088548364400416034343698188436911197628467, + 30784301425008574, + 21888242871839275222246405745257275088548364400416034343698150040441853084829, + 21888242871839275222246405745257275088548364400416034343698112117518920075274, + 93062848622913161, + 21888242871839275222246405745257275088548364400416034343698139599155714165943, + 21888242871839275222246405745257275088548364400416034343698133832924724764482, + 31210692360723837, + 78573386644850487, + 21888242871839275222246405745257275088548364400416034343698167916426201881257, + 21888242871839275222246405745257275088548364400416034343698123078357392670013, + 21888242871839275222246405745257275088548364400416034343698074661591065594335, + 21888242871839275222246405745257275088548364400416034343698084615940744381840, + 71182601696779823, + 132424292267730869, + 46002946114955099, + 37705498995386032, + 21888242871839275222246405745257275088548364400416034343698180966342973573237, + 38082315636277341, + 21888242871839275222246405745257275088548364400416034343698195189401189710723, + 54435121732884611, + 21888242871839275222246405745257275088548364400416034343698154414757820119837, + 64272901905599271, + 21888242871839275222246405745257275088548364400416034343698078435011550496231, + 38056793179887050, + 21888242871839275222246405745257275088548364400416034343698135494339682579122, + 14500311633086548, + 21888242871839275222246405745257275088548364400416034343698085392165828049303, + 99960332405761101, + 53598765068991372, + 21888242871839275222246405745257275088548364400416034343698091734545735772453, + 117948205529652036, + 22659482884877791, + 21888242871839275222246405745257275088548364400416034343698130501791574886951, + 21888242871839275222246405745257275088548364400416034343698101765798921900201, + 43937477110032893, + 21888242871839275222246405745257275088548364400416034343698119967343561458611, + 21888242871839275222246405745257275088548364400416034343698077432507194643916, + 21888242871839275222246405745257275088548364400416034343698133693716668887178, + 91642506934289607, + 137449882005205072, + 21888242871839275222246405745257275088548364400416034343698076342431183285470, + 21888242871839275222246405745257275088548364400416034343698069601522101963450, + 127347916075191560, + 21888242871839275222246405745257275088548364400416034343698186588372377288244, + 20233663539923954, + 21888242871839275222246405745257275088548364400416034343698072963569171832045, + 23834056404100407, + 106959008698440704, + 21888242871839275222246405745257275088548364400416034343698172639195560608844, + 34191767180270851, + 142846155410494853, + 19557586602292459, + 21888242871839275222246405745257275088548364400416034343698152836207213669548, + 21888242871839275222246405745257275088548364400416034343698169693084244617772, + 21888242871839275222246405745257275088548364400416034343698097688008914837888, + 120628222670374611, + 21888242871839275222246405745257275088548364400416034343698105531046121281490, + 21888242871839275222246405745257275088548364400416034343698179687908873958582, + 3637131421275572, + 143271875698653048, + 21888242871839275222246405745257275088548364400416034343698075987449962428715, + 101634914977053460, + 59215696409945161, + 107414853975858295, + 137287681678036942, + 21888242871839275222246405745257275088548364400416034343698194727789327924104, + 16070162946566465, + 28371428416043401, + 21888242871839275222246405745257275088548364400416034343698118127585828444988, + 37312930211537063, + 143392952222986056, + 21888242871839275222246405745257275088548364400416034343698113249709062376115, + 21888242871839275222246405745257275088548364400416034343698104183071747024815, + 26695755988560701, + 21287619496021677, + 21888242871839275222246405745257275088548364400416034343698154803066815864474, + 21888242871839275222246405745257275088548364400416034343698079702801280457020, + 67523329887269481, + 21888242871839275222246405745257275088548364400416034343698148592807477835130, + 21888242871839275222246405745257275088548364400416034343698060595957648193971, + 21888242871839275222246405745257275088548364400416034343698180026454187117238, + 13282101407291692, + 125791251790551138, + 116370094959425426, + 21888242871839275222246405745257275088548364400416034343698139471051610502229, + 21888242871839275222246405745257275088548364400416034343698122300875490257123, + 21888242871839275222246405745257275088548364400416034343698133849777402893130, + 81226663514206241, + 21888242871839275222246405745257275088548364400416034343698138975578731219797, + 21888242871839275222246405745257275088548364400416034343698157352707628950825, + 21888242871839275222246405745257275088548364400416034343698063139498515475984, + 21888242871839275222246405745257275088548364400416034343698190775149992979075, + 21888242871839275222246405745257275088548364400416034343698155836737036743022, + 61570701515757350, + 21888242871839275222246405745257275088548364400416034343698085232430148132717, + 111240656063780655, + 32763413423133609, + 95436665894117138, + 15452200803048432, + 40309935002433096, + 21888242871839275222246405745257275088548364400416034343698063721388867056717, + 50242775355069555, + 21888242871839275222246405745257275088548364400416034343698204116148216457258, + 21888242871839275222246405745257275088548364400416034343698194190023069089116, + 21888242871839275222246405745257275088548364400416034343698077615947656380859, + 81983157426844520, + 105252782083829557, + 51333861350603000, + 75628053943247816, + 21888242871839275222246405745257275088548364400416034343698097402388595538691, + 21888242871839275222246405745257275088548364400416034343698124848331965401778, + 21888242871839275222246405745257275088548364400416034343698174279294180720771, + 21888242871839275222246405745257275088548364400416034343698157246088318877688, + 21888242871839275222246405745257275088548364400416034343698115643423073357740, + 20626080110105754, + 2751270224704791, + 21888242871839275222246405745257275088548364400416034343698140447011635926618, + 51525562200499549, + 21888242871839275222246405745257275088548364400416034343698184984430489640130, + 118181740266869378, + 6199401975688648, + 81086882739045267, + 21888242871839275222246405745257275088548364400416034343698202360335040861418, + 132766403925455595, + 21888242871839275222246405745257275088548364400416034343698108327038321847442, + 21888242871839275222246405745257275088548364400416034343698076934687059707707, + 21888242871839275222246405745257275088548364400416034343698200102598865087395, + 21888242871839275222246405745257275088548364400416034343698165878229377082041, + 115042611314975326, + 17021789224453466, + 98234454726779603, + 56537772062038646, + 21888242871839275222246405745257275088548364400416034343698101879558857989369, + 118273612780709717, + 21888242871839275222246405745257275088548364400416034343698122293022235908415, + 21888242871839275222246405745257275088548364400416034343698061597168187881606, + 98730467850915988, + 36855759091661906, + 35459997327857573, + 21888242871839275222246405745257275088548364400416034343698077959067515355692, + 142886809096107974, + 47096476792959377, + 2537313344733453, + 21888242871839275222246405745257275088548364400416034343698139560906554373286, + 99418337865801380, + 64010254039269972, + 93771363979024403, + 29372290127948787, + 130967146876524985, + 21888242871839275222246405745257275088548364400416034343698086249926074144111, + 79282096252623018, + 21888242871839275222246405745257275088548364400416034343698191107539309620200, + 21888242871839275222246405745257275088548364400416034343698081852645097184868, + 21888242871839275222246405745257275088548364400416034343698143751969571875894, + 21888242871839275222246405745257275088548364400416034343698108885295101941875, + 21888242871839275222246405745257275088548364400416034343698180860144336636004, + 123763827092609776, + 17129175537339396, + 21888242871839275222246405745257275088548364400416034343698086889162070666936, + 88369482943942894, + 89369076785260644, + 91223510643040563, + 21888242871839275222246405745257275088548364400416034343698095832670824203633, + 83021206846435740, + 107439610735425214, + 132105922388138953, + 21888242871839275222246405745257275088548364400416034343698071468458122729680, + 21888242871839275222246405745257275088548364400416034343698083571205390664479, + 7706211062745830, + 93312362605657696, + 21888242871839275222246405745257275088548364400416034343698195579396953565186, + 70108116014722425, + 21888242871839275222246405745257275088548364400416034343698117106481882821468, + 49502178659727830, + 143325753182970111, + 21888242871839275222246405745257275088548364400416034343698061868470603722082, + 21888242871839275222246405745257275088548364400416034343698143518633312703802, + 97779216684352175, + 118851481609011084, + 24430951923646720, + 21888242871839275222246405745257275088548364400416034343698183539966097910350, + 107595835670957984, + 32333266210341585, + 35215055171158186, + 83660419577617501, + 37300420659745685, + 68385591902374704, + 21888242871839275222246405745257275088548364400416034343698134249493694728304, + 21888242871839275222246405745257275088548364400416034343698073538095261418250, + 21888242871839275222246405745257275088548364400416034343698125246822544513379, + 21888242871839275222246405745257275088548364400416034343698117686049382367796, + 21888242871839275222246405745257275088548364400416034343698085189304450371992, + 21888242871839275222246405745257275088548364400416034343698078825022988852233, + 117613391031908864, + 73371527494301067, + 58799061370017415, + 97149559112741394, + 34355242977920231, + 21888242871839275222246405745257275088548364400416034343698093518400843854227, + 21888242871839275222246405745257275088548364400416034343698076559244095296148, + 42221915898343615, + 21888242871839275222246405745257275088548364400416034343698100794069478030775, + 21888242871839275222246405745257275088548364400416034343698130396401737843189, + 21888242871839275222246405745257275088548364400416034343698163305628764314432, + 21888242871839275222246405745257275088548364400416034343698154277520349176286, + 21888242871839275222246405745257275088548364400416034343698156099839253109754, + 111372101860957893, + 22663746341505460, + 38882043093568428, + 21888242871839275222246405745257275088548364400416034343698102178658679255017, + 21888242871839275222246405745257275088548364400416034343698121628160597326788, + 21888242871839275222246405745257275088548364400416034343698190136263528024171, + 21888242871839275222246405745257275088548364400416034343698065977879109460994, + 24532610911824178, + 21888242871839275222246405745257275088548364400416034343698192198740100075920, + 108310943845826602, + 21888242871839275222246405745257275088548364400416034343698116716471407239502, + 21888242871839275222246405745257275088548364400416034343698180679784048282121, + 111686945573352903, + 115966382176099924, + 21888242871839275222246405745257275088548364400416034343698139841359688529403, + 40297036778254554, + 137530167415370470, + 21888242871839275222246405745257275088548364400416034343698170668435438393821, + 127301886459634025, + 21888242871839275222246405745257275088548364400416034343698164656177894566090, + 21888242871839275222246405745257275088548364400416034343698106722574613308640, + 8685264299937807, + 109379768759811181, + 64182960834598117, + 21888242871839275222246405745257275088548364400416034343698198506106632288974, + 56286960347311006, + 21888242871839275222246405745257275088548364400416034343698125672806261802307, + 21888242871839275222246405745257275088548364400416034343698110664698156345833, + 22816820785210203, + 58489731597667361, + 21888242871839275222246405745257275088548364400416034343698151274696127319226, + 21888242871839275222246405745257275088548364400416034343698109190272600516066, + 21888242871839275222246405745257275088548364400416034343698106250560855065988, + 71621721775943198, + 89901198386051297, + 988833235035421, + 3028187363074020, + 10665803229751725, + 21888242871839275222246405745257275088548364400416034343698100441837825651217, + 21888242871839275222246405745257275088548364400416034343698149809026302220236, + 21888242871839275222246405745257275088548364400416034343698155817943867334913, + 21888242871839275222246405745257275088548364400416034343698065598379813858738, + 127212733409336744, + 21888242871839275222246405745257275088548364400416034343698065391991610483399, + 21888242871839275222246405745257275088548364400416034343698085327731815284536, + 6032875795646002, + 68038308090229331, + 72103258342761691, + 65049547168649192, + 132703263687983993, + 72233575610514802, + 21888242871839275222246405745257275088548364400416034343698080230392183572785, + 111608877343164152, + 106295251215311697, + 21888242871839275222246405745257275088548364400416034343698130421433683015175, + 21888242871839275222246405745257275088548364400416034343698157874703944608452, + 21888242871839275222246405745257275088548364400416034343698090822137349311315, + 21888242871839275222246405745257275088548364400416034343698107919659620586685, + 20703737955749807, + 21888242871839275222246405745257275088548364400416034343698146238808966460485, + 21888242871839275222246405745257275088548364400416034343698140582453907418445, + 22461446389484999, + 21888242871839275222246405745257275088548364400416034343698092355674591570743, + 40163593736399103, + 23346448268194243, + 75276610251773932, + 14559799079812371, + 21888242871839275222246405745257275088548364400416034343698140690307679561883, + 102667751291234922, + 21888242871839275222246405745257275088548364400416034343698076454639020503563, + 50459689145593006, + 21888242871839275222246405745257275088548364400416034343698124322650580978206, + 21888242871839275222246405745257275088548364400416034343698112517214610421204, + 21888242871839275222246405745257275088548364400416034343698060567191807962917, + 21888242871839275222246405745257275088548364400416034343698177428208816362393, + 21888242871839275222246405745257275088548364400416034343698062712902446712294, + 53712628852076383, + 21888242871839275222246405745257275088548364400416034343698141653763551424349, + 74301963469849254, + 56437907789228417, + 21888242871839275222246405745257275088548364400416034343698169852069216143173, + 8064132142335325, + 117980888124079912, + 21888242871839275222246405745257275088548364400416034343698075108534498127631, + 22218328675279044, + 40639631257634313, + 56379218294743217, + 27641516684099857, + 56324147111075431, + 36507425052953922, + 21888242871839275222246405745257275088548364400416034343698193971757048479456, + 22187217690134100, + 21888242871839275222246405745257275088548364400416034343698135551932197841915, + 7290842331539029, + 21888242871839275222246405745257275088548364400416034343698116095576165847497, + 21888242871839275222246405745257275088548364400416034343698130221631338330483, + 2521167263579969, + 21888242871839275222246405745257275088548364400416034343698198473894902044147, + 21888242871839275222246405745257275088548364400416034343698194491786114976316, + 111455426686099690, + 21888242871839275222246405745257275088548364400416034343698168510256284824084, + 143264512456116905, + 21888242871839275222246405745257275088548364400416034343698104820611088521862, + 21888242871839275222246405745257275088548364400416034343698141239586041884573, + 65492599877766270, + 21888242871839275222246405745257275088548364400416034343698174176079726994070, + 21888242871839275222246405745257275088548364400416034343698148975607744450911, + 21888242871839275222246405745257275088548364400416034343698155799493878910130, + 9862265090003917, + 51137098112895484, + 45060909774829943, + 56305555399468976, + 142655857883459339, + 90172925397707097, + 21888242871839275222246405745257275088548364400416034343698177583091280979527, + 51564165051766500, + 21888242871839275222246405745257275088548364400416034343698176650938754724988, + 98266500228328282, + 21888242871839275222246405745257275088548364400416034343698166253127937224210, + 137332210188240147, + 21888242871839275222246405745257275088548364400416034343698136553329450040795, + 21888242871839275222246405745257275088548364400416034343698087599607962197431, + 21888242871839275222246405745257275088548364400416034343698062145895250540482, + 88639329049436931, + 21888242871839275222246405745257275088548364400416034343698140242555158775549, + 140426406967538734, + 21888242871839275222246405745257275088548364400416034343698175702249395754872, + 21888242871839275222246405745257275088548364400416034343698156135444082715159, + 21888242871839275222246405745257275088548364400416034343698120634693108962588, + 7646287530613486, + 21888242871839275222246405745257275088548364400416034343698100350642729594022, + 126248936820144836, + 100602265224658894, + 82913619472178899, + 43577643627144961, + 56419335118060182, + 52566193931512501, + 63226892100627027, + 39748107692811396, + 21888242871839275222246405745257275088548364400416034343698172556191490610792, + 21888242871839275222246405745257275088548364400416034343698092010182222893971, + 16980730796575867, + 111659583483035387, + 43704090070004903, + 90239705407287669, + 21888242871839275222246405745257275088548364400416034343698142801529018109237, + 21888242871839275222246405745257275088548364400416034343698079413652234541797, + 21888242871839275222246405745257275088548364400416034343698080977998309206592, + 21888242871839275222246405745257275088548364400416034343698060248618414402866, + 105825117498919085, + 21888242871839275222246405745257275088548364400416034343698090899901897763077, + 31942330412920148, + 75263919408997612, + 88810825895968771, + 21888242871839275222246405745257275088548364400416034343698121770179923050309, + 21888242871839275222246405745257275088548364400416034343698129907035362914162, + 141307097078947827, + 21888242871839275222246405745257275088548364400416034343698103062537971354211, + 39674521955897568, + 36165487491107472, + 48377805951996360, + 83994390045297780, + 107798707215440932, + 26312543497088971, + 21888242871839275222246405745257275088548364400416034343698117113700362496981, + 21888242871839275222246405745257275088548364400416034343698189651396388979363, + 21888242871839275222246405745257275088548364400416034343698191081791410522877, + 115852134083829576, + 103169710034908589, + 21888242871839275222246405745257275088548364400416034343698110336463494957276, + 37162312976622089, + 21888242871839275222246405745257275088548364400416034343698079980492144566100, + 21888242871839275222246405745257275088548364400416034343698144303980223150501, + 71677056963197920, + 80020816111803221, + 21888242871839275222246405745257275088548364400416034343698140232799871917176, + 21888242871839275222246405745257275088548364400416034343698105941405533513780, + 137648983106027709, + 21888242871839275222246405745257275088548364400416034343698071966231685073913, + 21888242871839275222246405745257275088548364400416034343698190028885655159350, + 79047509619171820, + 75254110873159075, + 36395087484361986, + 21888242871839275222246405745257275088548364400416034343698072087984062318028, + 21888242871839275222246405745257275088548364400416034343698107024535533130438, + 137597485412630504, + 21888242871839275222246405745257275088548364400416034343698132597511058542950, + 61316119264069761, + 21888242871839275222246405745257275088548364400416034343698195293530614644435, + 21888242871839275222246405745257275088548364400416034343698094032996146606987, + 21888242871839275222246405745257275088548364400416034343698172165791066121228, + 53437775680996331, + 41944482665560703, + 135886052029456428, + 64328967372454412, + 21888242871839275222246405745257275088548364400416034343698074124061199763709, + 19278221824783115, + 101887140401280923, + 21888242871839275222246405745257275088548364400416034343698067401271135502598, + 142174505609449690, + 6028642354145995, + 95608188353082009, + 21888242871839275222246405745257275088548364400416034343698130283388170280762, + 34728363118807170, + 21888242871839275222246405745257275088548364400416034343698073882580227995104, + 137502413708766657, + 57031812194542457, + 5083976042630324, + 94714583711186265, + 21888242871839275222246405745257275088548364400416034343698170031075406285765, + 83061627889048530, + 25719530857730643, + 21888242871839275222246405745257275088548364400416034343698138239386334086339, + 21888242871839275222246405745257275088548364400416034343698200084298049503349, + 21888242871839275222246405745257275088548364400416034343698124498364707908060, + 21888242871839275222246405745257275088548364400416034343698146305526509213593, + 21888242871839275222246405745257275088548364400416034343698063658494571559369, + 21888242871839275222246405745257275088548364400416034343698133995988978364485, + 21888242871839275222246405745257275088548364400416034343698076071368754062023, + 21888242871839275222246405745257275088548364400416034343698115961804567444471, + 15413948859849062, + 48283874146468370, + 21888242871839275222246405745257275088548364400416034343698142591482077726864, + 43072580696603139, + 29277103057820486, + 21888242871839275222246405745257275088548364400416034343698198864151562635924, + 134420221803758527, + 21888242871839275222246405745257275088548364400416034343698143792575071669874, + 21888242871839275222246405745257275088548364400416034343698121419127882386542, + 21888242871839275222246405745257275088548364400416034343698154498602924572299, + 21888242871839275222246405745257275088548364400416034343698183871052950498321, + 63430486186740393, + 21888242871839275222246405745257275088548364400416034343698078803701647413341, + 21888242871839275222246405745257275088548364400416034343698149636239360897953, + 49967620346568201, + 23245689300703434, + 59679629288529268, + 53416982853584223, + 21888242871839275222246405745257275088548364400416034343698076059977724679755, + 98475140036224743, + 21888242871839275222246405745257275088548364400416034343698102536803321903859, + 36392976210896607, + 21888242871839275222246405745257275088548364400416034343698140348568250740233, + 21888242871839275222246405745257275088548364400416034343698077153937224457887, + 56026872284394273, + 83935518887375771, + 21888242871839275222246405745257275088548364400416034343698145455180632995551, + 28995988513563951, + 21888242871839275222246405745257275088548364400416034343698200828956955920350, + 21888242871839275222246405745257275088548364400416034343698065959616665572202, + 21888242871839275222246405745257275088548364400416034343698144547625897277522, + 21888242871839275222246405745257275088548364400416034343698092921290965262735, + 105655968010418088, + 21888242871839275222246405745257275088548364400416034343698084419034973015517, + 122007549959706981, + 36347499704378191, + 21888242871839275222246405745257275088548364400416034343698115591168136837636, + 56943458557339137, + 21888242871839275222246405745257275088548364400416034343698099852166041585129, + 114934812705695140, + 128586037187192175, + 132523720948152205, + 21888242871839275222246405745257275088548364400416034343698159980467310402287, + 21888242871839275222246405745257275088548364400416034343698121325661080978527, + 45462273630371606, + 25648681197918623, + 21888242871839275222246405745257275088548364400416034343698183551402661687351, + 21888242871839275222246405745257275088548364400416034343698074605965522277789, + 4956409218793247, + 138017427730279817, + 14172659359253536, + 21888242871839275222246405745257275088548364400416034343698118477298981626364, + 21888242871839275222246405745257275088548364400416034343698102358200367176514, + 91311249124937024, + 21888242871839275222246405745257275088548364400416034343698127756949664761032, + 10848820434350303, + 21888242871839275222246405745257275088548364400416034343698121571678037434698, + 85328181307621271, + 21888242871839275222246405745257275088548364400416034343698147574972985363688, + 26019177291814676, + 21888242871839275222246405745257275088548364400416034343698061780633680710843, + 21888242871839275222246405745257275088548364400416034343698167773913081670451, + 121191457828127316, + 21888242871839275222246405745257275088548364400416034343698125112863132134474, + 49843559620164877, + 21888242871839275222246405745257275088548364400416034343698137939937305897386, + 82510999946986421, + 21888242871839275222246405745257275088548364400416034343698069532842004484492, + 141463231351456872, + 21888242871839275222246405745257275088548364400416034343698069956429182315495, + 21888242871839275222246405745257275088548364400416034343698171037721941105743, + 21888242871839275222246405745257275088548364400416034343698164992907895774476, + 21888242871839275222246405745257275088548364400416034343698078647211203030084, + 124287791726574080, + 21888242871839275222246405745257275088548364400416034343698184837724790608166, + 61748043555509383, + 124649201419195931, + 14799399475746735, + 21888242871839275222246405745257275088548364400416034343698065107212072555759, + 21888242871839275222246405745257275088548364400416034343698117998595309477581, + 21888242871839275222246405745257275088548364400416034343698080817746076441845, + 15927587521931837, + 21888242871839275222246405745257275088548364400416034343698067101621398170369, + 64710233324525521, + 21888242871839275222246405745257275088548364400416034343698188743629651732403, + 21888242871839275222246405745257275088548364400416034343698092639871420461133, + 79503235737876099, + 80209902888073740, + 92260932862410861, + 21888242871839275222246405745257275088548364400416034343698132121533375868584, + 21888242871839275222246405745257275088548364400416034343698068020934713778067, + 21888242871839275222246405745257275088548364400416034343698117993908159336728, + 21888242871839275222246405745257275088548364400416034343698119831452953685083, + 21888242871839275222246405745257275088548364400416034343698116638676092157977, + 21888242871839275222246405745257275088548364400416034343698107199758594951033, + 21888242871839275222246405745257275088548364400416034343698144221215848406019, + 21888242871839275222246405745257275088548364400416034343698194801816221707381, + 21888242871839275222246405745257275088548364400416034343698121417502277815418, + 50900171017008773, + 42774546182519567, + 21888242871839275222246405745257275088548364400416034343698122734391405393338, + 21888242871839275222246405745257275088548364400416034343698153586011939015731, + 21888242871839275222246405745257275088548364400416034343698130841308759270503, + 21888242871839275222246405745257275088548364400416034343698111197695618391079, + 8147712840888250, + 121241612331377989, + 130744525545494069, + 21888242871839275222246405745257275088548364400416034343698166041309770337508, + 98112919699499930, + 21888242871839275222246405745257275088548364400416034343698069751448579827597, + 21888242871839275222246405745257275088548364400416034343698090017357320888013, + 21888242871839275222246405745257275088548364400416034343698097736419880916959, + 21888242871839275222246405745257275088548364400416034343698074814279871378907, + 21888242871839275222246405745257275088548364400416034343698126735192292356114, + 21888242871839275222246405745257275088548364400416034343698073833705736604299, + 129407008680828558, + 21888242871839275222246405745257275088548364400416034343698090482111770986948, + 11272628167685542, + 21888242871839275222246405745257275088548364400416034343698115895023904198987, + 63006199676746343, + 21888242871839275222246405745257275088548364400416034343698150890564613855057, + 3979509765975772, + 21888242871839275222246405745257275088548364400416034343698141691957441255506, + 55423394306672315, + 21888242871839275222246405745257275088548364400416034343698131813824070102633, + 21888242871839275222246405745257275088548364400416034343698101978431845020298, + 21888242871839275222246405745257275088548364400416034343698160574344175495944, + 21888242871839275222246405745257275088548364400416034343698133164983273186732, + 48341057092243635, + 21888242871839275222246405745257275088548364400416034343698108648881238239936, + 21888242871839275222246405745257275088548364400416034343698164293105627834195, + 46235595833061088, + 123472124152467697, + 21888242871839275222246405745257275088548364400416034343698186683399001568415, + 53065409535143872, + 21888242871839275222246405745257275088548364400416034343698153181754705689240, + 21888242871839275222246405745257275088548364400416034343698150531430083699365, + 21888242871839275222246405745257275088548364400416034343698177156868179235501, + 21888242871839275222246405745257275088548364400416034343698124272623343670554, + 4052452121371014, + 21888242871839275222246405745257275088548364400416034343698191255743080347046, + 21888242871839275222246405745257275088548364400416034343698128917483622726327, + 40396447546729941, + 112487893151782799, + 21888242871839275222246405745257275088548364400416034343698126215615174996988, + 21888242871839275222246405745257275088548364400416034343698113767466591740196, + 21888242871839275222246405745257275088548364400416034343698098097448377596804, + 13275475036714277, + 21888242871839275222246405745257275088548364400416034343698197571055752927642, + 21888242871839275222246405745257275088548364400416034343698171423482162218395, + 97665068343126318, + 21301474280959679, + 21888242871839275222246405745257275088548364400416034343698162982021291014051, + 4425559605188741, + 21888242871839275222246405745257275088548364400416034343698099507209555479077, + 12477396979187586, + 39138404247201983, + 21888242871839275222246405745257275088548364400416034343698201499015307648655, + 82793107873782729, + 119702656354735713, + 116034297329551113, + 21888242871839275222246405745257275088548364400416034343698143520371118180652, + 55090196523112982, + 1288488779649242, + 92047697680860468, + 57402669830323602, + 46835785945873738, + 10201381747984395, + 141082733642753697, + 21888242871839275222246405745257275088548364400416034343698148653302554609403, + 21888242871839275222246405745257275088548364400416034343698195168904573663248, + 21888242871839275222246405745257275088548364400416034343698166909321702871196, + 21888242871839275222246405745257275088548364400416034343698161448919901793235, + 21888242871839275222246405745257275088548364400416034343698159103642993032173, + 21888242871839275222246405745257275088548364400416034343698110659479120908440, + 21888242871839275222246405745257275088548364400416034343698099272018481925290, + 112376635252807922, + 10462918726016719, + 21888242871839275222246405745257275088548364400416034343698113655672355229022, + 21888242871839275222246405745257275088548364400416034343698143782633835375248, + 21888242871839275222246405745257275088548364400416034343698117626410882220692, + 21888242871839275222246405745257275088548364400416034343698143295452195307705, + 21888242871839275222246405745257275088548364400416034343698124039812996587645, + 50857381362476132, + 21888242871839275222246405745257275088548364400416034343698145215751836853298, + 21888242871839275222246405745257275088548364400416034343698134429309445667841, + 21888242871839275222246405745257275088548364400416034343698192943942082984467, + 21888242871839275222246405745257275088548364400416034343698154686846744467686, + 21888242871839275222246405745257275088548364400416034343698202051032348360743, + 80892313846115296, + 21888242871839275222246405745257275088548364400416034343698074833325792107194, + 21888242871839275222246405745257275088548364400416034343698159931041935133834, + 21888242871839275222246405745257275088548364400416034343698111369126393543214, + 21888242871839275222246405745257275088548364400416034343698105295793203241117, + 33884934921645019, + 101177610548431220, + 56821992040285985, + 114470936819863194, + 119629985258772886, + 21888242871839275222246405745257275088548364400416034343698120462136545277884, + 36032429840114206, + 21888242871839275222246405745257275088548364400416034343698175015167431676897, + 21888242871839275222246405745257275088548364400416034343698095864756621393714, + 21888242871839275222246405745257275088548364400416034343698076932172292673284, + 73654858375118188, + 7835830166878623, + 21888242871839275222246405745257275088548364400416034343698078876596933044808, + 21888242871839275222246405745257275088548364400416034343698144499760691700946, + 7856200984919406, + 21888242871839275222246405745257275088548364400416034343698194875830789906418, + 21888242871839275222246405745257275088548364400416034343698130435568281356411, + 116789610517277863, + 8011434416419622, + 21888242871839275222246405745257275088548364400416034343698154142359416897956, + 93304848606824686, + 56618090144660764, + 132892433066503921, + 21888242871839275222246405745257275088548364400416034343698116729807002342221, + 21888242871839275222246405745257275088548364400416034343698182833371123299461, + 21888242871839275222246405745257275088548364400416034343698064734955812614097, + 21888242871839275222246405745257275088548364400416034343698126286007407383327, + 77145434590692239, + 21343475400666370, + 80062173009530810, + 21888242871839275222246405745257275088548364400416034343698198440264225431742, + 51445975030556480, + 80871767966759681, + 21888242871839275222246405745257275088548364400416034343698121801424727499283, + 6604472235346989, + 24571985126257689, + 21888242871839275222246405745257275088548364400416034343698097872124519216490, + 21888242871839275222246405745257275088548364400416034343698165889210938771861, + 103771549004912785, + 18266489096734146, + 47419080175134008, + 21888242871839275222246405745257275088548364400416034343698183057848424007062, + 21888242871839275222246405745257275088548364400416034343698129331461538117839, + 98186982204931015, + 124662107036019459, + 21888242871839275222246405745257275088548364400416034343698173454820814000769, + 38198779618886290, + 21888242871839275222246405745257275088548364400416034343698077914503693485882, + 21888242871839275222246405745257275088548364400416034343698109732166791761175, + 21888242871839275222246405745257275088548364400416034343698163800705787831938, + 104149160056521322, + 29401420991595195, + 117284148720212061, + 89997497148541219, + 33601242499617867, + 137563346719234189, + 135139879646143554, + 66952540895629959, + 21888242871839275222246405745257275088548364400416034343698143992453073469681, + 21888242871839275222246405745257275088548364400416034343698150231068587931944, + 21888242871839275222246405745257275088548364400416034343698177662330322407792, + 21888242871839275222246405745257275088548364400416034343698142106931607457306, + 68788763728584420, + 124286831342053794, + 21888242871839275222246405745257275088548364400416034343698198552133870007759, + 21888242871839275222246405745257275088548364400416034343698126335439445760591, + 129314685576983091, + 21888242871839275222246405745257275088548364400416034343698104055091515078282, + 21888242871839275222246405745257275088548364400416034343698114605060523878394, + 10640878685148166, + 21888242871839275222246405745257275088548364400416034343698162285307327373398, + 21888242871839275222246405745257275088548364400416034343698137766757319625540, + 21888242871839275222246405745257275088548364400416034343698085014237887128272, + 46598348161547697, + 21888242871839275222246405745257275088548364400416034343698168097311159871802, + 89339037353020009, + 56940841672695094, + 78830019981124998, + 8491804906510003, + 125409050011756306, + 21888242871839275222246405745257275088548364400416034343698176160535259736137, + 1545187325835483, + 21888242871839275222246405745257275088548364400416034343698104581262534579902, + 21888242871839275222246405745257275088548364400416034343698109527306918107347, + 21888242871839275222246405745257275088548364400416034343698103668714013198770, + 24076202079843443, + 135321573601068305, + 21888242871839275222246405745257275088548364400416034343698092547299966173226, + 21888242871839275222246405745257275088548364400416034343698195961097044938035, + 21888242871839275222246405745257275088548364400416034343698060194797120649739, + 19801765942969660, + 21888242871839275222246405745257275088548364400416034343698096789232164437179, + 18321811087205125, + 2987143991055260, + 21888242871839275222246405745257275088548364400416034343698129765880614856332, + 21888242871839275222246405745257275088548364400416034343698141265863234670397, + 21888242871839275222246405745257275088548364400416034343698178673411411645386, + 21888242871839275222246405745257275088548364400416034343698174222107485692518, + 21888242871839275222246405745257275088548364400416034343698116425089388355023, + 21888242871839275222246405745257275088548364400416034343698189697219926768575, + 21888242871839275222246405745257275088548364400416034343698110667349090428474, + 21888242871839275222246405745257275088548364400416034343698103742518636636747, + 86885202700358173, + 21888242871839275222246405745257275088548364400416034343698112662028210655742, + 91392556465823273, + 7420634589540589, + 45078169159643911, + 21888242871839275222246405745257275088548364400416034343698149678443642996555, + 136274121525874028, + 21888242871839275222246405745257275088548364400416034343698101528623434009021, + 21888242871839275222246405745257275088548364400416034343698095003079103798268, + 20773680193280020, + 21888242871839275222246405745257275088548364400416034343698168998368505463216, + 2461226571756253, + 21888242871839275222246405745257275088548364400416034343698129591973502804580, + 21888242871839275222246405745257275088548364400416034343698085251008581897825, + 21888242871839275222246405745257275088548364400416034343698180864182630979639, + 21888242871839275222246405745257275088548364400416034343698173265257456488149, + 12793184456063888, + 37841227888618019, + 21888242871839275222246405745257275088548364400416034343698185755832968584528, + 21888242871839275222246405745257275088548364400416034343698082562055402596179, + 21888242871839275222246405745257275088548364400416034343698063816133245648931, + 21888242871839275222246405745257275088548364400416034343698091747868391124544, + 21888242871839275222246405745257275088548364400416034343698080249704479219052, + 21888242871839275222246405745257275088548364400416034343698174818889746445230, + 21888242871839275222246405745257275088548364400416034343698194108207776782392, + 21888242871839275222246405745257275088548364400416034343698115364522433385851, + 21888242871839275222246405745257275088548364400416034343698161824574574789891, + 71915720789870827, + 21888242871839275222246405745257275088548364400416034343698103643884822678427, + 21888242871839275222246405745257275088548364400416034343698079720277162777525, + 21888242871839275222246405745257275088548364400416034343698199287810763907905, + 21888242871839275222246405745257275088548364400416034343698156651879643273836, + 21888242871839275222246405745257275088548364400416034343698160815584170461443, + 21888242871839275222246405745257275088548364400416034343698181990711456321822, + 67631464840821764, + 121273688562815116, + 21888242871839275222246405745257275088548364400416034343698173950178071373831, + 5866179856319306, + 21888242871839275222246405745257275088548364400416034343698163547677242152192, + 21888242871839275222246405745257275088548364400416034343698083485100457824921, + 21888242871839275222246405745257275088548364400416034343698085031146783252029, + 21888242871839275222246405745257275088548364400416034343698144397215534143007, + 42259175429670869, + 21888242871839275222246405745257275088548364400416034343698146781735612796168, + 21888242871839275222246405745257275088548364400416034343698060835560600988419, + 21888242871839275222246405745257275088548364400416034343698194912117528298182, + 130799089326699114, + 135263133648843488, + 21888242871839275222246405745257275088548364400416034343698174426659630211942, + 929315535817885, + 920179155849288, + 106429837084984365, + 21888242871839275222246405745257275088548364400416034343698179960737163467827, + 41478504445134900, + 85161610914277826, + 59242363049032702, + 68046916230161541, + 61593535790442296, + 20165504338372250, + 21888242871839275222246405745257275088548364400416034343698200078895981210041, + 140470427261778576, + 23860274063348014, + 21888242871839275222246405745257275088548364400416034343698154877859578483400, + 79131047847308532, + 21888242871839275222246405745257275088548364400416034343698122529051310388082, + 73644619853899608, + 116969244470827678, + 70456440959852611, + 21888242871839275222246405745257275088548364400416034343698184966678917947795, + 21888242871839275222246405745257275088548364400416034343698106571943646615643, + 21888242871839275222246405745257275088548364400416034343698186098208405846987, + 15558226549738469, + 118097045969192819, + 21888242871839275222246405745257275088548364400416034343698192108705020792143, + 89137505116292703, + 41862380736924137, + 21888242871839275222246405745257275088548364400416034343698121700529111556949, + 21888242871839275222246405745257275088548364400416034343698175861679212124767, + 89987014115884633, + 42069094715224262, + 132806114190893119, + 133011037937222168, + 21888242871839275222246405745257275088548364400416034343698084978355728375110, + 34402436801362908, + 49980677048074681, + 99005881476212287, + 103705706470720089, + 40820618522346151, + 21888242871839275222246405745257275088548364400416034343698157500978751933671, + 21888242871839275222246405745257275088548364400416034343698154112511903185722, + 74302289888609915, + 21888242871839275222246405745257275088548364400416034343698075587574504880405, + 21888242871839275222246405745257275088548364400416034343698113306172344752343, + 66954929617293767, + 25470468689263221, + 35324725563250937, + 21888242871839275222246405745257275088548364400416034343698069662648217352706, + 21888242871839275222246405745257275088548364400416034343698105534547362163665, + 121301324242057887, + 21888242871839275222246405745257275088548364400416034343698182669285845716267, + 75714522887680867, + 89146257947778750, + 110861996441730029, + 106804266850669567, + 52882865890073177, + 95615129116108251, + 47004436214495844, + 21888242871839275222246405745257275088548364400416034343698099852768822532024, + 21888242871839275222246405745257275088548364400416034343698178740298682670917, + 21888242871839275222246405745257275088548364400416034343698185416262980787315, + 21888242871839275222246405745257275088548364400416034343698193090484731615207, + 40041560597297914, + 70574599864801415, + 21888242871839275222246405745257275088548364400416034343698174222131366787018, + 52197277335027335, + 21888242871839275222246405745257275088548364400416034343698112054192072132981, + 112163019090905321, + 79953517666480516, + 21888242871839275222246405745257275088548364400416034343698083650025018562991, + 34526316868622692, + 21888242871839275222246405745257275088548364400416034343698170730533324433062, + 2644739170885135, + 50409642471092794, + 113558795161767961, + 21888242871839275222246405745257275088548364400416034343698123446079497818267, + 65781329468157761, + 65655235002293177, + 21888242871839275222246405745257275088548364400416034343698182215888017967072, + 21888242871839275222246405745257275088548364400416034343698104886783382503839, + 21888242871839275222246405745257275088548364400416034343698148174072924549355, + 94586511599546900, + 25711307694761552, + 21888242871839275222246405745257275088548364400416034343698186334098560210728, + 43714745984711448, + 69766264400901982, + 21888242871839275222246405745257275088548364400416034343698122041961822743560, + 49306590506184171, + 21888242871839275222246405745257275088548364400416034343698173990199106227735, + 121799585156225889, + 21888242871839275222246405745257275088548364400416034343698096666156480296031, + 21888242871839275222246405745257275088548364400416034343698102705873142733198, + 14193760756754830, + 93273935581809529, + 59061452977176282, + 21888242871839275222246405745257275088548364400416034343698121061773160007616, + 132559858550987248, + 50019723393433543, + 21888242871839275222246405745257275088548364400416034343698172148714119005610, + 122698139171947524, + 21888242871839275222246405745257275088548364400416034343698154232504085054509, + 21888242871839275222246405745257275088548364400416034343698116876385862219010, + 21888242871839275222246405745257275088548364400416034343698108526905432431452, + 21888242871839275222246405745257275088548364400416034343698100840411340549614, + 122335115108174284, + 51977696172457302, + 21888242871839275222246405745257275088548364400416034343698162316220021688955, + 93809357167773833, + 21888242871839275222246405745257275088548364400416034343698119450702609968274, + 29363235487535283, + 21888242871839275222246405745257275088548364400416034343698180239375897176963, + 21888242871839275222246405745257275088548364400416034343698172825066779051329, + 5273555897689953, + 21888242871839275222246405745257275088548364400416034343698155261690342671206, + 21888242871839275222246405745257275088548364400416034343698096107071188140893, + 21888242871839275222246405745257275088548364400416034343698107126703848786006, + 54880937805487126, + 49243102990740406, + 75066965484810782, + 21888242871839275222246405745257275088548364400416034343698092394352884010333, + 20010446384771473, + 21888242871839275222246405745257275088548364400416034343698152699876890446035, + 15383947003157983, + 21888242871839275222246405745257275088548364400416034343698086544636064568546, + 21888242871839275222246405745257275088548364400416034343698122329805983052953, + 21888242871839275222246405745257275088548364400416034343698163041749385508625, + 21888242871839275222246405745257275088548364400416034343698108921424630707868, + 49358677731686061, + 19443503308314832, + 21888242871839275222246405745257275088548364400416034343698114316357619892932, + 88903010933921881, + 61373689747788572, + 76684888000745636, + 971881678660605, + 21888242871839275222246405745257275088548364400416034343698149650725374741529, + 21888242871839275222246405745257275088548364400416034343698095607696738172680, + 21888242871839275222246405745257275088548364400416034343698180085997591329097, + 21888242871839275222246405745257275088548364400416034343698097483500856138160, + 21888242871839275222246405745257275088548364400416034343698062170092412164050, + 21888242871839275222246405745257275088548364400416034343698065092957545964541, + 21888242871839275222246405745257275088548364400416034343698164362695953072638, + 85026173636387672, + 90737321575953490, + 26891127881567133, + 21888242871839275222246405745257275088548364400416034343698082535218334863135, + 133924062012709997, + 21888242871839275222246405745257275088548364400416034343698095745803575326052, + 21888242871839275222246405745257275088548364400416034343698172194188607651095, + 123629046135579234, + 21888242871839275222246405745257275088548364400416034343698113743581792244814, + 3543834986837204, + 80705317314893052, + 21888242871839275222246405745257275088548364400416034343698074122423306472298, + 21888242871839275222246405745257275088548364400416034343698188299027424964543, + 134999438402972681, + 137827565964542771, + 21888242871839275222246405745257275088548364400416034343698169476226533469991, + 69082457997526430, + 21888242871839275222246405745257275088548364400416034343698076659254860830742, + 21888242871839275222246405745257275088548364400416034343698116038088139062312, + 21888242871839275222246405745257275088548364400416034343698186293003955666129, + 21888242871839275222246405745257275088548364400416034343698146771890039433822, + 33506477180438955, + 40253508528503632, + 20042586321253947, + 65154974814708451, + 15208834744675011, + 21888242871839275222246405745257275088548364400416034343698076590754962904465, + 21888242871839275222246405745257275088548364400416034343698171413906492051147, + 21888242871839275222246405745257275088548364400416034343698154352766663220775, + 21888242871839275222246405745257275088548364400416034343698152076406997239812, + 21888242871839275222246405745257275088548364400416034343698068480362443498212, + 21888242871839275222246405745257275088548364400416034343698139884221727662726, + 21888242871839275222246405745257275088548364400416034343698120801677957220131, + 21888242871839275222246405745257275088548364400416034343698092965534916807501, + 21888242871839275222246405745257275088548364400416034343698062474896922736334, + 107909185936506178, + 21888242871839275222246405745257275088548364400416034343698083102358206985550, + 21888242871839275222246405745257275088548364400416034343698136732040700691371, + 86775743926679033, + 21888242871839275222246405745257275088548364400416034343698110434695907798892, + 21888242871839275222246405745257275088548364400416034343698124332748184009101, + 21888242871839275222246405745257275088548364400416034343698152553133410217313, + 21888242871839275222246405745257275088548364400416034343698127465576290389201, + 21888242871839275222246405745257275088548364400416034343698127208427728998097, + 130847931419660431, + 21888242871839275222246405745257275088548364400416034343698120185910907981583, + 98168268469505152, + 21888242871839275222246405745257275088548364400416034343698191849449388452136, + 51979360072203279, + 59139543667108554, + 64477927500946921, + 91402308982556717, + 21888242871839275222246405745257275088548364400416034343698077154118475589957, + 21888242871839275222246405745257275088548364400416034343698199432075731867083, + 21888242871839275222246405745257275088548364400416034343698080961694139256804, + 21888242871839275222246405745257275088548364400416034343698074486246032190537, + 131117653620518995, + 21888242871839275222246405745257275088548364400416034343698098415908149195743, + 48064114136781627, + 122715760206247221, + 141496000294096637, + 21888242871839275222246405745257275088548364400416034343698076241976559525914, + 21888242871839275222246405745257275088548364400416034343698111423449817860919, + 21888242871839275222246405745257275088548364400416034343698184614824261476802, + 24367227316449568, + 21888242871839275222246405745257275088548364400416034343698200976661943660662, + 30951515736445535, + 138630967921272762, + 21888242871839275222246405745257275088548364400416034343698174933011071712915, + 21888242871839275222246405745257275088548364400416034343698162563181329376213, + 21888242871839275222246405745257275088548364400416034343698118698794402552324, + 21888242871839275222246405745257275088548364400416034343698121837951066928921, + 21888242871839275222246405745257275088548364400416034343698080907571830425632, + 62805268455593572, + 21888242871839275222246405745257275088548364400416034343698130874197407548521, + 101091788804104183, + 62515776165732946, + 107551310679096518, + 21888242871839275222246405745257275088548364400416034343698152125399350135865, + 21888242871839275222246405745257275088548364400416034343698166142427958266725, + 79433835245265874, + 16749132114727306, + 21888242871839275222246405745257275088548364400416034343698082577062322305796, + 21888242871839275222246405745257275088548364400416034343698097961747931538432, + 68815785939032944, + 749604358339438, + 21888242871839275222246405745257275088548364400416034343698186248637203896187, + 21888242871839275222246405745257275088548364400416034343698165598929904757103, + 21888242871839275222246405745257275088548364400416034343698112807013581424296, + 21888242871839275222246405745257275088548364400416034343698063788293554272366, + 25659626115683735, + 94172484882718520, + 21888242871839275222246405745257275088548364400416034343698133591350937525146, + 21888242871839275222246405745257275088548364400416034343698165346348918624388, + 121653443464813862, + 97544087894544399, + 125686675682091074, + 4609170906647341, + 96443474826925378, + 118568994298222745, + 14191128862882730, + 21888242871839275222246405745257275088548364400416034343698131329761754280266, + 21888242871839275222246405745257275088548364400416034343698133407381810427478, + 17422121951672828, + 21888242871839275222246405745257275088548364400416034343698164217079681842568, + 116719857346298646, + 21888242871839275222246405745257275088548364400416034343698079403823764593227, + 89494651095241595, + 61478650223977837, + 81904205613493117, + 136240687387133216, + 21888242871839275222246405745257275088548364400416034343698194891403855222127, + 50424125202636986, + 84585265192949796, + 71230845441025730, + 142085018333134112, + 73205288172263004, + 21888242871839275222246405745257275088548364400416034343698171383845997303460, + 21888242871839275222246405745257275088548364400416034343698178467296104287551, + 21888242871839275222246405745257275088548364400416034343698148367819343420413, + 77750504950564364, + 124769145505337099, + 75652391211238746, + 118097325868373919, + 21888242871839275222246405745257275088548364400416034343698187740498480816203, + 73979495153491345, + 135681473981944069, + 1572971326369669, + 28217390038117398, + 72066528449395270, + 21888242871839275222246405745257275088548364400416034343698080751988283537791, + 21888242871839275222246405745257275088548364400416034343698191959090486282268, + 79444456475940860, + 21888242871839275222246405745257275088548364400416034343698119335360679303447, + 114864370918296099, + 21888242871839275222246405745257275088548364400416034343698088055188632301896, + 4962880785607213, + 80984785544760111, + 21888242871839275222246405745257275088548364400416034343698148256947551941175, + 21888242871839275222246405745257275088548364400416034343698091607165642616245, + 44824602735639034, + 103574509212574581, + 21888242871839275222246405745257275088548364400416034343698112625720074787321, + 21888242871839275222246405745257275088548364400416034343698079857304177606983, + 21888242871839275222246405745257275088548364400416034343698071905380692856698, + 126408574982194223, + 21888242871839275222246405745257275088548364400416034343698108966608042178732, + 33321941897392025, + 128239538786262707, + 102428125067257029, + 111227484189773644, + 138051487919804396, + 113626365969214231, + 21888242871839275222246405745257275088548364400416034343698129317382846152788, + 21888242871839275222246405745257275088548364400416034343698191857929790130570, + 21888242871839275222246405745257275088548364400416034343698129193973737950766, + 123150526355200976, + 21888242871839275222246405745257275088548364400416034343698170561283135694250, + 21888242871839275222246405745257275088548364400416034343698182339245653854504, + 21888242871839275222246405745257275088548364400416034343698073925419167108345, + 18427733659162617, + 16919581181464156, + 92391134625244705, + 57541544726912049, + 21888242871839275222246405745257275088548364400416034343698142535629202965915, + 21888242871839275222246405745257275088548364400416034343698154430024880651536, + 21888242871839275222246405745257275088548364400416034343698066301719582283893, + 68479890793441637, + 82958372915789702, + 21888242871839275222246405745257275088548364400416034343698080641439304581837, + 21888242871839275222246405745257275088548364400416034343698082310347317318990, + 66338709904796284, + 21888242871839275222246405745257275088548364400416034343698193934212237192734, + 91915687477116429, + 23463082877363497, + 21888242871839275222246405745257275088548364400416034343698080586877923055589, + 32460664031589774, + 61643334300464415, + 68290088318185913, + 96531090058862165, + 21888242871839275222246405745257275088548364400416034343698179600605824253827, + 21888242871839275222246405745257275088548364400416034343698137363634263398220, + 21888242871839275222246405745257275088548364400416034343698179930818254075598, + 21888242871839275222246405745257275088548364400416034343698187576456503616871, + 105736363697741918, + 21888242871839275222246405745257275088548364400416034343698175223415967409638, + 21888242871839275222246405745257275088548364400416034343698163567038755685730, + 107140498364974565, + 21888242871839275222246405745257275088548364400416034343698144763285143669965, + 21888242871839275222246405745257275088548364400416034343698133175740647869873, + 134846826560672158, + 53411803426372515, + 42793240160516918, + 21888242871839275222246405745257275088548364400416034343698069774575146125039, + 124419270675682451, + 128949509526779454, + 104358410150171917, + 60639347658396605, + 21888242871839275222246405745257275088548364400416034343698124658352044542744, + 131511251305603436, + 21888242871839275222246405745257275088548364400416034343698130056766382305724, + 24979445622717388, + 21888242871839275222246405745257275088548364400416034343698064059783525084983, + 21888242871839275222246405745257275088548364400416034343698123800161526078538, + 44940403550378510, + 115796605106280368, + 95673908511574059, + 21888242871839275222246405745257275088548364400416034343698157518351419886227, + 41645564674431813, + 21888242871839275222246405745257275088548364400416034343698180404426153941481, + 18485893213748544, + 21888242871839275222246405745257275088548364400416034343698171781272078256152, + 21888242871839275222246405745257275088548364400416034343698153668639257218708, + 11298382394358595, + 129003504656233362, + 65433273862113734, + 21888242871839275222246405745257275088548364400416034343698114459955745985894, + 131211110703123620, + 25839662018780530, + 21888242871839275222246405745257275088548364400416034343698153243809956642327, + 21888242871839275222246405745257275088548364400416034343698095563169809208087, + 21888242871839275222246405745257275088548364400416034343698125215055972797381, + 21888242871839275222246405745257275088548364400416034343698191957254390977925, + 21888242871839275222246405745257275088548364400416034343698161889726444548391, + 130061493067927374, + 42533347127237251, + 58968259452113122, + 21888242871839275222246405745257275088548364400416034343698090905612555353004, + 134424212065669581, + 21888242871839275222246405745257275088548364400416034343698154091317339448945, + 97661759238037852, + 21888242871839275222246405745257275088548364400416034343698204140931497299674, + 51743598882068598, + 125354666405210867, + 21888242871839275222246405745257275088548364400416034343698141485178661617521, + 31638790228592907, + 1963226589759771, + 21888242871839275222246405745257275088548364400416034343698137264399408599684, + 74668331070077382, + 21888242871839275222246405745257275088548364400416034343698118093733933987615, + 134396294340336074, + 139607244512369143, + 21888242871839275222246405745257275088548364400416034343698069405809945714811, + 21888242871839275222246405745257275088548364400416034343698079062685793653868, + 21888242871839275222246405745257275088548364400416034343698172918020589528961, + 135868252512271519, + 39745441251927859, + 46545738192666309, + 38095519365634433, + 21888242871839275222246405745257275088548364400416034343698087888448985194736, + 21888242871839275222246405745257275088548364400416034343698125523627190841285, + 21888242871839275222246405745257275088548364400416034343698151035182985291840, + 21888242871839275222246405745257275088548364400416034343698085417075302807957, + 55601516798625788, + 21888242871839275222246405745257275088548364400416034343698062667400896160362, + 21888242871839275222246405745257275088548364400416034343698080304639042605296, + 21888242871839275222246405745257275088548364400416034343698180438144426693833, + 55322008029680771, + 39302351490699213, + 4094965548913481, + 56346061321291869, + 19501953392981766, + 100494134663146246, + 21888242871839275222246405745257275088548364400416034343698137658533690963037, + 21520523751847136, + 21888242871839275222246405745257275088548364400416034343698061490507962654074, + 21888242871839275222246405745257275088548364400416034343698199743797891538530, + 21888242871839275222246405745257275088548364400416034343698188204551380537334, + 21888242871839275222246405745257275088548364400416034343698090562651353313136, + 134405687541368885, + 17376949425228436, + 125131588209086597, + 21888242871839275222246405745257275088548364400416034343698151476538219691801, + 21888242871839275222246405745257275088548364400416034343698129689534328611875, + 21888242871839275222246405745257275088548364400416034343698068680293801180275, + 72295830064017108, + 21888242871839275222246405745257275088548364400416034343698127406908403941470, + 103840547768006769, + 21888242871839275222246405745257275088548364400416034343698126080156198723471, + 21888242871839275222246405745257275088548364400416034343698079131202027210769, + 128101731887327939, + 31341313502068565, + 21888242871839275222246405745257275088548364400416034343698193692685813027506, + 69394103857192850, + 130122714178442201, + 21888242871839275222246405745257275088548364400416034343698188860421518657105, + 8499249564149023, + 84305908979975610, + 17380085886939855, + 41981142052938444, + 21888242871839275222246405745257275088548364400416034343698158365156204248245, + 21888242871839275222246405745257275088548364400416034343698068251539114496661, + 106691936577515504, + 21888242871839275222246405745257275088548364400416034343698060997714173798103, + 21888242871839275222246405745257275088548364400416034343698099177902677938813, + 130413055876392664, + 21888242871839275222246405745257275088548364400416034343698194794152337441734, + 126206628060069017, + 21888242871839275222246405745257275088548364400416034343698131707811952620369, + 130143799076466118, + 21888242871839275222246405745257275088548364400416034343698183064576714180355, + 21888242871839275222246405745257275088548364400416034343698190674728863138025, + 21888242871839275222246405745257275088548364400416034343698177364990027946693, + 53202936196337740, + 21888242871839275222246405745257275088548364400416034343698133585359145508814, + 113532442050692628, + 21888242871839275222246405745257275088548364400416034343698083899726313937816, + 21888242871839275222246405745257275088548364400416034343698114826764711276166, + 21888242871839275222246405745257275088548364400416034343698080123360631060179, + 21888242871839275222246405745257275088548364400416034343698176762944922607755, + 94886086431245281, + 121434463790076938, + 39208768724621522, + 43862245125884995, + 21888242871839275222246405745257275088548364400416034343698070063036079152885, + 21888242871839275222246405745257275088548364400416034343698093807516276659832, + 21888242871839275222246405745257275088548364400416034343698062464229381344560, + 135969366240010805, + 70082568887549319, + 21888242871839275222246405745257275088548364400416034343698068212212585360448, + 21888242871839275222246405745257275088548364400416034343698126625895147359485, + 21888242871839275222246405745257275088548364400416034343698147656853037631622, + 108267905271426439, + 48597054174103178, + 21888242871839275222246405745257275088548364400416034343698118988100619004696, + 21888242871839275222246405745257275088548364400416034343698195980446266102624, + 21888242871839275222246405745257275088548364400416034343698127212065927843889, + 21888242871839275222246405745257275088548364400416034343698070809125464094549, + 83331295197561322, + 44480998537682972, + 21888242871839275222246405745257275088548364400416034343698120973694394711975, + 139521986486583047, + 70684117385350831, + 21888242871839275222246405745257275088548364400416034343698109211371999958320, + 21888242871839275222246405745257275088548364400416034343698111071106401746048, + 1182010731567999, + 21888242871839275222246405745257275088548364400416034343698170550968296456927, + 31219594010185280, + 21888242871839275222246405745257275088548364400416034343698170771811245279700, + 21888242871839275222246405745257275088548364400416034343698063355696252141253, + 21888242871839275222246405745257275088548364400416034343698065014375157595939, + 107586131868862788, + 21888242871839275222246405745257275088548364400416034343698160530556135190168, + 21888242871839275222246405745257275088548364400416034343698170634855465830772, + 45654875700573636, + 21888242871839275222246405745257275088548364400416034343698152818369587519649, + 37831883781694187, + 21888242871839275222246405745257275088548364400416034343698123502074905997599, + 21888242871839275222246405745257275088548364400416034343698191120818255173319, + 22569401547811930, + 21888242871839275222246405745257275088548364400416034343698171921870397826188, + 21888242871839275222246405745257275088548364400416034343698084051665264001283, + 89480724283194961, + 103782996541091049, + 21888242871839275222246405745257275088548364400416034343698085993803327637484, + 21888242871839275222246405745257275088548364400416034343698199889726269293579, + 21888242871839275222246405745257275088548364400416034343698130390730070486390, + 10530578316914423, + 21888242871839275222246405745257275088548364400416034343698082286795390434053, + 21888242871839275222246405745257275088548364400416034343698103107777370986753, + 70605570600077030, + 63513782640110216, + 21888242871839275222246405745257275088548364400416034343698113387600701336356, + 48474223609626563, + 86943086258338523, + 21888242871839275222246405745257275088548364400416034343698100786846526709515, + 21888242871839275222246405745257275088548364400416034343698071868898071646974, + 21888242871839275222246405745257275088548364400416034343698116143011016080819, + 21888242871839275222246405745257275088548364400416034343698156945571878211949, + 30847895476602511, + 21888242871839275222246405745257275088548364400416034343698136638661416618112, + 48289254061787251, + 21888242871839275222246405745257275088548364400416034343698062581783045754800, + 21888242871839275222246405745257275088548364400416034343698133415426455158132, + 21888242871839275222246405745257275088548364400416034343698071105584438669321, + 61845934167085214, + 16521406296259800, + 21888242871839275222246405745257275088548364400416034343698193905108567173537, + 21888242871839275222246405745257275088548364400416034343698118162463507846529, + 21888242871839275222246405745257275088548364400416034343698128821914709027806, + 143246525612832557, + 21888242871839275222246405745257275088548364400416034343698159735153466809717, + 54129788482387336, + 21888242871839275222246405745257275088548364400416034343698126288666803301509, + 51871690708812309, + 21888242871839275222246405745257275088548364400416034343698167533510761453144, + 30329628616806474, + 117714928003475427, + 21888242871839275222246405745257275088548364400416034343698129566133489463773, + 21888242871839275222246405745257275088548364400416034343698164099827116564845, + 126251635101962827, + 69368621079025512, + 21888242871839275222246405745257275088548364400416034343698143810633067424894, + 81334601957950695, + 21888242871839275222246405745257275088548364400416034343698084141791750101229, + 31000537111626388, + 133597782707117564, + 45123771304346025, + 54476435632359976, + 30463909822721306, + 21888242871839275222246405745257275088548364400416034343698170900462859128675, + 96445197685887193, + 21888242871839275222246405745257275088548364400416034343698164663308860289298, + 21888242871839275222246405745257275088548364400416034343698121017556580918217, + 124749267217892790, + 16872392657061309, + 21888242871839275222246405745257275088548364400416034343698174182787899326164, + 21888242871839275222246405745257275088548364400416034343698067268294900136812, + 21888242871839275222246405745257275088548364400416034343698169057693109466445, + 123489839547946294, + 82947084689137949, + 7089477176326123, + 105004416960024101, + 20346084202515675, + 21888242871839275222246405745257275088548364400416034343698116536942198846318, + 21888242871839275222246405745257275088548364400416034343698112929396329505986, + 21888242871839275222246405745257275088548364400416034343698129357226505256397, + 21888242871839275222246405745257275088548364400416034343698178804294062019981, + 21888242871839275222246405745257275088548364400416034343698072240010909047261, + 35954614356840364, + 21888242871839275222246405745257275088548364400416034343698134864255046719126, + 131714453973048867, + 21888242871839275222246405745257275088548364400416034343698070459580446071029, + 109251583038932918, + 64745055774568046, + 21888242871839275222246405745257275088548364400416034343698101582168732476530, + 21888242871839275222246405745257275088548364400416034343698158816367054654715, + 21888242871839275222246405745257275088548364400416034343698071377636696976347, + 21888242871839275222246405745257275088548364400416034343698079882265559019266, + 21888242871839275222246405745257275088548364400416034343698064409511973697315, + 23179717580548783, + 90657407417842638, + 98386286853390974, + 57882884501080635, + 21888242871839275222246405745257275088548364400416034343698200229749286969248, + 21888242871839275222246405745257275088548364400416034343698078685695788010543, + 119151846185695100, + 52069433171929834, + 21888242871839275222246405745257275088548364400416034343698133562187337948361, + 122000661862621077, + 21888242871839275222246405745257275088548364400416034343698137237949099743793, + 19169825407213035, + 71431524537483402, + 21888242871839275222246405745257275088548364400416034343698108534210069203096, + 78565126618489682, + 101131743501452018, + 21888242871839275222246405745257275088548364400416034343698175787162500834118, + 16976054861549240, + 21700214539399773, + 129530021552232850, + 58633714607750194, + 29631606381149406, + 21888242871839275222246405745257275088548364400416034343698071069773853604840, + 106843239808415310, + 21888242871839275222246405745257275088548364400416034343698095992194606718380, + 122548405534714113, + 136520211455391961, + 21888242871839275222246405745257275088548364400416034343698145204561666424592, + 21888242871839275222246405745257275088548364400416034343698176770059817539969, + 62518993066365675, + 21888242871839275222246405745257275088548364400416034343698078992133840908487, + 21888242871839275222246405745257275088548364400416034343698191423543696546534, + 54408477005331559, + 7475902878914188, + 31300779994281164, + 17394879682392085, + 78142592042638694, + 22308343821333993, + 21888242871839275222246405745257275088548364400416034343698165532566271320622, + 21888242871839275222246405745257275088548364400416034343698108101021601888868, + 21888242871839275222246405745257275088548364400416034343698095212767638464573, + 37108700233377023, + 21888242871839275222246405745257275088548364400416034343698082670906811561852, + 135764135920296193, + 21888242871839275222246405745257275088548364400416034343698082884137996008506, + 21888242871839275222246405745257275088548364400416034343698105906989295657323, + 34820301707353290, + 100204457204696875, + 38661957249655798, + 50776262623459577, + 56344998583575224, + 21888242871839275222246405745257275088548364400416034343698060845258290342941, + 55416540831199557, + 107382343377436070, + 21888242871839275222246405745257275088548364400416034343698163274324392500690, + 110613110554144181, + 64821805977612593, + 6072967785576572, + 54173329824326573, + 124495466743391027, + 33537619503598903, + 21888242871839275222246405745257275088548364400416034343698091991753232914688, + 110347231740048990, + 133328359001841027, + 35515942738872830, + 21888242871839275222246405745257275088548364400416034343698073078162407736737, + 121854073618588645, + 21888242871839275222246405745257275088548364400416034343698189791392951867641, + 56002006606643991, + 21888242871839275222246405745257275088548364400416034343698164862084308621307, + 21888242871839275222246405745257275088548364400416034343698140839194388089423, + 21888242871839275222246405745257275088548364400416034343698160444431341858337, + 21888242871839275222246405745257275088548364400416034343698082113436245187630, + 124225106336178547, + 61281539865023111, + 93113441179684680, + 21888242871839275222246405745257275088548364400416034343698181091831212449707, + 46695349549138771, + 21888242871839275222246405745257275088548364400416034343698203699856555134905, + 21888242871839275222246405745257275088548364400416034343698071570598187725581, + 21888242871839275222246405745257275088548364400416034343698062946580367844320, + 21888242871839275222246405745257275088548364400416034343698178234947396615473, + 21888242871839275222246405745257275088548364400416034343698134777925737157755, + 21888242871839275222246405745257275088548364400416034343698178374165901235953, + 21888242871839275222246405745257275088548364400416034343698107913364059753679, + 126388213123976676, + 71727825302735820, + 21888242871839275222246405745257275088548364400416034343698104301441158652548, + 21888242871839275222246405745257275088548364400416034343698187625954590316369, + 85057699639282362, + 105814689382135217, + 21888242871839275222246405745257275088548364400416034343698099914286267577270, + 91962798789766339, + 117563307880387178, + 95536993287479428, + 23678597550763941, + 140353748408889362, + 21888242871839275222246405745257275088548364400416034343698062891603448603661, + 21888242871839275222246405745257275088548364400416034343698178330555903596853, + 21888242871839275222246405745257275088548364400416034343698098528184884061343, + 33866506890905437, + 21888242871839275222246405745257275088548364400416034343698182646867884239310, + 69446615383638592, + 136746295798175569, + 21888242871839275222246405745257275088548364400416034343698062573853350174673, + 28999031466977178, + 135043508221880476, + 21888242871839275222246405745257275088548364400416034343698176292601906069641, + 21888242871839275222246405745257275088548364400416034343698098740561133336223, + 40529606636072458, + 36988488708807921, + 21888242871839275222246405745257275088548364400416034343698187606786267936016, + 105504587182741992, + 21888242871839275222246405745257275088548364400416034343698100820689696937908, + 83598730840228937, + 21888242871839275222246405745257275088548364400416034343698144928169360449576, + 21888242871839275222246405745257275088548364400416034343698194731996216303535, + 21888242871839275222246405745257275088548364400416034343698124273720449372594, + 21888242871839275222246405745257275088548364400416034343698089800877784971751, + 88510902334879833, + 57756839285267152, + 21888242871839275222246405745257275088548364400416034343698130298360970051307, + 21888242871839275222246405745257275088548364400416034343698093442723847770082, + 29681844096072030, + 128603393460034266, + 41159504375424004, + 60406968519887502, + 21888242871839275222246405745257275088548364400416034343698089160910698809358, + 21888242871839275222246405745257275088548364400416034343698193960006842378704, + 119142441108902554, + 98696070916183171, + 73091659135045669, + 21888242871839275222246405745257275088548364400416034343698135610473245568506, + 21888242871839275222246405745257275088548364400416034343698185234362258743234, + 113434135745217833, + 21888242871839275222246405745257275088548364400416034343698083926144488675512, + 24055984758779942, + 25122097930508359, + 132086889907701398, + 21888242871839275222246405745257275088548364400416034343698200970192334878829, + 21888242871839275222246405745257275088548364400416034343698166344990195146652, + 21888242871839275222246405745257275088548364400416034343698150501683392287973, + 21888242871839275222246405745257275088548364400416034343698077502035020041457, + 92308120109360171, + 21888242871839275222246405745257275088548364400416034343698195962455054467846, + 21888242871839275222246405745257275088548364400416034343698200912091514042274, + 99103517655967447, + 21888242871839275222246405745257275088548364400416034343698176633739709249694, + 21888242871839275222246405745257275088548364400416034343698159633874380021901, + 26687342828095152, + 21888242871839275222246405745257275088548364400416034343698062356906819881828, + 35068718262013449, + 21888242871839275222246405745257275088548364400416034343698079372263762011343, + 76089692845294103, + 21888242871839275222246405745257275088548364400416034343698144626374081811571, + 56423140795450520, + 21888242871839275222246405745257275088548364400416034343698075991370944261833, + 114603042895803220, + 134334326729448446, + 43979382484978941, + 21888242871839275222246405745257275088548364400416034343698176248127052727201, + 72795431457150579, + 104576728813099956, + 69384338436717677, + 142645818275581979, + 21888242871839275222246405745257275088548364400416034343698061537680959268713, + 21888242871839275222246405745257275088548364400416034343698178304115911585339, + 86185845189659066, + 21888242871839275222246405745257275088548364400416034343698184865754256877905, + 557334701719425, + 21888242871839275222246405745257275088548364400416034343698112800440177986560, + 21888242871839275222246405745257275088548364400416034343698124734925025714475, + 21888242871839275222246405745257275088548364400416034343698100244519778476785, + 21888242871839275222246405745257275088548364400416034343698163530540022995628, + 21888242871839275222246405745257275088548364400416034343698128454685218778832, + 21888242871839275222246405745257275088548364400416034343698093550483111440347, + 46668799825349080, + 20559306840658266, + 21888242871839275222246405745257275088548364400416034343698150164179914049466, + 37336033337471029, + 21888242871839275222246405745257275088548364400416034343698087760057526060067, + 87898565879543895, + 21888242871839275222246405745257275088548364400416034343698200122616858827246, + 124119976887809866, + 114079489378793581, + 21888242871839275222246405745257275088548364400416034343698102989828036911658, + 21888242871839275222246405745257275088548364400416034343698171343535950156575, + 19419939032054777, + 73965730256995713, + 67404261461119248, + 101419709293499655, + 21888242871839275222246405745257275088548364400416034343698069469658370357293, + 21888242871839275222246405745257275088548364400416034343698180300119369122491, + 21888242871839275222246405745257275088548364400416034343698122385081570159801, + 34476340150261927, + 126548954326573887, + 21888242871839275222246405745257275088548364400416034343698116159095322609302, + 62705386697980495, + 46704303378358098, + 21888242871839275222246405745257275088548364400416034343698171324213592214284, + 57591256087018910, + 44235736704225842, + 21888242871839275222246405745257275088548364400416034343698061011091693311776, + 41689446960751842, + 21888242871839275222246405745257275088548364400416034343698176510192338962258, + 104846783328296110, + 21888242871839275222246405745257275088548364400416034343698065373629150294528, + 92055149191124179, + 21888242871839275222246405745257275088548364400416034343698092345866323285814, + 21888242871839275222246405745257275088548364400416034343698149757588460536105, + 40953488190669685, + 107260955550861875, + 5618259786766515, + 21888242871839275222246405745257275088548364400416034343698189229914742194867, + 21888242871839275222246405745257275088548364400416034343698130940591328096709, + 21888242871839275222246405745257275088548364400416034343698175518710383562148, + 140919897509202230, + 21888242871839275222246405745257275088548364400416034343698071979350092221121, + 133570794159318531, + 21888242871839275222246405745257275088548364400416034343698096920667174694832, + 21888242871839275222246405745257275088548364400416034343698097316258821139233, + 21888242871839275222246405745257275088548364400416034343698128151023322800615, + 21888242871839275222246405745257275088548364400416034343698084264886921317036, + 21888242871839275222246405745257275088548364400416034343698152511108878299181, + 21888242871839275222246405745257275088548364400416034343698140870131642329843, + 21888242871839275222246405745257275088548364400416034343698167584129511536547, + 21888242871839275222246405745257275088548364400416034343698112626266032704833, + 21888242871839275222246405745257275088548364400416034343698120975335783962193, + 128999498989235419, + 125561659154093384, + 21888242871839275222246405745257275088548364400416034343698153885851476307943, + 21888242871839275222246405745257275088548364400416034343698110706229824926010, + 14623744287823646, + 54772382070348064, + 83724443950162863, + 21888242871839275222246405745257275088548364400416034343698182110457507008917, + 21888242871839275222246405745257275088548364400416034343698069515556973634232, + 31469161613899226, + 21888242871839275222246405745257275088548364400416034343698181836095890156866, + 21888242871839275222246405745257275088548364400416034343698087932333227646227, + 112913392724269043, + 21888242871839275222246405745257275088548364400416034343698163893500140875283, + 31625855463523132, + 21888242871839275222246405745257275088548364400416034343698102529338096299264, + 21888242871839275222246405745257275088548364400416034343698138376148260245874, + 21888242871839275222246405745257275088548364400416034343698107985511881595990, + 125180513930189030, + 21888242871839275222246405745257275088548364400416034343698068646181187516723, + 21888242871839275222246405745257275088548364400416034343698083424011892130868, + 85493235442610321, + 21888242871839275222246405745257275088548364400416034343698148626173888930874, + 21888242871839275222246405745257275088548364400416034343698146621396991497607, + 137951525410776328, + 49207514947636188, + 21888242871839275222246405745257275088548364400416034343698154422873496519808, + 143909580773095340, + 24895579775395145, + 21888242871839275222246405745257275088548364400416034343698128038748245737953, + 21888242871839275222246405745257275088548364400416034343698081743109365100652, + 21888242871839275222246405745257275088548364400416034343698177976568623487718, + 21888242871839275222246405745257275088548364400416034343698123879647422445132, + 21888242871839275222246405745257275088548364400416034343698105275818998225470, + 21888242871839275222246405745257275088548364400416034343698090642014891849111, + 21888242871839275222246405745257275088548364400416034343698089558239390436622, + 21888242871839275222246405745257275088548364400416034343698107482633567661058, + 21888242871839275222246405745257275088548364400416034343698104462523667568555, + 21888242871839275222246405745257275088548364400416034343698170106913261631299, + 102321993851110728, + 21888242871839275222246405745257275088548364400416034343698200020514664009534, + 35471055800572289, + 65593733406446252, + 21888242871839275222246405745257275088548364400416034343698190667147546797637, + 21888242871839275222246405745257275088548364400416034343698127982708472674152, + 21888242871839275222246405745257275088548364400416034343698151147621270597352, + 61650030888355954, + 21888242871839275222246405745257275088548364400416034343698184276830635397978, + 110262887838848254, + 21888242871839275222246405745257275088548364400416034343698079293986600637216, + 142131032758421890, + 21888242871839275222246405745257275088548364400416034343698107812223275811819, + 21888242871839275222246405745257275088548364400416034343698163595049900740597, + 21888242871839275222246405745257275088548364400416034343698135068696534552131, + 134599339826936671, + 21888242871839275222246405745257275088548364400416034343698188015472616768431, + 21888242871839275222246405745257275088548364400416034343698077769203144444873, + 21888242871839275222246405745257275088548364400416034343698075739323195409743, + 21888242871839275222246405745257275088548364400416034343698094426824385937400, + 21888242871839275222246405745257275088548364400416034343698166549261276238253, + 130499352203412809, + 21888242871839275222246405745257275088548364400416034343698082225165170394955, + 21888242871839275222246405745257275088548364400416034343698105256436315118116, + 21888242871839275222246405745257275088548364400416034343698105222503381861296, + 93790544963974496, + 21888242871839275222246405745257275088548364400416034343698060188838889835820, + 21888242871839275222246405745257275088548364400416034343698166314952814826322, + 21888242871839275222246405745257275088548364400416034343698130893873631653584, + 21888242871839275222246405745257275088548364400416034343698116883638976209921, + 42312542823621605, + 21888242871839275222246405745257275088548364400416034343698187935857806768720, + 26966341668647317, + 24467259817734639, + 21888242871839275222246405745257275088548364400416034343698064240931078014171, + 21888242871839275222246405745257275088548364400416034343698194504193569241850, + 59379471679191505, + 21888242871839275222246405745257275088548364400416034343698151447938695708443, + 82248695862566982, + 107503551729474681, + 20444207659865785, + 172343232467338, + 21888242871839275222246405745257275088548364400416034343698153382148013473097, + 21888242871839275222246405745257275088548364400416034343698168001147452415963, + 64568448966118383, + 21888242871839275222246405745257275088548364400416034343698073803356147060088, + 5605240748575037, + 58486463911995702, + 21888242871839275222246405745257275088548364400416034343698079175410687405182, + 54344256846628, + 21888242871839275222246405745257275088548364400416034343698103015738121849813, + 34646420714855614, + 21888242871839275222246405745257275088548364400416034343698174324579490391660, + 113230564940775147, + 51726440053784649, + 21888242871839275222246405745257275088548364400416034343698121020803955533669, + 42729737225178477, + 46849930691075661, + 118635566064899565, + 74803240221392058, + 56260116704483067, + 18306928171388961, + 21976915083966246, + 33556321115663623, + 105636764203675024, + 21888242871839275222246405745257275088548364400416034343698148847887272553158, + 21888242871839275222246405745257275088548364400416034343698089025729007937722, + 84754326161703095, + 21888242871839275222246405745257275088548364400416034343698073671564696425788, + 21888242871839275222246405745257275088548364400416034343698192132980840994778, + 104420635379663524, + 86683475084952260, + 106822654835217021, + 21888242871839275222246405745257275088548364400416034343698180030408375423880, + 21888242871839275222246405745257275088548364400416034343698163752116676454014, + 93045421730284672, + 21888242871839275222246405745257275088548364400416034343698138402993759228888, + 88644289162944997, + 102258742477646193, + 29454786932312156, + 55951541512055376, + 21888242871839275222246405745257275088548364400416034343698086744128797768073, + 21888242871839275222246405745257275088548364400416034343698098396157309375992, + 21888242871839275222246405745257275088548364400416034343698189931560594718830, + 98456626293574312, + 86654628975269113, + 21888242871839275222246405745257275088548364400416034343698190867049674369631, + 80003463406977620, + 37373957878653490, + 21888242871839275222246405745257275088548364400416034343698123476272700222385, + 21888242871839275222246405745257275088548364400416034343698073138036457045022, + 21888242871839275222246405745257275088548364400416034343698162279451110463684, + 25394720966697216, + 21888242871839275222246405745257275088548364400416034343698094472677790823225, + 29763246235418001, + 21888242871839275222246405745257275088548364400416034343698128665390325527243, + 21888242871839275222246405745257275088548364400416034343698202837217838879839, + 21888242871839275222246405745257275088548364400416034343698079352696136927382, + 46161105698828244, + 21888242871839275222246405745257275088548364400416034343698190603296407860306, + 143095371695601667, + 108395133446077742, + 21888242871839275222246405745257275088548364400416034343698063278053107008835, + 100665833624983464, + 21888242871839275222246405745257275088548364400416034343698060884001574335439, + 113240921087421173, + 21888242871839275222246405745257275088548364400416034343698104480559753227757, + 142929002213192045, + 21888242871839275222246405745257275088548364400416034343698105020823811829914, + 48238786010351405, + 113393248451259523, + 76471941918503181, + 41975489644186433, + 35017684059357537, + 21888242871839275222246405745257275088548364400416034343698066152752446699540, + 25478287248049769, + 132316538055732425, + 21888242871839275222246405745257275088548364400416034343698171603525644110949, + 21888242871839275222246405745257275088548364400416034343698122373706578655260, + 127606708102631810, + 21888242871839275222246405745257275088548364400416034343698159793857835174981, + 21888242871839275222246405745257275088548364400416034343698134902258184682021, + 84027872262300845, + 21888242871839275222246405745257275088548364400416034343698065690599717223845, + 21957673282022475, + 128390838542639741, + 43475250010545924, + 21888242871839275222246405745257275088548364400416034343698203524950407196827, + 86939659713187868, + 6505513399260404, + 124473754567553123, + 21888242871839275222246405745257275088548364400416034343698174394042770517265, + 21888242871839275222246405745257275088548364400416034343698183296102484365292, + 33675876918313385, + 21888242871839275222246405745257275088548364400416034343698083391919148243658, + 21888242871839275222246405745257275088548364400416034343698149707744926044791, + 21888242871839275222246405745257275088548364400416034343698138682841993183726, + 66383471766560849, + 21888242871839275222246405745257275088548364400416034343698137270329459134817, + 104142695310854926, + 81534827419412738, + 21888242871839275222246405745257275088548364400416034343698143094399736045943, + 109494068251115959, + 78698174755058459, + 89828550890703855, + 50524365378888290, + 21888242871839275222246405745257275088548364400416034343698108489542313041939, + 21888242871839275222246405745257275088548364400416034343698085143794473561092, + 21888242871839275222246405745257275088548364400416034343698122921273771011269, + 21888242871839275222246405745257275088548364400416034343698086960798941464079, + 10083472896613467, + 21888242871839275222246405745257275088548364400416034343698161139207360319810, + 7904094466619501, + 112989617686339339, + 21888242871839275222246405745257275088548364400416034343698158472361281617818, + 21888242871839275222246405745257275088548364400416034343698162804811137524577, + 21888242871839275222246405745257275088548364400416034343698203285561082894332, + 43547105058630185, + 6082648714522560, + 12336059121896028, + 21888242871839275222246405745257275088548364400416034343698076434937463339558, + 25781143928656776, + 37845609314408145, + 73364692026371185, + 21888242871839275222246405745257275088548364400416034343698179815341444194320, + 21888242871839275222246405745257275088548364400416034343698122397939398565119, + 68427683859795923, + 105757657979380227, + 21888242871839275222246405745257275088548364400416034343698069854842957610286, + 21888242871839275222246405745257275088548364400416034343698061141255754531708, + 101972142045994396, + 21888242871839275222246405745257275088548364400416034343698150578683705910955, + 21888242871839275222246405745257275088548364400416034343698191129372728213785, + 21888242871839275222246405745257275088548364400416034343698077699207659932621, + 47606968505234199, + 102746772448689363, + 21888242871839275222246405745257275088548364400416034343698093195433547955993, + 21888242871839275222246405745257275088548364400416034343698095853930300406814, + 21888242871839275222246405745257275088548364400416034343698176992016612796935, + 2282250999829261, + 37111485412974991, + 42148486553216989, + 21888242871839275222246405745257275088548364400416034343698178130826118232970, + 137859859341840335, + 84205191159523179, + 21888242871839275222246405745257275088548364400416034343698153977321062165498, + 50602538167284965, + 101425411630586210, + 21888242871839275222246405745257275088548364400416034343698084270481314481596, + 83906247354596038, + 138123162744358393, + 21888242871839275222246405745257275088548364400416034343698166049411797188354, + 78948534317050061, + 94726969542812098, + 115786266965414669, + 21888242871839275222246405745257275088548364400416034343698131188234990416197, + 79623778064565569, + 135985304431900077, + 21888242871839275222246405745257275088548364400416034343698179329946023698420, + 133624104378509160, + 105902379160577040, + 120234051325023503, + 21888242871839275222246405745257275088548364400416034343698161616312000969714, + 21888242871839275222246405745257275088548364400416034343698136217091991216288, + 53024850584686891, + 21888242871839275222246405745257275088548364400416034343698069073950251406825, + 21888242871839275222246405745257275088548364400416034343698144409750662010462, + 23984655367526717, + 21888242871839275222246405745257275088548364400416034343698121290336272464096, + 142092229601790503, + 48801417412897128, + 125158420091178245, + 21888242871839275222246405745257275088548364400416034343698183307491041850701, + 21888242871839275222246405745257275088548364400416034343698098219376318435435, + 95298751392704612, + 127880836193344492, + 21888242871839275222246405745257275088548364400416034343698170345770230282716, + 21888242871839275222246405745257275088548364400416034343698068577845106380684, + 21888242871839275222246405745257275088548364400416034343698137685116097089121, + 21888242871839275222246405745257275088548364400416034343698149919085709749058, + 21888242871839275222246405745257275088548364400416034343698099936998607407946, + 21888242871839275222246405745257275088548364400416034343698125292980207856210, + 21888242871839275222246405745257275088548364400416034343698141050246274983933, + 21888242871839275222246405745257275088548364400416034343698140988307311122906, + 64395518159819807, + 21888242871839275222246405745257275088548364400416034343698087756023260223167, + 21888242871839275222246405745257275088548364400416034343698190698780768233192, + 60726386431584939, + 21888242871839275222246405745257275088548364400416034343698102325538468505145, + 21888242871839275222246405745257275088548364400416034343698117151029267381806, + 21888242871839275222246405745257275088548364400416034343698084802754131098885, + 8971537689578681, + 21888242871839275222246405745257275088548364400416034343698145350755611936799, + 21888242871839275222246405745257275088548364400416034343698151613645083792030, + 21888242871839275222246405745257275088548364400416034343698149222154789645308, + 21888242871839275222246405745257275088548364400416034343698152065667557112805, + 14048896868921410, + 85002223254628659, + 21888242871839275222246405745257275088548364400416034343698069202952252087302, + 21888242871839275222246405745257275088548364400416034343698174480619101194235, + 21888242871839275222246405745257275088548364400416034343698176548479324839200, + 42289695684681683, + 117760119698871559, + 21888242871839275222246405745257275088548364400416034343698145911130138922876, + 21888242871839275222246405745257275088548364400416034343698063278906586277665, + 55860589710040369, + 21888242871839275222246405745257275088548364400416034343698203921993276763423, + 21888242871839275222246405745257275088548364400416034343698148105424787955405, + 21888242871839275222246405745257275088548364400416034343698181020093063339883, + 81418285720963561, + 40361971400112406, + 21888242871839275222246405745257275088548364400416034343698107321893289716050, + 21888242871839275222246405745257275088548364400416034343698089224119764742690, + 21888242871839275222246405745257275088548364400416034343698110279364813272904, + 121704025366494428, + 21888242871839275222246405745257275088548364400416034343698195628152864297703, + 130848590578762418, + 39980790123703020, + 5043883836726702, + 21888242871839275222246405745257275088548364400416034343698165326787485215081, + 19411029928238927, + 110640792171458130, + 21888242871839275222246405745257275088548364400416034343698173703413071459964, + 92107481888549569, + 3182835426321365, + 21888242871839275222246405745257275088548364400416034343698071130893924478579, + 108006962393171159, + 115449856129816641, + 9824633604666895, + 129904997385439769, + 21888242871839275222246405745257275088548364400416034343698063313917436312541, + 21888242871839275222246405745257275088548364400416034343698164144431814508822, + 21888242871839275222246405745257275088548364400416034343698186976150498560434, + 131395039504833310, + 21888242871839275222246405745257275088548364400416034343698168553613965210277, + 9662662765148872, + 21888242871839275222246405745257275088548364400416034343698131943789110558320, + 115315552139014290, + 102247353529485893, + 83096916490556039, + 21888242871839275222246405745257275088548364400416034343698103916126349525279, + 93545167116988779, + 38914820155339493, + 21888242871839275222246405745257275088548364400416034343698089645012380769494, + 104013955367454107, + 21888242871839275222246405745257275088548364400416034343698093589841456041732, + 21888242871839275222246405745257275088548364400416034343698151461123727092344, + 113468833893837520, + 21888242871839275222246405745257275088548364400416034343698080327770689470512, + 125757006341837350, + 21888242871839275222246405745257275088548364400416034343698124989971320852897, + 88224391481173398, + 21888242871839275222246405745257275088548364400416034343698187821090436202717, + 103796362426460522, + 21888242871839275222246405745257275088548364400416034343698202851021481340711, + 6110301558450275, + 143027383901439017, + 21888242871839275222246405745257275088548364400416034343698115406159629192490, + 21888242871839275222246405745257275088548364400416034343698170993962185033910, + 26177590410586645, + 60317521151248201, + 21888242871839275222246405745257275088548364400416034343698145147134453059939, + 55952229859879284, + 21888242871839275222246405745257275088548364400416034343698083582429891995772, + 21888242871839275222246405745257275088548364400416034343698120150023958341243, + 21888242871839275222246405745257275088548364400416034343698071258002598750581, + 21888242871839275222246405745257275088548364400416034343698192038321469897179, + 35654063137914908, + 21888242871839275222246405745257275088548364400416034343698109889446736127908, + 79633299400136467, + 112211231097636959, + 21888242871839275222246405745257275088548364400416034343698155681125373624079, + 21888242871839275222246405745257275088548364400416034343698105236241839001330, + 32316015691864560, + 44330328525438645, + 21888242871839275222246405745257275088548364400416034343698122319533684813386, + 21888242871839275222246405745257275088548364400416034343698151728327337516321, + 21888242871839275222246405745257275088548364400416034343698099429934101322639, + 8137660585635744, + 21888242871839275222246405745257275088548364400416034343698129098482864160789, + 21888242871839275222246405745257275088548364400416034343698068901884108216976, + 113100859181607124, + 21888242871839275222246405745257275088548364400416034343698105673359972119839, + 79332609947915039, + 21888242871839275222246405745257275088548364400416034343698127893871118790306, + 21888242871839275222246405745257275088548364400416034343698129004724775013130, + 21888242871839275222246405745257275088548364400416034343698193579146120517150, + 21888242871839275222246405745257275088548364400416034343698157795759224231211, + 45044595912717569, + 21888242871839275222246405745257275088548364400416034343698080914750546057086, + 21888242871839275222246405745257275088548364400416034343698120836517353451295, + 21888242871839275222246405745257275088548364400416034343698143987898372731482, + 21888242871839275222246405745257275088548364400416034343698086809620612318008, + 139521059066854002, + 48872302079045456, + 21888242871839275222246405745257275088548364400416034343698199178943347226184, + 21888242871839275222246405745257275088548364400416034343698083858140037037026, + 21888242871839275222246405745257275088548364400416034343698144217928831128651, + 21888242871839275222246405745257275088548364400416034343698074461212489326713, + 5128239997340170, + 13268442206566572, + 21888242871839275222246405745257275088548364400416034343698140699991126039539, + 21888242871839275222246405745257275088548364400416034343698108859144462536050, + 105827519515728686, + 21888242871839275222246405745257275088548364400416034343698076638874131157586, + 21888242871839275222246405745257275088548364400416034343698089164870021627763, + 21888242871839275222246405745257275088548364400416034343698177362166099997271, + 64587843012208778, + 21888242871839275222246405745257275088548364400416034343698108417869463166635, + 63910920587582035, + 129100505952620708, + 90962883893791480, + 21888242871839275222246405745257275088548364400416034343698193968301817080805, + 21888242871839275222246405745257275088548364400416034343698107719373773167232, + 12218565767286909, + 81126548795480701, + 126625165046551565, + 65392432297345493, + 132076498331021612, + 21888242871839275222246405745257275088548364400416034343698196694442967593383, + 21888242871839275222246405745257275088548364400416034343698133368664775108621, + 132335215408140841, + 83470345893345268, + 109377951736891882, + 39058472227757532, + 21888242871839275222246405745257275088548364400416034343698173347596785578473, + 60291504907018317, + 21888242871839275222246405745257275088548364400416034343698203014638711418251, + 21888242871839275222246405745257275088548364400416034343698103006590829698848, + 72247801435461275, + 21888242871839275222246405745257275088548364400416034343698126664152617100262, + 21888242871839275222246405745257275088548364400416034343698185129090412295941, + 21888242871839275222246405745257275088548364400416034343698160398631384606262, + 21888242871839275222246405745257275088548364400416034343698151599331053899669, + 80615217196870809, + 36314662944946225, + 21888242871839275222246405745257275088548364400416034343698138962450170906933, + 21888242871839275222246405745257275088548364400416034343698137548048693466985, + 21888242871839275222246405745257275088548364400416034343698157350448441210882, + 21888242871839275222246405745257275088548364400416034343698111224428438994750, + 47989566298020914, + 3019045018626803, + 21888242871839275222246405745257275088548364400416034343698104523206273660680, + 21888242871839275222246405745257275088548364400416034343698090115462384260894, + 21888242871839275222246405745257275088548364400416034343698202889171750374322, + 21888242871839275222246405745257275088548364400416034343698168036708384303858, + 21888242871839275222246405745257275088548364400416034343698146162773911176161, + 21888242871839275222246405745257275088548364400416034343698111341928006450522, + 141776893234826931, + 21888242871839275222246405745257275088548364400416034343698128406219549475650, + 60419340503825716, + 21888242871839275222246405745257275088548364400416034343698131931274285305827, + 21888242871839275222246405745257275088548364400416034343698096422795723462944, + 105507537467122319, + 21888242871839275222246405745257275088548364400416034343698070987949394395019, + 21888242871839275222246405745257275088548364400416034343698073619655147470923, + 17702056885488251, + 21888242871839275222246405745257275088548364400416034343698108137655099351429, + 39027529469006581, + 21888242871839275222246405745257275088548364400416034343698201249041365632860, + 3273775010275070, + 58689503554145743, + 112613685481607680, + 53123634854960055, + 21888242871839275222246405745257275088548364400416034343698159988979370574413, + 21888242871839275222246405745257275088548364400416034343698096068054452901950, + 142228409843146319, + 98160936251817678, + 21888242871839275222246405745257275088548364400416034343698162373223195706409, + 21888242871839275222246405745257275088548364400416034343698073578795414766412, + 107810009616970037, + 35106742261603862, + 21888242871839275222246405745257275088548364400416034343698172648014512776072, + 21888242871839275222246405745257275088548364400416034343698149852977743317554, + 21888242871839275222246405745257275088548364400416034343698148827194504644774, + 21888242871839275222246405745257275088548364400416034343698196753771385465060, + 21888242871839275222246405745257275088548364400416034343698087699604772880869, + 21888242871839275222246405745257275088548364400416034343698151698455354986946, + 21888242871839275222246405745257275088548364400416034343698126690903041264565, + 50983362387776703, + 28574663170883224, + 55413025288047260, + 91400966740242267, + 21888242871839275222246405745257275088548364400416034343698120523083017672771, + 66694025985454308, + 21888242871839275222246405745257275088548364400416034343698101831759826889029, + 21888242871839275222246405745257275088548364400416034343698168896114990846579, + 26657053396659282, + 30000358371924532, + 116267261680768508, + 13161741517269319, + 21888242871839275222246405745257275088548364400416034343698129840464483521057, + 140816316686417111, + 21888242871839275222246405745257275088548364400416034343698137933031671417354, + 13079817531788319, + 22910153343906855, + 21888242871839275222246405745257275088548364400416034343698077734734121345216, + 21888242871839275222246405745257275088548364400416034343698127129204984724877, + 21888242871839275222246405745257275088548364400416034343698158327854297286960, + 21888242871839275222246405745257275088548364400416034343698148620981825352725, + 21888242871839275222246405745257275088548364400416034343698147445288730933299, + 21888242871839275222246405745257275088548364400416034343698066657130594060396, + 83508173559369008, + 71964943062426263, + 56696702790486518, + 21888242871839275222246405745257275088548364400416034343698180960679871680622, + 75654223807419496, + 21888242871839275222246405745257275088548364400416034343698185595444308683976, + 138418018075498015, + 21888242871839275222246405745257275088548364400416034343698109037210302369657, + 21888242871839275222246405745257275088548364400416034343698125747645002258817, + 71925049292824527, + 21888242871839275222246405745257275088548364400416034343698081314958474049609, + 89527247663004644, + 76459652777719739, + 128631035734365337, + 90830208398129591, + 101889797406532425, + 21888242871839275222246405745257275088548364400416034343698170780020487075767, + 140938559654150049, + 21888242871839275222246405745257275088548364400416034343698080386874372237991, + 22597439142815084, + 21888242871839275222246405745257275088548364400416034343698134428864156924561, + 21888242871839275222246405745257275088548364400416034343698067350348937275659, + 26267440306326973, + 85706072515943288, + 21888242871839275222246405745257275088548364400416034343698095012594353986499, + 21888242871839275222246405745257275088548364400416034343698192955270386569063, + 24087152415720296, + 9934744547784630, + 18256228736097026, + 21888242871839275222246405745257275088548364400416034343698071638278899609907, + 21888242871839275222246405745257275088548364400416034343698104772551241591566, + 21888242871839275222246405745257275088548364400416034343698190373895209430922, + 122891513891243337, + 121361762354060453, + 110939903205062583, + 21888242871839275222246405745257275088548364400416034343698146043733041709961, + 21888242871839275222246405745257275088548364400416034343698195545278372618202, + 143121301722866680, + 21888242871839275222246405745257275088548364400416034343698111005455915456834, + 21888242871839275222246405745257275088548364400416034343698062863397958724477, + 17786420108718266, + 97477636032539500, + 21888242871839275222246405745257275088548364400416034343698064070304198034272, + 21888242871839275222246405745257275088548364400416034343698060521104466252791, + 21888242871839275222246405745257275088548364400416034343698094580813813074916, + 21888242871839275222246405745257275088548364400416034343698090420580484927111, + 21888242871839275222246405745257275088548364400416034343698075097685110944552, + 21888242871839275222246405745257275088548364400416034343698083170136597107029, + 21888242871839275222246405745257275088548364400416034343698069846901307528067, + 21888242871839275222246405745257275088548364400416034343698132937525711858181, + 48205089340753513, + 136199498849308264, + 61750350194019884, + 77364363667917487, + 21888242871839275222246405745257275088548364400416034343698147370606233617988, + 21888242871839275222246405745257275088548364400416034343698150162158066205017, + 41729128636722220, + 96843530979859671, + 21888242871839275222246405745257275088548364400416034343698079639148080669795, + 107253495578711273, + 21888242871839275222246405745257275088548364400416034343698141136119320950651, + 27761875333837946, + 138914161688706094, + 21888242871839275222246405745257275088548364400416034343698161703649180144141, + 21888242871839275222246405745257275088548364400416034343698147269963377542178, + 21888242871839275222246405745257275088548364400416034343698102573856341144426, + 21888242871839275222246405745257275088548364400416034343698081547112303137002, + 21888242871839275222246405745257275088548364400416034343698122318827002879191, + 21888242871839275222246405745257275088548364400416034343698145427602475153089, + 21888242871839275222246405745257275088548364400416034343698107998712929849010, + 21888242871839275222246405745257275088548364400416034343698195929128727483192, + 21888242871839275222246405745257275088548364400416034343698161076633690394112, + 21888242871839275222246405745257275088548364400416034343698187025333084040781, + 21888242871839275222246405745257275088548364400416034343698091325380451570320, + 21888242871839275222246405745257275088548364400416034343698166994909033718068, + 4859114274139839, + 21888242871839275222246405745257275088548364400416034343698172600487679246920, + 21888242871839275222246405745257275088548364400416034343698202128672879980059, + 21888242871839275222246405745257275088548364400416034343698152108237896667192, + 21888242871839275222246405745257275088548364400416034343698196826944590107583, + 103966667712976829, + 46069898635436962, + 112276552546294569, + 21888242871839275222246405745257275088548364400416034343698144404207527704102, + 57366438661546870, + 72889820959594597, + 19860778304912820, + 21888242871839275222246405745257275088548364400416034343698102242979655445617, + 21888242871839275222246405745257275088548364400416034343698097101192817466165, + 96702468129113554, + 21888242871839275222246405745257275088548364400416034343698101917539540531480, + 22577541276153170, + 21888242871839275222246405745257275088548364400416034343698095296850322154545, + 21888242871839275222246405745257275088548364400416034343698133019876950270748, + 43778363063472134, + 43678727345071869, + 21888242871839275222246405745257275088548364400416034343698179400975371177081, + 21888242871839275222246405745257275088548364400416034343698123191001060929362, + 25684093525484913, + 21888242871839275222246405745257275088548364400416034343698174917956243371178, + 130742329111262662, + 67524750091600578, + 110688244319878488, + 21888242871839275222246405745257275088548364400416034343698076219020665172826, + 21888242871839275222246405745257275088548364400416034343698074887811258114512, + 50990968683517627, + 21888242871839275222246405745257275088548364400416034343698127032442432682029, + 21888242871839275222246405745257275088548364400416034343698173532656809315992, + 142404275349758275, + 21888242871839275222246405745257275088548364400416034343698085085933745610809, + 33185506753262306, + 99417473918081204, + 21888242871839275222246405745257275088548364400416034343698160653210205816704, + 117558854933612633, + 21888242871839275222246405745257275088548364400416034343698186916474237840315, + 21888242871839275222246405745257275088548364400416034343698073922277859527093, + 21888242871839275222246405745257275088548364400416034343698197533804502855770, + 21888242871839275222246405745257275088548364400416034343698182757624861515101, + 21888242871839275222246405745257275088548364400416034343698137039253905967671, + 21888242871839275222246405745257275088548364400416034343698144199858650439530, + 131141555340082267, + 21888242871839275222246405745257275088548364400416034343698096326934340837829, + 21888242871839275222246405745257275088548364400416034343698087694519232958572, + 118969407985890387, + 21888242871839275222246405745257275088548364400416034343698127237528878341795, + 21888242871839275222246405745257275088548364400416034343698149412898529222989, + 47547738110793907, + 135349868704687102, + 50772203628573079, + 21888242871839275222246405745257275088548364400416034343698200624235945494252, + 93462379428987039, + 1639944426625840, + 120510795275055294, + 54585538185692735, + 43269739380553011, + 117351769499414495, + 39624116347606465, + 21888242871839275222246405745257275088548364400416034343698145128084673238241, + 83678894198811073, + 21888242871839275222246405745257275088548364400416034343698163648912179858237, + 21888242871839275222246405745257275088548364400416034343698118774612983096160, + 91778338482234157, + 116735877520558220, + 21888242871839275222246405745257275088548364400416034343698131795938837059484, + 85094346195952730, + 53831302181918520, + 109736020169838583, + 21888242871839275222246405745257275088548364400416034343698188713531569800682, + 29554505816505289, + 22463578084470937, + 12738717398442615, + 21888242871839275222246405745257275088548364400416034343698125243587441422324, + 21888242871839275222246405745257275088548364400416034343698185377158374662843, + 21888242871839275222246405745257275088548364400416034343698160027631758537158, + 21888242871839275222246405745257275088548364400416034343698137025868404039748, + 21888242871839275222246405745257275088548364400416034343698186247426743674204, + 66220481139181905, + 21888242871839275222246405745257275088548364400416034343698106870999447719094, + 142330222338036170, + 21888242871839275222246405745257275088548364400416034343698115786856376849158, + 21888242871839275222246405745257275088548364400416034343698131879265907349710, + 21888242871839275222246405745257275088548364400416034343698098258943911847115, + 21888242871839275222246405745257275088548364400416034343698082901734818027149, + 101875673846233906, + 21888242871839275222246405745257275088548364400416034343698093901940982546533, + 924566350000330, + 124407119835017981, + 21888242871839275222246405745257275088548364400416034343698088566525657456017, + 77000268691191889, + 40100295370618225, + 129650086153462597, + 99005123732540849, + 21888242871839275222246405745257275088548364400416034343698119804770156980439, + 21888242871839275222246405745257275088548364400416034343698200313236140163425, + 21888242871839275222246405745257275088548364400416034343698077331990030125772, + 21888242871839275222246405745257275088548364400416034343698087837176418621127, + 72485055360359197, + 21888242871839275222246405745257275088548364400416034343698062420642171051788, + 21888242871839275222246405745257275088548364400416034343698095389490536495887, + 100591446503796790, + 3584388795010376, + 21888242871839275222246405745257275088548364400416034343698086411499094411418, + 21888242871839275222246405745257275088548364400416034343698135902947296115422, + 21888242871839275222246405745257275088548364400416034343698174379418999078099, + 21888242871839275222246405745257275088548364400416034343698178300094388107954, + 82569139214359782, + 77453077243532111, + 21888242871839275222246405745257275088548364400416034343698168050680601206649, + 28022057703085760, + 21888242871839275222246405745257275088548364400416034343698072958521659679429, + 21888242871839275222246405745257275088548364400416034343698068902850583021867, + 58679194008003742, + 25245756135062026, + 21888242871839275222246405745257275088548364400416034343698187374398232736759, + 134366856423950457, + 126119951944172630, + 21888242871839275222246405745257275088548364400416034343698117871023122119360, + 21888242871839275222246405745257275088548364400416034343698093336824423683263, + 21888242871839275222246405745257275088548364400416034343698132325240768776168, + 52593528195817593, + 77503844589633914, + 123967723843999007, + 31297411883938962, + 21888242871839275222246405745257275088548364400416034343698072572369076415627, + 133567254746084715, + 43693642375566413, + 22415301638519959, + 27253702331620773, + 7465577479725021, + 5205975976404334, + 71348561759136452, + 21888242871839275222246405745257275088548364400416034343698063142086436043342, + 17422780864040872, + 21888242871839275222246405745257275088548364400416034343698201240693376660971, + 21888242871839275222246405745257275088548364400416034343698151776477726033435, + 21888242871839275222246405745257275088548364400416034343698158303687194804951, + 109401839488461902, + 110531192440424049, + 21888242871839275222246405745257275088548364400416034343698100795532003530739, + 21888242871839275222246405745257275088548364400416034343698127569537034027556, + 21888242871839275222246405745257275088548364400416034343698071255841242426439, + 66080809893843644, + 133866811428307052, + 21888242871839275222246405745257275088548364400416034343698133244522441050668, + 21888242871839275222246405745257275088548364400416034343698105288934564122984, + 21888242871839275222246405745257275088548364400416034343698110858632680508298, + 36583824397248305, + 21888242871839275222246405745257275088548364400416034343698121857959359304989, + 21888242871839275222246405745257275088548364400416034343698177418882233252543, + 57224998181528189, + 21888242871839275222246405745257275088548364400416034343698081457298902039464, + 21888242871839275222246405745257275088548364400416034343698188580642981952159, + 21888242871839275222246405745257275088548364400416034343698130202734383211591, + 21888242871839275222246405745257275088548364400416034343698132605797821827270, + 3996725686559080, + 93036803250580628, + 21888242871839275222246405745257275088548364400416034343698145673135144457259, + 21888242871839275222246405745257275088548364400416034343698146440630049346370, + 21888242871839275222246405745257275088548364400416034343698144726826858769536, + 38421684459112806, + 21888242871839275222246405745257275088548364400416034343698101557953520707909, + 134852002462985420, + 63640784037634207, + 21888242871839275222246405745257275088548364400416034343698078943640971410114, + 21888242871839275222246405745257275088548364400416034343698186014784775445422, + 35493012909848557, + 122625767476207130, + 21888242871839275222246405745257275088548364400416034343698074405336646318216, + 36419793587043245, + 21888242871839275222246405745257275088548364400416034343698092269820840064430, + 140645645735156837, + 59844918198618605, + 23203046121656251, + 21888242871839275222246405745257275088548364400416034343698112258663763674336, + 21888242871839275222246405745257275088548364400416034343698131952039463748548, + 21888242871839275222246405745257275088548364400416034343698127967717470777772, + 21888242871839275222246405745257275088548364400416034343698061731730548331069, + 21888242871839275222246405745257275088548364400416034343698167886065700175902, + 21888242871839275222246405745257275088548364400416034343698065569378645742678, + 21888242871839275222246405745257275088548364400416034343698098507037969194065, + 21888242871839275222246405745257275088548364400416034343698117354473903095739, + 10863755553227012, + 21888242871839275222246405745257275088548364400416034343698076666318962139684, + 93443292920808680, + 21888242871839275222246405745257275088548364400416034343698170032626288493600, + 21888242871839275222246405745257275088548364400416034343698099846657722043135, + 61235336386100031, + 111325593631439480, + 21888242871839275222246405745257275088548364400416034343698078820314967187036, + 21888242871839275222246405745257275088548364400416034343698203847300951762803, + 79405695289517179, + 21888242871839275222246405745257275088548364400416034343698085972456417424737, + 106593874902817943, + 21888242871839275222246405745257275088548364400416034343698154780169151504343, + 20593037374260649, + 21888242871839275222246405745257275088548364400416034343698072359216642050427, + 21888242871839275222246405745257275088548364400416034343698159708968900557058, + 127589174566816358, + 21888242871839275222246405745257275088548364400416034343698126628288430574047, + 21888242871839275222246405745257275088548364400416034343698089251243989626661, + 134488834578145809, + 66544669341471610, + 122147935996497056, + 95217108112576268, + 21888242871839275222246405745257275088548364400416034343698121051253739347778, + 64434263686927445, + 25618395118318318, + 9697531712246530, + 21888242871839275222246405745257275088548364400416034343698151183494245723708, + 38683605775240910, + 14436730681455005, + 37081067902913143, + 26199933897152847, + 95364493903837036, + 21888242871839275222246405745257275088548364400416034343698089179967937643785, + 21888242871839275222246405745257275088548364400416034343698092731498248793955, + 21888242871839275222246405745257275088548364400416034343698182355207387376449, + 11844769878000428, + 21888242871839275222246405745257275088548364400416034343698062178264132681622, + 36823637957579862, + 21888242871839275222246405745257275088548364400416034343698121709278801666501, + 38142764402577461, + 21888242871839275222246405745257275088548364400416034343698198291713094207564, + 131344073126040292, + 21888242871839275222246405745257275088548364400416034343698114690915071063134, + 21888242871839275222246405745257275088548364400416034343698077082099942513978, + 21888242871839275222246405745257275088548364400416034343698101742093644748621, + 113561551264430765, + 88675660719595889, + 21888242871839275222246405745257275088548364400416034343698062504960905575091, + 21888242871839275222246405745257275088548364400416034343698089075458706088127, + 23516556874898606, + 58974823516192938, + 21888242871839275222246405745257275088548364400416034343698176240844466184520, + 21888242871839275222246405745257275088548364400416034343698155405596868194680, + 115472202075169357, + 57826032356583899, + 37010300365291358, + 2839750458448062, + 92907601500259124, + 21888242871839275222246405745257275088548364400416034343698201713527406379266, + 24478754650846737, + 21888242871839275222246405745257275088548364400416034343698169049896628096103, + 57841769690425289, + 21888242871839275222246405745257275088548364400416034343698120827673024777916, + 28456158184945120, + 21888242871839275222246405745257275088548364400416034343698182070295197393694, + 90414658733886442, + 4664070227500985, + 21888242871839275222246405745257275088548364400416034343698092756809500700917, + 19313162836398811, + 21888242871839275222246405745257275088548364400416034343698146741019887686414, + 45393093614160205, + 107989298760714326, + 99704315415816229, + 91094849449901795, + 118063814194041716, + 86395640248608616, + 21888242871839275222246405745257275088548364400416034343698180120907278627182, + 21888242871839275222246405745257275088548364400416034343698100943510642818415, + 123133801417893834, + 21888242871839275222246405745257275088548364400416034343698165161880369964078, + 119253410152687969, + 21888242871839275222246405745257275088548364400416034343698108767989838068071, + 21888242871839275222246405745257275088548364400416034343698117563125107005901, + 3374448192483733, + 67056967892531156, + 21888242871839275222246405745257275088548364400416034343698186109725017486204, + 21888242871839275222246405745257275088548364400416034343698088977223524014054, + 8681265613879862, + 21888242871839275222246405745257275088548364400416034343698156871588259828415, + 21888242871839275222246405745257275088548364400416034343698071602977758534181, + 21888242871839275222246405745257275088548364400416034343698119841372171076118, + 21888242871839275222246405745257275088548364400416034343698131537380637535419, + 21888242871839275222246405745257275088548364400416034343698196989086928522311, + 21888242871839275222246405745257275088548364400416034343698089432023171751891, + 21888242871839275222246405745257275088548364400416034343698143201625279531665, + 21888242871839275222246405745257275088548364400416034343698161302574151331222, + 41104762047193184, + 30800507591877346, + 21888242871839275222246405745257275088548364400416034343698087524511138803355, + 21888242871839275222246405745257275088548364400416034343698102230280482892945, + 21888242871839275222246405745257275088548364400416034343698173801532505320566, + 59279754872930576, + 21888242871839275222246405745257275088548364400416034343698163651045332873828, + 21888242871839275222246405745257275088548364400416034343698114624093308338399, + 21888242871839275222246405745257275088548364400416034343698082019885239386069, + 21888242871839275222246405745257275088548364400416034343698093905426574139284, + 74298980488319835, + 21888242871839275222246405745257275088548364400416034343698070844001577423293, + 21888242871839275222246405745257275088548364400416034343698189724451042799375, + 21888242871839275222246405745257275088548364400416034343698195607101622937858, + 21888242871839275222246405745257275088548364400416034343698176250418687098864, + 77887796049695033, + 57115312365370783, + 21888242871839275222246405745257275088548364400416034343698135590183859478518, + 21888242871839275222246405745257275088548364400416034343698065858486815063450, + 28475998655980481, + 92106925015717843, + 103218590434258555, + 21888242871839275222246405745257275088548364400416034343698146423630704808657, + 111602599368307658, + 21888242871839275222246405745257275088548364400416034343698109038572038082551, + 114402277338469194, + 21888242871839275222246405745257275088548364400416034343698065879591920290081, + 21888242871839275222246405745257275088548364400416034343698061360810032142303, + 29860443137849224, + 75217531180619291, + 21888242871839275222246405745257275088548364400416034343698174975229705642987, + 132411379691100808, + 21888242871839275222246405745257275088548364400416034343698199807957924406932, + 20098439771406855, + 21888242871839275222246405745257275088548364400416034343698067195699079456456, + 98454933884197598, + 21888242871839275222246405745257275088548364400416034343698077487501860142964, + 22662609254817353, + 21888242871839275222246405745257275088548364400416034343698181444976771218669, + 21888242871839275222246405745257275088548364400416034343698094865435160425348, + 21888242871839275222246405745257275088548364400416034343698114981329280029510, + 21888242871839275222246405745257275088548364400416034343698189506327311433691, + 41907018292064645, + 45591585985145973, + 86008663656294725, + 21888242871839275222246405745257275088548364400416034343698150102369746422142, + 122855393064442209, + 21888242871839275222246405745257275088548364400416034343698149640149819667856, + 21888242871839275222246405745257275088548364400416034343698085960272188426347, + 21888242871839275222246405745257275088548364400416034343698134564892948582615, + 128402267620018269, + 21888242871839275222246405745257275088548364400416034343698117489227417323357, + 21888242871839275222246405745257275088548364400416034343698185927366208104736, + 72619023967683239, + 55406666679485946, + 13835965368453056, + 23682868908801575, + 21888242871839275222246405745257275088548364400416034343698097915625526571416, + 52779413801580317, + 21888242871839275222246405745257275088548364400416034343698173989766814812372, + 21888242871839275222246405745257275088548364400416034343698061182858773755712, + 57432724479473105, + 21888242871839275222246405745257275088548364400416034343698138795640965597917, + 46270557855070838, + 140796762950191797, + 21888242871839275222246405745257275088548364400416034343698146476645705209307, + 21888242871839275222246405745257275088548364400416034343698184103098132207559, + 10321477082289706, + 21888242871839275222246405745257275088548364400416034343698163753601288816874, + 21888242871839275222246405745257275088548364400416034343698103156875179747288, + 21888242871839275222246405745257275088548364400416034343698142738434618947713, + 125218221257065603, + 142833197065936077, + 127138676736845956, + 121693105986844432, + 107406428003344723, + 21888242871839275222246405745257275088548364400416034343698139645483799264463, + 18350371209315285, + 21888242871839275222246405745257275088548364400416034343698145751758473357000, + 21888242871839275222246405745257275088548364400416034343698179164019571158597, + 72234213089270386, + 33598035912725358, + 130614909338585477, + 21888242871839275222246405745257275088548364400416034343698103493822419054000, + 21888242871839275222246405745257275088548364400416034343698178669463842954303, + 56709019390605529, + 101626715969272409, + 54129041719896745, + 26325730766000377, + 21888242871839275222246405745257275088548364400416034343698194616464021666216, + 112184229808786715, + 21888242871839275222246405745257275088548364400416034343698134267414950250942, + 21888242871839275222246405745257275088548364400416034343698066196023180421666, + 21888242871839275222246405745257275088548364400416034343698071773763707163616, + 131704983468701380, + 93400480377300814, + 21888242871839275222246405745257275088548364400416034343698171909830756590099, + 21888242871839275222246405745257275088548364400416034343698187672492082570134, + 21888242871839275222246405745257275088548364400416034343698079192009185156658, + 21888242871839275222246405745257275088548364400416034343698066438535053508892, + 21888242871839275222246405745257275088548364400416034343698099443901595562999, + 21888242871839275222246405745257275088548364400416034343698114128233075413181, + 21888242871839275222246405745257275088548364400416034343698161654424994058450, + 21888242871839275222246405745257275088548364400416034343698135879002668680023, + 90346689793205501, + 15265636237615690, + 21888242871839275222246405745257275088548364400416034343698128590569258868334, + 21888242871839275222246405745257275088548364400416034343698176940608366348525, + 28290740116705464, + 132592794007109697, + 68077300619453599, + 101707289242430537, + 21888242871839275222246405745257275088548364400416034343698111153732856789795, + 2407405164104922, + 8089569675559967, + 25191526436306419, + 21888242871839275222246405745257275088548364400416034343698085329812543541915, + 22959351515398407, + 21888242871839275222246405745257275088548364400416034343698142205739840355971, + 21888242871839275222246405745257275088548364400416034343698179023093940157032, + 80993449009357122, + 142990821210644542, + 59563014611669822, + 21888242871839275222246405745257275088548364400416034343698128499501115135752, + 30941644328126471, + 21888242871839275222246405745257275088548364400416034343698083183984395691169, + 143391750077065278, + 94994834056095216, + 89806391107129971, + 84768298985637374, + 82636786493108936, + 21888242871839275222246405745257275088548364400416034343698111718736721660022, + 21888242871839275222246405745257275088548364400416034343698136183580721316895, + 21888242871839275222246405745257275088548364400416034343698120360995231703105, + 21888242871839275222246405745257275088548364400416034343698067845342598031817, + 21888242871839275222246405745257275088548364400416034343698060336832938583613, + 21888242871839275222246405745257275088548364400416034343698133478211972012480, + 29579628639441638, + 21888242871839275222246405745257275088548364400416034343698136809254602005873, + 21888242871839275222246405745257275088548364400416034343698128921504156602199, + 69462439293947877, + 21888242871839275222246405745257275088548364400416034343698063738020917538736, + 35902604451128111, + 21888242871839275222246405745257275088548364400416034343698066369759840022232, + 21888242871839275222246405745257275088548364400416034343698098351041100065956, + 128474880541862127, + 121928792860492143, + 21888242871839275222246405745257275088548364400416034343698204129666700615528, + 4835864242399164, + 75183745969889770, + 99718640495049724, + 21888242871839275222246405745257275088548364400416034343698150705375536166095, + 21888242871839275222246405745257275088548364400416034343698134910185344625350, + 14511422554819074, + 21888242871839275222246405745257275088548364400416034343698124107047218480088, + 21888242871839275222246405745257275088548364400416034343698188045642290811481, + 21888242871839275222246405745257275088548364400416034343698150167209720010101, + 5766313697921048, + 21888242871839275222246405745257275088548364400416034343698182828988369281329, + 21888242871839275222246405745257275088548364400416034343698098405634490808920, + 21888242871839275222246405745257275088548364400416034343698096922303439247266, + 21888242871839275222246405745257275088548364400416034343698133020136536668236, + 21888242871839275222246405745257275088548364400416034343698176439083987400813, + 21888242871839275222246405745257275088548364400416034343698168434379262110131, + 21888242871839275222246405745257275088548364400416034343698139987502865733352, + 79679592359806309, + 21888242871839275222246405745257275088548364400416034343698074799312353788565, + 21888242871839275222246405745257275088548364400416034343698084251519274591625, + 21888242871839275222246405745257275088548364400416034343698162801494912031217, + 21888242871839275222246405745257275088548364400416034343698166983975276036534, + 47592217801771131, + 129857972712985793, + 21888242871839275222246405745257275088548364400416034343698136377456071051551, + 44156539132413379, + 21888242871839275222246405745257275088548364400416034343698175686208486303585, + 61136629490188294, + 56126923372118223, + 47665642336581140, + 84391940929287664, + 18796944633599601, + 48552707994737320, + 21888242871839275222246405745257275088548364400416034343698092912055568322512, + 91324932606659501, + 123636496139349248, + 91262711555730224, + 21888242871839275222246405745257275088548364400416034343698125544271382204494, + 51110686165539112, + 32422624604706951, + 21888242871839275222246405745257275088548364400416034343698089060023506818288, + 73998015745382660, + 21888242871839275222246405745257275088548364400416034343698104102648729734879, + 64811513094258562, + 100403369931822725, + 21888242871839275222246405745257275088548364400416034343698089619387645425972, + 61924588173513803, + 66525319437914957, + 33436597681633372, + 69054296177683763, + 93662951006724659, + 21888242871839275222246405745257275088548364400416034343698077842838561037029, + 21888242871839275222246405745257275088548364400416034343698137879305082875148, + 88958408335298764, + 88223219495212446, + 21888242871839275222246405745257275088548364400416034343698095594455175609800, + 21888242871839275222246405745257275088548364400416034343698067717176935970016, + 21888242871839275222246405745257275088548364400416034343698144527010023156515, + 71284334236947859, + 10869968571267752, + 73996871945759370, + 21888242871839275222246405745257275088548364400416034343698095974801973246699, + 47764101956484948, + 21888242871839275222246405745257275088548364400416034343698164056792003403217, + 5483804966063998, + 21888242871839275222246405745257275088548364400416034343698087886879103380774, + 21888242871839275222246405745257275088548364400416034343698198012749604356089, + 33006340430536802, + 88544785785807164, + 52745885009794995, + 26277424587812830, + 21888242871839275222246405745257275088548364400416034343698171275602303847776, + 68380319827331679, + 106745976040250213, + 21888242871839275222246405745257275088548364400416034343698152534361120573419, + 21888242871839275222246405745257275088548364400416034343698180305989385829850, + 21888242871839275222246405745257275088548364400416034343698097104577602186086, + 21888242871839275222246405745257275088548364400416034343698105756923580589571, + 21888242871839275222246405745257275088548364400416034343698201584825660984904, + 98139955341702165, + 114030806373947336, + 21888242871839275222246405745257275088548364400416034343698122228262612177306, + 21888242871839275222246405745257275088548364400416034343698161025584057017895, + 106183667003176953, + 125161003743405990, + 21888242871839275222246405745257275088548364400416034343698167783230190968351, + 26909346755133214, + 21888242871839275222246405745257275088548364400416034343698178171854255930615, + 21888242871839275222246405745257275088548364400416034343698186700708576912627, + 21888242871839275222246405745257275088548364400416034343698137348532273340808, + 109618840034567890, + 21888242871839275222246405745257275088548364400416034343698098811466496391208, + 21888242871839275222246405745257275088548364400416034343698164266462459611203, + 21888242871839275222246405745257275088548364400416034343698131084795483405255, + 127319612633559585, + 21888242871839275222246405745257275088548364400416034343698168591494233958682, + 37058942376999969, + 21888242871839275222246405745257275088548364400416034343698113389301616768756, + 21888242871839275222246405745257275088548364400416034343698118123595724576731, + 49797832579637328, + 29808462332230592, + 21888242871839275222246405745257275088548364400416034343698114048489706938676, + 21888242871839275222246405745257275088548364400416034343698180324234076873844, + 39961653621902914, + 21888242871839275222246405745257275088548364400416034343698078293661788472524, + 21888242871839275222246405745257275088548364400416034343698202935239631249317, + 21888242871839275222246405745257275088548364400416034343698100939182347038065, + 45893407617930266, + 21888242871839275222246405745257275088548364400416034343698120472334187559397, + 59814193820914616, + 21888242871839275222246405745257275088548364400416034343698156746199285534767, + 117985763480463518, + 110491519486435473, + 76888160983644921, + 122479354113356978, + 21888242871839275222246405745257275088548364400416034343698161770749242729211, + 90883130895228247, + 49719643002343184, + 21888242871839275222246405745257275088548364400416034343698123374340860510665, + 91237604345632588, + 90845246823841408, + 39744240611203418, + 21888242871839275222246405745257275088548364400416034343698198263924710112711, + 137817042155769497, + 21888242871839275222246405745257275088548364400416034343698139294942980741127, + 21888242871839275222246405745257275088548364400416034343698118119736180049280, + 143768597131452790, + 6173294286643554, + 21888242871839275222246405745257275088548364400416034343698148996843829597716, + 95750941689806819, + 11014853638411405, + 99224482255942239, + 21888242871839275222246405745257275088548364400416034343698124821579974666991, + 21888242871839275222246405745257275088548364400416034343698199303553481111802, + 21888242871839275222246405745257275088548364400416034343698187563033261916966, + 53423913125860955, + 96629905425999075, + 138299956391815308, + 40931597261605331, + 75036145730914105, + 21888242871839275222246405745257275088548364400416034343698110194013871861582, + 21888242871839275222246405745257275088548364400416034343698150654153920036632, + 4227702726471278, + 142668125509537635, + 47378183519768864, + 55886171527889463, + 21888242871839275222246405745257275088548364400416034343698070749045664192353, + 19253504424075765, + 21888242871839275222246405745257275088548364400416034343698196981858884618043, + 21888242871839275222246405745257275088548364400416034343698129566100916871561, + 118018651340229464, + 127464757664779409, + 58808149259439354, + 21888242871839275222246405745257275088548364400416034343698189326731436523145, + 21888242871839275222246405745257275088548364400416034343698127823530975268977, + 100818952643218749, + 16103862758787556, + 21888242871839275222246405745257275088548364400416034343698130163779949417823, + 141296002298756419, + 88112365127820554, + 41726278232520261, + 116753055341774407, + 127014898392422233, + 21888242871839275222246405745257275088548364400416034343698091589283788231227, + 21888242871839275222246405745257275088548364400416034343698190787201864430844, + 60458221311048476, + 21888242871839275222246405745257275088548364400416034343698181380516869383190, + 21888242871839275222246405745257275088548364400416034343698166490902648214494, + 125625248064431792, + 67188888182374896, + 26248565488679254, + 107498372271509115, + 97055351077492733, + 21888242871839275222246405745257275088548364400416034343698153736368612772117, + 21888242871839275222246405745257275088548364400416034343698092249380862560267, + 21888242871839275222246405745257275088548364400416034343698117495579144415792, + 15067762110121476, + 119559654561599039, + 96421574089180788, + 21888242871839275222246405745257275088548364400416034343698092803778530950846, + 47537719592363958, + 21888242871839275222246405745257275088548364400416034343698199174435616980431, + 62755819720828956, + 21888242871839275222246405745257275088548364400416034343698199287904930247910, + 21888242871839275222246405745257275088548364400416034343698115401121726331486, + 21888242871839275222246405745257275088548364400416034343698093776784565046659, + 21201321381880366, + 105125040195305446, + 21888242871839275222246405745257275088548364400416034343698064413437892128109, + 119521623649748751, + 21888242871839275222246405745257275088548364400416034343698159021454981259342, + 21888242871839275222246405745257275088548364400416034343698085087783029376880, + 21888242871839275222246405745257275088548364400416034343698102333803008998023, + 114810258099587312, + 21888242871839275222246405745257275088548364400416034343698074508741379127073, + 21888242871839275222246405745257275088548364400416034343698154772903612767563, + 12288735553578182, + 21888242871839275222246405745257275088548364400416034343698109202288297910361, + 92806033113431918, + 55265994877920421, + 21888242871839275222246405745257275088548364400416034343698172356313854479463, + 117462482662752159, + 21888242871839275222246405745257275088548364400416034343698155626832686076971, + 35221089286618696, + 38557395745320141, + 122296616936491967, + 99894531856452837, + 21888242871839275222246405745257275088548364400416034343698142072636408555743, + 92595052104994004, + 21888242871839275222246405745257275088548364400416034343698119820744122396209, + 21888242871839275222246405745257275088548364400416034343698202935227051994700, + 126857450613678957, + 129763957565505712, + 21888242871839275222246405745257275088548364400416034343698201218685298198379, + 21888242871839275222246405745257275088548364400416034343698084862091745144447, + 21888242871839275222246405745257275088548364400416034343698060343873493036473, + 21888242871839275222246405745257275088548364400416034343698145284854258278253, + 21888242871839275222246405745257275088548364400416034343698152358054062439621, + 26135450617399412, + 11809801811390978, + 137969278364683313, + 83804787573621692, + 21888242871839275222246405745257275088548364400416034343698087443345597087756, + 21888242871839275222246405745257275088548364400416034343698184423956711607729, + 108342488520183955, + 21888242871839275222246405745257275088548364400416034343698116606212132700815, + 79618127471947259, + 84256254050021834, + 63433487494047187, + 41045320511835229, + 21888242871839275222246405745257275088548364400416034343698127039359936426916, + 21888242871839275222246405745257275088548364400416034343698129911317413903041, + 91671439970274029, + 120636644081092317, + 21888242871839275222246405745257275088548364400416034343698137862559159452356, + 5329257805843633, + 21888242871839275222246405745257275088548364400416034343698172582521690314992, + 58484246216804897, + 21888242871839275222246405745257275088548364400416034343698111558834845300540, + 21888242871839275222246405745257275088548364400416034343698148672247470516085, + 93718317521117195, + 21888242871839275222246405745257275088548364400416034343698074086513861106900, + 21888242871839275222246405745257275088548364400416034343698092667080699172575, + 21888242871839275222246405745257275088548364400416034343698201866993023099256, + 9257193661471821, + 31533061794937246, + 21888242871839275222246405745257275088548364400416034343698197482033288328168, + 21888242871839275222246405745257275088548364400416034343698161750873210688148, + 87597990099600122, + 43853814361032791, + 135186414287726698, + 21888242871839275222246405745257275088548364400416034343698087187071828118597, + 142883962910461040, + 142736796464481769, + 21888242871839275222246405745257275088548364400416034343698065544520428224118, + 48604958331752257, + 21888242871839275222246405745257275088548364400416034343698118105616578240119, + 21888242871839275222246405745257275088548364400416034343698094662866378834999, + 21888242871839275222246405745257275088548364400416034343698100669989756492972, + 64746103593656641, + 128510154233476584, + 21888242871839275222246405745257275088548364400416034343698065304272407036753, + 137685699417933861, + 21888242871839275222246405745257275088548364400416034343698175193416188231682, + 21888242871839275222246405745257275088548364400416034343698081400522822965881, + 21888242871839275222246405745257275088548364400416034343698167287795083745668, + 58413518878468860, + 98312976647724451, + 108348540962920709, + 26992857309937703, + 21888242871839275222246405745257275088548364400416034343698162093486476178233, + 126999215999008993, + 21888242871839275222246405745257275088548364400416034343698137169134934261939, + 21888242871839275222246405745257275088548364400416034343698091769679396727993, + 21888242871839275222246405745257275088548364400416034343698153690074937920920, + 27668576771761461, + 95235533781941773, + 21888242871839275222246405745257275088548364400416034343698119341079806663019, + 60505081216009218, + 21888242871839275222246405745257275088548364400416034343698169537974549371692, + 21888242871839275222246405745257275088548364400416034343698135366197482996118, + 97252169466647479, + 79071037654333457, + 21698652315837390, + 21888242871839275222246405745257275088548364400416034343698085762410526288541, + 21888242871839275222246405745257275088548364400416034343698161857944744007521, + 21888242871839275222246405745257275088548364400416034343698129556033922168440, + 21888242871839275222246405745257275088548364400416034343698137368477512500192, + 21888242871839275222246405745257275088548364400416034343698071177962997703059, + 21888242871839275222246405745257275088548364400416034343698068206186637837293, + 21888242871839275222246405745257275088548364400416034343698073075087057730163, + 21888242871839275222246405745257275088548364400416034343698073635840410146494, + 36440296944554581, + 83641595330765011, + 55281517666119571, + 90760158820306552, + 21888242871839275222246405745257275088548364400416034343698142861832323325838, + 144109843463503040, + 132390971706232637, + 21888242871839275222246405745257275088548364400416034343698130918796467395830, + 21888242871839275222246405745257275088548364400416034343698086801566794416864, + 42548158315516860, + 21888242871839275222246405745257275088548364400416034343698142230718110096966, + 21888242871839275222246405745257275088548364400416034343698149772904192882871, + 21888242871839275222246405745257275088548364400416034343698088356729441464370, + 21888242871839275222246405745257275088548364400416034343698114553919057101579, + 101966842810191061, + 21888242871839275222246405745257275088548364400416034343698123885559386623848, + 21888242871839275222246405745257275088548364400416034343698124234850568847988, + 21888242871839275222246405745257275088548364400416034343698124342710343673063, + 141357297516757695, + 21888242871839275222246405745257275088548364400416034343698184201268185348586, + 21888242871839275222246405745257275088548364400416034343698092207765280174146, + 21888242871839275222246405745257275088548364400416034343698107215357604162074, + 62045985651430333, + 21888242871839275222246405745257275088548364400416034343698186928325847552643, + 50909986152105514, + 21888242871839275222246405745257275088548364400416034343698122525463664338976, + 21888242871839275222246405745257275088548364400416034343698100821053825927044, + 21888242871839275222246405745257275088548364400416034343698166365989145075062, + 21888242871839275222246405745257275088548364400416034343698153351525174558449, + 64049848381242650, + 21888242871839275222246405745257275088548364400416034343698074538235922113331, + 95981356055968844, + 34528273186316600, + 99765296985747414, + 81202231382550245, + 122354386169448061, + 5087119508061006, + 127050181430833486, + 132162402825607200, + 43713930933467886, + 47339958988331698, + 21888242871839275222246405745257275088548364400416034343698066196700018776545, + 21888242871839275222246405745257275088548364400416034343698154533422036325183, + 61145908480337204, + 21888242871839275222246405745257275088548364400416034343698071168969734426417, + 47317154465873530, + 21888242871839275222246405745257275088548364400416034343698179178901941246199, + 21888242871839275222246405745257275088548364400416034343698084980444034956093, + 21888242871839275222246405745257275088548364400416034343698085308883689147134, + 29153353817344567, + 21888242871839275222246405745257275088548364400416034343698149177294395745511, + 21888242871839275222246405745257275088548364400416034343698187594438085793631, + 21888242871839275222246405745257275088548364400416034343698152168659305659261, + 125128051703145975, + 21888242871839275222246405745257275088548364400416034343698148047093764420559, + 99240292851760647, + 21888242871839275222246405745257275088548364400416034343698169960492002673124, + 84314566914298170, + 21888242871839275222246405745257275088548364400416034343698180390831855401825, + 21888242871839275222246405745257275088548364400416034343698118222495015565830, + 55534602065445536, + 32117944657521775, + 49316809804266123, + 21888242871839275222246405745257275088548364400416034343698193661170395152605, + 20602519223791308, + 124706642262932411, + 21888242871839275222246405745257275088548364400416034343698101195000078501438, + 21888242871839275222246405745257275088548364400416034343698098089132762024379, + 110494994695867330, + 25427864621502218, + 12178790148163852, + 51751346467037703, + 21888242871839275222246405745257275088548364400416034343698060766534960165669, + 114214122025520656, + 21888242871839275222246405745257275088548364400416034343698157507190038052140, + 89246704471215045, + 21888242871839275222246405745257275088548364400416034343698097627555719702271, + 21888242871839275222246405745257275088548364400416034343698109739954494549362, + 21888242871839275222246405745257275088548364400416034343698172687370476661162, + 122202160142620255, + 21888242871839275222246405745257275088548364400416034343698102211271758506021, + 21888242871839275222246405745257275088548364400416034343698172788880161388417, + 97821654979465042, + 21888242871839275222246405745257275088548364400416034343698101166170024463994, + 69331065420103481, + 21888242871839275222246405745257275088548364400416034343698081373007708552584, + 21888242871839275222246405745257275088548364400416034343698113551910080434870, + 21888242871839275222246405745257275088548364400416034343698081048117191445226, + 140314769972956153, + 50758694303886691, + 138831520542293943, + 91756860560204454, + 21888242871839275222246405745257275088548364400416034343698148078838491292568, + 22074566446579590, + 21888242871839275222246405745257275088548364400416034343698169741411985094422, + 36276503925326362, + 21888242871839275222246405745257275088548364400416034343698136819407482200647, + 21888242871839275222246405745257275088548364400416034343698199109061108436594, + 21888242871839275222246405745257275088548364400416034343698111915468169134438, + 54130444214568334, + 21888242871839275222246405745257275088548364400416034343698125564742702978563, + 122626434083945508, + 11863471875051340, + 21888242871839275222246405745257275088548364400416034343698145328362173028607, + 21888242871839275222246405745257275088548364400416034343698086889630061933402, + 83262671175785699, + 21888242871839275222246405745257275088548364400416034343698109627036883429297, + 21888242871839275222246405745257275088548364400416034343698070294611740646562, + 21888242871839275222246405745257275088548364400416034343698104686646005688857, + 21888242871839275222246405745257275088548364400416034343698134004261074640488, + 21888242871839275222246405745257275088548364400416034343698173384064379790252, + 21888242871839275222246405745257275088548364400416034343698107953846847910510, + 21888242871839275222246405745257275088548364400416034343698094587522291569002, + 21888242871839275222246405745257275088548364400416034343698079858872792823837, + 117476685818520234, + 22617791493952810, + 21888242871839275222246405745257275088548364400416034343698082339356849008866, + 92020377452816467, + 90010951563594318, + 21888242871839275222246405745257275088548364400416034343698124309145047473762, + 32535352515789718, + 21888242871839275222246405745257275088548364400416034343698105187251967563961, + 107420576873743746, + 29267494933640222, + 69978293022273742, + 21888242871839275222246405745257275088548364400416034343698184566767752250054, + 21888242871839275222246405745257275088548364400416034343698124309354261265154, + 21888242871839275222246405745257275088548364400416034343698198365648075505326, + 23138835031617271, + 21888242871839275222246405745257275088548364400416034343698115825176102949147, + 21888242871839275222246405745257275088548364400416034343698063241269079452054, + 21888242871839275222246405745257275088548364400416034343698174153668698780130, + 4644580332103188, + 83227450456999874, + 21888242871839275222246405745257275088548364400416034343698157574003261844551, + 32816692767181892, + 91979090182653727, + 2583345812877206, + 85332745074312869, + 21888242871839275222246405745257275088548364400416034343698085156605325506203, + 21888242871839275222246405745257275088548364400416034343698095492552131490123, + 130288503064395412, + 21888242871839275222246405745257275088548364400416034343698197829317626637822, + 21888242871839275222246405745257275088548364400416034343698070614557519940332, + 21888242871839275222246405745257275088548364400416034343698096545831607148963, + 21888242871839275222246405745257275088548364400416034343698087461065716932386, + 141004462192882573, + 17076114546086233, + 21888242871839275222246405745257275088548364400416034343698117321936012993209, + 117547094004833538, + 21888242871839275222246405745257275088548364400416034343698084657482578874092, + 21888242871839275222246405745257275088548364400416034343698126761579454884211, + 26271036913450019, + 66696859767682199, + 21888242871839275222246405745257275088548364400416034343698068407307070543463, + 103261987648602287, + 76832526929925279, + 8271024537461031, + 21888242871839275222246405745257275088548364400416034343698087498640408919385, + 21888242871839275222246405745257275088548364400416034343698116163049647693529, + 21888242871839275222246405745257275088548364400416034343698062534136447270418, + 21888242871839275222246405745257275088548364400416034343698103881391906280336, + 6283670220858510, + 14344921139902099, + 21888242871839275222246405745257275088548364400416034343698113332892514036968, + 94923190000854847, + 140997927939230648, + 21888242871839275222246405745257275088548364400416034343698145440941948153110, + 82454346632711281, + 21888242871839275222246405745257275088548364400416034343698074380337934873985, + 21888242871839275222246405745257275088548364400416034343698166961726550279837, + 21888242871839275222246405745257275088548364400416034343698101524998665018092, + 98673787259291052, + 141438755698397167, + 21888242871839275222246405745257275088548364400416034343698168903933594560798, + 21888242871839275222246405745257275088548364400416034343698179081433311367385, + 115889995501729843, + 142652789863801720, + 21888242871839275222246405745257275088548364400416034343698154516642197960472, + 33363396196112729, + 21888242871839275222246405745257275088548364400416034343698175991113261692139, + 6926588359973175, + 116659988227958252, + 116324985325585455, + 21888242871839275222246405745257275088548364400416034343698080635874088623869, + 119672905625284442, + 78016674342531855, + 42599548766850912, + 21888242871839275222246405745257275088548364400416034343698171445490432713210, + 72969976909347361, + 21888242871839275222246405745257275088548364400416034343698071260975875797852, + 73543943854552170, + 101836992501001164, + 13404037491086092, + 21888242871839275222246405745257275088548364400416034343698064836865000872362, + 21888242871839275222246405745257275088548364400416034343698108828700529183715, + 96948244787785563, + 21888242871839275222246405745257275088548364400416034343698122275687088721058, + 21888242871839275222246405745257275088548364400416034343698137050938366033172, + 117770688481165050, + 108641018660791933, + 66339526548549323, + 21888242871839275222246405745257275088548364400416034343698077503368504814568, + 85156965599068921, + 8074804885998435, + 21888242871839275222246405745257275088548364400416034343698123369672569949729, + 21888242871839275222246405745257275088548364400416034343698061584366124830018, + 132612510831269419, + 105763222201209031, + 21888242871839275222246405745257275088548364400416034343698064306005079622141, + 21888242871839275222246405745257275088548364400416034343698172756940901112190, + 21888242871839275222246405745257275088548364400416034343698093513200612412349, + 43142650324166527, + 135164250600093020, + 21888242871839275222246405745257275088548364400416034343698090998270753577828, + 21888242871839275222246405745257275088548364400416034343698144137855330197593, + 119543671438621507, + 72791042024325084, + 21888242871839275222246405745257275088548364400416034343698143274373572473145, + 109563644087220112, + 69079053636391502, + 21888242871839275222246405745257275088548364400416034343698116122323263681210, + 21888242871839275222246405745257275088548364400416034343698175357658895580094, + 87060278478299919, + 49169582840181723, + 50367147019760196, + 98656434869351209, + 21888242871839275222246405745257275088548364400416034343698179208285824616400, + 21888242871839275222246405745257275088548364400416034343698154141240348500037, + 21888242871839275222246405745257275088548364400416034343698114328988364524572, + 90377655972242546, + 125901964564826727, + 21888242871839275222246405745257275088548364400416034343698106290458411383958, + 85236926458478279, + 105795567176249550, + 92625265748661089, + 6956131849558516, + 21888242871839275222246405745257275088548364400416034343698159716345112543144, + 21888242871839275222246405745257275088548364400416034343698193773986524646568, + 21888242871839275222246405745257275088548364400416034343698123886822867066210, + 21888242871839275222246405745257275088548364400416034343698135481458258145331, + 112382889697200984, + 21888242871839275222246405745257275088548364400416034343698159855927847179090, + 21888242871839275222246405745257275088548364400416034343698118536430421409169, + 21888242871839275222246405745257275088548364400416034343698121543804196419119, + 21888242871839275222246405745257275088548364400416034343698176583659323258766, + 121916780786904091, + 73438280559639180, + 21888242871839275222246405745257275088548364400416034343698165232517449968691, + 11251410316475580, + 21888242871839275222246405745257275088548364400416034343698087215849421917055, + 100402858898202344, + 33035073653474497, + 60297417954877455, + 21888242871839275222246405745257275088548364400416034343698087835197220755135, + 79866525527265327, + 21888242871839275222246405745257275088548364400416034343698164802244351772987, + 87542387903347502, + 94265130930459818, + 21888242871839275222246405745257275088548364400416034343698200451612625803415, + 21888242871839275222246405745257275088548364400416034343698094426153289141109, + 53392237705126096, + 71918915727553586, + 21888242871839275222246405745257275088548364400416034343698121317854625757546, + 21888242871839275222246405745257275088548364400416034343698135690358499081212, + 21888242871839275222246405745257275088548364400416034343698160649384095422635, + 21888242871839275222246405745257275088548364400416034343698134071177004000584, + 44041933676751646, + 21888242871839275222246405745257275088548364400416034343698126130563265540473, + 21888242871839275222246405745257275088548364400416034343698120324692504636063, + 21888242871839275222246405745257275088548364400416034343698169796604230346697, + 24969831635770376, + 21888242871839275222246405745257275088548364400416034343698093666221791210933, + 77797370895682323, + 21888242871839275222246405745257275088548364400416034343698074210821903042034, + 21888242871839275222246405745257275088548364400416034343698144935309304365547, + 21888242871839275222246405745257275088548364400416034343698200029475677046964, + 93331365163678163, + 21888242871839275222246405745257275088548364400416034343698175169398192098501, + 21888242871839275222246405745257275088548364400416034343698182500249634798861, + 28940950843686173, + 129142050610140073, + 21888242871839275222246405745257275088548364400416034343698073185934802438142, + 141474336887922388, + 21888242871839275222246405745257275088548364400416034343698185372112499630426, + 21888242871839275222246405745257275088548364400416034343698091383287300891790, + 105475478348097287, + 21888242871839275222246405745257275088548364400416034343698128542939093977157, + 139453842365523870, + 110158463874958085, + 21888242871839275222246405745257275088548364400416034343698115632075352165010, + 21888242871839275222246405745257275088548364400416034343698066016425061752901, + 31874054173117382, + 95715229147232106, + 135274188905401985, + 21888242871839275222246405745257275088548364400416034343698087523585940555373, + 21888242871839275222246405745257275088548364400416034343698136815075143436110, + 121415066009628007, + 7226326937426306, + 127570395401382775, + 84082178012622640, + 73723035593471603, + 73737799737963542, + 21888242871839275222246405745257275088548364400416034343698122580857353309439, + 142981379095585142, + 113394284335124739, + 47545550328147871, + 21888242871839275222246405745257275088548364400416034343698074244476225077747, + 40996782024921150, + 17960010541444290, + 78218863675526585, + 21888242871839275222246405745257275088548364400416034343698089397345846739126, + 29897073479643182, + 104578502543875684, + 62639069910380695, + 21888242871839275222246405745257275088548364400416034343698186750184883448177, + 21888242871839275222246405745257275088548364400416034343698093774001825725548, + 9716649886536302, + 87089525364397437, + 109251485857558065, + 21888242871839275222246405745257275088548364400416034343698181914480736007631, + 94853504653190795, + 21888242871839275222246405745257275088548364400416034343698160315461702589956, + 21888242871839275222246405745257275088548364400416034343698137246708112407474, + 136423234170571603, + 21888242871839275222246405745257275088548364400416034343698148424688220578969, + 127055149098010358, + 21888242871839275222246405745257275088548364400416034343698175737513350945712, + 21888242871839275222246405745257275088548364400416034343698150044795114448506, + 46526683519427878, + 21888242871839275222246405745257275088548364400416034343698069007488495549912, + 21888242871839275222246405745257275088548364400416034343698102511292339971708, + 12525445740933823, + 46535651384552173, + 134131061213594016, + 21888242871839275222246405745257275088548364400416034343698169547214711292628, + 129249453271132424, + 21888242871839275222246405745257275088548364400416034343698181022401789930561, + 25717781246777172, + 21888242871839275222246405745257275088548364400416034343698106466681434455645, + 21888242871839275222246405745257275088548364400416034343698125430001067780992, + 21888242871839275222246405745257275088548364400416034343698072229685864925617, + 29423709584724736, + 51997992401397326, + 87969142220259749, + 21888242871839275222246405745257275088548364400416034343698071918427325448145, + 140797331220878819, + 105279737909482578, + 19708452597038099, + 21888242871839275222246405745257275088548364400416034343698147441329705539767, + 21888242871839275222246405745257275088548364400416034343698154777467385875532, + 77656150832686077, + 81649071839975886, + 91780983492879897, + 21888242871839275222246405745257275088548364400416034343698064756867234334070, + 21888242871839275222246405745257275088548364400416034343698185949307855833851, + 21888242871839275222246405745257275088548364400416034343698085376388703732287, + 21888242871839275222246405745257275088548364400416034343698173554067845954179, + 21888242871839275222246405745257275088548364400416034343698112990920621433366, + 31848914525012947, + 22308294801688035, + 59256333713786083, + 73181951890984033, + 21888242871839275222246405745257275088548364400416034343698074219344455461355, + 21888242871839275222246405745257275088548364400416034343698179271566624876697, + 21888242871839275222246405745257275088548364400416034343698139920245792031207, + 109832289797709367, + 21888242871839275222246405745257275088548364400416034343698149601920720631810, + 21888242871839275222246405745257275088548364400416034343698195832838309381042, + 124511272710180279, + 116815905700148493, + 21888242871839275222246405745257275088548364400416034343698171263654729865334, + 21888242871839275222246405745257275088548364400416034343698142182009269594621, + 14144938097266959, + 21888242871839275222246405745257275088548364400416034343698115932837125286472, + 21888242871839275222246405745257275088548364400416034343698149493858958277500, + 109013759612176097, + 21888242871839275222246405745257275088548364400416034343698144825465385493472, + 21888242871839275222246405745257275088548364400416034343698182173418221119207, + 21888242871839275222246405745257275088548364400416034343698119788233388912620, + 21888242871839275222246405745257275088548364400416034343698196274341366607496, + 21888242871839275222246405745257275088548364400416034343698152246258220452663, + 21888242871839275222246405745257275088548364400416034343698168105220190243490, + 88183263774558497, + 21888242871839275222246405745257275088548364400416034343698177931382225376375, + 25642513397001799, + 76110785121020167, + 27543172936027015, + 73072959974305063, + 21888242871839275222246405745257275088548364400416034343698125949740483273025, + 81099828390494371, + 21888242871839275222246405745257275088548364400416034343698132319395319309874, + 21888242871839275222246405745257275088548364400416034343698145220957371980896, + 21888242871839275222246405745257275088548364400416034343698089346178498330643, + 21888242871839275222246405745257275088548364400416034343698072061197722310678, + 109757017755257106, + 21888242871839275222246405745257275088548364400416034343698068019930557343417, + 21888242871839275222246405745257275088548364400416034343698169369849967189074, + 21888242871839275222246405745257275088548364400416034343698149525725477263608, + 21888242871839275222246405745257275088548364400416034343698103998994980901861, + 21888242871839275222246405745257275088548364400416034343698136543863778322156, + 21888242871839275222246405745257275088548364400416034343698099954392103767680, + 52279037822002804, + 114068587098745808, + 112847817437411689, + 21888242871839275222246405745257275088548364400416034343698093408113806626960, + 86584320154061177, + 133393367391751907, + 21888242871839275222246405745257275088548364400416034343698199186746846114429, + 116144062222067337, + 110809920645878160, + 76708904344538679, + 21888242871839275222246405745257275088548364400416034343698096729098804349392, + 17147124183814567, + 21888242871839275222246405745257275088548364400416034343698077900349482037090, + 21888242871839275222246405745257275088548364400416034343698106211795808364650, + 21888242871839275222246405745257275088548364400416034343698202812791804551550, + 8745898112890336, + 17337350022087679, + 21888242871839275222246405745257275088548364400416034343698103814417682998282, + 117023805847674891, + 106457140222200065, + 27760273369680465, + 130158632253494846, + 21888242871839275222246405745257275088548364400416034343698130648308685558193, + 21888242871839275222246405745257275088548364400416034343698084545181466628547, + 21888242871839275222246405745257275088548364400416034343698140567863732707132, + 127396434879223764, + 21888242871839275222246405745257275088548364400416034343698118850556860024022, + 121594632187328456, + 21888242871839275222246405745257275088548364400416034343698080255730210238138, + 21888242871839275222246405745257275088548364400416034343698188171121164799046, + 39150986111868549, + 21888242871839275222246405745257275088548364400416034343698075540383997617024, + 21888242871839275222246405745257275088548364400416034343698145705589030486228, + 21888242871839275222246405745257275088548364400416034343698085164645861724092, + 51989345992409885, + 21888242871839275222246405745257275088548364400416034343698087596662447593486, + 130636091753801876, + 21888242871839275222246405745257275088548364400416034343698130673415098497776, + 21888242871839275222246405745257275088548364400416034343698095433447654789722, + 52636753047119052, + 38154967675686617, + 21888242871839275222246405745257275088548364400416034343698195139033546850531, + 92216568718344335, + 127892849853279604, + 74801948692847282, + 16824352958181554, + 21888242871839275222246405745257275088548364400416034343698180603257509114882, + 21888242871839275222246405745257275088548364400416034343698123213830955594071, + 11076298299490126, + 120400976541722461, + 106844835008951317, + 105397289413247409, + 119996929315482473, + 21888242871839275222246405745257275088548364400416034343698128577018866819705, + 21888242871839275222246405745257275088548364400416034343698170099376863227277, + 429791035644956, + 21888242871839275222246405745257275088548364400416034343698117058863601584662, + 134206248552185844, + 21888242871839275222246405745257275088548364400416034343698063193418198961215, + 103916465763542951, + 16263643012302790, + 15534109154813644, + 74044536073272918, + 29397213612227654, + 94323159490781135, + 69720420040553857, + 106069244269608608, + 21888242871839275222246405745257275088548364400416034343698141855957898067380, + 21888242871839275222246405745257275088548364400416034343698063413448747448013, + 33976085412640438, + 112631870917918180, + 78674484313131152, + 21888242871839275222246405745257275088548364400416034343698182350213491789528, + 21888242871839275222246405745257275088548364400416034343698175171233350833200, + 21888242871839275222246405745257275088548364400416034343698129819916528927385, + 21888242871839275222246405745257275088548364400416034343698143252305002665102, + 21888242871839275222246405745257275088548364400416034343698070281255462125922, + 21888242871839275222246405745257275088548364400416034343698170564101663929462, + 41962154215802848, + 23247141644278235, + 82189505444834632, + 21888242871839275222246405745257275088548364400416034343698063251311183893834, + 134522837619868994, + 130945678731609206, + 21888242871839275222246405745257275088548364400416034343698096319023636866964, + 21888242871839275222246405745257275088548364400416034343698192981755377787111, + 10353804926141183, + 21888242871839275222246405745257275088548364400416034343698101760566927282426, + 21888242871839275222246405745257275088548364400416034343698093278761322180017, + 50765196648685963, + 21888242871839275222246405745257275088548364400416034343698062085360113660061, + 112023182806671614, + 21888242871839275222246405745257275088548364400416034343698183457741666322123, + 21888242871839275222246405745257275088548364400416034343698175763589034938280, + 40635742671036151, + 70400698496077, + 21888242871839275222246405745257275088548364400416034343698128106195665921107, + 21888242871839275222246405745257275088548364400416034343698165778179706008844, + 21888242871839275222246405745257275088548364400416034343698202194997815105705, + 21888242871839275222246405745257275088548364400416034343698139386173517444093, + 21888242871839275222246405745257275088548364400416034343698063993316426910434, + 66260561812689494, + 101063733540417294, + 84270623031068797, + 21888242871839275222246405745257275088548364400416034343698110399595103268760, + 141394081436305179, + 21888242871839275222246405745257275088548364400416034343698191708881339698978, + 21888242871839275222246405745257275088548364400416034343698092907718075357857, + 54183599023174328, + 28031194683397933, + 21888242871839275222246405745257275088548364400416034343698182609765813496622, + 21888242871839275222246405745257275088548364400416034343698170173027623425948, + 61923850127794831, + 21888242871839275222246405745257275088548364400416034343698083255526491880682, + 127020714587755627, + 125532991145617146, + 18945195571635365, + 21888242871839275222246405745257275088548364400416034343698101546569534526480, + 122115778502472052, + 126582354340914274, + 103548118921356161, + 21888242871839275222246405745257275088548364400416034343698157096714720338737, + 30454828332761366, + 71567163373728782, + 15318179232789883, + 62375903725973179, + 21888242871839275222246405745257275088548364400416034343698177376888578731818, + 104011055214063390, + 110458549357450122, + 24866066797455045, + 22014053001374929, + 129068530058246046, + 21888242871839275222246405745257275088548364400416034343698088282347006426640, + 2523330086506724, + 21888242871839275222246405745257275088548364400416034343698203901681200705609, + 116385170991056207, + 25483073533364590, + 21888242871839275222246405745257275088548364400416034343698137868217091095770, + 55923554927812085, + 21888242871839275222246405745257275088548364400416034343698159022763155748269, + 111669457050935205, + 116263782068245919, + 95684732688419321, + 88277974252518162, + 52293619658466330, + 101810352256133964, + 119787330714293054, + 81775298643871324, + 21888242871839275222246405745257275088548364400416034343698065433198738894699, + 21888242871839275222246405745257275088548364400416034343698189638501538518505, + 21888242871839275222246405745257275088548364400416034343698082973820670368956, + 21888242871839275222246405745257275088548364400416034343698097339160149482417, + 140577718873363279, + 21888242871839275222246405745257275088548364400416034343698154019652099537312, + 21888242871839275222246405745257275088548364400416034343698157487090262277801, + 21888242871839275222246405745257275088548364400416034343698133182136539884123, + 62051909412453360, + 117713169714205997, + 2911635154520756, + 21888242871839275222246405745257275088548364400416034343698081956780526335588, + 21888242871839275222246405745257275088548364400416034343698125833305937773764, + 3218514060904846, + 21888242871839275222246405745257275088548364400416034343698203609966249478027, + 611140283499225, + 45633296701622451, + 24725012108189139, + 21888242871839275222246405745257275088548364400416034343698162098691075086842, + 75391880996199211, + 86612874773251524, + 21888242871839275222246405745257275088548364400416034343698087725968035304092, + 21888242871839275222246405745257275088548364400416034343698112142547787081553, + 80362193005421165, + 21888242871839275222246405745257275088548364400416034343698194809540088847954, + 42282824315725831, + 21888242871839275222246405745257275088548364400416034343698164286468848888246, + 21888242871839275222246405745257275088548364400416034343698063106841057332332, + 21888242871839275222246405745257275088548364400416034343698150762753328322517, + 21888242871839275222246405745257275088548364400416034343698080693542047880800, + 61503063385308477, + 21888242871839275222246405745257275088548364400416034343698182978690483963899, + 21888242871839275222246405745257275088548364400416034343698149964070564668218, + 119688954588077690, + 88699322514935821, + 47369456451843802, + 21888242871839275222246405745257275088548364400416034343698077825873449795599, + 6226380997932096, + 90771192807882371, + 21888242871839275222246405745257275088548364400416034343698157028254121067115, + 48016863184423497, + 21888242871839275222246405745257275088548364400416034343698203828707576384571, + 127688064732835497, + 21888242871839275222246405745257275088548364400416034343698185346788559002424, + 63442384187583756, + 21888242871839275222246405745257275088548364400416034343698130707710102266628, + 59798914616223532, + 81543217323518506, + 34804127142254778, + 21888242871839275222246405745257275088548364400416034343698099541247988215635, + 21888242871839275222246405745257275088548364400416034343698092431137195046866, + 21888242871839275222246405745257275088548364400416034343698187585454796338568, + 45146043873823267, + 21888242871839275222246405745257275088548364400416034343698097193593537566368, + 101098194172968511, + 21888242871839275222246405745257275088548364400416034343698166173548850712985, + 21888242871839275222246405745257275088548364400416034343698117171449566854883, + 21888242871839275222246405745257275088548364400416034343698186938408753554604, + 88958011687998029, + 21888242871839275222246405745257275088548364400416034343698197619040725919162, + 58799000534913615, + 28707465988231351, + 21888242871839275222246405745257275088548364400416034343698095141848391905683, + 7507140507874831, + 10525623444603609, + 21888242871839275222246405745257275088548364400416034343698133598640658332181, + 48051828331052890, + 76974872272110008, + 21888242871839275222246405745257275088548364400416034343698062683474053731163, + 21888242871839275222246405745257275088548364400416034343698109330456035920202, + 21888242871839275222246405745257275088548364400416034343698124418962904878117, + 21888242871839275222246405745257275088548364400416034343698070919375353350202, + 113847345198224524, + 21888242871839275222246405745257275088548364400416034343698156301975713031168, + 38251836500552165, + 69161657343919313, + 21888242871839275222246405745257275088548364400416034343698155243473511104504, + 13112333090535662, + 140812997546734757, + 2329680531214364, + 82160153299309133, + 21888242871839275222246405745257275088548364400416034343698096662509851548081, + 8724634640432190, + 14316873884331663, + 21888242871839275222246405745257275088548364400416034343698197526130330001889, + 86504959952356817, + 21888242871839275222246405745257275088548364400416034343698077528474371396183, + 59014921489030201, + 21888242871839275222246405745257275088548364400416034343698098583213422731407, + 121221327858719549, + 91909742192948468, + 24842051962013068, + 83145303943274005, + 21888242871839275222246405745257275088548364400416034343698088423601825022425, + 10648205187571153, + 21888242871839275222246405745257275088548364400416034343698080947415593492284, + 21888242871839275222246405745257275088548364400416034343698169733821223267586, + 21888242871839275222246405745257275088548364400416034343698186322179613758350, + 21888242871839275222246405745257275088548364400416034343698166141803965957484, + 3285975450126624, + 15863804700763553, + 21888242871839275222246405745257275088548364400416034343698185852077764742476, + 21888242871839275222246405745257275088548364400416034343698147885965777029273, + 21888242871839275222246405745257275088548364400416034343698174010423557755046, + 21888242871839275222246405745257275088548364400416034343698159669108497355977, + 136524263504142912, + 64450751774134518, + 129619143926069672, + 21888242871839275222246405745257275088548364400416034343698142079534549138525, + 21888242871839275222246405745257275088548364400416034343698119837820598071677, + 12180717110511789, + 21888242871839275222246405745257275088548364400416034343698191759834017579558, + 59095110577300637, + 9984358221248662, + 138997839221865639, + 21888242871839275222246405745257275088548364400416034343698133956582309470780, + 21888242871839275222246405745257275088548364400416034343698140492444125553246, + 21888242871839275222246405745257275088548364400416034343698100468918809079285, + 21888242871839275222246405745257275088548364400416034343698071127481673455825, + 84444425710177905, + 97187362746001263, + 29279357242746013, + 30212745815193552, + 128642670063173843, + 21888242871839275222246405745257275088548364400416034343698110096279281903145, + 21888242871839275222246405745257275088548364400416034343698162068258605226194, + 100481706755195047, + 21888242871839275222246405745257275088548364400416034343698085392644351261094, + 21888242871839275222246405745257275088548364400416034343698167220100533264791, + 21888242871839275222246405745257275088548364400416034343698145612039994052173, + 77485133794460897, + 21888242871839275222246405745257275088548364400416034343698107650074991309870, + 21888242871839275222246405745257275088548364400416034343698188588758659441111, + 64444780827935648, + 78999614493465300, + 105002807612539386, + 135567708190560220, + 143315446373730674, + 21888242871839275222246405745257275088548364400416034343698176007171081942082, + 21888242871839275222246405745257275088548364400416034343698203653356498273646, + 115467358608195282, + 21888242871839275222246405745257275088548364400416034343698116096866294718665, + 6856691747724928, + 21888242871839275222246405745257275088548364400416034343698088700708707400077, + 50090793204468673, + 21888242871839275222246405745257275088548364400416034343698162456066381665200, + 21888242871839275222246405745257275088548364400416034343698094953279341111051, + 21888242871839275222246405745257275088548364400416034343698119641768460218473, + 67451646678558701, + 21888242871839275222246405745257275088548364400416034343698097218246266801188, + 117456266262155875, + 21888242871839275222246405745257275088548364400416034343698067928456178711363, + 6793489132426280, + 21888242871839275222246405745257275088548364400416034343698204016806479067966, + 21888242871839275222246405745257275088548364400416034343698115119382464668537, + 3726901282783242, + 21888242871839275222246405745257275088548364400416034343698198383978530850698, + 21888242871839275222246405745257275088548364400416034343698195339261619809518, + 115581404435952530, + 123613778311193642, + 71543049005785567, + 65902636043200404, + 21888242871839275222246405745257275088548364400416034343698113648856359900446, + 4857196406275492, + 32463058492555907, + 21888242871839275222246405745257275088548364400416034343698119899717238175485, + 3247370306179732, + 9340206140028314, + 18475816284671603, + 21888242871839275222246405745257275088548364400416034343698060118666991521976, + 121505051060190907, + 21888242871839275222246405745257275088548364400416034343698065013091646742172, + 41256594375397287, + 21888242871839275222246405745257275088548364400416034343698092391821758331803, + 21888242871839275222246405745257275088548364400416034343698123982523165976746, + 108171485641114117, + 21888242871839275222246405745257275088548364400416034343698193890343234469392, + 21888242871839275222246405745257275088548364400416034343698141041121247121505, + 21888242871839275222246405745257275088548364400416034343698095325242435103408, + 21888242871839275222246405745257275088548364400416034343698156636392438358165, + 132581948501565640, + 21888242871839275222246405745257275088548364400416034343698086716724317064978, + 131683985735391460, + 21888242871839275222246405745257275088548364400416034343698088679049217985722, + 115845663221031487, + 7706578238913944, + 78109791700127008, + 72098062003177269, + 42328168895661181, + 21888242871839275222246405745257275088548364400416034343698170635566891991376, + 21888242871839275222246405745257275088548364400416034343698194812835859800711, + 21888242871839275222246405745257275088548364400416034343698078723004645277889, + 21888242871839275222246405745257275088548364400416034343698085226313740621438, + 45459134121936095, + 91389914321511246, + 101017790256056016, + 33138826346869421, + 21888242871839275222246405745257275088548364400416034343698087271136309501742, + 36411698594808656, + 21888242871839275222246405745257275088548364400416034343698185684157066610811, + 47488351416862182, + 21888242871839275222246405745257275088548364400416034343698107224694094786756, + 21888242871839275222246405745257275088548364400416034343698147995167551030864, + 21888242871839275222246405745257275088548364400416034343698144008887374121077, + 21888242871839275222246405745257275088548364400416034343698166924743334092162, + 21888242871839275222246405745257275088548364400416034343698100534429486203186, + 74974767274269673, + 23833244928214198, + 21888242871839275222246405745257275088548364400416034343698070445099224367599, + 26467805423522611, + 10411679672919739, + 21888242871839275222246405745257275088548364400416034343698152206396810928540, + 138651744838228859, + 143239842069200097, + 99386128417612260, + 21888242871839275222246405745257275088548364400416034343698165241470669654235, + 17590998792547457, + 21888242871839275222246405745257275088548364400416034343698074267393288604137, + 21888242871839275222246405745257275088548364400416034343698174958954846454697, + 101209657538163645, + 7894410535315668, + 49346013561566170, + 120309440773891111, + 71231444708391276, + 21888242871839275222246405745257275088548364400416034343698151426636370213127, + 27803406236805762, + 137133274109496098, + 35639454031620179, + 48946459198015733, + 62764224713562780, + 21888242871839275222246405745257275088548364400416034343698091758598266543342, + 21888242871839275222246405745257275088548364400416034343698199814339787657581, + 21888242871839275222246405745257275088548364400416034343698188615786026946813, + 51465376825792982, + 21888242871839275222246405745257275088548364400416034343698148904303434127781, + 44663227758489059, + 21888242871839275222246405745257275088548364400416034343698185453024608154465, + 15371445175359678, + 63740484064858226, + 129637474040039402, + 18982511523216387, + 71532702943827346, + 125690814638230907, + 80535215902485454, + 44707158369159185, + 21888242871839275222246405745257275088548364400416034343698078738043731020328, + 60481570247894624, + 21888242871839275222246405745257275088548364400416034343698114238983054698372, + 100655482780829943, + 21888242871839275222246405745257275088548364400416034343698166943545350873744, + 9409411938308731, + 21888242871839275222246405745257275088548364400416034343698108380184493089637, + 21888242871839275222246405745257275088548364400416034343698084687572046324509, + 109266174597706904, + 36967021592745473, + 21888242871839275222246405745257275088548364400416034343698176757476686214957, + 21888242871839275222246405745257275088548364400416034343698125387109151272765, + 135230806621996786, + 28518525517936267, + 49560658461092719, + 19842982201809815, + 108371184856733418, + 115518172629514190, + 21888242871839275222246405745257275088548364400416034343698060412312118752167, + 21888242871839275222246405745257275088548364400416034343698093872808776385759, + 134741342226575526, + 21888242871839275222246405745257275088548364400416034343698199030392167023184, + 21888242871839275222246405745257275088548364400416034343698147143858218137768, + 21888242871839275222246405745257275088548364400416034343698160816070702492735, + 21888242871839275222246405745257275088548364400416034343698116858565539863429, + 21888242871839275222246405745257275088548364400416034343698177804077156225213, + 21888242871839275222246405745257275088548364400416034343698196860908384927619, + 76142075636798771, + 21888242871839275222246405745257275088548364400416034343698108401557756722509, + 71511527848299656, + 21888242871839275222246405745257275088548364400416034343698178621054732388843, + 34279334609359478, + 122929278358194343, + 21888242871839275222246405745257275088548364400416034343698181171520574506825, + 92498591628845461, + 21888242871839275222246405745257275088548364400416034343698159143330736658123, + 21888242871839275222246405745257275088548364400416034343698107675822240433456, + 75024260635645559, + 86750417319133099, + 21888242871839275222246405745257275088548364400416034343698118515045102559444, + 21888242871839275222246405745257275088548364400416034343698200452762577283999, + 21888242871839275222246405745257275088548364400416034343698135921651880984887, + 21888242871839275222246405745257275088548364400416034343698129637724056015238, + 21888242871839275222246405745257275088548364400416034343698160324925093251818, + 21888242871839275222246405745257275088548364400416034343698084603062578292089, + 21888242871839275222246405745257275088548364400416034343698186018777246784361, + 120978566735772152, + 21888242871839275222246405745257275088548364400416034343698126950288884803550, + 9326662585567781, + 25554543110399979, + 15627723520670212, + 21888242871839275222246405745257275088548364400416034343698110884153559603809, + 122820820732243041, + 21888242871839275222246405745257275088548364400416034343698164771501764680056, + 21888242871839275222246405745257275088548364400416034343698157449124905624178, + 111766991388083996, + 21888242871839275222246405745257275088548364400416034343698115143354109580731, + 21888242871839275222246405745257275088548364400416034343698145598124065261963, + 21888242871839275222246405745257275088548364400416034343698183939871152832700, + 38013655339962038, + 21888242871839275222246405745257275088548364400416034343698088386959433960231, + 21888242871839275222246405745257275088548364400416034343698190335623340353134, + 14240345699642041, + 21888242871839275222246405745257275088548364400416034343698076507595220152245, + 21888242871839275222246405745257275088548364400416034343698159274396711900157, + 143627819898569458, + 21888242871839275222246405745257275088548364400416034343698152357709930813885, + 109552170034675838, + 108623172424562315, + 138471986520638027, + 21888242871839275222246405745257275088548364400416034343698176917513922419849, + 21888242871839275222246405745257275088548364400416034343698166055667236656160, + 21888242871839275222246405745257275088548364400416034343698187630932630448103, + 89249152725740773, + 81140866628934579, + 77308846148412151, + 21888242871839275222246405745257275088548364400416034343698152212617405670417, + 49012011129323603, + 21888242871839275222246405745257275088548364400416034343698103990636933580742, + 7261136687882756, + 72090396988547651, + 21888242871839275222246405745257275088548364400416034343698136485643024292119, + 21888242871839275222246405745257275088548364400416034343698113459291905926878, + 21888242871839275222246405745257275088548364400416034343698128041686282401991, + 21888242871839275222246405745257275088548364400416034343698176867814935496375, + 27983442447345938, + 121856496349379862, + 21888242871839275222246405745257275088548364400416034343698071143729712015927, + 21888242871839275222246405745257275088548364400416034343698178284869623619177, + 85084566026605007, + 21888242871839275222246405745257275088548364400416034343698072396755262607420, + 52634340193644292, + 21888242871839275222246405745257275088548364400416034343698194049950554380309, + 21888242871839275222246405745257275088548364400416034343698129981499778229085, + 21888242871839275222246405745257275088548364400416034343698063942410144869911, + 21888242871839275222246405745257275088548364400416034343698105621412080134796, + 21888242871839275222246405745257275088548364400416034343698116965648979178423, + 44069157582620530, + 126696273796918395, + 23520542589932328, + 21888242871839275222246405745257275088548364400416034343698079423099309922506, + 21888242871839275222246405745257275088548364400416034343698071565875766681479, + 21888242871839275222246405745257275088548364400416034343698091996150248689482, + 21888242871839275222246405745257275088548364400416034343698167320751903967489, + 21888242871839275222246405745257275088548364400416034343698088546528207028901, + 49484465870311630, + 70853822156126434, + 21888242871839275222246405745257275088548364400416034343698160176238100484647, + 71316345164853688, + 21888242871839275222246405745257275088548364400416034343698135103092294685240, + 25409065156646571, + 17149571538715810, + 21888242871839275222246405745257275088548364400416034343698078102507343551921, + 119780257816163080, + 97227275291829581, + 83982252647240037, + 53870394410825533, + 21888242871839275222246405745257275088548364400416034343698077362634717424996, + 21888242871839275222246405745257275088548364400416034343698143834575247761815, + 21888242871839275222246405745257275088548364400416034343698143250154262955099, + 21888242871839275222246405745257275088548364400416034343698105772430506164772, + 21888242871839275222246405745257275088548364400416034343698107066084097576409, + 21888242871839275222246405745257275088548364400416034343698200432727937141784, + 21888242871839275222246405745257275088548364400416034343698178178257190949106, + 69606856854803892, + 56655479497182436, + 49757710818347474, + 122786831896272025, + 21888242871839275222246405745257275088548364400416034343698116413663342311493, + 21888242871839275222246405745257275088548364400416034343698117657817813843150, + 21888242871839275222246405745257275088548364400416034343698171038439261872665, + 132774565492677288, + 21888242871839275222246405745257275088548364400416034343698148419879053520936, + 21888242871839275222246405745257275088548364400416034343698065733754117371015, + 30924746283426465, + 21888242871839275222246405745257275088548364400416034343698060072301589067431, + 137557883609630343, + 30109227632713300, + 21888242871839275222246405745257275088548364400416034343698128929141722938149, + 21888242871839275222246405745257275088548364400416034343698184248514313038302, + 21888242871839275222246405745257275088548364400416034343698127359862089710597, + 26418910076620694, + 21888242871839275222246405745257275088548364400416034343698164294136734878860, + 21888242871839275222246405745257275088548364400416034343698120122465635293762, + 21888242871839275222246405745257275088548364400416034343698106967594356403215, + 85714157741447305, + 21888242871839275222246405745257275088548364400416034343698188821580138754909, + 22272555897097769, + 21888242871839275222246405745257275088548364400416034343698169945484351036564, + 21888242871839275222246405745257275088548364400416034343698072713697092736433, + 28865667328182684, + 75308712366874512, + 21888242871839275222246405745257275088548364400416034343698077405905249783834, + 21888242871839275222246405745257275088548364400416034343698153086511949662388, + 21888242871839275222246405745257275088548364400416034343698060787479511693628, + 21888242871839275222246405745257275088548364400416034343698179911675788097472, + 21888242871839275222246405745257275088548364400416034343698169453150126416442, + 21888242871839275222246405745257275088548364400416034343698158724195546101324, + 121908683181277357, + 21888242871839275222246405745257275088548364400416034343698111399288726120480, + 110218432207577517, + 21888242871839275222246405745257275088548364400416034343698172908695856348101, + 16188739829537718, + 109903661825771927, + 21888242871839275222246405745257275088548364400416034343698150324297418080630, + 21888242871839275222246405745257275088548364400416034343698138539685475322993, + 16390113333303146, + 80153172709544520, + 21888242871839275222246405745257275088548364400416034343698142064687192451481, + 137617152223803793, + 21888242871839275222246405745257275088548364400416034343698181093696339494661, + 137870701272111163, + 30650846796294079, + 21888242871839275222246405745257275088548364400416034343698199018825032852550, + 137529807481339490, + 46252523056882423, + 21888242871839275222246405745257275088548364400416034343698110729329075627721, + 68795953978987107, + 21888242871839275222246405745257275088548364400416034343698076388908490904398, + 126592662804037322, + 114710150285729158, + 143871762428407051, + 21888242871839275222246405745257275088548364400416034343698168600126667595691, + 21888242871839275222246405745257275088548364400416034343698128242975813331353, + 96543837282558699, + 25688998547369161, + 21888242871839275222246405745257275088548364400416034343698118207643934930185, + 122622446896736591, + 21888242871839275222246405745257275088548364400416034343698179181575938356731, + 59014553685458675, + 21888242871839275222246405745257275088548364400416034343698103756419423525944, + 21888242871839275222246405745257275088548364400416034343698106576582201159185, + 21888242871839275222246405745257275088548364400416034343698181575710146180005, + 93975874662434565, + 21888242871839275222246405745257275088548364400416034343698113338473626162959, + 21888242871839275222246405745257275088548364400416034343698181408553973365118, + 92480077062237999, + 108448746138731336, + 21888242871839275222246405745257275088548364400416034343698135208434763575216, + 21888242871839275222246405745257275088548364400416034343698189440022247925589, + 44856773093876022, + 63501620977374415, + 21888242871839275222246405745257275088548364400416034343698128197363513171945, + 81510743108265404, + 21888242871839275222246405745257275088548364400416034343698132844760647134431, + 129351544237887791, + 27749967062828176, + 21888242871839275222246405745257275088548364400416034343698105436910297171565, + 21888242871839275222246405745257275088548364400416034343698078491078345350193, + 136006331538250458, + 21888242871839275222246405745257275088548364400416034343698077635478978449665, + 21888242871839275222246405745257275088548364400416034343698159260150311071779, + 21888242871839275222246405745257275088548364400416034343698095014971252523663, + 19365547755678574, + 21888242871839275222246405745257275088548364400416034343698185457798891429962, + 21888242871839275222246405745257275088548364400416034343698107298241842394134, + 51028059440496603, + 21888242871839275222246405745257275088548364400416034343698150482975882366906, + 13077771578477584, + 21888242871839275222246405745257275088548364400416034343698183642752058894683, + 21888242871839275222246405745257275088548364400416034343698121450203987641746, + 43054134292105649, + 13172866424615280, + 93575419223222280, + 21888242871839275222246405745257275088548364400416034343698186574236860787404, + 106009744143650717, + 86108897880012358, + 83389673602879265, + 76618264283817689, + 66286580402988159, + 35892198146115362, + 2725109729721734, + 24152835498153394, + 95555595595510960, + 21888242871839275222246405745257275088548364400416034343698086228853602050679, + 67221173086254828, + 73257213780908483, + 21888242871839275222246405745257275088548364400416034343698160542560713504753, + 98229973485731801, + 113536934241274962, + 21888242871839275222246405745257275088548364400416034343698143279280489728833, + 89052918844481954, + 117032884945671254, + 21888242871839275222246405745257275088548364400416034343698073026451779274670, + 2041522891163558, + 21888242871839275222246405745257275088548364400416034343698169509996182990820, + 21888242871839275222246405745257275088548364400416034343698103637021214966923, + 79824951556253237, + 21888242871839275222246405745257275088548364400416034343698167455074145423777, + 21888242871839275222246405745257275088548364400416034343698152686074677638636, + 21888242871839275222246405745257275088548364400416034343698107295118362087560, + 82820444059473958, + 63130969701478388, + 21888242871839275222246405745257275088548364400416034343698131605192499675483, + 21888242871839275222246405745257275088548364400416034343698100766473763086738, + 21888242871839275222246405745257275088548364400416034343698066981047539331426, + 21888242871839275222246405745257275088548364400416034343698098327321161010744, + 6502084461045882, + 21888242871839275222246405745257275088548364400416034343698172338536554554781, + 48290514241170660, + 12730763841067410, + 143280483748329165, + 111200818909062816, + 21888242871839275222246405745257275088548364400416034343698078424862252526971, + 21888242871839275222246405745257275088548364400416034343698197342346376343663, + 21888242871839275222246405745257275088548364400416034343698156536717249958700, + 21888242871839275222246405745257275088548364400416034343698150045279541585285, + 131601349886710448, + 21888242871839275222246405745257275088548364400416034343698093828984775332654, + 21888242871839275222246405745257275088548364400416034343698064937872778521256, + 21888242871839275222246405745257275088548364400416034343698201752989915664881, + 130250800183176281, + 21888242871839275222246405745257275088548364400416034343698185641172664111137, + 21888242871839275222246405745257275088548364400416034343698135476148007049722, + 21888242871839275222246405745257275088548364400416034343698197846382048428806, + 78729522437881656, + 21888242871839275222246405745257275088548364400416034343698069027811086426383, + 67607207449094240, + 21888242871839275222246405745257275088548364400416034343698189593139481962189, + 21888242871839275222246405745257275088548364400416034343698136551726091819276, + 21888242871839275222246405745257275088548364400416034343698115281928686371160, + 46434407921928753, + 108746965242406925, + 21888242871839275222246405745257275088548364400416034343698169365429736116261, + 77405281207168124, + 21888242871839275222246405745257275088548364400416034343698158494627483022561, + 129407667576306812, + 21888242871839275222246405745257275088548364400416034343698065837923355837838, + 21888242871839275222246405745257275088548364400416034343698096378279746523498, + 21888242871839275222246405745257275088548364400416034343698175467675623823369, + 124511643611636640, + 21888242871839275222246405745257275088548364400416034343698107920398589223559, + 38843585470193633, + 14021839013771383, + 21888242871839275222246405745257275088548364400416034343698179082186710701499, + 21888242871839275222246405745257275088548364400416034343698181570515878508095, + 21888242871839275222246405745257275088548364400416034343698113555992529368783, + 21888242871839275222246405745257275088548364400416034343698161570506382571740, + 25463507749225237, + 21888242871839275222246405745257275088548364400416034343698081366658492877972, + 21888242871839275222246405745257275088548364400416034343698181062788845404271, + 21888242871839275222246405745257275088548364400416034343698105117914697123473, + 21888242871839275222246405745257275088548364400416034343698151371431673576593, + 43094009437324854, + 21888242871839275222246405745257275088548364400416034343698172054329158550801, + 124478978591571633, + 64811295323173282, + 21888242871839275222246405745257275088548364400416034343698194912868923154935, + 21888242871839275222246405745257275088548364400416034343698204114133788269754, + 17440041554790635, + 21888242871839275222246405745257275088548364400416034343698125202187222892246, + 35388802016806433, + 98702129971852583, + 134972607149201286, + 21888242871839275222246405745257275088548364400416034343698139654555164571061, + 21888242871839275222246405745257275088548364400416034343698122191934863913253, + 21888242871839275222246405745257275088548364400416034343698192507509052549632, + 90547656038655448, + 98169473389099697, + 21888242871839275222246405745257275088548364400416034343698061792969937160923, + 21888242871839275222246405745257275088548364400416034343698200013908729337021, + 75009510281776960, + 40262973239993749, + 21888242871839275222246405745257275088548364400416034343698143447937399400622, + 21888242871839275222246405745257275088548364400416034343698137364159801921508, + 118521991750403854, + 65299780014453027, + 21888242871839275222246405745257275088548364400416034343698074128693528680482, + 21888242871839275222246405745257275088548364400416034343698124537970730689362, + 3858665617229200, + 127791178241192349, + 135055435542683962, + 21888242871839275222246405745257275088548364400416034343698082992057373942163, + 21888242871839275222246405745257275088548364400416034343698116139703211462562, + 124870923986868699, + 60645335141409045, + 106107326008770888, + 15026359617538341, + 12661628352246685, + 21888242871839275222246405745257275088548364400416034343698161779002370785299, + 21888242871839275222246405745257275088548364400416034343698189255272046071156, + 21888242871839275222246405745257275088548364400416034343698105128562983555341, + 126546082346619095, + 21888242871839275222246405745257275088548364400416034343698177351812876954359, + 21888242871839275222246405745257275088548364400416034343698151191802567777744, + 82900510232297471, + 21888242871839275222246405745257275088548364400416034343698079429090891961079, + 143618550703366682, + 95744323096072025, + 139244011396507983, + 21888242871839275222246405745257275088548364400416034343698087464715454959044, + 21888242871839275222246405745257275088548364400416034343698176534867682815426, + 51124240812925875, + 21888242871839275222246405745257275088548364400416034343698100009375208703476, + 21888242871839275222246405745257275088548364400416034343698098200637282295462, + 21888242871839275222246405745257275088548364400416034343698192458315532646285, + 21888242871839275222246405745257275088548364400416034343698064290985507243929, + 21888242871839275222246405745257275088548364400416034343698121758074540088993, + 47789947364503213, + 10150262429893930, + 38212033799458406, + 21888242871839275222246405745257275088548364400416034343698095095832657304562, + 21888242871839275222246405745257275088548364400416034343698195974103211141704, + 23076663066783965, + 21888242871839275222246405745257275088548364400416034343698062271347589199797, + 21888242871839275222246405745257275088548364400416034343698118975715842905853, + 21888242871839275222246405745257275088548364400416034343698194205202413513933, + 77252115357835016, + 21888242871839275222246405745257275088548364400416034343698110771737053409772, + 70909611295574616, + 21888242871839275222246405745257275088548364400416034343698190901939781378560, + 21888242871839275222246405745257275088548364400416034343698071740902051003261, + 21888242871839275222246405745257275088548364400416034343698163078061019925024, + 5197269351122860, + 107469739659063359, + 82187025890391111, + 21888242871839275222246405745257275088548364400416034343698194395628419449531, + 47848125113869336, + 21888242871839275222246405745257275088548364400416034343698194792052395761884, + 21888242871839275222246405745257275088548364400416034343698184955395619116883, + 115140690341567050, + 90259021984134138, + 21888242871839275222246405745257275088548364400416034343698194907302381771208, + 70071238941490496, + 88848396406158017, + 133174212407799418, + 21888242871839275222246405745257275088548364400416034343698105210399013596395, + 21888242871839275222246405745257275088548364400416034343698126113915867222784, + 65836870588689153, + 28335711817333253, + 76591701713209959, + 79546534243493763, + 21888242871839275222246405745257275088548364400416034343698172181954273880589, + 12181012015443752, + 28947435792850183, + 40100944195873385, + 58643241111662753, + 61884399538580036, + 21888242871839275222246405745257275088548364400416034343698113538426757127098, + 141128809812574134, + 3208861129983408, + 128321232891728676, + 58145787128443, + 68703675959467681, + 21888242871839275222246405745257275088548364400416034343698146539276721454360, + 21888242871839275222246405745257275088548364400416034343698129554907013065022, + 141934455419881371, + 21888242871839275222246405745257275088548364400416034343698183882276119264159, + 21888242871839275222246405745257275088548364400416034343698140432251834986055, + 21888242871839275222246405745257275088548364400416034343698184826068234220157, + 21888242871839275222246405745257275088548364400416034343698135547716838375701, + 21888242871839275222246405745257275088548364400416034343698177616853000854787, + 104139645606391695, + 21888242871839275222246405745257275088548364400416034343698200370013949064918, + 21888242871839275222246405745257275088548364400416034343698083861645486005024, + 21888242871839275222246405745257275088548364400416034343698088696618122182435, + 7226302124762447, + 21888242871839275222246405745257275088548364400416034343698093201794001196631, + 70750466242254145, + 101213782064333558, + 21888242871839275222246405745257275088548364400416034343698120225936047745539, + 21888242871839275222246405745257275088548364400416034343698155010459357993174, + 21888242871839275222246405745257275088548364400416034343698195495380047265540, + 21888242871839275222246405745257275088548364400416034343698131713126976388107, + 118446168796105246, + 21888242871839275222246405745257275088548364400416034343698173032225824128489, + 21888242871839275222246405745257275088548364400416034343698099588043174213086, + 21888242871839275222246405745257275088548364400416034343698094673237039608643, + 75717563934551467, + 64184031383804790, + 142907880617296036, + 21888242871839275222246405745257275088548364400416034343698195815705686884835, + 97722684062739046, + 14933956244062777, + 94906143855090037, + 21888242871839275222246405745257275088548364400416034343698091934691779343523, + 5617509757919044, + 21888242871839275222246405745257275088548364400416034343698094255466960944182, + 21888242871839275222246405745257275088548364400416034343698082949024556722896, + 21888242871839275222246405745257275088548364400416034343698180958145060069018, + 40131139775214486, + 96776330685148172, + 21888242871839275222246405745257275088548364400416034343698135488274323753650, + 113218851118306584, + 139148054716301273, + 21888242871839275222246405745257275088548364400416034343698146382760515588729, + 21888242871839275222246405745257275088548364400416034343698198609613561697507, + 21888242871839275222246405745257275088548364400416034343698122993900751290699, + 71887197369051362, + 129223725019476918, + 21888242871839275222246405745257275088548364400416034343698182712383892607629, + 2358618186698287, + 14588913517178255, + 53526660989417129, + 21888242871839275222246405745257275088548364400416034343698193588009445754476, + 87273942712585682, + 21888242871839275222246405745257275088548364400416034343698088827220192026812, + 73214533592782363, + 112727365744150880, + 114729252796289314, + 21888242871839275222246405745257275088548364400416034343698119636046841851952, + 21888242871839275222246405745257275088548364400416034343698146047799061941382, + 21888242871839275222246405745257275088548364400416034343698062401940977383422, + 10907274118226469, + 21888242871839275222246405745257275088548364400416034343698157834567832135680, + 21888242871839275222246405745257275088548364400416034343698118424115055990058, + 21888242871839275222246405745257275088548364400416034343698090565375616418107, + 72686244983558125, + 6653834998203782, + 21888242871839275222246405745257275088548364400416034343698137859416452622624, + 21888242871839275222246405745257275088548364400416034343698130639833803705760, + 21888242871839275222246405745257275088548364400416034343698072943906256884756, + 21888242871839275222246405745257275088548364400416034343698151880618089866604, + 130112657200122580, + 21888242871839275222246405745257275088548364400416034343698079629928617380525, + 21888242871839275222246405745257275088548364400416034343698143604712128441643, + 110299347348146502, + 73242315886199275, + 26782070271472744, + 120031513144830419, + 21888242871839275222246405745257275088548364400416034343698109052251144246097, + 21888242871839275222246405745257275088548364400416034343698161052654683307988, + 21888242871839275222246405745257275088548364400416034343698152364173390531836, + 21888242871839275222246405745257275088548364400416034343698173429872596914870, + 87520486066621232, + 21888242871839275222246405745257275088548364400416034343698071973731046138494, + 21888242871839275222246405745257275088548364400416034343698127245363357656959, + 21888242871839275222246405745257275088548364400416034343698111044527200230430, + 21888242871839275222246405745257275088548364400416034343698129204764990720516, + 116296140454128948, + 78682112559524681, + 21888242871839275222246405745257275088548364400416034343698170498709965574117, + 85573242162950391, + 111633838699592881, + 21888242871839275222246405745257275088548364400416034343698105503889002006557, + 13057552794074543, + 12738660201736354, + 21888242871839275222246405745257275088548364400416034343698109437657450760312, + 68678897378091136, + 21888242871839275222246405745257275088548364400416034343698162434313109846356, + 60241214240019544, + 39802763093127715, + 21888242871839275222246405745257275088548364400416034343698185927952314728903, + 84271747168119764, + 21888242871839275222246405745257275088548364400416034343698195024034273465843, + 21888242871839275222246405745257275088548364400416034343698096453358463783688, + 21888242871839275222246405745257275088548364400416034343698194467279329535675, + 74768182504373710, + 21888242871839275222246405745257275088548364400416034343698161848876137131674, + 21888242871839275222246405745257275088548364400416034343698144432592803361733, + 74599039407421405, + 21888242871839275222246405745257275088548364400416034343698163630504047247085, + 21888242871839275222246405745257275088548364400416034343698065956570148535452, + 98860369873527742, + 44011509698971195, + 52405424943797137, + 40143674596275235, + 70565365066477629, + 21888242871839275222246405745257275088548364400416034343698162930320128598381, + 21888242871839275222246405745257275088548364400416034343698074001331487793289, + 48899778291620671, + 21888242871839275222246405745257275088548364400416034343698087203764619385773, + 85072821170778972, + 82116134097828691, + 21888242871839275222246405745257275088548364400416034343698075971595317531733, + 21888242871839275222246405745257275088548364400416034343698073063360576491743, + 21888242871839275222246405745257275088548364400416034343698184376685747542947, + 21888242871839275222246405745257275088548364400416034343698085140101067212588, + 21888242871839275222246405745257275088548364400416034343698159754183352587352, + 86971276302174088, + 21888242871839275222246405745257275088548364400416034343698083487977365635105, + 137437787078719295, + 87294898349919886, + 21888242871839275222246405745257275088548364400416034343698103552203546932496, + 21888242871839275222246405745257275088548364400416034343698117011898636144121, + 21888242871839275222246405745257275088548364400416034343698136080968777933799, + 19958265026169550, + 76012566559366530, + 21888242871839275222246405745257275088548364400416034343698118760615201499885, + 21888242871839275222246405745257275088548364400416034343698067734227517670172, + 20867729746572426, + 21888242871839275222246405745257275088548364400416034343698176538765197324041, + 21888242871839275222246405745257275088548364400416034343698185157530640773514, + 104450870388828237, + 21888242871839275222246405745257275088548364400416034343698134003210524659384, + 93814138857994420, + 21888242871839275222246405745257275088548364400416034343698102374054817250495, + 12965593897333938, + 50369171970195012, + 72372195116016040, + 21888242871839275222246405745257275088548364400416034343698191354207942444920, + 48599779652646219, + 21888242871839275222246405745257275088548364400416034343698166918117054435279, + 21888242871839275222246405745257275088548364400416034343698194267392859910458, + 2448502755946184, + 36762019405712440, + 21888242871839275222246405745257275088548364400416034343698145349403781220501, + 3891682632013035, + 20619691280398004, + 21888242871839275222246405745257275088548364400416034343698113249481937646753, + 63880789420811619, + 35307738740206122, + 21888242871839275222246405745257275088548364400416034343698115458063931230249, + 86951854316130152, + 21888242871839275222246405745257275088548364400416034343698162622344919181563, + 7521997820811889, + 416911393864866, + 21888242871839275222246405745257275088548364400416034343698145649092851210925, + 21888242871839275222246405745257275088548364400416034343698197198879061743465, + 21888242871839275222246405745257275088548364400416034343698100660104276788072, + 21888242871839275222246405745257275088548364400416034343698122882600976080101, + 21888242871839275222246405745257275088548364400416034343698064066554202982296, + 21888242871839275222246405745257275088548364400416034343698146286896648614810, + 21888242871839275222246405745257275088548364400416034343698085168693300364446, + 21888242871839275222246405745257275088548364400416034343698187723401390751626, + 111648904766283254, + 21888242871839275222246405745257275088548364400416034343698098891754098499655, + 120547044633160435, + 21888242871839275222246405745257275088548364400416034343698126799053865900404, + 92518180180095454, + 21888242871839275222246405745257275088548364400416034343698128428793818114591, + 21888242871839275222246405745257275088548364400416034343698138481524774261225, + 21888242871839275222246405745257275088548364400416034343698154739451783231721, + 21888242871839275222246405745257275088548364400416034343698103629152986706472, + 21888242871839275222246405745257275088548364400416034343698170669173775351806, + 21888242871839275222246405745257275088548364400416034343698082823346209932461, + 64383361575699154, + 21888242871839275222246405745257275088548364400416034343698134037183999496907, + 107826429686898928, + 21888242871839275222246405745257275088548364400416034343698177717308267096293, + 80667377017679475, + 107145633842739403, + 46016629337256212, + 37353113481472295, + 21888242871839275222246405745257275088548364400416034343698184957164691690564, + 50419338235289862, + 21888242871839275222246405745257275088548364400416034343698162329634832867071, + 88461983408499428, + 21888242871839275222246405745257275088548364400416034343698167800309838484800, + 21888242871839275222246405745257275088548364400416034343698168116611531092080, + 21888242871839275222246405745257275088548364400416034343698171224650028334960, + 21888242871839275222246405745257275088548364400416034343698153454349275630409, + 86875094389098361, + 21888242871839275222246405745257275088548364400416034343698099740456382373797, + 21888242871839275222246405745257275088548364400416034343698113393640033352952, + 21888242871839275222246405745257275088548364400416034343698134396646584545625, + 21888242871839275222246405745257275088548364400416034343698200498932659922060, + 56296746030619277, + 21888242871839275222246405745257275088548364400416034343698187035215487497813, + 21888242871839275222246405745257275088548364400416034343698122307799114183031, + 21888242871839275222246405745257275088548364400416034343698081430292536458923, + 69360365270673721, + 21888242871839275222246405745257275088548364400416034343698146575659350700728, ]), Polynomial::new([ - 21888242871839275222246405745257275088548364400416034343698189516184702799221, - 21888242871839275222246405745257275088548364400416034343698178550188726755492, - 21888242871839275222246405745257275088548364400416034343698144770588246209595, - 10452479581322070, - 12290109980544686, - 59792397719397686, - 21888242871839275222246405745257275088548364400416034343698170772453423310195, - 21888242871839275222246405745257275088548364400416034343698202665077345478106, - 21888242871839275222246405745257275088548364400416034343698189035854497004094, - 38477009049879615, - 21888242871839275222246405745257275088548364400416034343698196552193699944295, - 55350491356475567, - 21888242871839275222246405745257275088548364400416034343698140200019342615478, - 21888242871839275222246405745257275088548364400416034343698184896243146616511, - 37081426736108478, - 21888242871839275222246405745257275088548364400416034343698170469832477691339, - 21888242871839275222246405745257275088548364400416034343698174237198190161437, - 21888242871839275222246405745257275088548364400416034343698169446409521699804, - 21888242871839275222246405745257275088548364400416034343698134314421247171644, - 49292047819216291, - 21307925516413911, - 21888242871839275222246405745257275088548364400416034343698168082252260236681, - 42681709908383037, - 58677392867425650, - 32221698929504861, - 24969734588462921, - 8586531897679344, - 25903125595519194, - 21888242871839275222246405745257275088548364400416034343698144152134566857728, - 21888242871839275222246405745257275088548364400416034343698139120355647119904, - 64045857957785380, - 21888242871839275222246405745257275088548364400416034343698195500029852196629, - 21943353684707017, - 64126171386525688, - 21888242871839275222246405745257275088548364400416034343698155489725669137697, - 21888242871839275222246405745257275088548364400416034343698173830460451509788, - 21888242871839275222246405745257275088548364400416034343698177783813925995444, - 21888242871839275222246405745257275088548364400416034343698149995505253996430, - 44293165734482843, - 67239701043909643, - 58176098392888989, - 21888242871839275222246405745257275088548364400416034343698157864610845173481, - 21888242871839275222246405745257275088548364400416034343698161052122299229637, - 40105605432042574, - 69972523635903630, - 38765130785146420, - 21888242871839275222246405745257275088548364400416034343698174047827996105095, - 7825152198969499, - 21888242871839275222246405745257275088548364400416034343698162015905178663280, - 66752681679722824, - 21888242871839275222246405745257275088548364400416034343698191760010716492495, - 21888242871839275222246405745257275088548364400416034343698136824899513219921, - 21888242871839275222246405745257275088548364400416034343698143496406145904223, - 49073202221120954, - 21888242871839275222246405745257275088548364400416034343698142461234929042831, - 9715750256341979, - 65638914170782007, - 21888242871839275222246405745257275088548364400416034343698155613581934518605, - 13597315857622808, - 19718739751796491, - 21888242871839275222246405745257275088548364400416034343698161990305503528706, - 21888242871839275222246405745257275088548364400416034343698132768382163506568, - 16371410608809132, - 21888242871839275222246405745257275088548364400416034343698179380975006041785, - 21888242871839275222246405745257275088548364400416034343698201787478193817602, - 52870003581962952, - 21888242871839275222246405745257275088548364400416034343698176956513826365490, - 39056896506744117, - 17098203716111114, - 21888242871839275222246405745257275088548364400416034343698134694317572722004, - 15796089167874016, - 21888242871839275222246405745257275088548364400416034343698178619853740064316, - 21888242871839275222246405745257275088548364400416034343698139572423518485579, - 21591792570838645, - 56453911218314766, - 21888242871839275222246405745257275088548364400416034343698152180243391302772, - 21888242871839275222246405745257275088548364400416034343698142297648235861417, - 21888242871839275222246405745257275088548364400416034343698175175019246037670, - 21888242871839275222246405745257275088548364400416034343698180618322033657159, - 69428699191629942, - 20364048640297601, - 21888242871839275222246405745257275088548364400416034343698204051183156763880, - 21888242871839275222246405745257275088548364400416034343698173441081247573866, - 36264814161461947, - 36854603485549639, - 62165361871784970, - 64100969084695137, - 21888242871839275222246405745257275088548364400416034343698203341358469574014, - 50222235588809254, - 21888242871839275222246405745257275088548364400416034343698155391837552325344, - 21888242871839275222246405745257275088548364400416034343698152902115334074023, - 46741031252620186, - 21888242871839275222246405745257275088548364400416034343698147477627444087779, - 23616723269377452, - 58207562986008642, - 57309381609304903, - 68313869333838499, - 21888242871839275222246405745257275088548364400416034343698193408129954827809, - 21635982772665184, - 10894549948131137, - 21888242871839275222246405745257275088548364400416034343698186452987618097745, - 24947184733918401, - 21888242871839275222246405745257275088548364400416034343698172253876893378619, - 37415462036092900, - 21888242871839275222246405745257275088548364400416034343698163996733293377774, - 33008809806783673, - 21888242871839275222246405745257275088548364400416034343698149464849589165042, - 44071889248460402, - 21888242871839275222246405745257275088548364400416034343698142694222165171125, - 51394394162772768, - 21888242871839275222246405745257275088548364400416034343698154658629174041719, - 21888242871839275222246405745257275088548364400416034343698190551713969278920, - 54037225889964707, - 21888242871839275222246405745257275088548364400416034343698136495408052051617, - 21888242871839275222246405745257275088548364400416034343698190088032821232189, - 21888242871839275222246405745257275088548364400416034343698170750582750974163, - 21888242871839275222246405745257275088548364400416034343698139444420424816071, - 53459078458109822, - 21888242871839275222246405745257275088548364400416034343698201455826876829428, - 44460386588625938, - 21888242871839275222246405745257275088548364400416034343698159706728233668701, - 10774746416306754, - 40200694604636883, - 21888242871839275222246405745257275088548364400416034343698169822430776443499, - 21090641301525594, - 21888242871839275222246405745257275088548364400416034343698169977290362991084, - 21888242871839275222246405745257275088548364400416034343698139291651496173154, - 65674671345524779, - 64025613787259319, - 44774766600855541, - 54355381358040339, - 21888242871839275222246405745257275088548364400416034343698152359166900525972, - 21888242871839275222246405745257275088548364400416034343698203198374271525963, - 21888242871839275222246405745257275088548364400416034343698172240649966714492, - 24085405521650162, - 13774167405117961, - 45179991946000066, - 36679570954421212, - 39607496723643921, - 21888242871839275222246405745257275088548364400416034343698141870718535753428, - 21888242871839275222246405745257275088548364400416034343698154317640190033255, - 68190711155876061, - 33527941720048765, - 21888242871839275222246405745257275088548364400416034343698188792288092620545, - 48708234733053366, - 51885036441380551, - 24662105259020819, - 21888242871839275222246405745257275088548364400416034343698171299613265455082, - 21888242871839275222246405745257275088548364400416034343698179149298566028102, - 21888242871839275222246405745257275088548364400416034343698157023778875379447, - 21888242871839275222246405745257275088548364400416034343698174510141200104350, - 21888242871839275222246405745257275088548364400416034343698196855565965676646, - 21888242871839275222246405745257275088548364400416034343698166692754331221872, - 36374283064361637, - 28356810430761448, - 5639366283822743, - 21888242871839275222246405745257275088548364400416034343698150451080240801345, - 11547716975394303, - 21888242871839275222246405745257275088548364400416034343698138941597831006218, - 21888242871839275222246405745257275088548364400416034343698193792442106910547, - 1681042688445709, - 21888242871839275222246405745257275088548364400416034343698144651022342364800, - 21888242871839275222246405745257275088548364400416034343698138920975402935285, - 71995840710716628, - 56323392544424819, - 21888242871839275222246405745257275088548364400416034343698186720706964742412, - 21888242871839275222246405745257275088548364400416034343698172106340790988370, - 36246180847246135, - 57852819161185641, - 21888242871839275222246405745257275088548364400416034343698136236493418978094, - 21888242871839275222246405745257275088548364400416034343698174760359368838997, - 21888242871839275222246405745257275088548364400416034343698137450382623841792, - 44968653233903125, - 48535979292344650, - 4322868700315011, - 21888242871839275222246405745257275088548364400416034343698191765895460240567, - 38022019025535414, - 12584999933405088, - 21888242871839275222246405745257275088548364400416034343698172957819333290710, - 21888242871839275222246405745257275088548364400416034343698149355740906443305, - 68405326950526285, - 21888242871839275222246405745257275088548364400416034343698178624447556641393, - 71046188585633714, - 21888242871839275222246405745257275088548364400416034343698147462846848460059, - 46039566867003948, - 12091348741267664, - 47746809536263255, - 44718758358600334, - 21888242871839275222246405745257275088548364400416034343698172909131438314988, - 37276653996386006, - 10450317974151300, - 21888242871839275222246405745257275088548364400416034343698189924758468045335, - 21888242871839275222246405745257275088548364400416034343698186868774018627301, - 21888242871839275222246405745257275088548364400416034343698132368414879632330, - 69096487651794002, - 21888242871839275222246405745257275088548364400416034343698155326323405725610, - 21888242871839275222246405745257275088548364400416034343698197972403821947847, - 21888242871839275222246405745257275088548364400416034343698163885039355897159, - 21888242871839275222246405745257275088548364400416034343698143886768820098468, - 21888242871839275222246405745257275088548364400416034343698175225573336532244, - 47123910936375147, - 40017210999840418, - 48303838707012800, - 21888242871839275222246405745257275088548364400416034343698178706141222197417, - 6319327469098814, - 39132295845552917, - 46922801263082891, - 21888242871839275222246405745257275088548364400416034343698157641992588740325, - 59165280433452085, - 21888242871839275222246405745257275088548364400416034343698171301137089350771, - 21888242871839275222246405745257275088548364400416034343698143630438709114731, - 21888242871839275222246405745257275088548364400416034343698156805712248070048, - 21888242871839275222246405745257275088548364400416034343698148438681049404474, - 21888242871839275222246405745257275088548364400416034343698144791785392152381, - 54251354322424193, - 67817178181192339, - 21888242871839275222246405745257275088548364400416034343698200918948908135050, - 21888242871839275222246405745257275088548364400416034343698156827419538064902, - 47936676541027021, - 33767622204653568, - 2723606236146776, - 21888242871839275222246405745257275088548364400416034343698150563583565686121, - 21888242871839275222246405745257275088548364400416034343698142764891004429182, - 13160899896179729, - 21888242871839275222246405745257275088548364400416034343698194734372759415564, - 21888242871839275222246405745257275088548364400416034343698196429718938753048, - 21888242871839275222246405745257275088548364400416034343698146648303409588898, - 39058165637016325, - 21888242871839275222246405745257275088548364400416034343698190815312596072832, - 21888242871839275222246405745257275088548364400416034343698166708861192424188, - 27283399056905836, - 22449466363295340, - 30689840106291448, - 11501115151242451, - 32306074746937781, - 21888242871839275222246405745257275088548364400416034343698166804329694973625, - 21888242871839275222246405745257275088548364400416034343698186530183675751757, - 21888242871839275222246405745257275088548364400416034343698173510128096329071, - 68875065457311377, - 8778401589688937, - 50141321572764899, - 66282675903010249, - 26225685726802653, - 21888242871839275222246405745257275088548364400416034343698202328405832192979, - 57877215624583686, - 51931831679558276, - 21888242871839275222246405745257275088548364400416034343698170756826750729351, - 21888242871839275222246405745257275088548364400416034343698148143481556360406, - 21888242871839275222246405745257275088548364400416034343698136199107094189510, - 21888242871839275222246405745257275088548364400416034343698142845855782276314, - 21888242871839275222246405745257275088548364400416034343698156100509655476088, - 3509065847332702, - 47070920918840356, - 59228469840498769, - 21888242871839275222246405745257275088548364400416034343698135465531686200121, - 21888242871839275222246405745257275088548364400416034343698139481828440909369, - 46558653225402032, - 21888242871839275222246405745257275088548364400416034343698166399088469195865, - 46792801138301508, - 71404341907779777, - 29400250795209167, - 12407717217780401, - 3353858601639406, - 21888242871839275222246405745257275088548364400416034343698160720100359965618, - 11669790598530640, - 21888242871839275222246405745257275088548364400416034343698137244379863608502, - 10068044181743080, - 1639824805163098, - 50700983073882663, - 8852822874274274, - 21888242871839275222246405745257275088548364400416034343698162639793356251437, - 21888242871839275222246405745257275088548364400416034343698191838049037132105, - 14040493040409495, - 58778600880477407, - 21888242871839275222246405745257275088548364400416034343698145666626156722399, - 21888242871839275222246405745257275088548364400416034343698161525489058455677, - 69064056052574856, - 54459142628445069, - 59658489572598560, - 11693546232701878, - 21888242871839275222246405745257275088548364400416034343698195980470783588290, - 19658706234049286, - 69516747809884170, - 23798718677237165, - 21888242871839275222246405745257275088548364400416034343698152061365904767355, - 42775263110398086, - 21888242871839275222246405745257275088548364400416034343698193685358733238989, - 21888242871839275222246405745257275088548364400416034343698143074543773754394, - 59830747714709253, - 24343261508552505, - 21888242871839275222246405745257275088548364400416034343698199171857316964604, - 21888242871839275222246405745257275088548364400416034343698161541925380109337, - 2313634247807414, - 48547247523293125, - 21888242871839275222246405745257275088548364400416034343698156911469636992467, - 21888242871839275222246405745257275088548364400416034343698199824948660949676, - 68256686163280493, - 21888242871839275222246405745257275088548364400416034343698185405261892267278, - 63698241818570456, - 21888242871839275222246405745257275088548364400416034343698145576407016749669, - 32922355001205524, - 7937765076317909, - 21888242871839275222246405745257275088548364400416034343698158867756288970093, - 21888242871839275222246405745257275088548364400416034343698151982557131866303, - 21888242871839275222246405745257275088548364400416034343698173107571017091410, - 35434620425140460, - 39926944797496460, - 17287803987605484, - 21888242871839275222246405745257275088548364400416034343698169303074825466377, - 61296956933736582, - 21888242871839275222246405745257275088548364400416034343698146660828508687040, - 21888242871839275222246405745257275088548364400416034343698169336658421992002, - 51311851665464239, - 21888242871839275222246405745257275088548364400416034343698158347595683494295, - 21888242871839275222246405745257275088548364400416034343698163030601461657357, - 21888242871839275222246405745257275088548364400416034343698163583597895335790, - 17216564123362471, - 21888242871839275222246405745257275088548364400416034343698166920582584847936, - 21888242871839275222246405745257275088548364400416034343698132896089105844185, - 28487998482106573, - 27221616282371824, - 21888242871839275222246405745257275088548364400416034343698168631788126931458, - 9851298936431596, - 65586737281060817, - 58702649503979572, - 33539063884005864, - 4042668871201430, - 65716666000718205, - 21888242871839275222246405745257275088548364400416034343698154310679879039727, - 21888242871839275222246405745257275088548364400416034343698193139738862053846, - 21888242871839275222246405745257275088548364400416034343698189928727855781181, - 21888242871839275222246405745257275088548364400416034343698193044901581917823, - 60187377244629792, - 21888242871839275222246405745257275088548364400416034343698137236001769210936, - 36789298646889405, - 55644651854505080, - 33403134578475400, - 22563650600478535, - 57753586846865362, - 42960725078789375, - 18838638637306130, - 21888242871839275222246405745257275088548364400416034343698172864883356157912, - 21888242871839275222246405745257275088548364400416034343698171170461778801830, - 21888242871839275222246405745257275088548364400416034343698155798681837027865, - 56722085454211198, - 33023738360844705, - 21888242871839275222246405745257275088548364400416034343698166919591729524809, - 41555187565204289, - 21888242871839275222246405745257275088548364400416034343698143494301205861918, - 21888242871839275222246405745257275088548364400416034343698155060948063677173, - 60163489890552309, - 21888242871839275222246405745257275088548364400416034343698160458308927122523, - 21888242871839275222246405745257275088548364400416034343698168907097129302483, - 8600533529023416, - 21888242871839275222246405745257275088548364400416034343698137335919691278825, - 67160176056251235, - 21888242871839275222246405745257275088548364400416034343698199257213423932468, - 21888242871839275222246405745257275088548364400416034343698190890800388044260, - 21888242871839275222246405745257275088548364400416034343698159144105743341177, - 4940629683202534, - 21888242871839275222246405745257275088548364400416034343698199188942977999764, - 19423765799304206, - 36226025272530246, - 21888242871839275222246405745257275088548364400416034343698144799990242383807, - 21888242871839275222246405745257275088548364400416034343698154216602203624214, - 21888242871839275222246405745257275088548364400416034343698143531691886891709, - 55805576755073851, - 30071015598835490, - 21888242871839275222246405745257275088548364400416034343698188567742944158395, - 25158967279784444, - 21722992486451602, - 21888242871839275222246405745257275088548364400416034343698132532581005335858, - 46976412866042297, - 21888242871839275222246405745257275088548364400416034343698170482586289715070, - 21888242871839275222246405745257275088548364400416034343698136758614036370931, - 40580756633415238, - 56361184952240872, - 21888242871839275222246405745257275088548364400416034343698194368650428290831, - 21888242871839275222246405745257275088548364400416034343698202528630744331165, - 1368168047526096, - 28481383935486070, - 21888242871839275222246405745257275088548364400416034343698168837144953318597, - 21888242871839275222246405745257275088548364400416034343698186399335383597042, - 21888242871839275222246405745257275088548364400416034343698159667087824952166, - 21888242871839275222246405745257275088548364400416034343698169173951584272311, - 21888242871839275222246405745257275088548364400416034343698143020455130624877, - 56577673651568015, - 30099265227909871, - 52787131996171520, - 21888242871839275222246405745257275088548364400416034343698174973459461850562, - 4583830091629363, - 21888242871839275222246405745257275088548364400416034343698143412733301380700, - 21888242871839275222246405745257275088548364400416034343698165759526245022441, - 60610494979460122, - 21888242871839275222246405745257275088548364400416034343698190810187192107075, - 21888242871839275222246405745257275088548364400416034343698186715455116975112, - 55769095972002061, - 14100793457623209, - 4391413897606011, - 6696598558863230, - 21888242871839275222246405745257275088548364400416034343698148769045474534247, - 21888242871839275222246405745257275088548364400416034343698146026484079560553, - 21888242871839275222246405745257275088548364400416034343698138586912077359851, - 68202513888430546, - 21888242871839275222246405745257275088548364400416034343698162871867802438199, - 21888242871839275222246405745257275088548364400416034343698189417328914145859, - 21888242871839275222246405745257275088548364400416034343698149922112350920110, - 21888242871839275222246405745257275088548364400416034343698161476546519525388, - 10105928098871183, - 21888242871839275222246405745257275088548364400416034343698191629828036584974, - 21888242871839275222246405745257275088548364400416034343698178759516763433396, - 33841453990748583, - 22511328059598837, - 21133042885934862, - 21888242871839275222246405745257275088548364400416034343698132231377714084523, - 21888242871839275222246405745257275088548364400416034343698186061287323259166, - 21888242871839275222246405745257275088548364400416034343698183489910301054197, - 10717063086526427, - 21888242871839275222246405745257275088548364400416034343698185103129878044976, - 14140053716422823, - 21888242871839275222246405745257275088548364400416034343698161929293418910489, - 21888242871839275222246405745257275088548364400416034343698178696717610350636, - 47819951168222791, - 21888242871839275222246405745257275088548364400416034343698135838359961502210, - 42893931796761581, - 21888242871839275222246405745257275088548364400416034343698145357723350476855, - 21888242871839275222246405745257275088548364400416034343698154727235229080442, - 21888242871839275222246405745257275088548364400416034343698182731554682838272, - 49779776371714948, - 41963040758639921, - 8491517404769846, - 21888242871839275222246405745257275088548364400416034343698185033319416759552, - 62214742311584103, - 21888242871839275222246405745257275088548364400416034343698137844358446851665, - 21070457341863233, - 21888242871839275222246405745257275088548364400416034343698196858427018567085, - 53946081633699958, - 2246166621696456, - 70565871472751007, - 21888242871839275222246405745257275088548364400416034343698188326493012279829, - 21888242871839275222246405745257275088548364400416034343698180612516885657519, - 21888242871839275222246405745257275088548364400416034343698158884907476066230, - 61978271138155509, - 51587219244318946, - 21888242871839275222246405745257275088548364400416034343698163033193348645744, - 3009759821302700, - 47262117181292061, - 30918202556613275, - 39770428547551774, - 21888242871839275222246405745257275088548364400416034343698163824184630971893, - 30544047071527634, - 37934983364442805, - 21888242871839275222246405745257275088548364400416034343698191982909498228602, - 21933508070960900, - 21888242871839275222246405745257275088548364400416034343698192180790251315821, - 43935671000268269, - 45987217976824497, - 21888242871839275222246405745257275088548364400416034343698157820970381270446, - 21888242871839275222246405745257275088548364400416034343698203789887818342191, - 21888242871839275222246405745257275088548364400416034343698164704975202415432, - 16906857994433222, - 21888242871839275222246405745257275088548364400416034343698169761013729439587, - 35751003174380309, - 50519433222280321, - 21888242871839275222246405745257275088548364400416034343698178109268543978721, - 21888242871839275222246405745257275088548364400416034343698189060284842500031, - 21888242871839275222246405745257275088548364400416034343698176257594847066179, - 22404632533782881, - 21888242871839275222246405745257275088548364400416034343698157486855994249588, - 10956947655923085, - 21888242871839275222246405745257275088548364400416034343698185748862074346969, - 21888242871839275222246405745257275088548364400416034343698202390993672250490, - 21888242871839275222246405745257275088548364400416034343698196516556608544590, - 21888242871839275222246405745257275088548364400416034343698195696388588461670, - 29703746544302673, - 21888242871839275222246405745257275088548364400416034343698136299485760443984, - 45301322791536228, - 21888242871839275222246405745257275088548364400416034343698188425153235258259, - 21888242871839275222246405745257275088548364400416034343698142232509203918605, - 48369193574059622, - 42996709869473318, - 21888242871839275222246405745257275088548364400416034343698147785986113386611, - 21888242871839275222246405745257275088548364400416034343698132518597029949987, - 21888242871839275222246405745257275088548364400416034343698194964382802721952, - 21888242871839275222246405745257275088548364400416034343698136344903010539764, - 9731672994202306, - 21888242871839275222246405745257275088548364400416034343698135051933979767419, - 65338672323628133, - 21888242871839275222246405745257275088548364400416034343698147932923285516610, - 43995450457701373, - 21888242871839275222246405745257275088548364400416034343698199870410742784671, - 21888242871839275222246405745257275088548364400416034343698167088385904240063, - 21888242871839275222246405745257275088548364400416034343698195335177217176323, - 22002003384607012, - 21888242871839275222246405745257275088548364400416034343698189719544043643309, - 21888242871839275222246405745257275088548364400416034343698175305606438459027, - 21888242871839275222246405745257275088548364400416034343698157622679351753510, - 39693362594498237, - 34831591925298715, - 54037680709023675, - 21888242871839275222246405745257275088548364400416034343698169948332172242725, - 52302651990918145, - 1378219199104068, - 67063277527671126, - 21888242871839275222246405745257275088548364400416034343698175812057965286971, - 21888242871839275222246405745257275088548364400416034343698197395850327611636, - 48501192844407598, - 6518525768071982, - 21888242871839275222246405745257275088548364400416034343698185828161332045900, - 24595197678082436, - 70210873984926888, - 21888242871839275222246405745257275088548364400416034343698144960199303358257, - 21888242871839275222246405745257275088548364400416034343698183993738306083160, - 21888242871839275222246405745257275088548364400416034343698158719572018615882, - 21888242871839275222246405745257275088548364400416034343698194380321605252044, - 28541208378102054, - 56289825049314080, - 21888242871839275222246405745257275088548364400416034343698167826437597721731, - 21888242871839275222246405745257275088548364400416034343698140915403713548403, - 57705158115461629, - 12704931692070828, - 13537215379078606, - 64445945037587042, - 52880899747177215, - 21888242871839275222246405745257275088548364400416034343698193931952869212590, - 21888242871839275222246405745257275088548364400416034343698173268228199169256, - 21888242871839275222246405745257275088548364400416034343698161174756978868425, - 21888242871839275222246405745257275088548364400416034343698153007008940255000, - 21888242871839275222246405745257275088548364400416034343698151215030769292338, - 19205227520631121, - 49436725177764145, - 52436465737957783, - 21888242871839275222246405745257275088548364400416034343698154987374946430986, - 21888242871839275222246405745257275088548364400416034343698193474331672575926, - 63024172491461225, - 25638609662288255, - 11567637856540706, - 21888242871839275222246405745257275088548364400416034343698148947780890461079, - 4561094078523126, - 67512927045588261, - 21888242871839275222246405745257275088548364400416034343698199239189605730289, - 6332083095421761, - 53754352807190288, - 21888242871839275222246405745257275088548364400416034343698184559229357832826, - 21888242871839275222246405745257275088548364400416034343698155748187307441507, - 42221644650248628, - 29542493974650565, - 2787276523352698, - 6206981951233879, - 59620589968509531, - 10162783100419840, - 228475984386447, - 46503438555921793, - 40485259081706395, - 21888242871839275222246405745257275088548364400416034343698136515299556311607, - 21888242871839275222246405745257275088548364400416034343698162918120307265556, - 21888242871839275222246405745257275088548364400416034343698149449010027594279, - 62117433386839643, - 10466352855670345, - 21888242871839275222246405745257275088548364400416034343698182247864865531038, - 15170432955827003, - 21888242871839275222246405745257275088548364400416034343698139524034970406842, - 21888242871839275222246405745257275088548364400416034343698142439298839622620, - 21888242871839275222246405745257275088548364400416034343698167358594499508760, - 21888242871839275222246405745257275088548364400416034343698156468116695510484, - 21888242871839275222246405745257275088548364400416034343698195096643861535276, - 69509231309381801, - 21888242871839275222246405745257275088548364400416034343698174262540527789943, - 82880279397930, - 21888242871839275222246405745257275088548364400416034343698188353539897371631, - 21888242871839275222246405745257275088548364400416034343698193518971506076092, - 11154833913409984, - 57515254687501478, - 21888242871839275222246405745257275088548364400416034343698165044403156722856, - 12474011297762553, - 538083452282967, - 21888242871839275222246405745257275088548364400416034343698138311804370002261, - 69362089749178330, - 23264804846723096, - 21888242871839275222246405745257275088548364400416034343698157221211665436685, - 31987970663376998, - 21888242871839275222246405745257275088548364400416034343698176914844854339654, - 44943892057500940, - 21888242871839275222246405745257275088548364400416034343698156011352065838921, - 65663608270499539, - 45326778922872586, - 21888242871839275222246405745257275088548364400416034343698138549769058095531, - 21888242871839275222246405745257275088548364400416034343698181867441955655420, - 21888242871839275222246405745257275088548364400416034343698141455956924412162, - 37352430047161429, - 21888242871839275222246405745257275088548364400416034343698141015822332309690, - 71725037203172379, - 19312841655200342, - 25561535692599131, - 33042884553350898, - 21888242871839275222246405745257275088548364400416034343698192377297417241329, - 54740120748046694, - 21888242871839275222246405745257275088548364400416034343698151244212337797082, - 21888242871839275222246405745257275088548364400416034343698144002655636395071, - 21888242871839275222246405745257275088548364400416034343698170139901162934147, - 9033554149620639, - 7948526337897407, - 21888242871839275222246405745257275088548364400416034343698183977716685963460, - 21888242871839275222246405745257275088548364400416034343698158617127760977969, - 22527580342506912, - 54603156131066594, - 49754334130733373, - 46952056825662263, - 21888242871839275222246405745257275088548364400416034343698199107037149454893, - 53758524503221972, - 21888242871839275222246405745257275088548364400416034343698192455828283489207, - 63025110244498986, - 21888242871839275222246405745257275088548364400416034343698137044307822560567, - 21888242871839275222246405745257275088548364400416034343698171658102400836811, - 49614804890310044, - 21888242871839275222246405745257275088548364400416034343698133291100530967121, - 21888242871839275222246405745257275088548364400416034343698134162008912006260, - 21888242871839275222246405745257275088548364400416034343698138685953429349774, - 21888242871839275222246405745257275088548364400416034343698138578228962580625, - 21888242871839275222246405745257275088548364400416034343698184025415650658313, - 39476709792911958, - 21888242871839275222246405745257275088548364400416034343698144843456225756123, - 55059305966040969, - 21888242871839275222246405745257275088548364400416034343698167540331370524097, - 65747493257561873, - 21888242871839275222246405745257275088548364400416034343698182478717729219977, - 21888242871839275222246405745257275088548364400416034343698140721536215417838, - 15271824156447067, - 43660685320331773, - 55481126954862814, - 2937340310541104, - 21888242871839275222246405745257275088548364400416034343698186312396091935682, - 21888242871839275222246405745257275088548364400416034343698163864485814847991, - 38104362190820797, - 21888242871839275222246405745257275088548364400416034343698163320322389596028, - 21888242871839275222246405745257275088548364400416034343698200181063198597842, - 30434935092823948, - 21888242871839275222246405745257275088548364400416034343698186949031489746593, - 21888242871839275222246405745257275088548364400416034343698157549208020492150, - 21888242871839275222246405745257275088548364400416034343698196056403675024313, - 21888242871839275222246405745257275088548364400416034343698162606317586271240, - 25518680865638374, - 67687365721386435, - 38289636712065957, - 11955119986085334, - 3555108380359993, - 52868848462177294, - 21888242871839275222246405745257275088548364400416034343698166415716179676176, - 23719863064246184, - 21888242871839275222246405745257275088548364400416034343698132892833982495327, - 28094231393889333, - 21888242871839275222246405745257275088548364400416034343698180204621466233886, - 49491638176357745, - 35106016665134286, - 31326595282491919, - 5359528796824552, - 21888242871839275222246405745257275088548364400416034343698203049805088854103, - 21888242871839275222246405745257275088548364400416034343698159205252068369207, - 69130730007489209, - 21888242871839275222246405745257275088548364400416034343698144935771632248898, - 21888242871839275222246405745257275088548364400416034343698147293778200664338, - 21888242871839275222246405745257275088548364400416034343698172393898722898541, - 40916635527484298, - 21888242871839275222246405745257275088548364400416034343698169422328684606316, - 49833961496704771, - 21888242871839275222246405745257275088548364400416034343698180644086904685884, - 14027733619301856, - 59115023529026974, - 21888242871839275222246405745257275088548364400416034343698175866926399093249, - 69081623691585923, - 31526664787201361, - 53866225698093992, - 10051277365014286, - 21888242871839275222246405745257275088548364400416034343698143497385300231962, - 11625147961539275, - 1046749088748951, - 62652967481252214, - 21888242871839275222246405745257275088548364400416034343698175812365168433764, - 16315756206753844, - 21888242871839275222246405745257275088548364400416034343698158621527054310799, - 21939008059710973, - 34643058747127286, - 21888242871839275222246405745257275088548364400416034343698172299148155790646, - 19779330821398042, - 21888242871839275222246405745257275088548364400416034343698173212774184365823, - 21888242871839275222246405745257275088548364400416034343698168141248543692368, - 21888242871839275222246405745257275088548364400416034343698151974583373074918, - 24395454624103694, - 47876150453379159, - 21888242871839275222246405745257275088548364400416034343698146629061784263939, - 50881131399516098, - 43023799842712361, - 47332078396505365, - 5399179100140332, - 21888242871839275222246405745257275088548364400416034343698144166125818668600, - 71659936706143595, - 21888242871839275222246405745257275088548364400416034343698155351461526697574, - 19593880068493040, - 21888242871839275222246405745257275088548364400416034343698165004053860668045, - 21888242871839275222246405745257275088548364400416034343698198177529548458014, - 35465257508599903, - 21888242871839275222246405745257275088548364400416034343698174820470379860337, - 52718829779899675, - 21888242871839275222246405745257275088548364400416034343698197229691666402182, - 21888242871839275222246405745257275088548364400416034343698144584602080375539, - 66974509590869819, - 21888242871839275222246405745257275088548364400416034343698144443887537074954, - 62205905027758792, - 21888242871839275222246405745257275088548364400416034343698190465133503107208, - 21888242871839275222246405745257275088548364400416034343698153042353334567458, - 6440142333801511, - 59449025406877390, - 13705821598603097, - 40478521741648539, - 21888242871839275222246405745257275088548364400416034343698191805888361922254, - 27237958013712824, - 21888242871839275222246405745257275088548364400416034343698156255287127562198, - 34618789881553371, - 21888242871839275222246405745257275088548364400416034343698132653403871900425, - 21888242871839275222246405745257275088548364400416034343698145283039785567896, - 37868613208836827, - 35694097407322629, - 21888242871839275222246405745257275088548364400416034343698154457861105172518, - 21888242871839275222246405745257275088548364400416034343698199635614651832059, - 34708299326304184, - 42077759440298204, - 19934405978557112, - 11056250816828452, - 14323909679072110, - 33933625035178362, - 48539052385607041, - 38683081911579025, - 41585124761697513, - 54499291099337365, - 21888242871839275222246405745257275088548364400416034343698200375823371276622, - 44920414749783554, - 21888242871839275222246405745257275088548364400416034343698180154056433311169, - 60868739365430254, - 21888242871839275222246405745257275088548364400416034343698154514298260445304, - 21888242871839275222246405745257275088548364400416034343698148256012020511410, - 28540831459052447, - 19743258225714516, - 25911496003327964, - 27492513556524462, - 5922097868051144, - 17675738954850547, - 45194836655866914, - 21888242871839275222246405745257275088548364400416034343698177594222504433415, - 21888242871839275222246405745257275088548364400416034343698193935052161592895, - 21888242871839275222246405745257275088548364400416034343698191079017705554508, - 21888242871839275222246405745257275088548364400416034343698200013073289791218, - 21888242871839275222246405745257275088548364400416034343698172601959874471836, - 21888242871839275222246405745257275088548364400416034343698198418706039803686, - 21888242871839275222246405745257275088548364400416034343698182583995367710304, - 21888242871839275222246405745257275088548364400416034343698164732179071619684, - 69108299530720659, - 21888242871839275222246405745257275088548364400416034343698177380162290835514, - 21888242871839275222246405745257275088548364400416034343698135659402208938132, - 58360251168052892, - 21888242871839275222246405745257275088548364400416034343698154640187315200602, - 17322029773545942, - 21888242871839275222246405745257275088548364400416034343698142672181739956340, - 62471568614970298, - 60301593604056409, - 62086730333622297, - 21888242871839275222246405745257275088548364400416034343698148026147727629135, - 21888242871839275222246405745257275088548364400416034343698159630486340399144, - 21888242871839275222246405745257275088548364400416034343698183348254988417054, - 21888242871839275222246405745257275088548364400416034343698191023753628732139, - 21888242871839275222246405745257275088548364400416034343698135682169762199386, - 21888242871839275222246405745257275088548364400416034343698133365572318480725, - 21888242871839275222246405745257275088548364400416034343698193227530498169864, - 11515623403708504, - 30624680172170120, - 58057549494364100, - 21888242871839275222246405745257275088548364400416034343698155964146947204530, - 21888242871839275222246405745257275088548364400416034343698202525667853601937, - 30641317833641692, - 46899270639193319, - 21888242871839275222246405745257275088548364400416034343698168483299736905346, - 14455572096105158, - 21888242871839275222246405745257275088548364400416034343698185825816493136103, - 21326576674338793, - 16896370885304616, - 69879677893585212, - 21888242871839275222246405745257275088548364400416034343698170779582789613952, - 21888242871839275222246405745257275088548364400416034343698137194703937500034, - 8396384902120430, - 21888242871839275222246405745257275088548364400416034343698146349744790979623, - 15762468255790986, - 32918538483936825, - 21888242871839275222246405745257275088548364400416034343698175783376606767684, - 8701501249311664, - 21888242871839275222246405745257275088548364400416034343698171028648835307247, - 21888242871839275222246405745257275088548364400416034343698133302601891663699, - 21888242871839275222246405745257275088548364400416034343698141357204642826866, - 21888242871839275222246405745257275088548364400416034343698178529811618253588, - 21888242871839275222246405745257275088548364400416034343698160408253486914683, - 21888242871839275222246405745257275088548364400416034343698149132985026958991, - 8832696335485184, - 21888242871839275222246405745257275088548364400416034343698151033742045130661, - 59764344471325692, - 21888242871839275222246405745257275088548364400416034343698159086534085943989, - 21888242871839275222246405745257275088548364400416034343698184824840539576537, - 21888242871839275222246405745257275088548364400416034343698175913182050633931, - 21888242871839275222246405745257275088548364400416034343698141006627535230541, - 29123368090281408, - 30140177593000765, - 21888242871839275222246405745257275088548364400416034343698152016877497085819, - 1098390565797470, - 45016240729020154, - 21888242871839275222246405745257275088548364400416034343698157028089919556330, - 21888242871839275222246405745257275088548364400416034343698133537146578688599, - 55996762106428396, - 23270053978251754, - 21888242871839275222246405745257275088548364400416034343698167581626601551665, - 21888242871839275222246405745257275088548364400416034343698137759952946436678, - 21888242871839275222246405745257275088548364400416034343698132744848036787238, - 21888242871839275222246405745257275088548364400416034343698191534845709733983, - 21888242871839275222246405745257275088548364400416034343698132422261831117805, - 70251896163437036, - 46725350454695545, - 24882202709442931, - 18442931182904927, - 5709911109572076, - 21888242871839275222246405745257275088548364400416034343698159040840256595864, - 21888242871839275222246405745257275088548364400416034343698156418157685698385, - 50551212531755117, - 40140924267408331, - 7425929819231736, - 62346082750156076, - 21888242871839275222246405745257275088548364400416034343698184933112136013467, - 70197808739081132, - 21888242871839275222246405745257275088548364400416034343698137638174941443087, - 21888242871839275222246405745257275088548364400416034343698187960600184078490, - 11884197430959793, - 21239035802417237, - 21888242871839275222246405745257275088548364400416034343698174274902666491594, - 21888242871839275222246405745257275088548364400416034343698135814818263793716, - 29779408147459747, - 21888242871839275222246405745257275088548364400416034343698192054800105541466, - 38022704623953975, - 21888242871839275222246405745257275088548364400416034343698198240464374212935, - 36757051662383639, - 21888242871839275222246405745257275088548364400416034343698166307636305199141, - 21888242871839275222246405745257275088548364400416034343698184464391836118510, - 21888242871839275222246405745257275088548364400416034343698186878331148006752, - 21888242871839275222246405745257275088548364400416034343698141587526598694839, - 21888242871839275222246405745257275088548364400416034343698144710799455209850, - 21888242871839275222246405745257275088548364400416034343698182044506784787711, - 71073763097892048, - 26117288793536508, - 26828569547796938, - 36967466744057876, - 21888242871839275222246405745257275088548364400416034343698200814074179852834, - 21888242871839275222246405745257275088548364400416034343698138253238344342965, - 21888242871839275222246405745257275088548364400416034343698189353754901074435, - 21888242871839275222246405745257275088548364400416034343698183816838757329259, - 21768449227408357, - 21888242871839275222246405745257275088548364400416034343698179871453887348386, - 66160604021707507, - 21888242871839275222246405745257275088548364400416034343698188212091581094275, - 21888242871839275222246405745257275088548364400416034343698195346368642653457, - 21888242871839275222246405745257275088548364400416034343698146587530971004990, - 21888242871839275222246405745257275088548364400416034343698174050857406125809, - 61790035437484064, - 21888242871839275222246405745257275088548364400416034343698189366171685066827, - 48019004446089132, - 24513635489532867, - 7215133100714775, - 21888242871839275222246405745257275088548364400416034343698145371328635324389, - 21888242871839275222246405745257275088548364400416034343698187395642191174901, - 55149412754362716, - 21888242871839275222246405745257275088548364400416034343698158337111091265227, - 38268786634400165, - 21888242871839275222246405745257275088548364400416034343698154723503249015373, - 1059757887449420, - 68091781260025067, - 21888242871839275222246405745257275088548364400416034343698201863049177130069, - 21888242871839275222246405745257275088548364400416034343698156318673932288944, - 54886885071019185, - 60934222418929141, - 296677050925923, - 19170608157318551, - 64557043123564955, - 8638910709657145, - 21888242871839275222246405745257275088548364400416034343698145963818540512857, - 54452660779848412, - 21888242871839275222246405745257275088548364400416034343698174255386181226445, - 21888242871839275222246405745257275088548364400416034343698186238462509592326, - 21888242871839275222246405745257275088548364400416034343698187981404939266159, - 21888242871839275222246405745257275088548364400416034343698145443433477838576, - 34474293192544406, - 62951888911855522, - 21888242871839275222246405745257275088548364400416034343698199687876366060452, - 21888242871839275222246405745257275088548364400416034343698198415161008900820, - 21888242871839275222246405745257275088548364400416034343698133997054216907584, - 21888242871839275222246405745257275088548364400416034343698198410125139479315, - 21888242871839275222246405745257275088548364400416034343698178004401429160919, - 70042669637042895, - 65995745428700575, - 59929612928613240, - 21888242871839275222246405745257275088548364400416034343698166161592074857424, - 21888242871839275222246405745257275088548364400416034343698182706431999290467, - 55563436507944713, - 21888242871839275222246405745257275088548364400416034343698153648033655802737, - 32203619870403343, - 22015240268703240, - 1113303613050795, - 21888242871839275222246405745257275088548364400416034343698180726498087827740, - 21888242871839275222246405745257275088548364400416034343698166839485511933108, - 21888242871839275222246405745257275088548364400416034343698149669067069749589, - 1695367025259268, - 52464021760388995, - 21888242871839275222246405745257275088548364400416034343698160331148445379927, - 21888242871839275222246405745257275088548364400416034343698152337032727766460, - 21888242871839275222246405745257275088548364400416034343698162523986676992164, - 21888242871839275222246405745257275088548364400416034343698159612183851256490, - 67456077312404886, - 21888242871839275222246405745257275088548364400416034343698155634891232713247, - 21888242871839275222246405745257275088548364400416034343698156478608989387563, - 21888242871839275222246405745257275088548364400416034343698134580841894658070, - 14534758318269550, - 21888242871839275222246405745257275088548364400416034343698192733046101794159, - 21888242871839275222246405745257275088548364400416034343698198955351038204481, - 64935847550343579, - 415079404379712, - 21888242871839275222246405745257275088548364400416034343698148580911031537460, - 18320498348342755, - 21888242871839275222246405745257275088548364400416034343698156555046569548005, - 21888242871839275222246405745257275088548364400416034343698137631229560770287, - 21888242871839275222246405745257275088548364400416034343698199950731680851064, - 18056961350365469, - 21888242871839275222246405745257275088548364400416034343698165038349545201430, - 18343267865316043, - 13377136658289408, - 21888242871839275222246405745257275088548364400416034343698185033652734405045, - 23941851380777595, - 26090665252382544, - 24369004357852186, - 11545118386413518, - 27216033323685537, - 29951299022940201, - 40400972049312379, - 21888242871839275222246405745257275088548364400416034343698149315603158693842, - 24464209361642519, - 21888242871839275222246405745257275088548364400416034343698132735767587818556, - 21888242871839275222246405745257275088548364400416034343698193760292247052043, - 45230707460730146, - 21888242871839275222246405745257275088548364400416034343698158707980278726686, - 21888242871839275222246405745257275088548364400416034343698179731108020605281, - 21888242871839275222246405745257275088548364400416034343698180916934721318850, - 21888242871839275222246405745257275088548364400416034343698203785280516554649, - 21888242871839275222246405745257275088548364400416034343698154177239177384695, - 21888242871839275222246405745257275088548364400416034343698145077410972873498, - 21888242871839275222246405745257275088548364400416034343698183274399179682120, - 21888242871839275222246405745257275088548364400416034343698161949945860510836, - 36258566412760458, - 18922273810271497, - 43464293045878424, - 21888242871839275222246405745257275088548364400416034343698173437970382356699, - 21888242871839275222246405745257275088548364400416034343698160204001906094764, - 21888242871839275222246405745257275088548364400416034343698181052083359680680, - 21888242871839275222246405745257275088548364400416034343698162508178562405354, - 21888242871839275222246405745257275088548364400416034343698157155370130821607, - 5970604246234653, - 56927823393099870, - 50882417199756970, - 21888242871839275222246405745257275088548364400416034343698136451253916650438, - 21888242871839275222246405745257275088548364400416034343698143264060403449465, - 30166916534791231, - 53111911915089517, - 20081365676747555, - 56657097209789610, - 21888242871839275222246405745257275088548364400416034343698136655133569273874, - 25481945476563933, - 21888242871839275222246405745257275088548364400416034343698142173790287463885, - 21888242871839275222246405745257275088548364400416034343698184899065587053223, - 55905114157250597, - 21888242871839275222246405745257275088548364400416034343698193444334049097674, - 54448152811125161, - 5870219586379050, - 21888242871839275222246405745257275088548364400416034343698174991970379152157, - 21888242871839275222246405745257275088548364400416034343698146811565138384655, - 21888242871839275222246405745257275088548364400416034343698198800565138643036, - 26831258575356821, - 33050744361992048, - 21888242871839275222246405745257275088548364400416034343698196490844654753662, - 21888242871839275222246405745257275088548364400416034343698198762156847125205, - 70750015010562687, - 25160578425636381, - 12168440521628076, - 21888242871839275222246405745257275088548364400416034343698198638561101337240, - 28450171532056189, - 26403760392731960, - 21888242871839275222246405745257275088548364400416034343698188129427377671310, - 21888242871839275222246405745257275088548364400416034343698143199674181310465, - 21888242871839275222246405745257275088548364400416034343698173793329216540567, - 21406968804545646, - 21455767481243475, - 20542950838998762, - 21888242871839275222246405745257275088548364400416034343698138082471844004025, - 21888242871839275222246405745257275088548364400416034343698140937925621691402, - 34065362216331179, - 21888242871839275222246405745257275088548364400416034343698200052150311163818, - 47747501180889292, - 3674441244733416, - 21888242871839275222246405745257275088548364400416034343698163278489775789838, - 21888242871839275222246405745257275088548364400416034343698145221705258060906, - 21888242871839275222246405745257275088548364400416034343698147880736864352614, - 2477592725204356, - 31120286136717859, - 15409911140283535, - 21888242871839275222246405745257275088548364400416034343698199816134616094877, - 39139883594287219, - 67688790525600428, - 21888242871839275222246405745257275088548364400416034343698157235793570394107, - 21888242871839275222246405745257275088548364400416034343698163939787522910861, - 68039005616039477, - 21888242871839275222246405745257275088548364400416034343698144034231603850975, - 53113807552499195, - 41557243241099383, - 21888242871839275222246405745257275088548364400416034343698181555466702862735, - 21888242871839275222246405745257275088548364400416034343698148683873639007200, - 21888242871839275222246405745257275088548364400416034343698180563333404948790, - 5751851122686544, - 27470171448504628, - 54676202614281633, - 21888242871839275222246405745257275088548364400416034343698199143884045469554, - 29326081985880346, - 21888242871839275222246405745257275088548364400416034343698140913648955799571, - 21888242871839275222246405745257275088548364400416034343698157332313569118456, - 17787222228936022, - 21888242871839275222246405745257275088548364400416034343698195263132396355689, - 21888242871839275222246405745257275088548364400416034343698166746790053283064, - 69935317439914940, - 9777761157295752, - 21888242871839275222246405745257275088548364400416034343698159322433505371450, - 9886885840692747, - 21888242871839275222246405745257275088548364400416034343698200611059077526144, - 50553945940549726, - 21888242871839275222246405745257275088548364400416034343698168930599994364528, - 8180254708857441, - 21888242871839275222246405745257275088548364400416034343698160515000432619754, - 21888242871839275222246405745257275088548364400416034343698174281778491600390, - 25614227722687532, - 69333777408537161, - 26588442130002824, - 27957903834396649, - 21888242871839275222246405745257275088548364400416034343698176585815217781423, - 70269680155336556, - 21888242871839275222246405745257275088548364400416034343698186432787262429207, - 21888242871839275222246405745257275088548364400416034343698202144739439999846, - 21888242871839275222246405745257275088548364400416034343698150775352861253064, - 21888242871839275222246405745257275088548364400416034343698190243596603141930, - 21888242871839275222246405745257275088548364400416034343698174753540021868339, - 48964277680448953, - 21888242871839275222246405745257275088548364400416034343698188736507016365262, - 21888242871839275222246405745257275088548364400416034343698143871121615663977, - 21888242871839275222246405745257275088548364400416034343698193821607580347520, - 21888242871839275222246405745257275088548364400416034343698186867237429128115, - 46637174597561108, - 21888242871839275222246405745257275088548364400416034343698197549177643399349, - 71581926823865474, - 21888242871839275222246405745257275088548364400416034343698174076820215218625, - 21888242871839275222246405745257275088548364400416034343698135507400258145272, - 14686152180846505, - 21888242871839275222246405745257275088548364400416034343698198619456218781574, - 21888242871839275222246405745257275088548364400416034343698140719401572868028, - 16090472348401064, - 21888242871839275222246405745257275088548364400416034343698158297467854868600, - 978045697031121, - 21888242871839275222246405745257275088548364400416034343698198434919955734226, - 32013910884871009, - 58951973028421591, - 21888242871839275222246405745257275088548364400416034343698172106392858836318, - 24350928369977866, - 30463864115546240, - 61555766900313476, - 21888242871839275222246405745257275088548364400416034343698202327494035817224, - 21888242871839275222246405745257275088548364400416034343698133929389315691155, - 25409052598864671, - 51469885524483854, - 62626178826639320, - 21888242871839275222246405745257275088548364400416034343698138921495686403793, - 21888242871839275222246405745257275088548364400416034343698173639838483447931, - 21888242871839275222246405745257275088548364400416034343698191874931973411882, - 9361121327258438, - 67092105845155586, - 21888242871839275222246405745257275088548364400416034343698149350879223707137, - 602796475894277, - 62428537878160843, - 21888242871839275222246405745257275088548364400416034343698146814108692099224, - 21888242871839275222246405745257275088548364400416034343698179943580614349093, - 56090341462341925, - 26401992610272010, - 21888242871839275222246405745257275088548364400416034343698141729933573431234, - 21888242871839275222246405745257275088548364400416034343698196955224122721435, - 27334043028518142, - 19034672384649261, - 51267480600682476, - 21888242871839275222246405745257275088548364400416034343698141949777652672114, - 62892022207087796, - 21888242871839275222246405745257275088548364400416034343698145525704507003008, - 21888242871839275222246405745257275088548364400416034343698140984454974463774, - 53552619508257185, - 20878160150369659, - 21888242871839275222246405745257275088548364400416034343698159159529906467035, - 70435018043991164, - 46558313126962361, - 58341730098780308, - 49570462037515499, - 29530126867122043, - 21888242871839275222246405745257275088548364400416034343698134187574603573524, - 21742857681316994, - 21888242871839275222246405745257275088548364400416034343698202978516355331588, - 21888242871839275222246405745257275088548364400416034343698135752196175991227, - 70654162383575315, - 3821969689413826, - 28995949763347003, - 21888242871839275222246405745257275088548364400416034343698203742429725784459, - 21888242871839275222246405745257275088548364400416034343698197258287880617272, - 2905299353294916, - 62001367618418954, - 21888242871839275222246405745257275088548364400416034343698189559018756614770, - 21888242871839275222246405745257275088548364400416034343698200653554723951363, - 21888242871839275222246405745257275088548364400416034343698200371966252034845, - 21888242871839275222246405745257275088548364400416034343698132623747790786543, - 57596586586684437, - 7212446240129143, - 20572954615024073, - 21888242871839275222246405745257275088548364400416034343698158133004730122338, - 21888242871839275222246405745257275088548364400416034343698202833582224062451, - 21888242871839275222246405745257275088548364400416034343698191020284841047835, - 44042963183716624, - 70350941111007182, - 21888242871839275222246405745257275088548364400416034343698149195641200046759, - 21888242871839275222246405745257275088548364400416034343698203097658718688399, - 50929870167894775, - 47253126747665529, - 21888242871839275222246405745257275088548364400416034343698132327163787439998, - 21888242871839275222246405745257275088548364400416034343698134998389007873975, - 21888242871839275222246405745257275088548364400416034343698177846827168516225, - 21888242871839275222246405745257275088548364400416034343698163837610133337355, - 21888242871839275222246405745257275088548364400416034343698162313271428596042, - 21888242871839275222246405745257275088548364400416034343698192541412102901932, - 21888242871839275222246405745257275088548364400416034343698149899021042618970, - 63231687023270616, - 57539720662834875, - 21888242871839275222246405745257275088548364400416034343698168119182795818037, - 9393036941799078, - 21888242871839275222246405745257275088548364400416034343698154431206929899082, - 21888242871839275222246405745257275088548364400416034343698134938987759481087, - 5626928521071851, - 2627786723876814, - 2410247523537910, - 21888242871839275222246405745257275088548364400416034343698176659613408570860, - 45649399387132412, - 21888242871839275222246405745257275088548364400416034343698152310120813277802, - 21888242871839275222246405745257275088548364400416034343698198607185761454219, - 15106252150709800, - 21888242871839275222246405745257275088548364400416034343698142713356221004278, - 19176919216169479, - 21888242871839275222246405745257275088548364400416034343698137646067349476503, - 56402214261594651, - 1714590812121392, - 36890141555045409, - 21888242871839275222246405745257275088548364400416034343698170052339269841187, - 21888242871839275222246405745257275088548364400416034343698150587645839443544, - 21888242871839275222246405745257275088548364400416034343698144507714623000245, - 34368472149193435, - 21888242871839275222246405745257275088548364400416034343698185106544712979294, - 21888242871839275222246405745257275088548364400416034343698183107047313788625, - 21888242871839275222246405745257275088548364400416034343698137194499783963541, - 29741340694365717, - 21888242871839275222246405745257275088548364400416034343698184882625804576547, - 21888242871839275222246405745257275088548364400416034343698196177829530533054, - 59163914257380320, - 21888242871839275222246405745257275088548364400416034343698190638683782137871, - 53767360892998311, - 3661273135079166, - 54889373198512345, - 21888242871839275222246405745257275088548364400416034343698161892880562386059, - 24970867910441034, - 21888242871839275222246405745257275088548364400416034343698153165467321929949, - 66898263065521048, - 21888242871839275222246405745257275088548364400416034343698145842236043590387, - 63720088145769312, - 40268856838525575, - 30476485325885468, - 21888242871839275222246405745257275088548364400416034343698147336517744884284, - 21888242871839275222246405745257275088548364400416034343698169290859320499309, - 21888242871839275222246405745257275088548364400416034343698177455937422768573, - 21888242871839275222246405745257275088548364400416034343698148541720415217703, - 21888242871839275222246405745257275088548364400416034343698191536752796888345, - 21983826335884412, - 49559060657924959, - 21888242871839275222246405745257275088548364400416034343698140475578048555176, - 21888242871839275222246405745257275088548364400416034343698162978045770465090, - 21888242871839275222246405745257275088548364400416034343698165114081949556058, - 43674793941172084, - 57046842321327293, - 61026768086598572, - 21888242871839275222246405745257275088548364400416034343698170248753157518792, - 21888242871839275222246405745257275088548364400416034343698195358512930116588, - 21888242871839275222246405745257275088548364400416034343698139664483214156338, - 21888242871839275222246405745257275088548364400416034343698161721649569449325, - 63406232892217715, - 2497947519686409, - 21888242871839275222246405745257275088548364400416034343698150226662378342902, - 21888242871839275222246405745257275088548364400416034343698188338946038043651, - 37781115638678554, - 16379229570367044, - 21888242871839275222246405745257275088548364400416034343698154676976703934679, - 48363357944842243, - 21888242871839275222246405745257275088548364400416034343698169004545903773781, - 21888242871839275222246405745257275088548364400416034343698154724759957185377, - 44852591688482585, - 34100280137209355, - 21888242871839275222246405745257275088548364400416034343698160698911628579289, - 51895982829883883, - 21888242871839275222246405745257275088548364400416034343698154927075752757008, - 21888242871839275222246405745257275088548364400416034343698152314002010640483, - 21888242871839275222246405745257275088548364400416034343698167638951350007474, - 21888242871839275222246405745257275088548364400416034343698140666937482095993, - 41245503057381331, - 21888242871839275222246405745257275088548364400416034343698145880117182016614, - 21888242871839275222246405745257275088548364400416034343698193281594254778890, - 21888242871839275222246405745257275088548364400416034343698145395635483127002, - 21888242871839275222246405745257275088548364400416034343698185510260943099653, - 21888242871839275222246405745257275088548364400416034343698135827776294544089, - 21888242871839275222246405745257275088548364400416034343698141802814300604782, - 33057966999042993, - 6602466087038307, - 46911318699767328, - 26880604386384156, - 21888242871839275222246405745257275088548364400416034343698162161361400627777, - 21888242871839275222246405745257275088548364400416034343698167085422048546048, - 29467217218587102, - 21888242871839275222246405745257275088548364400416034343698139396954337913967, - 1031811402532239, - 21888242871839275222246405745257275088548364400416034343698201155860790484792, - 21888242871839275222246405745257275088548364400416034343698199107610446223624, - 21888242871839275222246405745257275088548364400416034343698177455995540177826, - 21888242871839275222246405745257275088548364400416034343698171804975689916971, - 53810558398917969, - 21888242871839275222246405745257275088548364400416034343698201025132587230015, - 21888242871839275222246405745257275088548364400416034343698144512825676266186, - 21888242871839275222246405745257275088548364400416034343698144082657001153091, - 7078722289269552, - 22568124365195700, - 21888242871839275222246405745257275088548364400416034343698186306187582844944, - 21888242871839275222246405745257275088548364400416034343698186241601179009290, - 21888242871839275222246405745257275088548364400416034343698156796697314786942, - 21888242871839275222246405745257275088548364400416034343698202878082363399571, - 69694114367411930, - 46096572066849102, - 25051802417318524, - 64648388483077744, - 46013096356021138, - 21888242871839275222246405745257275088548364400416034343698193967215588943630, - 70283961355718542, - 21888242871839275222246405745257275088548364400416034343698179788883861613473, - 21888242871839275222246405745257275088548364400416034343698141892979464410969, - 21888242871839275222246405745257275088548364400416034343698193007769064986372, - 21888242871839275222246405745257275088548364400416034343698178489259250177133, - 21888242871839275222246405745257275088548364400416034343698198027550097459283, - 21888242871839275222246405745257275088548364400416034343698194068705533401628, - 24666755118018458, - 32211170536300326, - 48007103435081126, - 21888242871839275222246405745257275088548364400416034343698155768724869925759, - 21888242871839275222246405745257275088548364400416034343698195915684157278227, - 21888242871839275222246405745257275088548364400416034343698175040847913629467, - 21888242871839275222246405745257275088548364400416034343698194375802301965161, - 36594965937382699, - 21888242871839275222246405745257275088548364400416034343698146416924556733872, - 53377011731866598, - 13425224863405551, - 34473755294700688, - 21888242871839275222246405745257275088548364400416034343698177001646875790631, - 31648095196470622, - 42533004337589117, - 37694218162844419, - 34354727694897179, - 32025890168204579, - 49992923426400895, - 21888242871839275222246405745257275088548364400416034343698135697249134349707, - 21888242871839275222246405745257275088548364400416034343698133809252516172680, - 34883801141470048, - 68555841505551890, - 21888242871839275222246405745257275088548364400416034343698173268764913152975, - 37761888777922345, - 21888242871839275222246405745257275088548364400416034343698193567141611025477, - 19557430051429890, - 40781690684183285, - 21888242871839275222246405745257275088548364400416034343698168625887228580103, - 24141382849755127, - 21888242871839275222246405745257275088548364400416034343698158219272830767962, - 17409194490049181, - 67841306608190992, - 37616268373953323, - 21888242871839275222246405745257275088548364400416034343698141951221754598646, - 71417458256034228, - 21888242871839275222246405745257275088548364400416034343698194466767006944992, - 27614832260139297, - 27096261555290929, - 21888242871839275222246405745257275088548364400416034343698181800230470768392, - 61820820472116144, - 21888242871839275222246405745257275088548364400416034343698192419327894664285, - 22550212469438656, - 21888242871839275222246405745257275088548364400416034343698189066507099038856, - 58929726282535560, - 21888242871839275222246405745257275088548364400416034343698142370815353979269, - 32628450903681905, - 55499974778002751, - 21888242871839275222246405745257275088548364400416034343698148426021069964820, - 21888242871839275222246405745257275088548364400416034343698176176576363466856, - 12097054363690146, - 24678169550218411, - 21888242871839275222246405745257275088548364400416034343698153408694199317435, - 29822583208266371, - 21888242871839275222246405745257275088548364400416034343698133688159235121455, - 21888242871839275222246405745257275088548364400416034343698142891969646756428, - 21888242871839275222246405745257275088548364400416034343698156354918807103054, - 15722921509150391, - 68393592783503801, - 17089100869478562, - 21888242871839275222246405745257275088548364400416034343698172040157889901266, - 38339677191825486, - 9257211287918600, - 41186237000519835, - 60722672826729233, - 1497708166206076, - 21888242871839275222246405745257275088548364400416034343698171033053698863460, - 21888242871839275222246405745257275088548364400416034343698199791863061779657, - 2786357565515095, - 21888242871839275222246405745257275088548364400416034343698146729745105766826, - 31045016450584063, - 21888242871839275222246405745257275088548364400416034343698178858383956615536, - 12342768867082746, - 21888242871839275222246405745257275088548364400416034343698165323652684523186, - 21888242871839275222246405745257275088548364400416034343698140335163540208508, - 24059328461217875, - 21888242871839275222246405745257275088548364400416034343698180066459794969599, - 30536934271886296, - 20626039285901663, - 35059019373781891, - 26433347800935086, - 21888242871839275222246405745257275088548364400416034343698136068947004555689, - 21888242871839275222246405745257275088548364400416034343698179160025579506167, - 21888242871839275222246405745257275088548364400416034343698186680211904665728, - 24464925591290290, - 46598755782236773, - 21544226257382519, - 21888242871839275222246405745257275088548364400416034343698179551494556556624, - 54311978585825746, - 21888242871839275222246405745257275088548364400416034343698138935091801688368, - 21888242871839275222246405745257275088548364400416034343698202353437198697963, - 22739269719978935, - 21888242871839275222246405745257275088548364400416034343698156428649621557873, - 37582677965571377, - 21888242871839275222246405745257275088548364400416034343698175300522358083327, - 54675503938850709, - 21888242871839275222246405745257275088548364400416034343698143975000222852340, - 40575266855722319, - 21888242871839275222246405745257275088548364400416034343698174227268145287595, - 68757051473788447, - 9696849999443364, - 21888242871839275222246405745257275088548364400416034343698194221356833779942, - 21888242871839275222246405745257275088548364400416034343698149329725582132813, - 17330164730173978, - 21888242871839275222246405745257275088548364400416034343698133918561723929207, - 20694212830447630, - 37231569983762381, - 56655374423612238, - 23396600945561169, - 21888242871839275222246405745257275088548364400416034343698167738342290673870, - 18037260753477242, - 21888242871839275222246405745257275088548364400416034343698138051381928127231, - 31510781079640514, - 35152669617367860, - 21888242871839275222246405745257275088548364400416034343698158494436100626580, - 61314888216794652, - 21888242871839275222246405745257275088548364400416034343698141396096015495991, - 22221509029055024, - 21888242871839275222246405745257275088548364400416034343698199975720911674916, - 40546725591993348, - 21888242871839275222246405745257275088548364400416034343698175349368425431206, - 21888242871839275222246405745257275088548364400416034343698150657313631786283, - 18872450359635654, - 14728819634641493, - 21888242871839275222246405745257275088548364400416034343698203532302494320708, - 28185618332299102, - 21888242871839275222246405745257275088548364400416034343698171990301126833766, - 7073480737770797, - 21888242871839275222246405745257275088548364400416034343698171788816112596154, - 21888242871839275222246405745257275088548364400416034343698173383381844913008, - 37677756605232155, - 50008577103058593, - 21888242871839275222246405745257275088548364400416034343698143649342916442610, - 20626827248671758, - 21888242871839275222246405745257275088548364400416034343698149464434036278281, - 21888242871839275222246405745257275088548364400416034343698147811871401465343, - 21888242871839275222246405745257275088548364400416034343698165072941504660854, - 21888242871839275222246405745257275088548364400416034343698158018073670896514, - 21888242871839275222246405745257275088548364400416034343698136701972753302317, - 5111717709371698, - 45584425742891180, - 37704505455799609, - 21888242871839275222246405745257275088548364400416034343698176474665557721190, - 21888242871839275222246405745257275088548364400416034343698145222618869680849, - 21888242871839275222246405745257275088548364400416034343698150291879936031205, - 21888242871839275222246405745257275088548364400416034343698146198181126862351, - 21888242871839275222246405745257275088548364400416034343698165231106937822598, - 45807683439572566, - 21888242871839275222246405745257275088548364400416034343698196124133981806600, - 64428651888616388, - 21888242871839275222246405745257275088548364400416034343698144349728821634061, - 21888242871839275222246405745257275088548364400416034343698149618098501701960, - 50863911826695785, - 21888242871839275222246405745257275088548364400416034343698155968154026582626, - 21888242871839275222246405745257275088548364400416034343698136218195631252732, - 31857153207173386, - 16143782556563558, - 21888242871839275222246405745257275088548364400416034343698184046599647020259, - 21888242871839275222246405745257275088548364400416034343698181558566356807125, - 7329651370196232, - 19456150434382073, - 34978887394293045, - 59335446712869163, - 37690385481804832, - 47600400626813383, - 21888242871839275222246405745257275088548364400416034343698195217761791059085, - 21888242871839275222246405745257275088548364400416034343698186693238155823114, - 56463248457183648, - 21888242871839275222246405745257275088548364400416034343698179401460348186793, - 21888242871839275222246405745257275088548364400416034343698157045896275568737, - 21888242871839275222246405745257275088548364400416034343698157822302796059933, - 28679803552709280, - 36352668068217905, - 21888242871839275222246405745257275088548364400416034343698201787626986126324, - 21888242871839275222246405745257275088548364400416034343698143206464269621310, - 37911525286987935, - 21888242871839275222246405745257275088548364400416034343698149543946992661695, - 60512169411494347, - 2963243624410605, - 68993377120227776, - 57618622122172542, - 21888242871839275222246405745257275088548364400416034343698184324945246954464, - 26032950056127099, - 21888242871839275222246405745257275088548364400416034343698200213672873398678, - 21888242871839275222246405745257275088548364400416034343698160138106242274475, - 21888242871839275222246405745257275088548364400416034343698135534264145918927, - 21888242871839275222246405745257275088548364400416034343698197210591121529518, - 21888242871839275222246405745257275088548364400416034343698201784148752425260, - 29438382381826215, - 21888242871839275222246405745257275088548364400416034343698176415211962708891, - 71815668291816976, - 21888242871839275222246405745257275088548364400416034343698154322822347213456, - 21888242871839275222246405745257275088548364400416034343698138486715052597732, - 25900578366250801, - 20471390927774967, - 21888242871839275222246405745257275088548364400416034343698171050075049943258, - 21888242871839275222246405745257275088548364400416034343698145825999530569800, - 30097737133311671, - 52187349685480010, - 21888242871839275222246405745257275088548364400416034343698182704779172061509, - 21888242871839275222246405745257275088548364400416034343698166391584116024337, - 3547075620156095, - 21888242871839275222246405745257275088548364400416034343698190385753805546771, - 58708921797569755, - 67353558832057973, - 21888242871839275222246405745257275088548364400416034343698136790978413580028, - 21888242871839275222246405745257275088548364400416034343698195329597731453271, - 21888242871839275222246405745257275088548364400416034343698192492956391053654, - 21888242871839275222246405745257275088548364400416034343698155944939141151197, - 21888242871839275222246405745257275088548364400416034343698158893255260901523, - 22644620849603829, - 21888242871839275222246405745257275088548364400416034343698141598949351456627, - 31289112438475369, - 21888242871839275222246405745257275088548364400416034343698180172290597222312, - 21888242871839275222246405745257275088548364400416034343698201758569840057539, - 21888242871839275222246405745257275088548364400416034343698158890940755304469, - 21888242871839275222246405745257275088548364400416034343698185692921016026038, - 21888242871839275222246405745257275088548364400416034343698148510611743565866, - 21888242871839275222246405745257275088548364400416034343698155145861642405339, - 21888242871839275222246405745257275088548364400416034343698155069755118861632, - 25521292206482793, - 9987839675487904, - 21888242871839275222246405745257275088548364400416034343698143623268241344439, - 21888242871839275222246405745257275088548364400416034343698167692659169026303, - 21888242871839275222246405745257275088548364400416034343698141842497147855151, - 21888242871839275222246405745257275088548364400416034343698161313017541135097, - 21888242871839275222246405745257275088548364400416034343698194966703319668958, - 18309197875160837, - 21888242871839275222246405745257275088548364400416034343698188006406420218385, - 25849994984665502, - 12218246723344685, - 68565326813041047, - 21888242871839275222246405745257275088548364400416034343698137703131640331381, - 21888242871839275222246405745257275088548364400416034343698176830189925368619, - 21888242871839275222246405745257275088548364400416034343698170918017723559819, - 21896495604672601, - 62332414372246130, - 11966684002687188, - 21888242871839275222246405745257275088548364400416034343698146637714565778553, - 16345122201224542, - 31180776156830570, - 21888242871839275222246405745257275088548364400416034343698157840282890199993, - 21888242871839275222246405745257275088548364400416034343698190959446306954491, - 53420396470637374, - 21888242871839275222246405745257275088548364400416034343698178954635263246005, - 21888242871839275222246405745257275088548364400416034343698185234961625473489, - 22445906211293509, - 68579574332035544, - 59545625292458991, - 21888242871839275222246405745257275088548364400416034343698158251346005100353, - 21888242871839275222246405745257275088548364400416034343698175365559204942367, - 21888242871839275222246405745257275088548364400416034343698154852718710698617, - 21888242871839275222246405745257275088548364400416034343698190075887676283083, - 21888242871839275222246405745257275088548364400416034343698148784789360584326, - 21888242871839275222246405745257275088548364400416034343698187816972019640467, - 21888242871839275222246405745257275088548364400416034343698163874135939873255, - 21888242871839275222246405745257275088548364400416034343698180802686545213079, - 21888242871839275222246405745257275088548364400416034343698134792370767620962, - 6491543727397284, - 53951268972987246, - 46272952018536033, - 21888242871839275222246405745257275088548364400416034343698135962361628131219, - 21888242871839275222246405745257275088548364400416034343698174685222326169046, - 21888242871839275222246405745257275088548364400416034343698172811622902368921, - 21888242871839275222246405745257275088548364400416034343698145744349127999212, - 7010715182578871, - 44782407341341053, - 21888242871839275222246405745257275088548364400416034343698175631863797020957, - 52869199686991333, - 21888242871839275222246405745257275088548364400416034343698157493050419747612, - 21888242871839275222246405745257275088548364400416034343698145018495212093551, - 67409628411798772, - 35858037296887116, - 3913530870114320, - 53991996975325618, - 41100276668597885, - 21888242871839275222246405745257275088548364400416034343698159470750252958820, - 21888242871839275222246405745257275088548364400416034343698140202097696816738, - 21888242871839275222246405745257275088548364400416034343698166373160057595809, - 10120856035714675, - 27054120808813586, - 21888242871839275222246405745257275088548364400416034343698142911089571020154, - 34654546978423240, - 16548742669390443, - 60657134571222333, - 10970612543463717, - 21888242871839275222246405745257275088548364400416034343698150000683604231162, - 61144888353529951, - 21888242871839275222246405745257275088548364400416034343698162216724215244248, - 15982969896320180, - 23610536064429122, - 55744985805562611, - 15309066154872422, - 21888242871839275222246405745257275088548364400416034343698164594715228204188, - 21888242871839275222246405745257275088548364400416034343698144825258296981585, - 21888242871839275222246405745257275088548364400416034343698168365189523788797, - 21888242871839275222246405745257275088548364400416034343698140330984739893208, - 21888242871839275222246405745257275088548364400416034343698155145861358516261, - 21888242871839275222246405745257275088548364400416034343698177344718121710198, - 56826994400957916, - 32088401111644015, - 21888242871839275222246405745257275088548364400416034343698181502279025821541, - 21888242871839275222246405745257275088548364400416034343698201055457197350922, - 59199978048151095, - 21888242871839275222246405745257275088548364400416034343698165787454664100000, - 31793799028317832, - 21888242871839275222246405745257275088548364400416034343698176026910176271341, - 21888242871839275222246405745257275088548364400416034343698184187751657692825, - 19070852236448934, - 22282934039995973, - 29575554628245055, - 21888242871839275222246405745257275088548364400416034343698167850000599180012, - 64791363495112420, - 59629823299875376, - 21888242871839275222246405745257275088548364400416034343698160023972357121111, - 21888242871839275222246405745257275088548364400416034343698145887946712591348, - 21888242871839275222246405745257275088548364400416034343698152129314013679106, - 21888242871839275222246405745257275088548364400416034343698170382187567464918, - 21888242871839275222246405745257275088548364400416034343698140884777921179783, - 55686101272471091, - 30464928774695757, - 3019364930352649, - 24486577955054972, - 21888242871839275222246405745257275088548364400416034343698133573723209126174, - 11990460318108642, - 21888242871839275222246405745257275088548364400416034343698174134041667276113, - 21888242871839275222246405745257275088548364400416034343698154932347632621918, - 12404950714729596, - 57522850002613410, - 37117954582945868, - 21888242871839275222246405745257275088548364400416034343698194032581319615258, - 21888242871839275222246405745257275088548364400416034343698160208175277157354, - 21888242871839275222246405745257275088548364400416034343698193867486353461771, - 21888242871839275222246405745257275088548364400416034343698160191475989997277, - 38439371067702553, - 21888242871839275222246405745257275088548364400416034343698141149487362778814, - 47755293254708061, - 5227177126135170, - 28606959078340885, - 71353165893323703, - 21888242871839275222246405745257275088548364400416034343698157704667344786363, - 21888242871839275222246405745257275088548364400416034343698150786989530318145, - 21888242871839275222246405745257275088548364400416034343698194060618635007112, - 46001432116602339, - 38787524169054277, - 21888242871839275222246405745257275088548364400416034343698165233063366248117, - 21888242871839275222246405745257275088548364400416034343698155381908047601286, - 21888242871839275222246405745257275088548364400416034343698203852354177732919, - 21888242871839275222246405745257275088548364400416034343698167126895173865284, - 21888242871839275222246405745257275088548364400416034343698143877737475672841, - 21888242871839275222246405745257275088548364400416034343698151042167112429763, - 54273855258898025, - 21888242871839275222246405745257275088548364400416034343698135126679890566233, - 21888242871839275222246405745257275088548364400416034343698165665513553091885, - 21888242871839275222246405745257275088548364400416034343698187060065720667643, - 21888242871839275222246405745257275088548364400416034343698175726350438176874, - 7342215827001522, - 21888242871839275222246405745257275088548364400416034343698179703029027738512, - 37452935372165795, - 24493808474082937, - 42450571380345209, - 46683987088340755, - 6612421454054991, - 12679698792802465, - 21888242871839275222246405745257275088548364400416034343698161370791210507758, - 21888242871839275222246405745257275088548364400416034343698159748998590042447, - 53483692291138349, - 21888242871839275222246405745257275088548364400416034343698158985144136049171, - 39745595297629073, - 60195335733186798, - 58822190059772704, - 35545908782315678, - 21888242871839275222246405745257275088548364400416034343698147010481370855137, - 19529720398213685, - 23727204284791085, - 18493621574937620, - 21888242871839275222246405745257275088548364400416034343698185753785748375524, - 56934018798904728, - 21888242871839275222246405745257275088548364400416034343698192806410314809980, - 22328672269343414, - 21888242871839275222246405745257275088548364400416034343698169811302894273528, - 21888242871839275222246405745257275088548364400416034343698156290856668163093, - 71792144834876389, - 21888242871839275222246405745257275088548364400416034343698193302672564936137, - 22474445377566216, - 21888242871839275222246405745257275088548364400416034343698154502115067602150, - 67785230486346438, - 21888242871839275222246405745257275088548364400416034343698146634378144558573, - 11485454839264560, - 21888242871839275222246405745257275088548364400416034343698145017027404445264, - 53794269116424471, - 57058853656200236, - 32448568543495125, - 21888242871839275222246405745257275088548364400416034343698171560747389552675, - 21888242871839275222246405745257275088548364400416034343698200461493003539766, - 21888242871839275222246405745257275088548364400416034343698199296291836563829, - 21888242871839275222246405745257275088548364400416034343698190907177837224937, - 21888242871839275222246405745257275088548364400416034343698161244823190312201, - 21888242871839275222246405745257275088548364400416034343698161000284106849466, - 21888242871839275222246405745257275088548364400416034343698133173822016194933, - 21888242871839275222246405745257275088548364400416034343698171371014387127225, - 15814720122778979, - 40938970755063710, - 21888242871839275222246405745257275088548364400416034343698141704775930025671, - 21888242871839275222246405745257275088548364400416034343698136003658745511407, - 21888242871839275222246405745257275088548364400416034343698141737138358447003, - 4550809373310236, - 9467881761099179, - 5734741831578176, - 21888242871839275222246405745257275088548364400416034343698134628050058920852, - 33208460127268530, - 21888242871839275222246405745257275088548364400416034343698152871174156958359, - 67096900162403858, - 21888242871839275222246405745257275088548364400416034343698176304462734834408, - 21888242871839275222246405745257275088548364400416034343698186664000242459656, - 21888242871839275222246405745257275088548364400416034343698161713668647367819, - 51103305373193066, - 21888242871839275222246405745257275088548364400416034343698163203119726922218, - 25203290638609204, - 45280625887278305, - 21888242871839275222246405745257275088548364400416034343698163702641928763735, - 21888242871839275222246405745257275088548364400416034343698178489004787574647, - 21888242871839275222246405745257275088548364400416034343698176397556903439680, - 21888242871839275222246405745257275088548364400416034343698160075811187403562, - 21888242871839275222246405745257275088548364400416034343698165828416551535930, - 21888242871839275222246405745257275088548364400416034343698182377126903499832, - 21888242871839275222246405745257275088548364400416034343698158718650667063880, - 21888242871839275222246405745257275088548364400416034343698165997169568082281, - 16038773893696720, - 21888242871839275222246405745257275088548364400416034343698137417298968394514, - 45232092605796056, - 21888242871839275222246405745257275088548364400416034343698195891634694043260, - 21888242871839275222246405745257275088548364400416034343698165592819808576862, - 54931743035602617, - 42474929024837809, - 21888242871839275222246405745257275088548364400416034343698195470370780864367, - 65135006320059711, - 21888242871839275222246405745257275088548364400416034343698139714837506197803, - 15568956148459761, - 21888242871839275222246405745257275088548364400416034343698135215714120255436, - 42478906976714637, - 21888242871839275222246405745257275088548364400416034343698138621102653125957, - 64902241548248466, - 64416612972509887, - 21888242871839275222246405745257275088548364400416034343698176567235018246492, - 21888242871839275222246405745257275088548364400416034343698160483698816349754, - 21888242871839275222246405745257275088548364400416034343698180330248873041078, - 28612004216902785, - 21888242871839275222246405745257275088548364400416034343698146275020753179916, - 24095742234213202, - 21814055376062455, - 21888242871839275222246405745257275088548364400416034343698134067685574684025, - 68940296850196606, - 47036036690474418, - 21888242871839275222246405745257275088548364400416034343698142424200157166700, - 5456497343530427, - 21888242871839275222246405745257275088548364400416034343698159113516682349519, - 884209964612389, - 47035866451653376, - 44751458352658603, - 21888242871839275222246405745257275088548364400416034343698177218650405480805, - 21888242871839275222246405745257275088548364400416034343698164766639959066663, - 44924532714600847, - 67623513867945414, - 59143737566346550, - 68639428851652391, - 21888242871839275222246405745257275088548364400416034343698199779482364548033, - 12447277797665250, - 21888242871839275222246405745257275088548364400416034343698165820091576674232, - 21974739462521946, - 21888242871839275222246405745257275088548364400416034343698180928281164847761, - 21888242871839275222246405745257275088548364400416034343698168230198621333162, - 21888242871839275222246405745257275088548364400416034343698189021516736968114, - 49128258719254114, - 23764594536378554, - 21888242871839275222246405745257275088548364400416034343698150340881353127553, - 26054724110505701, - 21888242871839275222246405745257275088548364400416034343698138658794897544105, - 3937564850046208, - 21888242871839275222246405745257275088548364400416034343698171073262440863136, - 6260879670109432, - 21888242871839275222246405745257275088548364400416034343698159965892735285577, - 21888242871839275222246405745257275088548364400416034343698132696162636480365, - 7602009414109878, - 21888242871839275222246405745257275088548364400416034343698194644529960979266, - 33808668358969279, - 21888242871839275222246405745257275088548364400416034343698203530776458136636, - 21888242871839275222246405745257275088548364400416034343698146921769471918340, - 21888242871839275222246405745257275088548364400416034343698160921604096583364, - 49145727559940031, - 35330599843491416, - 21888242871839275222246405745257275088548364400416034343698158939908938641492, - 21888242871839275222246405745257275088548364400416034343698162108175505071352, - 71352855374265079, - 21888242871839275222246405745257275088548364400416034343698141102860612658881, - 21888242871839275222246405745257275088548364400416034343698139039064082247489, - 51678454989473020, - 30903626855030888, - 61889819660912645, - 21888242871839275222246405745257275088548364400416034343698165474247318709606, - 1415739076212960, - 21888242871839275222246405745257275088548364400416034343698148502486571988255, - 21888242871839275222246405745257275088548364400416034343698182029796325586164, - 42087393221196155, - 31399034890398428, - 30999202933163358, - 12511676404999138, - 21888242871839275222246405745257275088548364400416034343698189551030811082996, - 3735663140136016, - 21888242871839275222246405745257275088548364400416034343698167346540726274560, - 38378696934871247, - 64031226525738524, - 21888242871839275222246405745257275088548364400416034343698166272500158911233, - 18957740689909261, - 21888242871839275222246405745257275088548364400416034343698142124451843645668, - 21888242871839275222246405745257275088548364400416034343698200563464575452680, - 28866461371421481, - 58982560880493141, - 54040535019290854, - 62822350990067993, - 21888242871839275222246405745257275088548364400416034343698134087214708801216, - 21888242871839275222246405745257275088548364400416034343698154774715182780931, - 18178052228305654, - 23311774487196767, - 21888242871839275222246405745257275088548364400416034343698140991217939562523, - 21888242871839275222246405745257275088548364400416034343698192669844933134673, - 63444121694184157, - 27022486903474728, - 53736342131881408, - 21888242871839275222246405745257275088548364400416034343698185073169356317551, - 21888242871839275222246405745257275088548364400416034343698146419247574896756, - 21888242871839275222246405745257275088548364400416034343698167516106518717657, - 21888242871839275222246405745257275088548364400416034343698135626414370911368, - 21888242871839275222246405745257275088548364400416034343698145365362683277559, - 26434921930577913, - 66350739899716609, - 21888242871839275222246405745257275088548364400416034343698139632012047834714, - 21888242871839275222246405745257275088548364400416034343698187462199788473214, - 14311215782281580, - 68214743532228199, - 27451599705069156, - 53237285006925748, - 27757235613615093, - 30820666147241908, - 21888242871839275222246405745257275088548364400416034343698134247427222933699, - 21888242871839275222246405745257275088548364400416034343698141030079632195978, - 60924941402178699, - 21888242871839275222246405745257275088548364400416034343698172566493733444371, - 21888242871839275222246405745257275088548364400416034343698204093197335373559, - 68523844785759502, - 21888242871839275222246405745257275088548364400416034343698151105973411743047, - 57379529954535558, - 51159625540163606, - 21888242871839275222246405745257275088548364400416034343698142556624090731635, - 45864077506525885, - 21888242871839275222246405745257275088548364400416034343698143348381137891783, - 59009108429106975, - 50706547656194772, - 21888242871839275222246405745257275088548364400416034343698152701122377604282, - 21888242871839275222246405745257275088548364400416034343698201155589231580248, - 21888242871839275222246405745257275088548364400416034343698203755608413370111, - 21888242871839275222246405745257275088548364400416034343698200085433883694383, - 21888242871839275222246405745257275088548364400416034343698152002536140134024, - 39125951802815471, - 18388268847238197, - 21888242871839275222246405745257275088548364400416034343698195874365054023700, - 21888242871839275222246405745257275088548364400416034343698135286941822184354, - 40503277920170638, - 34908120845704552, - 21888242871839275222246405745257275088548364400416034343698151222244119138243, - 21888242871839275222246405745257275088548364400416034343698133121466197949287, - 55819728937114117, - 21888242871839275222246405745257275088548364400416034343698150271716282081645, - 21888242871839275222246405745257275088548364400416034343698166495683770934747, - 21888242871839275222246405745257275088548364400416034343698176209103689272835, - 21888242871839275222246405745257275088548364400416034343698133271358273871217, - 42504945413334791, - 21888242871839275222246405745257275088548364400416034343698157438785494774171, - 21888242871839275222246405745257275088548364400416034343698157712584981007190, - 26170880243799238, - 27139859223371267, - 21888242871839275222246405745257275088548364400416034343698199298599751344027, - 21888242871839275222246405745257275088548364400416034343698153839680164041151, - 13379959680584750, - 21888242871839275222246405745257275088548364400416034343698171012960469272507, - 21888242871839275222246405745257275088548364400416034343698172916535890119230, - 19816824165566043, - 21888242871839275222246405745257275088548364400416034343698169772459206596400, - 220712799644379, - 21888242871839275222246405745257275088548364400416034343698133868349485121157, - 48971234406499597, - 21888242871839275222246405745257275088548364400416034343698161605399743833275, - 35427927569164142, - 64203129269731551, - 21888242871839275222246405745257275088548364400416034343698179721165651754430, - 29037919936874398, - 21039444226295407, - 21888242871839275222246405745257275088548364400416034343698134031304416512932, - 21888242871839275222246405745257275088548364400416034343698194938357717912248, - 57513498672437952, - 49157156082987375, - 21888242871839275222246405745257275088548364400416034343698184023826595067891, - 54144375157531323, - 21888242871839275222246405745257275088548364400416034343698186344659698732273, - 21888242871839275222246405745257275088548364400416034343698195406787535055839, - 21888242871839275222246405745257275088548364400416034343698134838619294746604, - 21888242871839275222246405745257275088548364400416034343698191081605219600518, - 21043737352449875, - 21888242871839275222246405745257275088548364400416034343698136985787626726535, - 4536505637119133, - 21888242871839275222246405745257275088548364400416034343698170989582668722377, - 21888242871839275222246405745257275088548364400416034343698186023432921967986, - 1431723491402795, - 21888242871839275222246405745257275088548364400416034343698181420212743227318, - 21888242871839275222246405745257275088548364400416034343698185645262941132779, - 21888242871839275222246405745257275088548364400416034343698170028691817180695, - 33426297310274104, - 4847610009627345, - 22256151366125518, - 21888242871839275222246405745257275088548364400416034343698149007204395761651, - 21888242871839275222246405745257275088548364400416034343698143036531045912273, - 21888242871839275222246405745257275088548364400416034343698154240139986820379, - 6480726196367610, - 10472647519099017, - 21888242871839275222246405745257275088548364400416034343698142782035774918917, - 21888242871839275222246405745257275088548364400416034343698144218750979848993, - 21888242871839275222246405745257275088548364400416034343698148882940174662883, - 21888242871839275222246405745257275088548364400416034343698181518140403430970, - 34976132852695860, - 63253230658814174, - 16444263675962642, - 21604219810593832, - 21888242871839275222246405745257275088548364400416034343698198770333528115102, - 47372663144776728, - 9151354195848802, - 21888242871839275222246405745257275088548364400416034343698162587147296200322, - 9729810202797581, - 21888242871839275222246405745257275088548364400416034343698154866827598338895, - 21888242871839275222246405745257275088548364400416034343698200642854162761834, - 2122947162863054, - 21888242871839275222246405745257275088548364400416034343698197923845671521708, - 21888242871839275222246405745257275088548364400416034343698136404819345831623, - 56951711453718565, - 21888242871839275222246405745257275088548364400416034343698141438577245212310, - 13638518661871803, - 21888242871839275222246405745257275088548364400416034343698179265042116287448, - 21888242871839275222246405745257275088548364400416034343698142910226598906335, - 21888242871839275222246405745257275088548364400416034343698198110376964808714, - 70810447509916749, - 65269062573574919, - 21888242871839275222246405745257275088548364400416034343698139337192428676498, - 61964489076126472, - 21888242871839275222246405745257275088548364400416034343698170249557507727571, - 29922748140342636, - 21888242871839275222246405745257275088548364400416034343698196759945563378857, - 21888242871839275222246405745257275088548364400416034343698190214982200675633, - 21888242871839275222246405745257275088548364400416034343698143513668591201549, - 21888242871839275222246405745257275088548364400416034343698178751436955778232, - 21888242871839275222246405745257275088548364400416034343698152866964086865394, - 21888242871839275222246405745257275088548364400416034343698189277684361258743, - 15155552057560699, - 21888242871839275222246405745257275088548364400416034343698137406890115804426, - 20638919587569245, - 53603102269274359, - 36296980034956565, - 66365162774059356, - 21888242871839275222246405745257275088548364400416034343698170870944506588670, - 21888242871839275222246405745257275088548364400416034343698188849155211186664, - 52854441667445900, - 15397071499956405, - 16110915871587767, - 21888242871839275222246405745257275088548364400416034343698156089064337199330, - 21888242871839275222246405745257275088548364400416034343698160666068196122409, - 61788960377946771, - 21888242871839275222246405745257275088548364400416034343698198411484025774630, - 8471183202186760, - 22943073659076668, - 21888242871839275222246405745257275088548364400416034343698199828591598179620, - 21888242871839275222246405745257275088548364400416034343698139981558289006952, - 35213512851293348, - 21888242871839275222246405745257275088548364400416034343698168129559758587440, - 49726867266925896, - 21888242871839275222246405745257275088548364400416034343698169811821994007071, - 11155444587764328, - 38623855762882152, - 64950811122165696, - 60057307887618398, - 6467100990471099, - 21888242871839275222246405745257275088548364400416034343698147352438766746580, - 29520452447807847, - 21888242871839275222246405745257275088548364400416034343698193835292179820364, - 28919517300878106, - 1888333516192569, - 21888242871839275222246405745257275088548364400416034343698145467779973842413, - 5134842058120802, - 62578772860903093, - 42519709129583058, - 21888242871839275222246405745257275088548364400416034343698167880558665896231, - 21888242871839275222246405745257275088548364400416034343698173749418393460067, - 21888242871839275222246405745257275088548364400416034343698170182460141158226, - 21888242871839275222246405745257275088548364400416034343698194989806360842119, - 21888242871839275222246405745257275088548364400416034343698198552843246399023, - 21888242871839275222246405745257275088548364400416034343698133161802566011380, - 10414125175927828, - 21888242871839275222246405745257275088548364400416034343698179533617029651641, - 21888242871839275222246405745257275088548364400416034343698201828776200386350, - 21888242871839275222246405745257275088548364400416034343698138853756181013427, - 21888242871839275222246405745257275088548364400416034343698142742088149313632, - 21888242871839275222246405745257275088548364400416034343698192857565260010277, - 1104497871025489, - 21888242871839275222246405745257275088548364400416034343698150141488987884742, - 11954685558708693, - 21888242871839275222246405745257275088548364400416034343698198923269650082160, - 21888242871839275222246405745257275088548364400416034343698151771910018932520, - 20408769766225775, - 21888242871839275222246405745257275088548364400416034343698188440592235699936, - 21888242871839275222246405745257275088548364400416034343698186676927541290472, - 21888242871839275222246405745257275088548364400416034343698199021933158981615, - 21888242871839275222246405745257275088548364400416034343698174285768224221352, - 21888242871839275222246405745257275088548364400416034343698158101717712709709, - 21888242871839275222246405745257275088548364400416034343698191087492082981242, - 40519886565268162, - 21888242871839275222246405745257275088548364400416034343698148363453675628512, - 58031766445842876, - 21888242871839275222246405745257275088548364400416034343698158084774007437527, - 21888242871839275222246405745257275088548364400416034343698134149379515482934, - 21888242871839275222246405745257275088548364400416034343698144094985959602190, - 899803225618407, - 21888242871839275222246405745257275088548364400416034343698167433804686389679, - 21888242871839275222246405745257275088548364400416034343698133784887830976785, - 21888242871839275222246405745257275088548364400416034343698198405895303417093, - 66728688064688140, - 21888242871839275222246405745257275088548364400416034343698181277224366816228, - 682035868525572, - 10027461269775525, - 21888242871839275222246405745257275088548364400416034343698136758378870750705, - 21888242871839275222246405745257275088548364400416034343698185336962065831687, - 21888242871839275222246405745257275088548364400416034343698187473604464095197, - 5267785470115469, - 56505730202955553, - 62181495422442430, - 10139917588122370, - 4881606708593771, - 55287063324056493, - 34646185874013403, - 21888242871839275222246405745257275088548364400416034343698132619365670450022, - 60939959794700787, - 28134022284828236, - 64656996331218098, - 6783663047553916, - 21888242871839275222246405745257275088548364400416034343698161128546776752868, - 21888242871839275222246405745257275088548364400416034343698155765873501358285, - 23659349482728918, - 21888242871839275222246405745257275088548364400416034343698193599833371177408, - 39503434566267551, - 21888242871839275222246405745257275088548364400416034343698179689090360654415, - 69182211930687186, - 21888242871839275222246405745257275088548364400416034343698169516935126177723, - 21888242871839275222246405745257275088548364400416034343698150635630047218771, - 21888242871839275222246405745257275088548364400416034343698157652452807574156, - 21888242871839275222246405745257275088548364400416034343698164528856525631659, - 17003831781315200, - 23597255437568364, - 21888242871839275222246405745257275088548364400416034343698193783173268964106, - 5189485336840331, - 66001662745990278, - 29307003272346248, - 21888242871839275222246405745257275088548364400416034343698201977754701433735, - 23338991187695069, - 21888242871839275222246405745257275088548364400416034343698161682422511686100, - 21888242871839275222246405745257275088548364400416034343698141945155237177305, - 21888242871839275222246405745257275088548364400416034343698152946019986732712, - 21888242871839275222246405745257275088548364400416034343698191584756151162213, - 21888242871839275222246405745257275088548364400416034343698161598931780588808, - 21888242871839275222246405745257275088548364400416034343698172021388305880822, - 10139784050505730, - 21888242871839275222246405745257275088548364400416034343698147874547503972344, - 21888242871839275222246405745257275088548364400416034343698165460765709886197, - 21888242871839275222246405745257275088548364400416034343698160847569641675451, - 57533876880758423, - 21888242871839275222246405745257275088548364400416034343698195335757711840318, - 44166496904998918, - 21888242871839275222246405745257275088548364400416034343698190323662516045569, - 21888242871839275222246405745257275088548364400416034343698142219563058313190, - 66459498412922120, - 60387193101066185, - 21888242871839275222246405745257275088548364400416034343698136947689035077664, - 21888242871839275222246405745257275088548364400416034343698169687560294673983, - 12822373140513567, - 21888242871839275222246405745257275088548364400416034343698201334168910476069, - 51043546949656184, - 29770975825293887, - 65872468993738185, - 45118625735072621, - 21888242871839275222246405745257275088548364400416034343698203901162246747016, - 12489095066925982, - 38186912717188563, - 18959273847464832, - 21888242871839275222246405745257275088548364400416034343698176376830632039195, - 21888242871839275222246405745257275088548364400416034343698183816634723258898, - 8870519383803469, - 2706658782072900, - 65163184109575510, - 52453450716481247, - 37574794984402584, - 42704086876065066, - 65890813485071225, - 21888242871839275222246405745257275088548364400416034343698133344997868190929, - 21888242871839275222246405745257275088548364400416034343698164819618768426415, - 69973180017032338, - 3035580050454047, - 25865351157254794, - 21888242871839275222246405745257275088548364400416034343698154442593482344744, - 21888242871839275222246405745257275088548364400416034343698183161299932730633, - 21888242871839275222246405745257275088548364400416034343698178882508709805534, - 69403224732953310, - 21888242871839275222246405745257275088548364400416034343698193510297779796327, - 21888242871839275222246405745257275088548364400416034343698184529874691423506, - 70686713452148787, - 21888242871839275222246405745257275088548364400416034343698153430544670782344, - 21888242871839275222246405745257275088548364400416034343698164814345544006742, - 40833124836006632, - 21888242871839275222246405745257275088548364400416034343698139284492812687742, - 21888242871839275222246405745257275088548364400416034343698137419507334720940, - 21888242871839275222246405745257275088548364400416034343698177404554125314752, - 60723616662955181, - 36864321309837862, - 21888242871839275222246405745257275088548364400416034343698162724796902988170, - 22670485801007130, - 62974672200099413, - 21888242871839275222246405745257275088548364400416034343698141934145180513627, - 21888242871839275222246405745257275088548364400416034343698178315381743651037, - 21888242871839275222246405745257275088548364400416034343698169765454785134085, - 21888242871839275222246405745257275088548364400416034343698193816051665364291, - 24273728104315618, - 67210045399454725, - 40934729582478179, - 18934210967032020, - 66445769281802721, - 20646359471990431, - 3908284233285016, - 21888242871839275222246405745257275088548364400416034343698147992252513589682, - 59485311143953871, - 41122178491496686, - 21888242871839275222246405745257275088548364400416034343698180343335879768130, - 21888242871839275222246405745257275088548364400416034343698183188114028634526, - 15973905126653790, - 31742877482744967, - 21888242871839275222246405745257275088548364400416034343698156417734233104535, - 21888242871839275222246405745257275088548364400416034343698188983968829178821, - 21888242871839275222246405745257275088548364400416034343698144554655100487147, - 61627754904771957, - 21888242871839275222246405745257275088548364400416034343698172822877083953357, - 30635487321153290, - 39872889265103723, - 21888242871839275222246405745257275088548364400416034343698197452592417874817, - 21888242871839275222246405745257275088548364400416034343698169915867358893789, - 21888242871839275222246405745257275088548364400416034343698138657617918103629, - 21888242871839275222246405745257275088548364400416034343698171866764147683841, - 48493791334495328, - 24491018106255863, - 21888242871839275222246405745257275088548364400416034343698152113218020806462, - 21888242871839275222246405745257275088548364400416034343698189024738970814609, - 21888242871839275222246405745257275088548364400416034343698201382723149103596, - 21888242871839275222246405745257275088548364400416034343698180604948589387488, - 21888242871839275222246405745257275088548364400416034343698159360302769289216, - 21432183468901478, - 21888242871839275222246405745257275088548364400416034343698162509553339008610, - 37806876172606711, - 21888242871839275222246405745257275088548364400416034343698147522218072275688, - 60777957049986797, - 21888242871839275222246405745257275088548364400416034343698165920891285069982, - 6803855976614348, - 21888242871839275222246405745257275088548364400416034343698173461745559815038, - 21888242871839275222246405745257275088548364400416034343698162288676554617994, - 28590735489283843, - 21888242871839275222246405745257275088548364400416034343698198556073982874607, - 44799841764139579, - 48485185504444489, - 20327959281877356, - 5470588982222470, - 21888242871839275222246405745257275088548364400416034343698133057199365924871, - 32939461346040384, - 21888242871839275222246405745257275088548364400416034343698189801932428682671, - 21888242871839275222246405745257275088548364400416034343698143455096855594667, - 21888242871839275222246405745257275088548364400416034343698197638820512121459, - 21888242871839275222246405745257275088548364400416034343698202221605991311974, - 21888242871839275222246405745257275088548364400416034343698142675229421687195, - 21888242871839275222246405745257275088548364400416034343698159794551829302801, - 21888242871839275222246405745257275088548364400416034343698193735049854424796, - 21888242871839275222246405745257275088548364400416034343698151722103366545612, - 10839423838564779, - 21888242871839275222246405745257275088548364400416034343698139551052369039898, - 21888242871839275222246405745257275088548364400416034343698179513662507216114, - 21888242871839275222246405745257275088548364400416034343698147450699195401469, - 21888242871839275222246405745257275088548364400416034343698157026157044368782, - 21888242871839275222246405745257275088548364400416034343698163550972926185903, - 21888242871839275222246405745257275088548364400416034343698178744445493241333, - 21888242871839275222246405745257275088548364400416034343698132787914518974090, - 21888242871839275222246405745257275088548364400416034343698167593388050423614, - 22135873688004649, - 37983332507553446, - 24332070389829972, - 21888242871839275222246405745257275088548364400416034343698161600119418225557, - 48079600569702676, - 6457976949791882, - 21888242871839275222246405745257275088548364400416034343698142137231425985796, - 21888242871839275222246405745257275088548364400416034343698191700229585573363, - 21888242871839275222246405745257275088548364400416034343698168679940390134035, - 24038945621220206, - 21888242871839275222246405745257275088548364400416034343698133626210955460135, - 58830084762620361, - 21888242871839275222246405745257275088548364400416034343698144986078588553508, - 21888242871839275222246405745257275088548364400416034343698145292796305913182, - 57940735336461868, - 21888242871839275222246405745257275088548364400416034343698176163471583817020, - 21888242871839275222246405745257275088548364400416034343698134375825682055400, - 44590593518787821, - 21888242871839275222246405745257275088548364400416034343698176891167027715346, - 35638053307396182, - 65432747244949598, - 21888242871839275222246405745257275088548364400416034343698150549304170958453, - 12920609907558207, - 21888242871839275222246405745257275088548364400416034343698180944729204203457, - 21888242871839275222246405745257275088548364400416034343698170853705478138057, - 21888242871839275222246405745257275088548364400416034343698191728629304048164, - 5388204328440825, - 47595017342396821, - 21888242871839275222246405745257275088548364400416034343698143409028361046842, - 21888242871839275222246405745257275088548364400416034343698167861986845499736, - 62410275973127197, - 21888242871839275222246405745257275088548364400416034343698172860507520016300, - 56737303215813144, - 27031282219517945, - 70595426420654807, - 21888242871839275222246405745257275088548364400416034343698201509305508926221, - 57471263590495897, - 3182667732145931, - 8595252367373279, - 24637779776353479, - 61905561572297858, - 21888242871839275222246405745257275088548364400416034343698144996508174276815, - 68547697907121449, - 20038772862526135, - 35133667914134662, - 21888242871839275222246405745257275088548364400416034343698139011425565640011, - 21888242871839275222246405745257275088548364400416034343698132382214051165138, - 37364887722215316, - 27252480110968444, - 34150593516867215, - 21888242871839275222246405745257275088548364400416034343698135549657859166416, - 30551385339692784, - 21888242871839275222246405745257275088548364400416034343698152111759064066429, - 38079487574738101, - 10141726705754961, - 21888242871839275222246405745257275088548364400416034343698135815989926732499, - 21888242871839275222246405745257275088548364400416034343698171265219317307364, - 21888242871839275222246405745257275088548364400416034343698185151989305086129, - 37123188126054066, - 21888242871839275222246405745257275088548364400416034343698155713646132516708, - 21888242871839275222246405745257275088548364400416034343698155364644769810540, - 21888242871839275222246405745257275088548364400416034343698153429370296274991, - 21888242871839275222246405745257275088548364400416034343698194076390894094749, - 21888242871839275222246405745257275088548364400416034343698170733073046760527, - 21888242871839275222246405745257275088548364400416034343698143199298529654623, - 15920551872253866, - 43897301799076272, - 21888242871839275222246405745257275088548364400416034343698182859298907412922, - 21888242871839275222246405745257275088548364400416034343698183906100092114482, - 12874513570602451, - 22656539492108109, - 21888242871839275222246405745257275088548364400416034343698177866507793249984, - 16083128275831313, - 13848622954827031, - 71386058957627620, - 1291546290297189, - 21888242871839275222246405745257275088548364400416034343698138123362151295115, - 21888242871839275222246405745257275088548364400416034343698173093365275821496, - 21888242871839275222246405745257275088548364400416034343698145614812084102998, - 68912801993504886, - 42912199585305430, - 21888242871839275222246405745257275088548364400416034343698140183409653586136, - 28999083007889272, - 37070221018335305, - 34617945620012879, - 35026360083709194, - 37573882542632092, - 7297393851143679, - 21888242871839275222246405745257275088548364400416034343698175923488849810354, - 17519448875117966, - 2201119534071121, - 21888242871839275222246405745257275088548364400416034343698147819851880321201, - 29122185729947180, - 21888242871839275222246405745257275088548364400416034343698178727417720669326, - 16365150643975703, - 21888242871839275222246405745257275088548364400416034343698190072729456960901, - 21888242871839275222246405745257275088548364400416034343698155214832496178938, - 41233666834733495, - 21888242871839275222246405745257275088548364400416034343698174307232093821398, - 21888242871839275222246405745257275088548364400416034343698164760174640054969, - 301541802128083, - 21888242871839275222246405745257275088548364400416034343698167352506678372728, - 15957787177171353, - 21888242871839275222246405745257275088548364400416034343698168756811727176120, - 21888242871839275222246405745257275088548364400416034343698180590744297644089, - 21888242871839275222246405745257275088548364400416034343698180429341667337818, - 21888242871839275222246405745257275088548364400416034343698195214692155912160, - 21888242871839275222246405745257275088548364400416034343698172778882341722065, - 21888242871839275222246405745257275088548364400416034343698181693876539662787, - 43558097016693156, - 1643633439713610, - 21888242871839275222246405745257275088548364400416034343698157593100960520258, - 60983957989791686, - 21888242871839275222246405745257275088548364400416034343698167903163009368040, - 21888242871839275222246405745257275088548364400416034343698152065017986883584, - 8188123238575831, - 30402932822038427, - 21888242871839275222246405745257275088548364400416034343698189359367258229448, - 21888242871839275222246405745257275088548364400416034343698132705827174915728, - 31118967691717553, - 21888242871839275222246405745257275088548364400416034343698158319132035982749, - 14998503043452973, - 32340873071504740, - 21888242871839275222246405745257275088548364400416034343698140258900345067148, - 40788485051293891, - 13480203480226155, - 16379610373572737, - 67403513352744082, - 17383768520407935, - 21888242871839275222246405745257275088548364400416034343698164680880500210283, - 15018184962501863, - 13558036771658377, - 21888242871839275222246405745257275088548364400416034343698192382312570674302, - 21888242871839275222246405745257275088548364400416034343698187365267100205509, - 38020676806288118, - 21888242871839275222246405745257275088548364400416034343698203603873942536559, - 21888242871839275222246405745257275088548364400416034343698203456489451359339, - 21888242871839275222246405745257275088548364400416034343698199938465761581786, - 21888242871839275222246405745257275088548364400416034343698182852140631073806, - 33088242711360741, - 46553291289893187, - 21888242871839275222246405745257275088548364400416034343698158726171589031501, - 21888242871839275222246405745257275088548364400416034343698162421333121647916, - 37784371298170795, - 21888242871839275222246405745257275088548364400416034343698168325640358864097, - 56095240861102912, - 36800767691961953, - 21888242871839275222246405745257275088548364400416034343698157402374378712773, - 29559838936417993, - 49164551534713544, - 59583075872725738, - 36142590003766397, - 21888242871839275222246405745257275088548364400416034343698145828463859946636, - 32429327141188518, - 443240902461762, - 61891547353498125, - 21888242871839275222246405745257275088548364400416034343698180272229078369836, - 21888242871839275222246405745257275088548364400416034343698139343095676383343, - 21888242871839275222246405745257275088548364400416034343698172197724211371444, - 21888242871839275222246405745257275088548364400416034343698144664030852439082, - 21888242871839275222246405745257275088548364400416034343698168120761542195252, - 46635224033430883, - 3558818718115226, - 21888242871839275222246405745257275088548364400416034343698157077534491500158, - 21888242871839275222246405745257275088548364400416034343698177300101471939654, - 21888242871839275222246405745257275088548364400416034343698167956021279361812, - 57566249659072365, - 10525471051509006, - 21888242871839275222246405745257275088548364400416034343698168450007921798153, - 21888242871839275222246405745257275088548364400416034343698142287159258520297, - 21888242871839275222246405745257275088548364400416034343698169117008527245166, - 21888242871839275222246405745257275088548364400416034343698157229740701987229, - 57546724456698905, - 19518960258721491, - 15632663196255137, - 51203627403469601, - 21888242871839275222246405745257275088548364400416034343698191020647751353038, - 20718137010298704, - 32599171470969627, - 5442154668773218, - 21888242871839275222246405745257275088548364400416034343698188095116043329617, - 62522691310994885, - 21888242871839275222246405745257275088548364400416034343698134462889586075156, - 21888242871839275222246405745257275088548364400416034343698182988380839909534, - 21888242871839275222246405745257275088548364400416034343698185397967507254359, - 40646560614049226, - 21888242871839275222246405745257275088548364400416034343698160586098510829376, - 21888242871839275222246405745257275088548364400416034343698194492928781630422, - 21888242871839275222246405745257275088548364400416034343698156301736984941620, - 21888242871839275222246405745257275088548364400416034343698132584339141780878, - 42372794954685230, - 40267823361074581, - 21888242871839275222246405745257275088548364400416034343698135788021220376891, - 47968317798709978, - 15134610555796228, - 25330996526924509, - 21888242871839275222246405745257275088548364400416034343698166792167449207990, - 61784130620930773, - 21888242871839275222246405745257275088548364400416034343698176541032265082509, - 21888242871839275222246405745257275088548364400416034343698183205512660243423, - 21888242871839275222246405745257275088548364400416034343698189718650738458781, - 61441319421815993, - 21888242871839275222246405745257275088548364400416034343698142006757890647215, - 21888242871839275222246405745257275088548364400416034343698192497520598812193, - 21888242871839275222246405745257275088548364400416034343698144012042010692059, - 21888242871839275222246405745257275088548364400416034343698150616252458765075, - 21888242871839275222246405745257275088548364400416034343698150718785020018367, - 21888242871839275222246405745257275088548364400416034343698184275196375925280, - 21888242871839275222246405745257275088548364400416034343698193305627943172745, - 42876647683393543, - 21888242871839275222246405745257275088548364400416034343698183021374967727099, - 21888242871839275222246405745257275088548364400416034343698137267163326978567, - 21888242871839275222246405745257275088548364400416034343698154791850213314896, - 21888242871839275222246405745257275088548364400416034343698148695034939675052, - 11566045037557688, - 21888242871839275222246405745257275088548364400416034343698177850265438448236, - 1103870491317054, - 20723229400029395, - 2757218946853679, - 58777363253728536, - 17548817981759960, - 42749452251217132, - 21888242871839275222246405745257275088548364400416034343698175149345077519022, - 21888242871839275222246405745257275088548364400416034343698184846785972652634, - 21888242871839275222246405745257275088548364400416034343698161664929252646460, - 39394408416895497, - 47874542340898015, - 40060369784296528, - 21888242871839275222246405745257275088548364400416034343698188683602108112412, - 21888242871839275222246405745257275088548364400416034343698202805527903827699, - 21888242871839275222246405745257275088548364400416034343698184172482961985132, - 65980772362376987, - 56431850001654788, - 56380152016407417, - 31348399554798988, - 54509503587879648, - 39989918514255115, - 21888242871839275222246405745257275088548364400416034343698149409719024459068, - 21888242871839275222246405745257275088548364400416034343698155672500480322988, - 21888242871839275222246405745257275088548364400416034343698153627240268850392, - 21888242871839275222246405745257275088548364400416034343698133659478828705321, - 10473942883667385, - 70938149266587569, - 16996155963162245, - 64006376282288308, - 5604357817589209, - 21888242871839275222246405745257275088548364400416034343698136992516764329957, - 21888242871839275222246405745257275088548364400416034343698201183500666306059, - 41960339449945403, - 23061400487130455, - 21888242871839275222246405745257275088548364400416034343698200811739137128730, - 21888242871839275222246405745257275088548364400416034343698165358015967868531, - 24978785399865450, - 21888242871839275222246405745257275088548364400416034343698161334192882475360, - 21888242871839275222246405745257275088548364400416034343698151285338669218096, - 21888242871839275222246405745257275088548364400416034343698141597808940685599, - 21888242871839275222246405745257275088548364400416034343698163788790819022675, - 21888242871839275222246405745257275088548364400416034343698155249901390260627, - 21888242871839275222246405745257275088548364400416034343698143063524607939979, - 21888242871839275222246405745257275088548364400416034343698155620297696102376, - 8239507430060206, - 65365711440041468, - 5571927023835052, - 21888242871839275222246405745257275088548364400416034343698171200569791676567, - 21888242871839275222246405745257275088548364400416034343698134632268086054128, - 28221967800791854, - 21888242871839275222246405745257275088548364400416034343698158600187033881235, - 17518097874429237, - 61913411907439356, - 13486833417671027, - 21888242871839275222246405745257275088548364400416034343698172738633182121343, - 21888242871839275222246405745257275088548364400416034343698191186273469321876, - 21888242871839275222246405745257275088548364400416034343698171645340311515580, - 21888242871839275222246405745257275088548364400416034343698203116441886625193, - 21888242871839275222246405745257275088548364400416034343698138136629414310349, - 21888242871839275222246405745257275088548364400416034343698188503257309844320, - 61103232918147213, - 8217620810306781, - 21888242871839275222246405745257275088548364400416034343698188119967664097884, - 62429592248760293, - 21888242871839275222246405745257275088548364400416034343698203716102974867529, - 21888242871839275222246405745257275088548364400416034343698144245419887039832, - 21888242871839275222246405745257275088548364400416034343698172445594340955241, - 21888242871839275222246405745257275088548364400416034343698174506160318721688, - 21888242871839275222246405745257275088548364400416034343698197135723649956321, - 68306035666120614, - 21888242871839275222246405745257275088548364400416034343698179180954963005755, - 21888242871839275222246405745257275088548364400416034343698171677699402580120, - 24096335529555529, - 21888242871839275222246405745257275088548364400416034343698191650990822732323, - 21888242871839275222246405745257275088548364400416034343698171808110396214317, - 52503032203114108, - 32568329999480989, - 21888242871839275222246405745257275088548364400416034343698186265475195981884, - 21888242871839275222246405745257275088548364400416034343698169245480369743527, - 68471353168302555, - 21888242871839275222246405745257275088548364400416034343698147629703412048275, - 21888242871839275222246405745257275088548364400416034343698137119656471797473, - 21888242871839275222246405745257275088548364400416034343698151845020543506574, - 18278657577123440, - 13289857635875305, - 988761483494010, - 4705614823210731, - 64817774101754750, - 21888242871839275222246405745257275088548364400416034343698176228129586931138, - 21888242871839275222246405745257275088548364400416034343698156846114940350131, - 21888242871839275222246405745257275088548364400416034343698152490247551928851, - 66591342644052477, - 21888242871839275222246405745257275088548364400416034343698173489821357496839, - 21888242871839275222246405745257275088548364400416034343698181324358859308053, - 33500967169483438, - 31419519311721197, - 9703393133251265, - 48075148560537001, - 72020391382938172, - 21888242871839275222246405745257275088548364400416034343698132436411603946745, - 21888242871839275222246405745257275088548364400416034343698191390037963457010, - 21888242871839275222246405745257275088548364400416034343698159305204294744135, - 48734085350108428, - 61576218786217329, - 21888242871839275222246405745257275088548364400416034343698150931526012642236, - 21888242871839275222246405745257275088548364400416034343698145801051102846250, - 21888242871839275222246405745257275088548364400416034343698188758935617472063, - 21888242871839275222246405745257275088548364400416034343698178319789726329004, - 21888242871839275222246405745257275088548364400416034343698152734841766185425, - 24367726815046153, - 21888242871839275222246405745257275088548364400416034343698149866208993708213, - 21888242871839275222246405745257275088548364400416034343698165782665446567156, - 44688475938231258, - 21888242871839275222246405745257275088548364400416034343698157185931753866937, - 21888242871839275222246405745257275088548364400416034343698146338767707335166, - 21888242871839275222246405745257275088548364400416034343698198747418002344527, - 34696968244834613, - 21888242871839275222246405745257275088548364400416034343698160162762612565275, - 62843593774987714, - 21888242871839275222246405745257275088548364400416034343698161038566882145834, - 21146038099096603, - 56926402291521235, - 31103982404496317, - 21888242871839275222246405745257275088548364400416034343698163098085984215013, - 21888242871839275222246405745257275088548364400416034343698133324119737288355, - 1087589877555927, - 21888242871839275222246405745257275088548364400416034343698182306816622458174, - 71598415559578445, - 64488956051631553, - 21888242871839275222246405745257275088548364400416034343698178405854118577763, - 41037092001131724, - 27356051269139223, - 21888242871839275222246405745257275088548364400416034343698191845740671391370, - 33879963066694346, - 56506664261364674, - 21888242871839275222246405745257275088548364400416034343698193918716028445302, - 21888242871839275222246405745257275088548364400416034343698201097489322864766, - 16325255887859742, - 21888242871839275222246405745257275088548364400416034343698162402807390776643, - 49216579781421747, - 21888242871839275222246405745257275088548364400416034343698177577319110170163, - 52636178543958211, - 21888242871839275222246405745257275088548364400416034343698151336731609784322, - 21888242871839275222246405745257275088548364400416034343698149686270974814440, - 21888242871839275222246405745257275088548364400416034343698174279108848827924, - 65497409903438323, - 21888242871839275222246405745257275088548364400416034343698156311046516825310, - 21888242871839275222246405745257275088548364400416034343698175300641296041235, - 21888242871839275222246405745257275088548364400416034343698190437775896957114, - 21888242871839275222246405745257275088548364400416034343698159908659673569131, - 22514066902030588, - 21888242871839275222246405745257275088548364400416034343698186448695821877903, - 2620858972525277, - 31590345262725425, - 4610265401319414, - 21888242871839275222246405745257275088548364400416034343698191866947740360295, - 4487999894574632, - 21888242871839275222246405745257275088548364400416034343698132745612524090160, - 5844867498232390, - 16306962444649941, - 21888242871839275222246405745257275088548364400416034343698190241243451266363, - 63091417307809197, - 21888242871839275222246405745257275088548364400416034343698134841638622475494, - 21888242871839275222246405745257275088548364400416034343698196985555628354445, - 21888242871839275222246405745257275088548364400416034343698143123165769681842, - 21888242871839275222246405745257275088548364400416034343698177846881416810914, - 5644167541229065, - 21888242871839275222246405745257275088548364400416034343698191985217791347404, - 21888242871839275222246405745257275088548364400416034343698147129230525422028, - 21888242871839275222246405745257275088548364400416034343698155216246749150817, - 21888242871839275222246405745257275088548364400416034343698132450311604804607, - 21888242871839275222246405745257275088548364400416034343698201394758365341612, - 21888242871839275222246405745257275088548364400416034343698152497487725559930, - 21888242871839275222246405745257275088548364400416034343698137135407523531053, - 21888242871839275222246405745257275088548364400416034343698155295337724036169, - 26159620086180485, - 21888242871839275222246405745257275088548364400416034343698168206714506448836, - 21888242871839275222246405745257275088548364400416034343698142260510933401004, - 34922044495356852, - 21888242871839275222246405745257275088548364400416034343698140819821391374352, - 45212572857836065, - 21888242871839275222246405745257275088548364400416034343698161940578353440058, - 21888242871839275222246405745257275088548364400416034343698141265110449463358, - 18003963456967930, - 21888242871839275222246405745257275088548364400416034343698189026232415437316, - 21888242871839275222246405745257275088548364400416034343698197137447583194172, - 21888242871839275222246405745257275088548364400416034343698189892490898779946, - 21888242871839275222246405745257275088548364400416034343698194142201716224095, - 21888242871839275222246405745257275088548364400416034343698144776607441167673, - 21888242871839275222246405745257275088548364400416034343698166723745950735038, - 32257706952002433, - 57882145985324740, - 41289956157178378, - 21888242871839275222246405745257275088548364400416034343698139882354257094995, - 42277280590331432, - 39336278134570616, - 21888242871839275222246405745257275088548364400416034343698183277414675043446, - 21888242871839275222246405745257275088548364400416034343698139352547125667908, - 43193938213549518, - 21888242871839275222246405745257275088548364400416034343698144009174370972649, - 21888242871839275222246405745257275088548364400416034343698191967472771026536, - 13585854827709889, - 6987883354083413, - 58265504777351429, - 21888242871839275222246405745257275088548364400416034343698135860822157471694, - 21888242871839275222246405745257275088548364400416034343698132625328043594792, - 7031970138411344, - 26947611477405110, - 30037673553959120, - 7359043403450230, - 25275569951453618, - 21888242871839275222246405745257275088548364400416034343698177908144877824355, - 31029067055560738, - 60134944988290488, - 21888242871839275222246405745257275088548364400416034343698134682993247655236, - 66356052433490312, - 21888242871839275222246405745257275088548364400416034343698161674617748787041, - 21888242871839275222246405745257275088548364400416034343698170714497268479831, - 21888242871839275222246405745257275088548364400416034343698134779634086263573, - 21888242871839275222246405745257275088548364400416034343698197374458340961585, - 21888242871839275222246405745257275088548364400416034343698134598313872731585, - 21888242871839275222246405745257275088548364400416034343698155244404621617143, - 22043843995554825, - 21888242871839275222246405745257275088548364400416034343698132689250606181219, - 18359659310022576, - 35881114243818105, - 53551055789173226, - 21888242871839275222246405745257275088548364400416034343698174541404726226661, - 21888242871839275222246405745257275088548364400416034343698171150284056477089, - 7797567008867562, - 21888242871839275222246405745257275088548364400416034343698163279994526098892, - 21888242871839275222246405745257275088548364400416034343698200538660302083677, - 29941743749842776, - 7934033187925672, - 21888242871839275222246405745257275088548364400416034343698173263645568234746, - 21888242871839275222246405745257275088548364400416034343698191183669380230978, - 21888242871839275222246405745257275088548364400416034343698189225043565771415, - 21888242871839275222246405745257275088548364400416034343698147253330980634243, - 41485616344539918, - 21888242871839275222246405745257275088548364400416034343698139967312309029668, - 25885962588517192, - 10689546692101080, - 21888242871839275222246405745257275088548364400416034343698186470090211559643, - 21888242871839275222246405745257275088548364400416034343698189911175140605231, - 21888242871839275222246405745257275088548364400416034343698187495027053682429, - 33512023371361144, - 21888242871839275222246405745257275088548364400416034343698147191676863921139, - 50934601100176853, - 21888242871839275222246405745257275088548364400416034343698170594181025961993, - 26729949243349996, - 21888242871839275222246405745257275088548364400416034343698200860224452701964, - 26742711076043880, - 13233607913673313, - 41702601926545989, - 21888242871839275222246405745257275088548364400416034343698167654603393818900, - 21888242871839275222246405745257275088548364400416034343698158946585509269876, - 15755230159513951, - 16831689962194289, - 52076344621981667, - 21888242871839275222246405745257275088548364400416034343698199801492708302588, - 21888242871839275222246405745257275088548364400416034343698137026652647147088, - 21888242871839275222246405745257275088548364400416034343698193416089778333561, - 34105595256970720, - 40653959475202631, - 21888242871839275222246405745257275088548364400416034343698139813489792378385, - 24160616428363664, - 21888242871839275222246405745257275088548364400416034343698180156158846512395, - 21888242871839275222246405745257275088548364400416034343698201426563753671904, - 48424716918339630, - 21888242871839275222246405745257275088548364400416034343698192045579003717765, - 21888242871839275222246405745257275088548364400416034343698188830039050172612, - 37110021814615775, - 21888242871839275222246405745257275088548364400416034343698147514056666793025, - 55875634188663161, - 21888242871839275222246405745257275088548364400416034343698185106577270085295, - 21888242871839275222246405745257275088548364400416034343698178055106780679339, - 21888242871839275222246405745257275088548364400416034343698156218201861590876, - 14310151397521985, - 60738725268309275, - 25163723802624658, - 21888242871839275222246405745257275088548364400416034343698143324821160191270, - 10849657702303905, - 18579482707525228, - 17924548563063618, - 21888242871839275222246405745257275088548364400416034343698149421583809226205, - 21888242871839275222246405745257275088548364400416034343698156221094949850274, - 1570131587499701, - 13975013791404136, - 21888242871839275222246405745257275088548364400416034343698164865161549850248, - 21888242871839275222246405745257275088548364400416034343698147715358827847891, - 17008915875060084, - 21888242871839275222246405745257275088548364400416034343698142539965189160049, - 21888242871839275222246405745257275088548364400416034343698180687061206826428, - 62918276458445237, - 21888242871839275222246405745257275088548364400416034343698168628009515408640, - 33864538036869428, - 56430035089968756, - 21888242871839275222246405745257275088548364400416034343698169047248138721802, - 22775425189687480, - 7209403722278921, - 34103922074007949, - 46960365104552191, - 21888242871839275222246405745257275088548364400416034343698175142964609519017, - 21888242871839275222246405745257275088548364400416034343698146669595855369025, - 67154362156469534, - 15159776627108321, - 21888242871839275222246405745257275088548364400416034343698202807742287203896, - 21888242871839275222246405745257275088548364400416034343698169160716158245102, - 21846978964253676, - 22378575067983441, - 21888242871839275222246405745257275088548364400416034343698184919778900363443, - 28861636795758944, - 21888242871839275222246405745257275088548364400416034343698155432232149802695, - 21888242871839275222246405745257275088548364400416034343698165298560262028808, - 21888242871839275222246405745257275088548364400416034343698186029547369595480, - 30467250353277233, - 22804402736254306, - 67576403463768346, - 21888242871839275222246405745257275088548364400416034343698163002119094532189, - 31042346842053181, - 28449276201935264, - 46257327649368314, - 21888242871839275222246405745257275088548364400416034343698202644375411414517, - 66607716367172081, - 28415726044744894, - 21888242871839275222246405745257275088548364400416034343698136010386771211422, - 24449696744119857, - 54410155369742047, - 21888242871839275222246405745257275088548364400416034343698159020061952912488, - 21888242871839275222246405745257275088548364400416034343698185705251541606898, - 21888242871839275222246405745257275088548364400416034343698169013982866935307, - 21888242871839275222246405745257275088548364400416034343698201744868926921792, - 8678040479728479, - 45029851839339032, - 51475378497118852, - 21888242871839275222246405745257275088548364400416034343698143854796712858989, - 29172279041094635, - 21888242871839275222246405745257275088548364400416034343698149259069813612330, - 21888242871839275222246405745257275088548364400416034343698167715093126538769, - 21888242871839275222246405745257275088548364400416034343698141475805054596653, - 21888242871839275222246405745257275088548364400416034343698189301233447140389, - 21888242871839275222246405745257275088548364400416034343698180525261667784966, - 31251238531055410, - 61463828413303030, - 21888242871839275222246405745257275088548364400416034343698199199542627306391, - 44281993010957409, - 21888242871839275222246405745257275088548364400416034343698199782889101433335, - 21888242871839275222246405745257275088548364400416034343698195895630026605693, - 56982971008676795, - 61199149696435452, - 64968970505185194, - 26674082714210574, - 26776411370481275, - 21888242871839275222246405745257275088548364400416034343698197151388463169487, - 21888242871839275222246405745257275088548364400416034343698135375667975846059, - 51434864439594811, - 21888242871839275222246405745257275088548364400416034343698134232988708471082, - 33840655191500953, - 21888242871839275222246405745257275088548364400416034343698166470582457172706, - 21888242871839275222246405745257275088548364400416034343698175020114660599281, - 38702910071234104, - 21888242871839275222246405745257275088548364400416034343698149528711916119128, - 34776303999120380, - 1939953873526888, - 21888242871839275222246405745257275088548364400416034343698161068068686171812, - 21888242871839275222246405745257275088548364400416034343698183081544090854442, - 49752931789579825, - 54790297337695844, - 21888242871839275222246405745257275088548364400416034343698148408000873668058, - 62331574497966779, - 51305180486101203, - 8117627011426425, - 6755990458552250, - 21888242871839275222246405745257275088548364400416034343698186064209349634552, - 27174844852366506, - 19511241856300773, - 21888242871839275222246405745257275088548364400416034343698181674366475040609, - 21888242871839275222246405745257275088548364400416034343698161374350791837268, - 27405613850538137, - 4990433767422919, - 21699640059463494, - 21888242871839275222246405745257275088548364400416034343698145837405970245397, - 21888242871839275222246405745257275088548364400416034343698142488807723410665, - 21888242871839275222246405745257275088548364400416034343698186821801900255427, - 21888242871839275222246405745257275088548364400416034343698174421319738637028, - 21888242871839275222246405745257275088548364400416034343698190797551287216637, - 12277189315018896, - 46857023049657724, - 21888242871839275222246405745257275088548364400416034343698169553584026407282, - 64342154479944096, - 21888242871839275222246405745257275088548364400416034343698142122872418888739, - 21888242871839275222246405745257275088548364400416034343698157996469393190911, - 21888242871839275222246405745257275088548364400416034343698192969817558583909, - 21888242871839275222246405745257275088548364400416034343698195333869132146186, - 2673434713809014, - 21888242871839275222246405745257275088548364400416034343698145552170819708582, - 21888242871839275222246405745257275088548364400416034343698176133205789690221, - 21888242871839275222246405745257275088548364400416034343698152724744226691940, - 40344021925016559, - 2273364392467441, - 48512651398880861, - 38209197312295129, - 21888242871839275222246405745257275088548364400416034343698192495642548828215, - 21888242871839275222246405745257275088548364400416034343698140768642057955108, - 21888242871839275222246405745257275088548364400416034343698181185935692336720, - 21888242871839275222246405745257275088548364400416034343698132843223660278416, - 55776428679067710, - 21888242871839275222246405745257275088548364400416034343698152599339094765690, - 30297300628959624, - 70611308944171360, - 51726177956231726, - 53859377674395465, - 9873360706816844, - 3118705606739643, - 40398458701748482, - 21888242871839275222246405745257275088548364400416034343698163967872982403908, - 27740180034997510, - 21888242871839275222246405745257275088548364400416034343698165117086860295204, - 40552578340122867, - 45874147409097766, - 21888242871839275222246405745257275088548364400416034343698156860486648537131, - 70385563768199499, - 20357202858225816, - 27526275589619071, - 47924932118097862, - 21888242871839275222246405745257275088548364400416034343698150371258920697275, - 69348435296493865, - 55718572454276284, - 15908929873004121, - 21888242871839275222246405745257275088548364400416034343698191473423462794317, - 21888242871839275222246405745257275088548364400416034343698142491350426579762, - 66705830143717051, - 32914742580702974, - 32285855947183348, - 2301674910445371, - 21888242871839275222246405745257275088548364400416034343698163253015058829495, - 21888242871839275222246405745257275088548364400416034343698203023792500529406, - 21888242871839275222246405745257275088548364400416034343698136508493605168422, - 21888242871839275222246405745257275088548364400416034343698181627482784455823, - 21888242871839275222246405745257275088548364400416034343698147252214579609579, - 21888242871839275222246405745257275088548364400416034343698147343948743061358, - 21888242871839275222246405745257275088548364400416034343698159810619761070834, - 18090559007995416, - 21888242871839275222246405745257275088548364400416034343698161818279550550579, - 30292026806503945, - 4370845444005679, - 40155524202302094, - 21888242871839275222246405745257275088548364400416034343698196769086371877102, - 21888242871839275222246405745257275088548364400416034343698179499502133690708, - 21888242871839275222246405745257275088548364400416034343698191810527150390824, - 21888242871839275222246405745257275088548364400416034343698197418742756116612, - 21888242871839275222246405745257275088548364400416034343698159248644212353939, - 643825879772039, - 21888242871839275222246405745257275088548364400416034343698167735875071838405, - 16358271000460717, - 21888242871839275222246405745257275088548364400416034343698158439941016102222, - 1040182871955126, - 71946338562233661, - 21888242871839275222246405745257275088548364400416034343698196070120582116653, - 65600958387626940, - 21888242871839275222246405745257275088548364400416034343698166263831347620604, - 21888242871839275222246405745257275088548364400416034343698194053292853868116, - 25193747428961512, - 25916875521547441, - 21888242871839275222246405745257275088548364400416034343698185675016655396562, - 70384960859014331, - 21888242871839275222246405745257275088548364400416034343698143844982670840025, - 30143600591326717, - 21888242871839275222246405745257275088548364400416034343698139286331488262283, - 21888242871839275222246405745257275088548364400416034343698143146132626090186, - 68790561678184974, - 1575226934308163, - 21888242871839275222246405745257275088548364400416034343698138611520727460798, - 61623826584907109, - 21888242871839275222246405745257275088548364400416034343698182870367134233319, - 21888242871839275222246405745257275088548364400416034343698148284563682732436, - 41704207742965559, - 21888242871839275222246405745257275088548364400416034343698179497352038693277, - 14083394034316380, - 21888242871839275222246405745257275088548364400416034343698193764897933921320, - 21888242871839275222246405745257275088548364400416034343698186823619909245589, - 21888242871839275222246405745257275088548364400416034343698203125608689756261, - 47400889383751329, - 38543970835584531, - 21888242871839275222246405745257275088548364400416034343698193232208401206759, - 19381292092033675, - 16720837772494437, - 21888242871839275222246405745257275088548364400416034343698133138265135852072, - 24190456971627486, - 70252067232519905, - 44879879178115190, - 21888242871839275222246405745257275088548364400416034343698184596243617750327, - 21888242871839275222246405745257275088548364400416034343698171069210934132391, - 18134695771848817, - 21888242871839275222246405745257275088548364400416034343698154920073759049660, - 25629133228973631, - 21888242871839275222246405745257275088548364400416034343698195430050028326084, - 21888242871839275222246405745257275088548364400416034343698160278439173900585, - 21888242871839275222246405745257275088548364400416034343698165136001977519258, - 21888242871839275222246405745257275088548364400416034343698148222835500991844, - 21888242871839275222246405745257275088548364400416034343698170023669819668702, - 21888242871839275222246405745257275088548364400416034343698150055041638281892, - 21888242871839275222246405745257275088548364400416034343698163559377158743801, - 29566243710818263, - 39181632711427333, - 32262532885264750, - 27996242395057217, - 63213911640436484, - 22694743913522003, - 48562880637427754, - 21888242871839275222246405745257275088548364400416034343698153031188666324692, - 21888242871839275222246405745257275088548364400416034343698159288055956399329, - 45139941192117579, - 13408178942635834, - 32431566953335226, - 21888242871839275222246405745257275088548364400416034343698181960601122904462, - 21888242871839275222246405745257275088548364400416034343698187384803767954558, - 27982532069840938, - 21888242871839275222246405745257275088548364400416034343698169588538517097917, - 21552184853262537, - 21888242871839275222246405745257275088548364400416034343698165913708040435600, - 21888242871839275222246405745257275088548364400416034343698203649876839175424, - 21888242871839275222246405745257275088548364400416034343698180715324905288883, - 21888242871839275222246405745257275088548364400416034343698145840761131714790, - 14262382377090797, - 21888242871839275222246405745257275088548364400416034343698190149156788945229, - 21888242871839275222246405745257275088548364400416034343698188712905518100291, - 21888242871839275222246405745257275088548364400416034343698170594451331465446, - 21888242871839275222246405745257275088548364400416034343698135072437234503805, - 21888242871839275222246405745257275088548364400416034343698178449682280930912, - 21888242871839275222246405745257275088548364400416034343698175706020917479048, - 21888242871839275222246405745257275088548364400416034343698177108829356116965, - 26585708416346807, - 10535577611269773, - 71785731447261140, - 21888242871839275222246405745257275088548364400416034343698141991666757811378, - 21888242871839275222246405745257275088548364400416034343698186847280199212881, - 21888242871839275222246405745257275088548364400416034343698158152497186638515, - 21888242871839275222246405745257275088548364400416034343698138409527114952399, - 21888242871839275222246405745257275088548364400416034343698189779359038939826, - 43202446251692231, - 21888242871839275222246405745257275088548364400416034343698178363736006188802, - 21888242871839275222246405745257275088548364400416034343698164404106294694133, - 57247196425618791, - 21888242871839275222246405745257275088548364400416034343698172078978809649964, - 21888242871839275222246405745257275088548364400416034343698173377368869206706, - 56904963811779936, - 21888242871839275222246405745257275088548364400416034343698198340825822020393, - 21888242871839275222246405745257275088548364400416034343698192242092661180117, - 21888242871839275222246405745257275088548364400416034343698165492056217976760, - 23402212560330688, - 21888242871839275222246405745257275088548364400416034343698146807438615328501, - 59184261738255217, - 21888242871839275222246405745257275088548364400416034343698200594209545699240, - 21888242871839275222246405745257275088548364400416034343698169444560005319811, - 1970897426656271, - 21888242871839275222246405745257275088548364400416034343698187978900260933469, - 21888242871839275222246405745257275088548364400416034343698145369124085847565, - 21888242871839275222246405745257275088548364400416034343698146096766373203952, - 21888242871839275222246405745257275088548364400416034343698196574947478087324, - 37672589085978487, - 55036163990068731, - 21888242871839275222246405745257275088548364400416034343698141109288872896880, - 25575667123047489, - 19413449916253701, - 34316423760401467, - 31459909312665998, - 21888242871839275222246405745257275088548364400416034343698134276645941124094, - 21888242871839275222246405745257275088548364400416034343698170860016158994624, - 195608936817435, - 49533295729730681, - 4270489011953990, - 21888242871839275222246405745257275088548364400416034343698154789112341904302, - 24627756532473346, - 21888242871839275222246405745257275088548364400416034343698138206358929309579, - 21888242871839275222246405745257275088548364400416034343698132832263559733784, - 21888242871839275222246405745257275088548364400416034343698169752456985732240, - 21621835322817851, - 21888242871839275222246405745257275088548364400416034343698184218239480736637, - 21888242871839275222246405745257275088548364400416034343698133762101649997508, - 21888242871839275222246405745257275088548364400416034343698185330710966806378, - 53927621702816954, - 27504855860734843, - 16946192380119182, - 39305759599953882, - 21888242871839275222246405745257275088548364400416034343698181333831848388459, - 21888242871839275222246405745257275088548364400416034343698162151453966427040, - 21888242871839275222246405745257275088548364400416034343698163384612748236034, - 21888242871839275222246405745257275088548364400416034343698165939527763707622, - 21888242871839275222246405745257275088548364400416034343698133858553312018307, - 21888242871839275222246405745257275088548364400416034343698201890267720399790, - 27148192467889162, - 21888242871839275222246405745257275088548364400416034343698155608654046378307, - 21888242871839275222246405745257275088548364400416034343698166780489593841812, - 1609254829814482, - 19889698682919419, - 45471595395574901, - 32959191652041005, - 38813708934577510, - 38952501909368014, - 21888242871839275222246405745257275088548364400416034343698144325136352587681, - 21888242871839275222246405745257275088548364400416034343698133096627933628058, - 21888242871839275222246405745257275088548364400416034343698182240481047279766, - 21888242871839275222246405745257275088548364400416034343698185544093643805373, - 21888242871839275222246405745257275088548364400416034343698153267048224095969, - 21888242871839275222246405745257275088548364400416034343698184850021543759287, - 21888242871839275222246405745257275088548364400416034343698151741524495058137, - 40762497079161074, - 21888242871839275222246405745257275088548364400416034343698167353422516144950, - 21888242871839275222246405745257275088548364400416034343698155166913200253573, - 56245973132397225, - 51111422735698843, - 66143322466438903, - 40402697861275527, - 97147086775563, - 551039053873760, - 51658764140726763, - 49367707848244593, - 69739416531450715, - 63414774102143302, - 608865017224326, - 21888242871839275222246405745257275088548364400416034343698167076754726512094, - 2810347566847845, - 62372106421734910, - 1460064235342320, - 38972817722032271, - 21888242871839275222246405745257275088548364400416034343698144359137637696102, - 45183962299087326, - 21888242871839275222246405745257275088548364400416034343698163329616909596026, - 17777081573077763, - 55512808846100009, - 10551069052918194, - 21888242871839275222246405745257275088548364400416034343698174399537786067018, - 12490288354089484, - 21888242871839275222246405745257275088548364400416034343698171454196991715650, - 8429527352716152, - 21888242871839275222246405745257275088548364400416034343698143936466959530089, - 9071489488796637, - 21888242871839275222246405745257275088548364400416034343698164936548575979087, - 31100236781054029, - 21888242871839275222246405745257275088548364400416034343698181442006498419040, - 2606859052845470, - 26628492713442588, - 71685556738804515, - 39766779934079384, - 35449599473440088, - 42852593573321632, - 21888242871839275222246405745257275088548364400416034343698167049146856145513, - 21888242871839275222246405745257275088548364400416034343698181313350263826628, - 36453368477077595, - 21888242871839275222246405745257275088548364400416034343698197329369500377817, - 21888242871839275222246405745257275088548364400416034343698132929576277522830, - 21888242871839275222246405745257275088548364400416034343698175533432688667491, - 21888242871839275222246405745257275088548364400416034343698172118115287163720, - 21888242871839275222246405745257275088548364400416034343698169839286540573397, - 45656724837630666, - 21888242871839275222246405745257275088548364400416034343698163850240393271462, - 21888242871839275222246405745257275088548364400416034343698167887353491412562, - 21888242871839275222246405745257275088548364400416034343698186546177594080199, - 13273505626629340, - 21888242871839275222246405745257275088548364400416034343698180658138272021452, - 35477606946506713, - 18866785159143426, - 21888242871839275222246405745257275088548364400416034343698200285241122006150, - 20393818588559582, - 21888242871839275222246405745257275088548364400416034343698180050365191665615, - 21888242871839275222246405745257275088548364400416034343698170052577554121715, - 54644636210837400, - 27118942972975725, - 44959662490334649, - 53526053943754839, - 20507548389482604, - 70713290638644023, - 21888242871839275222246405745257275088548364400416034343698153213195804925446, - 21888242871839275222246405745257275088548364400416034343698156877999762113205, - 21888242871839275222246405745257275088548364400416034343698151936018669578405, - 21888242871839275222246405745257275088548364400416034343698152605273940026101, - 21888242871839275222246405745257275088548364400416034343698158424330903025629, - 21888242871839275222246405745257275088548364400416034343698195043703486563099, - 21888242871839275222246405745257275088548364400416034343698173123084280607883, - 21888242871839275222246405745257275088548364400416034343698145986635772417429, - 64689558093298725, - 21888242871839275222246405745257275088548364400416034343698195459800762167587, - 29009185022224186, - 21888242871839275222246405745257275088548364400416034343698137015308165543360, - 55255319484617609, - 21888242871839275222246405745257275088548364400416034343698174612221995322805, - 39666910305212355, - 21888242871839275222246405745257275088548364400416034343698176492951284579972, - 21888242871839275222246405745257275088548364400416034343698195356845263576931, - 21888242871839275222246405745257275088548364400416034343698159676189417633022, - 62369364295371868, - 21888242871839275222246405745257275088548364400416034343698200417407539640579, - 21888242871839275222246405745257275088548364400416034343698191266998190160135, - 7803919670903828, - 21888242871839275222246405745257275088548364400416034343698198719625092586651, - 42502716331492986, - 21888242871839275222246405745257275088548364400416034343698173387157408167144, - 21888242871839275222246405745257275088548364400416034343698146172769096732172, - 21888242871839275222246405745257275088548364400416034343698195266667677577603, - 21888242871839275222246405745257275088548364400416034343698187765603041299956, - 21888242871839275222246405745257275088548364400416034343698171837475970682405, - 44577342538465359, - 21888242871839275222246405745257275088548364400416034343698199905254058469926, - 25882930700435889, - 35088981653627339, - 31582845583931209, - 18281950000664341, - 21888242871839275222246405745257275088548364400416034343698150991846318588145, - 21888242871839275222246405745257275088548364400416034343698177414458087355271, - 21888242871839275222246405745257275088548364400416034343698168801407251021763, - 21888242871839275222246405745257275088548364400416034343698159746226363251001, - 11047971041343713, - 61500125570435863, - 21888242871839275222246405745257275088548364400416034343698201227152763987994, - 65738751735472460, - 8230244383811694, - 57358401406663236, - 8315045646416504, - 59956130645577836, - 67528450813622738, - 21888242871839275222246405745257275088548364400416034343698140988950944197788, - 64457280794621109, - 16893646330081927, - 14627095205676309, - 30754516182609826, - 59100613520001398, - 43298385559956990, - 21888242871839275222246405745257275088548364400416034343698146295003431434113, - 55105647622846210, - 43485036842878148, - 21888242871839275222246405745257275088548364400416034343698178130968392730565, - 35037502920387381, - 28533520745098858, - 21888242871839275222246405745257275088548364400416034343698155194595547864158, - 53331903247555730, - 60272201773350016, - 52039833442396641, - 21888242871839275222246405745257275088548364400416034343698164665492995052065, - 37902802073581859, - 21888242871839275222246405745257275088548364400416034343698157293462367264176, - 21888242871839275222246405745257275088548364400416034343698193513391073731330, - 15547769701591600, - 21888242871839275222246405745257275088548364400416034343698168297425041020471, - 21888242871839275222246405745257275088548364400416034343698141696451215158196, - 21888242871839275222246405745257275088548364400416034343698203150957509496620, - 38832313461653815, - 13113606729213982, - 26243227220659002, - 21888242871839275222246405745257275088548364400416034343698203693889028874917, - 4234705265312318, - 21888242871839275222246405745257275088548364400416034343698139414802034602064, - 35657091474782179, - 9761465065810492, - 51338295843599924, - 21888242871839275222246405745257275088548364400416034343698184873994460200735, - 63618865885263624, - 65135966151871232, - 21888242871839275222246405745257275088548364400416034343698147518630708188389, - 58891583883860674, - 70412738260883186, - 21888242871839275222246405745257275088548364400416034343698164458865789307972, - 21888242871839275222246405745257275088548364400416034343698147259570342540168, - 66112543864007008, - 44997019133409721, - 21888242871839275222246405745257275088548364400416034343698179124403096960169, - 21888242871839275222246405745257275088548364400416034343698144436144280044017, - 21888242871839275222246405745257275088548364400416034343698147298670181638293, - 21888242871839275222246405745257275088548364400416034343698165950669437270804, - 21888242871839275222246405745257275088548364400416034343698161495353085153451, - 4972420337690882, - 16834742538336874, - 44952217608971061, - 21888242871839275222246405745257275088548364400416034343698181081034642058832, - 21888242871839275222246405745257275088548364400416034343698191397025214585412, - 21888242871839275222246405745257275088548364400416034343698170804258533007330, - 65742338641491571, - 18376049863874059, - 29891251240479383, - 21888242871839275222246405745257275088548364400416034343698190247233080175897, - 21888242871839275222246405745257275088548364400416034343698188220384787434044, - 21888242871839275222246405745257275088548364400416034343698133008225464364107, - 3915547321107502, - 69635167359523143, - 69685149338500461, - 21888242871839275222246405745257275088548364400416034343698148020134000259114, - 46903291489424454, - 67472701143156814, - 21888242871839275222246405745257275088548364400416034343698162433631812372489, - 21888242871839275222246405745257275088548364400416034343698198956139615629709, - 27241251163331859, - 16483777913399668, - 69945294761792769, - 20162999483285744, - 26385906483375901, - 66222964648838454, - 10334285541900333, - 63633432070650271, - 59674771546022338, - 27598322763684081, - 37535963079264789, - 21888242871839275222246405745257275088548364400416034343698180671112117658106, - 21888242871839275222246405745257275088548364400416034343698172272950353710334, - 21888242871839275222246405745257275088548364400416034343698155953313399438041, - 21888242871839275222246405745257275088548364400416034343698200516269462289342, - 61456919357346176, - 54546811984413564, - 36894965112201945, - 21888242871839275222246405745257275088548364400416034343698137805741232347167, - 21888242871839275222246405745257275088548364400416034343698200432097970042004, - 21888242871839275222246405745257275088548364400416034343698192751086927214070, - 21888242871839275222246405745257275088548364400416034343698202563322459575601, - 21888242871839275222246405745257275088548364400416034343698170996997533150172, - 50445780727885420, - 4341119722004938, - 21888242871839275222246405745257275088548364400416034343698138143523768953741, - 68580360193113703, - 21888242871839275222246405745257275088548364400416034343698150605551503717014, - 31291073515102919, - 57011527378124534, - 43935929918837399, - 23570906562164685, - 4024491344691655, - 21888242871839275222246405745257275088548364400416034343698138169233534535835, - 21888242871839275222246405745257275088548364400416034343698203797269230801140, - 24622452329035835, - 51047084482441955, - 60210732720463671, - 21888242871839275222246405745257275088548364400416034343698176702461204395714, - 21888242871839275222246405745257275088548364400416034343698152329293703651952, - 21888242871839275222246405745257275088548364400416034343698148005318312955417, - 21888242871839275222246405745257275088548364400416034343698193223746666364342, - 21888242871839275222246405745257275088548364400416034343698160944106041781630, - 21888242871839275222246405745257275088548364400416034343698181583222639338886, - 21888242871839275222246405745257275088548364400416034343698154567034623777476, - 31086319016290958, - 20535824155292500, - 21888242871839275222246405745257275088548364400416034343698139294783813654547, - 21888242871839275222246405745257275088548364400416034343698194802240420739023, - 21888242871839275222246405745257275088548364400416034343698148131188689948566, - 10820801209816400, - 59493774106166351, - 51857649908699418, - 59125751471018966, - 54943897931771389, - 21888242871839275222246405745257275088548364400416034343698176484840500181488, - 21888242871839275222246405745257275088548364400416034343698181038077620801729, - 21888242871839275222246405745257275088548364400416034343698155762148353071500, - 21888242871839275222246405745257275088548364400416034343698173273624428919921, - 1445923231127253, - 46245206189712988, - 21888242871839275222246405745257275088548364400416034343698167911272532986253, - 21888242871839275222246405745257275088548364400416034343698169711797231995987, - 70838583135062942, - 21888242871839275222246405745257275088548364400416034343698200913785731549362, - 21888242871839275222246405745257275088548364400416034343698159709120028956796, - 44672177110006205, - 68274627025863498, - 21888242871839275222246405745257275088548364400416034343698191715465087963239, - 70355154136075966, - 21888242871839275222246405745257275088548364400416034343698191941152435838284, - 62743073154906828, - 60240929742134470, - 21888242871839275222246405745257275088548364400416034343698192943329778026464, - 15815878864890226, - 21888242871839275222246405745257275088548364400416034343698179581715718046733, - 8208576572917487, - 21888242871839275222246405745257275088548364400416034343698167813564800487196, - 21888242871839275222246405745257275088548364400416034343698193798193810456423, - 21888242871839275222246405745257275088548364400416034343698141936887124928628, - 21888242871839275222246405745257275088548364400416034343698192845081055351165, - 19748223929701973, - 21888242871839275222246405745257275088548364400416034343698188371857680236941, - 21888242871839275222246405745257275088548364400416034343698203945090919952334, - 21888242871839275222246405745257275088548364400416034343698151767176370319522, - 39710884589033227, - 67041075093422441, - 21888242871839275222246405745257275088548364400416034343698202538460286494158, - 21888242871839275222246405745257275088548364400416034343698158282408446196694, - 43694412673908127, - 891798542782099, - 68671782638419306, - 21888242871839275222246405745257275088548364400416034343698147461574897167962, - 29034407238702403, - 21888242871839275222246405745257275088548364400416034343698153670934465757760, - 21888242871839275222246405745257275088548364400416034343698136383175159137098, - 21888242871839275222246405745257275088548364400416034343698135016165603254133, - 4237527209373036, - 59602749601291062, - 68097882425063530, - 11973041019025467, - 21888242871839275222246405745257275088548364400416034343698139182781838197768, - 42877053607434445, - 21888242871839275222246405745257275088548364400416034343698136700015427887337, - 16187173642099056, - 21888242871839275222246405745257275088548364400416034343698185893205022647652, - 21888242871839275222246405745257275088548364400416034343698148684057980340112, - 21888242871839275222246405745257275088548364400416034343698140350289730385134, - 7281225430115821, - 2178447807702273, - 6024837926170299, - 54263751726157408, - 28972254146716266, - 21888242871839275222246405745257275088548364400416034343698140540713497739818, - 21888242871839275222246405745257275088548364400416034343698194194090405790962, - 49116802905095119, - 21888242871839275222246405745257275088548364400416034343698156734996406194812, - 25944064342475022, - 21888242871839275222246405745257275088548364400416034343698135740921643309104, - 21888242871839275222246405745257275088548364400416034343698144837847482269135, - 21888242871839275222246405745257275088548364400416034343698178391367715377244, - 21888242871839275222246405745257275088548364400416034343698140245168795397654, - 55423807479432749, - 44774476134944391, - 4082300533694445, - 21888242871839275222246405745257275088548364400416034343698149929939747752931, - 21888242871839275222246405745257275088548364400416034343698170549560951942956, - 21655402125270378, - 21888242871839275222246405745257275088548364400416034343698192659041755100038, - 21888242871839275222246405745257275088548364400416034343698176162181511068599, - 21888242871839275222246405745257275088548364400416034343698141747892660506415, - 21888242871839275222246405745257275088548364400416034343698177136926195626178, - 21888242871839275222246405745257275088548364400416034343698181807602160355246, - 21888242871839275222246405745257275088548364400416034343698183673741360952201, - 21888242871839275222246405745257275088548364400416034343698161531504964292759, - 21888242871839275222246405745257275088548364400416034343698156117071493830100, - 30669454898215950, - 2656761613602714, - 60773382068011077, - 7969644980656082, - 38035942905523515, - 21888242871839275222246405745257275088548364400416034343698169367358295945828, - 21888242871839275222246405745257275088548364400416034343698173870882586858643, - 20416547096228636, - 21888242871839275222246405745257275088548364400416034343698194283880366561767, - 21888242871839275222246405745257275088548364400416034343698187419987383893519, - 21888242871839275222246405745257275088548364400416034343698151546273856695689, - 21888242871839275222246405745257275088548364400416034343698199419603444293317, - 21888242871839275222246405745257275088548364400416034343698176544895265814220, - 21888242871839275222246405745257275088548364400416034343698199043729652555061, - 19676300166250341, - 21888242871839275222246405745257275088548364400416034343698140670781046787199, - 57020839143290731, - 21888242871839275222246405745257275088548364400416034343698190685051287505443, - 21888242871839275222246405745257275088548364400416034343698142202435204969871, - 33278730629290881, - 21888242871839275222246405745257275088548364400416034343698185047018810954065, - 62309686608526638, - 23788777336583034, - 21888242871839275222246405745257275088548364400416034343698168705198819509954, - 21888242871839275222246405745257275088548364400416034343698203324833031387042, - 13787941143525084, - 21888242871839275222246405745257275088548364400416034343698191099697225714766, - 21888242871839275222246405745257275088548364400416034343698139624401437132137, - 21888242871839275222246405745257275088548364400416034343698152876866403615904, - 71699772547351293, - 13356221308685988, - 6421057501516712, - 21888242871839275222246405745257275088548364400416034343698171140684417562564, - 51796500557963470, - 39985566613536649, - 21888242871839275222246405745257275088548364400416034343698162328011521718913, - 59391159603442280, - 21888242871839275222246405745257275088548364400416034343698140226656328835575, - 12297513756672508, - 21888242871839275222246405745257275088548364400416034343698141707081268881191, - 21888242871839275222246405745257275088548364400416034343698192509983555542191, - 42199552775734479, - 14805479285683739, - 21888242871839275222246405745257275088548364400416034343698192704208492674499, - 15188918181748216, - 21888242871839275222246405745257275088548364400416034343698176148830596653977, - 21888242871839275222246405745257275088548364400416034343698189789775396400586, - 52926381170456118, - 21888242871839275222246405745257275088548364400416034343698203082951373965948, - 21888242871839275222246405745257275088548364400416034343698166609442067737942, - 61187799829951188, - 21888242871839275222246405745257275088548364400416034343698153849727969036776, - 21888242871839275222246405745257275088548364400416034343698186587420471445750, - 31871781436764256, - 21888242871839275222246405745257275088548364400416034343698168428112720297293, - 56543588017976845, - 21888242871839275222246405745257275088548364400416034343698193039982296115695, - 68957542610679055, - 36982515170625263, - 21888242871839275222246405745257275088548364400416034343698204021195443073763, - 25573175825781257, - 28412280805892590, - 31604235759135318, - 5890756392962752, - 21888242871839275222246405745257275088548364400416034343698144801423860800310, - 21888242871839275222246405745257275088548364400416034343698163031555745164603, - 21888242871839275222246405745257275088548364400416034343698140194118943237572, - 16443135282941616, - 60672700854238018, - 21888242871839275222246405745257275088548364400416034343698168418026589056702, - 21888242871839275222246405745257275088548364400416034343698162979961368775389, - 40565596072335080, - 21971635661135605, - 34757124695786397, - 56900353050012922, - 45994793312973106, - 21888242871839275222246405745257275088548364400416034343698144382184653587929, - 21888242871839275222246405745257275088548364400416034343698191106112126034412, - 21888242871839275222246405745257275088548364400416034343698143816514663191997, - 60386419502698341, - 45578814434736466, - 21888242871839275222246405745257275088548364400416034343698133473258873262797, - 21888242871839275222246405745257275088548364400416034343698178825191293010315, - 13725254079558130, - 63572013374104819, - 21888242871839275222246405745257275088548364400416034343698145670881517600510, - 21888242871839275222246405745257275088548364400416034343698163343265795604771, - 21888242871839275222246405745257275088548364400416034343698148145713761339646, - 21888242871839275222246405745257275088548364400416034343698189757749108852772, - 21888242871839275222246405745257275088548364400416034343698153643308655472653, - 21888242871839275222246405745257275088548364400416034343698168887804632278068, - 21888242871839275222246405745257275088548364400416034343698172757602490562555, - 61810791334120342, - 31531774345373976, - 12153971187502471, - 28968606801987815, - 21888242871839275222246405745257275088548364400416034343698134872719342736673, - 21888242871839275222246405745257275088548364400416034343698173511061601694493, - 21888242871839275222246405745257275088548364400416034343698176592746586406025, - 56935370073683965, - 21888242871839275222246405745257275088548364400416034343698164987707296298351, - 6236144610702726, - 21888242871839275222246405745257275088548364400416034343698151329176971899028, - 21888242871839275222246405745257275088548364400416034343698201952143688744422, - 39528493326330726, - 11884274485300906, - 10819207478204180, - 21888242871839275222246405745257275088548364400416034343698143969592380835726, - 58112130059328705, - 26412333998516272, - 21888242871839275222246405745257275088548364400416034343698151313424798427525, - 21888242871839275222246405745257275088548364400416034343698199017703756365562, - 21888242871839275222246405745257275088548364400416034343698173393355887177444, - 12229699001002617, - 21888242871839275222246405745257275088548364400416034343698199605061885458066, - 35971026017289992, - 21888242871839275222246405745257275088548364400416034343698144129218195862127, - 68997830390513514, - 68082451914017533, - 42396600889099804, - 50468054649038732, - 21888242871839275222246405745257275088548364400416034343698137898446327080509, - 44561171783543810, - 49072447277879840, - 1788203916772681, - 21888242871839275222246405745257275088548364400416034343698178497544327736620, - 21888242871839275222246405745257275088548364400416034343698183243637080990564, - 56217173262831501, - 66909784673722616, - 21888242871839275222246405745257275088548364400416034343698157965963061133850, - 21888242871839275222246405745257275088548364400416034343698155231595880332769, - 10186377154447567, - 31664943269506579, - 21888242871839275222246405745257275088548364400416034343698201711207535035234, - 21888242871839275222246405745257275088548364400416034343698198777096876500761, - 135710362550601, - 59425975831499332, - 57558135595070569, - 21888242871839275222246405745257275088548364400416034343698170813172881704733, - 62626041199669092, - 21888242871839275222246405745257275088548364400416034343698134084848705401829, - 70841330456555020, - 7038785463697444, - 71323138098831498, - 21888242871839275222246405745257275088548364400416034343698160893212430578230, - 29414763270101357, - 21888242871839275222246405745257275088548364400416034343698153644953839184275, - 19057934823508331, - 58447645651572705, - 7214109566337351, - 7134403305361185, - 21888242871839275222246405745257275088548364400416034343698201992112462665490, - 21888242871839275222246405745257275088548364400416034343698143440776496485445, - 28570855291820234, - 41050074738511407, - 21888242871839275222246405745257275088548364400416034343698157847410357456749, - 21888242871839275222246405745257275088548364400416034343698155657181502786755, - 21888242871839275222246405745257275088548364400416034343698199341376823663136, - 21888242871839275222246405745257275088548364400416034343698158414037189868602, - 21888242871839275222246405745257275088548364400416034343698177625631995578222, - 43778822649194863, - 45072807924694868, - 48109710050534043, - 55898673436178525, - 21888242871839275222246405745257275088548364400416034343698151639546415390549, - 68091607151327277, - 32934966902092080, - 63553671370342312, - 21888242871839275222246405745257275088548364400416034343698184932194153291468, - 21888242871839275222246405745257275088548364400416034343698176812974316195525, - 70225316395098261, - 21888242871839275222246405745257275088548364400416034343698146993008084116892, - 21888242871839275222246405745257275088548364400416034343698150220812990421284, - 46701092119734091, - 21888242871839275222246405745257275088548364400416034343698158796146532092560, - 64631860869664404, - 16702838083185973, - 23675246246034397, - 21888242871839275222246405745257275088548364400416034343698188429671521989348, - 21888242871839275222246405745257275088548364400416034343698169397099404163727, - 21888242871839275222246405745257275088548364400416034343698184355886874508704, - 69420132480992976, - 21888242871839275222246405745257275088548364400416034343698201686359662275260, - 15720907211079808, - 21888242871839275222246405745257275088548364400416034343698170160887151006031, - 65590283016227308, - 21888242871839275222246405745257275088548364400416034343698165180221282626385, - 21888242871839275222246405745257275088548364400416034343698153067356724983341, - 21888242871839275222246405745257275088548364400416034343698137496533141015719, - 21888242871839275222246405745257275088548364400416034343698166940951627298118, - 21888242871839275222246405745257275088548364400416034343698169215930499463813, - 36975044333696689, - 21888242871839275222246405745257275088548364400416034343698154499775574964992, - 21888242871839275222246405745257275088548364400416034343698138823181577186939, - 53285033930673056, - 16644261137132250, - 12345096518063286, - 63916559232441791, - 21888242871839275222246405745257275088548364400416034343698133441907899507872, - 33750351633452105, - 21888242871839275222246405745257275088548364400416034343698178287271880270096, - 2220008490660689, - 21888242871839275222246405745257275088548364400416034343698184006509060852956, - 51761106322927293, - 50503780871410257, - 61950747918882117, - 21888242871839275222246405745257275088548364400416034343698146931436758411528, - 21888242871839275222246405745257275088548364400416034343698189041818147688741, - 20109856435912665, - 21888242871839275222246405745257275088548364400416034343698172123329977059762, - 17401179645755913, - 26748877156913065, - 21888242871839275222246405745257275088548364400416034343698177340732572954328, - 21888242871839275222246405745257275088548364400416034343698154335158900876278, - 35587544381325551, - 21888242871839275222246405745257275088548364400416034343698187047072484567575, - 21888242871839275222246405745257275088548364400416034343698170296154625057803, - 52010300211359920, - 21888242871839275222246405745257275088548364400416034343698173265276546963352, - 43286466617557757, - 21888242871839275222246405745257275088548364400416034343698161085169942296395, - 21888242871839275222246405745257275088548364400416034343698164866251882969575, - 32487035729113594, - 21888242871839275222246405745257275088548364400416034343698137561335214350789, - 21888242871839275222246405745257275088548364400416034343698137327845516852679, - 13468430548905523, - 60844527903133924, - 21888242871839275222246405745257275088548364400416034343698157599027236130064, - 21888242871839275222246405745257275088548364400416034343698189583570427820445, - 21888242871839275222246405745257275088548364400416034343698159841102125760998, - 36595221399855299, - 21888242871839275222246405745257275088548364400416034343698137320935117795955, - 51420622618203372, - 30341499483672178, - 21888242871839275222246405745257275088548364400416034343698182889031261889710, - 18359757803132345, - 47392687594179252, - 21888242871839275222246405745257275088548364400416034343698203703800460268129, - 21888242871839275222246405745257275088548364400416034343698133392573877764159, - 21888242871839275222246405745257275088548364400416034343698134177583068539645, - 21888242871839275222246405745257275088548364400416034343698186457030834461417, - 21888242871839275222246405745257275088548364400416034343698168820448322513467, - 21888242871839275222246405745257275088548364400416034343698186650610847810188, - 40463387435018793, - 62807929332584545, - 61575916106918270, - 11532912310615182, - 21888242871839275222246405745257275088548364400416034343698169067658998153244, - 49394656421710621, - 21888242871839275222246405745257275088548364400416034343698177066943308977437, - 21888242871839275222246405745257275088548364400416034343698156470288739842903, - 68386088856883051, - 21888242871839275222246405745257275088548364400416034343698151491768032441648, - 21888242871839275222246405745257275088548364400416034343698141941403882915963, - 33193812916129609, - 50868307687958165, - 21888242871839275222246405745257275088548364400416034343698133111281409951334, - 21888242871839275222246405745257275088548364400416034343698200981067050887153, - 31994911966006615, - 11522972685764403, - 51451361662411007, - 3955572142801598, - 21888242871839275222246405745257275088548364400416034343698152555857686409700, - 21888242871839275222246405745257275088548364400416034343698153209534367147766, - 47266967915377967, - 58600859897441493, - 66161198000069755, - 57061856540699468, - 42242869396314374, - 21888242871839275222246405745257275088548364400416034343698195525375932582620, - 35552224155369092, - 55942112862584422, - 14844718570202515, - 21888242871839275222246405745257275088548364400416034343698183694896721575648, - 21888242871839275222246405745257275088548364400416034343698195259199686087404, - 16047711531483038, - 51150593595016471, - 45586766434765584, - 13889685817144860, - 66877244053885311, - 14795842233200351, - 55240438180926114, - 39301294639809276, - 9547130689184603, - 21888242871839275222246405745257275088548364400416034343698165357530503010165, - 18785161201823264, - 21888242871839275222246405745257275088548364400416034343698153071358462140229, - 21888242871839275222246405745257275088548364400416034343698190952600884478053, - 21888242871839275222246405745257275088548364400416034343698190332732828818124, - 21375085025512131, - 51318724312610463, - 7695444727600961, - 21888242871839275222246405745257275088548364400416034343698184954548069600665, - 3291457478484429, - 21888242871839275222246405745257275088548364400416034343698159285524370160264, - 70080900502979500, - 26329959105983916, - 52000789772347924, - 21888242871839275222246405745257275088548364400416034343698161340051933864379, - 42997752788323252, - 5340882010601675, - 21888242871839275222246405745257275088548364400416034343698144492790520574761, - 21888242871839275222246405745257275088548364400416034343698159152706990585787, - 21888242871839275222246405745257275088548364400416034343698189199539577502117, - 21888242871839275222246405745257275088548364400416034343698133663915302441173, - 27366854364407260, - 34649732538780126, - 9901173503806240, - 21888242871839275222246405745257275088548364400416034343698171127037141808068, - 21888242871839275222246405745257275088548364400416034343698143610966023473964, - 70847543726732488, - 21888242871839275222246405745257275088548364400416034343698166428130674578659, - 21888242871839275222246405745257275088548364400416034343698186826887877482994, - 22534346010006490, - 68745261582555896, - 36263633041660960, - 21888242871839275222246405745257275088548364400416034343698143328339387340673, - 38959481784455412, - 30067460232383060, - 4792514011600194, - 61135689528273120, - 21888242871839275222246405745257275088548364400416034343698175912406858329849, - 21888242871839275222246405745257275088548364400416034343698167289661959261190, - 51622295131520112, - 69489435810853580, - 21888242871839275222246405745257275088548364400416034343698146476137763444268, - 47317467517142896, - 21888242871839275222246405745257275088548364400416034343698140525916855789004, - 62851921090701368, - 21888242871839275222246405745257275088548364400416034343698174736109906014963, - 21888242871839275222246405745257275088548364400416034343698158146089684561149, - 52932898805049503, - 21888242871839275222246405745257275088548364400416034343698154875231595627649, - 41286228677701145, - 22173640819552999, - 21888242871839275222246405745257275088548364400416034343698135129466698853631, - 55116207521942994, - 21888242871839275222246405745257275088548364400416034343698171583793528414889, - 22647508570673157, - 24562594998664323, - 51683312500188148, - 48579036742315305, - 53400244284678059, - 16644642039122758, - 53278652062395771, - 28129516095148946, - 21888242871839275222246405745257275088548364400416034343698132211926444749756, - 52216217041293946, - 37541250209371060, - 22074876693587198, - 21888242871839275222246405745257275088548364400416034343698158684237961654939, - 65515756491898728, - 71363267309336267, - 33560321120679205, - 21888242871839275222246405745257275088548364400416034343698145783395279967107, - 50981777613470464, - 21888242871839275222246405745257275088548364400416034343698198815683309217904, - 21888242871839275222246405745257275088548364400416034343698170215583965665827, - 17121605640694905, - 21888242871839275222246405745257275088548364400416034343698133760109605124220, - 37203621315500244, - 8673338402823988, - 21888242871839275222246405745257275088548364400416034343698154941940232504854, - 21888242871839275222246405745257275088548364400416034343698197580367427941553, - 7460324553159930, - 21888242871839275222246405745257275088548364400416034343698168125460288904001, - 17824512080183207, - 16966279367637781, - 21888242871839275222246405745257275088548364400416034343698144349331228674644, - 21888242871839275222246405745257275088548364400416034343698134928619662114184, - 21888242871839275222246405745257275088548364400416034343698133559586238774983, - 21888242871839275222246405745257275088548364400416034343698173509817620280713, - 21888242871839275222246405745257275088548364400416034343698171955895308221445, - 35703847932227962, - 59753688616287168, - 62641722144151296, - 1297899201892822, - 21888242871839275222246405745257275088548364400416034343698138150391438921540, - 22727123072186829, - 21888242871839275222246405745257275088548364400416034343698178106857328488557, - 21888242871839275222246405745257275088548364400416034343698200131740542906346, - 25485104822809672, - 28729173411792442, - 21888242871839275222246405745257275088548364400416034343698168622309505842609, - 21888242871839275222246405745257275088548364400416034343698197787989820101504, - 21888242871839275222246405745257275088548364400416034343698190436802221944263, - 22097495832571079, - 44630341229414379, - 71311342916054554, - 48025171767295088, - 21888242871839275222246405745257275088548364400416034343698194315034424603099, - 13620517570295126, - 21888242871839275222246405745257275088548364400416034343698192387759207095183, - 21888242871839275222246405745257275088548364400416034343698199092252465766414, - 21888242871839275222246405745257275088548364400416034343698148038969142522632, - 30165613237341374, - 7529143336999526, - 15421640665739374, - 61328639259546926, - 609948015244218, - 68418796650525944, - 21888242871839275222246405745257275088548364400416034343698190696788635665412, - 21888242871839275222246405745257275088548364400416034343698148444817812610193, - 40131527500753232, - 21888242871839275222246405745257275088548364400416034343698152155643099027505, - 29674762525360459, - 17800150999432496, - 21888242871839275222246405745257275088548364400416034343698194522821293270029, - 21346108661086204, - 21888242871839275222246405745257275088548364400416034343698176500852011335682, - 21888242871839275222246405745257275088548364400416034343698177471393046125748, - 21888242871839275222246405745257275088548364400416034343698174145822360891426, - 39126512747446683, - 21888242871839275222246405745257275088548364400416034343698150328358332170122, - 21888242871839275222246405745257275088548364400416034343698135081654131001463, - 44454600937866435, - 21888242871839275222246405745257275088548364400416034343698199137979660316254, - 67856451363254067, - 67562868389843025, - 32216697246683572, - 23086821354718620, - 30900068769789699, - 21888242871839275222246405745257275088548364400416034343698148809475886072049, - 21888242871839275222246405745257275088548364400416034343698173012591718218125, - 21888242871839275222246405745257275088548364400416034343698161102328474428951, - 43862036102313686, - 21888242871839275222246405745257275088548364400416034343698132617949372240636, - 50219892918509422, - 21888242871839275222246405745257275088548364400416034343698165237579320779982, - 43113803205873013, - 21888242871839275222246405745257275088548364400416034343698175034388919463538, - 3119304807214633, - 21888242871839275222246405745257275088548364400416034343698142582941320133293, - 21888242871839275222246405745257275088548364400416034343698166209201060804974, - 21888242871839275222246405745257275088548364400416034343698192313477939716434, - 21888242871839275222246405745257275088548364400416034343698192933095827049400, - 32419977356900488, - 21888242871839275222246405745257275088548364400416034343698165526115401409299, - 47027888673784293, - 21888242871839275222246405745257275088548364400416034343698171594264221145056, - 21888242871839275222246405745257275088548364400416034343698139993283003666895, - 38288187234247030, - 21888242871839275222246405745257275088548364400416034343698137987263894709595, - 21888242871839275222246405745257275088548364400416034343698143558447828953692, - 21888242871839275222246405745257275088548364400416034343698141681362543383792, - 21888242871839275222246405745257275088548364400416034343698179192242788204845, - 21888242871839275222246405745257275088548364400416034343698185447551124929266, - 21888242871839275222246405745257275088548364400416034343698173475067644920469, - 3967604667260379, - 28240850366017716, - 21888242871839275222246405745257275088548364400416034343698167458914669238367, - 21888242871839275222246405745257275088548364400416034343698188428749381131142, - 35854165284485759, - 21888242871839275222246405745257275088548364400416034343698148977960631731901, - 21888242871839275222246405745257275088548364400416034343698179434449320254907, - 42119238261539099, - 21888242871839275222246405745257275088548364400416034343698177123480875635950, - 21888242871839275222246405745257275088548364400416034343698201901553617072233, - 21888242871839275222246405745257275088548364400416034343698185065900145671611, - 25883033123069937, - 42533988956880246, - 42946876323618803, - 28133428777118712, - 21888242871839275222246405745257275088548364400416034343698170774181482133733, - 21888242871839275222246405745257275088548364400416034343698188194255644778432, - 50309796586929014, - 55487409557664448, - 62843115068202048, - 62403838396398675, - 32968645503870161, - 21888242871839275222246405745257275088548364400416034343698162279965881664234, - 21888242871839275222246405745257275088548364400416034343698138675118370940238, - 14623375243289645, - 21888242871839275222246405745257275088548364400416034343698142172660199423427, - 48548313456874191, - 48509896928308623, - 8497586919171127, - 8705794026032590, - 21888242871839275222246405745257275088548364400416034343698141911993762491615, - 21888242871839275222246405745257275088548364400416034343698191889843088230090, - 50541010248667385, - 21888242871839275222246405745257275088548364400416034343698151716488611750866, - 50483339048279961, - 21888242871839275222246405745257275088548364400416034343698201700694809921310, - 21888242871839275222246405745257275088548364400416034343698198303117442955148, - 21888242871839275222246405745257275088548364400416034343698193920589550901129, - 21888242871839275222246405745257275088548364400416034343698177435661008077758, - 23467350920994249, - 21888242871839275222246405745257275088548364400416034343698177218297410786219, - 23451869246760632, - 21888242871839275222246405745257275088548364400416034343698173230754818992674, - 16057098510312937, - 69077959278380398, - 21888242871839275222246405745257275088548364400416034343698170457492387989476, - 21888242871839275222246405745257275088548364400416034343698163728073145919427, - 21888242871839275222246405745257275088548364400416034343698141216487206879332, - 69076824484579239, - 63026806153043555, - 56394683566848052, - 21888242871839275222246405745257275088548364400416034343698201560786864509521, - 33683500022672250, - 21888242871839275222246405745257275088548364400416034343698133741974332647271, - 36865011754391231, - 21888242871839275222246405745257275088548364400416034343698185183841440860566, - 24630682869804514, - 18930660018985836, - 21888242871839275222246405745257275088548364400416034343698196016043591623527, - 6010444435460285, - 21888242871839275222246405745257275088548364400416034343698133995261076491581, - 25222128071728552, - 42938903911671141, - 16476027757337360, - 21888242871839275222246405745257275088548364400416034343698197653843526741067, - 21888242871839275222246405745257275088548364400416034343698154830147216959438, - 21888242871839275222246405745257275088548364400416034343698202919831527287230, - 33157261797556074, - 21888242871839275222246405745257275088548364400416034343698180951055789516609, - 21888242871839275222246405745257275088548364400416034343698196908927539436155, - 16225626969245368, - 15251812383993387, - 26309698730155204, - 21888242871839275222246405745257275088548364400416034343698144112426956025226, - 67630451970951754, - 27592781683099092, - 21888242871839275222246405745257275088548364400416034343698170772068553201616, - 21888242871839275222246405745257275088548364400416034343698133167984585163172, - 21888242871839275222246405745257275088548364400416034343698146601809993011294, - 21888242871839275222246405745257275088548364400416034343698188917682761651899, - 21888242871839275222246405745257275088548364400416034343698201388598378211650, - 21888242871839275222246405745257275088548364400416034343698183530692674786221, - 29028789434654762, - 21888242871839275222246405745257275088548364400416034343698189989279464520651, - 48162452653775863, - 38094021493750222, - 21888242871839275222246405745257275088548364400416034343698196383312810155006, - 45164621281316130, - 21888242871839275222246405745257275088548364400416034343698166961198104139296, - 21888242871839275222246405745257275088548364400416034343698144218985635751653, - 2080877202884979, - 62241495309248886, - 50259579665093029, - 21888242871839275222246405745257275088548364400416034343698187956822302893691, - 58088193033764613, - 22363911170641958, - 14104279770523097, - 21888242871839275222246405745257275088548364400416034343698146139776818869491, - 21888242871839275222246405745257275088548364400416034343698177937972695775111, - 21888242871839275222246405745257275088548364400416034343698199768192104454686, - 21888242871839275222246405745257275088548364400416034343698202287977753349251, - 21888242871839275222246405745257275088548364400416034343698151889566669899366, - 21888242871839275222246405745257275088548364400416034343698147265815069762323, - 70388664971160110, - 51803496353655486, - 9356577632520223, - 21888242871839275222246405745257275088548364400416034343698136817672250113910, - 17957898990702414, - 12457740671699588, - 21888242871839275222246405745257275088548364400416034343698169314364571916782, - 21888242871839275222246405745257275088548364400416034343698169654324214570364, - 21888242871839275222246405745257275088548364400416034343698186259860405878858, - 50395333901249281, - 5686282793355506, - 37375954926956522, - 21888242871839275222246405745257275088548364400416034343698195105926872167361, - 21888242871839275222246405745257275088548364400416034343698174465151585025564, - 21888242871839275222246405745257275088548364400416034343698191682899516955185, - 20601047539264048, - 55155180934254228, - 21888242871839275222246405745257275088548364400416034343698138736847763786797, - 21888242871839275222246405745257275088548364400416034343698176549024955950421, - 4087796849032310, - 21888242871839275222246405745257275088548364400416034343698195708494685646153, - 11882701319779176, - 31862440826595949, - 21888242871839275222246405745257275088548364400416034343698136771805876660045, - 21888242871839275222246405745257275088548364400416034343698201644523441827092, - 14955261912394530, - 21888242871839275222246405745257275088548364400416034343698159476921820132017, - 34185071168912658, - 49153933923546920, - 21888242871839275222246405745257275088548364400416034343698165289824725835896, - 42544881255588522, - 66342220241087933, - 21888242871839275222246405745257275088548364400416034343698181797581110779220, - 21888242871839275222246405745257275088548364400416034343698199142219159698086, - 21888242871839275222246405745257275088548364400416034343698181063318751740625, - 3453677897059430, - 60485926551985133, - 5722163541595232, - 21888242871839275222246405745257275088548364400416034343698180699019712023297, - 15075193517959025, - 37546499207856940, - 21888242871839275222246405745257275088548364400416034343698143459321712565243, - 21888242871839275222246405745257275088548364400416034343698193129502631758050, - 21888242871839275222246405745257275088548364400416034343698154553180308693982, - 24935307681477102, - 14763398838988497, - 21888242871839275222246405745257275088548364400416034343698137630605738059312, - 60030597990090373, - 21888242871839275222246405745257275088548364400416034343698203811573468058177, - 30186764105755107, - 21888242871839275222246405745257275088548364400416034343698195013227571181435, - 35775728147854403, - 21888242871839275222246405745257275088548364400416034343698200962985612747066, - 60945014068823630, - 60220605819008750, - 21888242871839275222246405745257275088548364400416034343698187591162545703489, - 21888242871839275222246405745257275088548364400416034343698165660634722586072, - 21888242871839275222246405745257275088548364400416034343698137189974637321036, - 20819246120941235, - 12230358289944221, - 21888242871839275222246405745257275088548364400416034343698155716056191684086, - 21888242871839275222246405745257275088548364400416034343698151741453634921480, - 21888242871839275222246405745257275088548364400416034343698165565409595262194, - 21888242871839275222246405745257275088548364400416034343698179679361954331138, - 39983657492167177, - 53704629379389976, - 21888242871839275222246405745257275088548364400416034343698162306526441512654, - 11275694310432042, - 48716006515021385, - 45732100382370700, - 21888242871839275222246405745257275088548364400416034343698162066953615459962, - 21888242871839275222246405745257275088548364400416034343698177982446958615393, - 8835519066321687, - 43223501080273109, - 21888242871839275222246405745257275088548364400416034343698176066440286628776, - 69918371934630715, - 21888242871839275222246405745257275088548364400416034343698184019214170665666, - 40822294116851226, - 21888242871839275222246405745257275088548364400416034343698181518660066434162, - 11873763762115106, - 2348357762119096, - 21888242871839275222246405745257275088548364400416034343698160304934604541718, - 29878558819588663, - 11315329825008213, - 21888242871839275222246405745257275088548364400416034343698176120144608651563, - 21888242871839275222246405745257275088548364400416034343698195171881409579035, - 51689488470918971, - 50130816918752819, - 21888242871839275222246405745257275088548364400416034343698156753389468673936, - 21888242871839275222246405745257275088548364400416034343698136961999289364839, - 21888242871839275222246405745257275088548364400416034343698183262193593728333, - 80015070398872, - 44521931021183270, - 21888242871839275222246405745257275088548364400416034343698149674938118181738, - 28354381928243487, - 21888242871839275222246405745257275088548364400416034343698185777964319443637, - 39288363705922310, - 7200455181955629, - 9488827510833949, - 21888242871839275222246405745257275088548364400416034343698169365163372298618, - 15491157520942684, - 21888242871839275222246405745257275088548364400416034343698187938757920657512, - 21888242871839275222246405745257275088548364400416034343698135480431645048802, - 21888242871839275222246405745257275088548364400416034343698142017180802653909, - 21888242871839275222246405745257275088548364400416034343698197037855777463842, - 21888242871839275222246405745257275088548364400416034343698133756133263666217, - 21888242871839275222246405745257275088548364400416034343698137653855518479381, - 46778343566307284, - 2464308998023475, - 21888242871839275222246405745257275088548364400416034343698185225289799439138, - 30727058908307898, - 60648992236489409, - 21888242871839275222246405745257275088548364400416034343698162581956000233607, - 65521307046344322, - 21888242871839275222246405745257275088548364400416034343698178751466788537226, - 21888242871839275222246405745257275088548364400416034343698166570169167068112, - 21888242871839275222246405745257275088548364400416034343698200724801110056188, - 70927948751537610, - 21888242871839275222246405745257275088548364400416034343698189555187592044125, - 21888242871839275222246405745257275088548364400416034343698169919788811982896, - 21888242871839275222246405745257275088548364400416034343698133691747151078203, - 21888242871839275222246405745257275088548364400416034343698192215575976110525, - 21888242871839275222246405745257275088548364400416034343698162329971806884153, - 21888242871839275222246405745257275088548364400416034343698203775108635175973, - 15629609160989028, - 5744919861613070, - 21888242871839275222246405745257275088548364400416034343698161139360008000955, - 21888242871839275222246405745257275088548364400416034343698132299483843472751, - 60191262711357765, - 21888242871839275222246405745257275088548364400416034343698173552991189515997, - 50305203800463639, - 43931638570721837, - 21888242871839275222246405745257275088548364400416034343698201836693482507516, - 42877500328772392, - 21888242871839275222246405745257275088548364400416034343698194206769912698805, - 1280549257242466, - 21888242871839275222246405745257275088548364400416034343698179162168754334001, - 25524589984604785, - 21888242871839275222246405745257275088548364400416034343698167022368349195117, - 21888242871839275222246405745257275088548364400416034343698151094568175569860, - 21888242871839275222246405745257275088548364400416034343698195665536299439484, - 2207304386102362, - 47804703133289367, - 21888242871839275222246405745257275088548364400416034343698203274502636895723, - 16180159464878744, - 15361684470583123, - 54639404157728501, - 36099301691019835, - 21888242871839275222246405745257275088548364400416034343698139715943013477957, - 21888242871839275222246405745257275088548364400416034343698194550239752796360, - 21888242871839275222246405745257275088548364400416034343698144661032593711586, - 21888242871839275222246405745257275088548364400416034343698183991144240306317, - 21888242871839275222246405745257275088548364400416034343698194331022969601514, - 18559941246127480, - 53205274126844286, - 60953270550140996, - 61557756643114272, - 28909656665004304, - 7587664575379870, - 21888242871839275222246405745257275088548364400416034343698172420058670693398, - 45251993051412908, - 8744949738143886, - 21888242871839275222246405745257275088548364400416034343698198767584104006126, - 27839056787093236, - 21888242871839275222246405745257275088548364400416034343698165150150413807323, - 21888242871839275222246405745257275088548364400416034343698196302830034152590, - 15131693163232708, - 9186769204439033, - 67110696345169994, - 7877676697030257, - 43443473685812862, - 21888242871839275222246405745257275088548364400416034343698177319589398208118, - 51610445888651202, - 62796102335097147, - 21888242871839275222246405745257275088548364400416034343698198601841408182620, - 32756327894514494, - 52331583091747214, - 47319167601733824, - 21888242871839275222246405745257275088548364400416034343698189397400264678152, - 21888242871839275222246405745257275088548364400416034343698146192121206894562, - 46226840712388656, - 53278291689518011, - 52353531019976242, - 20702466290851311, - 44675715588925494, - 21888242871839275222246405745257275088548364400416034343698136634618950972910, - 21888242871839275222246405745257275088548364400416034343698188641021410586848, - 21888242871839275222246405745257275088548364400416034343698149380376013721344, - 21888242871839275222246405745257275088548364400416034343698169363609748947438, - 29897154246718624, - 646963677627868, - 29163955125997994, - 21888242871839275222246405745257275088548364400416034343698156602413295315400, - 58094841530198175, - 21888242871839275222246405745257275088548364400416034343698169701924394721456, - 33689195269947986, - 47268167293855876, - 22167566012616303, - 21888242871839275222246405745257275088548364400416034343698196898561740227923, - 63028934783882975, - 21888242871839275222246405745257275088548364400416034343698198188013436104217, - 31539620595885959, - 32504682930438269, - 32406711883776382, - 20081209778597650, - 23040630217364045, - 12825100216779752, - 26415570788664707, - 21888242871839275222246405745257275088548364400416034343698132929572324528557, - 4934599565930540, - 5292353572573593, - 21888242871839275222246405745257275088548364400416034343698136333652250071583, - 21888242871839275222246405745257275088548364400416034343698157756515634797563, - 21888242871839275222246405745257275088548364400416034343698179690016598166195, - 42368642096562160, - 21888242871839275222246405745257275088548364400416034343698182703350808029639, - 21888242871839275222246405745257275088548364400416034343698181415706275153087, - 21888242871839275222246405745257275088548364400416034343698196124252843766363, - 56395691714703372, - 52133516186012065, - 21888242871839275222246405745257275088548364400416034343698200999896335409534, - 21888242871839275222246405745257275088548364400416034343698168573499146927068, - 21888242871839275222246405745257275088548364400416034343698172513819320310147, - 60827556839933715, - 21888242871839275222246405745257275088548364400416034343698170878566687438151, - 30882993403184913, - 21888242871839275222246405745257275088548364400416034343698171183050842352772, - 22543022148904524, - 21888242871839275222246405745257275088548364400416034343698173592233528796086, - 21888242871839275222246405745257275088548364400416034343698184044338098059879, - 21888242871839275222246405745257275088548364400416034343698184020174087560742, - 19480732927994124, - 67652330563572472, - 21888242871839275222246405745257275088548364400416034343698185529684531286717, - 21888242871839275222246405745257275088548364400416034343698172088874558214041, - 63310503799792690, - 13150969183419333, - 21888242871839275222246405745257275088548364400416034343698182707854864994142, - 21888242871839275222246405745257275088548364400416034343698193378568664916361, - 21888242871839275222246405745257275088548364400416034343698196574218560795589, - 36793350416651463, - 21888242871839275222246405745257275088548364400416034343698157820838710801570, - 21888242871839275222246405745257275088548364400416034343698201571129374070185, - 22063607373609739, - 21888242871839275222246405745257275088548364400416034343698195112891476813556, - 70999362704317734, - 63895241122492963, - 55120283024576344, - 67096554390275827, - 20556841089019705, - 50457265132983858, - 21888242871839275222246405745257275088548364400416034343698146086888805031896, - 60945039698545784, - 16526949049037201, - 21888242871839275222246405745257275088548364400416034343698161386735813861566, - 21888242871839275222246405745257275088548364400416034343698168156071601351225, - 45730401488187768, - 11929510551551452, - 13011261360741850, - 21888242871839275222246405745257275088548364400416034343698156284569384446805, - 21888242871839275222246405745257275088548364400416034343698161459629114072898, - 21888242871839275222246405745257275088548364400416034343698184110612380673149, - 43638244119857044, - 33134102711299711, - 21888242871839275222246405745257275088548364400416034343698152119103928902319, - 21888242871839275222246405745257275088548364400416034343698134094701067669088, - 24382784660229521, - 65646439140598090, - 52456420954694616, - 32940777772379951, - 65040477344860954, - 25134451269362230, - 21888242871839275222246405745257275088548364400416034343698195297629834433380, - 21888242871839275222246405745257275088548364400416034343698151346906051049403, - 62169768448267654, - 40997785594183204, - 62512430429762206, - 34354937798202888, - 71202768981903159, - 37809605771901251, - 2663500591841549, - 2497858601431730, - 32016516907197887, - 21888242871839275222246405745257275088548364400416034343698183187468899732508, - 21888242871839275222246405745257275088548364400416034343698173330672798826637, - 21888242871839275222246405745257275088548364400416034343698146011048593751223, - 21888242871839275222246405745257275088548364400416034343698170467808716377918, - 21888242871839275222246405745257275088548364400416034343698203855016003359858, - 21888242871839275222246405745257275088548364400416034343698186130659666533466, - 59470823905386797, - 21888242871839275222246405745257275088548364400416034343698177095786525782577, - 21888242871839275222246405745257275088548364400416034343698149252003145528504, - 22314977763758487, - 13538573976372398, - 21888242871839275222246405745257275088548364400416034343698166521326723675192, - 22434695028008520, - 21888242871839275222246405745257275088548364400416034343698176466381991769147, - 34317616429103088, - 3123484422051062, - 21888242871839275222246405745257275088548364400416034343698152238586799434373, - 11394786424162599, - 21888242871839275222246405745257275088548364400416034343698180241300662212914, - 21888242871839275222246405745257275088548364400416034343698203601074710912365, - 21888242871839275222246405745257275088548364400416034343698158665679698955072, - 16433773782691244, - 1589546562675273, - 47593926744743443, - 54400460323349518, - 21888242871839275222246405745257275088548364400416034343698160130551409458678, - 21888242871839275222246405745257275088548364400416034343698176655813916817208, - 21888242871839275222246405745257275088548364400416034343698196905108648950505, - 18132843379596388, - 21888242871839275222246405745257275088548364400416034343698172484434509959744, - 21888242871839275222246405745257275088548364400416034343698137227683093605512, - 37132589061909291, - 21888242871839275222246405745257275088548364400416034343698146630472164187387, - 21888242871839275222246405745257275088548364400416034343698135087165601400781, - 21888242871839275222246405745257275088548364400416034343698144042865616714212, - 56811739295210644, - 39670774489733034, - 21888242871839275222246405745257275088548364400416034343698132454215742314440, - 46374052549197601, - 1784384039735594, - 28973082643641175, - 16124845532382927, - 21888242871839275222246405745257275088548364400416034343698165340251897670931, - 21888242871839275222246405745257275088548364400416034343698179016699187402003, - 21888242871839275222246405745257275088548364400416034343698154554708521210052, - 21888242871839275222246405745257275088548364400416034343698203023725515439191, - 21888242871839275222246405745257275088548364400416034343698190309667292573791, - 35147987079672155, - 21888242871839275222246405745257275088548364400416034343698151823675095889793, - 30030993966550176, - 21888242871839275222246405745257275088548364400416034343698143288924231059433, - 21888242871839275222246405745257275088548364400416034343698169054367522972788, - 21888242871839275222246405745257275088548364400416034343698189415712813268277, - 18184278251813815, - 8976103669654423, - 59764900013304870, - 21888242871839275222246405745257275088548364400416034343698198184745750524317, - 47726432798278725, - 61232470602994562, - 21888242871839275222246405745257275088548364400416034343698184482743357123022, - 21888242871839275222246405745257275088548364400416034343698145378956378697034, - 21888242871839275222246405745257275088548364400416034343698179755077514387725, - 21888242871839275222246405745257275088548364400416034343698165502509345947983, - 41162697723868252, - 21888242871839275222246405745257275088548364400416034343698187948623274349818, - 21888242871839275222246405745257275088548364400416034343698199401702119837492, - 17387924014119922, - 62363036292089460, - 34091546614241667, - 57918813138882579, - 15112765238928311, - 34688138502853083, - 21888242871839275222246405745257275088548364400416034343698190184142563460618, - 19944985806264071, - 21888242871839275222246405745257275088548364400416034343698193218500765734372, - 12521509547900764, - 21888242871839275222246405745257275088548364400416034343698194094074486415877, - 18986214498365930, - 65771074753768343, - 21888242871839275222246405745257275088548364400416034343698171388020715208342, - 21888242871839275222246405745257275088548364400416034343698178099278842443882, - 15828409205928717, - 21888242871839275222246405745257275088548364400416034343698147487541202024511, - 45966395313285297, - 59584817705698225, - 21888242871839275222246405745257275088548364400416034343698183873008345160459, - 55986357401207036, - 14491989115192702, - 48753621656545756, - 31071878886059237, - 24712338495627454, - 43753538659868086, - 2898569750507778, - 28741703862010702, - 21888242871839275222246405745257275088548364400416034343698184705156474692203, - 21888242871839275222246405745257275088548364400416034343698158813940727754748, - 32817553824560469, - 29717348682238911, - 5271176087685001, - 21888242871839275222246405745257275088548364400416034343698203997649163280023, - 21888242871839275222246405745257275088548364400416034343698151984768423270900, - 21888242871839275222246405745257275088548364400416034343698172938763887164792, - 40433603887117238, - 21888242871839275222246405745257275088548364400416034343698200878621365718606, - 21888242871839275222246405745257275088548364400416034343698134346767567232629, - 21888242871839275222246405745257275088548364400416034343698202480605009363441, - 32155146712224458, - 21888242871839275222246405745257275088548364400416034343698160130442781934393, - 21888242871839275222246405745257275088548364400416034343698144521940724705374, - 9828413230842587, - 25004966782991559, - 11317648725270837, - 21888242871839275222246405745257275088548364400416034343698146334174539188096, - 25567311534080646, - 21888242871839275222246405745257275088548364400416034343698149649187802255888, - 21888242871839275222246405745257275088548364400416034343698184053414860361814, - 33024295492237800, - 47092754837052781, - 31981884457402104, - 21888242871839275222246405745257275088548364400416034343698175533527495976782, - 21888242871839275222246405745257275088548364400416034343698159716139680729057, - 38275237328622510, - 16847923574570744, - 21888242871839275222246405745257275088548364400416034343698151446495963423493, - 21888242871839275222246405745257275088548364400416034343698137515297939978098, - 21888242871839275222246405745257275088548364400416034343698150134734731361123, - 21888242871839275222246405745257275088548364400416034343698140759775624815242, - 17389367884810252, - 24937873404472715, - 21888242871839275222246405745257275088548364400416034343698137603136340370127, - 20200498164886117, - 21888242871839275222246405745257275088548364400416034343698160253292581500948, - 21888242871839275222246405745257275088548364400416034343698147728063914049952, - 21888242871839275222246405745257275088548364400416034343698168903798872507061, - 21888242871839275222246405745257275088548364400416034343698153548755104140992, - 21888242871839275222246405745257275088548364400416034343698173708277292837276, - 21888242871839275222246405745257275088548364400416034343698168312089054915891, - 21888242871839275222246405745257275088548364400416034343698142421218896396977, - 62996915638932030, - 21888242871839275222246405745257275088548364400416034343698200410246865181562, - 12449285493290090, - 21888242871839275222246405745257275088548364400416034343698162210857930389450, - 17497659333856667, - 13852278790658024, - 21888242871839275222246405745257275088548364400416034343698188562638324598993, - 57640695170937911, - 8380744078555856, - 6607651489441131, - 47107707181877942, - 60787944436451372, - 15937645089331313, - 37534330356281463, - 21888242871839275222246405745257275088548364400416034343698181554782605516986, - 21888242871839275222246405745257275088548364400416034343698197091829922953931, - 21888242871839275222246405745257275088548364400416034343698186574465429262740, - 17037582597978005, - 21888242871839275222246405745257275088548364400416034343698152292821051730201, - 21888242871839275222246405745257275088548364400416034343698174702939248148229, - 64363375747500822, - 2440572932902086, - 21888242871839275222246405745257275088548364400416034343698151299932488703021, - 60642327244991462, - 21888242871839275222246405745257275088548364400416034343698190728944257669338, - 21888242871839275222246405745257275088548364400416034343698196485650341447150, - 21888242871839275222246405745257275088548364400416034343698145169615181070611, - 24174400684963787, - 20237771646073969, - 10232452033909304, - 21888242871839275222246405745257275088548364400416034343698163994134832042042, - 21888242871839275222246405745257275088548364400416034343698165055490704896019, - 5628730716099422, - 21888242871839275222246405745257275088548364400416034343698159977152321611442, - 21888242871839275222246405745257275088548364400416034343698191560974241073168, - 59281349034147425, - 7409970520601478, - 21888242871839275222246405745257275088548364400416034343698186418220660299516, - 71245888518387348, - 21888242871839275222246405745257275088548364400416034343698193237319411470154, - 21888242871839275222246405745257275088548364400416034343698202404026357997692, - 19598005191868438, - 21888242871839275222246405745257275088548364400416034343698180859658589617212, - 34929149886208678, - 21888242871839275222246405745257275088548364400416034343698175593689461229568, - 21888242871839275222246405745257275088548364400416034343698174320325639502332, - 21888242871839275222246405745257275088548364400416034343698140801665064251484, - 21888242871839275222246405745257275088548364400416034343698149491470012491674, - 2751282625397518, - 21888242871839275222246405745257275088548364400416034343698139691061848864562, - 60160820909136588, - 21888242871839275222246405745257275088548364400416034343698181147867366430301, - 21888242871839275222246405745257275088548364400416034343698203309913482924504, - 21888242871839275222246405745257275088548364400416034343698190345072629356428, - 38398680633601503, - 21888242871839275222246405745257275088548364400416034343698144300003786659129, - 71590223827870711, - 13151111685730153, - 40966987016239691, - 22909077060278286, - 21888242871839275222246405745257275088548364400416034343698159488440348284360, - 21888242871839275222246405745257275088548364400416034343698143525017607244065, - 61400055446233935, - 21888242871839275222246405745257275088548364400416034343698187580895959250782, - 38120610801412417, - 21888242871839275222246405745257275088548364400416034343698200860555339832682, - 21888242871839275222246405745257275088548364400416034343698186969972229107520, - 55850702242319792, - 43816919948701185, - 21888242871839275222246405745257275088548364400416034343698179768531121821127, - 21888242871839275222246405745257275088548364400416034343698158795927987794746, - 21888242871839275222246405745257275088548364400416034343698176307470217011863, - 21888242871839275222246405745257275088548364400416034343698153604466913111644, - 30744697683643360, - 8322033489104915, - 67563260828333676, - 34558781366883927, - 6679126907963872, - 28925198545114810, - 19408311024382516, - 64414484035637282, - 16212168025567932, - 21266436030956499, - 67716070076779502, - 21888242871839275222246405745257275088548364400416034343698192989597832100086, - 14142387920461650, - 18792255582145729, - 21888242871839275222246405745257275088548364400416034343698181582907524796603, - 21888242871839275222246405745257275088548364400416034343698132385262939723032, - 22453368940970702, - 28447286917873653, - 21888242871839275222246405745257275088548364400416034343698137706072662049071, - 10146097246365348, - 16876073579879515, - 69772731288110568, - 21888242871839275222246405745257275088548364400416034343698167118771156138962, - 10148988128410160, - 6479883409325850, - 21888242871839275222246405745257275088548364400416034343698194320756522432600, - 57879468009638603, - 45358757471896590, - 9821110086120313, - 21888242871839275222246405745257275088548364400416034343698188684661058305887, - 21888242871839275222246405745257275088548364400416034343698170466919444783306, - 21888242871839275222246405745257275088548364400416034343698198215075322234528, - 70417990261606430, - 23832246455689963, - 37640136051070808, - 21888242871839275222246405745257275088548364400416034343698152413381692919848, - 21888242871839275222246405745257275088548364400416034343698169708350107578794, - 55333715486728249, - 4265587219652807, - 21888242871839275222246405745257275088548364400416034343698202875377677593341, - 21888242871839275222246405745257275088548364400416034343698148487350220781124, - 21888242871839275222246405745257275088548364400416034343698204075064994036708, - 21888242871839275222246405745257275088548364400416034343698133525064632727877, - 21888242871839275222246405745257275088548364400416034343698159380721863930312, - 21888242871839275222246405745257275088548364400416034343698160579325620548694, - 29112863673272105, - 21888242871839275222246405745257275088548364400416034343698194208837327654947, - 27509145111027580, - 69316024464459363, - 50064020169498363, - 21888242871839275222246405745257275088548364400416034343698189098768962379463, - 21888242871839275222246405745257275088548364400416034343698151523788909670836, - 21888242871839275222246405745257275088548364400416034343698137376086995941946, - 34895772797370407, - 54487061305448700, - 13508743611975587, - 58852693974887672, - 21888242871839275222246405745257275088548364400416034343698147341281015913201, - 53012423102516256, - 30885024405851308, - 21888242871839275222246405745257275088548364400416034343698165529338194786202, - 21888242871839275222246405745257275088548364400416034343698132174909640067040, - 21888242871839275222246405745257275088548364400416034343698196815071505009558, - 21888242871839275222246405745257275088548364400416034343698172708752710036385, - 54776215889105374, - 57540445746920034, - 39321203397425445, - 21888242871839275222246405745257275088548364400416034343698186529930659137431, - 21888242871839275222246405745257275088548364400416034343698152141313007522442, - 29417089510347269, - 21888242871839275222246405745257275088548364400416034343698154428165865065534, - 21888242871839275222246405745257275088548364400416034343698156629087521090088, - 21888242871839275222246405745257275088548364400416034343698140280162541152349, - 41614429569672608, - 7667071876495560, - 55719227055793484, - 66488169261719781, - 11214371421963366, - 21888242871839275222246405745257275088548364400416034343698140508317837056093, - 21888242871839275222246405745257275088548364400416034343698178313745852903904, - 60984746273234733, - 46473260989646504, - 63265280499997685, - 21888242871839275222246405745257275088548364400416034343698143405058194493061, - 22743695795985671, - 31432187740172489, - 21888242871839275222246405745257275088548364400416034343698161459393908659223, - 22267628849198858, - 21888242871839275222246405745257275088548364400416034343698189338356128563992, - 21888242871839275222246405745257275088548364400416034343698170611203112202148, - 21888242871839275222246405745257275088548364400416034343698141206878845047248, - 21888242871839275222246405745257275088548364400416034343698144811234555221637, - 21888242871839275222246405745257275088548364400416034343698193453205254303048, - 21888242871839275222246405745257275088548364400416034343698146154021308175723, - 21888242871839275222246405745257275088548364400416034343698190193799021336751, - 65172733081097632, - 21888242871839275222246405745257275088548364400416034343698195269308196108230, - 15120875164990073, - 28991113880771426, - 1269454722448577, - 43697814150520194, - 21888242871839275222246405745257275088548364400416034343698161018191580456202, - 57067450362866658, - 65972095345620408, - 21888242871839275222246405745257275088548364400416034343698146488912162737243, - 21888242871839275222246405745257275088548364400416034343698133489037665529549, - 48325840595089518, - 21888242871839275222246405745257275088548364400416034343698145108023462855279, - 21888242871839275222246405745257275088548364400416034343698170764029693479727, - 38464468317793368, - 64812030984569111, - 21888242871839275222246405745257275088548364400416034343698142474213731891641, - 52428298199444620, - 21888242871839275222246405745257275088548364400416034343698154397997868716219, - 21888242871839275222246405745257275088548364400416034343698151294110315013582, - 45864378824608866, - 66112990835544437, - 27811312675020815, - 7935042364466900, - 41200561217544858, - 21888242871839275222246405745257275088548364400416034343698151053044235823950, - 44066831868359749, - 21888242871839275222246405745257275088548364400416034343698151072139852894269, - 6698811932343301, - 64919557886565186, - 70471681850329003, - 11760221688904963, - 49779242930486065, - 19428441983624719, - 55574410290373779, - 21888242871839275222246405745257275088548364400416034343698166402822533741006, - 21888242871839275222246405745257275088548364400416034343698156477882525380516, - 21888242871839275222246405745257275088548364400416034343698191195513371245818, - 1668857873034450, - 21888242871839275222246405745257275088548364400416034343698164421079217605898, - 21888242871839275222246405745257275088548364400416034343698184438409292797919, - 21888242871839275222246405745257275088548364400416034343698132329171788295842, - 21888242871839275222246405745257275088548364400416034343698176160911301323493, - 21888242871839275222246405745257275088548364400416034343698145435254403074203, - 21888242871839275222246405745257275088548364400416034343698183421935902567675, - 53225072927791028, - 3538464187575568, - 58335852215691849, - 21888242871839275222246405745257275088548364400416034343698134721542461577567, - 60542059381193692, - 21888242871839275222246405745257275088548364400416034343698174365056784206190, - 21888242871839275222246405745257275088548364400416034343698171038869601441325, - 21888242871839275222246405745257275088548364400416034343698147949196194853250, - 44910849298105276, - 21888242871839275222246405745257275088548364400416034343698186160694308600056, - 21888242871839275222246405745257275088548364400416034343698174315420904071296, - 21888242871839275222246405745257275088548364400416034343698152743991555762716, - 24493674786303298, - 21888242871839275222246405745257275088548364400416034343698136184723628714597, - 13884712062014044, - 69400779063549918, - 21888242871839275222246405745257275088548364400416034343698189394455133415751, - 36168272547573541, - 21888242871839275222246405745257275088548364400416034343698156949803766343559, - 60754034407004882, - 21888242871839275222246405745257275088548364400416034343698181700736980310528, - 65989807464998645, - 21888242871839275222246405745257275088548364400416034343698136058924385480599, - 16566846734314545, - 21888242871839275222246405745257275088548364400416034343698183893090957093892, - 21888242871839275222246405745257275088548364400416034343698154761134199905001, - 31165914191570407, - 44183611895419754, - 21888242871839275222246405745257275088548364400416034343698169036220677955179, - 22509771910580174, - 22040093469850076, - 21888242871839275222246405745257275088548364400416034343698199990612946500651, - 7916993699679681, - 21888242871839275222246405745257275088548364400416034343698138700190927327583, - 21888242871839275222246405745257275088548364400416034343698180034161023763118, - 21888242871839275222246405745257275088548364400416034343698144366312144794000, - 21888242871839275222246405745257275088548364400416034343698190430363236846169, - 21888242871839275222246405745257275088548364400416034343698187779820610962837, - 56503121554859256, - 20327024182249957, - 21888242871839275222246405745257275088548364400416034343698195433144021454296, - 21888242871839275222246405745257275088548364400416034343698154231973714690828, - 21888242871839275222246405745257275088548364400416034343698188280801289151139, - 21888242871839275222246405745257275088548364400416034343698195255434989562123, - 11099632613416360, - 21888242871839275222246405745257275088548364400416034343698177609413151582247, - 21888242871839275222246405745257275088548364400416034343698186852881525063462, - 33814602661618813, - 21888242871839275222246405745257275088548364400416034343698185130416827981481, - 21888242871839275222246405745257275088548364400416034343698178969287948274969, - 21888242871839275222246405745257275088548364400416034343698175214927301065368, - 21888242871839275222246405745257275088548364400416034343698196964751000478512, - 48174596952210857, - 33403159581931257, - 71045906192411172, - 40299639233999669, - 15364414582636103, - 30180372987223349, - 21888242871839275222246405745257275088548364400416034343698144938396454761081, - 21888242871839275222246405745257275088548364400416034343698183557298516604533, - 25613020499892058, - 57631480900005552, - 25553838484521745, - 21888242871839275222246405745257275088548364400416034343698153034838608335056, - 45801527579975022, - 21888242871839275222246405745257275088548364400416034343698179426374876083458, - 21888242871839275222246405745257275088548364400416034343698193720419375761664, - 21888242871839275222246405745257275088548364400416034343698142646057860846132, - 18261058975600580, - 54125520303085773, - 13273514250739962, - 6310580932859472, - 21888242871839275222246405745257275088548364400416034343698141929251403331157, - 21888242871839275222246405745257275088548364400416034343698136217541222532386, - 24423026936734948, - 38009098339925533, - 13020948193949244, - 21888242871839275222246405745257275088548364400416034343698157750783082515076, - 25245896865202306, - 69149673498495973, - 21888242871839275222246405745257275088548364400416034343698136683066242524929, - 21888242871839275222246405745257275088548364400416034343698196075689675335662, - 7270955315812323, - 50669908835824336, - 58551830322676352, - 21888242871839275222246405745257275088548364400416034343698174491404180630657, - 51939014303829141, - 21888242871839275222246405745257275088548364400416034343698148596620865327656, - 71154137312302633, - 37568564638454657, - 21888242871839275222246405745257275088548364400416034343698175236938835837808, - 21888242871839275222246405745257275088548364400416034343698178144440770662347, - 13597929288956051, - 19399172350831183, - 21888242871839275222246405745257275088548364400416034343698199490385893548034, - 58592998460289247, - 62388801383208944, - 15065735159779086, - 58968452613059516, - 21888242871839275222246405745257275088548364400416034343698193757908231124701, - 21888242871839275222246405745257275088548364400416034343698159965383825375343, - 55896407577345181, - 48640907235568987, - 21888242871839275222246405745257275088548364400416034343698151466475347669545, - 21888242871839275222246405745257275088548364400416034343698177117642452429790, - 58447668189085799, - 12758545467585102, - 21888242871839275222246405745257275088548364400416034343698202758227067996972, - 47457802958069676, - 21888242871839275222246405745257275088548364400416034343698147314705524788391, - 458206342116649, - 21888242871839275222246405745257275088548364400416034343698193457420848374082, - 58361650968185596, - 21888242871839275222246405745257275088548364400416034343698169602439848643392, - 21888242871839275222246405745257275088548364400416034343698141808928914813935, - 13273667686596811, - 21888242871839275222246405745257275088548364400416034343698133523194245036527, - 28501172102745427, - 21888242871839275222246405745257275088548364400416034343698170670220722861586, - 21888242871839275222246405745257275088548364400416034343698175393971328651685, - 21888242871839275222246405745257275088548364400416034343698154381388583455832, - 21888242871839275222246405745257275088548364400416034343698180790497473644979, - 9993180914247446, - 13637874262135028, - 21888242871839275222246405745257275088548364400416034343698140491228525910685, - 21888242871839275222246405745257275088548364400416034343698142816972917773177, - 21888242871839275222246405745257275088548364400416034343698185705240528659619, - 53576111292848188, - 24896017192520731, - 21888242871839275222246405745257275088548364400416034343698193458557428547866, - 21888242871839275222246405745257275088548364400416034343698149310027737953610, - 19781670038933481, - 21888242871839275222246405745257275088548364400416034343698197667049790316168, - 23729872255297397, - 21888242871839275222246405745257275088548364400416034343698165875387181460180, - 21888242871839275222246405745257275088548364400416034343698189394596136639834, - 21888242871839275222246405745257275088548364400416034343698183296152127892673, - 28071658081821467, - 21888242871839275222246405745257275088548364400416034343698167620939026545664, - 8791635689777303, - 20327119408392400, - 21888242871839275222246405745257275088548364400416034343698164312042911239608, - 68959208360383856, - 39942734224637354, - 20066712094428993, - 21888242871839275222246405745257275088548364400416034343698173441145189794061, - 16417854387153597, - 25150121867224497, - 21888242871839275222246405745257275088548364400416034343698148848338282213528, - 21888242871839275222246405745257275088548364400416034343698135813821981800357, - 10629204948448968, - 21888242871839275222246405745257275088548364400416034343698136875114886346858, - 4362817616416239, - 9648564647745595, - 21888242871839275222246405745257275088548364400416034343698171544122097507575, - 21888242871839275222246405745257275088548364400416034343698139219539280501691, - 45206748994592335, - 21888242871839275222246405745257275088548364400416034343698157156017642508927, - 67902423692562938, - 21888242871839275222246405745257275088548364400416034343698170118849784473944, - 21888242871839275222246405745257275088548364400416034343698132665062105379602, - 1212256120343531, - 46013507068746660, - 756597807027200, - 32921058778203575, - 70870142337661386, - 21888242871839275222246405745257275088548364400416034343698177163802574549401, - 21888242871839275222246405745257275088548364400416034343698174435145494163253, - 21888242871839275222246405745257275088548364400416034343698144660866925079290, - 21888242871839275222246405745257275088548364400416034343698172152435021433475, - 21888242871839275222246405745257275088548364400416034343698161536477430016416, - 48571623302309202, - 29214343958154006, - 41779415425756537, - 32966202970081082, - 21888242871839275222246405745257275088548364400416034343698165103766386652794, - 21888242871839275222246405745257275088548364400416034343698202355726288233272, - 46969383495494747, - 7873015717320033, - 61907335805833069, - 52292451359939258, - 21888242871839275222246405745257275088548364400416034343698192525933180984272, - 21888242871839275222246405745257275088548364400416034343698136330043817315468, - 21888242871839275222246405745257275088548364400416034343698173735638948661130, - 46589418026203617, - 21888242871839275222246405745257275088548364400416034343698160605226146034171, - 32103815818584487, - 58596485016718703, - 45292859494936311, - 70180917219356022, - 21888242871839275222246405745257275088548364400416034343698132610530499496533, - 22258652757537422, - 21888242871839275222246405745257275088548364400416034343698180232924594617161, - 11225692747444593, - 15079124207779839, - 21888242871839275222246405745257275088548364400416034343698203292342985764714, - 56998127234288654, - 50148675473679815, - 21888242871839275222246405745257275088548364400416034343698157098286929999285, - 21888242871839275222246405745257275088548364400416034343698179589908838632919, - 8638882958078959, - 21888242871839275222246405745257275088548364400416034343698180771687845394877, - 8020678920103480, - 33461182244007190, - 21888242871839275222246405745257275088548364400416034343698135177511613891809, - 60893002977573334, - 21888242871839275222246405745257275088548364400416034343698156145084859507717, - 21888242871839275222246405745257275088548364400416034343698178892482072333282, - 60946871094206392, - 21888242871839275222246405745257275088548364400416034343698161687230316466437, - 37873826805185463, - 62337922825939446, - 45777815829944004, - 21888242871839275222246405745257275088548364400416034343698196521354559135713, - 21888242871839275222246405745257275088548364400416034343698181294504115858628, - 65390482470360347, - 21888242871839275222246405745257275088548364400416034343698155429468349799607, - 28664556132949642, - 37697317099485301, - 51905552834730452, - 20573076953640620, - 21888242871839275222246405745257275088548364400416034343698135118919160858180, - 54559684622630914, - 21888242871839275222246405745257275088548364400416034343698150791576609589085, - 51941767614173862, - 66228972986645662, - 21888242871839275222246405745257275088548364400416034343698201911645241127768, - 21888242871839275222246405745257275088548364400416034343698161311222651148303, - 21888242871839275222246405745257275088548364400416034343698156873759085361829, - 21888242871839275222246405745257275088548364400416034343698194367255508365001, - 63282499331770208, - 3266268898217875, - 9347474597896212, - 35406274915580563, - 48624356997483171, - 21888242871839275222246405745257275088548364400416034343698192271637048940514, - 10395112595485784, - 21888242871839275222246405745257275088548364400416034343698195872090956855360, - 21888242871839275222246405745257275088548364400416034343698196507833292136188, - 21888242871839275222246405745257275088548364400416034343698153656914169425396, - 21888242871839275222246405745257275088548364400416034343698155496898341822651, - 21888242871839275222246405745257275088548364400416034343698171387110521973405, - 39181942918869082, - 21888242871839275222246405745257275088548364400416034343698149600927724986968, - 19936883943850036, - 23427419789315184, - 21888242871839275222246405745257275088548364400416034343698132761301828753863, - 62817750306411706, - 21888242871839275222246405745257275088548364400416034343698190753627463531824, - 21888242871839275222246405745257275088548364400416034343698199489541487905287, - 21888242871839275222246405745257275088548364400416034343698186309930393512485, - 21888242871839275222246405745257275088548364400416034343698140390198103411032, - 21888242871839275222246405745257275088548364400416034343698158070196380257347, - 21888242871839275222246405745257275088548364400416034343698189916783940895584, - 21888242871839275222246405745257275088548364400416034343698185428777640556264, - 50078358477237341, - 19012699631648924, - 1629004533895601, - 21888242871839275222246405745257275088548364400416034343698194411830495879690, - 19559036694773892, - 10215095343335692, - 3326373796197096, - 21888242871839275222246405745257275088548364400416034343698159651747529960499, - 21888242871839275222246405745257275088548364400416034343698162313705919018514, - 4805766430689623, - 21888242871839275222246405745257275088548364400416034343698137500124230322125, - 45985382814333451, - 71558442494062133, - 21888242871839275222246405745257275088548364400416034343698199187000259252397, - 26592706357094415, - 21888242871839275222246405745257275088548364400416034343698179207395899255838, - 21888242871839275222246405745257275088548364400416034343698196434182675610847, - 960187328067933, - 69131215564171166, - 54140173296106891, - 21888242871839275222246405745257275088548364400416034343698152769642596458261, - 14859519352931255, - 39530290652003213, - 23232940196824810, - 21888242871839275222246405745257275088548364400416034343698165291292688052015, - 21888242871839275222246405745257275088548364400416034343698165306729553582673, - 26400957093117758, - 21888242871839275222246405745257275088548364400416034343698156336495807907675, - 53714229353085748, - 667063165346058, - 2747664524112140, - 21888242871839275222246405745257275088548364400416034343698193980591441981376, - 21888242871839275222246405745257275088548364400416034343698172195103210285978, - 55433592259811457, - 6719867406984010, - 21888242871839275222246405745257275088548364400416034343698193909412810621991, - 14821865736832638, - 21888242871839275222246405745257275088548364400416034343698155605809810113303, - 71343871266571188, - 21888242871839275222246405745257275088548364400416034343698201782486597439829, - 21888242871839275222246405745257275088548364400416034343698156987889305063960, - 21888242871839275222246405745257275088548364400416034343698162419465231295392, - 21888242871839275222246405745257275088548364400416034343698168954613185409316, - 21888242871839275222246405745257275088548364400416034343698198400772292696239, - 21888242871839275222246405745257275088548364400416034343698150959984599008250, - 19589075643688579, - 21888242871839275222246405745257275088548364400416034343698149479159292865013, - 21888242871839275222246405745257275088548364400416034343698157894289700529262, - 21888242871839275222246405745257275088548364400416034343698193624301010367282, - 71499161822471705, - 28364689585828588, - 21888242871839275222246405745257275088548364400416034343698139663829585771253, - 21888242871839275222246405745257275088548364400416034343698133144287582686070, - 4298342619593770, - 281163268320813, - 21888242871839275222246405745257275088548364400416034343698138358299950340009, - 21888242871839275222246405745257275088548364400416034343698171873868447735622, - 21888242871839275222246405745257275088548364400416034343698179484986569310703, - 45340676269713637, - 3441631300424171, - 3126185869307115, - 21888242871839275222246405745257275088548364400416034343698161490144464509426, - 21888242871839275222246405745257275088548364400416034343698170082798359427791, - 21888242871839275222246405745257275088548364400416034343698190010728309443448, - 21888242871839275222246405745257275088548364400416034343698135281553330350404, - 16201686025649617, - 21888242871839275222246405745257275088548364400416034343698201619764248413871, - 21888242871839275222246405745257275088548364400416034343698201780094946454574, - 33389859301635027, - 21888242871839275222246405745257275088548364400416034343698136726806579574402, - 5480055918704267, - 21888242871839275222246405745257275088548364400416034343698198952690901443443, - 21888242871839275222246405745257275088548364400416034343698165366778033591216, - 35720715265400439, - 21888242871839275222246405745257275088548364400416034343698179397706652220645, - 21888242871839275222246405745257275088548364400416034343698170170881525659186, - 7952428716793842, - 54032215543825147, - 7957593466103751, - 21888242871839275222246405745257275088548364400416034343698146951000452435128, - 21888242871839275222246405745257275088548364400416034343698152170782765647734, - 47376998752637714, - 7509256175625145, - 39703562609078171, - 67921572815911957, - 21888242871839275222246405745257275088548364400416034343698174834323735041988, - 16318931855594392, - 38832430718106800, - 28645784966585137, - 21888242871839275222246405745257275088548364400416034343698193026889055727385, - 21888242871839275222246405745257275088548364400416034343698134536572727440357, - 21888242871839275222246405745257275088548364400416034343698196474059552569422, - 48906960403187856, - 9731000573409807, - 21888242871839275222246405745257275088548364400416034343698171439720516019690, - 21888242871839275222246405745257275088548364400416034343698203272937793574182, - 43596151676667973, - 21888242871839275222246405745257275088548364400416034343698200954282732530013, - 33547361611475207, - 42736336975514840, - 21888242871839275222246405745257275088548364400416034343698145061234040393206, - 66589341957021466, - 7799880817479542, - 30035936336177582, - 21888242871839275222246405745257275088548364400416034343698154623496143175854, - 24176745861254091, - 21888242871839275222246405745257275088548364400416034343698175165354067738223, - 21888242871839275222246405745257275088548364400416034343698171076402496078432, - 21888242871839275222246405745257275088548364400416034343698178974476459932256, - 21888242871839275222246405745257275088548364400416034343698190590340207606412, - 21888242871839275222246405745257275088548364400416034343698173057985243825139, - 30874919235647243, - 28216979314604914, - 15426710143272752, - 21888242871839275222246405745257275088548364400416034343698149527178583869256, - 457231112553648, - 35422790182228431, - 21888242871839275222246405745257275088548364400416034343698163339594320333586, - 21888242871839275222246405745257275088548364400416034343698176751153229876528, - 51312059616722404, - 29618065539916802, - 21888242871839275222246405745257275088548364400416034343698140941729792458519, - 21888242871839275222246405745257275088548364400416034343698202651724727386501, - 69787464822400043, - 21888242871839275222246405745257275088548364400416034343698150868312864468340, - 37557186649334697, - 7285012244809582, - 21888242871839275222246405745257275088548364400416034343698148974919582928546, - 21888242871839275222246405745257275088548364400416034343698194647980779938706, - 21888242871839275222246405745257275088548364400416034343698162016359075322744, - 21888242871839275222246405745257275088548364400416034343698153618342956860266, - 47683495500859079, - 62901488977827979, - 21888242871839275222246405745257275088548364400416034343698171530178446084878, - 21888242871839275222246405745257275088548364400416034343698157991968298234346, - 21888242871839275222246405745257275088548364400416034343698196161553692251198, - 21888242871839275222246405745257275088548364400416034343698176443763237466009, - 21888242871839275222246405745257275088548364400416034343698164978405592694731, - 21888242871839275222246405745257275088548364400416034343698164332998909294198, - 21888242871839275222246405745257275088548364400416034343698147886926837332459, - 52442223456055404, - 31748480721052501, - 5680792330310105, - 21888242871839275222246405745257275088548364400416034343698151435141066639419, - 21888242871839275222246405745257275088548364400416034343698177866363126119431, - 21888242871839275222246405745257275088548364400416034343698189138413594546484, - 21888242871839275222246405745257275088548364400416034343698185729702005219666, - 21888242871839275222246405745257275088548364400416034343698169478543090369395, - 21888242871839275222246405745257275088548364400416034343698153954965906315668, - 21888242871839275222246405745257275088548364400416034343698180712336412215587, - 21888242871839275222246405745257275088548364400416034343698153976118790141688, - 65926738282066878, - 3292248248320283, - 21888242871839275222246405745257275088548364400416034343698199259382662718377, - 21888242871839275222246405745257275088548364400416034343698183711636120076060, - 36315351804394623, - 21888242871839275222246405745257275088548364400416034343698198476163151824842, - 41910111164562662, - 21888242871839275222246405745257275088548364400416034343698182481096644919855, - 14981589881600967, - 49298268541156606, - 21888242871839275222246405745257275088548364400416034343698170210354609326995, - 21888242871839275222246405745257275088548364400416034343698134656324940411442, - 31467362272712590, - 21888242871839275222246405745257275088548364400416034343698197409687994279388, - 21888242871839275222246405745257275088548364400416034343698163159904096665892, - 58114294214209813, - 26336421772825037, - 21888242871839275222246405745257275088548364400416034343698193041239649079728, - 17415212799828127, - 60965417388932751, - 21888242871839275222246405745257275088548364400416034343698135085705532460887, - 21888242871839275222246405745257275088548364400416034343698181176776531745230, - 52113311644356867, - 39270494942475552, - 21888242871839275222246405745257275088548364400416034343698180244476642488225, - 21888242871839275222246405745257275088548364400416034343698167070778804833787, - 21888242871839275222246405745257275088548364400416034343698140527680523185224, - 14061293664264755, - 21888242871839275222246405745257275088548364400416034343698169445212993606950, - 16714390670975352, - 28568914793217374, - 42513370789037050, - 64148338470418257, - 21888242871839275222246405745257275088548364400416034343698155916314254947609, - 15359201008478111, - 57599638571918239, - 47759791407738537, - 21888242871839275222246405745257275088548364400416034343698136603601174107060, - 38820931221680116, - 21888242871839275222246405745257275088548364400416034343698162199997380092346, - 21888242871839275222246405745257275088548364400416034343698185483771004100201, - 21888242871839275222246405745257275088548364400416034343698160419331370237511, - 15552883254137065, - 2879815074843772, - 21888242871839275222246405745257275088548364400416034343698170119924543900834, - 22308205035610765, - 951777402369596, - 21888242871839275222246405745257275088548364400416034343698184459483174334791, - 21888242871839275222246405745257275088548364400416034343698196679739037401982, - 46461631078594620, - 12941638831359603, - 9593390507545695, - 18045005268303468, - 62111552016960183, - 22067855429587226, - 21888242871839275222246405745257275088548364400416034343698141163766301395861, - 21888242871839275222246405745257275088548364400416034343698147656965423476032, - 18587986666658662, - 69417703247010291, - 62663941160332589, - 21926805580808566, - 21888242871839275222246405745257275088548364400416034343698178068988479645903, - 21888242871839275222246405745257275088548364400416034343698133193861201149209, - 21888242871839275222246405745257275088548364400416034343698177225620618469366, - 21888242871839275222246405745257275088548364400416034343698147941748639598429, - 6366833563285567, - 15961999178754530, - 21888242871839275222246405745257275088548364400416034343698174164386572233753, - 64487000649237764, - 21888242871839275222246405745257275088548364400416034343698181333628401632886, - 30672077572782210, - 21888242871839275222246405745257275088548364400416034343698179442603959587265, - 21888242871839275222246405745257275088548364400416034343698137936021133371159, - 21888242871839275222246405745257275088548364400416034343698145946019459966164, - 21888242871839275222246405745257275088548364400416034343698192284716421805095, - 50454017405891429, - 21888242871839275222246405745257275088548364400416034343698163683237359930107, - 21888242871839275222246405745257275088548364400416034343698149549463694006036, - 21888242871839275222246405745257275088548364400416034343698169455535034532881, - 34443912720159998, - 21888242871839275222246405745257275088548364400416034343698181137225752909792, - 14104025494827432, - 16344573073728108, - 9394965990760326, - 21888242871839275222246405745257275088548364400416034343698171391071380182780, - 21888242871839275222246405745257275088548364400416034343698167707795479463907, - 4915683904677737, - 59986956449779769, - 21888242871839275222246405745257275088548364400416034343698140968848961779314, - 21888242871839275222246405745257275088548364400416034343698177635389080094005, - 21888242871839275222246405745257275088548364400416034343698144674525446723456, - 35342955661490665, - 21888242871839275222246405745257275088548364400416034343698145024842662828751, - 21888242871839275222246405745257275088548364400416034343698170916283372656040, - 21888242871839275222246405745257275088548364400416034343698203890899686634028, - 16834953391192407, - 30197737283405883, - 21888242871839275222246405745257275088548364400416034343698167968967381369549, - 21888242871839275222246405745257275088548364400416034343698139413996928406888, - 21888242871839275222246405745257275088548364400416034343698164102983268104965, - 21888242871839275222246405745257275088548364400416034343698190966424042692439, - 19546024446563384, - 53040019929932698, - 60430421030843002, - 21888242871839275222246405745257275088548364400416034343698200301150968371550, - 21888242871839275222246405745257275088548364400416034343698168689897894006558, - 21888242871839275222246405745257275088548364400416034343698177512641408806009, - 21888242871839275222246405745257275088548364400416034343698204023364905562197, - 21888242871839275222246405745257275088548364400416034343698147811235357636694, - 14129955542862260, - 48964084010775831, - 21888242871839275222246405745257275088548364400416034343698173740808570229092, - 21888242871839275222246405745257275088548364400416034343698157264720345279408, - 21097506623434204, - 21888242871839275222246405745257275088548364400416034343698144131578277946044, - 26248922331898617, - 21888242871839275222246405745257275088548364400416034343698202975945686916429, - 30145760748377161, - 21888242871839275222246405745257275088548364400416034343698133179468293732192, - 21888242871839275222246405745257275088548364400416034343698178900347538919473, - 20400753696090714, - 21888242871839275222246405745257275088548364400416034343698189076274844324959, - 39065371037175812, - 21888242871839275222246405745257275088548364400416034343698158213597054669068, - 53261992742575948, - 21888242871839275222246405745257275088548364400416034343698160361479370233862, - 21888242871839275222246405745257275088548364400416034343698157884864240784207, - 9024545176150960, - 21888242871839275222246405745257275088548364400416034343698152839226884278432, - 21888242871839275222246405745257275088548364400416034343698186137881868007471, - 41391974910760401, - 16791782150459964, - 63807305208202658, - 6719646080864045, - 69224448608989936, - 21888242871839275222246405745257275088548364400416034343698174488371965362400, - 3145054984157090, - 6090525647988820, - 40046683527953772, - 53533224050039461, - 35599063676101437, - 21888242871839275222246405745257275088548364400416034343698193478744893428688, - 21888242871839275222246405745257275088548364400416034343698165127630219084826, - 34650807310529568, - 47758288926419609, - 21888242871839275222246405745257275088548364400416034343698147132650785399043, - 58326223075058732, - 21888242871839275222246405745257275088548364400416034343698167547796539756091, - 21888242871839275222246405745257275088548364400416034343698142757568638881601, - 21888242871839275222246405745257275088548364400416034343698171621487124398121, - 21888242871839275222246405745257275088548364400416034343698169030405206628214, - 21888242871839275222246405745257275088548364400416034343698149672110430770350, - 21888242871839275222246405745257275088548364400416034343698184555595840407317, - 21888242871839275222246405745257275088548364400416034343698155145250509895810, - 19995607658410915, - 21888242871839275222246405745257275088548364400416034343698153867214879903441, - 21888242871839275222246405745257275088548364400416034343698200032658503326962, - 67255953064310857, - 21888242871839275222246405745257275088548364400416034343698144249298915728383, - 21888242871839275222246405745257275088548364400416034343698136882303787200176, - 34992389817400260, - 21888242871839275222246405745257275088548364400416034343698165741573429030152, - 21888242871839275222246405745257275088548364400416034343698170486602616384824, - 21888242871839275222246405745257275088548364400416034343698202631647914595960, - 21888242871839275222246405745257275088548364400416034343698168305015019353851, - 21888242871839275222246405745257275088548364400416034343698191748419350762713, - 56803855782420435, - 39875290605327733, - 52827428805091349, - 3304532651902763, - 21888242871839275222246405745257275088548364400416034343698175845478872512828, - 24424119074070260, - 21888242871839275222246405745257275088548364400416034343698196499345949367125, - 53983150155103238, - 21888242871839275222246405745257275088548364400416034343698160818222342679478, - 57880299042148693, - 21888242871839275222246405745257275088548364400416034343698182190749063891759, - 33411645089353125, - 21888242871839275222246405745257275088548364400416034343698142197572141057529, - 47704060197026166, - 21888242871839275222246405745257275088548364400416034343698184233884399468685, - 25465069927655040, - 21888242871839275222246405745257275088548364400416034343698186529544158083252, - 21888242871839275222246405745257275088548364400416034343698161314424089152699, - 29993275567871897, - 30625792903496499, - 26064057001515472, - 18490716401666190, - 455069113294713, - 21888242871839275222246405745257275088548364400416034343698165170125074911327, - 21888242871839275222246405745257275088548364400416034343698159908087487460223, - 41893487917909914, - 21888242871839275222246405745257275088548364400416034343698185687345783462611, - 70048375472236907, - 45277535818117559, - 61132464677042435, - 21888242871839275222246405745257275088548364400416034343698173387252959403555, - 58811105425719169, - 51733321970071952, - 26225388054059797, - 40676720406629133, - 1243469696389925, - 71770840154179659, - 38232100185719580, - 21888242871839275222246405745257275088548364400416034343698138939329934919447, - 21888242871839275222246405745257275088548364400416034343698190110450624782855, - 21888242871839275222246405745257275088548364400416034343698191104743550829750, - 21888242871839275222246405745257275088548364400416034343698139552990622133377, - 21888242871839275222246405745257275088548364400416034343698159193742146876310, - 21888242871839275222246405745257275088548364400416034343698192929333665435170, - 27925823872930692, - 21888242871839275222246405745257275088548364400416034343698156158492305736020, - 21888242871839275222246405745257275088548364400416034343698137093072922482197, - 21888242871839275222246405745257275088548364400416034343698147471210631397325, - 21888242871839275222246405745257275088548364400416034343698151779561710899356, - 48856104493115390, - 58667864954462745, - 15117152553886412, - 21888242871839275222246405745257275088548364400416034343698133026322271596493, - 21888242871839275222246405745257275088548364400416034343698146885045061056905, - 47390913535998460, - 21888242871839275222246405745257275088548364400416034343698157627405952138936, - 53263203529434957, - 70126918387785777, - 21888242871839275222246405745257275088548364400416034343698144185196020408479, - 21888242871839275222246405745257275088548364400416034343698169038456769848381, - 19598177663068399, - 31721869522619036, - 57414628808979623, - 21888242871839275222246405745257275088548364400416034343698182250437047246944, - 21888242871839275222246405745257275088548364400416034343698146168256542517830, - 21888242871839275222246405745257275088548364400416034343698153858576377534067, - 5244340870856486, - 21888242871839275222246405745257275088548364400416034343698132901295847379093, - 67955724670179972, - 61947903949550566, - 21888242871839275222246405745257275088548364400416034343698137327491703123290, - 21888242871839275222246405745257275088548364400416034343698138552984851363109, - 56762305296341771, - 20348226437295526, - 7674319512330003, - 27315959069490366, - 21888242871839275222246405745257275088548364400416034343698166299560279364009, - 17572318111905464, - 56053101858417615, - 380327448175551, - 13286264554024280, - 18961826481212261, - 19026484196774113, - 36549148341599233, - 21888242871839275222246405745257275088548364400416034343698180989364198833725, - 71916599899288412, - 7396218956511171, - 52850310983201715, - 21888242871839275222246405745257275088548364400416034343698154227235706904492, - 21888242871839275222246405745257275088548364400416034343698176648232947669406, - 21888242871839275222246405745257275088548364400416034343698198434706867033759, - 18759743779135257, - 21888242871839275222246405745257275088548364400416034343698145662866743815858, - 66048140743100046, - 21888242871839275222246405745257275088548364400416034343698139184035401323357, - 21888242871839275222246405745257275088548364400416034343698147254979962879909, - 21888242871839275222246405745257275088548364400416034343698152401352378824347, - 21888242871839275222246405745257275088548364400416034343698151801155390410187, - 761419979193567, - 21888242871839275222246405745257275088548364400416034343698141444596754925849, - 21888242871839275222246405745257275088548364400416034343698151719438187295275, - 21888242871839275222246405745257275088548364400416034343698200608156077465810, - 30644172262836838, - 21888242871839275222246405745257275088548364400416034343698157919802528574380, - 47841823323399621, - 71318712414693438, - 5975938865300171, - 45369809308499610, - 54929821927134469, - 21888242871839275222246405745257275088548364400416034343698180450049446425544, - 21888242871839275222246405745257275088548364400416034343698150510654035526511, - 21888242871839275222246405745257275088548364400416034343698168418810594608423, - 21888242871839275222246405745257275088548364400416034343698198594794165271446, - 62957158429102380, - 36611652865342814, - 21888242871839275222246405745257275088548364400416034343698143820357789373992, - 21888242871839275222246405745257275088548364400416034343698179076599236569046, - 11554006963705996, - 21888242871839275222246405745257275088548364400416034343698140629565447991315, - 21888242871839275222246405745257275088548364400416034343698182414560027800117, - 21888242871839275222246405745257275088548364400416034343698152275477824863946, - 21888242871839275222246405745257275088548364400416034343698198784185578125516, - 64960687462909634, - 21888242871839275222246405745257275088548364400416034343698164056892255855702, - 21888242871839275222246405745257275088548364400416034343698162020271177813098, - 21888242871839275222246405745257275088548364400416034343698164947564854240513, - 21888242871839275222246405745257275088548364400416034343698132185822622831906, - 21888242871839275222246405745257275088548364400416034343698138952205449835310, - 21888242871839275222246405745257275088548364400416034343698182039687985017618, - 49198042642129696, - 21888242871839275222246405745257275088548364400416034343698145181617223823616, - 56999399549136789, - 21888242871839275222246405745257275088548364400416034343698183715594730718045, - 21888242871839275222246405745257275088548364400416034343698135039240758969441, - 21888242871839275222246405745257275088548364400416034343698154213080836402213, - 52312947842616939, - 21888242871839275222246405745257275088548364400416034343698164117517918263621, - 21888242871839275222246405745257275088548364400416034343698203353183572085379, - 51192647732952091, - 57831233075208801, - 21888242871839275222246405745257275088548364400416034343698137681664378742372, - 35447203233637175, - 5015120816279204, - 21888242871839275222246405745257275088548364400416034343698147830886682832457, - 37320987889545945, - 36098642259557685, - 3437994666975986, - 21888242871839275222246405745257275088548364400416034343698155912688358261117, - 21888242871839275222246405745257275088548364400416034343698161620644921840472, - 21888242871839275222246405745257275088548364400416034343698134224527377089998, - 42039768760992651, - 21888242871839275222246405745257275088548364400416034343698192491399537360197, - 13114908945790730, - 35092340888518269, - 18844794288749945, - 21888242871839275222246405745257275088548364400416034343698187047138609887634, - 21888242871839275222246405745257275088548364400416034343698199653079112040049, - 21888242871839275222246405745257275088548364400416034343698144121219739446602, - 21888242871839275222246405745257275088548364400416034343698166327029978958809, - 53501508809099097, - 41131086501735829, - 6186350701300957, - 21888242871839275222246405745257275088548364400416034343698185509597924091101, - 2373878057800413, - 52814907503669356, - 48119421470122302, - 21888242871839275222246405745257275088548364400416034343698173731515494742288, - 68755433768751247, - 55605577073288411, - 21888242871839275222246405745257275088548364400416034343698188824072556070955, - 46492662411226286, - 55160094785932406, - 40252732744812164, - 21888242871839275222246405745257275088548364400416034343698176852780471157406, - 20117652686166720, - 21888242871839275222246405745257275088548364400416034343698181291411565305615, - 21888242871839275222246405745257275088548364400416034343698184110844700009348, - 4218842163136349, - 21888242871839275222246405745257275088548364400416034343698154742788590338790, - 22677284024044619, - 21888242871839275222246405745257275088548364400416034343698132675815121137529, - 22620867545883150, - 21888242871839275222246405745257275088548364400416034343698191129985824677642, - 51889348480419283, - 21888242871839275222246405745257275088548364400416034343698201065343153642607, - 10240270394212729, - 21888242871839275222246405745257275088548364400416034343698181238776604421239, - 21888242871839275222246405745257275088548364400416034343698169006751955316773, - 21888242871839275222246405745257275088548364400416034343698202949459353026284, - 57637244213592991, - 21888242871839275222246405745257275088548364400416034343698181021264414832420, - 70478603287984211, - 14658240490091869, - 21888242871839275222246405745257275088548364400416034343698144257731378054375, - 21888242871839275222246405745257275088548364400416034343698187347768068614194, - 67756406641550539, - 21888242871839275222246405745257275088548364400416034343698132945753464757682, - 21888242871839275222246405745257275088548364400416034343698163030112785267368, - 21888242871839275222246405745257275088548364400416034343698194130996673788982, - 11735814454944917, - 17571856838216045, - 21888242871839275222246405745257275088548364400416034343698132594789515482644, - 21888242871839275222246405745257275088548364400416034343698145352526912047827, - 27656837670196662, - 21888242871839275222246405745257275088548364400416034343698151800077291257686, - 54217767385032045, - 21888242871839275222246405745257275088548364400416034343698160586042749754620, - 1082216803486243, - 5380208187444339, - 21888242871839275222246405745257275088548364400416034343698182666874022147309, - 21888242871839275222246405745257275088548364400416034343698145485734021105981, - 21888242871839275222246405745257275088548364400416034343698183707834073098475, - 20910590527958951, - 21888242871839275222246405745257275088548364400416034343698138011214965070838, - 21888242871839275222246405745257275088548364400416034343698170963728466258622, - 37466574383582097, - 26822014665404966, - 21888242871839275222246405745257275088548364400416034343698171595881772902565, - 48184238379123046, - 47697086845953167, - 43953132637293487, - 63508404999534939, - 21888242871839275222246405745257275088548364400416034343698179848500068416617, - 42191753615223338, - 3301812014837335, - 8976142783575324, - 56290629169337796, - 57338451850405609, - 21888242871839275222246405745257275088548364400416034343698172676761507918465, - 53684504204322325, - 21888242871839275222246405745257275088548364400416034343698202311178872571148, - 8759893794755920, - 21888242871839275222246405745257275088548364400416034343698187142793374155063, - 22289716776925284, - 21888242871839275222246405745257275088548364400416034343698148109523229527807, - 7293821269154302, - 407674981370682, - 21888242871839275222246405745257275088548364400416034343698155565797739470427, - 21888242871839275222246405745257275088548364400416034343698188215581705697709, - 21888242871839275222246405745257275088548364400416034343698136692892639730238, - 21888242871839275222246405745257275088548364400416034343698181690999503757915, - 1532513046066080, - 21888242871839275222246405745257275088548364400416034343698190561241881486150, - 21888242871839275222246405745257275088548364400416034343698181040161246194100, - 5177762130926305, - 21888242871839275222246405745257275088548364400416034343698182021974356433961, - 3483629916537695, - 21888242871839275222246405745257275088548364400416034343698181437127896672713, - 17636103967442173, - 40497599600887867, - 21888242871839275222246405745257275088548364400416034343698154807211751109461, - 21888242871839275222246405745257275088548364400416034343698195981575130308661, - 38208921084202898, - 21888242871839275222246405745257275088548364400416034343698170806093662832551, - 69722999870313194, - 21888242871839275222246405745257275088548364400416034343698160698984209288483, - 21888242871839275222246405745257275088548364400416034343698145979102466019414, - 48768386172732704, - 23580519999955360, - 21888242871839275222246405745257275088548364400416034343698201859364064225687, - 37630513729837511, - 21888242871839275222246405745257275088548364400416034343698170441329456930798, - 6642651981382567, - 21888242871839275222246405745257275088548364400416034343698148154707756767223, - 21888242871839275222246405745257275088548364400416034343698181421658284300441, - 30734902340952479, - 21888242871839275222246405745257275088548364400416034343698164159114934218959, - 21888242871839275222246405745257275088548364400416034343698203867896979310714, - 21888242871839275222246405745257275088548364400416034343698165146641469863451, - 21888242871839275222246405745257275088548364400416034343698196961961730848238, - 9296139346865041, - 7006252143290464, - 22841456351436313, - 36058995938595060, - 38441468441991948, - 21888242871839275222246405745257275088548364400416034343698175777949669574936, - 19776704877146979, - 47061704297184964, - 21888242871839275222246405745257275088548364400416034343698160516281025200575, - 21888242871839275222246405745257275088548364400416034343698157035031583841673, - 21888242871839275222246405745257275088548364400416034343698188497546178459092, - 25505670314282957, - 21888242871839275222246405745257275088548364400416034343698165471296956669202, - 21888242871839275222246405745257275088548364400416034343698141495979697261036, - 21888242871839275222246405745257275088548364400416034343698172650321895127319, - 51599687607422940, - 21888242871839275222246405745257275088548364400416034343698135911629807518324, - 21888242871839275222246405745257275088548364400416034343698138962420182322157, - 15022226695542034, - 21888242871839275222246405745257275088548364400416034343698156549160383437131, - 21888242871839275222246405745257275088548364400416034343698180590749940151784, - 21888242871839275222246405745257275088548364400416034343698190091441756270978, - 21888242871839275222246405745257275088548364400416034343698155826928413285392, - 44129240362295629, - 21888242871839275222246405745257275088548364400416034343698188572442920405344, - 71233509938231250, - 33487718917083747, - 15113260943645650, - 21888242871839275222246405745257275088548364400416034343698180142428641299571, - 21888242871839275222246405745257275088548364400416034343698149185976958787794, - 21888242871839275222246405745257275088548364400416034343698174230573143050870, - 57876099429806211, - 21888242871839275222246405745257275088548364400416034343698173672754356531246, - 21888242871839275222246405745257275088548364400416034343698203951412687005643, - 21888242871839275222246405745257275088548364400416034343698160293798874641204, - 21888242871839275222246405745257275088548364400416034343698139311717635781134, - 21888242871839275222246405745257275088548364400416034343698159391187990493876, - 21888242871839275222246405745257275088548364400416034343698195888081765257176, - 54031551353535830, - 21888242871839275222246405745257275088548364400416034343698148946833970237220, - 21888242871839275222246405745257275088548364400416034343698198513135029466230, - 21888242871839275222246405745257275088548364400416034343698198391284477170780, - 11967709072265915, - 26991313357439602, - 53149969980595824, - 21888242871839275222246405745257275088548364400416034343698167304826815799116, - 21888242871839275222246405745257275088548364400416034343698190538482089209263, - 21888242871839275222246405745257275088548364400416034343698152113744857572746, - 3722892911791949, - 33175888234615508, - 62096317155872334, - 23014057891661642, - 70774505412665209, - 13178317290283695, - 21888242871839275222246405745257275088548364400416034343698197434447316053173, - 21888242871839275222246405745257275088548364400416034343698191956740357329248, - 14488943486936578, - 21888242871839275222246405745257275088548364400416034343698177295872914757751, - 28760467463675262, - 26089809153952948, - 21888242871839275222246405745257275088548364400416034343698162656085182387829, - 45689227844770364, - 21888242871839275222246405745257275088548364400416034343698141804892948360615, - 21888242871839275222246405745257275088548364400416034343698199292916094146444, - 6007969101207715, - 21888242871839275222246405745257275088548364400416034343698183598653225926324, - 21888242871839275222246405745257275088548364400416034343698153244558182412673, - 21888242871839275222246405745257275088548364400416034343698198976746340288173, - 21888242871839275222246405745257275088548364400416034343698187198343397714084, - 21888242871839275222246405745257275088548364400416034343698170267137131332894, - 64282735287038066, - 50170695756989389, - 21888242871839275222246405745257275088548364400416034343698175655828947410000, - 21888242871839275222246405745257275088548364400416034343698157906679969361079, - 21888242871839275222246405745257275088548364400416034343698169632381062490485, - 21888242871839275222246405745257275088548364400416034343698157890775047122533, - 21888242871839275222246405745257275088548364400416034343698169096939173905680, - 21888242871839275222246405745257275088548364400416034343698159547726940516391, - 21888242871839275222246405745257275088548364400416034343698187118612836802012, - 21888242871839275222246405745257275088548364400416034343698146129124798322148, - 9759968291902104, - 25721127223483080, - 21888242871839275222246405745257275088548364400416034343698194051873802303036, - 21888242871839275222246405745257275088548364400416034343698150339497061944049, - 27484318600860167, - 21888242871839275222246405745257275088548364400416034343698203810729360627018, - 21888242871839275222246405745257275088548364400416034343698193977698911224724, - 21888242871839275222246405745257275088548364400416034343698138586848974708135, - 21888242871839275222246405745257275088548364400416034343698198053957190277148, - 21888242871839275222246405745257275088548364400416034343698162055236574517151, - 21888242871839275222246405745257275088548364400416034343698194706563095105682, - 21888242871839275222246405745257275088548364400416034343698167608127488647132, - 48946194172591814, - 4337074647182097, - 48546654718924163, - 21888242871839275222246405745257275088548364400416034343698177094445525445840, - 21888242871839275222246405745257275088548364400416034343698145994863872242566, - 21888242871839275222246405745257275088548364400416034343698176644165465587644, - 21888242871839275222246405745257275088548364400416034343698203254047352078163, - 21888242871839275222246405745257275088548364400416034343698166637126463758953, - 46469224003044701, - 22822679772378786, - 71025631770764187, - 25037743172649691, - 21888242871839275222246405745257275088548364400416034343698157790376799707730, - 35180069002808787, - 21888242871839275222246405745257275088548364400416034343698174282152103790341, - 32707896629307420, - 21888242871839275222246405745257275088548364400416034343698146803947157016331, - 21888242871839275222246405745257275088548364400416034343698191290303814355758, - 8755263899036661, - 19570930191999823, - 21888242871839275222246405745257275088548364400416034343698202800718837674042, - 21888242871839275222246405745257275088548364400416034343698161349132083380799, - 21888242871839275222246405745257275088548364400416034343698183157504427611729, - 34845691674785124, - 21888242871839275222246405745257275088548364400416034343698134869078951903276, - 21888242871839275222246405745257275088548364400416034343698189079420379581518, - 27770484088563741, - 21888242871839275222246405745257275088548364400416034343698146526263528989107, - 62333149772310910, - 54547964756432703, - 21888242871839275222246405745257275088548364400416034343698179299586366426848, - 21888242871839275222246405745257275088548364400416034343698163545061001560025, - 60110687333267364, - 21888242871839275222246405745257275088548364400416034343698164335010226498414, - 21888242871839275222246405745257275088548364400416034343698197193810486522695, - 21888242871839275222246405745257275088548364400416034343698165052743284765582, - 21888242871839275222246405745257275088548364400416034343698136381098110721357, - 21888242871839275222246405745257275088548364400416034343698177593635966742726, - 21888242871839275222246405745257275088548364400416034343698182487899174814861, - 16790577271334042, - 21888242871839275222246405745257275088548364400416034343698183205952088972862, - 21888242871839275222246405745257275088548364400416034343698152590966396541654, - 21888242871839275222246405745257275088548364400416034343698143630333617891024, - 21888242871839275222246405745257275088548364400416034343698201944909215018664, - 21888242871839275222246405745257275088548364400416034343698157194913954743423, - 33199483695246070, - 66803380557798804, - 21888242871839275222246405745257275088548364400416034343698148214609571010945, - 47047523622787884, - 21888242871839275222246405745257275088548364400416034343698175582636671936636, - 21888242871839275222246405745257275088548364400416034343698176451988897218478, - 48306297676244381, - 21888242871839275222246405745257275088548364400416034343698155001381197888961, - 21888242871839275222246405745257275088548364400416034343698190677034839362868, - 21888242871839275222246405745257275088548364400416034343698189199604636298297, - 71310137746639177, - 9489952798686095, - 21888242871839275222246405745257275088548364400416034343698170330547545335464, - 21888242871839275222246405745257275088548364400416034343698150686286717775939, - 21888242871839275222246405745257275088548364400416034343698195493119924404322, - 21888242871839275222246405745257275088548364400416034343698144530830036386350, - 58799020618353007, - 19903465356637282, - 21888242871839275222246405745257275088548364400416034343698150877249620487759, - 69284267372187041, - 21888242871839275222246405745257275088548364400416034343698161761741456374012, - 31598966770929281, - 21888242871839275222246405745257275088548364400416034343698189292812625076993, - 21888242871839275222246405745257275088548364400416034343698188442923807657139, - 21888242871839275222246405745257275088548364400416034343698169225643196109539, - 21888242871839275222246405745257275088548364400416034343698197301329377505335, - 21888242871839275222246405745257275088548364400416034343698142199464907269680, - 10935412394171357, - 21888242871839275222246405745257275088548364400416034343698149079416418744584, - 21888242871839275222246405745257275088548364400416034343698136635200099291762, - 30099401472042497, - 21888242871839275222246405745257275088548364400416034343698155770852946220519, - 31650546828025932, - 4563410686603876, - 21888242871839275222246405745257275088548364400416034343698173212971171042866, - 21207138027711862, - 21888242871839275222246405745257275088548364400416034343698142246695554787445, - 732804127717669, - 21888242871839275222246405745257275088548364400416034343698176554130695738335, - 44344008281762627, - 26839193779571094, - 21888242871839275222246405745257275088548364400416034343698150376026631689429, - 2156364552377571, - 21888242871839275222246405745257275088548364400416034343698143328197312056430, - 21888242871839275222246405745257275088548364400416034343698151043698387025269, - 21888242871839275222246405745257275088548364400416034343698198722143113723585, - 21888242871839275222246405745257275088548364400416034343698162406374854338626, - 4915012072657530, - 43886296078208501, - 21888242871839275222246405745257275088548364400416034343698164699736502129267, - 21888242871839275222246405745257275088548364400416034343698148667219982923417, - 21888242871839275222246405745257275088548364400416034343698149366192943165673, - 48325677089032349, - 54774660491743283, - 69681681716394408, - 21888242871839275222246405745257275088548364400416034343698187460464459389337, - 21888242871839275222246405745257275088548364400416034343698180763999653603689, - 21888242871839275222246405745257275088548364400416034343698161357829441454991, - 21888242871839275222246405745257275088548364400416034343698169187106603738405, - 21888242871839275222246405745257275088548364400416034343698147270979483928653, - 52325621315460966, - 21888242871839275222246405745257275088548364400416034343698160994462084915818, - 746873156343630, - 39272076935399716, - 21888242871839275222246405745257275088548364400416034343698146005980534863866, - 21888242871839275222246405745257275088548364400416034343698167632812612589930, - 51761282868880481, - 67189354861820720, - 29756593809431592, - 26691962471773681, - 21888242871839275222246405745257275088548364400416034343698150777557549714214, - 51733055235594991, - 21888242871839275222246405745257275088548364400416034343698133467810876154084, - 21888242871839275222246405745257275088548364400416034343698146006793008833398, - 21888242871839275222246405745257275088548364400416034343698201263737095352859, - 21888242871839275222246405745257275088548364400416034343698161370429963410439, - 21888242871839275222246405745257275088548364400416034343698180317432057046793, - 21888242871839275222246405745257275088548364400416034343698151798551379978129, - 43285131542585558, - 21888242871839275222246405745257275088548364400416034343698138978934462511081, - 71456804364992299, - 21888242871839275222246405745257275088548364400416034343698185723439674329463, - 21621309163892871, - 21888242871839275222246405745257275088548364400416034343698183685418270492346, - 21888242871839275222246405745257275088548364400416034343698166243711058673794, - 49360613394652929, - 25381024075736658, - 21888242871839275222246405745257275088548364400416034343698185233350190143756, - 31183982657869498, - 21888242871839275222246405745257275088548364400416034343698156335303408959700, - 21888242871839275222246405745257275088548364400416034343698194242325128642984, - 21888242871839275222246405745257275088548364400416034343698165001103812085350, - 40791770027373154, - 21888242871839275222246405745257275088548364400416034343698139234502302291199, - 18414955352135229, - 21888242871839275222246405745257275088548364400416034343698147157354096458758, - 24326732841912868, - 45446715471421752, - 898236572570917, - 45818482229229000, - 33146487252570651, - 6576557580956654, - 16906047676472032, - 21888242871839275222246405745257275088548364400416034343698196397634212466415, - 21888242871839275222246405745257275088548364400416034343698152715022528586948, - 69730892586994773, - 59373157171060226, - 40466211540667510, - 21888242871839275222246405745257275088548364400416034343698139423425742577196, - 25018308895672893, - 21888242871839275222246405745257275088548364400416034343698168909675806310487, - 21888242871839275222246405745257275088548364400416034343698146980183443728953, - 32274870800364029, - 8320584910937337, - 21888242871839275222246405745257275088548364400416034343698136225471497603330, - 21873024415837660, - 21888242871839275222246405745257275088548364400416034343698166412458400267992, - 21888242871839275222246405745257275088548364400416034343698189070401049231523, - 9270043962056150, - 21888242871839275222246405745257275088548364400416034343698145626721655789346, - 54841085029542694, - 21588570487394435, - 21888242871839275222246405745257275088548364400416034343698134263898506897633, - 62681367651718289, - 21888242871839275222246405745257275088548364400416034343698161306191301547423, - 32908394989584172, - 53867662610070904, - 43378028282393387, - 21888242871839275222246405745257275088548364400416034343698140610167565838551, - 11598408398587314, - 36443441688899809, - 21888242871839275222246405745257275088548364400416034343698147707622075965051, - 21888242871839275222246405745257275088548364400416034343698163653786846843628, - 69866424012059691, - 21888242871839275222246405745257275088548364400416034343698171357447801465302, - 21888242871839275222246405745257275088548364400416034343698147897397519807119, - 21888242871839275222246405745257275088548364400416034343698191599567212418857, - 549853948131974, - 21888242871839275222246405745257275088548364400416034343698201444296481519339, - 21888242871839275222246405745257275088548364400416034343698186110552810176240, - 66592044889285510, - 21888242871839275222246405745257275088548364400416034343698188296025931810498, - 21888242871839275222246405745257275088548364400416034343698137704080908837888, - 21888242871839275222246405745257275088548364400416034343698191398961951558661, - 21888242871839275222246405745257275088548364400416034343698151363536911674442, - 43361355191022837, - 25594899786432523, - 29385028685468519, - 49284904271720188, - 53840337449656671, - 64565928413675128, - 14718061249427283, - 17945251203106729, - 38963810625474227, - 21888242871839275222246405745257275088548364400416034343698173793572012287909, - 1344062757238495, - 21888242871839275222246405745257275088548364400416034343698161780825959941982, - 21888242871839275222246405745257275088548364400416034343698166434421441612742, - 21888242871839275222246405745257275088548364400416034343698143671686915368086, - 35352512965376831, - 21888242871839275222246405745257275088548364400416034343698165177776994199718, - 21888242871839275222246405745257275088548364400416034343698192113151390907424, - 654242741279723, - 21888242871839275222246405745257275088548364400416034343698144335949509073803, - 21888242871839275222246405745257275088548364400416034343698150362771117170722, - 28764908389579181, - 44275503362855041, - 14484677823640191, - 21888242871839275222246405745257275088548364400416034343698202345994814970824, - 21888242871839275222246405745257275088548364400416034343698145816117206248391, - 32923268931662954, - 67689744927468189, - 4328554948223964, - 21888242871839275222246405745257275088548364400416034343698143008420050531844, - 21888242871839275222246405745257275088548364400416034343698195979970266991324, - 21888242871839275222246405745257275088548364400416034343698183248064987692467, - 12465249158069930, - 42682594128802896, - 21888242871839275222246405745257275088548364400416034343698139836063058002316, - 15407000298551690, - 21888242871839275222246405745257275088548364400416034343698134073893967086536, - 53640676891651015, - 24123625007294586, - 21888242871839275222246405745257275088548364400416034343698144644044136661995, - 21888242871839275222246405745257275088548364400416034343698141581985107811545, - 7931045779182070, - 49038804130519488, - 21888242871839275222246405745257275088548364400416034343698180618847416280047, - 69141414642529387, - 44709553717080343, - 21888242871839275222246405745257275088548364400416034343698141677846414242253, - 10168713884245722, - 21888242871839275222246405745257275088548364400416034343698177821555361680313, - 64846422310348630, - 21888242871839275222246405745257275088548364400416034343698163879592057652603, - 36005539929622325, - 14053179054546946, - 21888242871839275222246405745257275088548364400416034343698152681468764553665, - 12267067218607821, - 21888242871839275222246405745257275088548364400416034343698183058571029474268, - 18328785140611346, - 21888242871839275222246405745257275088548364400416034343698148567961430627803, - 21888242871839275222246405745257275088548364400416034343698184126500251821964, - 21888242871839275222246405745257275088548364400416034343698186788764031581723, - 21888242871839275222246405745257275088548364400416034343698146897549573258529, - 21888242871839275222246405745257275088548364400416034343698180397009436604678, - 21888242871839275222246405745257275088548364400416034343698152567279350996733, - 21888242871839275222246405745257275088548364400416034343698149566042248138816, - 28036060019343740, - 21888242871839275222246405745257275088548364400416034343698142580646841638258, - 21888242871839275222246405745257275088548364400416034343698151863574202700941, - 21918618029155076, - 21888242871839275222246405745257275088548364400416034343698144112437392027930, - 21888242871839275222246405745257275088548364400416034343698154984357720834824, - 21888242871839275222246405745257275088548364400416034343698150324040357895235, - 21888242871839275222246405745257275088548364400416034343698139327339503795222, - 21888242871839275222246405745257275088548364400416034343698132956870299187429, - 21888242871839275222246405745257275088548364400416034343698180278913242466303, - 21888242871839275222246405745257275088548364400416034343698166032457778596731, - 39661306366416259, - 17350586880326265, - 21888242871839275222246405745257275088548364400416034343698201539602654968775, - 21888242871839275222246405745257275088548364400416034343698190602597560883728, - 21888242871839275222246405745257275088548364400416034343698194231344105188463, - 21888242871839275222246405745257275088548364400416034343698166902542255451815, - 21888242871839275222246405745257275088548364400416034343698162638901386322086, - 47154584655522973, - 21888242871839275222246405745257275088548364400416034343698178001412058261065, - 12849987308452314, - 53256244285660593, - 21888242871839275222246405745257275088548364400416034343698195160748645252495, - 21888242871839275222246405745257275088548364400416034343698153957117501530867, - 53708451477266331, - 68178715969396971, - 30962939843446856, - 21888242871839275222246405745257275088548364400416034343698196529312134791781, - 1333604251074294, - 33087295086775186, - 56638187977708708, - 21888242871839275222246405745257275088548364400416034343698186898598623492884, - 16355898852346113, - 21888242871839275222246405745257275088548364400416034343698151639751593305653, - 21888242871839275222246405745257275088548364400416034343698191880082527230834, - 60606847029108792, - 41153301284174884, - 21888242871839275222246405745257275088548364400416034343698201138864928691495, - 21888242871839275222246405745257275088548364400416034343698133783323537321221, - 19006518491346828, - 41453285404997443, - 70889382850222415, - 21888242871839275222246405745257275088548364400416034343698150191406853357097, - 21888242871839275222246405745257275088548364400416034343698186432446494268454, - 21888242871839275222246405745257275088548364400416034343698170990794858778054, - 45205042949967097, - 68424687982304612, - 48437437836133723, - 8465971679209280, - 42541043778537477, - 65377246589150632, - 8853384170522602, - 54217302642974145, - 21888242871839275222246405745257275088548364400416034343698156380121063273068, - 21888242871839275222246405745257275088548364400416034343698180210280656421747, - 21888242871839275222246405745257275088548364400416034343698157066966001447031, - 21888242871839275222246405745257275088548364400416034343698157160507163129573, - 46317664788642376, - 21888242871839275222246405745257275088548364400416034343698195211818056231028, - 7519196191561088, - 68240812677413416, - 21888242871839275222246405745257275088548364400416034343698193722549251893003, - 21888242871839275222246405745257275088548364400416034343698166097118303658092, - 41265916204164069, - 21888242871839275222246405745257275088548364400416034343698179537368085779851, - 21888242871839275222246405745257275088548364400416034343698139321723704760987, - 31290449731725725, - 21888242871839275222246405745257275088548364400416034343698173416366944948738, - 32232065812284035, - 17357079362962220, - 21129817480621360, - 70547818945534745, - 56582510925539972, - 21888242871839275222246405745257275088548364400416034343698144208705383547378, - 21888242871839275222246405745257275088548364400416034343698138236817860551757, - 21888242871839275222246405745257275088548364400416034343698184131414966644982, - 21888242871839275222246405745257275088548364400416034343698149989425593287073, - 21888242871839275222246405745257275088548364400416034343698142890789022427218, - 71813986670254085, - 27843319786219699, - 24893205351562196, - 59795280873685782, - 69718658352492069, - 69915227606593078, - 21888242871839275222246405745257275088548364400416034343698183661365862462032, - 21888242871839275222246405745257275088548364400416034343698199847324523355691, - 21888242871839275222246405745257275088548364400416034343698182234183721683454, - 33361617235526965, - 21888242871839275222246405745257275088548364400416034343698152384486741155787, - 23888494674998020, - 67116340488672447, - 36155058029555420, - 21888242871839275222246405745257275088548364400416034343698177942315537734772, - 21888242871839275222246405745257275088548364400416034343698193719061567684458, - 41753320996672196, - 21888242871839275222246405745257275088548364400416034343698149202103426016974, - 26267843696752564, - 41301710351198651, - 21888242871839275222246405745257275088548364400416034343698198390295719138081, - 47206232685220782, - 21888242871839275222246405745257275088548364400416034343698161292253738729610, - 21888242871839275222246405745257275088548364400416034343698163691831944921007, - 44050529221361008, - 23446517652236856, - 24632131339295995, - 21888242871839275222246405745257275088548364400416034343698184008631947855048, - 39578223318829860, - 9426831280900172, - 21888242871839275222246405745257275088548364400416034343698169921647300486822, - 21888242871839275222246405745257275088548364400416034343698181329243067380572, - 7468128355135525, - 49517086616477966, - 21888242871839275222246405745257275088548364400416034343698182857444452387895, - 71693233384049430, - 30721265957268449, - 21888242871839275222246405745257275088548364400416034343698200708737971871785, - 68617014637851287, - 21888242871839275222246405745257275088548364400416034343698165192482714895024, - 30736054282893459, - 21888242871839275222246405745257275088548364400416034343698133556754089888488, - 21888242871839275222246405745257275088548364400416034343698196113317794309799, - 21888242871839275222246405745257275088548364400416034343698201686429558400641, - 21888242871839275222246405745257275088548364400416034343698142130592611987956, - 21888242871839275222246405745257275088548364400416034343698156116352637064761, - 21888242871839275222246405745257275088548364400416034343698196491848791143603, - 21888242871839275222246405745257275088548364400416034343698183722904123539754, - 21290271302604154, - 21888242871839275222246405745257275088548364400416034343698135391805212882654, - 21888242871839275222246405745257275088548364400416034343698189999323419101183, - 11868866507630770, - 63109872096963046, - 21888242871839275222246405745257275088548364400416034343698153885038556654805, - 21888242871839275222246405745257275088548364400416034343698156438498077392377, - 7507920200892722, - 21888242871839275222246405745257275088548364400416034343698201803744074476770, - 21888242871839275222246405745257275088548364400416034343698188750306456300465, - 22895218335605984, - 21608676129668162, - 21888242871839275222246405745257275088548364400416034343698139027158927039739, - 59051545551823156, - 27541056682362283, - 424574113091812, - 57156430836425833, - 14368799201265449, - 30976739660631442, - 21888242871839275222246405745257275088548364400416034343698189040587157992814, - 62917734197772129, - 8622091081606844, - 21888242871839275222246405745257275088548364400416034343698190723969542582974, - 21888242871839275222246405745257275088548364400416034343698200300926643842700, - 4954352835244061, - 68565722583700810, - 62076995665617900, - 52138608987143908, - 54804748738235461, - 21888242871839275222246405745257275088548364400416034343698182807609273634272, - 21888242871839275222246405745257275088548364400416034343698193647184651357519, - 14684936628389759, - 21888242871839275222246405745257275088548364400416034343698167947909596714606, - 21888242871839275222246405745257275088548364400416034343698165495560287124507, - 21888242871839275222246405745257275088548364400416034343698141913052548184099, - 11769171178891610, - 21888242871839275222246405745257275088548364400416034343698143907291277858098, - 54563995756749755, - 21888242871839275222246405745257275088548364400416034343698187477303451584647, - 21888242871839275222246405745257275088548364400416034343698187416072528418669, - 59347933251857142, - 21888242871839275222246405745257275088548364400416034343698153926679293106072, - 31010036560321797, - 21888242871839275222246405745257275088548364400416034343698196926377496822794, - 62026185426301851, - 26400423251095712, - 21888242871839275222246405745257275088548364400416034343698200555887053671377, - 21888242871839275222246405745257275088548364400416034343698141385081003705841, - 26755230479907490, - 21888242871839275222246405745257275088548364400416034343698162106120258098089, - 21888242871839275222246405745257275088548364400416034343698163529927209474784, - 4805217764986714, - 21888242871839275222246405745257275088548364400416034343698141068967032223230, - 21888242871839275222246405745257275088548364400416034343698144395573073010652, - 35078647270245055, - 21888242871839275222246405745257275088548364400416034343698202945657052872247, - 24840054032304839, - 52896518447442013, - 27818271609241950, - 33790150274677522, - 21888242871839275222246405745257275088548364400416034343698138738178531990251, - 21888242871839275222246405745257275088548364400416034343698193864515165357344, - 21888242871839275222246405745257275088548364400416034343698150278626199987288, - 21888242871839275222246405745257275088548364400416034343698196447269574587183, - 42587991693420149, - 40854537566416559, - 24054634662491354, - 21888242871839275222246405745257275088548364400416034343698141171351881756176, - 21888242871839275222246405745257275088548364400416034343698186869195961706540, - 65143437819055858, - 29794182785338844, - 69099168048340517, - 65501142059849583, - 21888242871839275222246405745257275088548364400416034343698188583275978929606, - 46166699794688313, - 21888242871839275222246405745257275088548364400416034343698187757795906977988, - 21888242871839275222246405745257275088548364400416034343698161804692560475360, - 4173879121804517, - 21888242871839275222246405745257275088548364400416034343698189208947870787907, - 21888242871839275222246405745257275088548364400416034343698194729397559922312, - 55376334492661872, - 60321979994439511, - 21888242871839275222246405745257275088548364400416034343698203207200583092783, - 21888242871839275222246405745257275088548364400416034343698169082131989894088, - 21888242871839275222246405745257275088548364400416034343698145414756344293237, - 60875676697699165, - 42430155387630014, - 21353867514103626, - 21888242871839275222246405745257275088548364400416034343698155046918618604032, - 42037826311109327, - 21888242871839275222246405745257275088548364400416034343698178386365173315063, - 19441857000602782, - 21888242871839275222246405745257275088548364400416034343698148859286194414322, - 21888242871839275222246405745257275088548364400416034343698150588718021780809, - 21888242871839275222246405745257275088548364400416034343698135652260316011544, - 70337194624245341, - 21888242871839275222246405745257275088548364400416034343698191981833527519697, - 38796461907270952, - 21888242871839275222246405745257275088548364400416034343698191035911182484181, - 21888242871839275222246405745257275088548364400416034343698132276594290673001, - 35797903851260762, - 11492078731811326, - 60693188845222286, - 21888242871839275222246405745257275088548364400416034343698139178411738695547, - 54677699037608685, - 57287613400268153, - 21888242871839275222246405745257275088548364400416034343698146068546795538254, - 32353949813137504, - 21888242871839275222246405745257275088548364400416034343698191939110503701820, - 876354398867525, - 21888242871839275222246405745257275088548364400416034343698182582405627036506, - 21888242871839275222246405745257275088548364400416034343698146116037958462274, - 21888242871839275222246405745257275088548364400416034343698147955686328701456, - 21888242871839275222246405745257275088548364400416034343698158352144300652108, - 21888242871839275222246405745257275088548364400416034343698198235321796143077, - 21888242871839275222246405745257275088548364400416034343698180612733055877453, - 49018192473211995, - 33654375985439165, - 37774947590578691, - 21888242871839275222246405745257275088548364400416034343698171356773850757991, - 21888242871839275222246405745257275088548364400416034343698170321498605441056, - 21888242871839275222246405745257275088548364400416034343698141462546653977019, - 71665248502533231, - 11256168951384261, - 17995263433199403, - 21888242871839275222246405745257275088548364400416034343698149409948604600609, - 21888242871839275222246405745257275088548364400416034343698177600922075760956, - 54740594469335053, - 17052314786149813, - 997399244607457, - 33082919329786098, - 21888242871839275222246405745257275088548364400416034343698160684846335817857, - 21888242871839275222246405745257275088548364400416034343698176992628262152176, - 44454571929737982, - 21888242871839275222246405745257275088548364400416034343698165750824129566529, - 1484711143022441, - 20430600783439652, - 15002253580685304, - 16177653209537368, - 21888242871839275222246405745257275088548364400416034343698155074299773389320, - 21888242871839275222246405745257275088548364400416034343698184410383133990237, - 21888242871839275222246405745257275088548364400416034343698136747065608350594, - 21888242871839275222246405745257275088548364400416034343698173888997673265634, - 12728313535842264, - 15076554887590982, - 21888242871839275222246405745257275088548364400416034343698164294681621425286, - 10366512984116126, - 21888242871839275222246405745257275088548364400416034343698141271443137079426, - 21888242871839275222246405745257275088548364400416034343698176594293287834103, - 69553286114889950, - 21888242871839275222246405745257275088548364400416034343698178722627055938118, - 21888242871839275222246405745257275088548364400416034343698175979528510070444, - 21888242871839275222246405745257275088548364400416034343698143038600431122120, - 25746246337660942, - 21888242871839275222246405745257275088548364400416034343698185347142531818488, - 26117833275365274, - 21888242871839275222246405745257275088548364400416034343698141177080709118920, - 21888242871839275222246405745257275088548364400416034343698166784748779398604, - 21888242871839275222246405745257275088548364400416034343698191359703657938451, - 51114149752567611, - 21888242871839275222246405745257275088548364400416034343698136072505131475294, - 21888242871839275222246405745257275088548364400416034343698149127309102077035, - 21888242871839275222246405745257275088548364400416034343698141767148057767898, - 21888242871839275222246405745257275088548364400416034343698186484745112487213, - 18814298202125527, - 4899231060468764, - 21926249965353531, - 66761704296018935, - 21888242871839275222246405745257275088548364400416034343698141736750285866328, - 21888242871839275222246405745257275088548364400416034343698178163214140179853, - 52035021155805450, - 12713123049835364, - 21888242871839275222246405745257275088548364400416034343698163002253498291746, - 15487960387637032, - 19168983266565163, - 21888242871839275222246405745257275088548364400416034343698176254799965551073, - 21888242871839275222246405745257275088548364400416034343698136182210772765114, - 21888242871839275222246405745257275088548364400416034343698199305323829314451, - 6146934364862902, - 21888242871839275222246405745257275088548364400416034343698167762084215696892, - 41935633558217983, - 12287610725469189, - 25522413207707123, - 39419664392446568, - 14716774665835945, - 63142654006419233, - 54832288704262350, - 21888242871839275222246405745257275088548364400416034343698147212815395381168, - 21888242871839275222246405745257275088548364400416034343698159651550370331903, - 34675839672592307, - 21888242871839275222246405745257275088548364400416034343698147994492178966076, - 38545273905495394, - 21888242871839275222246405745257275088548364400416034343698161643464064585186, - 21888242871839275222246405745257275088548364400416034343698179548348078484035, - 21888242871839275222246405745257275088548364400416034343698171265109353981200, - 21888242871839275222246405745257275088548364400416034343698143380927320692541, - 69650170748880287, - 47137656254931546, - 43180163496796078, - 21888242871839275222246405745257275088548364400416034343698177788528138060444, - 71045310316589077, - 21888242871839275222246405745257275088548364400416034343698163978345803312603, - 21888242871839275222246405745257275088548364400416034343698186158166344280834, - 21888242871839275222246405745257275088548364400416034343698163143398499615334, - 1039567064026099, - 26553718525280914, - 21888242871839275222246405745257275088548364400416034343698139871316678963443, - 68393810055406564, - 21888242871839275222246405745257275088548364400416034343698177377191770320678, - 66155038624845601, - 21888242871839275222246405745257275088548364400416034343698153906470825372737, - 28729439680610688, - 61664274993631393, - 21888242871839275222246405745257275088548364400416034343698177517650060918941, - 67615931324793050, - 21888242871839275222246405745257275088548364400416034343698198942475236959818, - 21888242871839275222246405745257275088548364400416034343698137618765468715293, - 21888242871839275222246405745257275088548364400416034343698138937307897269036, - 14598530764186531, - 61074413361078830, - 70870646513107354, - 25446500757428422, - 21888242871839275222246405745257275088548364400416034343698161209551775496288, - 21888242871839275222246405745257275088548364400416034343698136119682252349313, - 58748570219465790, - 17743172811688374, - 21888242871839275222246405745257275088548364400416034343698189332855734869280, - 21888242871839275222246405745257275088548364400416034343698148879560368732431, - 21888242871839275222246405745257275088548364400416034343698189254282991300669, - 21888242871839275222246405745257275088548364400416034343698198881656845883835, - 42201503646545371, - 35058632076419550, - 21888242871839275222246405745257275088548364400416034343698141341983073071605, - 30175995483182030, - 21888242871839275222246405745257275088548364400416034343698196912554588321059, - 21888242871839275222246405745257275088548364400416034343698180481676963819091, - 10148481572529815, - 8618983582569369, - 51039142809456200, - 21888242871839275222246405745257275088548364400416034343698163297119428827303, - 21888242871839275222246405745257275088548364400416034343698139056692147743204, - 21888242871839275222246405745257275088548364400416034343698176954683366515052, - 21888242871839275222246405745257275088548364400416034343698140538956881958079, - 58853277686397627, - 53852874828474572, - 21888242871839275222246405745257275088548364400416034343698174864416551107881, - 44902121365011948, - 21888242871839275222246405745257275088548364400416034343698175123232047941437, - 21888242871839275222246405745257275088548364400416034343698174651318066217635, - 68556609739423535, - 28352612599332230, - 21888242871839275222246405745257275088548364400416034343698162566629307120740, - 42949591540147931, - 40471839045393338, - 21888242871839275222246405745257275088548364400416034343698154068805044623515, - 19545210693587497, - 21888242871839275222246405745257275088548364400416034343698135394520799718755, - 18103197713333353, - 21888242871839275222246405745257275088548364400416034343698192605614118916616, - 66457053857079317, - 21888242871839275222246405745257275088548364400416034343698196755580149284855, - 21888242871839275222246405745257275088548364400416034343698154236460813484870, - 21888242871839275222246405745257275088548364400416034343698155094908791263676, - 21888242871839275222246405745257275088548364400416034343698180157524182532496, - 49980366615610654, - 17501065208864904, - 19598512570539956, - 21888242871839275222246405745257275088548364400416034343698192414074221783532, - 21888242871839275222246405745257275088548364400416034343698195484129415034997, - 21888242871839275222246405745257275088548364400416034343698152433941218062581, - 32984624986975495, - 62467777424064428, - 64959815701831039, - 12345207574946372, - 21888242871839275222246405745257275088548364400416034343698179539640370235727, - 52783057863284019, - 31222012619939687, - 21888242871839275222246405745257275088548364400416034343698182752652266684893, - 21888242871839275222246405745257275088548364400416034343698177312135002325576, - 31036698057628195, - 21888242871839275222246405745257275088548364400416034343698161538194870517620, - 21888242871839275222246405745257275088548364400416034343698145919653160881857, - 21888242871839275222246405745257275088548364400416034343698141772022897697871, - 21888242871839275222246405745257275088548364400416034343698191982572256958491, - 3598137618442387, - 21888242871839275222246405745257275088548364400416034343698171959526329980013, - 2771597239664772, - 60488097410287182, - 21888242871839275222246405745257275088548364400416034343698195073676472484347, - 9145090741935453, - 21888242871839275222246405745257275088548364400416034343698154779447345243385, - 21888242871839275222246405745257275088548364400416034343698155263803086381897, - 21888242871839275222246405745257275088548364400416034343698163891686266454348, - 21888242871839275222246405745257275088548364400416034343698167427869561386501, - 43541586362046046, - 21888242871839275222246405745257275088548364400416034343698146226766937829335, - 57397944336593029, - 28776079265074583, - 31676727629423242, - 4200036824325381, - 10522570083627682, - 21888242871839275222246405745257275088548364400416034343698183435141480023921, - 32208810388653208, - 10281531658290285, - 66058273691162106, - 41320914662158733, - 36609085177139098, - 49391877271021284, - 56055344359777155, - 38733126627582274, - 24139118637360735, - 21888242871839275222246405745257275088548364400416034343698189193143476040706, - 21888242871839275222246405745257275088548364400416034343698188502896549900815, - 21888242871839275222246405745257275088548364400416034343698149720914982488427, - 21888242871839275222246405745257275088548364400416034343698159663695156436539, - 21888242871839275222246405745257275088548364400416034343698167904901791498955, - 53204444780168008, - 21278011673043284, - 21888242871839275222246405745257275088548364400416034343698146416051757161651, - 21888242871839275222246405745257275088548364400416034343698197164431159862751, - 21888242871839275222246405745257275088548364400416034343698188297644101123227, - 21888242871839275222246405745257275088548364400416034343698188941762767171566, - 41946489423559351, - 21888242871839275222246405745257275088548364400416034343698188194101986999329, - 21888242871839275222246405745257275088548364400416034343698188541758496884647, - 45799560879017991, - 8442607141101581, - 6654206144664761, - 42474792851917261, - 13572971296794118, - 21888242871839275222246405745257275088548364400416034343698153180033234938863, - 70794798025913517, - 21888242871839275222246405745257275088548364400416034343698144593599952156095, - 21888242871839275222246405745257275088548364400416034343698171242491035932991, - 21888242871839275222246405745257275088548364400416034343698132563162522227053, - 21888242871839275222246405745257275088548364400416034343698201137737560167314, - 38044993540914382, - 21888242871839275222246405745257275088548364400416034343698133935974569963201, - 21888242871839275222246405745257275088548364400416034343698181561342275250920, - 21888242871839275222246405745257275088548364400416034343698176795049714351094, - 12173372017969192, - 9488380073092255, - 21888242871839275222246405745257275088548364400416034343698135247578783472264, - 21888242871839275222246405745257275088548364400416034343698179120439510668621, - 70210349895523028, - 18258574349985087, - 15563755605592492, - 21888242871839275222246405745257275088548364400416034343698184900431591883250, - 42665990231816467, - 21011785781765810, - 50687090638089450, - 21888242871839275222246405745257275088548364400416034343698157255658826502944, - 21888242871839275222246405745257275088548364400416034343698183917683086266012, - 2839878295504262, - 50261388210712314, - 70377720610805370, - 21888242871839275222246405745257275088548364400416034343698200099911813370127, - 26465165272874388, - 21888242871839275222246405745257275088548364400416034343698196725351219684226, - 21888242871839275222246405745257275088548364400416034343698134081472618667234, - 21888242871839275222246405745257275088548364400416034343698153643652399364490, - 15554135091377920, - 21888242871839275222246405745257275088548364400416034343698185353055536973792, - 69609976703995743, - 5673449703782296, - 25313152774095528, - 54836041968847799, - 10470192408011147, - 9881887219229347, - 21888242871839275222246405745257275088548364400416034343698160338810695412155, - 21888242871839275222246405745257275088548364400416034343698176274355939041556, - 21888242871839275222246405745257275088548364400416034343698147472491184129568, - 21888242871839275222246405745257275088548364400416034343698195325364145210385, - 68286513361317306, - 21888242871839275222246405745257275088548364400416034343698183070796442035052, - 42420030501880833, - 11560653319144142, - 21888242871839275222246405745257275088548364400416034343698151277121356824125, - 21888242871839275222246405745257275088548364400416034343698153328900873787933, - 21888242871839275222246405745257275088548364400416034343698191370250290023375, - 31472890360033856, - 21888242871839275222246405745257275088548364400416034343698201111900854274561, - 21888242871839275222246405745257275088548364400416034343698200828556071373672, - 21888242871839275222246405745257275088548364400416034343698195569087294345316, - 21888242871839275222246405745257275088548364400416034343698183168021393309939, - 8799150633725789, - 21888242871839275222246405745257275088548364400416034343698178149250970979596, - 21888242871839275222246405745257275088548364400416034343698162480700506885875, - 30997761583366042, - 30290834006735858, - 21888242871839275222246405745257275088548364400416034343698190552857867227041, - 21888242871839275222246405745257275088548364400416034343698184896679735303119, - 21888242871839275222246405745257275088548364400416034343698185018653474946451, - 50165248766542425, - 21888242871839275222246405745257275088548364400416034343698165892744204061926, - 21888242871839275222246405745257275088548364400416034343698135709635837169371, - 21888242871839275222246405745257275088548364400416034343698184417113472772667, - 17750528151445630, - 21888242871839275222246405745257275088548364400416034343698199669087416965482, - 29220394169620413, - 23566325696340539, - 21888242871839275222246405745257275088548364400416034343698174364324745382854, - 10450043543841787, - 21888242871839275222246405745257275088548364400416034343698158236728555441132, - 23733994413798402, - 64566264601720822, - 24971246027019333, - 21888242871839275222246405745257275088548364400416034343698140977838046726656, - 21888242871839275222246405745257275088548364400416034343698157518881296013212, - 49553156707740152, - 42963239394799709, - 21888242871839275222246405745257275088548364400416034343698200391847875963021, - 21888242871839275222246405745257275088548364400416034343698156510340386503461, - 71439026922596980, - 21888242871839275222246405745257275088548364400416034343698181689506871935926, - 34670460151041434, - 66413399528111216, - 21888242871839275222246405745257275088548364400416034343698145744142042398423, - 54633850830253626, - 21888242871839275222246405745257275088548364400416034343698167428171313559007, - 21888242871839275222246405745257275088548364400416034343698140873585935097034, - 67402987626839169, - 17111988848372025, - 29308940599821884, - 21888242871839275222246405745257275088548364400416034343698196168007566163722, - 12768023481283979, - 28727611992612506, - 30874507703058998, - 21888242871839275222246405745257275088548364400416034343698176146595170777552, - 70976947716581845, - 21888242871839275222246405745257275088548364400416034343698196693163115570883, - 21888242871839275222246405745257275088548364400416034343698163718595930445258, - 28967798436362234, - 21888242871839275222246405745257275088548364400416034343698163171092185504962, - 60075355724434094, - 39619853878673671, - 54877956398672720, - 21888242871839275222246405745257275088548364400416034343698180979004924865755, - 21888242871839275222246405745257275088548364400416034343698150184538339408391, - 23904033055456450, - 21888242871839275222246405745257275088548364400416034343698168796997223517098, - 21888242871839275222246405745257275088548364400416034343698187646326821576859, - 21888242871839275222246405745257275088548364400416034343698154651811446332354, - 21888242871839275222246405745257275088548364400416034343698138552470073102052, - 68443094416652420, - 21888242871839275222246405745257275088548364400416034343698142165101056385751, - 70960585217369864, - 63205825499421649, - 21888242871839275222246405745257275088548364400416034343698166651586163648337, - 21888242871839275222246405745257275088548364400416034343698138463800000301211, - 13793705205720603, - 67223649334483201, - 21888242871839275222246405745257275088548364400416034343698170508630055901410, - 57065327462182963, - 33342987023513137, - 21888242871839275222246405745257275088548364400416034343698135880781931715751, - 68112049780369257, - 21888242871839275222246405745257275088548364400416034343698172230234410761755, - 48024709481579356, - 8212825293959221, - 21888242871839275222246405745257275088548364400416034343698133423567014615669, - 69821647831007271, - 15490473440587045, - 42725885819666035, - 28941207808792812, - 21888242871839275222246405745257275088548364400416034343698133280616092403164, - 8363302411381268, - 28517783077019306, - 29615106982322437, - 60070495937483739, - 21888242871839275222246405745257275088548364400416034343698199029506395145943, - 21888242871839275222246405745257275088548364400416034343698174986278139857091, - 36936330233347275, - 44990855915477612, - 42319179878599055, - 61647459964743739, - 10756830113547419, - 21888242871839275222246405745257275088548364400416034343698153782389044487614, - 21888242871839275222246405745257275088548364400416034343698153925787594313977, - 55838093996548790, - 21888242871839275222246405745257275088548364400416034343698190272687074274509, - 21888242871839275222246405745257275088548364400416034343698164345448843575040, - 21888242871839275222246405745257275088548364400416034343698157725281328867452, - 24158073938992750, - 46559962152821947, - 21888242871839275222246405745257275088548364400416034343698145027006820682224, - 71869246662486037, - 51730845870472329, - 44706902008896190, - 63165787487301784, - 34524786221967997, - 49770540047362516, - 35032850772732307, - 13974381853157839, - 21888242871839275222246405745257275088548364400416034343698140418722062050611, - 52647060769290668, - 50979746973624928, - 58789422221408291, - 25298104016259510, - 68680091084790097, - 21888242871839275222246405745257275088548364400416034343698140571242923650457, - 21888242871839275222246405745257275088548364400416034343698179712651354868720, - 21888242871839275222246405745257275088548364400416034343698186855547024152416, - 21888242871839275222246405745257275088548364400416034343698167906528121775624, - 52759213448802247, - 26915771953893250, - 21888242871839275222246405745257275088548364400416034343698174493679615785824, - 21888242871839275222246405745257275088548364400416034343698133631560833824324, - 71849486049222311, - 21888242871839275222246405745257275088548364400416034343698175648327763220526, - 21888242871839275222246405745257275088548364400416034343698197686067911665907, - 21888242871839275222246405745257275088548364400416034343698134196332816489376, - 67658602725596810, - 21888242871839275222246405745257275088548364400416034343698191777555964884021, - 16993508680281914, - 34978350794786242, - 38430215758281605, - 21888242871839275222246405745257275088548364400416034343698141727842135193443, - 59987740320828644, - 11695910985186789, - 34099494553395405, - 21888242871839275222246405745257275088548364400416034343698165924917761741833, - 21888242871839275222246405745257275088548364400416034343698188586848108899533, - 21888242871839275222246405745257275088548364400416034343698141908022443965838, - 64835761331960125, - 21888242871839275222246405745257275088548364400416034343698146472153545833186, - 32677367602357689, - 21888242871839275222246405745257275088548364400416034343698140216011265260632, - 21888242871839275222246405745257275088548364400416034343698155212835237340435, - 21865287594142045, - 21888242871839275222246405745257275088548364400416034343698135801339324730899, - 21888242871839275222246405745257275088548364400416034343698160779145742383105, - 58452984203621327, - 53838789776387362, - 46427367829754215, - 6938257652675089, - 62492730401559234, - 21888242871839275222246405745257275088548364400416034343698138603964854450749, - 21888242871839275222246405745257275088548364400416034343698157828644576691440, - 21888242871839275222246405745257275088548364400416034343698153339527722548634, - 71700377495391875, - 58858438499147066, - 19283980507839205, - 19424763556761674, - 14401039544696412, - 53231992170195043, - 21888242871839275222246405745257275088548364400416034343698135753680312810227, - 21888242871839275222246405745257275088548364400416034343698139560695585071114, - 57607796071561055, - 21888242871839275222246405745257275088548364400416034343698169782711401817906, - 21888242871839275222246405745257275088548364400416034343698154111215081988624, - 21888242871839275222246405745257275088548364400416034343698133801682388175098, - 21888242871839275222246405745257275088548364400416034343698203310132067717316, - 21888242871839275222246405745257275088548364400416034343698149091213902977693, - 17614500791442012, - 21888242871839275222246405745257275088548364400416034343698168099241912192547, - 21888242871839275222246405745257275088548364400416034343698165561566293101869, - 21888242871839275222246405745257275088548364400416034343698165539442911759119, - 56391403954132537, - 68037091637388324, - 21888242871839275222246405745257275088548364400416034343698157210951646350155, - 21888242871839275222246405745257275088548364400416034343698178904782347208255, - 45146361422991844, - 21888242871839275222246405745257275088548364400416034343698175517472936120672, - 21888242871839275222246405745257275088548364400416034343698200047630642915677, - 21888242871839275222246405745257275088548364400416034343698174613312575866384, - 21888242871839275222246405745257275088548364400416034343698193411694186872593, - 21888242871839275222246405745257275088548364400416034343698190470075001238111, - 21888242871839275222246405745257275088548364400416034343698145809555673554851, - 21888242871839275222246405745257275088548364400416034343698169409329074973218, - 621839988664059, - 23999447425083276, - 5251385189763012, - 54863353373555388, - 71773044156251170, - 60514584196557796, - 21888242871839275222246405745257275088548364400416034343698142231764470768559, - 28505066953041998, - 21888242871839275222246405745257275088548364400416034343698133003232877510390, - 21888242871839275222246405745257275088548364400416034343698153712730065967827, - 21009794579779244, - 21888242871839275222246405745257275088548364400416034343698162035047245773029, - 25811987086044061, - 68875293522837754, - 21888242871839275222246405745257275088548364400416034343698173537468011555495, - 17703657498794707, - 21888242871839275222246405745257275088548364400416034343698188081520445827130, - 8381399473974711, - 11765674787273473, - 29740963729196908, - 51712268293222674, - 410596940960974, - 52496438290309095, - 21888242871839275222246405745257275088548364400416034343698201730623377039271, - 21888242871839275222246405745257275088548364400416034343698196653567761536688, - 26210625200320614, - 26986297862064720, - 53642140062669829, - 21888242871839275222246405745257275088548364400416034343698137018053414798527, - 36634274232849285, - 21888242871839275222246405745257275088548364400416034343698176831673340593422, - 21888242871839275222246405745257275088548364400416034343698139614898497045178, - 61478210216030338, - 21888242871839275222246405745257275088548364400416034343698152327914752967931, - 43906011291269819, - 21888242871839275222246405745257275088548364400416034343698154972469144223161, - 21888242871839275222246405745257275088548364400416034343698140429665888169604, - 21888242871839275222246405745257275088548364400416034343698177941518788438682, - 21888242871839275222246405745257275088548364400416034343698145219095727725675, - 47681642745283751, - 21888242871839275222246405745257275088548364400416034343698186030657491840741, - 48740533346053785, - 65249169577505505, - 58203645907190408, - 21888242871839275222246405745257275088548364400416034343698169052899789989369, - 60947543709298821, - 21888242871839275222246405745257275088548364400416034343698167113747418040543, - 48732421904418165, - 21888242871839275222246405745257275088548364400416034343698185973134890241600, - 21888242871839275222246405745257275088548364400416034343698193335921769816463, - 42176623082764791, - 2856704351745295, - 21888242871839275222246405745257275088548364400416034343698142607294719302543, - 21888242871839275222246405745257275088548364400416034343698148682066180864275, - 11901268611297907, - 21888242871839275222246405745257275088548364400416034343698166566675141548826, - 46763308669641803, - 9207202428870854, - 21888242871839275222246405745257275088548364400416034343698183609938962966308, - 21888242871839275222246405745257275088548364400416034343698153396462673600663, - 16045439061290180, - 9191068722107745, - 59049426139420652, - 66255126213639745, - 41348270673183936, - 21888242871839275222246405745257275088548364400416034343698166663588547918450, - 32300765882709254, - 21888242871839275222246405745257275088548364400416034343698192522351362096880, - 30590943321086822, - 21888242871839275222246405745257275088548364400416034343698149980783319857232, - 16238351216176304, - 21888242871839275222246405745257275088548364400416034343698159609374720834856, - 21888242871839275222246405745257275088548364400416034343698163412020126059545, - 40893070370613356, - 62809803379604080, - 19944541470504113, - 21888242871839275222246405745257275088548364400416034343698145680664347151743, - 10694855747606528, - 33480837465669637, - 21888242871839275222246405745257275088548364400416034343698136623771043324234, - 21888242871839275222246405745257275088548364400416034343698187461913429016916, - 21888242871839275222246405745257275088548364400416034343698190918891326697008, - 53842909072696242, - 21888242871839275222246405745257275088548364400416034343698150798328119703254, - 65942203952098623, - 60718378076168567, - 21888242871839275222246405745257275088548364400416034343698161453152058891588, - 21888242871839275222246405745257275088548364400416034343698184723941858590978, - 21888242871839275222246405745257275088548364400416034343698165427107274667807, - 33819207475847804, - 21888242871839275222246405745257275088548364400416034343698171435364235160627, - 21888242871839275222246405745257275088548364400416034343698185192376450995412, - 21888242871839275222246405745257275088548364400416034343698198214057672809874, - 21888242871839275222246405745257275088548364400416034343698203362524326456919, - 31339793907503647, - 21888242871839275222246405745257275088548364400416034343698186260762510035901, - 21888242871839275222246405745257275088548364400416034343698179763562210876993, - 9877253158635159, - 21888242871839275222246405745257275088548364400416034343698169942931201243966, - 21888242871839275222246405745257275088548364400416034343698203649541997638185, - 21888242871839275222246405745257275088548364400416034343698201552110605321411, - 21888242871839275222246405745257275088548364400416034343698144558192824958088, - 21888242871839275222246405745257275088548364400416034343698156793263451843486, - 66981667082298739, - 20323260493153698, - 24848084301845658, - 45454528056901770, - 5209587403066564, - 21888242871839275222246405745257275088548364400416034343698134058903718004127, - 21888242871839275222246405745257275088548364400416034343698179887856795277053, - 21888242871839275222246405745257275088548364400416034343698136655368843902953, - 58093657884610073, - 21888242871839275222246405745257275088548364400416034343698144481292998164498, - 21888242871839275222246405745257275088548364400416034343698164747778676441046, - 13572419313606875, - 21888242871839275222246405745257275088548364400416034343698137909100505519275, - 21888242871839275222246405745257275088548364400416034343698185130493939700246, - 31591997437594487, - 51915018498279888, - 50242292515416455, - 21888242871839275222246405745257275088548364400416034343698133887371313439259, - 3140023085436427, - 21888242871839275222246405745257275088548364400416034343698182673504367380081, - 21888242871839275222246405745257275088548364400416034343698181980946493260380, - 68288405281184926, - 21888242871839275222246405745257275088548364400416034343698184055520951829772, - 2874281389451214, - 62417265050489596, - 21888242871839275222246405745257275088548364400416034343698150976668289087966, - 21888242871839275222246405745257275088548364400416034343698181498039769839198, - 60800724665854979, - 21888242871839275222246405745257275088548364400416034343698171406897992773785, - 21888242871839275222246405745257275088548364400416034343698190226707178007849, - 21888242871839275222246405745257275088548364400416034343698167904720504498684, - 21888242871839275222246405745257275088548364400416034343698137615972682849652, - 21888242871839275222246405745257275088548364400416034343698166151670990079107, - 21888242871839275222246405745257275088548364400416034343698135791930860247201, - 54541127546791323, - 21888242871839275222246405745257275088548364400416034343698139290476558750044, - 41282321713345536, - 18408230414755154, - 21888242871839275222246405745257275088548364400416034343698134571419053883492, - 21888242871839275222246405745257275088548364400416034343698183918951357207384, - 57807491959126793, - 21888242871839275222246405745257275088548364400416034343698174721762407067269, - 21888242871839275222246405745257275088548364400416034343698137966121860326194, - 20526423560682666, - 21888242871839275222246405745257275088548364400416034343698133628805781652076, - 23635060993277735, - 21888242871839275222246405745257275088548364400416034343698196168104239850301, - 21888242871839275222246405745257275088548364400416034343698139748563950781585, - 21888242871839275222246405745257275088548364400416034343698192734765531456435, - 20446236804249185, - 23880370435703444, - 60193676561101973, - 4483851085016176, - 21888242871839275222246405745257275088548364400416034343698192936493559900427, - 21888242871839275222246405745257275088548364400416034343698200906808187245417, - 21888242871839275222246405745257275088548364400416034343698201431930760378854, - 45968310311427352, - 21888242871839275222246405745257275088548364400416034343698166456352994912260, - 60357589226613939, - 55111519749890966, - 9554730646121207, - 21888242871839275222246405745257275088548364400416034343698150837113955412032, - 59954476606780075, - 21888242871839275222246405745257275088548364400416034343698159962474111569778, - 21888242871839275222246405745257275088548364400416034343698161193084386205566, - 32387929144345531, - 21888242871839275222246405745257275088548364400416034343698140770289585445100, - 21888242871839275222246405745257275088548364400416034343698141366637820433059, - 3815038300132640, - 21888242871839275222246405745257275088548364400416034343698177731218241503870, - 9672363563675886, - 21888242871839275222246405745257275088548364400416034343698186420490713412531, - 33879660978147494, - 5480986570198982, - 21888242871839275222246405745257275088548364400416034343698183868815374744745, - 21888242871839275222246405745257275088548364400416034343698148520244351960813, - 23012388439026582, - 21888242871839275222246405745257275088548364400416034343698136812234588015235, - 21888242871839275222246405745257275088548364400416034343698173866485208249488, - 672660056913953, - 32954925266614237, - 60438628552338655, - 21888242871839275222246405745257275088548364400416034343698180958553489658973, - 21888242871839275222246405745257275088548364400416034343698153499582465986497, - 21888242871839275222246405745257275088548364400416034343698166150332335210825, - 21888242871839275222246405745257275088548364400416034343698142669171173665827, - 18286183276611506, - 21888242871839275222246405745257275088548364400416034343698174460133787897635, - 21888242871839275222246405745257275088548364400416034343698196766741125591558, - 6726173293213083, - 21888242871839275222246405745257275088548364400416034343698147052328108605471, - 13245135094570715, - 7577066263967636, - 58007321612189291, - 21888242871839275222246405745257275088548364400416034343698153179828441605001, - 14880509575234055, - 3793890336523688, - 21888242871839275222246405745257275088548364400416034343698165598117272649405, - 13771309942679513, - 22452032497948546, - 69555802904425099, - 21888242871839275222246405745257275088548364400416034343698182515130098194442, - 21888242871839275222246405745257275088548364400416034343698140476150968601111, - 21888242871839275222246405745257275088548364400416034343698175311623852043989, - 21888242871839275222246405745257275088548364400416034343698144389945108938196, - 19346939125538813, - 4258747382310006, - 21888242871839275222246405745257275088548364400416034343698204075799013295144, - 21888242871839275222246405745257275088548364400416034343698191567842770417204, - 70056831500956638, - 21888242871839275222246405745257275088548364400416034343698159703447832125524, - 38234009624705933, - 57435218082402495, - 29478218983951111, - 21888242871839275222246405745257275088548364400416034343698142765446569480229, - 21888242871839275222246405745257275088548364400416034343698147126414945809841, - 53908348716537028, - 48157058956090549, - 46767052004561811, - 21888242871839275222246405745257275088548364400416034343698190024411418962530, - 21888242871839275222246405745257275088548364400416034343698185167306854003979, - 20305198550807516, - 21888242871839275222246405745257275088548364400416034343698132145587775800680, - 21888242871839275222246405745257275088548364400416034343698143172870769976035, - 9242770050091518, - 15678412244173933, - 21888242871839275222246405745257275088548364400416034343698177648934397055762, - 43489433216202985, - 21888242871839275222246405745257275088548364400416034343698172231847924322765, - 3151305303276512, - 25526269170858055, - 25928052071808384, - 21888242871839275222246405745257275088548364400416034343698138776139543624206, - 13837221037273702, - 62642628396956847, - 21888242871839275222246405745257275088548364400416034343698180731520802741408, - 21888242871839275222246405745257275088548364400416034343698202970249343896491, - 9128069725510874, - 17086091310525875, - 21888242871839275222246405745257275088548364400416034343698197635774619568708, - 21888242871839275222246405745257275088548364400416034343698136218626745510679, - 12061762900989357, - 42143324936173493, - 54034510387313651, - 21888242871839275222246405745257275088548364400416034343698189221616458731950, - 48257115365875899, - 6470725009102522, - 28331686204981339, - 50759832063639253, - 21888242871839275222246405745257275088548364400416034343698138642471284295049, - 21888242871839275222246405745257275088548364400416034343698201045859554451258, - 21888242871839275222246405745257275088548364400416034343698164964719596606749, - 21888242871839275222246405745257275088548364400416034343698199185701169067566, - 34292136372584135, - 21888242871839275222246405745257275088548364400416034343698156225724359479401, - 21888242871839275222246405745257275088548364400416034343698160226337230028909, - 21888242871839275222246405745257275088548364400416034343698153619991307067082, - 21888242871839275222246405745257275088548364400416034343698165825426466842304, - 21888242871839275222246405745257275088548364400416034343698192446200564350595, - 21888242871839275222246405745257275088548364400416034343698152697675512888125, - 21888242871839275222246405745257275088548364400416034343698163626703364753019, - 21888242871839275222246405745257275088548364400416034343698187710566302086923, - 21888242871839275222246405745257275088548364400416034343698160842393002303306, - 14684639632150993, - 21888242871839275222246405745257275088548364400416034343698134347042165271299, - 46664981831082998, - 21888242871839275222246405745257275088548364400416034343698166633175205091905, - 45789190565667621, - 49180875480136181, - 21888242871839275222246405745257275088548364400416034343698152299643819414319, - 21888242871839275222246405745257275088548364400416034343698155441544713988598, - 34503757658957390, - 21888242871839275222246405745257275088548364400416034343698144343952532380016, - 45838281379191384, - 63969245305937937, - 21888242871839275222246405745257275088548364400416034343698201093240927777378, - 21888242871839275222246405745257275088548364400416034343698199835333268890662, - 29219375846929775, - 25026184951230730, - 41387496183733252, - 21888242871839275222246405745257275088548364400416034343698132317742922856160, - 43007984335397786, - 51750957271494053, - 21888242871839275222246405745257275088548364400416034343698202087339043094529, - 21888242871839275222246405745257275088548364400416034343698167046641946909072, - 42937071127723251, - 21888242871839275222246405745257275088548364400416034343698151550704645244348, - 21888242871839275222246405745257275088548364400416034343698141667512659229595, - 21888242871839275222246405745257275088548364400416034343698160529073750068663, - 15582128118910199, - 35082297362122403, - 30162755203326059, - 14181944115271296, - 21888242871839275222246405745257275088548364400416034343698191926528298902563, - 19163283457364387, - 70222417062853485, - 21888242871839275222246405745257275088548364400416034343698183173954939717925, - 32255055426930035, - 21888242871839275222246405745257275088548364400416034343698159639090494008938, - 21888242871839275222246405745257275088548364400416034343698189368066856621601, - 26276183472615544, - 7000122464120084, - 50853399897809022, - 21888242871839275222246405745257275088548364400416034343698166757213277723582, - 21888242871839275222246405745257275088548364400416034343698194020006845426674, - 21888242871839275222246405745257275088548364400416034343698200387954555208949, - 21888242871839275222246405745257275088548364400416034343698167414261067068773, - 21888242871839275222246405745257275088548364400416034343698204068569360243006, - 19052485746895946, - 53631595913755426, - 21888242871839275222246405745257275088548364400416034343698173187424241899712, - 41466648003131567, - 21888242871839275222246405745257275088548364400416034343698199174752299021411, - 57615710124698677, - 21888242871839275222246405745257275088548364400416034343698178751388825160144, - 13966686798669901, - 57313296096298898, - 67853663737316495, - 9977144644083685, - 53337901879461067, - 21888242871839275222246405745257275088548364400416034343698174953425518989444, - 21888242871839275222246405745257275088548364400416034343698178064360235449374, - 9506853042155004, - 17547264932867265, - 21888242871839275222246405745257275088548364400416034343698197043326113981647, - 21888242871839275222246405745257275088548364400416034343698169400461430704618, - 22082519580681869, - 58266743052663455, - 21888242871839275222246405745257275088548364400416034343698203693022882339981, - 21888242871839275222246405745257275088548364400416034343698191247141953830386, - 61248161512334125, - 21888242871839275222246405745257275088548364400416034343698166987650904552186, - 8969298977114916, - 21888242871839275222246405745257275088548364400416034343698149338727735772171, - 41688816036800290, - 21888242871839275222246405745257275088548364400416034343698139841815910883201, - 63725564447250108, - 44206550475645328, - 21888242871839275222246405745257275088548364400416034343698158729460424075682, - 21888242871839275222246405745257275088548364400416034343698134179561235043321, - 21888242871839275222246405745257275088548364400416034343698175714502212474684, - 21888242871839275222246405745257275088548364400416034343698183225393416286868, - 21888242871839275222246405745257275088548364400416034343698139979695278796765, - 53732150671026275, - 20812531689587401, - 21888242871839275222246405745257275088548364400416034343698142588040931492596, - 38777693417492568, - 15075356978903965, - 44897729161443216, - 21888242871839275222246405745257275088548364400416034343698196017219408879820, - 21888242871839275222246405745257275088548364400416034343698152972903093805454, - 29287745133649185, - 30337411416214501, - 21888242871839275222246405745257275088548364400416034343698197718488556900303, - 21888242871839275222246405745257275088548364400416034343698186133022324476719, - 17083831294732062, - 42340724128877546, - 21888242871839275222246405745257275088548364400416034343698173373103815675203, - 21888242871839275222246405745257275088548364400416034343698194382229874521745, - 21888242871839275222246405745257275088548364400416034343698132413754951212267, - 70307389367955702, - 21888242871839275222246405745257275088548364400416034343698198246470734039121, - 21888242871839275222246405745257275088548364400416034343698165324329625597463, - 60530119831273271, - 63142597612802469, - 21888242871839275222246405745257275088548364400416034343698176386417571220275, - 35434071730934510, - 2309191771743235, - 21888242871839275222246405745257275088548364400416034343698188919262225632867, - 21888242871839275222246405745257275088548364400416034343698147041840600257788, - 52559519704070055, - 38985231026586372, - 60496264491802094, - 56599827956796203, - 66839416058223340, - 21888242871839275222246405745257275088548364400416034343698137986169082998551, - 6572121635341802, - 12970415689411270, - 65196831580750099, - 64112550053973293, - 20868444843878477, - 43811916958548084, - 68477294810129541, - 21888242871839275222246405745257275088548364400416034343698185746786852607988, - 21888242871839275222246405745257275088548364400416034343698203331701151879311, - 21888242871839275222246405745257275088548364400416034343698135779606074176542, - 21888242871839275222246405745257275088548364400416034343698135646084871616075, - 1451970303153624, - 67506204328058542, - 49968869693074196, - 21888242871839275222246405745257275088548364400416034343698166889520783053727, - 54623641704272238, - 41360737445393886, - 46964911203539446, - 21888242871839275222246405745257275088548364400416034343698193709410879726951, - 21888242871839275222246405745257275088548364400416034343698179688587655160249, - 47483992583042395, - 9549270976828706, - 21888242871839275222246405745257275088548364400416034343698170622425585681724, - 21888242871839275222246405745257275088548364400416034343698186824583696575597, - 37679424452685333, - 21888242871839275222246405745257275088548364400416034343698135414597709211908, - 4884152614617055, - 56859181766422597, - 41026832890027980, - 21888242871839275222246405745257275088548364400416034343698139097497706521911, - 32885686644191199, - 56490050712563482, - 58035254306970712, - 21888242871839275222246405745257275088548364400416034343698143336298293338055, - 46178246192268621, - 49832284999961478, - 21888242871839275222246405745257275088548364400416034343698147500569205220629, - 15191661399887723, - 21888242871839275222246405745257275088548364400416034343698193179141988568898, - 3553637204964591, - 30768821413668729, - 37894179290005519, - 21888242871839275222246405745257275088548364400416034343698142722976973383075, - 21888242871839275222246405745257275088548364400416034343698187423723487160374, - 21888242871839275222246405745257275088548364400416034343698177704674755247617, - 36076095574177255, - 32274950187395277, - 21888242871839275222246405745257275088548364400416034343698151117131428230337, - 21888242871839275222246405745257275088548364400416034343698134331065745407138, - 53430664703144443, - 61652443408466787, - 21888242871839275222246405745257275088548364400416034343698191152260633605245, - 21888242871839275222246405745257275088548364400416034343698137948655035238676, - 21888242871839275222246405745257275088548364400416034343698145110328743086371, - 21888242871839275222246405745257275088548364400416034343698142555127099888777, - 21888242871839275222246405745257275088548364400416034343698141408103002738189, - 21888242871839275222246405745257275088548364400416034343698164795236761600056, - 61342002037470557, - 21888242871839275222246405745257275088548364400416034343698169334407416475208, - 20044143355443930, - 21888242871839275222246405745257275088548364400416034343698145123351932847576, - 1501706254358410, - 68772626894455121, - 21888242871839275222246405745257275088548364400416034343698168330431221465051, - 21888242871839275222246405745257275088548364400416034343698163318460818980232, - 11544788417933500, - 57894084848521954, - 20634371050303857, - 41533557086392378, - 21888242871839275222246405745257275088548364400416034343698196082022641043083, - 56720746780209360, - 29571191113985007, - 21888242871839275222246405745257275088548364400416034343698201536978800364339, - 21888242871839275222246405745257275088548364400416034343698200293347875082400, - 29449931064104867, - 21888242871839275222246405745257275088548364400416034343698160409066218248346, - 4004157320906434, - 16501482502498273, - 21888242871839275222246405745257275088548364400416034343698191263541371439055, - 21888242871839275222246405745257275088548364400416034343698199706074881682036, - 21888242871839275222246405745257275088548364400416034343698172635604225482400, - 21888242871839275222246405745257275088548364400416034343698188397647779367742, - 21888242871839275222246405745257275088548364400416034343698171116971340915506, - 14756971343148150, - 11112098645693233, - 38257846403376146, - 21273217642058563, - 24171149481074464, - 41343915991262243, - 51860619387433352, - 39624383550465762, - 21888242871839275222246405745257275088548364400416034343698132839141721924299, - 21888242871839275222246405745257275088548364400416034343698190064217495856612, - 21888242871839275222246405745257275088548364400416034343698159441967273678483, - 21888242871839275222246405745257275088548364400416034343698189902478271143591, - 21888242871839275222246405745257275088548364400416034343698171731150998249220, - 24016064537527950, - 62603561376098793, - 21888242871839275222246405745257275088548364400416034343698149375313193171213, - 56127688877255821, - 21888242871839275222246405745257275088548364400416034343698144301874138068011, - 55935821314330475, - 21888242871839275222246405745257275088548364400416034343698138193546031542174, - 64840204397699878, - 52106451070677076, - 16621370158371049, - 21888242871839275222246405745257275088548364400416034343698187007101538320256, - 21888242871839275222246405745257275088548364400416034343698188308571308934099, - 52046773899588028, - 56473169735977102, - 9604734761339699, - 20718373694156916, - 21888242871839275222246405745257275088548364400416034343698159798591157655896, - 8583241956510303, - 21888242871839275222246405745257275088548364400416034343698136281296186334732, - 29787088537778837, - 34501013209406375, - 5896425587084253, - 21888242871839275222246405745257275088548364400416034343698154325832484014062, - 35629877858228574, - 64728614487001390, - 21888242871839275222246405745257275088548364400416034343698177391820494078039, - 21888242871839275222246405745257275088548364400416034343698185204880192473275, - 51970096685405018, - 21888242871839275222246405745257275088548364400416034343698159830925805131731, - 21888242871839275222246405745257275088548364400416034343698191639445679634536, - 21888242871839275222246405745257275088548364400416034343698163951643689063259, - 21888242871839275222246405745257275088548364400416034343698132436304237165682, - 21888242871839275222246405745257275088548364400416034343698146969180792723829, - 18365900390984131, - 17235672350910687, - 26913771397014749, - 59563339360393758, - 21888242871839275222246405745257275088548364400416034343698178907976965534870, - 21888242871839275222246405745257275088548364400416034343698163071679800889470, - 31771500731028714, - 21888242871839275222246405745257275088548364400416034343698193195626997760181, - 21888242871839275222246405745257275088548364400416034343698154151252742286700, - 68068794128960013, - 58915868838571542, - 39496215399033933, - 21888242871839275222246405745257275088548364400416034343698156017868087691528, - 21888242871839275222246405745257275088548364400416034343698165233994924073319, - 67079287749343176, - 62236649815274399, - 53731094103216500, - 21888242871839275222246405745257275088548364400416034343698165254518548550522, - 56316693266495842, - 35265699848244482, - 26655406037333655, - 21888242871839275222246405745257275088548364400416034343698202403979132167549, - 54445395933304183, - 15236261384128148, - 21888242871839275222246405745257275088548364400416034343698166911431114916678, - 21888242871839275222246405745257275088548364400416034343698145865671863214878, - 44975778176810279, - 59256054845705615, - 21888242871839275222246405745257275088548364400416034343698132456716395171188, - 51197493166608766, - 12458380643059364, - 21888242871839275222246405745257275088548364400416034343698144419726685071472, - 59291772336813013, - 67219839432542973, - 21888242871839275222246405745257275088548364400416034343698184641895387984886, - 25434219488196963, - 21888242871839275222246405745257275088548364400416034343698193541482232316384, - 21888242871839275222246405745257275088548364400416034343698159547543894678569, - 65530976902280831, - 68240366601545053, - 21888242871839275222246405745257275088548364400416034343698149653263356901982, - 21888242871839275222246405745257275088548364400416034343698166212892898429993, - 14525689645242258, - 21888242871839275222246405745257275088548364400416034343698135065674886704859, - 21888242871839275222246405745257275088548364400416034343698142089277477392656, - 21888242871839275222246405745257275088548364400416034343698168726700171503718, - 54166625698395940, - 25421295578752586, - 63258767868477887, - 21888242871839275222246405745257275088548364400416034343698139471270844391976, - 69556443595003071, - 46036729323143149, - 21888242871839275222246405745257275088548364400416034343698180760923450236855, - 69749188023087301, - 21888242871839275222246405745257275088548364400416034343698173195715110044218, - 21888242871839275222246405745257275088548364400416034343698144410297078770555, - 21888242871839275222246405745257275088548364400416034343698148398074315972547, - 48936470376620044, - 21888242871839275222246405745257275088548364400416034343698168553376478950747, - 21888242871839275222246405745257275088548364400416034343698178943252160659206, - 21725305737204499, - 21888242871839275222246405745257275088548364400416034343698204066044134191852, - 17991013506952568, - 63598236607004413, - 21888242871839275222246405745257275088548364400416034343698197925459784575167, - 18755842619691757, - 57800586898142244, - 21888242871839275222246405745257275088548364400416034343698200901164567063857, - 21888242871839275222246405745257275088548364400416034343698167624592831079884, - 21888242871839275222246405745257275088548364400416034343698142484735337811538, - 21888242871839275222246405745257275088548364400416034343698181494626975603031, - 21888242871839275222246405745257275088548364400416034343698199859919057708215, - 21827999808898154, - 4531175452273588, - 65968525220026444, - 21888242871839275222246405745257275088548364400416034343698189645709653803774, - 21460148010577000, - 12252042407780892, - 21888242871839275222246405745257275088548364400416034343698159998984850593845, - 21888242871839275222246405745257275088548364400416034343698169536321351747006, - 21888242871839275222246405745257275088548364400416034343698181621934240050903, - 21888242871839275222246405745257275088548364400416034343698135531064194291517, - 21888242871839275222246405745257275088548364400416034343698136721137828355277, - 21888242871839275222246405745257275088548364400416034343698159514730158763184, - 49484607654312799, - 38398791570206852, - 9713031704447328, - 16194711233923187, - 12801689346353566, - 44321155897833817, - 21888242871839275222246405745257275088548364400416034343698147183644373962788, - 64511056035494204, - 25999358972096323, - 62394532719498767, - 21888242871839275222246405745257275088548364400416034343698189720325305679268, - 21888242871839275222246405745257275088548364400416034343698187196188402075721, - 428368003234566, - 21888242871839275222246405745257275088548364400416034343698199342043764903060, - 21888242871839275222246405745257275088548364400416034343698173670248978210106, - 21888242871839275222246405745257275088548364400416034343698141210600235055462, - 21888242871839275222246405745257275088548364400416034343698169044978300543917, - 17319057796577040, - 21888242871839275222246405745257275088548364400416034343698132625395778017650, - 6471120834116592, - 64234827230793470, - 21888242871839275222246405745257275088548364400416034343698193121115561192457, - 21888242871839275222246405745257275088548364400416034343698186786820411341127, - 9673959150749784, - 21888242871839275222246405745257275088548364400416034343698173980075379967239, - 21888242871839275222246405745257275088548364400416034343698204076281040251544, - 21888242871839275222246405745257275088548364400416034343698176302244223627187, - 30673022880810650, - 12835134454927722, - 21888242871839275222246405745257275088548364400416034343698196472981673227734, - 5878521565944772, - 21888242871839275222246405745257275088548364400416034343698145544493897631467, - 21888242871839275222246405745257275088548364400416034343698150692467586706340, - 21888242871839275222246405745257275088548364400416034343698139868274319883244, - 21888242871839275222246405745257275088548364400416034343698157341081839689386, - 62411817881004174, - 21888242871839275222246405745257275088548364400416034343698153018608400461520, - 21888242871839275222246405745257275088548364400416034343698172763236795242431, - 21888242871839275222246405745257275088548364400416034343698185100153450724170, - 21888242871839275222246405745257275088548364400416034343698186930567523235245, - 51493012111688659, - 71735893750536357, - 71597488894169043, - 52521770286541177, - 21888242871839275222246405745257275088548364400416034343698147602678172011035, - 7505296854270116, - 21888242871839275222246405745257275088548364400416034343698189969124358409297, - 17469443564169205, - 21888242871839275222246405745257275088548364400416034343698181966119510081773, - 12033231741560648, - 21888242871839275222246405745257275088548364400416034343698156406090667639329, - 46923008966909002, - 21888242871839275222246405745257275088548364400416034343698182920463563765836, - 65239607197654753, - 21888242871839275222246405745257275088548364400416034343698144629283362817375, - 21888242871839275222246405745257275088548364400416034343698170262545038553738, - 21888242871839275222246405745257275088548364400416034343698185929400973505262, - 21888242871839275222246405745257275088548364400416034343698175296902997403206, - 21888242871839275222246405745257275088548364400416034343698193918224336031760, - 43056308744604149, - 25726801559206707, - 21888242871839275222246405745257275088548364400416034343698174733104247921305, - 54127411915041990, - 67757319796556365, - 31082073663360651, - 26854021152461721, - 21888242871839275222246405745257275088548364400416034343698186837778726097725, - 21888242871839275222246405745257275088548364400416034343698169548458937458563, - 59976762898734467, - 24674252970709067, - 21888242871839275222246405745257275088548364400416034343698132378316124571845, - 22686660133610595, - 21888242871839275222246405745257275088548364400416034343698179179650024728817, - 11321696780543912, - 19883040113606277, - 22451197330296910, - 21888242871839275222246405745257275088548364400416034343698136617537832568036, - 9490962787842146, - 54457477792202227, - 21888242871839275222246405745257275088548364400416034343698182740818728074190, - 21888242871839275222246405745257275088548364400416034343698186473268726780760, - 50038272274587863, - 21888242871839275222246405745257275088548364400416034343698133394859658089552, - 21888242871839275222246405745257275088548364400416034343698168408160354231735, - 21888242871839275222246405745257275088548364400416034343698185336034152690440, - 22841835941331339, - 21888242871839275222246405745257275088548364400416034343698139844374664018839, - 44870140067762122, - 21888242871839275222246405745257275088548364400416034343698181885583199399349, - 21888242871839275222246405745257275088548364400416034343698154334718061853546, - 21888242871839275222246405745257275088548364400416034343698134194110139855661, - 37225913654837354, - 21948109641938685, - 28440682143972598, - 21888242871839275222246405745257275088548364400416034343698149333808260913148, - 19405923919705468, - 21888242871839275222246405745257275088548364400416034343698166190555243120228, - 31488149024723091, - 21888242871839275222246405745257275088548364400416034343698166135112806507524, - 44218167235694988, - 21888242871839275222246405745257275088548364400416034343698185910371962699134, - 21888242871839275222246405745257275088548364400416034343698175464344831378858, - 21888242871839275222246405745257275088548364400416034343698177101164338457180, - 19390073495674373, - 20945969909809704, - 21888242871839275222246405745257275088548364400416034343698141773717245920179, - 21888242871839275222246405745257275088548364400416034343698178680125976795757, - 61691340398021986, - 62780404848613223, - 21888242871839275222246405745257275088548364400416034343698163138601362797969, - 21888242871839275222246405745257275088548364400416034343698197994113805921559, - 30727377960931701, - 35257707231946769, - 68872337448543742, - 40204611205200475, - 21888242871839275222246405745257275088548364400416034343698142402807337015789, - 39571442696981620, - 21888242871839275222246405745257275088548364400416034343698142507618864882263, - 28684058416667857, - 21888242871839275222246405745257275088548364400416034343698188839376307331855, - 45834142394280030, - 21888242871839275222246405745257275088548364400416034343698145647673270655799, - 47356803821815577, - 21888242871839275222246405745257275088548364400416034343698165932038439584603, - 1941519018081778, - 51528126682023867, - 17061105208888115, - 21888242871839275222246405745257275088548364400416034343698153644510586172949, - 32610211255560515, - 21888242871839275222246405745257275088548364400416034343698154495403888021574, - 61917869198301080, - 21888242871839275222246405745257275088548364400416034343698136259778284970102, - 21888242871839275222246405745257275088548364400416034343698200839796510081054, - 17279660038989993, - 21888242871839275222246405745257275088548364400416034343698202907615333844918, - 55181768368995374, - 49965288340691115, - 31880400338693850, - 21888242871839275222246405745257275088548364400416034343698144831659938591914, - 21888242871839275222246405745257275088548364400416034343698149165934364250877, - 21888242871839275222246405745257275088548364400416034343698177598416037104351, - 21888242871839275222246405745257275088548364400416034343698158504541381013299, - 21888242871839275222246405745257275088548364400416034343698181086375648994997, - 32029050507127187, - 27302077235437986, - 65723295630102689, - 31122018063621644, - 49559079915992095, - 21888242871839275222246405745257275088548364400416034343698154116955832515500, - 21888242871839275222246405745257275088548364400416034343698172177638543489834, - 21888242871839275222246405745257275088548364400416034343698143974327823424895, - 21888242871839275222246405745257275088548364400416034343698156270675744729432, - 21888242871839275222246405745257275088548364400416034343698190118663213235043, - 50168098483286328, - 52891971599362971, - 21888242871839275222246405745257275088548364400416034343698201204546315079098, - 21888242871839275222246405745257275088548364400416034343698188851596690081466, - 21888242871839275222246405745257275088548364400416034343698184341878709480640, - 15450892485554850, - 67905719967924689, - 21888242871839275222246405745257275088548364400416034343698169811342410514027, - 21888242871839275222246405745257275088548364400416034343698146732130692370673, - 36837931839929951, - 11650562443869287, - 43106904385630858, - 21888242871839275222246405745257275088548364400416034343698162876208363511502, - 21888242871839275222246405745257275088548364400416034343698146901090286837026, - 21888242871839275222246405745257275088548364400416034343698191541341237017390, - 21888242871839275222246405745257275088548364400416034343698168816711349306170, - 13564608826763025, - 21888242871839275222246405745257275088548364400416034343698168873642308960735, - 48756733022932387, - 21888242871839275222246405745257275088548364400416034343698160969917791872879, - 30449881604366720, - 21888242871839275222246405745257275088548364400416034343698152623220716083737, - 21888242871839275222246405745257275088548364400416034343698190574986791265137, - 30892967375468976, - 2188941004843812, - 25868389878223195, - 38507847063393075, - 21888242871839275222246405745257275088548364400416034343698140385288566173660, - 58229119943683682, - 18912467227405797, - 21888242871839275222246405745257275088548364400416034343698144534493456259605, - 21888242871839275222246405745257275088548364400416034343698192275620008332770, - 44168377293067447, - 68846941821251505, - 2418481453886328, - 21888242871839275222246405745257275088548364400416034343698184156590989409371, - 21888242871839275222246405745257275088548364400416034343698133211868334509734, - 21888242871839275222246405745257275088548364400416034343698190739158176843944, - 21888242871839275222246405745257275088548364400416034343698154432166856256816, - 16896088902341083, - 34514773981126971, - 21888242871839275222246405745257275088548364400416034343698137317173240322529, - 21888242871839275222246405745257275088548364400416034343698153846040765818877, - 71400939157302726, - 21888242871839275222246405745257275088548364400416034343698191803643942727113, - 47485703135079749, - 60569584076278581, - 21888242871839275222246405745257275088548364400416034343698173437715829717474, - 21888242871839275222246405745257275088548364400416034343698194585058804637725, - 21888242871839275222246405745257275088548364400416034343698177482148099352566, - 70692139468394946, - 21888242871839275222246405745257275088548364400416034343698166629730779998401, - 57959108080305828, - 21888242871839275222246405745257275088548364400416034343698162065127132980405, - 52775896821230306, - 21888242871839275222246405745257275088548364400416034343698200586533137020812, - 21888242871839275222246405745257275088548364400416034343698198798318527352754, - 36233226820262059, - 51446485132245696, - 21888242871839275222246405745257275088548364400416034343698161930544375902549, - 21888242871839275222246405745257275088548364400416034343698203140692627340527, - 21888242871839275222246405745257275088548364400416034343698167376805534379545, - 71509392853480352, - 21888242871839275222246405745257275088548364400416034343698180621633841034795, - 67800434437809820, - 60790027723700850, - 21888242871839275222246405745257275088548364400416034343698187857873123612589, - 21888242871839275222246405745257275088548364400416034343698146912038838230527, - 21888242871839275222246405745257275088548364400416034343698175318554827185641, - 21888242871839275222246405745257275088548364400416034343698181319422335442477, - 21888242871839275222246405745257275088548364400416034343698144682260325528212, - 17786718805839187, - 22603902288369770, - 21888242871839275222246405745257275088548364400416034343698149508930066866527, - 67647714268508662, - 375469432163961, - 18419026074664704, - 19981112151562890, - 21888242871839275222246405745257275088548364400416034343698134712368517113809, - 21888242871839275222246405745257275088548364400416034343698155624044584621704, - 21888242871839275222246405745257275088548364400416034343698156904185028845568, - 21888242871839275222246405745257275088548364400416034343698187692688238628466, - 21888242871839275222246405745257275088548364400416034343698152840646089507641, - 33107621031436358, - 21888242871839275222246405745257275088548364400416034343698160003654488107807, - 21888242871839275222246405745257275088548364400416034343698162583577317307356, - 21888242871839275222246405745257275088548364400416034343698162642655549709356, - 16704639068532269, - 21888242871839275222246405745257275088548364400416034343698201135548884971995, - 21888242871839275222246405745257275088548364400416034343698137102708375444511, - 48545152029324858, - 50287735642227465, - 71026063152746794, - 20136084982791217, - 21888242871839275222246405745257275088548364400416034343698180305291010573181, - 21888242871839275222246405745257275088548364400416034343698178152174466264366, - 21888242871839275222246405745257275088548364400416034343698135375146861710142, - 71476140348888425, - 54081369628370471, - 11498499845371081, - 21888242871839275222246405745257275088548364400416034343698160813159306846125, - 21888242871839275222246405745257275088548364400416034343698177415252858371578, - 21888242871839275222246405745257275088548364400416034343698155503277184240258, - 20315255110730367, - 21888242871839275222246405745257275088548364400416034343698197388998210011047, - 21888242871839275222246405745257275088548364400416034343698190541073761624139, - 21888242871839275222246405745257275088548364400416034343698183055738473667965, - 21888242871839275222246405745257275088548364400416034343698187772133003664363, - 21888242871839275222246405745257275088548364400416034343698167128020877535485, - 21888242871839275222246405745257275088548364400416034343698154551710656391303, - 325179482783580, - 21888242871839275222246405745257275088548364400416034343698158838103507046621, - 21888242871839275222246405745257275088548364400416034343698177807614483871301, - 14473004274138963, - 10287876466704507, - 10816065957706784, - 21888242871839275222246405745257275088548364400416034343698203537956743356124, - 26272074679894836, - 21888242871839275222246405745257275088548364400416034343698179399844352976473, - 65149140084763524, - 54464897414747774, - 21888242871839275222246405745257275088548364400416034343698179235614869154430, - 21888242871839275222246405745257275088548364400416034343698168165979161058757, - 21888242871839275222246405745257275088548364400416034343698159163272733965004, - 41679151224629071, - 21888242871839275222246405745257275088548364400416034343698148800336283306622, - 16799296912365312, - 21888242871839275222246405745257275088548364400416034343698166327512283732735, - 48313802544909579, - 21888242871839275222246405745257275088548364400416034343698139492154356926120, - 71666350254996526, - 21888242871839275222246405745257275088548364400416034343698198082051980368830, - 21888242871839275222246405745257275088548364400416034343698200840745322526777, - 37583631661447069, - 1551412037408189, - 21888242871839275222246405745257275088548364400416034343698179433128971196857, - 21888242871839275222246405745257275088548364400416034343698145846877921883003, - 1302565939797813, - 21888242871839275222246405745257275088548364400416034343698180156141564665658, - 21888242871839275222246405745257275088548364400416034343698141459587852778220, - 21888242871839275222246405745257275088548364400416034343698199347138951036753, - 4896278905133370, - 21888242871839275222246405745257275088548364400416034343698191515598767391636, - 49928088255345695, - 21888242871839275222246405745257275088548364400416034343698144743432957074660, - 62796360357277599, - 21888242871839275222246405745257275088548364400416034343698202403628194374154, - 21888242871839275222246405745257275088548364400416034343698198268702098047153, - 32697853487460931, - 21888242871839275222246405745257275088548364400416034343698169128861304336346, - 2277939064279216, - 47819006416482019, - 21888242871839275222246405745257275088548364400416034343698167413457512649704, - 38490974471172050, - 21888242871839275222246405745257275088548364400416034343698141298520762701448, - 21888242871839275222246405745257275088548364400416034343698152770456652425968, - 7506906079265064, - 55314351041506259, - 21088797664601925, - 21888242871839275222246405745257275088548364400416034343698198511117795983526, - 2311318057154904, - 21888242871839275222246405745257275088548364400416034343698139836017036205787, - 42211348441669345, - 21888242871839275222246405745257275088548364400416034343698180023416327079247, - 41957630496600803, - 21888242871839275222246405745257275088548364400416034343698184530666438707860, - 53444589232241856, - 66944625499950021, - 39950532798382126, - 21888242871839275222246405745257275088548364400416034343698168478706417119707, - 3164036981571448, - 21888242871839275222246405745257275088548364400416034343698148928329501573537, - 21888242871839275222246405745257275088548364400416034343698158260577455844211, - 21888242871839275222246405745257275088548364400416034343698183685189074402316, - 56453790647109644, - 39235917326991043, - 21888242871839275222246405745257275088548364400416034343698145860311848089387, - 12171453876320549, - 21888242871839275222246405745257275088548364400416034343698161168837457253996, - 21888242871839275222246405745257275088548364400416034343698202594815841464757, - 26390453546816905, - 21888242871839275222246405745257275088548364400416034343698148275148653276031, - 10667589207138882, - 32498151142895687, - 56095870929647702, - 35620820667409881, - 21888242871839275222246405745257275088548364400416034343698159242525735158144, - 21888242871839275222246405745257275088548364400416034343698140015159429823409, - 46527764917925277, - 21894377511739539, - 21888242871839275222246405745257275088548364400416034343698137641072855885023, - 3139698502044170, - 60668152026177424, - 21888242871839275222246405745257275088548364400416034343698156941767998749647, - 21888242871839275222246405745257275088548364400416034343698172639815731524434, - 21888242871839275222246405745257275088548364400416034343698176437994118124400, - 28019769508806302, - 21888242871839275222246405745257275088548364400416034343698145979154748052097, - 21888242871839275222246405745257275088548364400416034343698183246965544922984, - 21888242871839275222246405745257275088548364400416034343698152779126444108622, - 21888242871839275222246405745257275088548364400416034343698162923908800156814, - 21888242871839275222246405745257275088548364400416034343698140746285139189945, - 21888242871839275222246405745257275088548364400416034343698185899680179685419, - 25741287893108781, - 21888242871839275222246405745257275088548364400416034343698137952940907445551, - 46080842732555632, - 67214001180815189, - 21888242871839275222246405745257275088548364400416034343698170058871839659883, - 21888242871839275222246405745257275088548364400416034343698165159226498321596, - 8646599458012660, - 21888242871839275222246405745257275088548364400416034343698138614067272562702, - 21888242871839275222246405745257275088548364400416034343698183353114295399943, - 494273445432212, - 21888242871839275222246405745257275088548364400416034343698138993011558322747, - 68603951797283031, - 21888242871839275222246405745257275088548364400416034343698175537388912587491, - 21888242871839275222246405745257275088548364400416034343698171213118624689735, - 21888242871839275222246405745257275088548364400416034343698153346094071676306, - 64252928386494463, - 21888242871839275222246405745257275088548364400416034343698186230344478263432, - 21888242871839275222246405745257275088548364400416034343698182840933921932674, - 61174753173819659, - 21888242871839275222246405745257275088548364400416034343698152760345892921564, - 21888242871839275222246405745257275088548364400416034343698173801194758345322, - 21888242871839275222246405745257275088548364400416034343698132138260153075534, - 1403011889389708, - 35329269983726048, - 21888242871839275222246405745257275088548364400416034343698190926835308275790, - 21888242871839275222246405745257275088548364400416034343698170851901498408833, - 26763878392723685, - 36850221150436377, - 64846560798664988, - 5010792495710246, - 21888242871839275222246405745257275088548364400416034343698181588833971582876, - 21888242871839275222246405745257275088548364400416034343698180791419987347089, - 28453270032093766, - 21888242871839275222246405745257275088548364400416034343698199647380212117056, - 70321651612879435, - 51103292162722081, - 70652450792485067, - 21888242871839275222246405745257275088548364400416034343698148148772402841105, - 43361047991324291, - 67029965319990230, - 21888242871839275222246405745257275088548364400416034343698167905631061289610, - 35096186781132973, - 1798065899189855, - 21888242871839275222246405745257275088548364400416034343698154066014153551465, - 21888242871839275222246405745257275088548364400416034343698201369083041774851, - 56093903271396067, - 4897857856474803, - 36327899954312546, - 21888242871839275222246405745257275088548364400416034343698191054882878206408, - 21888242871839275222246405745257275088548364400416034343698181357000118144620, - 1568448097960191, - 45177440087561442, - 48094668956186134, - 14571609763239629, - 21888242871839275222246405745257275088548364400416034343698137538616638268533, - 57283365482711787, - 21888242871839275222246405745257275088548364400416034343698162314380482236237, - 54437301660329761, - 33182250111345520, - 8578170620123924, - 21888242871839275222246405745257275088548364400416034343698191430756920032774, - 29923218259620882, - 50379198566927119, - 25718427254136900, - 21888242871839275222246405745257275088548364400416034343698166895130042929269, - 21888242871839275222246405745257275088548364400416034343698176171456265174490, - 55239840081475377, - 62096622805336413, - 56141855947613328, - 40367526051042188, - 21888242871839275222246405745257275088548364400416034343698132813320451788585, - 66147579830152820, - 21888242871839275222246405745257275088548364400416034343698201409352430228416, - 21888242871839275222246405745257275088548364400416034343698191185450239237989, - 7950502323347081, - 638771502338145, - 21888242871839275222246405745257275088548364400416034343698156092761005491370, - 71306294002476280, - 10446594534406308, - 23263335953435475, - 21888242871839275222246405745257275088548364400416034343698191078710560413914, - 34586426647846976, - 21888242871839275222246405745257275088548364400416034343698185435804401372270, - 21888242871839275222246405745257275088548364400416034343698196930713465430701, - 21888242871839275222246405745257275088548364400416034343698163837606534622839, - 1679863569577133, - 10836282746357336, - 14221639999223187, - 21888242871839275222246405745257275088548364400416034343698200594875350475551, - 21888242871839275222246405745257275088548364400416034343698142440430166922604, - 56429957547606123, - 14609581959329669, - 21888242871839275222246405745257275088548364400416034343698185430250015141409, - 21888242871839275222246405745257275088548364400416034343698182759108660197963, - 48752992167973323, - 62522535477125192, - 65417100743048141, - 1958768820539271, - 21888242871839275222246405745257275088548364400416034343698187036256684174006, - 21888242871839275222246405745257275088548364400416034343698161705801510974400, - 38332035016809271, - 50008146147311017, - 33997871691322414, - 5974944610394241, - 41306053672608900, - 64051129027772058, - 21888242871839275222246405745257275088548364400416034343698156614178853780069, - 7135432527845325, - 21888242871839275222246405745257275088548364400416034343698178678239250607396, - 21888242871839275222246405745257275088548364400416034343698203144653068066840, - 68004930210483497, - 21888242871839275222246405745257275088548364400416034343698179865445656693743, - 21888242871839275222246405745257275088548364400416034343698194694199150851613, - 241282463433964, - 51640552344033234, - 18585864408261233, - 16041304373575469, - 44941856974905771, - 29712213707796136, - 21888242871839275222246405745257275088548364400416034343698204182208263291995, - 55032134914120095, - 21888242871839275222246405745257275088548364400416034343698147821019687340986, - 21888242871839275222246405745257275088548364400416034343698136224667184127513, - 21888242871839275222246405745257275088548364400416034343698189120980045405435, - 21888242871839275222246405745257275088548364400416034343698133284304405521940, - 6574058927347199, - 21888242871839275222246405745257275088548364400416034343698149568784206263434, - 27541295717559023, - 21888242871839275222246405745257275088548364400416034343698184985904594724624, - 65801584968323346, - 23746521685630425, - 21888242871839275222246405745257275088548364400416034343698149861788265793053, - 43871625047128679, - 59871083602451484, - 21888242871839275222246405745257275088548364400416034343698164210081140292144, - 25947469806361801, - 46901663480609034, - 68745684291305243, - 21888242871839275222246405745257275088548364400416034343698162006300526032452, - 21888242871839275222246405745257275088548364400416034343698132504590663925802, - 21888242871839275222246405745257275088548364400416034343698162558602537114455, - 21888242871839275222246405745257275088548364400416034343698172438493578128343, - 21888242871839275222246405745257275088548364400416034343698179063041771173207, - 21888242871839275222246405745257275088548364400416034343698168984593793887559, - 52443319247253229, - 21888242871839275222246405745257275088548364400416034343698146806717112748094, - 21888242871839275222246405745257275088548364400416034343698154013102181754852, - 21888242871839275222246405745257275088548364400416034343698172850431262519662, - 54806525710718374, - 21888242871839275222246405745257275088548364400416034343698156645063703092010, - 21888242871839275222246405745257275088548364400416034343698196578618961779428, - 21888242871839275222246405745257275088548364400416034343698171082203409762099, - 12044046568043906, - 21888242871839275222246405745257275088548364400416034343698143963247499470143, - 40664891895866524, - 4206908239824722, - 21888242871839275222246405745257275088548364400416034343698201889306045925293, - 61239688242971705, - 21888242871839275222246405745257275088548364400416034343698147527034784869039, - 58629328089778059, - 51639425259092767, - 21888242871839275222246405745257275088548364400416034343698144685287080911246, - 21888242871839275222246405745257275088548364400416034343698196988478652503358, - 34000387711639689, - 35833954505982464, - 10440397027502873, - 21888242871839275222246405745257275088548364400416034343698196726831442813534, - 3239680104153916, - 21888242871839275222246405745257275088548364400416034343698163631813006315038, - 60438516983022105, - 21888242871839275222246405745257275088548364400416034343698158056519384800486, - 25758628160540069, - 21888242871839275222246405745257275088548364400416034343698154944563410950149, - 21888242871839275222246405745257275088548364400416034343698148379018757092245, - 17446321459450793, - 21888242871839275222246405745257275088548364400416034343698186430741061096695, - 21888242871839275222246405745257275088548364400416034343698195245975914954566, - 21888242871839275222246405745257275088548364400416034343698192627697471681682, - 21888242871839275222246405745257275088548364400416034343698184363273599666847, - 21888242871839275222246405745257275088548364400416034343698199040368486967550, - 21888242871839275222246405745257275088548364400416034343698203182846768741049, - 21888242871839275222246405745257275088548364400416034343698148830974471722081, - 21888242871839275222246405745257275088548364400416034343698158347037940860219, - 21888242871839275222246405745257275088548364400416034343698142992050122764268, - 21888242871839275222246405745257275088548364400416034343698189222753760198966, - 21888242871839275222246405745257275088548364400416034343698147459386044817478, - 21888242871839275222246405745257275088548364400416034343698186994368011856590, - 36732306405612163, - 21888242871839275222246405745257275088548364400416034343698167450102958405824, - 4165870956624526, - 21888242871839275222246405745257275088548364400416034343698169060215353218962, - 34578780181602252, - 21888242871839275222246405745257275088548364400416034343698154893466115341299, - 47891512750629934, - 47992432963344730, - 69615098801093084, - 61222706395431978, - 17597224030507755, - 49905991511123309, - 22896921854080444, - 21888242871839275222246405745257275088548364400416034343698179065845424508488, - 48727860320173170, - 30014125459339815, - 21888242871839275222246405745257275088548364400416034343698137856887558014314, - 21888242871839275222246405745257275088548364400416034343698203552648674167915, - 21888242871839275222246405745257275088548364400416034343698176371715760241536, - 21132727766972345, - 53616518487789334, - 21888242871839275222246405745257275088548364400416034343698170039415734189269, - 42909467277769101, - 21888242871839275222246405745257275088548364400416034343698199624878810248409, - 11495402429440412, - 21888242871839275222246405745257275088548364400416034343698145196589871688074, - 21888242871839275222246405745257275088548364400416034343698179146530647552451, - 21888242871839275222246405745257275088548364400416034343698181238120256474172, - 38221255567636401, - 6993445086936526, - 21888242871839275222246405745257275088548364400416034343698195309761068739723, - 52575188981845297, - 21888242871839275222246405745257275088548364400416034343698172906733300400591, - 21888242871839275222246405745257275088548364400416034343698187186406160180241, - 21888242871839275222246405745257275088548364400416034343698188486347367094055, - 21888242871839275222246405745257275088548364400416034343698191190815038710088, - 21888242871839275222246405745257275088548364400416034343698163742666456356766, - 21888242871839275222246405745257275088548364400416034343698141235122379137244, - 67356685213478972, - 21888242871839275222246405745257275088548364400416034343698181770047928909204, - 21888242871839275222246405745257275088548364400416034343698134677863006259568, - 64123877735504749, - 21888242871839275222246405745257275088548364400416034343698145607067964711133, - 21888242871839275222246405745257275088548364400416034343698133141674768514820, - 21888242871839275222246405745257275088548364400416034343698197533735370279256, - 21888242871839275222246405745257275088548364400416034343698166509624261452665, - 21888242871839275222246405745257275088548364400416034343698157101286594815415, - 14638442404364820, - 71321783708137465, - 21888242871839275222246405745257275088548364400416034343698161023264493855104, - 27752880312049999, - 63529260378980598, - 65778380572368886, - 61890195775880378, - 20383429861498894, - 21888242871839275222246405745257275088548364400416034343698176481110849592148, - 52840715948916880, - 21888242871839275222246405745257275088548364400416034343698171832409808136031, - 21888242871839275222246405745257275088548364400416034343698181562592290510533, - 54210144220668475, - 21888242871839275222246405745257275088548364400416034343698154132346727665588, - 21888242871839275222246405745257275088548364400416034343698169944374510815554, - 21888242871839275222246405745257275088548364400416034343698194599126549887729, - 21888242871839275222246405745257275088548364400416034343698193642216726051095, - 21888242871839275222246405745257275088548364400416034343698183269779253304148, - 21888242871839275222246405745257275088548364400416034343698163064089745079650, - 21888242871839275222246405745257275088548364400416034343698134368279366550003, - 23278207215775661, - 21888242871839275222246405745257275088548364400416034343698192854213347184532, - 21888242871839275222246405745257275088548364400416034343698199356454785085735, - 18246770705860170, - 9663438309601138, - 21888242871839275222246405745257275088548364400416034343698167416149054530202, - 67719446840240191, - 1928329789232835, - 21888242871839275222246405745257275088548364400416034343698134793262415344404, - 56537410882574318, - 21888242871839275222246405745257275088548364400416034343698165756027554052059, - 61869915952024228, - 61736114897104336, - 21888242871839275222246405745257275088548364400416034343698141890993831920959, - 29842721992783141, - 21888242871839275222246405745257275088548364400416034343698137095320065859635, - 14070717213018560, - 21888242871839275222246405745257275088548364400416034343698193401593896825416, - 23513283234498108, - 21888242871839275222246405745257275088548364400416034343698172967006477318765, - 6807402342749015, - 59713658142144161, - 33948477406372328, - 1530565971861232, - 58113001927231784, - 21888242871839275222246405745257275088548364400416034343698157516791511309847, - 7913893161406957, - 21888242871839275222246405745257275088548364400416034343698153904190227629887, - 21888242871839275222246405745257275088548364400416034343698159291221373315971, - 21888242871839275222246405745257275088548364400416034343698148308330153799009, - 22047827384356326, - 15791690185133773, - 62330893878072061, - 21888242871839275222246405745257275088548364400416034343698164893757556574712, - 21888242871839275222246405745257275088548364400416034343698146875615976721877, - 21888242871839275222246405745257275088548364400416034343698189351707571304587, - 21888242871839275222246405745257275088548364400416034343698197445917142961149, - 21888242871839275222246405745257275088548364400416034343698139653567190739182, - 23671026590463433, - 21888242871839275222246405745257275088548364400416034343698154284305469505400, - 21888242871839275222246405745257275088548364400416034343698196441260414965371, - 2472888708920725, - 21888242871839275222246405745257275088548364400416034343698171528395848174119, - 21888242871839275222246405745257275088548364400416034343698196116734421563100, - 21888242871839275222246405745257275088548364400416034343698163845995399791209, - 27495216474794513, - 21888242871839275222246405745257275088548364400416034343698142264648846338559, - 21888242871839275222246405745257275088548364400416034343698173524479374680753, - 17726580866615567, - 21888242871839275222246405745257275088548364400416034343698182642179775535530, - 21888242871839275222246405745257275088548364400416034343698148869812676056440, - 21888242871839275222246405745257275088548364400416034343698171972957022793120, - 50822592676804666, - 21888242871839275222246405745257275088548364400416034343698167536521859372784, - 21888242871839275222246405745257275088548364400416034343698152017910062977592, - 49497546286613094, - 61206061544623254, - 3312113494027867, - 21888242871839275222246405745257275088548364400416034343698162836150057327675, - 45430530121267340, - 21888242871839275222246405745257275088548364400416034343698187357292389880566, - 26848736841430575, - 21888242871839275222246405745257275088548364400416034343698183708048662208935, - 21888242871839275222246405745257275088548364400416034343698139063358667567792, - 41876529003344008, - 21888242871839275222246405745257275088548364400416034343698164853774517987877, - 10619948369249169, - 1538079009299975, - 21888242871839275222246405745257275088548364400416034343698145516978485933498, - 37847196518367480, - 21888242871839275222246405745257275088548364400416034343698140555188686312054, - 21888242871839275222246405745257275088548364400416034343698158735344381881199, - 21888242871839275222246405745257275088548364400416034343698149320751450344384, - 21888242871839275222246405745257275088548364400416034343698198096019799258775, - 65396923548769539, - 20019276105301301, - 3794838029000070, - 21888242871839275222246405745257275088548364400416034343698156024289560314140, - 21888242871839275222246405745257275088548364400416034343698155037659707752751, - 21888242871839275222246405745257275088548364400416034343698134786988568469907, - 21888242871839275222246405745257275088548364400416034343698181533973744939983, - 21888242871839275222246405745257275088548364400416034343698170282985373595779, - 21888242871839275222246405745257275088548364400416034343698145822672009347342, - 54085721159832089, - 21888242871839275222246405745257275088548364400416034343698150728451799165888, - 21888242871839275222246405745257275088548364400416034343698133104796585033184, - 21888242871839275222246405745257275088548364400416034343698158769430415685669, - 21888242871839275222246405745257275088548364400416034343698167486587902682449, - 31129946026026342, - 30574541235037547, - 21888242871839275222246405745257275088548364400416034343698202825544041056770, - 21888242871839275222246405745257275088548364400416034343698181261068594247684, - 21888242871839275222246405745257275088548364400416034343698203241726582057783, - 50380600946586970, - 13301072793730243, - 21888242871839275222246405745257275088548364400416034343698141477213149866454, - 33999837463135092, - 21888242871839275222246405745257275088548364400416034343698198350128455888390, - 21637759710821237, - 43658267268444813, - 21888242871839275222246405745257275088548364400416034343698139135871249831347, - 21888242871839275222246405745257275088548364400416034343698203814032470806641, - 60159936303089926, - 13613328887104339, - 35522080285395194, - 53549190128450238, - 63106991788740202, - 24582247972007149, - 21888242871839275222246405745257275088548364400416034343698135081230896842302, - 21888242871839275222246405745257275088548364400416034343698186427272857608053, - 67652493083531727, - 63361307536084025, - 54712269179583103, - 21888242871839275222246405745257275088548364400416034343698195712379988356253, - 21888242871839275222246405745257275088548364400416034343698174237002596056976, - 21888242871839275222246405745257275088548364400416034343698152288287562805540, - 61497076039317839, - 21888242871839275222246405745257275088548364400416034343698201586258808696241, - 21888242871839275222246405745257275088548364400416034343698202641376864609484, - 21888242871839275222246405745257275088548364400416034343698142779025542742512, - 15099491768483574, - 21888242871839275222246405745257275088548364400416034343698156492222192513408, - 23913619778500722, - 21888242871839275222246405745257275088548364400416034343698197395867691900453, - 21888242871839275222246405745257275088548364400416034343698191714964135857383, - 21888242871839275222246405745257275088548364400416034343698190928173846344656, - 38617698303086214, - 31014026429503803, - 8167611264968069, - 21888242871839275222246405745257275088548364400416034343698192612000694703016, - 21888242871839275222246405745257275088548364400416034343698156335030952352100, - 68394581224590792, - 63243784132384897, - 45260457799250695, - 21888242871839275222246405745257275088548364400416034343698180088058679821125, - 62414600591609870, - 21888242871839275222246405745257275088548364400416034343698152861009195377986, - 21888242871839275222246405745257275088548364400416034343698138518600822070439, - 21888242871839275222246405745257275088548364400416034343698174671117315355495, - 21888242871839275222246405745257275088548364400416034343698198882335082733347, - 71234072095093485, - 59850041604509776, - 21888242871839275222246405745257275088548364400416034343698150968962539775128, - 52282693287236559, - 21888242871839275222246405745257275088548364400416034343698137718806703219131, - 12983498921128449, - 63922153399327606, - 21888242871839275222246405745257275088548364400416034343698190773781476087497, - 48606466383338198, - 39423371172272724, - 64155929367362744, - 30226380888508748, - 21888242871839275222246405745257275088548364400416034343698197409898609605576, - 21888242871839275222246405745257275088548364400416034343698185378243141122423, - 52840446715849550, - 49708999880259827, - 21888242871839275222246405745257275088548364400416034343698154375983098297344, - 21888242871839275222246405745257275088548364400416034343698138856973869027498, - 47898399882641350, - 950436481021136, - 20045020006620366, - 21888242871839275222246405745257275088548364400416034343698139360195062818466, - 21888242871839275222246405745257275088548364400416034343698134192748108435444, - 50316375085333589, - 21888242871839275222246405745257275088548364400416034343698194825088652706636, - 21888242871839275222246405745257275088548364400416034343698149099864840385314, - 8258867069478015, - 21888242871839275222246405745257275088548364400416034343698203885792028624954, - 20694466532879859, - 21888242871839275222246405745257275088548364400416034343698189315295106555162, - 68209078670587221, - 21888242871839275222246405745257275088548364400416034343698177483450279570181, - 21888242871839275222246405745257275088548364400416034343698200683778594453581, - 20083842663837545, - 40115495721889531, - 21888242871839275222246405745257275088548364400416034343698158473478884461138, - 6700941555030420, - 49456739275642286, - 21888242871839275222246405745257275088548364400416034343698160828859313300770, - 38856312254855956, - 21888242871839275222246405745257275088548364400416034343698179556025012679672, - 15687019878380005, - 21888242871839275222246405745257275088548364400416034343698141222514816924331, - 35096380172845643, - 41925412836982703, - 5727312846339596, - 19444726022959857, - 21888242871839275222246405745257275088548364400416034343698187433518701444508, - 64799474179510824, - 65868350957126072, - 51483568541817110, - 17634622437588398, - 40472514615195118, - 14699250743569899, - 13266518884605424, - 28272835122615790, - 21888242871839275222246405745257275088548364400416034343698152809496001990260, - 21888242871839275222246405745257275088548364400416034343698142823794025098930, - 21888242871839275222246405745257275088548364400416034343698133192026696732916, - 66035638182601495, - 55717417259561440, - 23376688710507961, - 35643391869857925, - 66585918950827771, - 63257384460004438, - 21888242871839275222246405745257275088548364400416034343698177377683437687598, - 61265787563218291, - 70281067801887636, - 21888242871839275222246405745257275088548364400416034343698152080789867237557, - 37931961326801834, - 21888242871839275222246405745257275088548364400416034343698150130019792398400, - 21888242871839275222246405745257275088548364400416034343698203138752093711914, - 11947061014011162, - 21888242871839275222246405745257275088548364400416034343698142287483357194345, - 21888242871839275222246405745257275088548364400416034343698148142328189629556, - 21888242871839275222246405745257275088548364400416034343698148593135887877391, - 65997512225738236, - 21888242871839275222246405745257275088548364400416034343698152849618325306628, - 21888242871839275222246405745257275088548364400416034343698201413861354900985, - 21888242871839275222246405745257275088548364400416034343698135671664834383925, - 6524527851945402, - 29250352229881983, - 7782918484703605, - 3571282152744361, - 21888242871839275222246405745257275088548364400416034343698174946707745771111, - 21888242871839275222246405745257275088548364400416034343698147309182681414934, - 2176114666897446, - 21888242871839275222246405745257275088548364400416034343698196047924587113502, - 21888242871839275222246405745257275088548364400416034343698193730952085611001, - 21888242871839275222246405745257275088548364400416034343698170142285408428780, - 6000891113590536, - 21888242871839275222246405745257275088548364400416034343698195034624518264929, - 16590415239890150, - 21888242871839275222246405745257275088548364400416034343698167845035712953247, - 68847189584734300, - 9272388115151030, - 21888242871839275222246405745257275088548364400416034343698182450161225566273, - 45050162391582275, - 26146574091733532, - 13799561196404691, - 21888242871839275222246405745257275088548364400416034343698150087602407389133, - 21888242871839275222246405745257275088548364400416034343698186208858056964276, - 28037381168258593, - 29519661063487923, - 28757432365794501, - 21888242871839275222246405745257275088548364400416034343698135306055216271678, - 21888242871839275222246405745257275088548364400416034343698203887948730897997, - 35007939943357098, - 21888242871839275222246405745257275088548364400416034343698136295821318872625, - 60774427469934277, - 21888242871839275222246405745257275088548364400416034343698182520607636264273, - 34075354504503667, - 21888242871839275222246405745257275088548364400416034343698134630123755673325, - 68424277523962115, - 22610196411070965, - 21888242871839275222246405745257275088548364400416034343698157778623961861193, - 21888242871839275222246405745257275088548364400416034343698173267562340984339, - 8661278099713090, - 49174831646989181, - 21888242871839275222246405745257275088548364400416034343698186330087995293198, - 21888242871839275222246405745257275088548364400416034343698180866097561901360, - 7834753746468228, - 21888242871839275222246405745257275088548364400416034343698156836268604914821, - 21888242871839275222246405745257275088548364400416034343698137964705614755855, - 21888242871839275222246405745257275088548364400416034343698151140001929011621, - 58259534399661962, - 21888242871839275222246405745257275088548364400416034343698182692328854441817, - 34603468850057800, - 62138165483645733, - 63350285922764039, - 21888242871839275222246405745257275088548364400416034343698187759444988915590, - 5378038163132725, - 47540933218699419, - 21888242871839275222246405745257275088548364400416034343698146589636297511539, - 21888242871839275222246405745257275088548364400416034343698145801714342487584, - 21888242871839275222246405745257275088548364400416034343698167524673045056584, - 21888242871839275222246405745257275088548364400416034343698190197932135817097, - 59031613958963288, - 21888242871839275222246405745257275088548364400416034343698149862390420437989, - 61411778634474956, - 21888242871839275222246405745257275088548364400416034343698176153636100796411, - 21836769805589572, - 38665742652212233, - 21888242871839275222246405745257275088548364400416034343698132225397889549199, - 16067453319061723, - 22970671380885847, - 65901925438068038, - 21888242871839275222246405745257275088548364400416034343698159243545340959652, - 21888242871839275222246405745257275088548364400416034343698192917790094646919, - 21888242871839275222246405745257275088548364400416034343698160593719523894292, - 21888242871839275222246405745257275088548364400416034343698157535170296800813, - 34324891988554720, - 23322961515339012, - 28834851315344483, - 33384381195019876, - 21888242871839275222246405745257275088548364400416034343698141957513233997045, - 54085007907049559, - 21888242871839275222246405745257275088548364400416034343698191383764288339534, - 48285419832718530, - 21888242871839275222246405745257275088548364400416034343698141280845784429382, - 58438903061978761, - 21888242871839275222246405745257275088548364400416034343698144546875594594564, - 42060650654407715, - 21888242871839275222246405745257275088548364400416034343698194638132475933369, - 9095795253558437, - 21888242871839275222246405745257275088548364400416034343698178090660616177495, - 21888242871839275222246405745257275088548364400416034343698136412945231046302, - 53509276858600941, - 27443831166521380, - 12495835186109315, - 70978205711553730, - 27338803929138301, - 21888242871839275222246405745257275088548364400416034343698175121835476967381, - 24958425119393979, - 18077916042430437, - 38134384898775930, - 21888242871839275222246405745257275088548364400416034343698167849424891501230, - 21888242871839275222246405745257275088548364400416034343698141723598721308972, - 31672195941443391, - 21888242871839275222246405745257275088548364400416034343698147860183592337281, - 21888242871839275222246405745257275088548364400416034343698184352725203920761, - 51185538617782351, - 21888242871839275222246405745257275088548364400416034343698198771027718340200, - 62787268148088412, - 33901555748690403, - 7088490115552094, - 21888242871839275222246405745257275088548364400416034343698150099725811189307, - 25719679128879462, - 61848329747404923, - 21888242871839275222246405745257275088548364400416034343698186668893763773540, - 21888242871839275222246405745257275088548364400416034343698193990624011914320, - 21888242871839275222246405745257275088548364400416034343698136090440106122766, - 6845094914830998, - 23708175075068196, - 21888242871839275222246405745257275088548364400416034343698189096169029492725, - 66283072163665902, - 11725655939948279, - 71401412895423635, - 21888242871839275222246405745257275088548364400416034343698154299107288503657, - 21888242871839275222246405745257275088548364400416034343698164425256495901318, - 21888242871839275222246405745257275088548364400416034343698198101195596735155, - 21888242871839275222246405745257275088548364400416034343698151472315123823493, - 21888242871839275222246405745257275088548364400416034343698185010148412431926, - 32212741748235370, - 59365451977345243, - 21888242871839275222246405745257275088548364400416034343698135246823840145399, - 26622830604943710, - 21888242871839275222246405745257275088548364400416034343698157897627989945893, - 29825161440585416, - 66617627475322870, - 61958867816266226, - 58187712823941613, - 33372002646484394, - 21888242871839275222246405745257275088548364400416034343698144214727555322521, - 53645122783525554, - 31500414389028384, - 21888242871839275222246405745257275088548364400416034343698153794192012413642, - 71178902905592189, - 21888242871839275222246405745257275088548364400416034343698165152327530950716, - 21888242871839275222246405745257275088548364400416034343698147297681033293801, - 21888242871839275222246405745257275088548364400416034343698145662199780826745, - 21888242871839275222246405745257275088548364400416034343698191359852544472498, - 21888242871839275222246405745257275088548364400416034343698201700893321117736, - 21888242871839275222246405745257275088548364400416034343698169567701436814031, - 21888242871839275222246405745257275088548364400416034343698174306032714644704, - 21888242871839275222246405745257275088548364400416034343698137524630910933730, - 21888242871839275222246405745257275088548364400416034343698154122370310827707, - 21888242871839275222246405745257275088548364400416034343698183506851841883754, - 21888242871839275222246405745257275088548364400416034343698153344715274186420, - 55940596441810481, - 21888242871839275222246405745257275088548364400416034343698158915831772248821, - 21888242871839275222246405745257275088548364400416034343698163132687144571567, - 60261646748961859, - 5425245377179609, - 21888242871839275222246405745257275088548364400416034343698159189244151989600, - 37492909845172588, - 21888242871839275222246405745257275088548364400416034343698135591745332958173, - 21888242871839275222246405745257275088548364400416034343698193752250574119173, - 21888242871839275222246405745257275088548364400416034343698148771887739631723, - 21888242871839275222246405745257275088548364400416034343698172640358910851814, - 21888242871839275222246405745257275088548364400416034343698162323930754308464, - 21888242871839275222246405745257275088548364400416034343698143005053574261210, - 21888242871839275222246405745257275088548364400416034343698169650200319085874, - 21888242871839275222246405745257275088548364400416034343698164764113210347219, - 52003480191711725, - 21888242871839275222246405745257275088548364400416034343698147787510587993065, - 44223685641062990, - 9930597713851024, - 10082794650783250, - 21888242871839275222246405745257275088548364400416034343698184370941195045201, - 63972630604074684, - 46324329537392908, - 50535144352207023, - 59063938923483360, - 65020292051189024, - 59893716146688312, - 2303223875688664, - 56009213717594468, - 21888242871839275222246405745257275088548364400416034343698143784613536093785, - 34244799049064486, - 21888242871839275222246405745257275088548364400416034343698175503439671210045, - 30457297462786639, - 21888242871839275222246405745257275088548364400416034343698139648795121106242, - 21888242871839275222246405745257275088548364400416034343698167307473293744844, - 21888242871839275222246405745257275088548364400416034343698191922995463837346, - 21888242871839275222246405745257275088548364400416034343698162020481638561309, - 18111666789245975, - 41555729167523106, - 21888242871839275222246405745257275088548364400416034343698167858838065947097, - 21888242871839275222246405745257275088548364400416034343698169088866372525007, - 21888242871839275222246405745257275088548364400416034343698164672380231255812, - 27609714036682246, - 21888242871839275222246405745257275088548364400416034343698163727015981041940, - 21888242871839275222246405745257275088548364400416034343698147434831802181218, - 60103898693554430, - 49527140123496451, - 21888242871839275222246405745257275088548364400416034343698172198776267947269, - 3347495591567318, - 21888242871839275222246405745257275088548364400416034343698187232682009161189, - 21888242871839275222246405745257275088548364400416034343698193480008065519983, - 63473288788373093, - 27044745521849859, - 21888242871839275222246405745257275088548364400416034343698189017227428875280, - 21888242871839275222246405745257275088548364400416034343698154312054381364024, - 46318275076038750, - 21888242871839275222246405745257275088548364400416034343698193119979963461753, - 49405604521591465, - 21888242871839275222246405745257275088548364400416034343698136845975929670852, - 21888242871839275222246405745257275088548364400416034343698158061190953928885, - 9751558740113148, - 12080801846826942, - 27841591641402471, - 33329006708875274, - 18756239280262132, - 11909400433823106, - 21888242871839275222246405745257275088548364400416034343698178107572555116517, - 1771117045465151, - 50576410637732834, - 19296860315735903, - 21888242871839275222246405745257275088548364400416034343698174746536991406046, - 21888242871839275222246405745257275088548364400416034343698188759137734753047, - 14547112960982931, - 21888242871839275222246405745257275088548364400416034343698195368591730766486, - 21888242871839275222246405745257275088548364400416034343698153643133840155601, - 59666562243179471, - 21888242871839275222246405745257275088548364400416034343698161404448520308469, - 12491280153213629, - 21888242871839275222246405745257275088548364400416034343698182652268922549445, - 38279885773941179, - 21888242871839275222246405745257275088548364400416034343698173793323065117672, - 3598202519320841, - 25605427625541040, - 45338984683267576, - 21888242871839275222246405745257275088548364400416034343698188263231048182594, - 21888242871839275222246405745257275088548364400416034343698157382479814515267, - 66877716157807690, - 49469594343039811, - 21888242871839275222246405745257275088548364400416034343698192545635103844348, - 21888242871839275222246405745257275088548364400416034343698146117450647654356, - 15500509800908264, - 21888242871839275222246405745257275088548364400416034343698160950333736282326, - 21888242871839275222246405745257275088548364400416034343698168333915896957596, - 21888242871839275222246405745257275088548364400416034343698190284483012094171, - 21888242871839275222246405745257275088548364400416034343698197958974751098891, - 26084272178887190, - 62655959825451499, - 21888242871839275222246405745257275088548364400416034343698159650908418840415, - 21888242871839275222246405745257275088548364400416034343698179606093937321713, - 21888242871839275222246405745257275088548364400416034343698156246450452967092, - 49768766214169994, - 45617228063292630, - 21888242871839275222246405745257275088548364400416034343698184976962941400680, - 39262260232453509, - 21888242871839275222246405745257275088548364400416034343698146944140743567153, - 21888242871839275222246405745257275088548364400416034343698136077625741330016, - 3103469858097345, - 27242823438755182, - 44600357468259803, - 42266882294114971, - 65761523070314556, - 61552840142579784, - 25253797300344939, - 21888242871839275222246405745257275088548364400416034343698148703550388563575, - 11266091482539305, - 21888242871839275222246405745257275088548364400416034343698178740742752374413, - 21888242871839275222246405745257275088548364400416034343698145699062016968565, - 21696439696531370, - 36914203349471560, - 21888242871839275222246405745257275088548364400416034343698149809221140634422, - 57940011584156804, - 21888242871839275222246405745257275088548364400416034343698153638723117757074, - 37976216116352817, - 24336415710602537, - 21888242871839275222246405745257275088548364400416034343698194079099026115852, - 39616461589994394, - 29439125961445560, - 21888242871839275222246405745257275088548364400416034343698184149002792937585, - 68526033704807226, - 21888242871839275222246405745257275088548364400416034343698158950300897380140, - 21888242871839275222246405745257275088548364400416034343698156036210005798738, - 13668774231386803, - 22115805775621650, - 33299568109708745, - 1017319966144916, - 68365674842884146, - 46596579263060225, - 21888242871839275222246405745257275088548364400416034343698195434671334345305, - 21888242871839275222246405745257275088548364400416034343698168078991921871179, - 30404466005955593, - 13100286197893926, - 2067564247673722, - 21888242871839275222246405745257275088548364400416034343698174471917351233893, - 21888242871839275222246405745257275088548364400416034343698175545123501667804, - 21888242871839275222246405745257275088548364400416034343698171134275289639379, - 61555664819428879, - 21888242871839275222246405745257275088548364400416034343698153103804254908292, - 21888242871839275222246405745257275088548364400416034343698181721234123239825, - 21888242871839275222246405745257275088548364400416034343698168262426062798130, - 21888242871839275222246405745257275088548364400416034343698202349680631942640, - 38659458911877947, - 29329452827318845, - 43447571280612113, - 21888242871839275222246405745257275088548364400416034343698169605430192757171, - 48220912246581161, - 21888242871839275222246405745257275088548364400416034343698175956662162183389, - 21888242871839275222246405745257275088548364400416034343698190738537802542676, - 27836965944817889, - 21888242871839275222246405745257275088548364400416034343698156145216179306162, - 72034125757714650, - 47291137890996891, - 21888242871839275222246405745257275088548364400416034343698183071760815380209, - 21888242871839275222246405745257275088548364400416034343698167899039648273059, - 21888242871839275222246405745257275088548364400416034343698177038937038407607, - 32375532895882972, - 54877755868924387, - 60579529199927154, - 21888242871839275222246405745257275088548364400416034343698169866832394459439, - 21888242871839275222246405745257275088548364400416034343698174033379440787237, - 11192408133918114, - 65937975435705897, - 21888242871839275222246405745257275088548364400416034343698171139112513120956, - 21888242871839275222246405745257275088548364400416034343698169485587638550190, - 23493551335691934, - 21888242871839275222246405745257275088548364400416034343698199233096003702670, - 45708277945917471, - 21888242871839275222246405745257275088548364400416034343698199280431914013306, - 60477082417909379, - 21888242871839275222246405745257275088548364400416034343698142502348418255605, - 63990647537152808, - 62830030135680344, - 21888242871839275222246405745257275088548364400416034343698152306110926012344, - 21888242871839275222246405745257275088548364400416034343698139842553429085516, - 21888242871839275222246405745257275088548364400416034343698178079381933555991, - 21888242871839275222246405745257275088548364400416034343698202885024872599982, - 21888242871839275222246405745257275088548364400416034343698187295860362629089, - 16721861038480845, - 21888242871839275222246405745257275088548364400416034343698169745577236523338, - 36783983149606892, - 21888242871839275222246405745257275088548364400416034343698163209706456923505, - 20060370501993762, - 40849372143403506, - 62829396734877122, - 21888242871839275222246405745257275088548364400416034343698148393118846560718, - 53674962162196014, - 21888242871839275222246405745257275088548364400416034343698159350764665394220, - 21888242871839275222246405745257275088548364400416034343698143527333745658070, - 16038498279496871, - 21888242871839275222246405745257275088548364400416034343698173586206236879458, - 29096931084158469, - 5149962097934854, - 21888242871839275222246405745257275088548364400416034343698170676541284659584, - 18259168969583983, - 21888242871839275222246405745257275088548364400416034343698159350776055363049, - 21888242871839275222246405745257275088548364400416034343698137408815067174051, - 10390678733745304, - 21888242871839275222246405745257275088548364400416034343698146580741941551618, - 21888242871839275222246405745257275088548364400416034343698172627316933325913, - 21888242871839275222246405745257275088548364400416034343698148818211100890894, - 21888242871839275222246405745257275088548364400416034343698177995171923181993, - 21888242871839275222246405745257275088548364400416034343698186916307941241880, - 31738691974022295, - 48008920529691176, - 21888242871839275222246405745257275088548364400416034343698201856109612246706, - 21888242871839275222246405745257275088548364400416034343698163583327369307256, - 35090335540555308, - 21888242871839275222246405745257275088548364400416034343698203955027055254818, - 21888242871839275222246405745257275088548364400416034343698132549579801411460, - 21888242871839275222246405745257275088548364400416034343698190981762983134632, - 55335851585859724, - 21888242871839275222246405745257275088548364400416034343698139920428297970281, - 69460514162044511, - 21888242871839275222246405745257275088548364400416034343698198936581787018159, - 21888242871839275222246405745257275088548364400416034343698132823988659833689, - 21888242871839275222246405745257275088548364400416034343698177301884853395234, - 1873184260250924, - 39697121987428193, - 27339850049008107, - 24923700063396484, - 21888242871839275222246405745257275088548364400416034343698172854801740576817, - 21888242871839275222246405745257275088548364400416034343698132472190425486337, - 21888242871839275222246405745257275088548364400416034343698191720309718816073, - 10029017581833326, - 12067604952507806, - 37131080674543633, - 59963826782252388, - 38897899376991594, - 60063569377964873, - 32051158996533362, - 21888242871839275222246405745257275088548364400416034343698148679723155218844, - 21888242871839275222246405745257275088548364400416034343698175581182702145187, - 21888242871839275222246405745257275088548364400416034343698196025464855120185, - 58247043111631886, + 79587825149203014, + 127733820963378979, + 21888242871839275222246405745257275088548364400416034343698111124052518896705, + 21888242871839275222246405745257275088548364400416034343698076220387808069577, + 64221621124755299, + 122842250820227664, + 105247411513514411, + 21888242871839275222246405745257275088548364400416034343698074269748467313951, + 45331624150568725, + 89438365359243984, + 41085306116816658, + 97528692519650830, + 22178690287218679, + 9292423772901623, + 50841432397923277, + 21888242871839275222246405745257275088548364400416034343698084607143232515790, + 115774544630858592, + 21888242871839275222246405745257275088548364400416034343698124134202318561177, + 63672860011015036, + 45428690675306461, + 21888242871839275222246405745257275088548364400416034343698148241576019749334, + 21888242871839275222246405745257275088548364400416034343698071630914611408518, + 21888242871839275222246405745257275088548364400416034343698074939135991516318, + 21888242871839275222246405745257275088548364400416034343698165387199808055845, + 131869545140244077, + 68333667384424381, + 115502746622052304, + 21888242871839275222246405745257275088548364400416034343698165768870034163164, + 21888242871839275222246405745257275088548364400416034343698098363004610736845, + 21888242871839275222246405745257275088548364400416034343698077225898700436225, + 21888242871839275222246405745257275088548364400416034343698203279811261601688, + 21888242871839275222246405745257275088548364400416034343698066120760471992565, + 107336735829114450, + 79281392518246231, + 21888242871839275222246405745257275088548364400416034343698167379421406937594, + 21888242871839275222246405745257275088548364400416034343698123100962755283738, + 57678099614136683, + 21888242871839275222246405745257275088548364400416034343698198363938654598359, + 64454537497448374, + 21888242871839275222246405745257275088548364400416034343698198625345202366993, + 18278049930631782, + 21888242871839275222246405745257275088548364400416034343698202192992474959951, + 110355740008285586, + 24495838047326411, + 21888242871839275222246405745257275088548364400416034343698088111751146894690, + 50235679141733956, + 16779075555965858, + 21888242871839275222246405745257275088548364400416034343698099605390989420991, + 21888242871839275222246405745257275088548364400416034343698139688732153052749, + 76329836527496374, + 21888242871839275222246405745257275088548364400416034343698166846805857997890, + 21888242871839275222246405745257275088548364400416034343698099986559693140825, + 75024053820568938, + 37447119546177809, + 21888242871839275222246405745257275088548364400416034343698100056763550991912, + 91076198685196134, + 21888242871839275222246405745257275088548364400416034343698082795702700540398, + 48539567091101503, + 21888242871839275222246405745257275088548364400416034343698088022005342282431, + 21888242871839275222246405745257275088548364400416034343698163413605976158033, + 21888242871839275222246405745257275088548364400416034343698080360747636788555, + 73726121969827197, + 21888242871839275222246405745257275088548364400416034343698097444150471864247, + 21888242871839275222246405745257275088548364400416034343698144294874175865507, + 21888242871839275222246405745257275088548364400416034343698197571628239937261, + 97360756565205240, + 21888242871839275222246405745257275088548364400416034343698167713834917718079, + 21888242871839275222246405745257275088548364400416034343698106022934900309978, + 21888242871839275222246405745257275088548364400416034343698066807587803507879, + 50851886567713999, + 21888242871839275222246405745257275088548364400416034343698061819000750408969, + 62701969440127279, + 21888242871839275222246405745257275088548364400416034343698155518418194555019, + 82389394322021496, + 21888242871839275222246405745257275088548364400416034343698135835238975335475, + 118781104725409349, + 21888242871839275222246405745257275088548364400416034343698170416019736736770, + 21888242871839275222246405745257275088548364400416034343698137470208363265642, + 138716470620618826, + 36614413819997412, + 21888242871839275222246405745257275088548364400416034343698137956496439570235, + 32603665992156742, + 21888242871839275222246405745257275088548364400416034343698113803342527456473, + 23717534529131801, + 21888242871839275222246405745257275088548364400416034343698167774966328256392, + 21888242871839275222246405745257275088548364400416034343698189624151857661657, + 21888242871839275222246405745257275088548364400416034343698137440650050888036, + 50297149319455508, + 21888242871839275222246405745257275088548364400416034343698163736294258914391, + 21888242871839275222246405745257275088548364400416034343698107726956237804711, + 60011357921970299, + 21888242871839275222246405745257275088548364400416034343698107959192113518351, + 21888242871839275222246405745257275088548364400416034343698167951082272288015, + 21888242871839275222246405745257275088548364400416034343698148928600095953053, + 100078019143590013, + 21888242871839275222246405745257275088548364400416034343698063019398861773015, + 21888242871839275222246405745257275088548364400416034343698094629757740141503, + 21888242871839275222246405745257275088548364400416034343698111883933469192284, + 3336053053510260, + 21888242871839275222246405745257275088548364400416034343698194609805465325039, + 21888242871839275222246405745257275088548364400416034343698100446659014424522, + 21888242871839275222246405745257275088548364400416034343698100929143336185898, + 21888242871839275222246405745257275088548364400416034343698094491974968030438, + 21888242871839275222246405745257275088548364400416034343698095240398567160870, + 21888242871839275222246405745257275088548364400416034343698199635429124318969, + 21888242871839275222246405745257275088548364400416034343698151134713398611889, + 28774810716930546, + 18104183115595279, + 121447870910863771, + 31608734201818535, + 87207773221848558, + 76588694932107093, + 70227355568842559, + 59999599867678351, + 21888242871839275222246405745257275088548364400416034343698133760380986284118, + 51723466190045584, + 114013452260695252, + 27925613021304316, + 9593688889177993, + 21888242871839275222246405745257275088548364400416034343698088847571731116256, + 21888242871839275222246405745257275088548364400416034343698065136826969201336, + 21888242871839275222246405745257275088548364400416034343698196265788847995356, + 21888242871839275222246405745257275088548364400416034343698131315171913674046, + 21212128895364579, + 29619555743800781, + 21888242871839275222246405745257275088548364400416034343698063012929870590093, + 86728553711888944, + 48096440271040516, + 69304375986318912, + 28191245807734702, + 108402961368174867, + 21888242871839275222246405745257275088548364400416034343698068622825946767035, + 21888242871839275222246405745257275088548364400416034343698197530845625278002, + 21888242871839275222246405745257275088548364400416034343698114393574806974126, + 40983496541288098, + 70753660506397812, + 48709234719285433, + 8804430917191975, + 130442763599744092, + 40886096597240373, + 21684041086693089, + 21888242871839275222246405745257275088548364400416034343698083163852299792350, + 314575453101165, + 21888242871839275222246405745257275088548364400416034343698097188743543663726, + 49623196794770542, + 107445001283813612, + 21888242871839275222246405745257275088548364400416034343698187622369958376498, + 21888242871839275222246405745257275088548364400416034343698069320810584154711, + 21888242871839275222246405745257275088548364400416034343698168670471488694128, + 21888242871839275222246405745257275088548364400416034343698100235060616006762, + 21888242871839275222246405745257275088548364400416034343698088263504371592103, + 40116505796765892, + 65139144653856934, + 64535790846876120, + 13863037566648782, + 138594393934498408, + 21888242871839275222246405745257275088548364400416034343698138558539616738624, + 30428680800696160, + 25851128238985245, + 37925607324139583, + 21888242871839275222246405745257275088548364400416034343698197412494895098805, + 21888242871839275222246405745257275088548364400416034343698094882818085973794, + 21972738915770896, + 21888242871839275222246405745257275088548364400416034343698147764002123413613, + 91196454796844734, + 21888242871839275222246405745257275088548364400416034343698090503578525307273, + 21888242871839275222246405745257275088548364400416034343698187545251542961626, + 21888242871839275222246405745257275088548364400416034343698195517763844192846, + 21888242871839275222246405745257275088548364400416034343698090861326859769715, + 33656625639370956, + 21888242871839275222246405745257275088548364400416034343698138130710074654850, + 29777943405451836, + 21888242871839275222246405745257275088548364400416034343698127194773483245201, + 21888242871839275222246405745257275088548364400416034343698169276081804340675, + 21888242871839275222246405745257275088548364400416034343698162911901621604164, + 89186199775376078, + 21888242871839275222246405745257275088548364400416034343698163322890031107858, + 125611104640830224, + 139921352894127852, + 83327985792047380, + 106068122068171995, + 127832978608824329, + 116020222193050686, + 93960743660448960, + 53986679558961119, + 37751047200704622, + 21888242871839275222246405745257275088548364400416034343698108284164238503493, + 21888242871839275222246405745257275088548364400416034343698153902376616831270, + 21888242871839275222246405745257275088548364400416034343698189190180441762265, + 21888242871839275222246405745257275088548364400416034343698106136907305984182, + 21888242871839275222246405745257275088548364400416034343698149113773427110112, + 124752133489837529, + 21888242871839275222246405745257275088548364400416034343698113550298834030972, + 37814073646831569, + 131963533767030094, + 143033843283540670, + 21888242871839275222246405745257275088548364400416034343698190694432668155286, + 20064027595566624, + 10134018647709162, + 54453461447606554, + 102209354879362346, + 21888242871839275222246405745257275088548364400416034343698178890556010366098, + 21888242871839275222246405745257275088548364400416034343698184554280848212357, + 21888242871839275222246405745257275088548364400416034343698102933786070510800, + 21888242871839275222246405745257275088548364400416034343698157599372962012047, + 21888242871839275222246405745257275088548364400416034343698132588599946924030, + 21888242871839275222246405745257275088548364400416034343698202738543886288901, + 3902654420990066, + 21888242871839275222246405745257275088548364400416034343698128199139194626274, + 21888242871839275222246405745257275088548364400416034343698201046939739256277, + 2238928278726722, + 111830078542624857, + 21888242871839275222246405745257275088548364400416034343698075784124151627822, + 21888242871839275222246405745257275088548364400416034343698069997563768093003, + 21888242871839275222246405745257275088548364400416034343698092933788348930837, + 16846556075622853, + 21888242871839275222246405745257275088548364400416034343698146676876989274895, + 92297850312976686, + 21888242871839275222246405745257275088548364400416034343698117383491263315373, + 21888242871839275222246405745257275088548364400416034343698116141762182267004, + 66713274865084164, + 21888242871839275222246405745257275088548364400416034343698148889530789710354, + 123220308166423023, + 21888242871839275222246405745257275088548364400416034343698065192145101650173, + 21888242871839275222246405745257275088548364400416034343698073005282418999913, + 21888242871839275222246405745257275088548364400416034343698179843434331323586, + 135391325485241577, + 21888242871839275222246405745257275088548364400416034343698086909852540456725, + 142452420587949739, + 39766374801582134, + 21888242871839275222246405745257275088548364400416034343698110354166971239914, + 21888242871839275222246405745257275088548364400416034343698088687790660394621, + 21888242871839275222246405745257275088548364400416034343698108368121208282586, + 106056258270515114, + 30966754385401335, + 62904700363190361, + 21888242871839275222246405745257275088548364400416034343698111296309519482765, + 21888242871839275222246405745257275088548364400416034343698122525192758140313, + 21888242871839275222246405745257275088548364400416034343698106031617150096448, + 21888242871839275222246405745257275088548364400416034343698080295755683781073, + 82810980154090010, + 10577409824791192, + 54335916341968980, + 21888242871839275222246405745257275088548364400416034343698122159096290618000, + 48324658587038480, + 21888242871839275222246405745257275088548364400416034343698123947127390907422, + 107202195224455321, + 112540672292188502, + 52278199744145223, + 95359167858626966, + 21888242871839275222246405745257275088548364400416034343698179231569848344553, + 21888242871839275222246405745257275088548364400416034343698137583458655659679, + 21888242871839275222246405745257275088548364400416034343698199752804399446804, + 141859148605131414, + 21888242871839275222246405745257275088548364400416034343698175502838487710330, + 8446476735334487, + 21888242871839275222246405745257275088548364400416034343698164200904877802618, + 89575772153843144, + 69807264163946046, + 21888242871839275222246405745257275088548364400416034343698195534023980824049, + 21888242871839275222246405745257275088548364400416034343698127716408909569772, + 117388875521306082, + 109223602771522389, + 140585052149680731, + 21888242871839275222246405745257275088548364400416034343698134687323066029340, + 21888242871839275222246405745257275088548364400416034343698115762596989916346, + 72370840639883156, + 21888242871839275222246405745257275088548364400416034343698102217481186528763, + 21888242871839275222246405745257275088548364400416034343698087413452226011595, + 44651970049059166, + 86092397938912856, + 21888242871839275222246405745257275088548364400416034343698064890841110737101, + 21888242871839275222246405745257275088548364400416034343698098845212565220826, + 142076999113251193, + 21888242871839275222246405745257275088548364400416034343698079854908213644279, + 47255861857890953, + 130832237063179334, + 71839448392474246, + 140843043631187682, + 21888242871839275222246405745257275088548364400416034343698118210074529751048, + 21888242871839275222246405745257275088548364400416034343698064814375400785198, + 121119337436541295, + 100026119617007943, + 95148032317387311, + 21888242871839275222246405745257275088548364400416034343698068645074145343300, + 21888242871839275222246405745257275088548364400416034343698183361621685801650, + 21888242871839275222246405745257275088548364400416034343698124538494825006578, + 21888242871839275222246405745257275088548364400416034343698175492891059834799, + 116885978052027209, + 21888242871839275222246405745257275088548364400416034343698138305594318184241, + 21888242871839275222246405745257275088548364400416034343698108175415453446053, + 55853962998554052, + 21888242871839275222246405745257275088548364400416034343698118073930712792636, + 21888242871839275222246405745257275088548364400416034343698157245876969298461, + 21888242871839275222246405745257275088548364400416034343698160924453234737154, + 25668296143336976, + 21888242871839275222246405745257275088548364400416034343698164439281331140672, + 34312102746914031, + 24241017423732753, + 392820963920793, + 21888242871839275222246405745257275088548364400416034343698127783784395411153, + 121375977116772435, + 101060632853574179, + 38482481584373935, + 21888242871839275222246405745257275088548364400416034343698074293261289263482, + 21888242871839275222246405745257275088548364400416034343698172578975947569061, + 30458453452444432, + 21888242871839275222246405745257275088548364400416034343698132669742620432510, + 21888242871839275222246405745257275088548364400416034343698097756435306213801, + 15580855797500708, + 69895635988792975, + 121874129095810832, + 45188897882418591, + 21888242871839275222246405745257275088548364400416034343698192396341510600646, + 100037233679055050, + 21888242871839275222246405745257275088548364400416034343698080759170668970920, + 21888242871839275222246405745257275088548364400416034343698135794432941419874, + 21888242871839275222246405745257275088548364400416034343698126125262963457265, + 105708001663016058, + 21888242871839275222246405745257275088548364400416034343698146275701071494191, + 21888242871839275222246405745257275088548364400416034343698150007142100617731, + 21888242871839275222246405745257275088548364400416034343698083576051529479211, + 140178484506400227, + 99511031423172024, + 90369045839073495, + 21888242871839275222246405745257275088548364400416034343698084475312988107394, + 95501415138588862, + 21888242871839275222246405745257275088548364400416034343698182180650673012114, + 21888242871839275222246405745257275088548364400416034343698113593186038704960, + 21888242871839275222246405745257275088548364400416034343698075959926787561833, + 125202634241663318, + 21888242871839275222246405745257275088548364400416034343698085992008357253449, + 126590857302956638, + 15001602816150476, + 12769505792126119, + 21888242871839275222246405745257275088548364400416034343698067864221496847181, + 21888242871839275222246405745257275088548364400416034343698177689087876168551, + 88576768621686670, + 21888242871839275222246405745257275088548364400416034343698143519704353940524, + 21888242871839275222246405745257275088548364400416034343698161715261996971891, + 138812408946764235, + 72745954436690060, + 21888242871839275222246405745257275088548364400416034343698189308578284260840, + 21888242871839275222246405745257275088548364400416034343698162394681295878293, + 21888242871839275222246405745257275088548364400416034343698163926771034710717, + 120798391649030569, + 21888242871839275222246405745257275088548364400416034343698130009362532233852, + 83363596588288788, + 24114205551811528, + 125363880865803198, + 92336275674213595, + 21888242871839275222246405745257275088548364400416034343698204075473968564726, + 21888242871839275222246405745257275088548364400416034343698109658860563302096, + 36233671865838443, + 70744030324348933, + 21888242871839275222246405745257275088548364400416034343698200524894727973943, + 20296480660172254, + 34721254745471234, + 21888242871839275222246405745257275088548364400416034343698087673300915194992, + 139953136070012163, + 31479111093340341, + 21888242871839275222246405745257275088548364400416034343698089246158342801476, + 31478674713037769, + 21888242871839275222246405745257275088548364400416034343698147952506434949831, + 26889553233615394, + 21888242871839275222246405745257275088548364400416034343698112769377756148054, + 21888242871839275222246405745257275088548364400416034343698135221495439034065, + 21888242871839275222246405745257275088548364400416034343698183693165914663488, + 72868331297108001, + 49658766014972672, + 21888242871839275222246405745257275088548364400416034343698138624297737686382, + 72664299925118015, + 32004769777762736, + 107442771567251364, + 57252456065702394, + 21888242871839275222246405745257275088548364400416034343698175228311235088353, + 21888242871839275222246405745257275088548364400416034343698128180500199261362, + 21888242871839275222246405745257275088548364400416034343698122788291947468166, + 73318315150645879, + 128567678780218404, + 21888242871839275222246405745257275088548364400416034343698083126164672973696, + 115408192969811989, + 111776642388671119, + 21888242871839275222246405745257275088548364400416034343698087804136757996332, + 45950006135806238, + 58071885162452889, + 64926560260675797, + 99868333725361127, + 21888242871839275222246405745257275088548364400416034343698147470326413364471, + 21888242871839275222246405745257275088548364400416034343698095299299614598983, + 21888242871839275222246405745257275088548364400416034343698190087416252467416, + 21888242871839275222246405745257275088548364400416034343698158806224738644505, + 21888242871839275222246405745257275088548364400416034343698170822172569290239, + 21888242871839275222246405745257275088548364400416034343698128664580432186102, + 21888242871839275222246405745257275088548364400416034343698066871850838113554, + 50015410132430349, + 119574887964563835, + 21888242871839275222246405745257275088548364400416034343698191327102794033909, + 90400492261684092, + 21888242871839275222246405745257275088548364400416034343698064738702604590237, + 21888242871839275222246405745257275088548364400416034343698103636575919909705, + 21888242871839275222246405745257275088548364400416034343698142282210636454454, + 138569695877379313, + 21888242871839275222246405745257275088548364400416034343698138381302232373399, + 21888242871839275222246405745257275088548364400416034343698123050837565304585, + 38597270056885855, + 18726033144459352, + 21888242871839275222246405745257275088548364400416034343698089339021561075600, + 21888242871839275222246405745257275088548364400416034343698120382477192077968, + 21888242871839275222246405745257275088548364400416034343698108518688641858892, + 21888242871839275222246405745257275088548364400416034343698186728263983183579, + 78764503097312054, + 55370957615200701, + 33854917944769682, + 25222773225875618, + 21888242871839275222246405745257275088548364400416034343698170800933253220273, + 21888242871839275222246405745257275088548364400416034343698102014644975622609, + 9270533306192377, + 21888242871839275222246405745257275088548364400416034343698166324523872889863, + 93748644497422775, + 21888242871839275222246405745257275088548364400416034343698194828237805225530, + 21888242871839275222246405745257275088548364400416034343698083753716683925565, + 21888242871839275222246405745257275088548364400416034343698166767665227562380, + 63722259761025840, + 126208878870639958, + 21888242871839275222246405745257275088548364400416034343698070432108694310235, + 21888242871839275222246405745257275088548364400416034343698165854555385946479, + 124762189287471211, + 59526039290399956, + 62334458707715150, + 124757739725237704, + 75119146064728976, + 21888242871839275222246405745257275088548364400416034343698118048087627966312, + 40827795021067424, + 44408030106641335, + 21888242871839275222246405745257275088548364400416034343698178158208962359626, + 21888242871839275222246405745257275088548364400416034343698121794679990949973, + 50139564223429175, + 23770595645251351, + 87992497212725148, + 21888242871839275222246405745257275088548364400416034343698192740628581150302, + 39717115719474403, + 46163384366374830, + 64862641037245960, + 88622725088109904, + 21888242871839275222246405745257275088548364400416034343698080774921760152991, + 46753294101403, + 98864570656330976, + 34789314415990948, + 21888242871839275222246405745257275088548364400416034343698114620265891520013, + 130015431402497726, + 114719981597105237, + 21888242871839275222246405745257275088548364400416034343698103854085345142983, + 21888242871839275222246405745257275088548364400416034343698080988118164601336, + 21888242871839275222246405745257275088548364400416034343698093298233944486832, + 73689179876272524, + 21888242871839275222246405745257275088548364400416034343698080294315532278067, + 21888242871839275222246405745257275088548364400416034343698177384599910083964, + 132156971012220580, + 21888242871839275222246405745257275088548364400416034343698176377823636275310, + 21888242871839275222246405745257275088548364400416034343698155638783474498230, + 44881299586506948, + 21888242871839275222246405745257275088548364400416034343698095736007422227117, + 21888242871839275222246405745257275088548364400416034343698119118165124347967, + 28464329753836257, + 41328250568886997, + 75556800849148388, + 120640060139401593, + 15133338275706353, + 116770626023849115, + 21888242871839275222246405745257275088548364400416034343698119728710594506708, + 67672913270990063, + 104289909638780531, + 21888242871839275222246405745257275088548364400416034343698148525146460914699, + 132770139710924080, + 84780796004740250, + 96321845652246145, + 21888242871839275222246405745257275088548364400416034343698095232834710242884, + 21888242871839275222246405745257275088548364400416034343698075054982491399455, + 21888242871839275222246405745257275088548364400416034343698189476371484043008, + 21888242871839275222246405745257275088548364400416034343698155725621705021687, + 101000607893039523, + 21888242871839275222246405745257275088548364400416034343698074504015240604409, + 21888242871839275222246405745257275088548364400416034343698146233004186686270, + 138472393644700550, + 21888242871839275222246405745257275088548364400416034343698169378456950465810, + 21888242871839275222246405745257275088548364400416034343698200989462935759188, + 19261903434085356, + 77259608535295901, + 118225521578452445, + 131529706233447814, + 73469814493149255, + 21888242871839275222246405745257275088548364400416034343698092417675353848612, + 21888242871839275222246405745257275088548364400416034343698156430941956072955, + 21888242871839275222246405745257275088548364400416034343698067303485313599725, + 9589545373665012, + 21888242871839275222246405745257275088548364400416034343698188651048416528262, + 21888242871839275222246405745257275088548364400416034343698129209679866208648, + 12053465603060619, + 43572948345532780, + 21888242871839275222246405745257275088548364400416034343698161568341327699251, + 21888242871839275222246405745257275088548364400416034343698193731943516281929, + 37078045687364692, + 24298616081455370, + 138592098236887192, + 21888242871839275222246405745257275088548364400416034343698108805341580605281, + 21888242871839275222246405745257275088548364400416034343698101148708267034692, + 98713152549229686, + 21888242871839275222246405745257275088548364400416034343698125782864172159535, + 124983467655482903, + 21888242871839275222246405745257275088548364400416034343698154250590102939241, + 21888242871839275222246405745257275088548364400416034343698173366712978751117, + 21888242871839275222246405745257275088548364400416034343698104209127231547387, + 57053896364719582, + 138255627830605673, + 21888242871839275222246405745257275088548364400416034343698079047190910718200, + 21888242871839275222246405745257275088548364400416034343698121696088803013698, + 49470826187697823, + 108217034576500559, + 96136958254048092, + 73876356195581362, + 101402427401677253, + 87953777623728216, + 133943019349237357, + 21888242871839275222246405745257275088548364400416034343698109430195626490460, + 47472341072630933, + 4394429551113586, + 21888242871839275222246405745257275088548364400416034343698159553661409682756, + 17122735801014275, + 21888242871839275222246405745257275088548364400416034343698073378036780424789, + 21888242871839275222246405745257275088548364400416034343698147970462546610604, + 116918854073822437, + 67766365915546208, + 114034367102963977, + 9902930096381808, + 33505777221884046, + 1353124475856219, + 49632268383928868, + 21888242871839275222246405745257275088548364400416034343698072018175681672629, + 15973397517341269, + 41499430567084539, + 57883545622837668, + 21888242871839275222246405745257275088548364400416034343698071551243759492504, + 81607927675577648, + 21888242871839275222246405745257275088548364400416034343698160843511260429661, + 21888242871839275222246405745257275088548364400416034343698112104344161253653, + 21888242871839275222246405745257275088548364400416034343698160359327169153533, + 21888242871839275222246405745257275088548364400416034343698077072808381492724, + 24771108807079816, + 21888242871839275222246405745257275088548364400416034343698162598333547663082, + 21888242871839275222246405745257275088548364400416034343698162485309929720967, + 46562988971224695, + 21888242871839275222246405745257275088548364400416034343698094947159078774089, + 21888242871839275222246405745257275088548364400416034343698193497207296404084, + 21888242871839275222246405745257275088548364400416034343698178800138317236337, + 21888242871839275222246405745257275088548364400416034343698068758959630253716, + 13850773002575324, + 21888242871839275222246405745257275088548364400416034343698139286818386149174, + 21888242871839275222246405745257275088548364400416034343698069090762674675580, + 21888242871839275222246405745257275088548364400416034343698072071084796228431, + 21888242871839275222246405745257275088548364400416034343698173781236520822782, + 21888242871839275222246405745257275088548364400416034343698178361748474534002, + 21888242871839275222246405745257275088548364400416034343698108645308872129422, + 60319419651791105, + 57757511599356282, + 46813166644261594, + 136466086516988407, + 49430686687906912, + 21888242871839275222246405745257275088548364400416034343698065614286646747139, + 21888242871839275222246405745257275088548364400416034343698166317850421779164, + 21888242871839275222246405745257275088548364400416034343698174326621284948406, + 21888242871839275222246405745257275088548364400416034343698200876229146555596, + 21888242871839275222246405745257275088548364400416034343698094841575401693529, + 140302305032631609, + 21888242871839275222246405745257275088548364400416034343698187687159408448181, + 21888242871839275222246405745257275088548364400416034343698081487240688535111, + 99685287657608154, + 70837806844164444, + 21888242871839275222246405745257275088548364400416034343698084533772967862741, + 21888242871839275222246405745257275088548364400416034343698147967626404993034, + 21888242871839275222246405745257275088548364400416034343698112272683525527070, + 111004482894950401, + 21888242871839275222246405745257275088548364400416034343698116213829801953937, + 109804913874537348, + 53120763294282088, + 21888242871839275222246405745257275088548364400416034343698103856542421934571, + 21888242871839275222246405745257275088548364400416034343698072242660312694999, + 4032869010736600, + 21888242871839275222246405745257275088548364400416034343698202518699200328952, + 21888242871839275222246405745257275088548364400416034343698113997558992829186, + 21888242871839275222246405745257275088548364400416034343698179522081101435203, + 21888242871839275222246405745257275088548364400416034343698157195063316845194, + 15784815754143865, + 82403384399575717, + 21888242871839275222246405745257275088548364400416034343698107639153639315801, + 73719791912855431, + 21888242871839275222246405745257275088548364400416034343698101080208165432441, + 21888242871839275222246405745257275088548364400416034343698073450210798312242, + 21888242871839275222246405745257275088548364400416034343698142739543218195622, + 133830246813133554, + 73383315223353550, + 21888242871839275222246405745257275088548364400416034343698179777200277693372, + 67757930382286408, + 21888242871839275222246405745257275088548364400416034343698123971038482686489, + 23662446021246541, + 140042479036467802, + 21888242871839275222246405745257275088548364400416034343698176981424824022412, + 21888242871839275222246405745257275088548364400416034343698181366108167478211, + 21888242871839275222246405745257275088548364400416034343698094184889065299270, + 21888242871839275222246405745257275088548364400416034343698068552835321499243, + 35544062374615761, + 139072589999458383, + 21888242871839275222246405745257275088548364400416034343698174112688360036433, + 54909198883283982, + 31897759816048921, + 65297262125514671, + 21888242871839275222246405745257275088548364400416034343698121338846882551792, + 22787668455202634, + 21888242871839275222246405745257275088548364400416034343698069455731474650870, + 121535532342796925, + 21888242871839275222246405745257275088548364400416034343698064530523897091075, + 24539886813582099, + 21888242871839275222246405745257275088548364400416034343698113575923467816592, + 21888242871839275222246405745257275088548364400416034343698092223715439298484, + 142167603544128006, + 32205192364129617, + 21888242871839275222246405745257275088548364400416034343698070812537758690334, + 21888242871839275222246405745257275088548364400416034343698095745328064854434, + 103136393654333679, + 21888242871839275222246405745257275088548364400416034343698062974698516533212, + 26747244139879477, + 21888242871839275222246405745257275088548364400416034343698090856246411285063, + 21888242871839275222246405745257275088548364400416034343698074791783669216571, + 84645767257628749, + 105815132328608018, + 40924934533838691, + 21888242871839275222246405745257275088548364400416034343698175084588408918244, + 83237362784664488, + 21888242871839275222246405745257275088548364400416034343698073285676776396896, + 46990338727003342, + 21888242871839275222246405745257275088548364400416034343698129495795886716789, + 6679475983542584, + 21888242871839275222246405745257275088548364400416034343698119143186905144530, + 40830051893080285, + 21888242871839275222246405745257275088548364400416034343698134916962950144734, + 21888242871839275222246405745257275088548364400416034343698162006351781055776, + 21888242871839275222246405745257275088548364400416034343698074002736083415265, + 47619344051508857, + 14182507005360594, + 21888242871839275222246405745257275088548364400416034343698118770273334125474, + 21888242871839275222246405745257275088548364400416034343698165306207356694754, + 21888242871839275222246405745257275088548364400416034343698116022450864240089, + 79678945517615516, + 21888242871839275222246405745257275088548364400416034343698150896157416474889, + 101851238700048949, + 21888242871839275222246405745257275088548364400416034343698101305968738987702, + 74118318292909244, + 38790335673857237, + 21888242871839275222246405745257275088548364400416034343698091462898251262065, + 3265221975299133, + 36662021464644970, + 106462238520882599, + 21888242871839275222246405745257275088548364400416034343698152368995694659298, + 18329539592229263, + 21888242871839275222246405745257275088548364400416034343698177464386298069146, + 132936590349127384, + 57775693128281763, + 21888242871839275222246405745257275088548364400416034343698145663727355090266, + 21888242871839275222246405745257275088548364400416034343698162410577176099743, + 21888242871839275222246405745257275088548364400416034343698082412380729476152, + 21888242871839275222246405745257275088548364400416034343698085045626421547914, + 21888242871839275222246405745257275088548364400416034343698182119576535602934, + 21888242871839275222246405745257275088548364400416034343698106634498829665071, + 21888242871839275222246405745257275088548364400416034343698072941712841971396, + 21888242871839275222246405745257275088548364400416034343698065431611008638444, + 21888242871839275222246405745257275088548364400416034343698062196750412660196, + 21888242871839275222246405745257275088548364400416034343698065082032698211619, + 115842233784848990, + 140137509839513304, + 21888242871839275222246405745257275088548364400416034343698099384848929301927, + 21888242871839275222246405745257275088548364400416034343698082086118108272522, + 21888242871839275222246405745257275088548364400416034343698163835879501107032, + 21888242871839275222246405745257275088548364400416034343698100458843805657547, + 21888242871839275222246405745257275088548364400416034343698144065283210985098, + 22174559050898243, + 40691025234584023, + 21888242871839275222246405745257275088548364400416034343698160566672653405101, + 21888242871839275222246405745257275088548364400416034343698123929083205267635, + 21888242871839275222246405745257275088548364400416034343698084108261558703767, + 47420463939533301, + 21888242871839275222246405745257275088548364400416034343698115409859503299496, + 21888242871839275222246405745257275088548364400416034343698080793516001297765, + 21888242871839275222246405745257275088548364400416034343698114869384062664185, + 21888242871839275222246405745257275088548364400416034343698179968250488917130, + 21888242871839275222246405745257275088548364400416034343698092625352905575919, + 21888242871839275222246405745257275088548364400416034343698169244035478076511, + 21888242871839275222246405745257275088548364400416034343698110468458176710850, + 21888242871839275222246405745257275088548364400416034343698154908054944016546, + 89917257276672824, + 8363007168364563, + 127236125871812167, + 21888242871839275222246405745257275088548364400416034343698165162930705627746, + 21888242871839275222246405745257275088548364400416034343698103907012026529725, + 21888242871839275222246405745257275088548364400416034343698130610802890432353, + 123429212888820747, + 21888242871839275222246405745257275088548364400416034343698175869286419913855, + 21888242871839275222246405745257275088548364400416034343698069332300429673230, + 135321988255278420, + 21888242871839275222246405745257275088548364400416034343698073073276771105880, + 21888242871839275222246405745257275088548364400416034343698147989330707878147, + 21888242871839275222246405745257275088548364400416034343698091190186038028712, + 117642695950073087, + 21888242871839275222246405745257275088548364400416034343698138601939570768432, + 21888242871839275222246405745257275088548364400416034343698164588025875339027, + 84057776371506326, + 21888242871839275222246405745257275088548364400416034343698084833007149960567, + 21888242871839275222246405745257275088548364400416034343698106670458575114043, + 44817782458829937, + 123269213338137861, + 21888242871839275222246405745257275088548364400416034343698123194418395413447, + 21888242871839275222246405745257275088548364400416034343698192177756619789637, + 21888242871839275222246405745257275088548364400416034343698173251178623461272, + 111284374634573930, + 21888242871839275222246405745257275088548364400416034343698175652730454773192, + 21888242871839275222246405745257275088548364400416034343698085359646713150309, + 78393550457902083, + 124817670301989707, + 21888242871839275222246405745257275088548364400416034343698121361014868054254, + 21888242871839275222246405745257275088548364400416034343698199301555146021347, + 21888242871839275222246405745257275088548364400416034343698109076002225580439, + 21888242871839275222246405745257275088548364400416034343698062335394222491960, + 45707779649157456, + 68480112074132466, + 98439840777145945, + 21888242871839275222246405745257275088548364400416034343698060508683842190321, + 14490461502379963, + 21888242871839275222246405745257275088548364400416034343698067544566248699964, + 21888242871839275222246405745257275088548364400416034343698080949149806763618, + 21888242871839275222246405745257275088548364400416034343698088512229973057618, + 21888242871839275222246405745257275088548364400416034343698176811129460245550, + 56122992337553847, + 21888242871839275222246405745257275088548364400416034343698083065166859867185, + 21888242871839275222246405745257275088548364400416034343698157197448801660132, + 21888242871839275222246405745257275088548364400416034343698077123651750005476, + 21888242871839275222246405745257275088548364400416034343698069115605190073828, + 25136708103713138, + 21888242871839275222246405745257275088548364400416034343698088193355946751219, + 61485058443549130, + 142278054615583998, + 21888242871839275222246405745257275088548364400416034343698164486347982299589, + 21888242871839275222246405745257275088548364400416034343698146877752851289258, + 21888242871839275222246405745257275088548364400416034343698165071019590067502, + 128710078984425407, + 10061189473569996, + 107075635229782571, + 103986808132978922, + 7642502594765887, + 139948876265867532, + 33387396142084007, + 29599411155124710, + 1295123882198340, + 41064449974324787, + 66355591693981022, + 21888242871839275222246405745257275088548364400416034343698089508786602377292, + 21888242871839275222246405745257275088548364400416034343698182777269756599115, + 126315616999254022, + 21888242871839275222246405745257275088548364400416034343698078879726014224767, + 58062959317843952, + 21888242871839275222246405745257275088548364400416034343698131991754676666404, + 24647002410137079, + 21888242871839275222246405745257275088548364400416034343698190748348236252048, + 134983633859688433, + 79003174938263352, + 24604308442482630, + 42863889191165455, + 73521669435051923, + 21888242871839275222246405745257275088548364400416034343698090104470675925597, + 21888242871839275222246405745257275088548364400416034343698092828484108357513, + 95875464451126608, + 91558144363298680, + 2419764533884026, + 21888242871839275222246405745257275088548364400416034343698136891223338260915, + 56908712929490068, + 21888242871839275222246405745257275088548364400416034343698091732872766060161, + 29028242103916862, + 62021590217301824, + 101256045539994256, + 21888242871839275222246405745257275088548364400416034343698129588280247490113, + 132572161124950815, + 58808229277841576, + 21888242871839275222246405745257275088548364400416034343698197909368476217753, + 102064477489174949, + 21888242871839275222246405745257275088548364400416034343698128464123801409522, + 11497128197919496, + 21888242871839275222246405745257275088548364400416034343698134170715242506006, + 2252337049348886, + 13228796410426069, + 21888242871839275222246405745257275088548364400416034343698156384281861268635, + 25081717612675730, + 21888242871839275222246405745257275088548364400416034343698061089709784258680, + 54192642239916749, + 21888242871839275222246405745257275088548364400416034343698147277502162773376, + 36563532957240902, + 21888242871839275222246405745257275088548364400416034343698157143873385311782, + 86120347113360604, + 21888242871839275222246405745257275088548364400416034343698124077462788857903, + 21888242871839275222246405745257275088548364400416034343698181177150988729813, + 14148540712200935, + 17615133970041008, + 85885736586069594, + 75784530291447410, + 21888242871839275222246405745257275088548364400416034343698095997140652992249, + 21888242871839275222246405745257275088548364400416034343698195013744472755044, + 41818942220210775, + 21888242871839275222246405745257275088548364400416034343698166310138083802022, + 42801373586655674, + 19087409531832648, + 21888242871839275222246405745257275088548364400416034343698080792139062543043, + 21888242871839275222246405745257275088548364400416034343698181505268906261263, + 92355657384389985, + 101954938854125153, + 65584635571981606, + 10918420363812931, + 21888242871839275222246405745257275088548364400416034343698093663554684734220, + 113678250200485744, + 21888242871839275222246405745257275088548364400416034343698097211930662053556, + 21888242871839275222246405745257275088548364400416034343698149097924817350470, + 21888242871839275222246405745257275088548364400416034343698191229962496902237, + 86890380428201772, + 33029059838136463, + 32668015931205502, + 47608179094205950, + 81319055889832540, + 21888242871839275222246405745257275088548364400416034343698118697353891206352, + 21888242871839275222246405745257275088548364400416034343698192934631528441249, + 21888242871839275222246405745257275088548364400416034343698138580578493175055, + 130775348534993912, + 21888242871839275222246405745257275088548364400416034343698153109945679406546, + 124230012549383412, + 21888242871839275222246405745257275088548364400416034343698159823471745457921, + 21888242871839275222246405745257275088548364400416034343698066472976527098193, + 71220932745454977, + 21888242871839275222246405745257275088548364400416034343698062332154452132660, + 6653467777985231, + 21888242871839275222246405745257275088548364400416034343698132514177623214155, + 81700688823798230, + 120928344097583186, + 21888242871839275222246405745257275088548364400416034343698140893057813078937, + 102854701721043661, + 21888242871839275222246405745257275088548364400416034343698162082206167898958, + 76245834761317512, + 72009332116874240, + 21888242871839275222246405745257275088548364400416034343698143103602978789201, + 74376470234383246, + 135192778958741048, + 134238397440951849, + 21888242871839275222246405745257275088548364400416034343698192749283717751176, + 129434634668212717, + 86735728448937927, + 21888242871839275222246405745257275088548364400416034343698148490244775504352, + 63016138832065807, + 21888242871839275222246405745257275088548364400416034343698198242439789580539, + 45307132959423535, + 102704527447026873, + 21888242871839275222246405745257275088548364400416034343698095779454791304895, + 38026507716173720, + 21888242871839275222246405745257275088548364400416034343698193597719115864291, + 6082095312345807, + 34597808868850233, + 121005184673163614, + 56979606765119338, + 21888242871839275222246405745257275088548364400416034343698165632789337465852, + 21888242871839275222246405745257275088548364400416034343698165475375398562628, + 136704067054798324, + 67867429438631933, + 21888242871839275222246405745257275088548364400416034343698075204553501330149, + 35922665252558356, + 21888242871839275222246405745257275088548364400416034343698090607662226749947, + 34186999280841622, + 21888242871839275222246405745257275088548364400416034343698143348275223117107, + 113119587699819429, + 21888242871839275222246405745257275088548364400416034343698140797678994238474, + 109393465995948353, + 21888242871839275222246405745257275088548364400416034343698141020087394229525, + 21888242871839275222246405745257275088548364400416034343698093720038810502168, + 98848686266581481, + 21888242871839275222246405745257275088548364400416034343698197671496606403706, + 133162755454255848, + 73240951017424927, + 106013486706341176, + 24609521400163096, + 21888242871839275222246405745257275088548364400416034343698183887658652331476, + 21888242871839275222246405745257275088548364400416034343698089700213877084346, + 68880486953595735, + 21888242871839275222246405745257275088548364400416034343698169478805746736373, + 108783905856689579, + 309322605725655, + 80373037869917381, + 17755097757618533, + 118404403119263762, + 21888242871839275222246405745257275088548364400416034343698102531107748104320, + 64895959004309555, + 21888242871839275222246405745257275088548364400416034343698169383127584914601, + 21888242871839275222246405745257275088548364400416034343698198362782802420707, + 21888242871839275222246405745257275088548364400416034343698080259451545807284, + 62835245149849849, + 104200317157218579, + 21888242871839275222246405745257275088548364400416034343698070514491449997304, + 57554734281595480, + 21888242871839275222246405745257275088548364400416034343698132092262055965823, + 51813327490659899, + 134100554885627949, + 34816544551966906, + 99698961938197210, + 84739001134495481, + 21888242871839275222246405745257275088548364400416034343698081161627915843413, + 36810129573227649, + 134206651251307654, + 71997029665373377, + 140021757467377740, + 21888242871839275222246405745257275088548364400416034343698172572564885649269, + 68171312088131802, + 21888242871839275222246405745257275088548364400416034343698125327705510555111, + 21888242871839275222246405745257275088548364400416034343698168426788261604941, + 10426024123146313, + 59932353628510074, + 21888242871839275222246405745257275088548364400416034343698136358722231026465, + 21888242871839275222246405745257275088548364400416034343698130616716131876233, + 21888242871839275222246405745257275088548364400416034343698090830391355719291, + 129127989944688797, + 21888242871839275222246405745257275088548364400416034343698160308127230090000, + 5963656873438107, + 21888242871839275222246405745257275088548364400416034343698175945911550785066, + 121489831973532565, + 21888242871839275222246405745257275088548364400416034343698157020045300982672, + 107616904843409651, + 21888242871839275222246405745257275088548364400416034343698164168535915424941, + 133265922426908988, + 21888242871839275222246405745257275088548364400416034343698103765658948303701, + 109511474234524542, + 117401173410938945, + 21888242871839275222246405745257275088548364400416034343698177511645454887343, + 21888242871839275222246405745257275088548364400416034343698114859987535019977, + 21888242871839275222246405745257275088548364400416034343698103949096326000377, + 21888242871839275222246405745257275088548364400416034343698126220333831863832, + 71256098395546206, + 100775930953778604, + 96600410404432077, + 65710188252222215, + 21888242871839275222246405745257275088548364400416034343698138771025143610418, + 21888242871839275222246405745257275088548364400416034343698096328751596487320, + 21888242871839275222246405745257275088548364400416034343698196290625273610766, + 85462561765597517, + 21888242871839275222246405745257275088548364400416034343698076047043905729761, + 21888242871839275222246405745257275088548364400416034343698172467445554070542, + 21888242871839275222246405745257275088548364400416034343698148344874398499397, + 137340949545208701, + 21888242871839275222246405745257275088548364400416034343698100553837854807524, + 63656512938169415, + 15979427619021004, + 21888242871839275222246405745257275088548364400416034343698082103792097836147, + 21888242871839275222246405745257275088548364400416034343698147058196483636776, + 21888242871839275222246405745257275088548364400416034343698146210846095279116, + 135780349287477371, + 46591042183774778, + 21888242871839275222246405745257275088548364400416034343698184271404706693105, + 21888242871839275222246405745257275088548364400416034343698199371776068579177, + 102772068204697047, + 21888242871839275222246405745257275088548364400416034343698130091071542887888, + 58689444812738362, + 57886377157784811, + 21888242871839275222246405745257275088548364400416034343698187851648919297523, + 62569988686781073, + 74764459524613763, + 43279598624464435, + 57810329658210345, + 38576548097830490, + 21888242871839275222246405745257275088548364400416034343698098301072303946333, + 67357659457552888, + 21888242871839275222246405745257275088548364400416034343698165844122628835559, + 63009651591222130, + 66402556624651355, + 21888242871839275222246405745257275088548364400416034343698167574639580995696, + 119866618386818430, + 21888242871839275222246405745257275088548364400416034343698117748250148637293, + 21888242871839275222246405745257275088548364400416034343698139053682117728798, + 79489717824485811, + 12016767203129672, + 21888242871839275222246405745257275088548364400416034343698179481252163570988, + 21888242871839275222246405745257275088548364400416034343698100892163689243084, + 21888242871839275222246405745257275088548364400416034343698086814757049665536, + 68410842181028758, + 21888242871839275222246405745257275088548364400416034343698117461810017092955, + 94747432766447919, + 38250418879065323, + 104396978641695645, + 21888242871839275222246405745257275088548364400416034343698114964710428685550, + 90683764706941083, + 21888242871839275222246405745257275088548364400416034343698122395525529090002, + 21888242871839275222246405745257275088548364400416034343698082952470898065346, + 47483464328378493, + 141529205671326602, + 116822660077891708, + 20446422523330993, + 129096173386098387, + 21888242871839275222246405745257275088548364400416034343698122652187593275607, + 141841732874685425, + 21888242871839275222246405745257275088548364400416034343698175972476294522249, + 119273049294023032, + 21888242871839275222246405745257275088548364400416034343698177146320692379458, + 21888242871839275222246405745257275088548364400416034343698178336534535127876, + 47019873311319815, + 54009347924278878, + 21888242871839275222246405745257275088548364400416034343698137093505581241238, + 21888242871839275222246405745257275088548364400416034343698103798670495178669, + 126128869722427020, + 21888242871839275222246405745257275088548364400416034343698179486537738891769, + 110440238778428481, + 21888242871839275222246405745257275088548364400416034343698161665899560919732, + 96141083879384667, + 21888242871839275222246405745257275088548364400416034343698070958148077512666, + 21888242871839275222246405745257275088548364400416034343698143393126843968095, + 12317023377599667, + 70852275485958982, + 99984242408187833, + 94632070754579564, + 21888242871839275222246405745257275088548364400416034343698146921501371459295, + 95600600209434710, + 21888242871839275222246405745257275088548364400416034343698120322979700883243, + 141843904890187295, + 114457493106617182, + 21888242871839275222246405745257275088548364400416034343698170102629560081502, + 111993740289562837, + 132788008789993353, + 21888242871839275222246405745257275088548364400416034343698150687713643863958, + 21888242871839275222246405745257275088548364400416034343698082723749119616085, + 21888242871839275222246405745257275088548364400416034343698204012191034592811, + 116247312698530596, + 44172960099901069, + 21888242871839275222246405745257275088548364400416034343698198779071787475452, + 21888242871839275222246405745257275088548364400416034343698122247501130191746, + 21888242871839275222246405745257275088548364400416034343698110253949015425224, + 90850699087730443, + 21888242871839275222246405745257275088548364400416034343698121396964286080728, + 21888242871839275222246405745257275088548364400416034343698099174621983638672, + 100603938221694666, + 101806817299543832, + 136985303135840694, + 119519114500767390, + 77930729141274938, + 21888242871839275222246405745257275088548364400416034343698092930460148963763, + 21888242871839275222246405745257275088548364400416034343698194714023536578992, + 119514193900164630, + 80184955516268901, + 125062580874973250, + 21888242871839275222246405745257275088548364400416034343698128339227047114576, + 18962951846705890, + 97586100905616434, + 21888242871839275222246405745257275088548364400416034343698086280760359548683, + 21888242871839275222246405745257275088548364400416034343698101927481979054393, + 21888242871839275222246405745257275088548364400416034343698199145739661035081, + 11780308445601328, + 21888242871839275222246405745257275088548364400416034343698174635324999345862, + 21888242871839275222246405745257275088548364400416034343698068299795624154197, + 120952014093525251, + 21888242871839275222246405745257275088548364400416034343698202339754612797317, + 70597684218788753, + 21888242871839275222246405745257275088548364400416034343698194451713498235583, + 21888242871839275222246405745257275088548364400416034343698121232829476894116, + 116453399928046652, + 21888242871839275222246405745257275088548364400416034343698143111014880170350, + 105077102621851406, + 49703128348491649, + 21888242871839275222246405745257275088548364400416034343698104258988063023164, + 22714858711993457, + 72783475167922406, + 135594557339799483, + 21888242871839275222246405745257275088548364400416034343698138004498618869900, + 82600474463677256, + 21888242871839275222246405745257275088548364400416034343698144208147782821192, + 21888242871839275222246405745257275088548364400416034343698150392728774200269, + 90195868493900196, + 21888242871839275222246405745257275088548364400416034343698179169451448991440, + 21888242871839275222246405745257275088548364400416034343698153290113228717669, + 128104716673872953, + 138867366714573027, + 21888242871839275222246405745257275088548364400416034343698204057365394773136, + 71483068558335711, + 21888242871839275222246405745257275088548364400416034343698128222930494173028, + 21888242871839275222246405745257275088548364400416034343698109663630152202767, + 86577056698553672, + 21888242871839275222246405745257275088548364400416034343698199324463089497666, + 21888242871839275222246405745257275088548364400416034343698191262433292021276, + 4558650993545290, + 21888242871839275222246405745257275088548364400416034343698183131065492936350, + 28020209663647238, + 21888242871839275222246405745257275088548364400416034343698171257202676902101, + 33205307520615910, + 21888242871839275222246405745257275088548364400416034343698196290848419603807, + 8224275519259128, + 21888242871839275222246405745257275088548364400416034343698077004843772336081, + 21888242871839275222246405745257275088548364400416034343698165843399623020396, + 85037266783175292, + 141225513999776437, + 98802923508505095, + 58652436643135951, + 30173587146467890, + 21888242871839275222246405745257275088548364400416034343698179061719207772098, + 20342402936286326, + 21888242871839275222246405745257275088548364400416034343698104079263050960258, + 64290882143129895, + 50464328452222249, + 21888242871839275222246405745257275088548364400416034343698176146737391102226, + 55232260039504567, + 62034700641807925, + 21212395156909608, + 21888242871839275222246405745257275088548364400416034343698099038356618747865, + 21888242871839275222246405745257275088548364400416034343698115998541539684510, + 29029427658108730, + 21888242871839275222246405745257275088548364400416034343698203724771648400665, + 53178616558537010, + 65054760171971760, + 21888242871839275222246405745257275088548364400416034343698181566778322533816, + 21888242871839275222246405745257275088548364400416034343698113512997056179117, + 88581912257625641, + 21888242871839275222246405745257275088548364400416034343698147667338663555766, + 124284750022980090, + 21888242871839275222246405745257275088548364400416034343698135226010615096811, + 64105853224685040, + 30354341140945059, + 21888242871839275222246405745257275088548364400416034343698161131065792585860, + 58757911872841626, + 21888242871839275222246405745257275088548364400416034343698100015114150864228, + 21888242871839275222246405745257275088548364400416034343698171499736057024118, + 21888242871839275222246405745257275088548364400416034343698141626837248411923, + 45921342808242424, + 21888242871839275222246405745257275088548364400416034343698137528194165292454, + 67176066858071984, + 23152332889940830, + 129483463074060393, + 53169581628454404, + 21888242871839275222246405745257275088548364400416034343698071908883609901047, + 95336648932783350, + 105962963484973540, + 39109224632913309, + 21888242871839275222246405745257275088548364400416034343698132823320283055089, + 96643828095590573, + 21888242871839275222246405745257275088548364400416034343698171151398869544458, + 21888242871839275222246405745257275088548364400416034343698196698193506005494, + 21888242871839275222246405745257275088548364400416034343698102098934550018456, + 21888242871839275222246405745257275088548364400416034343698061277325027488880, + 140987596508423743, + 21888242871839275222246405745257275088548364400416034343698196285474644651665, + 23162571589463078, + 85662719816170665, + 25489276119012868, + 21888242871839275222246405745257275088548364400416034343698196254188298369008, + 21888242871839275222246405745257275088548364400416034343698122710865091722612, + 98277602631590611, + 74353993442593943, + 21888242871839275222246405745257275088548364400416034343698145388114107699289, + 21888242871839275222246405745257275088548364400416034343698160539779008236002, + 21888242871839275222246405745257275088548364400416034343698195101335608221343, + 21888242871839275222246405745257275088548364400416034343698068592076751366702, + 21888242871839275222246405745257275088548364400416034343698062777474957804401, + 21888242871839275222246405745257275088548364400416034343698060666387235584979, + 52816373092226874, + 121134099101777373, + 21888242871839275222246405745257275088548364400416034343698172290816866393471, + 2800318182924747, + 132320535424163393, + 21888242871839275222246405745257275088548364400416034343698196720107886232254, + 21888242871839275222246405745257275088548364400416034343698144716825541465799, + 21888242871839275222246405745257275088548364400416034343698071526425092538898, + 21888242871839275222246405745257275088548364400416034343698154235686795781294, + 21888242871839275222246405745257275088548364400416034343698169683043248531871, + 21888242871839275222246405745257275088548364400416034343698117692289615981050, + 21888242871839275222246405745257275088548364400416034343698081568403465978143, + 117626253787601535, + 58448635215154342, + 21888242871839275222246405745257275088548364400416034343698175528902291333592, + 50280321793246211, + 8077408987875109, + 138892006161299504, + 34344627657059729, + 21888242871839275222246405745257275088548364400416034343698184402771840989924, + 21888242871839275222246405745257275088548364400416034343698173755610758758762, + 128534500028060247, + 32329859597892676, + 113780201318021153, + 54659283872852889, + 21888242871839275222246405745257275088548364400416034343698166546554279214640, + 90581515104814238, + 107737141120063681, + 21888242871839275222246405745257275088548364400416034343698203589416118592428, + 49303958944341493, + 97534620189215548, + 21888242871839275222246405745257275088548364400416034343698080525533994809086, + 45382388195390226, + 122097875697669780, + 102219768811144379, + 133581874380887375, + 52279799033106990, + 112154720476200317, + 53080335765323248, + 21888242871839275222246405745257275088548364400416034343698164613658628068125, + 21888242871839275222246405745257275088548364400416034343698136262253598191681, + 58322262243843725, + 21888242871839275222246405745257275088548364400416034343698167956402615517536, + 116431402025480136, + 21888242871839275222246405745257275088548364400416034343698066402047354147015, + 21888242871839275222246405745257275088548364400416034343698155175513930170775, + 21888242871839275222246405745257275088548364400416034343698130916886087461909, + 136703802583692552, + 73448832183092785, + 21888242871839275222246405745257275088548364400416034343698140185738179254583, + 96157663655517482, + 21888242871839275222246405745257275088548364400416034343698068001260123746698, + 72237505755998463, + 34850589715734148, + 93883990493923050, + 12911488358382566, + 21888242871839275222246405745257275088548364400416034343698109844224795744520, + 21888242871839275222246405745257275088548364400416034343698154963499237415022, + 21888242871839275222246405745257275088548364400416034343698078922119223950482, + 21888242871839275222246405745257275088548364400416034343698194823632269336034, + 21888242871839275222246405745257275088548364400416034343698141048407596356302, + 21888242871839275222246405745257275088548364400416034343698180212975942494887, + 21888242871839275222246405745257275088548364400416034343698130232049811004859, + 21888242871839275222246405745257275088548364400416034343698202942877309009438, + 21888242871839275222246405745257275088548364400416034343698184336324720817836, + 21888242871839275222246405745257275088548364400416034343698119870633735476101, + 21888242871839275222246405745257275088548364400416034343698078242248158701723, + 6127377779622503, + 21888242871839275222246405745257275088548364400416034343698161191125365693558, + 21888242871839275222246405745257275088548364400416034343698077286863216651852, + 25691884685052148, + 21888242871839275222246405745257275088548364400416034343698168980630727132710, + 21888242871839275222246405745257275088548364400416034343698125090549928595197, + 64735087844858718, + 21176326816404911, + 21888242871839275222246405745257275088548364400416034343698116216349255461470, + 21888242871839275222246405745257275088548364400416034343698068871040361801824, + 8660928275647174, + 21888242871839275222246405745257275088548364400416034343698130859974269248066, + 21888242871839275222246405745257275088548364400416034343698113210186394211755, + 21888242871839275222246405745257275088548364400416034343698063917948492980831, + 21888242871839275222246405745257275088548364400416034343698107196925964876405, + 51435171516086358, + 118807308570304088, + 144103349985298908, + 29000767661914086, + 57887554121989470, + 21888242871839275222246405745257275088548364400416034343698132476244018905821, + 21888242871839275222246405745257275088548364400416034343698126092676405870255, + 21888242871839275222246405745257275088548364400416034343698198095659162620237, + 129766482175860602, + 21888242871839275222246405745257275088548364400416034343698140507253418523345, + 38336642842165915, + 77015984517810282, + 21888242871839275222246405745257275088548364400416034343698188870480382191874, + 21888242871839275222246405745257275088548364400416034343698129760998478077016, + 15414910402057111, + 106472125691678473, + 8413356836600597, + 103082231585855067, + 84509756406028774, + 21888242871839275222246405745257275088548364400416034343698163972215236880001, + 21888242871839275222246405745257275088548364400416034343698127091554525381513, + 21888242871839275222246405745257275088548364400416034343698079375008300810617, + 21888242871839275222246405745257275088548364400416034343698167665933973482677, + 108717018407964245, + 28727363605050805, + 21888242871839275222246405745257275088548364400416034343698094824330176343459, + 21888242871839275222246405745257275088548364400416034343698061812028458375540, + 130902479729062803, + 21888242871839275222246405745257275088548364400416034343698077106285483951189, + 21888242871839275222246405745257275088548364400416034343698152847127498010015, + 64126057157185000, + 21888242871839275222246405745257275088548364400416034343698159437254118306327, + 118893307722630625, + 69442962102221498, + 100863847049810956, + 9846157761330563, + 21888242871839275222246405745257275088548364400416034343698097036203212107268, + 21888242871839275222246405745257275088548364400416034343698181459945352481678, + 21888242871839275222246405745257275088548364400416034343698085767340532125437, + 62579161969174659, + 81009997369917546, + 100686513473809660, + 21888242871839275222246405745257275088548364400416034343698084829478095884316, + 21888242871839275222246405745257275088548364400416034343698104244170400838261, + 107365760475892896, + 94794926555347169, + 21888242871839275222246405745257275088548364400416034343698196201105660287547, + 21888242871839275222246405745257275088548364400416034343698183050117760798818, + 21888242871839275222246405745257275088548364400416034343698166327280751328877, + 64138132699660098, + 21888242871839275222246405745257275088548364400416034343698146347671956535535, + 109589635230408114, + 44569392613046133, + 47735681965273618, + 21888242871839275222246405745257275088548364400416034343698070993868564837424, + 21888242871839275222246405745257275088548364400416034343698076227497650467535, + 20387098034260429, + 21888242871839275222246405745257275088548364400416034343698068895644307428005, + 21888242871839275222246405745257275088548364400416034343698151300505023934907, + 21888242871839275222246405745257275088548364400416034343698086257998599428298, + 23320171870791687, + 83173799683463564, + 21888242871839275222246405745257275088548364400416034343698069653545759009712, + 98455950234295123, + 21888242871839275222246405745257275088548364400416034343698067578933235525211, + 21888242871839275222246405745257275088548364400416034343698096221644346543540, + 21888242871839275222246405745257275088548364400416034343698092229652275807753, + 21888242871839275222246405745257275088548364400416034343698081070958270380035, + 121757652899243007, + 21888242871839275222246405745257275088548364400416034343698152950551882062925, + 8875430871964225, + 21888242871839275222246405745257275088548364400416034343698085409803511688850, + 141282641872860738, + 85453632156898223, + 21888242871839275222246405745257275088548364400416034343698085650281756688012, + 49144301275752943, + 104898508461449239, + 50442846311458046, + 21888242871839275222246405745257275088548364400416034343698161034605950966186, + 82779152769142321, + 7584513936826289, + 33622284597117810, + 21888242871839275222246405745257275088548364400416034343698195777238968113343, + 21888242871839275222246405745257275088548364400416034343698105510067643307736, + 132826577150662876, + 21888242871839275222246405745257275088548364400416034343698181529197643499777, + 44807777433698771, + 25566762138682512, + 44104777840572994, + 121883138520781920, + 21888242871839275222246405745257275088548364400416034343698162431308110204617, + 357375642753020, + 21888242871839275222246405745257275088548364400416034343698154746927597935168, + 21888242871839275222246405745257275088548364400416034343698085644534737488602, + 21888242871839275222246405745257275088548364400416034343698132427597173570705, + 21888242871839275222246405745257275088548364400416034343698169753591381988444, + 13504048179009849, + 100780047778812118, + 3395373798282558, + 45038765607385624, + 21888242871839275222246405745257275088548364400416034343698106614235015816088, + 126682573474350376, + 21888242871839275222246405745257275088548364400416034343698111046173571393036, + 21888242871839275222246405745257275088548364400416034343698174819696283053125, + 21888242871839275222246405745257275088548364400416034343698129354822426484705, + 41238547423270360, + 59316682446350451, + 3418998380031685, + 21888242871839275222246405745257275088548364400416034343698076963512009279396, + 21888242871839275222246405745257275088548364400416034343698062416924430846590, + 21888242871839275222246405745257275088548364400416034343698085772983661954842, + 21888242871839275222246405745257275088548364400416034343698194349042373575713, + 37866892365673586, + 21888242871839275222246405745257275088548364400416034343698100512759133414902, + 68425357561761079, + 142379188516107962, + 135286349990837404, + 64046522852784114, + 21888242871839275222246405745257275088548364400416034343698179844847520291580, + 336832760271060, + 21888242871839275222246405745257275088548364400416034343698119903424436908210, + 21888242871839275222246405745257275088548364400416034343698150608218931618436, + 21888242871839275222246405745257275088548364400416034343698067215851480175981, + 119896613805413610, + 28336432369225000, + 141454365540064876, + 21888242871839275222246405745257275088548364400416034343698080689420985449831, + 82584431066749042, + 21888242871839275222246405745257275088548364400416034343698131678724022096228, + 21888242871839275222246405745257275088548364400416034343698086322067693749969, + 21888242871839275222246405745257275088548364400416034343698137010625314646278, + 13918839690250946, + 21888242871839275222246405745257275088548364400416034343698130413242372364372, + 21888242871839275222246405745257275088548364400416034343698089246738343558535, + 21888242871839275222246405745257275088548364400416034343698137284510112727787, + 21888242871839275222246405745257275088548364400416034343698065194213143936841, + 21888242871839275222246405745257275088548364400416034343698075381359781184847, + 21888242871839275222246405745257275088548364400416034343698137465878391983469, + 21888242871839275222246405745257275088548364400416034343698160534874433077093, + 21888242871839275222246405745257275088548364400416034343698116326491682248576, + 21888242871839275222246405745257275088548364400416034343698060488151702803289, + 21888242871839275222246405745257275088548364400416034343698181567105901504164, + 112939741739103729, + 42576930494064581, + 21888242871839275222246405745257275088548364400416034343698078688175770343044, + 21888242871839275222246405745257275088548364400416034343698124179259880668127, + 109304073637657306, + 90677604670812973, + 21888242871839275222246405745257275088548364400416034343698183710770906878596, + 21888242871839275222246405745257275088548364400416034343698141029685205622206, + 68621628603835798, + 21888242871839275222246405745257275088548364400416034343698089692204208665899, + 21888242871839275222246405745257275088548364400416034343698138989758062603010, + 21888242871839275222246405745257275088548364400416034343698142913705486903992, + 21888242871839275222246405745257275088548364400416034343698137796848097074617, + 96608690851262338, + 21888242871839275222246405745257275088548364400416034343698148781142173680690, + 21888242871839275222246405745257275088548364400416034343698094176166084094091, + 116591168584932344, + 21888242871839275222246405745257275088548364400416034343698139176739757363880, + 21888242871839275222246405745257275088548364400416034343698099258880493038154, + 21888242871839275222246405745257275088548364400416034343698095672298159585410, + 12385826656129774, + 21888242871839275222246405745257275088548364400416034343698121585364463884479, + 21888242871839275222246405745257275088548364400416034343698144053148277048871, + 21888242871839275222246405745257275088548364400416034343698204051204949264565, + 21888242871839275222246405745257275088548364400416034343698133628320887191923, + 21888242871839275222246405745257275088548364400416034343698088682557500796581, + 21888242871839275222246405745257275088548364400416034343698189229011254112568, + 40379987254121522, + 95868850877512003, + 89171928662577276, + 15265168473743352, + 45199540619327244, + 21888242871839275222246405745257275088548364400416034343698133509408762753726, + 21888242871839275222246405745257275088548364400416034343698112184386056694617, + 21888242871839275222246405745257275088548364400416034343698164438627368849536, + 73614071571820257, + 92267457278474922, + 81201083249150648, + 21888242871839275222246405745257275088548364400416034343698153661793683086829, + 66827581030275613, + 38569831657438051, + 113978101797652300, + 21888242871839275222246405745257275088548364400416034343698130615395418140364, + 122868524182056783, + 10743398682680233, + 35239002839963478, + 109971882455820123, + 21888242871839275222246405745257275088548364400416034343698096611682306523369, + 117923659612590329, + 67499546833445756, + 21888242871839275222246405745257275088548364400416034343698063696226070497097, + 21888242871839275222246405745257275088548364400416034343698186228734078651870, + 21888242871839275222246405745257275088548364400416034343698124258343227133206, + 21888242871839275222246405745257275088548364400416034343698075130868703891256, + 40909824618628443, + 142026303172354020, + 21888242871839275222246405745257275088548364400416034343698118131037563790338, + 14096801775131883, + 21888242871839275222246405745257275088548364400416034343698064706276033409196, + 21888242871839275222246405745257275088548364400416034343698114218757865055516, + 21888242871839275222246405745257275088548364400416034343698133912869824602104, + 21888242871839275222246405745257275088548364400416034343698161070943038123594, + 21888242871839275222246405745257275088548364400416034343698083153596000771514, + 21888242871839275222246405745257275088548364400416034343698136797959603631747, + 21888242871839275222246405745257275088548364400416034343698181257667713879731, + 21888242871839275222246405745257275088548364400416034343698196468783960950765, + 103425530854980815, + 21888242871839275222246405745257275088548364400416034343698116606097046720397, + 53079713084497792, + 128092343259003618, + 21888242871839275222246405745257275088548364400416034343698169599929166193848, + 21888242871839275222246405745257275088548364400416034343698095092803164120443, + 21888242871839275222246405745257275088548364400416034343698069485572863230431, + 125250151461877478, + 9619281281842829, + 21888242871839275222246405745257275088548364400416034343698179622285966935810, + 21888242871839275222246405745257275088548364400416034343698140830534336283035, + 21888242871839275222246405745257275088548364400416034343698073904510541089056, + 38375415016766409, + 21888242871839275222246405745257275088548364400416034343698186984129772199661, + 61613000361144962, + 21888242871839275222246405745257275088548364400416034343698124226806780382445, + 58020508715493784, + 21888242871839275222246405745257275088548364400416034343698152790350176106046, + 21888242871839275222246405745257275088548364400416034343698145794308979897467, + 82422212157339267, + 116822472761282817, + 38698614466064957, + 106839469552589984, + 124450129311015692, + 21888242871839275222246405745257275088548364400416034343698188307756020010232, + 21888242871839275222246405745257275088548364400416034343698065972080212594347, + 21888242871839275222246405745257275088548364400416034343698164236074033838287, + 73046080634316490, + 132476693198486983, + 21888242871839275222246405745257275088548364400416034343698163162279026266772, + 89912565213646629, + 103457721134534551, + 21888242871839275222246405745257275088548364400416034343698149400234712183372, + 21888242871839275222246405745257275088548364400416034343698089629538209121242, + 81009823008149058, + 142544623107725143, + 116557172915703516, + 21888242871839275222246405745257275088548364400416034343698162018242670782650, + 21888242871839275222246405745257275088548364400416034343698143187573214210285, + 88182480928898386, + 95599663410866008, + 135842390997773670, + 21888242871839275222246405745257275088548364400416034343698095755642336417004, + 21888242871839275222246405745257275088548364400416034343698102023187707855741, + 60478859034531213, + 117027355130910921, + 117386750413416368, + 21888242871839275222246405745257275088548364400416034343698107993135174393038, + 3742944878368485, + 21888242871839275222246405745257275088548364400416034343698111337854979901459, + 71482168276333999, + 21888242871839275222246405745257275088548364400416034343698133495632757814553, + 21888242871839275222246405745257275088548364400416034343698093848178683819882, + 5670598988590485, + 136624563291408273, + 21888242871839275222246405745257275088548364400416034343698174476518097152690, + 21888242871839275222246405745257275088548364400416034343698090546656350472639, + 15351329936689173, + 113934533972449183, + 21888242871839275222246405745257275088548364400416034343698110346542412343182, + 21888242871839275222246405745257275088548364400416034343698074683615492546253, + 120203086218936854, + 67496578731449272, + 10562502573935196, + 97825262123046338, + 96658784684192812, + 34836072953967984, + 120535155112695890, + 91435897431008342, + 21888242871839275222246405745257275088548364400416034343698073183712158334851, + 33903257891519684, + 21888242871839275222246405745257275088548364400416034343698175408020778204646, + 21888242871839275222246405745257275088548364400416034343698113678339000982930, + 115587587926860786, + 22006285238855099, + 57975029435198317, + 21888242871839275222246405745257275088548364400416034343698192081518092637653, + 21888242871839275222246405745257275088548364400416034343698130042976832714968, + 21888242871839275222246405745257275088548364400416034343698138110230787518019, + 21888242871839275222246405745257275088548364400416034343698122396753567478592, + 137694460295191325, + 80929265517932208, + 31051732623364544, + 111779912198084030, + 19474501893623496, + 21888242871839275222246405745257275088548364400416034343698077096445324850323, + 1744659060850574, + 53598431444570620, + 21888242871839275222246405745257275088548364400416034343698201770332001585988, + 120088240656383059, + 21888242871839275222246405745257275088548364400416034343698175388914354873682, + 21888242871839275222246405745257275088548364400416034343698197333791918983037, + 21888242871839275222246405745257275088548364400416034343698135975882274901055, + 21888242871839275222246405745257275088548364400416034343698136466206117498436, + 64426474299343385, + 21888242871839275222246405745257275088548364400416034343698066474095255193845, + 1561410107525860, + 21888242871839275222246405745257275088548364400416034343698116249954073200901, + 52367747612352420, + 122812155196706528, + 21888242871839275222246405745257275088548364400416034343698138091340769195248, + 18398400330364402, + 14047560921761665, + 8456949401736697, + 21888242871839275222246405745257275088548364400416034343698088018563894178862, + 21888242871839275222246405745257275088548364400416034343698082980116710162225, + 21888242871839275222246405745257275088548364400416034343698111902103351019812, + 21888242871839275222246405745257275088548364400416034343698137347274663672240, + 21554425909375911, + 84400656860711915, + 21888242871839275222246405745257275088548364400416034343698123248921927633579, + 130529027646526044, + 21888242871839275222246405745257275088548364400416034343698088681236904845464, + 21888242871839275222246405745257275088548364400416034343698090324975513704345, + 86577617848706403, + 143195832128664094, + 21888242871839275222246405745257275088548364400416034343698066452117419588800, + 21888242871839275222246405745257275088548364400416034343698119748850127612034, + 21888242871839275222246405745257275088548364400416034343698063516103288982565, + 21888242871839275222246405745257275088548364400416034343698114844216313447152, + 21888242871839275222246405745257275088548364400416034343698151055870498778588, + 21888242871839275222246405745257275088548364400416034343698172350081284004793, + 81529940715695248, + 21888242871839275222246405745257275088548364400416034343698131376346217908823, + 21888242871839275222246405745257275088548364400416034343698120065108445323463, + 18827801738480430, + 91470060667702320, + 119281258195587054, + 87315642866716477, + 33310200565670443, + 21888242871839275222246405745257275088548364400416034343698143325367965686035, + 21888242871839275222246405745257275088548364400416034343698163182029749061207, + 88796761317841196, + 21888242871839275222246405745257275088548364400416034343698187815630541271461, + 88092639444811868, + 21888242871839275222246405745257275088548364400416034343698188035069402535839, + 41072399874695105, + 55991438201125158, + 9181430127723247, + 96196990964677706, + 21888242871839275222246405745257275088548364400416034343698145909201982570051, + 21888242871839275222246405745257275088548364400416034343698200933825266428481, + 71141104489347280, + 70295533802708450, + 21888242871839275222246405745257275088548364400416034343698132471730298097303, + 55124411995792428, + 21888242871839275222246405745257275088548364400416034343698152964894614093328, + 83494581989815716, + 21888242871839275222246405745257275088548364400416034343698107950725858255402, + 21888242871839275222246405745257275088548364400416034343698159246444820055347, + 3333476218217439, + 82004819345758809, + 97514234694515553, + 21888242871839275222246405745257275088548364400416034343698182381193154842811, + 126355666235201257, + 128823329924625361, + 21888242871839275222246405745257275088548364400416034343698060113503362624368, + 17047015224108492, + 21888242871839275222246405745257275088548364400416034343698197109945076605053, + 54536519250623232, + 44795488839616227, + 61564421558808829, + 74218408149643484, + 21888242871839275222246405745257275088548364400416034343698194585752906341303, + 129254046484763334, + 76695425551733902, + 21888242871839275222246405745257275088548364400416034343698062959513627312411, + 46390225586295209, + 21888242871839275222246405745257275088548364400416034343698093513989055658115, + 19031671783093406, + 100499760301344704, + 21888242871839275222246405745257275088548364400416034343698161662383253130160, + 21888242871839275222246405745257275088548364400416034343698202018621568794000, + 21888242871839275222246405745257275088548364400416034343698140006448041755753, + 36502348891924613, + 51295869350746781, + 21888242871839275222246405745257275088548364400416034343698114574143092183688, + 21888242871839275222246405745257275088548364400416034343698151426863859294329, + 70703480833970935, + 50055298837195868, + 44501974895608182, + 116765929832817912, + 21888242871839275222246405745257275088548364400416034343698064730937323269355, + 21888242871839275222246405745257275088548364400416034343698117672341008908232, + 21888242871839275222246405745257275088548364400416034343698171984751543298049, + 47974436782935573, + 21888242871839275222246405745257275088548364400416034343698167859018668653444, + 88411191675125460, + 129514462133385172, + 9419068389566525, + 16538175191456078, + 21888242871839275222246405745257275088548364400416034343698184534884325372433, + 21888242871839275222246405745257275088548364400416034343698168683963762378943, + 115699060275494356, + 21888242871839275222246405745257275088548364400416034343698192830805011564075, + 21888242871839275222246405745257275088548364400416034343698147691042595428610, + 21888242871839275222246405745257275088548364400416034343698067209913946664933, + 48428778810093026, + 130921145183251883, + 103185847200700108, + 21888242871839275222246405745257275088548364400416034343698195083653451088913, + 27422963108257385, + 21888242871839275222246405745257275088548364400416034343698080919986586343141, + 21888242871839275222246405745257275088548364400416034343698096085038132364753, + 21888242871839275222246405745257275088548364400416034343698138480819808044197, + 84929483693890369, + 141974186861438886, + 22965658460548066, + 21888242871839275222246405745257275088548364400416034343698158837432066179552, + 43961172490383803, + 21888242871839275222246405745257275088548364400416034343698143900933005780664, + 21888242871839275222246405745257275088548364400416034343698119685620283317842, + 9702611931876089, + 21888242871839275222246405745257275088548364400416034343698060748250033663584, + 21888242871839275222246405745257275088548364400416034343698173063497242879791, + 69410404998935753, + 40132503710109732, + 21888242871839275222246405745257275088548364400416034343698074807486672320337, + 21888242871839275222246405745257275088548364400416034343698116646306230859566, + 21888242871839275222246405745257275088548364400416034343698087473534731612305, + 21888242871839275222246405745257275088548364400416034343698203806447315963762, + 123827270490563953, + 21888242871839275222246405745257275088548364400416034343698131378138236912499, + 89180196653694821, + 5521442520176529, + 106297697604908550, + 21888242871839275222246405745257275088548364400416034343698141730408005514859, + 21888242871839275222246405745257275088548364400416034343698085685762409764359, + 21888242871839275222246405745257275088548364400416034343698202101098504086687, + 69886732102239907, + 80906151239307724, + 21888242871839275222246405745257275088548364400416034343698120980553276768768, + 10267017705669279, + 21888242871839275222246405745257275088548364400416034343698190240213613185594, + 21888242871839275222246405745257275088548364400416034343698133685628810544752, + 21888242871839275222246405745257275088548364400416034343698094220948898486088, + 21888242871839275222246405745257275088548364400416034343698179722941017002040, + 21888242871839275222246405745257275088548364400416034343698085242446908576983, + 31430845867082191, + 48192852252259753, + 21888242871839275222246405745257275088548364400416034343698063425809994477214, + 21888242871839275222246405745257275088548364400416034343698152268204504162900, + 21888242871839275222246405745257275088548364400416034343698149791108317985160, + 97432271985900690, + 122003460993641011, + 44048016099703268, + 13763796613190507, + 120307190533003400, + 68229866354459679, + 21888242871839275222246405745257275088548364400416034343698192706790404517363, + 21888242871839275222246405745257275088548364400416034343698168547769239822644, + 94446013248460336, + 89930917524986699, + 21888242871839275222246405745257275088548364400416034343698094807647071100620, + 88486577229653471, + 5027539460094132, + 100937690124349168, + 42476193764781785, + 58074157163131667, + 69121518669628703, + 21888242871839275222246405745257275088548364400416034343698136558636467705597, + 21888242871839275222246405745257275088548364400416034343698166944481879179217, + 21888242871839275222246405745257275088548364400416034343698169410499511588621, + 21888242871839275222246405745257275088548364400416034343698154494467426542987, + 12258434784613158, + 21888242871839275222246405745257275088548364400416034343698153540424882066789, + 21888242871839275222246405745257275088548364400416034343698179828630280999523, + 21888242871839275222246405745257275088548364400416034343698104133432536822843, + 21888242871839275222246405745257275088548364400416034343698069566596314410874, + 21888242871839275222246405745257275088548364400416034343698167754901658045182, + 21888242871839275222246405745257275088548364400416034343698133110499281861649, + 105770802190465049, + 21888242871839275222246405745257275088548364400416034343698180928799723761993, + 21888242871839275222246405745257275088548364400416034343698061506367020285716, + 5488890310131999, + 21888242871839275222246405745257275088548364400416034343698133742201412507333, + 21888242871839275222246405745257275088548364400416034343698168918427499426552, + 21888242871839275222246405745257275088548364400416034343698187749177558517903, + 85546998941684680, + 55249392251527740, + 21888242871839275222246405745257275088548364400416034343698083539505658048091, + 21888242871839275222246405745257275088548364400416034343698063080285384472193, + 21888242871839275222246405745257275088548364400416034343698166042287757929877, + 21888242871839275222246405745257275088548364400416034343698106419082708323361, + 101608387931051441, + 92810295241723437, + 21888242871839275222246405745257275088548364400416034343698199082827050898663, + 21888242871839275222246405745257275088548364400416034343698158998879290285402, + 21888242871839275222246405745257275088548364400416034343698153623882282860179, + 21888242871839275222246405745257275088548364400416034343698177048447612664812, + 21888242871839275222246405745257275088548364400416034343698170623009678538264, + 45957477378487636, + 21888242871839275222246405745257275088548364400416034343698065535969910047689, + 21888242871839275222246405745257275088548364400416034343698166591280792418409, + 21888242871839275222246405745257275088548364400416034343698061686799210073166, + 21888242871839275222246405745257275088548364400416034343698072965271561387513, + 21888242871839275222246405745257275088548364400416034343698078695298001890848, + 127738851741341283, + 80978220035417645, + 141706858808480167, + 49721954972958208, + 3390911545968732, + 60696098994286012, + 21888242871839275222246405745257275088548364400416034343698083471229483375153, + 21888242871839275222246405745257275088548364400416034343698140016897855175677, + 73520819673144919, + 21888242871839275222246405745257275088548364400416034343698167896940455509126, + 12132074726936189, + 139853787455470176, + 21888242871839275222246405745257275088548364400416034343698134621181222840728, + 21888242871839275222246405745257275088548364400416034343698196556633557494230, + 21888242871839275222246405745257275088548364400416034343698072429687306718796, + 21888242871839275222246405745257275088548364400416034343698201868186387882539, + 21888242871839275222246405745257275088548364400416034343698162779618169484694, + 16104523014231314, + 21888242871839275222246405745257275088548364400416034343698166436803242075196, + 95991802607540177, + 21888242871839275222246405745257275088548364400416034343698070959665274782672, + 74541960481333988, + 21888242871839275222246405745257275088548364400416034343698188535710458366697, + 21888242871839275222246405745257275088548364400416034343698130704238989067829, + 21888242871839275222246405745257275088548364400416034343698106393153758580063, + 21888242871839275222246405745257275088548364400416034343698195083181131880461, + 46569495827731018, + 56452990056493092, + 21888242871839275222246405745257275088548364400416034343698181125795515986397, + 35533551602653346, + 21888242871839275222246405745257275088548364400416034343698141157690528691115, + 21888242871839275222246405745257275088548364400416034343698192032035143624015, + 5251448926136503, + 21888242871839275222246405745257275088548364400416034343698166971369618993732, + 39659559212095015, + 33794647274098978, + 480434201370826, + 136578322339696624, + 21888242871839275222246405745257275088548364400416034343698179432317797807908, + 23898597625993881, + 137615298595844191, + 21888242871839275222246405745257275088548364400416034343698200727182994119858, + 21888242871839275222246405745257275088548364400416034343698091281170814106543, + 109835686208649933, + 21888242871839275222246405745257275088548364400416034343698090791266442132710, + 28974164090811008, + 21888242871839275222246405745257275088548364400416034343698128903008952256915, + 38307492731127674, + 21888242871839275222246405745257275088548364400416034343698098119481795668861, + 116400413283530628, + 135768858798691010, + 21888242871839275222246405745257275088548364400416034343698156375408855970407, + 21888242871839275222246405745257275088548364400416034343698182634245909257000, + 20056814698229096, + 21888242871839275222246405745257275088548364400416034343698152866993951167209, + 133441163343960773, + 976045463559100, + 46737837008644797, + 21888242871839275222246405745257275088548364400416034343698172839510386141491, + 10248787646208211, + 143981731444696038, + 113650314175600943, + 77143241597082556, + 86445381451450236, + 21888242871839275222246405745257275088548364400416034343698122822961436073422, + 99313467342428451, + 102187734249747069, + 129520092561508635, + 21888242871839275222246405745257275088548364400416034343698129684656349512759, + 21888242871839275222246405745257275088548364400416034343698081824345333755013, + 21888242871839275222246405745257275088548364400416034343698197330817455808875, + 38620774567273710, + 98027701934209191, + 128239079153740498, + 144056204735026212, + 21888242871839275222246405745257275088548364400416034343698179671743833009678, + 7149860146133882, + 56233126504003000, + 21888242871839275222246405745257275088548364400416034343698142701089096486969, + 21888242871839275222246405745257275088548364400416034343698061207461406786031, + 72082075629697155, + 22157052206816992, + 21888242871839275222246405745257275088548364400416034343698113269338511674484, + 21888242871839275222246405745257275088548364400416034343698171765217940718994, + 21888242871839275222246405745257275088548364400416034343698115334361545070523, + 21888242871839275222246405745257275088548364400416034343698189473789896155526, + 36814335514560896, + 49552821340913099, + 76646208392305327, + 60756304373979804, + 21888242871839275222246405745257275088548364400416034343698079777467023307252, + 135485864653813954, + 93774682778825701, + 102758917549779381, + 39699943347347536, + 130932637686532872, + 21888242871839275222246405745257275088548364400416034343698180224010274058551, + 21888242871839275222246405745257275088548364400416034343698095751456015572854, + 21888242871839275222246405745257275088548364400416034343698144895601714406545, + 132901316777934934, + 10062075068670090, + 21888242871839275222246405745257275088548364400416034343698063751908933631703, + 21888242871839275222246405745257275088548364400416034343698125377727990823177, + 68064227553501279, + 94084948148909619, + 21888242871839275222246405745257275088548364400416034343698192107566610540859, + 122639846465261383, + 38871154994323084, + 21888242871839275222246405745257275088548364400416034343698110772889156111820, + 87724107936369336, + 21888242871839275222246405745257275088548364400416034343698160162847926599042, + 21888242871839275222246405745257275088548364400416034343698150280192929899243, + 68761461501132795, + 21888242871839275222246405745257275088548364400416034343698097991153296671786, + 131929268502726566, + 21888242871839275222246405745257275088548364400416034343698084729290769067637, + 21888242871839275222246405745257275088548364400416034343698107159788185761973, + 12297835897659700, + 123129921627466940, + 21888242871839275222246405745257275088548364400416034343698120745258965554322, + 21888242871839275222246405745257275088548364400416034343698169221516284303799, + 68031851203377491, + 21888242871839275222246405745257275088548364400416034343698087496128910477796, + 21888242871839275222246405745257275088548364400416034343698111511133014207813, + 21888242871839275222246405745257275088548364400416034343698063639239315859485, + 118764272840703515, + 19463101795014098, + 123282947221380790, + 79264924887342581, + 21888242871839275222246405745257275088548364400416034343698138310030851669202, + 21888242871839275222246405745257275088548364400416034343698125185339102078393, + 99480925664786097, + 21888242871839275222246405745257275088548364400416034343698109702092625515561, + 21888242871839275222246405745257275088548364400416034343698112256689372149757, + 21888242871839275222246405745257275088548364400416034343698186460371667978916, + 38967668824945076, + 134235348194422331, + 21888242871839275222246405745257275088548364400416034343698166510236497378671, + 21888242871839275222246405745257275088548364400416034343698156429277184975906, + 128010590689330201, + 86705117915494093, + 5875080175859799, + 46644288048692396, + 116823643527929097, + 24519004554255705, + 59368514003066532, + 90498075467367634, + 107023556576246569, + 21888242871839275222246405745257275088548364400416034343698109525306822343157, + 21888242871839275222246405745257275088548364400416034343698110693095350947109, + 67307110506199891, + 21888242871839275222246405745257275088548364400416034343698105110540648783625, + 21888242871839275222246405745257275088548364400416034343698198914691619491724, + 63566577720139267, + 21888242871839275222246405745257275088548364400416034343698067544157888903575, + 100922386438442272, + 124589347219735917, + 21888242871839275222246405745257275088548364400416034343698124202805341792857, + 119694950688513895, + 61730562099034825, + 21888242871839275222246405745257275088548364400416034343698095133684086033896, + 21888242871839275222246405745257275088548364400416034343698161069885904310044, + 19770079983060956, + 21888242871839275222246405745257275088548364400416034343698122811466969104049, + 125673457296812048, + 129071824524625734, + 36379219179618894, + 21888242871839275222246405745257275088548364400416034343698176217868296992480, + 21888242871839275222246405745257275088548364400416034343698089660763355641508, + 97337666187711004, + 124260451983884115, + 21888242871839275222246405745257275088548364400416034343698080024484188253995, + 21888242871839275222246405745257275088548364400416034343698148823073367691588, + 62213560834624265, + 21888242871839275222246405745257275088548364400416034343698165242148708692202, + 126689363703941814, + 98902442568728719, + 21888242871839275222246405745257275088548364400416034343698154656681534396569, + 108248169861284623, + 21888242871839275222246405745257275088548364400416034343698130982075526344067, + 25571208604169095, + 21888242871839275222246405745257275088548364400416034343698180795728490009079, + 34715510681139881, + 21888242871839275222246405745257275088548364400416034343698173622367346260450, + 44612321021596586, + 21888242871839275222246405745257275088548364400416034343698136871508964699257, + 21888242871839275222246405745257275088548364400416034343698191793570994533104, + 106623499740898468, + 42074456742863412, + 117323240385043984, + 119252971628727404, + 68911484700834065, + 21888242871839275222246405745257275088548364400416034343698149338750338979721, + 21888242871839275222246405745257275088548364400416034343698197907690660863192, + 15037296475369509, + 117636169454674684, + 120605146098995975, + 21888242871839275222246405745257275088548364400416034343698129158747087654065, + 47156384127868748, + 49328765559263602, + 93293716089000148, + 56253536048766249, + 102544794362973838, + 50548149667692695, + 21888242871839275222246405745257275088548364400416034343698122676402977915476, + 98228268359502652, + 21888242871839275222246405745257275088548364400416034343698188381777523826048, + 21888242871839275222246405745257275088548364400416034343698200361023937070869, + 21888242871839275222246405745257275088548364400416034343698092445029231827550, + 119698318100873578, + 21888242871839275222246405745257275088548364400416034343698190157868689829995, + 43313788100712643, + 114574894669477417, + 21888242871839275222246405745257275088548364400416034343698070746288295132704, + 21888242871839275222246405745257275088548364400416034343698139278501540157971, + 76354658047729951, + 21888242871839275222246405745257275088548364400416034343698109303326568597875, + 143719121345540, + 36729537923047921, + 90766787171066336, + 79217358058868641, + 114829500659717101, + 21888242871839275222246405745257275088548364400416034343698127062457520454562, + 13872312305554033, + 47489351043432844, + 21888242871839275222246405745257275088548364400416034343698089022974144505748, + 85683993392269423, + 125499641008587202, + 21888242871839275222246405745257275088548364400416034343698170827660471728986, + 122683819232066778, + 21888242871839275222246405745257275088548364400416034343698192940633661058115, + 25999752587248251, + 60048175142924106, + 96787070717443058, + 21888242871839275222246405745257275088548364400416034343698114653630110823855, + 32042135284367277, + 51017114546801994, + 123914417102866794, + 109009946928497870, + 21888242871839275222246405745257275088548364400416034343698116746463957556029, + 121259168633391769, + 23896612379569550, + 21888242871839275222246405745257275088548364400416034343698173709007906086171, + 45042457157329497, + 132898803206361794, + 99362616055948052, + 21888242871839275222246405745257275088548364400416034343698180324477346097357, + 4761252824006121, + 108637861037616871, + 21888242871839275222246405745257275088548364400416034343698154039973083575699, + 21888242871839275222246405745257275088548364400416034343698115786903266311982, + 4496736489153354, + 21888242871839275222246405745257275088548364400416034343698200476529875556570, + 21888242871839275222246405745257275088548364400416034343698082383353079156002, + 21888242871839275222246405745257275088548364400416034343698080706647478571009, + 104804901310734026, + 82674373156252663, + 21888242871839275222246405745257275088548364400416034343698084109058323737406, + 52385533345857382, + 21888242871839275222246405745257275088548364400416034343698170736133770711045, + 21888242871839275222246405745257275088548364400416034343698099273462426672463, + 51382296293934983, + 80131083096972810, + 138934561846950830, + 98887693344535991, + 21888242871839275222246405745257275088548364400416034343698160950385082043861, + 21888242871839275222246405745257275088548364400416034343698091707020419616046, + 21888242871839275222246405745257275088548364400416034343698066463870335505259, + 7097911550540053, + 106065098084234163, + 21888242871839275222246405745257275088548364400416034343698128240192529052392, + 21888242871839275222246405745257275088548364400416034343698067403243121219044, + 21888242871839275222246405745257275088548364400416034343698074488424141485400, + 21888242871839275222246405745257275088548364400416034343698074541625513779138, + 21888242871839275222246405745257275088548364400416034343698082648333278198167, + 21888242871839275222246405745257275088548364400416034343698067249545933065945, + 141049047683847480, + 21888242871839275222246405745257275088548364400416034343698160731100663589765, + 21888242871839275222246405745257275088548364400416034343698194318458373980813, + 21888242871839275222246405745257275088548364400416034343698078667873855140108, + 21888242871839275222246405745257275088548364400416034343698073017368712744888, + 21888242871839275222246405745257275088548364400416034343698194840128105521573, + 22172019038931363, + 21888242871839275222246405745257275088548364400416034343698151888088478212412, + 21888242871839275222246405745257275088548364400416034343698165466066025747301, + 21888242871839275222246405745257275088548364400416034343698140769919272895227, + 84107351452844583, + 21888242871839275222246405745257275088548364400416034343698198896940486904730, + 21888242871839275222246405745257275088548364400416034343698120638663878082512, + 10055721862647724, + 33894126919180100, + 130863308833172671, + 69758333821006597, + 21888242871839275222246405745257275088548364400416034343698071548031513449910, + 21888242871839275222246405745257275088548364400416034343698183450524871748688, + 21888242871839275222246405745257275088548364400416034343698185543535311915903, + 115648250868993874, + 57348616465416151, + 21888242871839275222246405745257275088548364400416034343698136118913908272142, + 21888242871839275222246405745257275088548364400416034343698193726380644719501, + 29962833890011404, + 139594390057546320, + 21888242871839275222246405745257275088548364400416034343698077074316270123814, + 32119144608108464, + 94367198200036642, + 21888242871839275222246405745257275088548364400416034343698150697293444712519, + 21888242871839275222246405745257275088548364400416034343698121877720857294170, + 87065589884763167, + 5771236594450435, + 21888242871839275222246405745257275088548364400416034343698124058311463755002, + 140243475256798271, + 38500249385748578, + 53554308607336163, + 21888242871839275222246405745257275088548364400416034343698068643642578244195, + 21888242871839275222246405745257275088548364400416034343698186530747359634755, + 70887900376502778, + 21888242871839275222246405745257275088548364400416034343698177830631690139423, + 44464419252812067, + 6738813977447447, + 130004226159672728, + 21888242871839275222246405745257275088548364400416034343698138381398654515487, + 21888242871839275222246405745257275088548364400416034343698065494676231876653, + 62994072724624222, + 125241809151014187, + 21888242871839275222246405745257275088548364400416034343698140839645839340935, + 21888242871839275222246405745257275088548364400416034343698062227232091282899, + 21888242871839275222246405745257275088548364400416034343698167752665849341027, + 94790063479994094, + 21888242871839275222246405745257275088548364400416034343698169667962325214572, + 112248508779652476, + 109908801879515357, + 18759017418425005, + 21888242871839275222246405745257275088548364400416034343698165367763909574449, + 97039986810227591, + 21888242871839275222246405745257275088548364400416034343698186072663799466883, + 21888242871839275222246405745257275088548364400416034343698174085807952194723, + 21888242871839275222246405745257275088548364400416034343698060503512978128138, + 21888242871839275222246405745257275088548364400416034343698089582361150663110, + 49407134100397191, + 93787494760481103, + 21888242871839275222246405745257275088548364400416034343698119289668838028908, + 21888242871839275222246405745257275088548364400416034343698098671628115993407, + 80518892973757920, + 68171718700484863, + 21888242871839275222246405745257275088548364400416034343698076252442760854254, + 11655768511791467, + 21888242871839275222246405745257275088548364400416034343698150237169059094462, + 21888242871839275222246405745257275088548364400416034343698186600358358767337, + 21888242871839275222246405745257275088548364400416034343698197147697796879925, + 21888242871839275222246405745257275088548364400416034343698109562363112209981, + 21888242871839275222246405745257275088548364400416034343698140434094872380989, + 59747053955743890, + 3771874569794869, + 67411366767828607, + 21888242871839275222246405745257275088548364400416034343698197690438748380991, + 21888242871839275222246405745257275088548364400416034343698117905327130362223, + 83495540742429013, + 53076037765312553, + 83329075637595257, + 21888242871839275222246405745257275088548364400416034343698119166904988776140, + 65032516150916893, + 21888242871839275222246405745257275088548364400416034343698169662520545583414, + 26135627319339411, + 58732327146619472, + 100880252252558228, + 27254998985620524, + 21888242871839275222246405745257275088548364400416034343698070609381585191972, + 77900172728378926, + 117592082443999882, + 71335145895862389, + 133858905359784632, + 47450000550780807, + 21888242871839275222246405745257275088548364400416034343698129223622272255918, + 21888242871839275222246405745257275088548364400416034343698090112955423041097, + 12527626987405804, + 21888242871839275222246405745257275088548364400416034343698117076515953312668, + 21888242871839275222246405745257275088548364400416034343698168253736373723773, + 21888242871839275222246405745257275088548364400416034343698175250758941176410, + 21888242871839275222246405745257275088548364400416034343698178876039702546250, + 64951542628602407, + 134786560033904985, + 21888242871839275222246405745257275088548364400416034343698165907015654594864, + 21888242871839275222246405745257275088548364400416034343698164749306386581398, + 101784330726051043, + 10984983896537949, + 110132452848748444, + 21888242871839275222246405745257275088548364400416034343698078894066851035754, + 21888242871839275222246405745257275088548364400416034343698076399085488468108, + 21888242871839275222246405745257275088548364400416034343698142285774310948444, + 21888242871839275222246405745257275088548364400416034343698109413845120328658, + 44574764073174167, + 140014552922667967, + 63824606846850408, + 21888242871839275222246405745257275088548364400416034343698155437882120027786, + 21888242871839275222246405745257275088548364400416034343698095316369520235948, + 105965209296066701, + 21888242871839275222246405745257275088548364400416034343698074165873543753231, + 21888242871839275222246405745257275088548364400416034343698130925086642637450, + 73252975210696261, + 113498313199016687, + 71715565737169876, + 38983266483587911, + 21888242871839275222246405745257275088548364400416034343698151318117475101619, + 107030497789046847, + 64328708769633350, + 21888242871839275222246405745257275088548364400416034343698184948691845578411, + 21888242871839275222246405745257275088548364400416034343698188157900636251187, + 14632538127986158, + 21888242871839275222246405745257275088548364400416034343698162047482675086426, + 34154529164665529, + 3411252151053876, + 21888242871839275222246405745257275088548364400416034343698089181847986575923, + 21888242871839275222246405745257275088548364400416034343698115088888101469916, + 21888242871839275222246405745257275088548364400416034343698197416020578701866, + 59312869453721915, + 34671724169740812, + 21888242871839275222246405745257275088548364400416034343698140111798852126553, + 21888242871839275222246405745257275088548364400416034343698159874946952481144, + 46476858094121202, + 21888242871839275222246405745257275088548364400416034343698176933084140473429, + 21888242871839275222246405745257275088548364400416034343698183340253294133223, + 21888242871839275222246405745257275088548364400416034343698093803779788475743, + 21888242871839275222246405745257275088548364400416034343698075932073647300132, + 9358685278728098, + 21888242871839275222246405745257275088548364400416034343698091118130286321973, + 25671578973243315, + 21888242871839275222246405745257275088548364400416034343698122680155524052101, + 21888242871839275222246405745257275088548364400416034343698183618669253339317, + 137504240880834357, + 21888242871839275222246405745257275088548364400416034343698162601280480750436, + 21888242871839275222246405745257275088548364400416034343698128569995912443805, + 142657441258574212, + 96021489935002662, + 21888242871839275222246405745257275088548364400416034343698108625075775014988, + 21888242871839275222246405745257275088548364400416034343698104672061779868565, + 21888242871839275222246405745257275088548364400416034343698174852399718171377, + 51578722913075610, + 59670780711934098, + 102713940922063209, + 21888242871839275222246405745257275088548364400416034343698087442078259950806, + 66442378078288240, + 21888242871839275222246405745257275088548364400416034343698062558278679853695, + 119000987877959094, + 21888242871839275222246405745257275088548364400416034343698102815621299233163, + 21888242871839275222246405745257275088548364400416034343698078424520282055961, + 106972037864678962, + 21888242871839275222246405745257275088548364400416034343698196078939240251595, + 56331714141582870, + 21888242871839275222246405745257275088548364400416034343698090763369103398432, + 9511898041843338, + 115186744840583854, + 21888242871839275222246405745257275088548364400416034343698118153289206921322, + 27016334714223178, + 21888242871839275222246405745257275088548364400416034343698181377181139183478, + 25792011416916796, + 21888242871839275222246405745257275088548364400416034343698174431956667492285, + 21888242871839275222246405745257275088548364400416034343698079108391707335443, + 21888242871839275222246405745257275088548364400416034343698066536739098532476, + 21888242871839275222246405745257275088548364400416034343698124315173904190177, + 65801199853817998, + 21888242871839275222246405745257275088548364400416034343698072180443294316390, + 90073561720774509, + 6224893204017904, + 8607324792900048, + 82038860065558788, + 63220174906734366, + 56852072797468038, + 21888242871839275222246405745257275088548364400416034343698098371550053381572, + 21888242871839275222246405745257275088548364400416034343698103489427708783217, + 21888242871839275222246405745257275088548364400416034343698171273453645010511, + 21888242871839275222246405745257275088548364400416034343698141452163401673722, + 21888242871839275222246405745257275088548364400416034343698132125242991979971, + 21888242871839275222246405745257275088548364400416034343698100394869228107430, + 38940359910279771, + 82208756463399055, + 23767448437208598, + 21888242871839275222246405745257275088548364400416034343698121219673937990462, + 21888242871839275222246405745257275088548364400416034343698071926859248103185, + 25428385921720889, + 21888242871839275222246405745257275088548364400416034343698155467748589935283, + 21888242871839275222246405745257275088548364400416034343698200583835955776923, + 6964965687488603, + 21888242871839275222246405745257275088548364400416034343698165861715521403850, + 27879528349143159, + 103750377900190220, + 21888242871839275222246405745257275088548364400416034343698080828843056039335, + 20257526709959827, + 21888242871839275222246405745257275088548364400416034343698158967406180908342, + 42014823366645560, + 66391690874390323, + 85459155856179016, + 21888242871839275222246405745257275088548364400416034343698082023517471290079, + 21888242871839275222246405745257275088548364400416034343698124690756216101654, + 21956775142937133, + 25900142922381020, + 51386561572530782, + 138332077127657527, + 21888242871839275222246405745257275088548364400416034343698068473922976433793, + 21888242871839275222246405745257275088548364400416034343698200028112221133158, + 141543083695134070, + 27570764876611865, + 21888242871839275222246405745257275088548364400416034343698115301589511009486, + 122730189415502489, + 76683643855048582, + 124796340730281139, + 21888242871839275222246405745257275088548364400416034343698133695042656570651, + 21888242871839275222246405745257275088548364400416034343698153292014427138709, + 21888242871839275222246405745257275088548364400416034343698199033800388833203, + 21888242871839275222246405745257275088548364400416034343698129698195103099136, + 33707886710459670, + 57891703846281957, + 21888242871839275222246405745257275088548364400416034343698169252806914897411, + 21888242871839275222246405745257275088548364400416034343698202645570929220047, + 100682707112768607, + 21888242871839275222246405745257275088548364400416034343698078248363435064087, + 84913696768489105, + 130746304873787379, + 21888242871839275222246405745257275088548364400416034343698114763761671105703, + 101888623001699926, + 143980411437117165, + 21888242871839275222246405745257275088548364400416034343698150438834154520076, + 21888242871839275222246405745257275088548364400416034343698141247175672786512, + 21888242871839275222246405745257275088548364400416034343698150903225632521758, + 21888242871839275222246405745257275088548364400416034343698179140878797918930, + 82595498677731055, + 21888242871839275222246405745257275088548364400416034343698114145129703165915, + 21888242871839275222246405745257275088548364400416034343698112193005227428644, + 100599119473337255, + 129540622919399917, + 133468512435130156, + 21888242871839275222246405745257275088548364400416034343698153180456836068248, + 143172628026852906, + 134567800553402238, + 21888242871839275222246405745257275088548364400416034343698133099383488980565, + 98702870596207758, + 37790609904311479, + 21888242871839275222246405745257275088548364400416034343698086312458502272420, + 132000143457510320, + 103119049634121183, + 21888242871839275222246405745257275088548364400416034343698071275784358158217, + 121060100194860517, + 21888242871839275222246405745257275088548364400416034343698080223172644805463, + 139418711039324086, + 46137628909661106, + 21888242871839275222246405745257275088548364400416034343698187211011547567199, + 135944482741232925, + 131967128788046360, + 21888242871839275222246405745257275088548364400416034343698139605763665102877, + 8184541167204612, + 21888242871839275222246405745257275088548364400416034343698063726862895911489, + 21888242871839275222246405745257275088548364400416034343698092334696997822087, + 95190384295516350, + 21888242871839275222246405745257275088548364400416034343698201871322793868497, + 21888242871839275222246405745257275088548364400416034343698123151601589383158, + 117954125435830341, + 59036708450827, + 21888242871839275222246405745257275088548364400416034343698093149907154788524, + 71552983186234654, + 72537923405837881, + 83258978297676921, + 21888242871839275222246405745257275088548364400416034343698112918351188663371, + 21888242871839275222246405745257275088548364400416034343698187350552416973598, + 21888242871839275222246405745257275088548364400416034343698127701973363181002, + 100990907024535583, + 21888242871839275222246405745257275088548364400416034343698062890595236316898, + 21888242871839275222246405745257275088548364400416034343698095257309672048221, + 44290446602317965, + 21888242871839275222246405745257275088548364400416034343698092590226580636388, + 47882973128870127, + 46903430484252580, + 21888242871839275222246405745257275088548364400416034343698148765531374177595, + 21888242871839275222246405745257275088548364400416034343698119901725884907485, + 126310945988757176, + 136150542801730537, + 94724788479390561, + 4175180538267792, + 21888242871839275222246405745257275088548364400416034343698073231164653190573, + 99708663380227446, + 87667425525352619, + 57010315096242468, + 19406421984213905, + 124475703851945376, + 75558839042920465, + 21888242871839275222246405745257275088548364400416034343698194637070955861767, + 114048269759647891, + 21888242871839275222246405745257275088548364400416034343698161516955853508148, + 20206717301771935, + 15186285133964361, + 21888242871839275222246405745257275088548364400416034343698076458414389961878, + 21888242871839275222246405745257275088548364400416034343698135582141675942507, + 28925466425037246, + 134883190757377150, + 43719776168473335, + 21888242871839275222246405745257275088548364400416034343698072786012098935045, + 21888242871839275222246405745257275088548364400416034343698097631980112043036, + 45448065252053027, + 21888242871839275222246405745257275088548364400416034343698186221088218902629, + 21888242871839275222246405745257275088548364400416034343698101816216116197748, + 21888242871839275222246405745257275088548364400416034343698100527098213974497, + 90431945730258832, + 21888242871839275222246405745257275088548364400416034343698074176613501324254, + 21888242871839275222246405745257275088548364400416034343698097760645668298148, + 123929006371146433, + 21888242871839275222246405745257275088548364400416034343698188120852763659365, + 21888242871839275222246405745257275088548364400416034343698156964626492171102, + 21888242871839275222246405745257275088548364400416034343698147292833336245014, + 138157578195765512, + 115974526429169608, + 122810444482282018, + 21888242871839275222246405745257275088548364400416034343698170852417651925444, + 54613494749147838, + 78982310270053073, + 89030406850489736, + 66525795466837688, + 13304226255925247, + 21888242871839275222246405745257275088548364400416034343698136243069981134505, + 119373980143358991, + 5024551167422582, + 21888242871839275222246405745257275088548364400416034343698191344909320012868, + 21888242871839275222246405745257275088548364400416034343698132712054801512014, + 126053312867012768, + 21888242871839275222246405745257275088548364400416034343698105768643913553401, + 21888242871839275222246405745257275088548364400416034343698068550518969181819, + 79294379908495137, + 138535208698770614, + 55445410972229895, + 139030770762927727, + 21888242871839275222246405745257275088548364400416034343698126150388108888978, + 21888242871839275222246405745257275088548364400416034343698117115457606885651, + 21888242871839275222246405745257275088548364400416034343698094928257775870771, + 21888242871839275222246405745257275088548364400416034343698196966327723089048, + 123490693516248359, + 69442276036030802, + 99901263128586784, + 21888242871839275222246405745257275088548364400416034343698202836415851986157, + 61855039075213161, + 46241579872764600, + 21888242871839275222246405745257275088548364400416034343698084689379342541757, + 21888242871839275222246405745257275088548364400416034343698101835893180694833, + 79446395393407918, + 57820437290458187, + 24419775184911382, + 76181669026903487, + 21888242871839275222246405745257275088548364400416034343698106434679332716235, + 21888242871839275222246405745257275088548364400416034343698123449574737506533, + 21888242871839275222246405745257275088548364400416034343698086772599803191689, + 21888242871839275222246405745257275088548364400416034343698098766852187819201, + 96062291582402249, + 128140676639178358, + 21888242871839275222246405745257275088548364400416034343698107925564745573807, + 21888242871839275222246405745257275088548364400416034343698172357273595343696, + 21888242871839275222246405745257275088548364400416034343698162004369022531524, + 21888242871839275222246405745257275088548364400416034343698134475146015655021, + 21888242871839275222246405745257275088548364400416034343698084636409320881520, + 114625337013594213, + 21888242871839275222246405745257275088548364400416034343698142866337536732669, + 21888242871839275222246405745257275088548364400416034343698185424442412500553, + 21888242871839275222246405745257275088548364400416034343698090137731707225432, + 87195378587990201, + 13642647213832892, + 62272962886917403, + 94697859407128072, + 70330444177295628, + 97427973133326096, + 13184078872876233, + 21888242871839275222246405745257275088548364400416034343698161238590363987649, + 21888242871839275222246405745257275088548364400416034343698091463416311834274, + 115287120368827322, + 21888242871839275222246405745257275088548364400416034343698180138240699011882, + 21888242871839275222246405745257275088548364400416034343698167319297122584755, + 58018408157842846, + 89572233696188404, + 21888242871839275222246405745257275088548364400416034343698069932544141733656, + 21888242871839275222246405745257275088548364400416034343698167612231995899983, + 52839681342715895, + 53414062340741880, + 21888242871839275222246405745257275088548364400416034343698119520946341322482, + 1327713751629657, + 112001417487513759, + 21888242871839275222246405745257275088548364400416034343698172491170735648286, + 21888242871839275222246405745257275088548364400416034343698089940258426803069, + 25794946591531507, + 21888242871839275222246405745257275088548364400416034343698185327375672304536, + 63577468499020385, + 64989407263260415, + 126979311794712468, + 66217929668481966, + 21888242871839275222246405745257275088548364400416034343698131496299534824077, + 21888242871839275222246405745257275088548364400416034343698158019502288456230, + 21888242871839275222246405745257275088548364400416034343698072108859633987919, + 21888242871839275222246405745257275088548364400416034343698065403455394490601, + 106139319292774785, + 21888242871839275222246405745257275088548364400416034343698120441886332552844, + 21888242871839275222246405745257275088548364400416034343698172970499956089979, + 21888242871839275222246405745257275088548364400416034343698085170814249953568, + 57113715129901692, + 21888242871839275222246405745257275088548364400416034343698143591445023129957, + 21888242871839275222246405745257275088548364400416034343698177760869136598415, + 21888242871839275222246405745257275088548364400416034343698087541637383977162, + 21888242871839275222246405745257275088548364400416034343698071811530207881000, + 21888242871839275222246405745257275088548364400416034343698200997330842253565, + 130703697320710374, + 71484439854982919, + 21888242871839275222246405745257275088548364400416034343698096844390830755722, + 21888242871839275222246405745257275088548364400416034343698181809941455497888, + 47405259752378900, + 139998822548730607, + 21888242871839275222246405745257275088548364400416034343698173710339103182322, + 21888242871839275222246405745257275088548364400416034343698131680287570818647, + 105078725363304199, + 21888242871839275222246405745257275088548364400416034343698139797618324887990, + 60709943977947955, + 130550479202883443, + 74458351357673070, + 21888242871839275222246405745257275088548364400416034343698178084003059090643, + 21888242871839275222246405745257275088548364400416034343698135333739842171938, + 60535947818582330, + 14535085761796877, + 29828366096870079, + 21888242871839275222246405745257275088548364400416034343698198072908397331305, + 21888242871839275222246405745257275088548364400416034343698187296140376876760, + 21888242871839275222246405745257275088548364400416034343698094276457751284149, + 21888242871839275222246405745257275088548364400416034343698165257943976794348, + 32090273937592710, + 21888242871839275222246405745257275088548364400416034343698191548134286036693, + 21888242871839275222246405745257275088548364400416034343698077615021683230351, + 9234382035893709, + 26307876738645745, + 21888242871839275222246405745257275088548364400416034343698196857113553533779, + 21888242871839275222246405745257275088548364400416034343698184356366515561998, + 62250760649310854, + 21888242871839275222246405745257275088548364400416034343698172710370969441919, + 120284762515583497, + 27507498602347274, + 113895293080451066, + 53688007367385205, + 134519927367088991, + 137500477233544585, + 128699010632295300, + 21888242871839275222246405745257275088548364400416034343698168418223229132992, + 21888242871839275222246405745257275088548364400416034343698111786286753876507, + 128270205027756118, + 21888242871839275222246405745257275088548364400416034343698202650121513210369, + 21888242871839275222246405745257275088548364400416034343698180807931906133111, + 73772523482937826, + 21888242871839275222246405745257275088548364400416034343698133187547532229140, + 75063295063275720, + 21888242871839275222246405745257275088548364400416034343698173528540759643156, + 21888242871839275222246405745257275088548364400416034343698189537925281843947, + 21888242871839275222246405745257275088548364400416034343698102529270793206390, + 21888242871839275222246405745257275088548364400416034343698161258217904721842, + 10425351281067198, + 21888242871839275222246405745257275088548364400416034343698134780823570502977, + 142267951557503650, + 56294382268909739, + 44266715648165566, + 21888242871839275222246405745257275088548364400416034343698184524711129330226, + 21888242871839275222246405745257275088548364400416034343698158110203636448683, + 21888242871839275222246405745257275088548364400416034343698189939656179974133, + 21888242871839275222246405745257275088548364400416034343698093789277873409972, + 21888242871839275222246405745257275088548364400416034343698117994397030872858, + 21888242871839275222246405745257275088548364400416034343698167411145274254533, + 129946782217595874, + 21888242871839275222246405745257275088548364400416034343698061931133611132576, + 21888242871839275222246405745257275088548364400416034343698091815642897523805, + 105705860179780669, + 21888242871839275222246405745257275088548364400416034343698078926064938085774, + 21888242871839275222246405745257275088548364400416034343698196761220777373895, + 106613149220057304, + 21888242871839275222246405745257275088548364400416034343698116850763061957620, + 21888242871839275222246405745257275088548364400416034343698172290670224610476, + 5154814643314479, + 21888242871839275222246405745257275088548364400416034343698129643052219445359, + 93586535512896830, + 21888242871839275222246405745257275088548364400416034343698088748705092106910, + 21888242871839275222246405745257275088548364400416034343698132882871138577032, + 21888242871839275222246405745257275088548364400416034343698063957427711269011, + 21888242871839275222246405745257275088548364400416034343698163849524213834836, + 88312678507547783, + 21888242871839275222246405745257275088548364400416034343698153327327039587039, + 80193839911271290, + 21888242871839275222246405745257275088548364400416034343698178022883321243654, + 26520015079133551, + 110868038042258787, + 21888242871839275222246405745257275088548364400416034343698072928719934018962, + 111922477566748142, + 115212505065112461, + 21888242871839275222246405745257275088548364400416034343698164258749228982987, + 140941587950033049, + 5419790462042076, + 21888242871839275222246405745257275088548364400416034343698182229139359894610, + 136378356799201456, + 123113572977134872, + 129891653547761210, + 13239521261424529, + 86169909162304100, + 21888242871839275222246405745257275088548364400416034343698087382890737546528, + 21888242871839275222246405745257275088548364400416034343698164612302813479203, + 52932606196843697, + 79388376611996817, + 21888242871839275222246405745257275088548364400416034343698093810325049214461, + 21888242871839275222246405745257275088548364400416034343698157095069277708472, + 91432204729265587, + 33360479058105682, + 21888242871839275222246405745257275088548364400416034343698194082451558208233, + 21888242871839275222246405745257275088548364400416034343698202340813440142663, + 99499640144599610, + 118297117815355418, + 59833639620879968, + 21888242871839275222246405745257275088548364400416034343698189279099128394486, + 32927997656353914, + 21888242871839275222246405745257275088548364400416034343698152167915345435662, + 21888242871839275222246405745257275088548364400416034343698076848599017389631, + 66236881204285660, + 21888242871839275222246405745257275088548364400416034343698088674467584428937, + 90558939837260855, + 21888242871839275222246405745257275088548364400416034343698130721651705574898, + 73122508204555692, + 49419658116036532, + 109531402603710846, + 66409776493108207, + 43887325753089426, + 93957298063640140, + 33242008091498216, + 21888242871839275222246405745257275088548364400416034343698125056355853959993, + 89861093919005748, + 21888242871839275222246405745257275088548364400416034343698157451819799966988, + 35134127824389684, + 21888242871839275222246405745257275088548364400416034343698068961304433996100, + 61981514210233235, + 21888242871839275222246405745257275088548364400416034343698086269589457576335, + 21888242871839275222246405745257275088548364400416034343698063945157741760549, + 44597500105596469, + 1230052992145763, + 21888242871839275222246405745257275088548364400416034343698155259139360266233, + 21888242871839275222246405745257275088548364400416034343698161656862356901793, + 26608045143333727, + 21888242871839275222246405745257275088548364400416034343698075587782721928407, + 21888242871839275222246405745257275088548364400416034343698132371359619447341, + 21888242871839275222246405745257275088548364400416034343698106565430997786384, + 21888242871839275222246405745257275088548364400416034343698122142124987544174, + 21888242871839275222246405745257275088548364400416034343698108866785917288256, + 21888242871839275222246405745257275088548364400416034343698198200938774124112, + 73580698232717442, + 21888242871839275222246405745257275088548364400416034343698095145050262416657, + 138126337286007932, + 143794177090574690, + 106131145998923053, + 21888242871839275222246405745257275088548364400416034343698125931398757751386, + 25037148733179105, + 12707158178248075, + 37380352880477269, + 21888242871839275222246405745257275088548364400416034343698070088205651460536, + 87761223320508606, + 18418363941350435, + 21888242871839275222246405745257275088548364400416034343698203233635021635917, + 38564154180833085, + 120363152103029080, + 60595239065623039, + 52058850114526190, + 10761385012642766, + 137702911442557778, + 21888242871839275222246405745257275088548364400416034343698114116765660531203, + 21888242871839275222246405745257275088548364400416034343698194739826470717999, + 21888242871839275222246405745257275088548364400416034343698114461799235357005, + 21888242871839275222246405745257275088548364400416034343698124092101861951103, + 21888242871839275222246405745257275088548364400416034343698108164876539493899, + 21888242871839275222246405745257275088548364400416034343698158396872644002636, + 21888242871839275222246405745257275088548364400416034343698165247940204932624, + 21888242871839275222246405745257275088548364400416034343698121168474109670927, + 36709500666049366, + 142831328897994323, + 63684458271616724, + 107462740200997443, + 21888242871839275222246405745257275088548364400416034343698157237195785200277, + 83947014825062347, + 123512639529153753, + 108018636039665096, + 131787166052299611, + 21888242871839275222246405745257275088548364400416034343698084307706896262956, + 21888242871839275222246405745257275088548364400416034343698148080555065794305, + 21888242871839275222246405745257275088548364400416034343698060298052863115217, + 114326593129077665, + 21888242871839275222246405745257275088548364400416034343698169774731746832548, + 21888242871839275222246405745257275088548364400416034343698114087917173156930, + 21888242871839275222246405745257275088548364400416034343698121452081856065893, + 21888242871839275222246405745257275088548364400416034343698136680053225577187, + 21888242871839275222246405745257275088548364400416034343698190069045565078700, + 144501966798622, + 45829590817558226, + 21888242871839275222246405745257275088548364400416034343698198631223434056899, + 21888242871839275222246405745257275088548364400416034343698122205212081811411, + 21888242871839275222246405745257275088548364400416034343698065446026033386522, + 124108689492569153, + 21888242871839275222246405745257275088548364400416034343698079351426338416215, + 21888242871839275222246405745257275088548364400416034343698070799520362847349, + 21888242871839275222246405745257275088548364400416034343698185111971442325626, + 66391270642820095, + 66749166691527096, + 21888242871839275222246405745257275088548364400416034343698091485261994258475, + 106888125648705190, + 21888242871839275222246405745257275088548364400416034343698172353214738346687, + 21888242871839275222246405745257275088548364400416034343698153860439597329787, + 115158499451050544, + 21888242871839275222246405745257275088548364400416034343698155057431877587669, + 21888242871839275222246405745257275088548364400416034343698138229338724342427, + 21888242871839275222246405745257275088548364400416034343698113729738850970032, + 21888242871839275222246405745257275088548364400416034343698137742260828881731, + 21888242871839275222246405745257275088548364400416034343698071777891152522381, + 90066420933050974, + 21888242871839275222246405745257275088548364400416034343698172705837905099638, + 21888242871839275222246405745257275088548364400416034343698196182447491630527, + 138003381416630806, + 32717611484960868, + 105414705627370773, + 21888242871839275222246405745257275088548364400416034343698187040499699798463, + 114585480490050241, + 21888242871839275222246405745257275088548364400416034343698144215133839302065, + 93409619626269236, + 21888242871839275222246405745257275088548364400416034343698126530279569310156, + 87449305992545426, + 14896946166454555, + 21888242871839275222246405745257275088548364400416034343698111950633689714487, + 137859998137784931, + 21888242871839275222246405745257275088548364400416034343698202846062831545496, + 21888242871839275222246405745257275088548364400416034343698096916359692953825, + 21888242871839275222246405745257275088548364400416034343698121056836821663292, + 53235362715430615, + 21888242871839275222246405745257275088548364400416034343698155816550575741751, + 28215789388257921, + 21888242871839275222246405745257275088548364400416034343698168833406923776928, + 21888242871839275222246405745257275088548364400416034343698066751500079059929, + 65358393783671741, + 21888242871839275222246405745257275088548364400416034343698173695310105324752, + 21888242871839275222246405745257275088548364400416034343698067272185268598836, + 60529026837377450, + 29674539364105665, + 21888242871839275222246405745257275088548364400416034343698195204724800759615, + 21888242871839275222246405745257275088548364400416034343698154692924180086031, + 110765849337462093, + 103367430031695683, + 82493452346907106, + 21888242871839275222246405745257275088548364400416034343698198166600691321637, + 21888242871839275222246405745257275088548364400416034343698132706595267436379, + 21888242871839275222246405745257275088548364400416034343698080797772357451127, + 17985335412475440, + 21888242871839275222246405745257275088548364400416034343698171645645753213772, + 21888242871839275222246405745257275088548364400416034343698066664130333249026, + 21888242871839275222246405745257275088548364400416034343698076583013015127152, + 21888242871839275222246405745257275088548364400416034343698203578405407285756, + 47176627953909083, + 122116962736573177, + 21888242871839275222246405745257275088548364400416034343698162935029408170552, + 105971266049255439, + 21888242871839275222246405745257275088548364400416034343698198432630875224554, + 21888242871839275222246405745257275088548364400416034343698165336510734426130, + 21888242871839275222246405745257275088548364400416034343698110306699727772622, + 50111108225240473, + 21888242871839275222246405745257275088548364400416034343698174455295913935588, + 6956825076110427, + 115284022214446602, + 7868170925884808, + 21888242871839275222246405745257275088548364400416034343698183184734503283916, + 21888242871839275222246405745257275088548364400416034343698171674615435514752, + 97769939447268794, + 86459214094780712, + 21888242871839275222246405745257275088548364400416034343698164721803210300009, + 21888242871839275222246405745257275088548364400416034343698095255264532669684, + 21888242871839275222246405745257275088548364400416034343698149994632841110447, + 21888242871839275222246405745257275088548364400416034343698088693638504801316, + 21888242871839275222246405745257275088548364400416034343698143305120439296816, + 21888242871839275222246405745257275088548364400416034343698161865377843228867, + 135464054484601720, + 45690192692626627, + 21888242871839275222246405745257275088548364400416034343698151677127619402065, + 21888242871839275222246405745257275088548364400416034343698161285255543426312, + 116797520065694584, + 21888242871839275222246405745257275088548364400416034343698199355174216495395, + 21888242871839275222246405745257275088548364400416034343698142088415911126276, + 21888242871839275222246405745257275088548364400416034343698161563316611937894, + 21888242871839275222246405745257275088548364400416034343698063028746909716863, + 21888242871839275222246405745257275088548364400416034343698170627473045855849, + 21888242871839275222246405745257275088548364400416034343698148255946206249187, + 21888242871839275222246405745257275088548364400416034343698105807552859432265, + 20140010488795753, + 21888242871839275222246405745257275088548364400416034343698188468938816840614, + 21888242871839275222246405745257275088548364400416034343698100308465293857938, + 87732938871386453, + 100226850328394912, + 24222451093399961, + 113978136788904423, + 21888242871839275222246405745257275088548364400416034343698090076648888276995, + 76936440260650459, + 124861726141188778, + 21888242871839275222246405745257275088548364400416034343698199259325699409096, + 21888242871839275222246405745257275088548364400416034343698171807554181176329, + 21888242871839275222246405745257275088548364400416034343698107986148191290832, + 90208531361114900, + 1322335942914066, + 21888242871839275222246405745257275088548364400416034343698153450820477657574, + 103754107125555906, + 21888242871839275222246405745257275088548364400416034343698073706997517903570, + 16066736004010823, + 72913196189859052, + 132917016641285792, + 51210655884491557, + 21888242871839275222246405745257275088548364400416034343698070832665035371129, + 21888242871839275222246405745257275088548364400416034343698065542294844820783, + 21888242871839275222246405745257275088548364400416034343698099165705170341961, + 21888242871839275222246405745257275088548364400416034343698198224965032880276, + 39613178404505889, + 96174235962227773, + 45147200530246937, + 21888242871839275222246405745257275088548364400416034343698092464804685078307, + 94223750142895263, + 138691879869984926, + 124339694496622659, + 21888242871839275222246405745257275088548364400416034343698119606321906340907, + 21888242871839275222246405745257275088548364400416034343698161908413549126193, + 96480325696173130, + 113699920052147370, + 21888242871839275222246405745257275088548364400416034343698131296277012194549, + 132236317916249857, + 21888242871839275222246405745257275088548364400416034343698125012442799721874, + 92236780277568102, + 90650049874642797, + 21888242871839275222246405745257275088548364400416034343698189496104261475649, + 61789413012149494, + 129504546931450640, + 88218320750000502, + 21888242871839275222246405745257275088548364400416034343698088247976104955136, + 21888242871839275222246405745257275088548364400416034343698130987827396553432, + 21888242871839275222246405745257275088548364400416034343698073277098306305233, + 21888242871839275222246405745257275088548364400416034343698177813273425483959, + 99404972332111376, + 121758660616048778, + 110275129005948928, + 19959813209457670, + 50057774038072886, + 21888242871839275222246405745257275088548364400416034343698069594677276693104, + 44058211868308675, + 135802499898765334, + 9970402285669953, + 75496031125482266, + 120342358047347476, + 21888242871839275222246405745257275088548364400416034343698164213731899722338, + 62296554918841494, + 29617236005318421, + 21888242871839275222246405745257275088548364400416034343698100190321801893332, + 21888242871839275222246405745257275088548364400416034343698126158482642204427, + 47316593790781200, + 63451982700768980, + 100538887608295125, + 21888242871839275222246405745257275088548364400416034343698132262803432266412, + 139074616895882921, + 21888242871839275222246405745257275088548364400416034343698194556911623285810, + 102102648341104009, + 21365542002367936, + 33245366761602753, + 21888242871839275222246405745257275088548364400416034343698137422365570265094, + 91289100430116979, + 21888242871839275222246405745257275088548364400416034343698091650418696940451, + 21888242871839275222246405745257275088548364400416034343698194660078127162750, + 21888242871839275222246405745257275088548364400416034343698114297100454323946, + 21888242871839275222246405745257275088548364400416034343698109449013744385462, + 6408262263326201, + 21888242871839275222246405745257275088548364400416034343698187431881888750384, + 6571262628509081, + 32565888708830923, + 3583811136938857, + 94939214749593673, + 21888242871839275222246405745257275088548364400416034343698165661760322379263, + 64690946736434063, + 32681140217594131, + 21888242871839275222246405745257275088548364400416034343698187709759780861381, + 45311688178486302, + 110577483334447570, + 38676866847926998, + 20162823595551875, + 56836538721275068, + 21888242871839275222246405745257275088548364400416034343698184096165229447904, + 21888242871839275222246405745257275088548364400416034343698139878808576442726, + 21888242871839275222246405745257275088548364400416034343698105769475916954939, + 139495713417450496, + 21888242871839275222246405745257275088548364400416034343698171604135439025477, + 21888242871839275222246405745257275088548364400416034343698074178973315249976, + 21888242871839275222246405745257275088548364400416034343698110302395452161035, + 21888242871839275222246405745257275088548364400416034343698172715915427152482, + 41035645998303052, + 140730159897130347, + 21888242871839275222246405745257275088548364400416034343698144640280733835063, + 107759436531764908, + 21888242871839275222246405745257275088548364400416034343698105408059412527508, + 88752470421845598, + 14029729957029759, + 21888242871839275222246405745257275088548364400416034343698061653396907787623, + 21888242871839275222246405745257275088548364400416034343698106715071945302180, + 21888242871839275222246405745257275088548364400416034343698122387210947829877, + 123263948651423932, + 53486615351432920, + 67580248051867673, + 21888242871839275222246405745257275088548364400416034343698128408961873028285, + 21888242871839275222246405745257275088548364400416034343698185882559947206668, + 14771200458442992, + 78350730055953452, + 106122848009007862, + 143254590172783434, + 21888242871839275222246405745257275088548364400416034343698107019657244653499, + 21888242871839275222246405745257275088548364400416034343698150465025072769901, + 21888242871839275222246405745257275088548364400416034343698073812401230255308, + 136277254454088221, + 33671851493328562, + 15248719841563318, + 21888242871839275222246405745257275088548364400416034343698066159236411426667, + 21888242871839275222246405745257275088548364400416034343698167357901868786004, + 21888242871839275222246405745257275088548364400416034343698167519821172978603, + 24901104213028857, + 21888242871839275222246405745257275088548364400416034343698089056107705632518, + 124018630315009292, + 21888242871839275222246405745257275088548364400416034343698126940876315475774, + 87286457947977664, + 21888242871839275222246405745257275088548364400416034343698072317969684401522, + 21888242871839275222246405745257275088548364400416034343698188837485718353430, + 71588618392063883, + 21888242871839275222246405745257275088548364400416034343698164688123500933276, + 21888242871839275222246405745257275088548364400416034343698066517801569830329, + 21888242871839275222246405745257275088548364400416034343698127884293129923818, + 21888242871839275222246405745257275088548364400416034343698092064876212650906, + 21888242871839275222246405745257275088548364400416034343698118527584141564152, + 96337645276211625, + 119883062132730943, + 100812249070509852, + 21888242871839275222246405745257275088548364400416034343698152570081439630376, + 21888242871839275222246405745257275088548364400416034343698093849999480005954, + 55683098152834054, + 39279891383876048, + 2377179556888346, + 21888242871839275222246405745257275088548364400416034343698188531604459053677, + 21888242871839275222246405745257275088548364400416034343698099273701872704827, + 69599558814215767, + 21888242871839275222246405745257275088548364400416034343698091776276562564615, + 21888242871839275222246405745257275088548364400416034343698070983921981820514, + 7597209438112969, + 65212526967759781, + 21888242871839275222246405745257275088548364400416034343698158555067849764760, + 21888242871839275222246405745257275088548364400416034343698162876359885184730, + 142217332453038116, + 21888242871839275222246405745257275088548364400416034343698163207048056025063, + 136132511593148413, + 98620091484530573, + 21888242871839275222246405745257275088548364400416034343698165187376865986204, + 21888242871839275222246405745257275088548364400416034343698086765185883891896, + 21888242871839275222246405745257275088548364400416034343698089080915049287601, + 134609007600750251, + 65790515121853256, + 69502044221068292, + 50507347880176879, + 21888242871839275222246405745257275088548364400416034343698063059122769005515, + 50363958030422602, + 21888242871839275222246405745257275088548364400416034343698080612385714241260, + 54072798231488215, + 21888242871839275222246405745257275088548364400416034343698181740409043430930, + 123486499544784735, + 21888242871839275222246405745257275088548364400416034343698070181529210845658, + 21888242871839275222246405745257275088548364400416034343698155091100722248038, + 38869466385018459, + 21888242871839275222246405745257275088548364400416034343698097527128596079368, + 21888242871839275222246405745257275088548364400416034343698128541024750391027, + 81051296558583337, + 21888242871839275222246405745257275088548364400416034343698129378179418372629, + 124717577240485031, + 128564820776369555, + 38194323856553825, + 21888242871839275222246405745257275088548364400416034343698117176631167553449, + 48842616512902435, + 21888242871839275222246405745257275088548364400416034343698090994004648658760, + 94893917700314759, + 88220370872135585, + 120805829925313107, + 21888242871839275222246405745257275088548364400416034343698115022421641562923, + 26035562304095851, + 21888242871839275222246405745257275088548364400416034343698171479360624306722, + 21888242871839275222246405745257275088548364400416034343698123491663708160311, + 21888242871839275222246405745257275088548364400416034343698082111129766465391, + 21888242871839275222246405745257275088548364400416034343698195738991444902767, + 4278119430411503, + 21888242871839275222246405745257275088548364400416034343698103449758403167389, + 124491364317828929, + 64271456958284368, + 21888242871839275222246405745257275088548364400416034343698121575359331099256, + 61823739596453253, + 94505459704234341, + 42522932711804599, + 21888242871839275222246405745257275088548364400416034343698188773349487240315, + 21888242871839275222246405745257275088548364400416034343698123574533636294736, + 21888242871839275222246405745257275088548364400416034343698083953530289700386, + 113231158370913444, + 139698286125516922, + 19643392071230715, + 2110040658819948, + 14661595205500443, + 129960331725408877, + 21888242871839275222246405745257275088548364400416034343698086396477673458239, + 82617898237668436, + 21888242871839275222246405745257275088548364400416034343698113782171729407508, + 69082265511350117, + 80059521648122970, + 89095552482629460, + 31290008580906412, + 87531335037746226, + 21888242871839275222246405745257275088548364400416034343698145853133312288971, + 21888242871839275222246405745257275088548364400416034343698173399455235772452, + 120036788908178021, + 62409898359337872, + 21888242871839275222246405745257275088548364400416034343698159552451478015283, + 21888242871839275222246405745257275088548364400416034343698064289371043434095, + 65693153806337510, + 127186105745517644, + 21888242871839275222246405745257275088548364400416034343698184734739004461854, + 21888242871839275222246405745257275088548364400416034343698091224156563592121, + 114485170554119533, + 126250873705339692, + 89948542540681674, + 12114845697542, + 97931181533836967, + 141210676915303862, + 21888242871839275222246405745257275088548364400416034343698072509155570584255, + 21888242871839275222246405745257275088548364400416034343698169788094494954639, + 21888242871839275222246405745257275088548364400416034343698165777521462916125, + 21888242871839275222246405745257275088548364400416034343698128116670497668678, + 21888242871839275222246405745257275088548364400416034343698142809931702113498, + 129940426957290775, + 103100846625932220, + 21888242871839275222246405745257275088548364400416034343698093341166695224279, + 21888242871839275222246405745257275088548364400416034343698064916013607092590, + 16144665620315002, + 121765574700016308, + 124273742336338862, + 139885417147513109, + 21888242871839275222246405745257275088548364400416034343698152004657837700358, + 122347299896853367, + 2428477224543136, + 120695770541561689, + 21888242871839275222246405745257275088548364400416034343698201101721329523277, + 104809868875460327, + 21888242871839275222246405745257275088548364400416034343698156962966351775691, + 21888242871839275222246405745257275088548364400416034343698189818122688987453, + 22680186785598628, + 29699283598690498, + 35717013217859417, + 72325970872666440, + 21888242871839275222246405745257275088548364400416034343698088969781539169661, + 21888242871839275222246405745257275088548364400416034343698085881109907351324, + 21888242871839275222246405745257275088548364400416034343698063301302995014359, + 126675645026403795, + 21888242871839275222246405745257275088548364400416034343698177128833371056321, + 4001204168818291, + 2464229566646365, + 106633295277169178, + 22063780980654883, + 16528946134897629, + 14022041921920717, + 21888242871839275222246405745257275088548364400416034343698159872511556641305, + 21888242871839275222246405745257275088548364400416034343698094637086324540719, + 21888242871839275222246405745257275088548364400416034343698186407476904528638, + 71864448465858706, + 21888242871839275222246405745257275088548364400416034343698112959245772352349, + 121747924996995429, + 21888242871839275222246405745257275088548364400416034343698163624895510030243, + 72904900104895670, + 21888242871839275222246405745257275088548364400416034343698174337504639124891, + 46083621199156708, + 21888242871839275222246405745257275088548364400416034343698119928337631851912, + 21888242871839275222246405745257275088548364400416034343698124203860092623439, + 21888242871839275222246405745257275088548364400416034343698193972112101965738, + 21888242871839275222246405745257275088548364400416034343698130331725913793566, + 124856097696414909, + 66458084346428826, + 56530254136703471, + 21888242871839275222246405745257275088548364400416034343698066106202055940334, + 21888242871839275222246405745257275088548364400416034343698126219002676936392, + 91872208592771164, + 50630252143949349, + 31368547466785882, + 106042769412837219, + 58826349229628755, + 21888242871839275222246405745257275088548364400416034343698085258204001205906, + 21888242871839275222246405745257275088548364400416034343698075344208567639574, + 2998030879754293, + 21888242871839275222246405745257275088548364400416034343698151171731210456064, + 104045930971982214, + 21888242871839275222246405745257275088548364400416034343698077797810969295888, + 21888242871839275222246405745257275088548364400416034343698122271928807398168, + 21888242871839275222246405745257275088548364400416034343698062879020844995978, + 21888242871839275222246405745257275088548364400416034343698199813237699425997, + 21888242871839275222246405745257275088548364400416034343698159024410611680151, + 136312265067715615, + 133747710691046351, + 21888242871839275222246405745257275088548364400416034343698077517090430971774, + 11669811852932051, + 57679345408899356, + 49307373688307171, + 21888242871839275222246405745257275088548364400416034343698172809096531404022, + 25718934941881115, + 136827168359237103, + 21888242871839275222246405745257275088548364400416034343698119575075472743846, + 21888242871839275222246405745257275088548364400416034343698098942995229267305, + 14739608607280535, + 90538791594804322, + 21888242871839275222246405745257275088548364400416034343698185161754022042940, + 137468971136414121, + 21888242871839275222246405745257275088548364400416034343698177836680721324178, + 21888242871839275222246405745257275088548364400416034343698179065246793766016, + 18126533727931309, + 21888242871839275222246405745257275088548364400416034343698129062847678230861, + 21888242871839275222246405745257275088548364400416034343698201612611147983938, + 21888242871839275222246405745257275088548364400416034343698169906957787234537, + 21888242871839275222246405745257275088548364400416034343698145508573870426453, + 21888242871839275222246405745257275088548364400416034343698080432168461324500, + 26909985351713484, + 21888242871839275222246405745257275088548364400416034343698133005849949747442, + 46652392190919610, + 21888242871839275222246405745257275088548364400416034343698178125025354009409, + 21888242871839275222246405745257275088548364400416034343698140173109331278723, + 109583042617126745, + 78707278633667627, + 21888242871839275222246405745257275088548364400416034343698198696482420062610, + 21888242871839275222246405745257275088548364400416034343698138403267604379914, + 21888242871839275222246405745257275088548364400416034343698087293362741675011, + 125358178701443234, + 21888242871839275222246405745257275088548364400416034343698195251793273259766, + 29913003135690863, + 21888242871839275222246405745257275088548364400416034343698170448020529279606, + 21888242871839275222246405745257275088548364400416034343698157519498099906256, + 21888242871839275222246405745257275088548364400416034343698137463951845653165, + 21888242871839275222246405745257275088548364400416034343698120918640900265013, + 120633122665531723, + 103454018362420325, + 21888242871839275222246405745257275088548364400416034343698194652396886659045, + 10366221287673707, + 72737542135130608, + 106249861410153704, + 21888242871839275222246405745257275088548364400416034343698203968242768547266, + 16547857139571558, + 21888242871839275222246405745257275088548364400416034343698068238122267864627, + 71903409097000075, + 119861089981290376, + 45252428657507920, + 87793476905186886, + 21888242871839275222246405745257275088548364400416034343698180476648090744445, + 21888242871839275222246405745257275088548364400416034343698180904128399498015, + 21888242871839275222246405745257275088548364400416034343698145682350687564271, + 91604738593168326, + 21888242871839275222246405745257275088548364400416034343698122908691133364221, + 21888242871839275222246405745257275088548364400416034343698064033798341482681, + 21888242871839275222246405745257275088548364400416034343698151429675858792771, + 6387695517152879, + 21888242871839275222246405745257275088548364400416034343698083891953384031838, + 21888242871839275222246405745257275088548364400416034343698152613413979510257, + 30923245294131507, + 21888242871839275222246405745257275088548364400416034343698189924585414241483, + 82091617948693986, + 95299349524052413, + 92691990913596603, + 133662800616657670, + 40696174615695422, + 9879687119228250, + 22680707148410914, + 91149660876822661, + 21888242871839275222246405745257275088548364400416034343698076460357737041625, + 21888242871839275222246405745257275088548364400416034343698174811212158110550, + 114801067276271941, + 21888242871839275222246405745257275088548364400416034343698111343230862331174, + 21888242871839275222246405745257275088548364400416034343698072977526515389724, + 21888242871839275222246405745257275088548364400416034343698105830622847142693, + 21888242871839275222246405745257275088548364400416034343698080221021979868360, + 58243716344238585, + 123518003437724283, + 2086324888395017, + 45062881864088276, + 99812098185572518, + 21888242871839275222246405745257275088548364400416034343698096599637855596750, + 21888242871839275222246405745257275088548364400416034343698077459941931662409, + 21888242871839275222246405745257275088548364400416034343698172872975944398144, + 21888242871839275222246405745257275088548364400416034343698103479971888551764, + 120150834254202798, + 21888242871839275222246405745257275088548364400416034343698125423733285781481, + 93395354687250713, + 21888242871839275222246405745257275088548364400416034343698187009451908504078, + 81025825227863746, + 140460606668659746, + 21888242871839275222246405745257275088548364400416034343698190703611388590585, + 21888242871839275222246405745257275088548364400416034343698165473311009585421, + 21652219136989412, + 106837170829677565, + 21888242871839275222246405745257275088548364400416034343698111889969842053785, + 21888242871839275222246405745257275088548364400416034343698135237192464097935, + 19991653066465062, + 139433671691715890, + 95799349416691827, + 21888242871839275222246405745257275088548364400416034343698092709087693297140, + 21888242871839275222246405745257275088548364400416034343698104481888351489830, + 21888242871839275222246405745257275088548364400416034343698190095478374201901, + 63054700655868024, + 21888242871839275222246405745257275088548364400416034343698167344628788215422, + 21888242871839275222246405745257275088548364400416034343698078352139124907608, + 21888242871839275222246405745257275088548364400416034343698064813672047532488, + 39992547713128879, + 6488452021179020, + 21888242871839275222246405745257275088548364400416034343698162148246803909196, + 103167361871431892, + 21888242871839275222246405745257275088548364400416034343698066794958826721858, + 21888242871839275222246405745257275088548364400416034343698167509152917448369, + 21888242871839275222246405745257275088548364400416034343698128213449232449556, + 21888242871839275222246405745257275088548364400416034343698090188797356449674, + 15918350185835455, + 138523654512306735, + 117990445643349480, + 87761892906693838, + 134782552439007568, + 21888242871839275222246405745257275088548364400416034343698142206147271744613, + 78697527588337574, + 69155775268069550, + 21888242871839275222246405745257275088548364400416034343698127958575632780976, + 52171026552383611, + 24423338580597218, + 84349329471729464, + 21888242871839275222246405745257275088548364400416034343698129745506548049504, + 21888242871839275222246405745257275088548364400416034343698156623374177928343, + 21888242871839275222246405745257275088548364400416034343698083024183771660312, + 39516427496397995, + 13304109322796962, + 21888242871839275222246405745257275088548364400416034343698166201236802838914, + 21888242871839275222246405745257275088548364400416034343698144752570590384267, + 82517435875224481, + 18005704448887138, + 21888242871839275222246405745257275088548364400416034343698101268410189663757, + 21888242871839275222246405745257275088548364400416034343698060676479077414158, + 21888242871839275222246405745257275088548364400416034343698160547086910463899, + 132786088658633453, + 78138286482090303, + 21888242871839275222246405745257275088548364400416034343698180835950906535534, + 103964683175860394, + 21997401339921819, + 21888242871839275222246405745257275088548364400416034343698143327515050620519, + 21888242871839275222246405745257275088548364400416034343698120013641625638117, + 8161008485503028, + 21888242871839275222246405745257275088548364400416034343698179829068451126306, + 113397214625416613, + 58565168881869968, + 125224445755684375, + 21888242871839275222246405745257275088548364400416034343698067973667556116932, + 113131578645913359, + 21888242871839275222246405745257275088548364400416034343698178107070765116797, + 51194113804870960, + 21888242871839275222246405745257275088548364400416034343698121059065373805649, + 21888242871839275222246405745257275088548364400416034343698100087774238752008, + 21888242871839275222246405745257275088548364400416034343698137451900145316229, + 21888242871839275222246405745257275088548364400416034343698129322554320701765, + 23809976908913080, + 86810086312653435, + 21888242871839275222246405745257275088548364400416034343698137314034083569322, + 124961273228632324, + 63789050723250637, + 21888242871839275222246405745257275088548364400416034343698080042492494170200, + 54088543117397546, + 124832707738374676, + 109865544952281369, + 55713124404806909, + 107421925988134889, + 110114732534658673, + 21888242871839275222246405745257275088548364400416034343698189389527465790876, + 114688984370540175, + 63852276662687237, + 21888242871839275222246405745257275088548364400416034343698072401924396525709, + 137716180295800791, + 126194077321383042, + 21888242871839275222246405745257275088548364400416034343698089238299572007290, + 132422851924935245, + 21888242871839275222246405745257275088548364400416034343698180800246610672992, + 141210567010281472, + 21888242871839275222246405745257275088548364400416034343698153523481910340602, + 27143307303312692, + 8215362934865155, + 119496988776932627, + 25819326324484375, + 38160613478267738, + 101902296351230662, + 32231263960728742, + 21888242871839275222246405745257275088548364400416034343698109983158693037408, + 27680278751221491, + 21888242871839275222246405745257275088548364400416034343698100108055551875824, + 21888242871839275222246405745257275088548364400416034343698084842528347667960, + 36377964313976188, + 21888242871839275222246405745257275088548364400416034343698147643601680005562, + 130167166252182458, + 48071888845121714, + 66266003785826020, + 107985757110671236, + 21888242871839275222246405745257275088548364400416034343698201339565201247792, + 21888242871839275222246405745257275088548364400416034343698153782869747520260, + 21888242871839275222246405745257275088548364400416034343698093225733299058975, + 21888242871839275222246405745257275088548364400416034343698162165351350502210, + 87013955304489324, + 98315803655682673, + 21888242871839275222246405745257275088548364400416034343698083118696428181175, + 21888242871839275222246405745257275088548364400416034343698178833355679061452, + 68878540383750808, + 21888242871839275222246405745257275088548364400416034343698184890332726620484, + 21888242871839275222246405745257275088548364400416034343698111167727659467332, + 6741857932461050, + 119712392912983546, + 21888242871839275222246405745257275088548364400416034343698083325357112398204, + 21888242871839275222246405745257275088548364400416034343698175120181726823292, + 63208849303824538, + 120358527102726002, + 21888242871839275222246405745257275088548364400416034343698144837163448687773, + 21888242871839275222246405745257275088548364400416034343698134794567297154341, + 21888242871839275222246405745257275088548364400416034343698146034677084296101, + 21888242871839275222246405745257275088548364400416034343698129462975465958283, + 21888242871839275222246405745257275088548364400416034343698060497043616225455, + 21888242871839275222246405745257275088548364400416034343698195402485053666734, + 21888242871839275222246405745257275088548364400416034343698117307375685120398, + 21888242871839275222246405745257275088548364400416034343698099628854738806528, + 21888242871839275222246405745257275088548364400416034343698176599413160735255, + 139494146218837705, + 24479742898730981, + 21888242871839275222246405745257275088548364400416034343698077820051367760487, + 137545370544895776, + 46943760271004677, + 21888242871839275222246405745257275088548364400416034343698162659071953425670, + 42507849600903271, + 132185229534630529, + 101174858356390340, + 77731977946107862, + 130970638760445186, + 21888242871839275222246405745257275088548364400416034343698092325802109567280, + 7418594014950815, + 21888242871839275222246405745257275088548364400416034343698133541873868263355, + 42247447680940498, + 21888242871839275222246405745257275088548364400416034343698090721374047298632, + 66658807359867141, + 113774987579069766, + 21888242871839275222246405745257275088548364400416034343698156142132906685203, + 76222625656534046, + 21888242871839275222246405745257275088548364400416034343698195343505748819752, + 37767159725968320, + 21888242871839275222246405745257275088548364400416034343698173668700654124089, + 21888242871839275222246405745257275088548364400416034343698199837426014302266, + 77027550499784610, + 111241675260766676, + 21888242871839275222246405745257275088548364400416034343698069136736693109548, + 21888242871839275222246405745257275088548364400416034343698070440524500752133, + 21888242871839275222246405745257275088548364400416034343698202984937440367186, + 89699168474640483, + 114612778127565310, + 139417752688347984, + 36743428162877904, + 21888242871839275222246405745257275088548364400416034343698113759895509437553, + 113338469360231623, + 21888242871839275222246405745257275088548364400416034343698203681093789027509, + 103694469265190971, + 21888242871839275222246405745257275088548364400416034343698184538625519668340, + 21888242871839275222246405745257275088548364400416034343698164884582965388276, + 21888242871839275222246405745257275088548364400416034343698070707220161852792, + 90619395778396346, + 45782882711827086, + 25841719180823799, + 21888242871839275222246405745257275088548364400416034343698151864566743822000, + 21888242871839275222246405745257275088548364400416034343698074867352851485404, + 139112175783935311, + 38837465684804264, + 17766938310889517, + 135913071489477265, + 10472932165093604, + 21888242871839275222246405745257275088548364400416034343698164982426577956138, + 21888242871839275222246405745257275088548364400416034343698088380966411897009, + 100501878698578605, + 80528376606907299, + 21888242871839275222246405745257275088548364400416034343698112284773942837184, + 21888242871839275222246405745257275088548364400416034343698086766128830235740, + 21888242871839275222246405745257275088548364400416034343698113303776449473220, + 38738997520829649, + 28750073661141321, + 10698042265060155, + 36882215736301923, + 60533477853228613, + 21888242871839275222246405745257275088548364400416034343698176479304331854052, + 21888242871839275222246405745257275088548364400416034343698127947020304983522, + 21888242871839275222246405745257275088548364400416034343698121854671765024190, + 55790450193385424, + 28486278870837207, + 14266661222675857, + 21888242871839275222246405745257275088548364400416034343698109965012053390310, + 21888242871839275222246405745257275088548364400416034343698062586343562963856, + 21888242871839275222246405745257275088548364400416034343698105978959368468777, + 75898259156069496, + 78782244481072892, + 132894348218778744, + 53611339327076913, + 21888242871839275222246405745257275088548364400416034343698137416068635417060, + 47330457288330757, + 136313552754785320, + 98756579149217161, + 21888242871839275222246405745257275088548364400416034343698067276633596717219, + 21888242871839275222246405745257275088548364400416034343698067282261127848124, + 21888242871839275222246405745257275088548364400416034343698117435878244482323, + 21888242871839275222246405745257275088548364400416034343698127686290410082148, + 96460050088560459, + 115821639971047789, + 21888242871839275222246405745257275088548364400416034343698174185603268366198, + 11429348478545141, + 21888242871839275222246405745257275088548364400416034343698148283954227489410, + 142024413969328860, + 117999455919685076, + 73168101655660946, + 67876670918414247, + 21888242871839275222246405745257275088548364400416034343698161907240293547160, + 46283886830403200, + 58313126547336729, + 21888242871839275222246405745257275088548364400416034343698104908734333321132, + 40999866252802349, + 120460381252226642, + 105080806026743739, + 21888242871839275222246405745257275088548364400416034343698194366735195903454, + 21888242871839275222246405745257275088548364400416034343698160356335569112501, + 41474742516097193, + 30009220011815162, + 21888242871839275222246405745257275088548364400416034343698158537674503303831, + 96391808939473649, + 135504594389874912, + 36011884298672603, + 21888242871839275222246405745257275088548364400416034343698079640821847902950, + 28872318383631383, + 110317930952125889, + 21888242871839275222246405745257275088548364400416034343698076878989184961587, + 91354119343696222, + 21888242871839275222246405745257275088548364400416034343698147859094175374711, + 47883321072825664, + 21888242871839275222246405745257275088548364400416034343698168106709883143023, + 126663484352175853, + 74595049686660257, + 21888242871839275222246405745257275088548364400416034343698138966521167946267, + 21888242871839275222246405745257275088548364400416034343698139573465393437412, + 92880280875424317, + 73332330951833577, + 27061885183013510, + 19633724081343125, + 21888242871839275222246405745257275088548364400416034343698128577430664353536, + 65981986433726586, + 52616508907270667, + 127608545981125309, + 21888242871839275222246405745257275088548364400416034343698095082412461629938, + 21888242871839275222246405745257275088548364400416034343698118276898625933407, + 21888242871839275222246405745257275088548364400416034343698078238249621774923, + 21888242871839275222246405745257275088548364400416034343698119141073229689316, + 21888242871839275222246405745257275088548364400416034343698114739430127424525, + 21888242871839275222246405745257275088548364400416034343698140654278420942786, + 21888242871839275222246405745257275088548364400416034343698102926744272368328, + 21888242871839275222246405745257275088548364400416034343698097593647018884734, + 3080432067117202, + 21888242871839275222246405745257275088548364400416034343698087682802234912928, + 26244857978065544, + 111431379127688399, + 72115169720405822, + 21888242871839275222246405745257275088548364400416034343698135702847576515639, + 31031831238219701, + 51318342615341048, + 21888242871839275222246405745257275088548364400416034343698123093564261265629, + 123208484996622035, + 21888242871839275222246405745257275088548364400416034343698134134675606986647, + 21888242871839275222246405745257275088548364400416034343698143534577192118446, + 31962026798043949, + 21888242871839275222246405745257275088548364400416034343698110141259120639220, + 21888242871839275222246405745257275088548364400416034343698109807535755674171, + 21888242871839275222246405745257275088548364400416034343698109986417911478794, + 21888242871839275222246405745257275088548364400416034343698106109747977201835, + 21888242871839275222246405745257275088548364400416034343698089368504554129618, + 21888242871839275222246405745257275088548364400416034343698103064623150373926, + 43913404202884293, + 39831200747852425, + 21888242871839275222246405745257275088548364400416034343698119683653320962092, + 8409189187018218, + 21888242871839275222246405745257275088548364400416034343698136470656093116336, + 21888242871839275222246405745257275088548364400416034343698156058478150982974, + 95819395069474363, + 33122106857063532, + 47030652131421852, + 21888242871839275222246405745257275088548364400416034343698166463121588477782, + 21888242871839275222246405745257275088548364400416034343698116394861470724794, + 21888242871839275222246405745257275088548364400416034343698107841574049967176, + 105987872723441807, + 98074767365513974, + 19479037737832607, + 80517312914708473, + 21888242871839275222246405745257275088548364400416034343698130278979353194898, + 21888242871839275222246405745257275088548364400416034343698065062298098929119, + 131681388809812587, + 138759463484969247, + 21888242871839275222246405745257275088548364400416034343698200310844062835432, + 21888242871839275222246405745257275088548364400416034343698176067820852288004, + 139868201641573381, + 21888242871839275222246405745257275088548364400416034343698112907826376650286, + 123864015243666227, + 21888242871839275222246405745257275088548364400416034343698138294063441335623, + 21888242871839275222246405745257275088548364400416034343698173983632248646265, + 21888242871839275222246405745257275088548364400416034343698178139857797790790, + 21888242871839275222246405745257275088548364400416034343698198664473528369310, + 21888242871839275222246405745257275088548364400416034343698115675554980685513, + 25098898173504126, + 127737851391146458, + 120115566306959966, + 21888242871839275222246405745257275088548364400416034343698137163941173046864, + 21888242871839275222246405745257275088548364400416034343698167023063147144299, + 43947561932094622, + 21888242871839275222246405745257275088548364400416034343698119192434757477643, + 21888242871839275222246405745257275088548364400416034343698067785704278546134, + 125586658361290602, + 21888242871839275222246405745257275088548364400416034343698084448676612496927, + 21888242871839275222246405745257275088548364400416034343698172681065163440794, + 21888242871839275222246405745257275088548364400416034343698087743430103383317, + 21888242871839275222246405745257275088548364400416034343698185201346068374368, + 21888242871839275222246405745257275088548364400416034343698120860907354203933, + 21888242871839275222246405745257275088548364400416034343698101178457229108776, + 21888242871839275222246405745257275088548364400416034343698160149745327287825, + 21888242871839275222246405745257275088548364400416034343698184517515284739377, + 95148711679566887, + 21888242871839275222246405745257275088548364400416034343698167694825796306032, + 131091704719265681, + 21888242871839275222246405745257275088548364400416034343698147141018532562077, + 21888242871839275222246405745257275088548364400416034343698123237221422800079, + 21888242871839275222246405745257275088548364400416034343698098600871758344930, + 21888242871839275222246405745257275088548364400416034343698105939542891523775, + 93723051360691476, + 101892688019226047, + 98792113378512567, + 3589910830231839, + 118946889031669907, + 65949537798283244, + 21888242871839275222246405745257275088548364400416034343698107228614424967455, + 118509219893018688, + 21888242871839275222246405745257275088548364400416034343698135591619819789993, + 34169811262941122, + 52203628503613372, + 21888242871839275222246405745257275088548364400416034343698065338939591824190, + 116641593740117773, + 21888242871839275222246405745257275088548364400416034343698173407984377459750, + 43618731034547685, + 21888242871839275222246405745257275088548364400416034343698100443397255050315, + 21888242871839275222246405745257275088548364400416034343698189093009569882852, + 107373068536610384, + 21888242871839275222246405745257275088548364400416034343698156646042244581816, + 21888242871839275222246405745257275088548364400416034343698184663291362576073, + 21888242871839275222246405745257275088548364400416034343698194087563846907097, + 74173045031355551, + 21888242871839275222246405745257275088548364400416034343698071425167083239609, + 21888242871839275222246405745257275088548364400416034343698107373992882284948, + 21888242871839275222246405745257275088548364400416034343698062316116398799802, + 130823576102954989, + 21888242871839275222246405745257275088548364400416034343698072487296512592562, + 21888242871839275222246405745257275088548364400416034343698190608025948671329, + 99907620608753763, + 21888242871839275222246405745257275088548364400416034343698124967426563361795, + 21888242871839275222246405745257275088548364400416034343698148057118756496584, + 21888242871839275222246405745257275088548364400416034343698138823028618419242, + 13902347476761543, + 21888242871839275222246405745257275088548364400416034343698097498245060977199, + 64054599521460840, + 76167079219711552, + 21888242871839275222246405745257275088548364400416034343698069261351142232141, + 21888242871839275222246405745257275088548364400416034343698090197541207438922, + 21888242871839275222246405745257275088548364400416034343698116022367621836263, + 104266028864466718, + 94206214903197256, + 21888242871839275222246405745257275088548364400416034343698162451083133541931, + 26015435485242684, + 21888242871839275222246405745257275088548364400416034343698140642338584212825, + 21888242871839275222246405745257275088548364400416034343698092824851868825696, + 32896102426214006, + 21888242871839275222246405745257275088548364400416034343698200392430285030103, + 21888242871839275222246405745257275088548364400416034343698138978176999057877, + 21888242871839275222246405745257275088548364400416034343698068435527921084572, + 11209158029957096, + 21888242871839275222246405745257275088548364400416034343698193259506853087196, + 22460408200651471, + 142816644951857455, + 98717661518381574, + 10639853341516746, + 21888242871839275222246405745257275088548364400416034343698147417563509977166, + 67925212050233066, + 21888242871839275222246405745257275088548364400416034343698126065078390894570, + 21888242871839275222246405745257275088548364400416034343698202726683371987063, + 28859264662538123, + 116979438792033763, + 112048850156850429, + 21888242871839275222246405745257275088548364400416034343698119896601454661866, + 21888242871839275222246405745257275088548364400416034343698097770947033252168, + 69134761322223691, + 5681223171505659, + 21888242871839275222246405745257275088548364400416034343698108244488780543512, + 10993777585984235, + 21888242871839275222246405745257275088548364400416034343698095650891511153797, + 21888242871839275222246405745257275088548364400416034343698067522829967508290, + 21888242871839275222246405745257275088548364400416034343698124544535264503337, + 21888242871839275222246405745257275088548364400416034343698137776276122504271, + 52516090317118017, + 49995234480385325, + 22910235802841694, + 21888242871839275222246405745257275088548364400416034343698100788999122044903, + 8085999778026925, + 21888242871839275222246405745257275088548364400416034343698095550479040850331, + 44252337784034412, + 71804434441614947, + 21888242871839275222246405745257275088548364400416034343698072758491611021922, + 21888242871839275222246405745257275088548364400416034343698197984637725103268, + 36027149350032644, + 100172497834781238, + 134506859062678606, + 21888242871839275222246405745257275088548364400416034343698066098798735519567, + 21888242871839275222246405745257275088548364400416034343698104655656738987842, + 15477328174504966, + 21888242871839275222246405745257275088548364400416034343698071338491361045971, + 21888242871839275222246405745257275088548364400416034343698136087048655609004, + 58859240236712815, + 81790524153260412, + 140608014181425317, + 108596672890178638, + 21888242871839275222246405745257275088548364400416034343698198262226617758476, + 21888242871839275222246405745257275088548364400416034343698103410766324006367, + 45323490740264922, + 39512857451568527, + 141767636760079531, + 627287845747351, + 43991790834686956, + 21888242871839275222246405745257275088548364400416034343698106350248764076066, + 21888242871839275222246405745257275088548364400416034343698165100436874990152, + 63196551884444836, + 81476631535329705, + 89775686950945185, + 111334409249667566, + 36257307385322903, + 24446160345470762, + 116146944677743155, + 21888242871839275222246405745257275088548364400416034343698092240160734189715, + 130802472057166765, + 21888242871839275222246405745257275088548364400416034343698138685433575902622, + 21888242871839275222246405745257275088548364400416034343698184204421633298179, + 111315568452769093, + 21888242871839275222246405745257275088548364400416034343698197826023880825293, + 85366518568082480, + 21888242871839275222246405745257275088548364400416034343698074525401790794958, + 21888242871839275222246405745257275088548364400416034343698202773748679483253, + 21888242871839275222246405745257275088548364400416034343698115338808764329166, + 21888242871839275222246405745257275088548364400416034343698131019668501134497, + 44238462028269269, + 55042314339822605, + 22332659748561072, + 132649462309360039, + 116759705397343108, + 42445784032731873, + 21888242871839275222246405745257275088548364400416034343698074490820963648133, + 21888242871839275222246405745257275088548364400416034343698144554733083321546, + 39405714467070446, + 21888242871839275222246405745257275088548364400416034343698132835754506086722, + 30481916534907337, + 61046506722355112, + 21888242871839275222246405745257275088548364400416034343698184507083058502327, + 21888242871839275222246405745257275088548364400416034343698181779559070465603, + 97282439860290211, + 33561505216364659, + 21888242871839275222246405745257275088548364400416034343698169075894515249983, + 139327851098045099, + 21888242871839275222246405745257275088548364400416034343698195625120803921492, + 21888242871839275222246405745257275088548364400416034343698120611527637839986, + 21888242871839275222246405745257275088548364400416034343698160737103296318750, + 21888242871839275222246405745257275088548364400416034343698182482477749664834, + 21888242871839275222246405745257275088548364400416034343698113170283740434749, + 21888242871839275222246405745257275088548364400416034343698136568511313362594, + 21888242871839275222246405745257275088548364400416034343698133718429277880252, + 130142842384853627, + 22213163802519375, + 21888242871839275222246405745257275088548364400416034343698168113256299075641, + 39538958579176494, + 21888242871839275222246405745257275088548364400416034343698120217569855717182, + 79253070084848971, + 21888242871839275222246405745257275088548364400416034343698105004961478607372, + 64468279900238454, + 21888242871839275222246405745257275088548364400416034343698159291401574050325, + 122993569647443214, + 21888242871839275222246405745257275088548364400416034343698134447237969569353, + 98293931386979359, + 21888242871839275222246405745257275088548364400416034343698117597036213654020, + 21888242871839275222246405745257275088548364400416034343698181092370384929523, + 72642930016495875, + 21888242871839275222246405745257275088548364400416034343698129780701345892473, + 21888242871839275222246405745257275088548364400416034343698071438518543723042, + 101716734862617967, + 62055485673636496, + 59311881302657315, + 21888242871839275222246405745257275088548364400416034343698091031273984505355, + 21888242871839275222246405745257275088548364400416034343698177338967927208102, + 89027551233001972, + 21888242871839275222246405745257275088548364400416034343698163179754731777120, + 40922855066820082, + 49449372747279063, + 21888242871839275222246405745257275088548364400416034343698135693007508357080, + 118556055231511598, + 21888242871839275222246405745257275088548364400416034343698062078908871469242, + 21888242871839275222246405745257275088548364400416034343698122615626195439784, + 21888242871839275222246405745257275088548364400416034343698180320810128687161, + 71518721199829541, + 50665604679397626, + 20495114743753865, + 21888242871839275222246405745257275088548364400416034343698116315856850404884, + 36115094547290235, + 93491549314805756, + 21888242871839275222246405745257275088548364400416034343698196694610090620162, + 109556694381031035, + 10587424920429546, + 70013988102290620, + 21888242871839275222246405745257275088548364400416034343698093514456116912358, + 112533489727736349, + 116094581933042256, + 21888242871839275222246405745257275088548364400416034343698060143440668024980, + 21888242871839275222246405745257275088548364400416034343698112485204899393144, + 21888242871839275222246405745257275088548364400416034343698165502525577162079, + 35836439635279652, + 89715569271763733, + 21888242871839275222246405745257275088548364400416034343698133775781918175542, + 65912571671257363, + 21888242871839275222246405745257275088548364400416034343698144625428865127479, + 21888242871839275222246405745257275088548364400416034343698149276170798201469, + 21888242871839275222246405745257275088548364400416034343698075452164576543263, + 21888242871839275222246405745257275088548364400416034343698096248360564604726, + 21888242871839275222246405745257275088548364400416034343698083234977149802034, + 21888242871839275222246405745257275088548364400416034343698192252081919438054, + 133144320013384102, + 116090768225050718, + 21888242871839275222246405745257275088548364400416034343698156466908704777950, + 49545258173593881, + 71687701298706400, + 21888242871839275222246405745257275088548364400416034343698145986886117231143, + 21888242871839275222246405745257275088548364400416034343698123337749540341751, + 55557052479375937, + 82766950840655938, + 367182365845148, + 21888242871839275222246405745257275088548364400416034343698121711877656951161, + 129106123908779111, + 36396780388622252, + 33888665961505123, + 99044698694473360, + 21888242871839275222246405745257275088548364400416034343698072626090334409869, + 17406633434510560, + 21888242871839275222246405745257275088548364400416034343698082890714281356736, + 21888242871839275222246405745257275088548364400416034343698200839802438116479, + 33545821525544667, + 76524931826874612, + 32280386343668308, + 2751013598819493, + 8248190892585212, + 21888242871839275222246405745257275088548364400416034343698172375348570617016, + 42112442190797357, + 21888242871839275222246405745257275088548364400416034343698105939785049213126, + 102691059132045664, + 21888242871839275222246405745257275088548364400416034343698188798426749092947, + 21888242871839275222246405745257275088548364400416034343698153338236021640850, + 64622232439594549, + 21888242871839275222246405745257275088548364400416034343698140677269731449610, + 83107654893873873, + 10025407698818155, + 86528161999493133, + 21888242871839275222246405745257275088548364400416034343698139536158943649379, + 95357613496458721, + 21888242871839275222246405745257275088548364400416034343698099769238689586330, + 21888242871839275222246405745257275088548364400416034343698086797159818212377, + 21888242871839275222246405745257275088548364400416034343698076137988390048876, + 21888242871839275222246405745257275088548364400416034343698088195013212626780, + 21888242871839275222246405745257275088548364400416034343698138407095378891638, + 21888242871839275222246405745257275088548364400416034343698131570844812227729, + 20577001144318963, + 21888242871839275222246405745257275088548364400416034343698082802340701367154, + 82857092452814909, + 21888242871839275222246405745257275088548364400416034343698182167974540892034, + 9939463433339188, + 28516937024535706, + 21888242871839275222246405745257275088548364400416034343698110322205529029988, + 141829538093726781, + 140995116558741760, + 8398301579759952, + 64459091290879628, + 58664511188554149, + 68609854083179177, + 21888242871839275222246405745257275088548364400416034343698170945483461500879, + 51244046629654652, + 123430239677911439, + 21888242871839275222246405745257275088548364400416034343698120932200881828869, + 11431465182357746, + 137011910613467808, + 21888242871839275222246405745257275088548364400416034343698150576092016029988, + 94992118785186235, + 21888242871839275222246405745257275088548364400416034343698144739363165498653, + 21888242871839275222246405745257275088548364400416034343698107528490625563546, + 52076641186029789, + 21888242871839275222246405745257275088548364400416034343698168343076265010444, + 96062403474080682, + 21888242871839275222246405745257275088548364400416034343698100098255395638492, + 21888242871839275222246405745257275088548364400416034343698180208176616930858, + 21888242871839275222246405745257275088548364400416034343698179065800446612161, + 21888242871839275222246405745257275088548364400416034343698070989910386726460, + 143199895155288376, + 21888242871839275222246405745257275088548364400416034343698109333906824961936, + 21888242871839275222246405745257275088548364400416034343698136871215259498228, + 35833325049893891, + 21888242871839275222246405745257275088548364400416034343698137760067307232112, + 70581179247204756, + 21888242871839275222246405745257275088548364400416034343698159340946750233951, + 21888242871839275222246405745257275088548364400416034343698114987718401295034, + 21888242871839275222246405745257275088548364400416034343698109191963072831113, + 21888242871839275222246405745257275088548364400416034343698189466159044763720, + 133091261028721030, + 21888242871839275222246405745257275088548364400416034343698134913563278361222, + 5041242868060504, + 91320725393153982, + 81895165151956027, + 63194645433057511, + 21888242871839275222246405745257275088548364400416034343698098682895329871056, + 134643936109158960, + 108184508427008362, + 21888242871839275222246405745257275088548364400416034343698141429837437569974, + 4255600989254398, + 67098398905681356, + 21888242871839275222246405745257275088548364400416034343698074627928611164371, + 84251191998980615, + 5783545701574338, + 11015004227991215, + 21888242871839275222246405745257275088548364400416034343698125692595914110796, + 138303272398129845, + 21888242871839275222246405745257275088548364400416034343698174784012982385751, + 73719047178224456, + 21888242871839275222246405745257275088548364400416034343698071081607468512281, + 54538118159769994, + 55013836575545799, + 21888242871839275222246405745257275088548364400416034343698125893513216560097, + 48263770846083880, + 5718099532082823, + 9681235259284303, + 21888242871839275222246405745257275088548364400416034343698093644945377063072, + 21888242871839275222246405745257275088548364400416034343698195495674087377192, + 48118938574444299, + 19843987810866587, + 21888242871839275222246405745257275088548364400416034343698105475057270465006, + 21888242871839275222246405745257275088548364400416034343698112809258548230104, + 21888242871839275222246405745257275088548364400416034343698199002560392964533, + 21888242871839275222246405745257275088548364400416034343698109761387650549589, + 21888242871839275222246405745257275088548364400416034343698173474393739935164, + 21888242871839275222246405745257275088548364400416034343698181666421448449124, + 19745507208768355, + 21888242871839275222246405745257275088548364400416034343698084561893025732682, + 21888242871839275222246405745257275088548364400416034343698167380348353142658, + 91583746429617866, + 21888242871839275222246405745257275088548364400416034343698080119884124150133, + 21888242871839275222246405745257275088548364400416034343698138477348832248834, + 17863609677001089, + 92254779672184882, + 137806929746116346, + 21888242871839275222246405745257275088548364400416034343698115310311961664627, + 41949534739338521, + 112824982355353939, + 21888242871839275222246405745257275088548364400416034343698197906139785219515, + 21888242871839275222246405745257275088548364400416034343698063424106409141098, + 12049933960953033, + 21888242871839275222246405745257275088548364400416034343698109161691284415187, + 21888242871839275222246405745257275088548364400416034343698178952069018921906, + 21888242871839275222246405745257275088548364400416034343698120477101590980761, + 44429096287386702, + 21888242871839275222246405745257275088548364400416034343698136548652626394535, + 21888242871839275222246405745257275088548364400416034343698061623066694618656, + 51851716359571784, + 72802896648210480, + 21888242871839275222246405745257275088548364400416034343698148162080632781939, + 21888242871839275222246405745257275088548364400416034343698197496500231848614, + 1981117587558278, + 22330196510233377, + 16291766465145439, + 125119900394629917, + 21888242871839275222246405745257275088548364400416034343698089570630596725602, + 89171409667893647, + 21888242871839275222246405745257275088548364400416034343698102502992988152451, + 21888242871839275222246405745257275088548364400416034343698180064427336840355, + 62124675214223261, + 137113610163242201, + 21888242871839275222246405745257275088548364400416034343698177898077015674425, + 119830234197681917, + 21888242871839275222246405745257275088548364400416034343698076565892380103863, + 21888242871839275222246405745257275088548364400416034343698133090605789984256, + 113733373414955737, + 21888242871839275222246405745257275088548364400416034343698182605307538162251, + 114486969512604416, + 105275424020458894, + 107699903991557331, + 111102297677679337, + 57973099225403939, + 139117041142550713, + 45400535483221883, + 91390943157117664, + 140290889707387591, + 79901999235819674, + 21888242871839275222246405745257275088548364400416034343698126637974471363442, + 92597070579217578, + 21888242871839275222246405745257275088548364400416034343698124645606959271633, + 21888242871839275222246405745257275088548364400416034343698097566744238162123, + 25993059882892892, + 74865528041023333, + 57933383008320026, + 80664805389331230, + 19679206176204572, + 21888242871839275222246405745257275088548364400416034343698148184779675645644, + 38548563125864156, + 67214862788227202, + 97412612555642508, + 55621707587363262, + 16274340008175788, + 62015046754317288, + 21888242871839275222246405745257275088548364400416034343698201502410854495258, + 102281606555255555, + 139586431456316744, + 76479458550669641, + 21888242871839275222246405745257275088548364400416034343698126465287607580013, + 76561189907270372, + 21888242871839275222246405745257275088548364400416034343698118989584587491187, + 144041149865302960, + 123988671275736140, + 21888242871839275222246405745257275088548364400416034343698062967177049962789, + 21888242871839275222246405745257275088548364400416034343698078335169124422880, + 21888242871839275222246405745257275088548364400416034343698111439737246646287, + 21888242871839275222246405745257275088548364400416034343698184130837463384025, + 21888242871839275222246405745257275088548364400416034343698102732240670923637, + 21888242871839275222246405745257275088548364400416034343698093405875438742444, + 21888242871839275222246405745257275088548364400416034343698153807660832511185, + 21888242871839275222246405745257275088548364400416034343698130142736401686750, + 42417260620937861, + 20554411049901318, + 21888242871839275222246405745257275088548364400416034343698137893205307338956, + 98080408979647477, + 94669554844472413, + 107077652441088895, + 21888242871839275222246405745257275088548364400416034343698155730206191674300, + 141371320419819458, + 21888242871839275222246405745257275088548364400416034343698151690102169194981, + 21888242871839275222246405745257275088548364400416034343698067559477497692823, + 21888242871839275222246405745257275088548364400416034343698142104653587399403, + 46072778171255644, + 21888242871839275222246405745257275088548364400416034343698073405881635506272, + 94984168320079831, + 21888242871839275222246405745257275088548364400416034343698152645002870290059, + 71229496276866931, + 130053885482919810, + 21888242871839275222246405745257275088548364400416034343698192421775180707495, + 134623667961965436, + 21888242871839275222246405745257275088548364400416034343698108378935231151041, + 41834561655679306, + 143322492225789437, + 21888242871839275222246405745257275088548364400416034343698162997533078910521, + 21888242871839275222246405745257275088548364400416034343698185815797995669880, + 82368982120797320, + 21888242871839275222246405745257275088548364400416034343698157706196767451495, + 21888242871839275222246405745257275088548364400416034343698113899252276086120, + 104455809382159188, + 21888242871839275222246405745257275088548364400416034343698171876092811826212, + 698953902209776, + 140879713604114341, + 21888242871839275222246405745257275088548364400416034343698080050508481058305, + 124888284305536932, + 21888242871839275222246405745257275088548364400416034343698087434377828117783, + 54989862259489229, + 21888242871839275222246405745257275088548364400416034343698185829982847369238, + 142973489676650969, + 21888242871839275222246405745257275088548364400416034343698200148173546828353, + 21888242871839275222246405745257275088548364400416034343698147052809581054473, + 21888242871839275222246405745257275088548364400416034343698150660514874273123, + 88791309468524808, + 21888242871839275222246405745257275088548364400416034343698110638118775720598, + 21888242871839275222246405745257275088548364400416034343698182185720009433995, + 21888242871839275222246405745257275088548364400416034343698138177389132719620, + 26722106493274269, + 21888242871839275222246405745257275088548364400416034343698092942963758771473, + 21888242871839275222246405745257275088548364400416034343698066517215764409475, + 135712955307417741, + 28920555570897083, + 141836559582816316, + 110549859565813773, + 118125428438053578, + 21888242871839275222246405745257275088548364400416034343698161081897430808477, + 21888242871839275222246405745257275088548364400416034343698173389994098279613, + 21888242871839275222246405745257275088548364400416034343698104496047797775076, + 21888242871839275222246405745257275088548364400416034343698106491618537599414, + 21888242871839275222246405745257275088548364400416034343698109539092237724099, + 21888242871839275222246405745257275088548364400416034343698180657520310275874, + 41789021188251790, + 27958128439482647, + 55076889688029031, + 21888242871839275222246405745257275088548364400416034343698181511511881256669, + 58464267187132179, + 21888242871839275222246405745257275088548364400416034343698187306070995982726, + 7344355995221406, + 121149224898200060, + 6921968317850062, + 21888242871839275222246405745257275088548364400416034343698073114618519557739, + 118816559528843049, + 81258497955038772, + 21888242871839275222246405745257275088548364400416034343698193180149225166695, + 33141836987999287, + 71982705437278757, + 38171224849484158, + 127683098671077132, + 26928383020255921, + 37227182596102166, + 14471765087158999, + 21888242871839275222246405745257275088548364400416034343698117635556957912271, + 21888242871839275222246405745257275088548364400416034343698148047973829677685, + 32648114872437507, + 118860706895311586, + 35169834739264221, + 72168507679691099, + 21888242871839275222246405745257275088548364400416034343698180465310752454766, + 69384352198827220, + 21888242871839275222246405745257275088548364400416034343698139609480046829319, + 88308284001052430, + 21888242871839275222246405745257275088548364400416034343698068189887443785217, + 43999808749593382, + 21888242871839275222246405745257275088548364400416034343698082883661028301145, + 54755878446136718, + 61093035882791909, + 21888242871839275222246405745257275088548364400416034343698129136868622968023, + 35980577381769628, + 21888242871839275222246405745257275088548364400416034343698139533148600928587, + 21888242871839275222246405745257275088548364400416034343698166672603594955198, + 138013722560398126, + 127037815760658828, + 21888242871839275222246405745257275088548364400416034343698098712073269752172, + 21888242871839275222246405745257275088548364400416034343698076844573349072005, + 110527860395347108, + 21888242871839275222246405745257275088548364400416034343698187948133244782350, + 21888242871839275222246405745257275088548364400416034343698110313699354263709, + 102539111898871938, + 99202092832388150, + 21888242871839275222246405745257275088548364400416034343698169582953222261777, + 21888242871839275222246405745257275088548364400416034343698189679232616636240, + 93575184578563674, + 81203276021580529, + 42233480475421801, + 66618250783756975, + 72827856417997640, + 21888242871839275222246405745257275088548364400416034343698077226369082977034, + 84195011551549869, + 21888242871839275222246405745257275088548364400416034343698152269782194273479, + 21888242871839275222246405745257275088548364400416034343698151293925463685328, + 21888242871839275222246405745257275088548364400416034343698093783022893327054, + 21888242871839275222246405745257275088548364400416034343698166053444554125017, + 87649955074328656, + 21888242871839275222246405745257275088548364400416034343698099225755581408537, + 21888242871839275222246405745257275088548364400416034343698104111076521607953, + 21888242871839275222246405745257275088548364400416034343698125278041573682396, + 21888242871839275222246405745257275088548364400416034343698108506811552476487, + 55647602262146688, + 21888242871839275222246405745257275088548364400416034343698192006695630625823, + 10649956126526932, + 50151128870285604, + 21888242871839275222246405745257275088548364400416034343698168387106060340879, + 21888242871839275222246405745257275088548364400416034343698080706525129558720, + 21888242871839275222246405745257275088548364400416034343698122570221422881963, + 120411635621715075, + 21888242871839275222246405745257275088548364400416034343698103610084881274485, + 21888242871839275222246405745257275088548364400416034343698175361941614072964, + 21888242871839275222246405745257275088548364400416034343698110004510074336144, + 21888242871839275222246405745257275088548364400416034343698175514160257171892, + 21888242871839275222246405745257275088548364400416034343698074776749746522563, + 121872720173313658, + 21888242871839275222246405745257275088548364400416034343698130251507629287240, + 129326378690734564, + 122085761512300373, + 31854521629554566, + 123004577488999721, + 21888242871839275222246405745257275088548364400416034343698164188297885436724, + 112248069963449898, + 21888242871839275222246405745257275088548364400416034343698168945596980995827, + 21888242871839275222246405745257275088548364400416034343698066493113700889463, + 102754828816356984, + 21888242871839275222246405745257275088548364400416034343698173075862955291833, + 21888242871839275222246405745257275088548364400416034343698180959185243515866, + 92323302459183880, + 97566116003179938, + 39343387636918805, + 58583447500145450, + 21888242871839275222246405745257275088548364400416034343698107802579742434918, + 51676922240284445, + 6583998537182924, + 21888242871839275222246405745257275088548364400416034343698077571775469855369, + 104460005525999499, + 96989985444819790, + 116194275329080393, + 114403842280712262, + 137091919776553551, + 21888242871839275222246405745257275088548364400416034343698062435275207474151, + 114647932736509181, + 21888242871839275222246405745257275088548364400416034343698117303093549641020, + 26899098782197295, + 111385105917701015, + 21888242871839275222246405745257275088548364400416034343698084370889983968576, + 21888242871839275222246405745257275088548364400416034343698180694301427874928, + 21888242871839275222246405745257275088548364400416034343698088731010254481922, + 21888242871839275222246405745257275088548364400416034343698179871934561463642, + 90600024220354286, + 58404754878274189, + 45713748555359218, + 21888242871839275222246405745257275088548364400416034343698092070890362756353, + 59101682974398971, + 21888242871839275222246405745257275088548364400416034343698129185606325966118, + 41677928759151727, + 21888242871839275222246405745257275088548364400416034343698190302571287363906, + 34115378774951349, + 21888242871839275222246405745257275088548364400416034343698075796896598295958, + 101682458935894951, + 21888242871839275222246405745257275088548364400416034343698133397907391342616, + 3486195926339365, + 47546885438248184, + 44467503389995980, + 21888242871839275222246405745257275088548364400416034343698107333973198628351, + 21888242871839275222246405745257275088548364400416034343698197933830590559889, + 98326919280026513, + 21888242871839275222246405745257275088548364400416034343698110061602172641719, + 116639761560138108, + 21888242871839275222246405745257275088548364400416034343698133114648234017539, + 151770128707321, + 21888242871839275222246405745257275088548364400416034343698125116388020841559, + 21888242871839275222246405745257275088548364400416034343698090252164002000773, + 21888242871839275222246405745257275088548364400416034343698174973810194960003, + 21888242871839275222246405745257275088548364400416034343698146601464381992718, + 21888242871839275222246405745257275088548364400416034343698071095053221404799, + 54365087420828412, + 21888242871839275222246405745257275088548364400416034343698157746827273263618, + 21888242871839275222246405745257275088548364400416034343698061697394777197271, + 21888242871839275222246405745257275088548364400416034343698135915663376580369, + 21888242871839275222246405745257275088548364400416034343698128420887001869888, + 21888242871839275222246405745257275088548364400416034343698201314033308355369, + 21888242871839275222246405745257275088548364400416034343698162358515997630294, + 21888242871839275222246405745257275088548364400416034343698085968552211122150, + 21888242871839275222246405745257275088548364400416034343698137107995964346094, + 21888242871839275222246405745257275088548364400416034343698180458050436599617, + 21888242871839275222246405745257275088548364400416034343698159760831410526256, + 21888242871839275222246405745257275088548364400416034343698099001470121645940, + 9360058367419465, + 92461261221346169, + 21888242871839275222246405745257275088548364400416034343698183197048980683902, + 99967407085744693, + 16207623936299550, + 81243185715788047, + 21888242871839275222246405745257275088548364400416034343698194429205583560855, + 29109233856812518, + 21888242871839275222246405745257275088548364400416034343698094002934298951691, + 66331519048970418, + 21888242871839275222246405745257275088548364400416034343698148621371184540800, + 97626007527010715, + 21888242871839275222246405745257275088548364400416034343698063360945758971180, + 21888242871839275222246405745257275088548364400416034343698127969879923641119, + 67848596057099682, + 21888242871839275222246405745257275088548364400416034343698182502736233567737, + 21888242871839275222246405745257275088548364400416034343698145771142860379023, + 62884175078002397, + 21888242871839275222246405745257275088548364400416034343698093673045188695073, + 119259944722556098, + 21888242871839275222246405745257275088548364400416034343698138478846674629886, + 4214250948627070, + 21888242871839275222246405745257275088548364400416034343698154522006066304285, + 126147218289056456, + 21888242871839275222246405745257275088548364400416034343698150013122740628883, + 110291760708721886, + 21888242871839275222246405745257275088548364400416034343698185735477463415157, + 21888242871839275222246405745257275088548364400416034343698190782920304149487, + 21888242871839275222246405745257275088548364400416034343698109202697822969257, + 140230078830723915, + 45840525454730627, + 135950786200601261, + 21888242871839275222246405745257275088548364400416034343698195754469529211237, + 77070186789823465, + 21888242871839275222246405745257275088548364400416034343698082501986550104784, + 90574224655834349, + 137775728277677861, + 70813387666077664, + 14115695428643277, + 21888242871839275222246405745257275088548364400416034343698165802529993787234, + 21888242871839275222246405745257275088548364400416034343698064586194949295414, + 69601106199827929, + 5517091093053061, + 100600023537408489, + 13832261232781448, + 21888242871839275222246405745257275088548364400416034343698163625656758408858, + 70561826165410167, + 21888242871839275222246405745257275088548364400416034343698150715512798440718, + 21888242871839275222246405745257275088548364400416034343698185075379969922166, + 31284803863729956, + 127874325415473580, + 90887913117522820, + 133530593226097798, + 21888242871839275222246405745257275088548364400416034343698132769257090904226, + 21888242871839275222246405745257275088548364400416034343698197809294910224482, + 21888242871839275222246405745257275088548364400416034343698180293601615680770, + 57155434796230163, + 138228747067910987, + 21888242871839275222246405745257275088548364400416034343698116226448627877991, + 134411935500239709, + 76619937271551559, + 46170662591391928, + 133187837897461115, + 132826405950249266, + 21888242871839275222246405745257275088548364400416034343698098048515967883884, + 77718951702493736, + 28421321945049215, + 21888242871839275222246405745257275088548364400416034343698127508558947660618, + 21888242871839275222246405745257275088548364400416034343698080169444346449499, + 20197381234209760, + 21888242871839275222246405745257275088548364400416034343698172932728881193806, + 131556470483008021, + 21888242871839275222246405745257275088548364400416034343698139971862807676693, + 21888242871839275222246405745257275088548364400416034343698136100087826120721, + 32016958163184274, + 15008457984020092, + 131466786047342558, + 122571635474598636, + 142494416096841290, + 75846623404815866, + 91489823580911448, + 2209682990304788, + 71205117069168930, + 21888242871839275222246405745257275088548364400416034343698063969553475001502, + 17631923144305507, + 133263756941150318, + 21888242871839275222246405745257275088548364400416034343698165575008805478348, + 21888242871839275222246405745257275088548364400416034343698097403908298251820, + 30852029705965558, + 58851501802726121, + 74613937883982198, + 21888242871839275222246405745257275088548364400416034343698201295805607534238, + 117790153017922491, + 129030554094576230, + 54855185718261346, + 21888242871839275222246405745257275088548364400416034343698161690380344601238, + 21888242871839275222246405745257275088548364400416034343698121582663724123038, + 21888242871839275222246405745257275088548364400416034343698158721191941244216, + 9333602250015334, + 97659657934410283, + 21888242871839275222246405745257275088548364400416034343698197740277093050273, + 141712420066982440, + 21888242871839275222246405745257275088548364400416034343698142472053543077059, + 21888242871839275222246405745257275088548364400416034343698193092377465421805, + 81642296130823282, + 105477364998376916, + 19729534400040129, + 111676346746611965, + 21053798265919386, + 142115897187991880, + 46525401408761195, + 21888242871839275222246405745257275088548364400416034343698068124026437520430, + 95262475696933168, + 19693456033751469, + 67869580892732697, + 21888242871839275222246405745257275088548364400416034343698164919799077631531, + 21888242871839275222246405745257275088548364400416034343698187131657142962704, + 21888242871839275222246405745257275088548364400416034343698173771105205455506, + 21888242871839275222246405745257275088548364400416034343698097927274058469418, + 40263681770453745, + 21888242871839275222246405745257275088548364400416034343698193550258282863576, + 10052833212361295, + 75811885832995351, + 21888242871839275222246405745257275088548364400416034343698106688307554758335, + 21888242871839275222246405745257275088548364400416034343698185194207958834697, + 21888242871839275222246405745257275088548364400416034343698073844875024617626, + 21888242871839275222246405745257275088548364400416034343698106729367506514776, + 21888242871839275222246405745257275088548364400416034343698061651027174317534, + 21888242871839275222246405745257275088548364400416034343698075030400044369692, + 52186894093681142, + 63369337678720932, + 21888242871839275222246405745257275088548364400416034343698144115514545243142, + 21888242871839275222246405745257275088548364400416034343698141869683103828530, + 21888242871839275222246405745257275088548364400416034343698076959562048505625, + 21888242871839275222246405745257275088548364400416034343698171872046990282126, + 21888242871839275222246405745257275088548364400416034343698095366297782454271, + 21888242871839275222246405745257275088548364400416034343698164930471976404449, + 21888242871839275222246405745257275088548364400416034343698122543025332262679, + 21888242871839275222246405745257275088548364400416034343698101910565784462381, + 8884301980763374, + 85549086959946178, + 21888242871839275222246405745257275088548364400416034343698087984032381415355, + 115798680603830137, + 9451507805957830, + 21888242871839275222246405745257275088548364400416034343698139524693705790382, + 54188526351886169, + 21888242871839275222246405745257275088548364400416034343698164552623038639525, + 21888242871839275222246405745257275088548364400416034343698139382309088499819, + 43027699756529748, + 90807875505455702, + 114342837683014520, + 77841614491861565, + 21888242871839275222246405745257275088548364400416034343698198841838864307953, + 60090054280838885, + 140673872406894114, + 21888242871839275222246405745257275088548364400416034343698100860331265070535, + 21888242871839275222246405745257275088548364400416034343698130357196666437630, + 21888242871839275222246405745257275088548364400416034343698072193245538149427, + 67018746281843357, + 21888242871839275222246405745257275088548364400416034343698104924753899249193, + 21888242871839275222246405745257275088548364400416034343698120732684913025545, + 21888242871839275222246405745257275088548364400416034343698064176721545551921, + 63190519585397699, + 4259295432854722, + 20540980881640767, + 21888242871839275222246405745257275088548364400416034343698193888596237739318, + 51847692528807694, + 21888242871839275222246405745257275088548364400416034343698070555886743413892, + 21888242871839275222246405745257275088548364400416034343698063663189292022881, + 21888242871839275222246405745257275088548364400416034343698115641252356450313, + 21888242871839275222246405745257275088548364400416034343698167500071288188853, + 21888242871839275222246405745257275088548364400416034343698087563341482415984, + 32839233142467741, + 21888242871839275222246405745257275088548364400416034343698162982722740693738, + 21888242871839275222246405745257275088548364400416034343698199806339580733931, + 21888242871839275222246405745257275088548364400416034343698170374184088480979, + 43267242357974844, + 21888242871839275222246405745257275088548364400416034343698200164232309413606, + 21888242871839275222246405745257275088548364400416034343698202232295127990769, + 21888242871839275222246405745257275088548364400416034343698086261706522732812, + 111207177609267564, + 21888242871839275222246405745257275088548364400416034343698083572731709370740, + 18475692792301299, + 21888242871839275222246405745257275088548364400416034343698087772057593028549, + 21888242871839275222246405745257275088548364400416034343698187322334892300074, + 35454801127295000, + 72847178810745271, + 21888242871839275222246405745257275088548364400416034343698120395802654582017, + 83296977954719664, + 21888242871839275222246405745257275088548364400416034343698174101728188672031, + 138151025869088700, + 129050620155950970, + 56334263799118504, + 21888242871839275222246405745257275088548364400416034343698098691136293737322, + 25625672079545354, + 3795575163193615, + 21888242871839275222246405745257275088548364400416034343698077698587716184675, + 47678733619254424, + 140294421560915999, + 139755285668656663, + 21888242871839275222246405745257275088548364400416034343698186824761175513856, + 84207677495705704, + 137644065221735667, + 21888242871839275222246405745257275088548364400416034343698161000185274836690, + 100170549752592983, + 21888242871839275222246405745257275088548364400416034343698152973095176795873, + 112300414924924335, + 21888242871839275222246405745257275088548364400416034343698068504315794948621, + 21888242871839275222246405745257275088548364400416034343698095403074085652533, + 26536815689865053, + 66180548226442448, + 21888242871839275222246405745257275088548364400416034343698087083958586850588, + 52443726292121232, + 21888242871839275222246405745257275088548364400416034343698181154030598169976, + 67729181965011004, + 21888242871839275222246405745257275088548364400416034343698116796984353402332, + 21888242871839275222246405745257275088548364400416034343698187972828380827429, + 59469187750717954, + 21888242871839275222246405745257275088548364400416034343698138823083070849639, + 115395499368363160, + 3025414064064678, + 21888242871839275222246405745257275088548364400416034343698196683977675115905, + 87478981884485719, + 21888242871839275222246405745257275088548364400416034343698132713040281109404, + 21888242871839275222246405745257275088548364400416034343698116702361440927511, + 32964572198361736, + 21888242871839275222246405745257275088548364400416034343698171805659587365970, + 124672436032215140, + 71908309925315475, + 121562237336320416, + 60101348600235754, + 82970172473833490, + 44300802961385568, + 84529780777423074, + 21888242871839275222246405745257275088548364400416034343698103881489750210757, + 20548132464287268, + 21888242871839275222246405745257275088548364400416034343698075198543059356802, + 21888242871839275222246405745257275088548364400416034343698076850595635061878, + 21888242871839275222246405745257275088548364400416034343698158617632417864299, + 10053488669019926, + 100726426415072275, + 21888242871839275222246405745257275088548364400416034343698075643853100287091, + 134952692559433732, + 21888242871839275222246405745257275088548364400416034343698151436273285114598, + 130069859833054394, + 111076975289451079, + 57217267951927800, + 21888242871839275222246405745257275088548364400416034343698079238045198122506, + 21888242871839275222246405745257275088548364400416034343698065976537486327923, + 22193197361823591, + 21888242871839275222246405745257275088548364400416034343698085348445338046177, + 72239207329393437, + 21888242871839275222246405745257275088548364400416034343698103859737654195917, + 127613324539553723, + 86352833573998508, + 21888242871839275222246405745257275088548364400416034343698119802726265744006, + 3846617839633751, + 77169099640254124, + 21888242871839275222246405745257275088548364400416034343698102601639663467281, + 21888242871839275222246405745257275088548364400416034343698098604954270472208, + 21888242871839275222246405745257275088548364400416034343698081901578330643223, + 21888242871839275222246405745257275088548364400416034343698095661619743674033, + 141161668446969205, + 21888242871839275222246405745257275088548364400416034343698187414095558496832, + 21888242871839275222246405745257275088548364400416034343698084618599953542276, + 21888242871839275222246405745257275088548364400416034343698117826608502476896, + 87052831982071137, + 59418996805043632, + 11967254469016185, + 21888242871839275222246405745257275088548364400416034343698121465270152848689, + 110211945457880436, + 21888242871839275222246405745257275088548364400416034343698087103265015521879, + 81171751463553017, + 86501299234428995, + 21888242871839275222246405745257275088548364400416034343698119395884578565721, + 28768442433343475, + 73882070954992474, + 21888242871839275222246405745257275088548364400416034343698081544638373850733, + 129107158847316246, + 21888242871839275222246405745257275088548364400416034343698151467819195794684, + 28094537899537513, + 139643401936038738, + 111617976097589767, + 81112883264281126, + 96148988582705649, + 21888242871839275222246405745257275088548364400416034343698102057930814297855, + 21888242871839275222246405745257275088548364400416034343698175242133671620480, + 21888242871839275222246405745257275088548364400416034343698134997703142133127, + 33832733045340707, + 21888242871839275222246405745257275088548364400416034343698179625229938242243, + 87886467069009574, + 21888242871839275222246405745257275088548364400416034343698103886906361789241, + 21888242871839275222246405745257275088548364400416034343698109219598884377639, + 39680090143894562, + 76364982821549871, + 93128674516983076, + 21888242871839275222246405745257275088548364400416034343698070040499715127805, + 109921690681888038, + 76993577083495621, + 113108153071012268, + 122082798288804601, + 21888242871839275222246405745257275088548364400416034343698120233664695545466, + 21888242871839275222246405745257275088548364400416034343698128109046116252193, + 137185778802225126, + 25285635556270487, + 21888242871839275222246405745257275088548364400416034343698114676419777438100, + 102496202752076474, + 1982625128319966, + 21888242871839275222246405745257275088548364400416034343698083185780575856803, + 21888242871839275222246405745257275088548364400416034343698180874188343109304, + 131817883939334194, + 21888242871839275222246405745257275088548364400416034343698087991722037077566, + 88493800882362724, + 21888242871839275222246405745257275088548364400416034343698064619487317176070, + 96499480242348428, + 21888242871839275222246405745257275088548364400416034343698134667609708148533, + 56481839885148456, + 21888242871839275222246405745257275088548364400416034343698145951104279303472, + 21888242871839275222246405745257275088548364400416034343698061823016595816364, + 7049857748141367, + 32514251956754060, + 12896827909716785, + 21888242871839275222246405745257275088548364400416034343698180525863204093684, + 2563498611887521, + 21888242871839275222246405745257275088548364400416034343698090945995694328951, + 21888242871839275222246405745257275088548364400416034343698150301731527453230, + 21888242871839275222246405745257275088548364400416034343698107907681976431019, + 21888242871839275222246405745257275088548364400416034343698162037200172922655, + 87776696191523298, + 21888242871839275222246405745257275088548364400416034343698195588766575932786, + 21888242871839275222246405745257275088548364400416034343698171353734737889619, + 87337080361464663, + 21888242871839275222246405745257275088548364400416034343698078637101622020540, + 35151906387820105, + 89520704492197104, + 65074362352260954, + 141138705612623760, + 59907242963103253, + 21888242871839275222246405745257275088548364400416034343698071866666571134302, + 142184957502611176, + 136519545260936128, + 34812443354359816, + 21888242871839275222246405745257275088548364400416034343698125826628450443416, + 21888242871839275222246405745257275088548364400416034343698098752831161119798, + 21888242871839275222246405745257275088548364400416034343698061917734243744674, + 21888242871839275222246405745257275088548364400416034343698135821361876685364, + 21888242871839275222246405745257275088548364400416034343698114570834069948919, + 61210767397684598, + 21888242871839275222246405745257275088548364400416034343698167666754715033804, + 21888242871839275222246405745257275088548364400416034343698128575955614808458, + 82393614223978048, + 21888242871839275222246405745257275088548364400416034343698142602065093628968, + 25537629417564970, + 77373403100769395, + 21888242871839275222246405745257275088548364400416034343698089126164477258289, + 40263023434862695, + 12842371030169148, + 21888242871839275222246405745257275088548364400416034343698086634674990121942, + 141196209069194443, + 142077555215062266, + 72509726458662361, + 21888242871839275222246405745257275088548364400416034343698143447023994412295, + 25983824834607915, + 31014233588931910, + 21888242871839275222246405745257275088548364400416034343698124210462626696993, + 11325224813106797, + 57843634673033387, + 101887332758905648, + 21888242871839275222246405745257275088548364400416034343698173671868201140339, + 21888242871839275222246405745257275088548364400416034343698190519944801514397, + 87078096943206054, + 21888242871839275222246405745257275088548364400416034343698099021553972400338, + 21888242871839275222246405745257275088548364400416034343698187132220730052504, + 26252293831664554, + 21888242871839275222246405745257275088548364400416034343698200620089287659810, + 70650731236971513, + 21888242871839275222246405745257275088548364400416034343698117978881593210842, + 519160348950266, + 21888242871839275222246405745257275088548364400416034343698080753686942087802, + 69482206436116517, + 21888242871839275222246405745257275088548364400416034343698076953812979070076, + 21888242871839275222246405745257275088548364400416034343698154512323924500109, + 3416999987560511, + 21888242871839275222246405745257275088548364400416034343698062439637479575584, + 100018854802422085, + 21888242871839275222246405745257275088548364400416034343698136040842462112781, + 6281786999829025, + 40641628140688875, + 17755230149149162, + 21888242871839275222246405745257275088548364400416034343698158903359658024383, + 21888242871839275222246405745257275088548364400416034343698129971529734141723, + 6873462137112042, + 21888242871839275222246405745257275088548364400416034343698081979027772822798, + 21888242871839275222246405745257275088548364400416034343698170876294501463603, + 21888242871839275222246405745257275088548364400416034343698197919422947209823, + 21888242871839275222246405745257275088548364400416034343698087330085304839502, + 40433135075811681, + 5069900100156472, + 100373072398432712, + 21888242871839275222246405745257275088548364400416034343698088337233349717842, + 24217732714514778, + 51648043798889, + 21888242871839275222246405745257275088548364400416034343698187280375039608704, + 63018321604383794, + 21888242871839275222246405745257275088548364400416034343698078397285224683916, + 21888242871839275222246405745257275088548364400416034343698110496450788404416, + 122085540055737136, + 93742645088247933, + 21888242871839275222246405745257275088548364400416034343698061261529995192392, + 40336127056016081, + 50169470331988934, + 21888242871839275222246405745257275088548364400416034343698112556962381496038, + 13931278803231243, + 87160202352377041, + 114063235954312749, + 21888242871839275222246405745257275088548364400416034343698126774278686897285, + 21888242871839275222246405745257275088548364400416034343698184065906059816100, + 72815526383986097, + 21888242871839275222246405745257275088548364400416034343698186067287839104862, + 87942641004494638, + 21888242871839275222246405745257275088548364400416034343698179691136012982174, + 21888242871839275222246405745257275088548364400416034343698092895149036729734, + 21888242871839275222246405745257275088548364400416034343698101306257344942028, + 21888242871839275222246405745257275088548364400416034343698082599049764044848, + 21888242871839275222246405745257275088548364400416034343698144145393968939326, + 21888242871839275222246405745257275088548364400416034343698157072933566229816, + 48101576622771782, + 95889064849900661, + 21888242871839275222246405745257275088548364400416034343698170851205006613460, + 21888242871839275222246405745257275088548364400416034343698117659557827764494, + 119831367864263445, + 19306685080590079, + 21888242871839275222246405745257275088548364400416034343698142547546173160583, + 3385107574913983, + 1400451717581979, + 66180680085109229, + 21888242871839275222246405745257275088548364400416034343698153374292344983953, + 21888242871839275222246405745257275088548364400416034343698113655320296270482, + 21888242871839275222246405745257275088548364400416034343698091851459188640867, + 11354580538164929, + 21888242871839275222246405745257275088548364400416034343698082073710984551917, + 21888242871839275222246405745257275088548364400416034343698158135069755831872, + 21888242871839275222246405745257275088548364400416034343698139255704038510059, + 82371326703706109, + 62619659623011332, + 21888242871839275222246405745257275088548364400416034343698106719361031190736, + 57001905113334149, + 21888242871839275222246405745257275088548364400416034343698170123156656151334, + 21888242871839275222246405745257275088548364400416034343698133283587986314363, + 76707680793975851, + 62472992053947624, + 21888242871839275222246405745257275088548364400416034343698091135964030111802, + 21888242871839275222246405745257275088548364400416034343698198264626863060284, + 21888242871839275222246405745257275088548364400416034343698160704461226963384, + 21888242871839275222246405745257275088548364400416034343698166026902985276056, + 107576385389925026, + 139716644766113850, + 21888242871839275222246405745257275088548364400416034343698082542759221259625, + 21888242871839275222246405745257275088548364400416034343698126532130356049779, + 21888242871839275222246405745257275088548364400416034343698136795205962091931, + 21888242871839275222246405745257275088548364400416034343698082253863869022617, + 70268213036408144, + 21888242871839275222246405745257275088548364400416034343698190852698365505224, + 21888242871839275222246405745257275088548364400416034343698121376322589419936, + 21888242871839275222246405745257275088548364400416034343698166272341954102611, + 21888242871839275222246405745257275088548364400416034343698192050485072527920, + 21888242871839275222246405745257275088548364400416034343698093154628401484060, + 21888242871839275222246405745257275088548364400416034343698170299636117606685, + 21888242871839275222246405745257275088548364400416034343698158772453115558595, + 21888242871839275222246405745257275088548364400416034343698153456589110264493, + 21888242871839275222246405745257275088548364400416034343698199371300144334715, + 73094956171641245, + 64730217832450780, + 21888242871839275222246405745257275088548364400416034343698172415298974595749, + 21888242871839275222246405745257275088548364400416034343698136491295243615809, + 21888242871839275222246405745257275088548364400416034343698162994785080638501, + 21888242871839275222246405745257275088548364400416034343698157450165647418089, + 21888242871839275222246405745257275088548364400416034343698072762691589269348, + 107708587024718410, + 107576885925440182, + 21888242871839275222246405745257275088548364400416034343698075724484144262006, + 61444371031861372, + 21888242871839275222246405745257275088548364400416034343698183502404877513761, + 7850243284330159, + 21888242871839275222246405745257275088548364400416034343698088528736592103981, + 21888242871839275222246405745257275088548364400416034343698107549844727813938, + 65001753375502240, + 21888242871839275222246405745257275088548364400416034343698171216634145809428, + 130709618251928743, + 119204219258241389, + 21888242871839275222246405745257275088548364400416034343698196632321032618410, + 14314693784031411, + 21888242871839275222246405745257275088548364400416034343698186095259204385944, + 67318361276377375, + 21888242871839275222246405745257275088548364400416034343698072586828121957546, + 21888242871839275222246405745257275088548364400416034343698166829669180252148, + 50394879366583050, + 21888242871839275222246405745257275088548364400416034343698099827778668139583, + 134855997419820393, + 21888242871839275222246405745257275088548364400416034343698154517745168561595, + 124965142798088258, + 21888242871839275222246405745257275088548364400416034343698157828573697479325, + 21888242871839275222246405745257275088548364400416034343698131607081428380585, + 50427149027959247, + 21888242871839275222246405745257275088548364400416034343698066063693662167521, + 21888242871839275222246405745257275088548364400416034343698137396373519124618, + 13493890708793039, + 21888242871839275222246405745257275088548364400416034343698144689062978541509, + 97491654297755005, + 27777863826943955, + 91013326922661865, + 102261744496404837, + 58253200721989116, + 21888242871839275222246405745257275088548364400416034343698145547984606553777, + 21888242871839275222246405745257275088548364400416034343698139181268070115896, + 21888242871839275222246405745257275088548364400416034343698078002299899680277, + 12839005583135386, + 21888242871839275222246405745257275088548364400416034343698104168530755066875, + 494000599792102, + 21888242871839275222246405745257275088548364400416034343698181180967197485607, + 21888242871839275222246405745257275088548364400416034343698074543741844564300, + 111278469345254295, + 21888242871839275222246405745257275088548364400416034343698171747471466119770, + 29559946961362765, + 21888242871839275222246405745257275088548364400416034343698156089825732191415, + 21888242871839275222246405745257275088548364400416034343698129591257447845854, + 21888242871839275222246405745257275088548364400416034343698060697495405864417, + 21888242871839275222246405745257275088548364400416034343698077703636819471803, + 21888242871839275222246405745257275088548364400416034343698193289772432158294, + 42433825592564282, + 11163885145868117, + 21888242871839275222246405745257275088548364400416034343698181731387451807817, + 44052645309923178, + 21888242871839275222246405745257275088548364400416034343698180548882497287863, + 60883820460155378, + 41414799346150614, + 42474226739291115, + 21888242871839275222246405745257275088548364400416034343698164485104860005322, + 57931146717317736, + 21888242871839275222246405745257275088548364400416034343698147548717459469875, + 23323143131722882, + 21888242871839275222246405745257275088548364400416034343698133684743490570945, + 21888242871839275222246405745257275088548364400416034343698178761449865454811, + 21888242871839275222246405745257275088548364400416034343698173073033066532462, + 21888242871839275222246405745257275088548364400416034343698202782236697303471, + 97459285291668159, + 21888242871839275222246405745257275088548364400416034343698140635803749315882, + 126428833816557334, + 41528150453027438, + 128166784633422978, + 71531024709706756, + 83945626359348631, + 21888242871839275222246405745257275088548364400416034343698183249187096265704, + 19836494404293513, + 21888242871839275222246405745257275088548364400416034343698095186171530869824, + 52742127072697256, + 144038537082354233, + 63255646455271695, + 136790762613335611, + 31119652430938891, + 21888242871839275222246405745257275088548364400416034343698135040565126280732, + 117101182900332317, + 21888242871839275222246405745257275088548364400416034343698080379030544727664, + 21888242871839275222246405745257275088548364400416034343698100271101913558950, + 21888242871839275222246405745257275088548364400416034343698090516012778129599, + 140537868729347186, + 24453115490083305, + 21888242871839275222246405745257275088548364400416034343698091442664638074076, + 112898373819337304, + 40027772739325383, + 21888242871839275222246405745257275088548364400416034343698158259154953769255, + 21888242871839275222246405745257275088548364400416034343698164001719906043249, + 74870558431064989, + 21888242871839275222246405745257275088548364400416034343698183110812603041404, + 21888242871839275222246405745257275088548364400416034343698100930060443503865, + 136071849705514621, + 53001914206655964, + 21888242871839275222246405745257275088548364400416034343698061095410997895069, + 59965674831086982, + 128830576452984541, + 21888242871839275222246405745257275088548364400416034343698159916968973022692, + 132737464530540398, + 21888242871839275222246405745257275088548364400416034343698184550638005046674, + 109193841797995596, + 107099903796635077, + 42112235647316779, + 84292477187845529, + 98352919265473484, + 21888242871839275222246405745257275088548364400416034343698163347212695257765, + 21888242871839275222246405745257275088548364400416034343698180835962861367126, + 47971977756443243, + 27688448608046914, + 21888242871839275222246405745257275088548364400416034343698114742357670166575, + 31395677791885965, + 20220139330498179, + 52674197558731889, + 21888242871839275222246405745257275088548364400416034343698123398880769120888, + 140589580383690474, + 21888242871839275222246405745257275088548364400416034343698201114393894879649, + 21888242871839275222246405745257275088548364400416034343698089194439150590670, + 118164472538772786, + 21888242871839275222246405745257275088548364400416034343698183354273083461684, + 21888242871839275222246405745257275088548364400416034343698193110836483051040, + 71732596547127249, + 43159892913226574, + 37757784050434033, + 21888242871839275222246405745257275088548364400416034343698157743291727221271, + 115139655181102528, + 70247433488544874, + 21888242871839275222246405745257275088548364400416034343698087581983637371100, + 54817038412200617, + 21638543662924411, + 21888242871839275222246405745257275088548364400416034343698127646101585908855, + 91419712216316257, + 21888242871839275222246405745257275088548364400416034343698174436887365631985, + 134570789179666831, + 21888242871839275222246405745257275088548364400416034343698199555188955221701, + 26130717181538354, + 117631636082267220, + 21888242871839275222246405745257275088548364400416034343698202159226544251188, + 111461045905664117, + 21888242871839275222246405745257275088548364400416034343698203260930040871856, + 21015767200903575, + 92943382078150263, + 55678748550419481, + 21888242871839275222246405745257275088548364400416034343698177708100186368555, + 21888242871839275222246405745257275088548364400416034343698089634586482690909, + 126439858638036575, + 99490206090945924, + 99778966609830335, + 21888242871839275222246405745257275088548364400416034343698116798763254576291, + 114391443667053515, + 21888242871839275222246405745257275088548364400416034343698088048241733745990, + 46293662147182360, + 21888242871839275222246405745257275088548364400416034343698165476466705037798, + 24502795330970879, + 21888242871839275222246405745257275088548364400416034343698156480025386053455, + 21888242871839275222246405745257275088548364400416034343698116571482217027200, + 21888242871839275222246405745257275088548364400416034343698092836949486476824, + 123993039753163298, + 17192444769506452, + 21888242871839275222246405745257275088548364400416034343698093780150796987527, + 21888242871839275222246405745257275088548364400416034343698201218498172337296, + 21888242871839275222246405745257275088548364400416034343698117273447081957144, + 21888242871839275222246405745257275088548364400416034343698090189950458718327, + 130039139961290329, + 21888242871839275222246405745257275088548364400416034343698093008864939183956, + 61550555743803537, + 39655596036548347, + 13372366931304683, + 142620873204199365, + 63243231271036370, + 15557877572520401, + 23523092014328550, + 122378641412319006, + 21888242871839275222246405745257275088548364400416034343698106525928759011079, + 1794945851509255, + 21888242871839275222246405745257275088548364400416034343698060132210802846434, + 126239002587278720, + 21888242871839275222246405745257275088548364400416034343698182440789781447487, + 21888242871839275222246405745257275088548364400416034343698162126505782204823, + 21888242871839275222246405745257275088548364400416034343698066870342521519306, + 21888242871839275222246405745257275088548364400416034343698193539773791240237, + 21888242871839275222246405745257275088548364400416034343698083315350115694700, + 21888242871839275222246405745257275088548364400416034343698153093041827108923, + 63132789830579743, + 40219132018061851, + 21888242871839275222246405745257275088548364400416034343698094421887202247252, + 26290651415817353, + 21888242871839275222246405745257275088548364400416034343698125320064306239081, + 25327441016567214, + 21888242871839275222246405745257275088548364400416034343698096684389430212545, + 138402515229332047, + 47447358323857223, + 21888242871839275222246405745257275088548364400416034343698084396687052483225, + 92383727838904626, + 21888242871839275222246405745257275088548364400416034343698112185340407591528, + 9142624642006935, + 21888242871839275222246405745257275088548364400416034343698118468891705433617, + 21888242871839275222246405745257275088548364400416034343698139771150060257894, + 21888242871839275222246405745257275088548364400416034343698070345765961013790, + 21888242871839275222246405745257275088548364400416034343698064940548617301972, + 21888242871839275222246405745257275088548364400416034343698140060555960359793, + 82610128137333791, + 133518323367664068, + 21888242871839275222246405745257275088548364400416034343698189183499799382986, + 21888242871839275222246405745257275088548364400416034343698127071776140318546, + 12700881745778650, + 37701158235476332, + 21888242871839275222246405745257275088548364400416034343698199833326085182296, + 21888242871839275222246405745257275088548364400416034343698116503075740069317, + 21888242871839275222246405745257275088548364400416034343698096548231104154183, + 21888242871839275222246405745257275088548364400416034343698185876949308716431, + 21888242871839275222246405745257275088548364400416034343698095197374349926480, + 21888242871839275222246405745257275088548364400416034343698124426068251621540, + 79460270737808785, + 88747645016043837, + 136153274402291244, + 74437826616547703, + 21888242871839275222246405745257275088548364400416034343698082426618971444036, + 44823831387847905, + 113135826746447079, + 21888242871839275222246405745257275088548364400416034343698091163108716517189, + 21888242871839275222246405745257275088548364400416034343698126234746563261978, + 63758376922318666, + 21888242871839275222246405745257275088548364400416034343698124136342934057912, + 21888242871839275222246405745257275088548364400416034343698066185535872514492, + 21888242871839275222246405745257275088548364400416034343698155913897103432160, + 98990756099559793, + 21888242871839275222246405745257275088548364400416034343698108297608749722408, + 21014615350336127, + 43867898003016427, + 21888242871839275222246405745257275088548364400416034343698106663507370478729, + 125853421523399022, + 21888242871839275222246405745257275088548364400416034343698165821727613750667, + 22480771980770910, + 21888242871839275222246405745257275088548364400416034343698140059219379567774, + 12897514581148187, + 44324296589047854, + 59218908970617950, + 125159754831224650, + 21888242871839275222246405745257275088548364400416034343698171594751010490251, + 21888242871839275222246405745257275088548364400416034343698193290350373108673, + 21888242871839275222246405745257275088548364400416034343698131579404706012676, + 35169049032680254, + 71674564923409275, + 34743082291811522, + 21888242871839275222246405745257275088548364400416034343698081139000266151630, + 21888242871839275222246405745257275088548364400416034343698140494747257176154, + 21888242871839275222246405745257275088548364400416034343698188918205213009556, + 14068427201374708, + 72128731157836901, + 85653508838207312, + 9419621177825576, + 126761188418891759, + 21888242871839275222246405745257275088548364400416034343698125493228671582847, + 21888242871839275222246405745257275088548364400416034343698151556231366941993, + 21888242871839275222246405745257275088548364400416034343698125711695466679295, + 21888242871839275222246405745257275088548364400416034343698079902313238388913, + 21888242871839275222246405745257275088548364400416034343698152066221251428246, + 134982159815523276, + 23154249366736201, + 92112598753278950, + 21888242871839275222246405745257275088548364400416034343698195477132108237028, + 21888242871839275222246405745257275088548364400416034343698154808540000303657, + 35887987329820456, + 62670743368241936, + 414505047180554, + 21888242871839275222246405745257275088548364400416034343698129861023775198385, + 74531341777024003, + 21888242871839275222246405745257275088548364400416034343698070791611214904959, + 21888242871839275222246405745257275088548364400416034343698076776020646526201, + 118033295359212156, + 21888242871839275222246405745257275088548364400416034343698149918879132389839, + 21888242871839275222246405745257275088548364400416034343698172641182350877001, + 26968548707519079, + 21888242871839275222246405745257275088548364400416034343698149280098777329116, + 21888242871839275222246405745257275088548364400416034343698060248035401772026, + 21888242871839275222246405745257275088548364400416034343698107739344176322584, + 21888242871839275222246405745257275088548364400416034343698155183933620422804, + 21888242871839275222246405745257275088548364400416034343698072407600639964592, + 98169329135241995, + 21888242871839275222246405745257275088548364400416034343698170274736436416260, + 71541970447309625, + 21888242871839275222246405745257275088548364400416034343698072732639159280037, + 37674588721991769, + 21888242871839275222246405745257275088548364400416034343698193149351663518113, + 94224102576699693, + 56402976620557339, + 21888242871839275222246405745257275088548364400416034343698097457091290142689, + 21888242871839275222246405745257275088548364400416034343698125187257516041691, + 21888242871839275222246405745257275088548364400416034343698103937474280663294, + 21888242871839275222246405745257275088548364400416034343698065475827377581781, + 21888242871839275222246405745257275088548364400416034343698164899287842235535, + 33943439027392697, + 83153651225957761, + 84120848742484242, + 26915483945526945, + 21888242871839275222246405745257275088548364400416034343698119201197681685428, + 21888242871839275222246405745257275088548364400416034343698172456611400355239, + 84777947828642715, + 21888242871839275222246405745257275088548364400416034343698118438815093643640, + 21888242871839275222246405745257275088548364400416034343698081289334849528924, + 98584753293649051, + 21888242871839275222246405745257275088548364400416034343698088793055291639194, + 21888242871839275222246405745257275088548364400416034343698116764340115618421, + 21888242871839275222246405745257275088548364400416034343698125446261897304648, + 21888242871839275222246405745257275088548364400416034343698164586215221260560, + 21888242871839275222246405745257275088548364400416034343698067109345787307651, + 21888242871839275222246405745257275088548364400416034343698149313821965528148, + 21888242871839275222246405745257275088548364400416034343698147793141025009765, + 21888242871839275222246405745257275088548364400416034343698175949654601337793, + 21888242871839275222246405745257275088548364400416034343698063529246319931772, + 21888242871839275222246405745257275088548364400416034343698100126499474235103, + 29930049558937921, + 21888242871839275222246405745257275088548364400416034343698143232590326174444, + 21888242871839275222246405745257275088548364400416034343698131866953821578480, + 38834185151443133, + 21888242871839275222246405745257275088548364400416034343698166398946959431603, + 106593608770483673, + 21888242871839275222246405745257275088548364400416034343698126154577749332244, + 112435041197096536, + 21888242871839275222246405745257275088548364400416034343698123712315080766912, + 21888242871839275222246405745257275088548364400416034343698191752639708939201, + 107810977436455880, + 136840643526865425, + 21888242871839275222246405745257275088548364400416034343698085077840226853748, + 97586069019676552, + 21888242871839275222246405745257275088548364400416034343698061781511058318618, + 21888242871839275222246405745257275088548364400416034343698096894689968661741, + 79178729993200213, + 21888242871839275222246405745257275088548364400416034343698129531108079568888, + 21888242871839275222246405745257275088548364400416034343698095677996621132940, + 21888242871839275222246405745257275088548364400416034343698094669310959528659, + 21888242871839275222246405745257275088548364400416034343698147327538454294264, + 77790613545342220, + 21888242871839275222246405745257275088548364400416034343698178900518320825955, + 64932042036527485, + 21888242871839275222246405745257275088548364400416034343698102475853079864630, + 107879781873382028, + 35993930918368763, + 21888242871839275222246405745257275088548364400416034343698154205354364206113, + 21888242871839275222246405745257275088548364400416034343698170491906231879934, + 127347933502127172, + 21888242871839275222246405745257275088548364400416034343698092043135503915356, + 75611256772703292, + 116435299593707984, + 21888242871839275222246405745257275088548364400416034343698197285760589111454, + 141001338694875447, + 21888242871839275222246405745257275088548364400416034343698107985947403108404, + 22676824825695352, + 15421905542561799, + 21888242871839275222246405745257275088548364400416034343698169333851453327837, + 86698186238535025, + 21888242871839275222246405745257275088548364400416034343698147818228875712819, + 21888242871839275222246405745257275088548364400416034343698131306029199942093, + 21888242871839275222246405745257275088548364400416034343698070196214115214343, + 21888242871839275222246405745257275088548364400416034343698138541384271407543, + 131683236205925554, + 89244768804053655, + 21888242871839275222246405745257275088548364400416034343698167939643551760347, + 59324803741047699, + 79206384085752839, + 21888242871839275222246405745257275088548364400416034343698142663862530069147, + 64421673660759778, + 21888242871839275222246405745257275088548364400416034343698087601853440928050, + 20648787976252626, + 21888242871839275222246405745257275088548364400416034343698123457392401651022, + 21888242871839275222246405745257275088548364400416034343698198158427733508806, + 102610517441236246, + 21888242871839275222246405745257275088548364400416034343698124507971174603940, + 92399443512353722, + 21888242871839275222246405745257275088548364400416034343698116171634301790968, + 42827426431132295, + 14945889330118678, + 21888242871839275222246405745257275088548364400416034343698159714752000724687, + 21888242871839275222246405745257275088548364400416034343698193454180993705921, + 53584520270949778, + 21888242871839275222246405745257275088548364400416034343698192406653650006632, + 21888242871839275222246405745257275088548364400416034343698085967317187232379, + 112538053579004343, + 25528298922844721, + 29060730706131249, + 35846505860308988, + 21888242871839275222246405745257275088548364400416034343698172714481791440881, + 141106803974949308, + 54594918246850263, + 43313628428957063, + 93689415554277326, + 110931938017970396, + 21888242871839275222246405745257275088548364400416034343698084508296936372247, + 96258686680256349, + 21888242871839275222246405745257275088548364400416034343698095782746146201600, + 79533311095361756, + 21888242871839275222246405745257275088548364400416034343698084946434398484315, + 31852988878592427, + 21888242871839275222246405745257275088548364400416034343698110979411249768047, + 62440818576762649, + 21888242871839275222246405745257275088548364400416034343698118650049648985955, + 21888242871839275222246405745257275088548364400416034343698203639365167825829, + 37267565263235973, + 5979410290178896, + 29508903980619069, + 113238426203222179, + 21888242871839275222246405745257275088548364400416034343698138280281724705866, + 33053999720078700, + 8955945633980678, + 21888242871839275222246405745257275088548364400416034343698154598194375631221, + 62167002279961336, + 21888242871839275222246405745257275088548364400416034343698182431871978161135, + 57398036821438611, + 11811854960208288, + 26812286066558231, + 64933589294035377, + 21888242871839275222246405745257275088548364400416034343698135206960009054989, + 62982093576927921, + 21888242871839275222246405745257275088548364400416034343698149002962075894613, + 20192364982844122, + 53038409039578938, + 94658782569864702, + 4894993854297484, + 21888242871839275222246405745257275088548364400416034343698063756004857997728, + 21888242871839275222246405745257275088548364400416034343698201002980422873369, + 2897650697226686, + 143963978791181152, + 21888242871839275222246405745257275088548364400416034343698136919171663153555, + 21888242871839275222246405745257275088548364400416034343698068564191621225141, + 17016561317357969, + 21888242871839275222246405745257275088548364400416034343698190323790261378768, + 65434431812042714, + 21888242871839275222246405745257275088548364400416034343698169296702167317305, + 104320851200072128, + 21888242871839275222246405745257275088548364400416034343698158994232116649938, + 108271067447540955, + 18524322941485332, + 21888242871839275222246405745257275088548364400416034343698106473323231031071, + 102027112522760741, + 21888242871839275222246405745257275088548364400416034343698184009457149506947, + 21888242871839275222246405745257275088548364400416034343698119303320178538148, + 36210034518437701, + 132114362195540892, + 61002656136186330, + 21888242871839275222246405745257275088548364400416034343698075102190328820154, + 21888242871839275222246405745257275088548364400416034343698132338196948364066, + 130350556824929641, + 122404666887610382, + 21888242871839275222246405745257275088548364400416034343698152774345637401299, + 7413822952191818, + 21888242871839275222246405745257275088548364400416034343698074698732396223244, + 21888242871839275222246405745257275088548364400416034343698156133315877468471, + 40269718125155578, + 67850279268140235, + 123700560671901476, + 3718799472126792, + 47248675476704902, + 21888242871839275222246405745257275088548364400416034343698152397925251266532, + 21888242871839275222246405745257275088548364400416034343698066958860571843516, + 24397199965705562, + 21888242871839275222246405745257275088548364400416034343698081314040249441323, + 24253000279456314, + 21888242871839275222246405745257275088548364400416034343698086028136791162008, + 21888242871839275222246405745257275088548364400416034343698064381678171069307, + 21888242871839275222246405745257275088548364400416034343698133119577951622761, + 21888242871839275222246405745257275088548364400416034343698168124819328438635, + 106910474787964345, + 21888242871839275222246405745257275088548364400416034343698143264633630238187, + 128517558425395391, + 21888242871839275222246405745257275088548364400416034343698124258277857502384, + 21888242871839275222246405745257275088548364400416034343698067620626645619190, + 5811898581195730, + 143102460790312345, + 14402422256886931, + 21888242871839275222246405745257275088548364400416034343698184034811132748399, + 43572543030038985, + 113082571444531391, + 34725606007067567, + 21888242871839275222246405745257275088548364400416034343698081051765642908347, + 43684817827758171, + 92387575516947396, + 8242051979709061, + 21888242871839275222246405745257275088548364400416034343698152205505313694764, + 75857668302564688, + 52689390707807850, + 21888242871839275222246405745257275088548364400416034343698196721155523619502, + 124157148429363971, + 21888242871839275222246405745257275088548364400416034343698071965465054134946, + 21888242871839275222246405745257275088548364400416034343698084147887226801521, + 50053590921893160, + 21888242871839275222246405745257275088548364400416034343698151971880073751694, + 21888242871839275222246405745257275088548364400416034343698062796717179689877, + 99515519344180860, + 11123944276141128, + 21888242871839275222246405745257275088548364400416034343698176785651338237529, + 21888242871839275222246405745257275088548364400416034343698110118654965279757, + 91154260753283327, + 21888242871839275222246405745257275088548364400416034343698066619627132311120, + 14033215417808472, + 21888242871839275222246405745257275088548364400416034343698180884871029584059, + 31976317372978057, + 73546204592049168, + 38638093866808572, + 21888242871839275222246405745257275088548364400416034343698138206303615039309, + 116333292881242975, + 17293150179978826, + 92690182195850613, + 92179153593378025, + 71814220225799525, + 21888242871839275222246405745257275088548364400416034343698178289206776655520, + 21888242871839275222246405745257275088548364400416034343698137365856314670138, + 133408340272153937, + 21888242871839275222246405745257275088548364400416034343698154566638877620032, + 22096261323584351, + 29617916255941652, + 21888242871839275222246405745257275088548364400416034343698152787221025990069, + 21888242871839275222246405745257275088548364400416034343698107106137861596014, + 123837296541980942, + 24844627619276241, + 27617346581208343, + 110875339475498497, + 126660782969719074, + 141244019662793779, + 21888242871839275222246405745257275088548364400416034343698192542215499952900, + 21888242871839275222246405745257275088548364400416034343698103343868757130385, + 5651727905119017, + 25664357667838758, + 21888242871839275222246405745257275088548364400416034343698073767591273627315, + 21888242871839275222246405745257275088548364400416034343698182989589558563032, + 21888242871839275222246405745257275088548364400416034343698109894167363194335, + 21888242871839275222246405745257275088548364400416034343698133162507315042734, + 21888242871839275222246405745257275088548364400416034343698128634190943147608, + 139317597061596302, + 21888242871839275222246405745257275088548364400416034343698184551519186145067, + 21888242871839275222246405745257275088548364400416034343698134789523242847853, + 21888242871839275222246405745257275088548364400416034343698074786554146310528, + 21888242871839275222246405745257275088548364400416034343698123530756793718880, + 70669595569272971, + 21888242871839275222246405745257275088548364400416034343698084697067170308484, + 21888242871839275222246405745257275088548364400416034343698129238473636636747, + 21888242871839275222246405745257275088548364400416034343698125530181351505304, + 21888242871839275222246405745257275088548364400416034343698183240999047483187, + 21888242871839275222246405745257275088548364400416034343698103144089478132263, + 104154567700091096, + 21888242871839275222246405745257275088548364400416034343698170744636671288374, + 22415032728098042, + 21888242871839275222246405745257275088548364400416034343698177250191799168729, + 21888242871839275222246405745257275088548364400416034343698115095141601407498, + 125330986678890238, + 21888242871839275222246405745257275088548364400416034343698167956683974957763, + 21888242871839275222246405745257275088548364400416034343698109052849551320946, + 21888242871839275222246405745257275088548364400416034343698159731389016665397, + 21888242871839275222246405745257275088548364400416034343698122520357397933565, + 21888242871839275222246405745257275088548364400416034343698103831140976154508, + 101384339669582165, + 21888242871839275222246405745257275088548364400416034343698128034309350229338, + 21888242871839275222246405745257275088548364400416034343698127074761524382866, + 21888242871839275222246405745257275088548364400416034343698161790549609837178, + 43339859278741647, + 21888242871839275222246405745257275088548364400416034343698101799366781476967, + 75205832613246332, + 25001511288913497, + 16676504271091397, + 80985589318211324, + 16737827812244362, + 90141584414761085, + 21888242871839275222246405745257275088548364400416034343698147976202414026355, + 137217215137147716, + 49917991885849254, + 78578624351678833, + 21888242871839275222246405745257275088548364400416034343698203940204994481137, + 71889777463450525, + 49872348491807382, + 21888242871839275222246405745257275088548364400416034343698095018040456765570, + 21888242871839275222246405745257275088548364400416034343698081294076864496867, + 140745037220469233, + 45040883419040490, + 21888242871839275222246405745257275088548364400416034343698071632643821947055, + 84170280939910479, + 131443889397220492, + 110658316087518818, + 21888242871839275222246405745257275088548364400416034343698155201561898718553, + 21888242871839275222246405745257275088548364400416034343698098535674856951515, + 67807236940041488, + 34505107680183499, + 24915607606199625, + 47402198423347910, + 21888242871839275222246405745257275088548364400416034343698063584133082790169, + 21888242871839275222246405745257275088548364400416034343698161971304839727148, + 56596149320398347, + 115998825028233404, + 21888242871839275222246405745257275088548364400416034343698069557176478801033, + 105854079851630271, + 21888242871839275222246405745257275088548364400416034343698124220650921404599, + 21888242871839275222246405745257275088548364400416034343698183076155642125366, + 21888242871839275222246405745257275088548364400416034343698083827870426801583, + 118662506939535431, + 34147884219112445, + 134679558505696769, + 90000353309503499, + 21888242871839275222246405745257275088548364400416034343698195095644304777096, + 21888242871839275222246405745257275088548364400416034343698109061615890509264, + 21888242871839275222246405745257275088548364400416034343698179413099343870337, + 21888242871839275222246405745257275088548364400416034343698066388821052294266, + 87234277156579753, + 82228314811869455, + 128496993606797729, + 21888242871839275222246405745257275088548364400416034343698109129709539483650, + 21888242871839275222246405745257275088548364400416034343698134077593206272497, + 142393825381005767, + 40790434699173611, + 21888242871839275222246405745257275088548364400416034343698181455379849119615, + 101229743603264604, + 98139298179689390, + 21888242871839275222246405745257275088548364400416034343698077387584776348311, + 114381327690831375, + 21888242871839275222246405745257275088548364400416034343698091550616196480186, + 21888242871839275222246405745257275088548364400416034343698088373417340988373, + 21888242871839275222246405745257275088548364400416034343698148649111649799266, + 21888242871839275222246405745257275088548364400416034343698076570074389322052, + 21888242871839275222246405745257275088548364400416034343698141530837179116455, + 113822140602270309, + 21888242871839275222246405745257275088548364400416034343698104039948859450418, + 21888242871839275222246405745257275088548364400416034343698087441815434452521, + 21888242871839275222246405745257275088548364400416034343698134677662468156746, + 21888242871839275222246405745257275088548364400416034343698202699678603528032, + 134350379525639306, + 21888242871839275222246405745257275088548364400416034343698189848523727965045, + 22942178498467956, + 21888242871839275222246405745257275088548364400416034343698119598523094494071, + 21888242871839275222246405745257275088548364400416034343698100085932114646013, + 56884398405472100, + 21888242871839275222246405745257275088548364400416034343698158148307195144491, + 101860524706930502, + 21888242871839275222246405745257275088548364400416034343698151054686808559566, + 21888242871839275222246405745257275088548364400416034343698113305276454792364, + 91249137890750678, + 21888242871839275222246405745257275088548364400416034343698154650541414051210, + 21888242871839275222246405745257275088548364400416034343698196552942685174866, + 21888242871839275222246405745257275088548364400416034343698126647887571313709, + 21888242871839275222246405745257275088548364400416034343698179276922497875528, + 38038607915923950, + 21888242871839275222246405745257275088548364400416034343698063320183405343570, + 21888242871839275222246405745257275088548364400416034343698110844425923739878, + 21888242871839275222246405745257275088548364400416034343698200962336954898938, + 13169375547660361, + 141286520666145222, + 21888242871839275222246405745257275088548364400416034343698152165501662712158, + 96551615706556378, + 56562513348588009, + 27097115636812744, + 21888242871839275222246405745257275088548364400416034343698185296964771536754, + 38878443659913130, + 70291095639334531, + 55874362480477764, + 63349563835927728, + 127956759810988197, + 67021373339627808, + 21888242871839275222246405745257275088548364400416034343698159372080766337619, + 21888242871839275222246405745257275088548364400416034343698171524238074376621, + 105713458428939917, + 66344890641918303, + 133287144610447846, + 70298340087998717, + 21888242871839275222246405745257275088548364400416034343698171529173846143954, + 21888242871839275222246405745257275088548364400416034343698133317628292820959, + 21888242871839275222246405745257275088548364400416034343698153033833102711824, + 115749479435155656, + 21888242871839275222246405745257275088548364400416034343698161809305693165104, + 62742496416639375, + 133080570494183440, + 21888242871839275222246405745257275088548364400416034343698075621332750741790, + 21888242871839275222246405745257275088548364400416034343698173916706134948671, + 92325322219351661, + 21888242871839275222246405745257275088548364400416034343698095077386564798580, + 21888242871839275222246405745257275088548364400416034343698118400198757592373, + 21888242871839275222246405745257275088548364400416034343698168314464316622143, + 21888242871839275222246405745257275088548364400416034343698137725790970561870, + 21888242871839275222246405745257275088548364400416034343698158756185358869021, + 92830234238480618, + 10296228828200764, + 21888242871839275222246405745257275088548364400416034343698119815608386621555, + 21888242871839275222246405745257275088548364400416034343698094671435257801405, + 21888242871839275222246405745257275088548364400416034343698100370061505621124, + 21888242871839275222246405745257275088548364400416034343698148049021786351544, + 35719673591468114, + 21888242871839275222246405745257275088548364400416034343698155423113363561985, + 21888242871839275222246405745257275088548364400416034343698164750931063363968, + 131991491234281424, + 21888242871839275222246405745257275088548364400416034343698085463910332153393, + 21888242871839275222246405745257275088548364400416034343698131722223891865447, + 141000793394893695, + 6938533674975517, + 110528928520661399, + 21888242871839275222246405745257275088548364400416034343698123804426536150307, + 21888242871839275222246405745257275088548364400416034343698099076271714570834, + 21888242871839275222246405745257275088548364400416034343698099195393684485007, + 122791444849272985, + 21888242871839275222246405745257275088548364400416034343698171617453340935652, + 21888242871839275222246405745257275088548364400416034343698197121555975677252, + 92238596818078689, + 21888242871839275222246405745257275088548364400416034343698196867880244845814, + 21888242871839275222246405745257275088548364400416034343698118736044673846605, + 21888242871839275222246405745257275088548364400416034343698161059520006947810, + 21888242871839275222246405745257275088548364400416034343698110600438607868136, + 112012011999516811, + 21888242871839275222246405745257275088548364400416034343698134476348372662216, + 143395758440332871, + 98788983642240740, + 18655340766292038, + 130507827260731233, + 21888242871839275222246405745257275088548364400416034343698115079444805005685, + 54253155473809316, + 21888242871839275222246405745257275088548364400416034343698164099102719493704, + 21888242871839275222246405745257275088548364400416034343698176725711136874061, + 114338604733162093, + 21888242871839275222246405745257275088548364400416034343698128914950884638853, + 127478355873017122, + 14511044831653432, + 7411294555250421, + 116400522045550631, + 21888242871839275222246405745257275088548364400416034343698166694247117378493, + 39530220239497765, + 21888242871839275222246405745257275088548364400416034343698091014393680041623, + 143966873517478176, + 52181466653118364, + 21888242871839275222246405745257275088548364400416034343698082961759521133752, + 141181403467002510, + 21888242871839275222246405745257275088548364400416034343698171875642732450832, + 102311263345774770, + 21888242871839275222246405745257275088548364400416034343698085021823236765613, + 21888242871839275222246405745257275088548364400416034343698064729694609658178, + 21888242871839275222246405745257275088548364400416034343698199287197726728741, + 27246529764663317, + 234315482929341, + 67508829680923660, + 21888242871839275222246405745257275088548364400416034343698175595367526559130, + 21888242871839275222246405745257275088548364400416034343698128861474325392579, + 140582908233388512, + 65761486470095791, + 7996860545323331, + 21888242871839275222246405745257275088548364400416034343698203705412166460087, + 17089558414308329, + 21888242871839275222246405745257275088548364400416034343698150572154862409341, + 21888242871839275222246405745257275088548364400416034343698196644227954862630, + 3795558416515782, + 19288789302356838, + 41322968879941963, + 302812946727067, + 21888242871839275222246405745257275088548364400416034343698156212249099247392, + 21888242871839275222246405745257275088548364400416034343698144505085907056118, + 126500698293416341, + 121193543197670467, + 21888242871839275222246405745257275088548364400416034343698133268813428637548, + 21888242871839275222246405745257275088548364400416034343698160581208689985550, + 21888242871839275222246405745257275088548364400416034343698189618480252811776, + 21888242871839275222246405745257275088548364400416034343698061669688459630498, + 21888242871839275222246405745257275088548364400416034343698129638551765667129, + 103076827543685338, + 51612279079070009, + 141008500817052527, + 38981341235606560, + 21888242871839275222246405745257275088548364400416034343698172655722410163002, + 106748492112236132, + 21888242871839275222246405745257275088548364400416034343698172680344938817051, + 21888242871839275222246405745257275088548364400416034343698146516607385169654, + 21888242871839275222246405745257275088548364400416034343698146889528550466717, + 21888242871839275222246405745257275088548364400416034343698060953108883208526, + 75292495723798421, + 21888242871839275222246405745257275088548364400416034343698136846849937558685, + 21888242871839275222246405745257275088548364400416034343698121706620736760788, + 76515965819572402, + 81225530506978498, + 21888242871839275222246405745257275088548364400416034343698163036971354959083, + 21888242871839275222246405745257275088548364400416034343698117409164589835705, + 141031631980157327, + 21888242871839275222246405745257275088548364400416034343698104926971549547810, + 21888242871839275222246405745257275088548364400416034343698117536996101733502, + 617020387618312, + 103897503906829730, + 21888242871839275222246405745257275088548364400416034343698171638149741931756, + 21888242871839275222246405745257275088548364400416034343698188947921870475664, + 120344442234948279, + 21888242871839275222246405745257275088548364400416034343698098337848579491644, + 21888242871839275222246405745257275088548364400416034343698123105312355247181, + 21888242871839275222246405745257275088548364400416034343698106267184270130299, + 73989163273372805, + 21888242871839275222246405745257275088548364400416034343698081929379728009051, + 62298854227720911, + 16252582138305313, + 21888242871839275222246405745257275088548364400416034343698142810524400592413, + 21888242871839275222246405745257275088548364400416034343698132858082694866576, + 21888242871839275222246405745257275088548364400416034343698098195564060834185, + 55757582380593643, + 142717978661589360, + 104722170236486360, + 111928077602692366, + 6723143361380200, + 21888242871839275222246405745257275088548364400416034343698071157447751950880, + 21888242871839275222246405745257275088548364400416034343698149708108839656948, + 132464576969942010, + 51917701565203233, + 101735390803691551, + 21888242871839275222246405745257275088548364400416034343698078870422279256874, + 110927625692190324, + 16560603475758726, + 21888242871839275222246405745257275088548364400416034343698194422129809430684, + 50405329310461292, + 21888242871839275222246405745257275088548364400416034343698135258240513104660, + 20214066102600938, + 21888242871839275222246405745257275088548364400416034343698077483823579992453, + 21888242871839275222246405745257275088548364400416034343698139850192514294908, + 63854825766039970, + 56094669039842346, + 3121072192917545, + 91437869778730460, + 21888242871839275222246405745257275088548364400416034343698137493240123593421, + 42390706999580873, + 21888242871839275222246405745257275088548364400416034343698100512456265598431, + 76520609034511003, + 21888242871839275222246405745257275088548364400416034343698121805206632065850, + 21888242871839275222246405745257275088548364400416034343698067163547804907704, + 12691681112399161, + 101593938450099303, + 21888242871839275222246405745257275088548364400416034343698198275497372604383, + 21888242871839275222246405745257275088548364400416034343698109252824498770960, + 21888242871839275222246405745257275088548364400416034343698123421173328441774, + 131892731821870267, + 118963827125706109, + 124746411390715881, + 21888242871839275222246405745257275088548364400416034343698189099762012108189, + 23606747443276438, + 51146458361259181, + 37761702215079276, + 96403823369885749, + 21888242871839275222246405745257275088548364400416034343698160201758798580097, + 14253598156729263, + 21888242871839275222246405745257275088548364400416034343698104596618299448215, + 140192644218178265, + 16320723055627508, + 21888242871839275222246405745257275088548364400416034343698125997467294225701, + 142512816290679363, + 21888242871839275222246405745257275088548364400416034343698155726217744455676, + 21888242871839275222246405745257275088548364400416034343698170245312480410827, + 83761115667472654, + 12275112841940496, + 21888242871839275222246405745257275088548364400416034343698123305227008901916, + 25337566100250279, + 21888242871839275222246405745257275088548364400416034343698125833856176678644, + 21888242871839275222246405745257275088548364400416034343698093888911551477529, + 21888242871839275222246405745257275088548364400416034343698174437965849432035, + 36156002559098810, + 36267767506917280, + 21888242871839275222246405745257275088548364400416034343698066436381950745890, + 21888242871839275222246405745257275088548364400416034343698097038014063461438, + 21888242871839275222246405745257275088548364400416034343698111660343385723593, + 4882830131195982, + 21888242871839275222246405745257275088548364400416034343698176730029825156702, + 21888242871839275222246405745257275088548364400416034343698168607245364555350, + 67113829604739011, + 21888242871839275222246405745257275088548364400416034343698139632980200767785, + 21888242871839275222246405745257275088548364400416034343698087924587975612152, + 21888242871839275222246405745257275088548364400416034343698166050854199621374, + 45694467961137812, + 9221757499787757, + 38164787825304191, + 21888242871839275222246405745257275088548364400416034343698145724622610777772, + 25700074152407749, + 34565064289730276, + 21888242871839275222246405745257275088548364400416034343698096686044227311485, + 6449645653287880, + 21888242871839275222246405745257275088548364400416034343698075697301901443985, + 21888242871839275222246405745257275088548364400416034343698060119276208223857, + 21888242871839275222246405745257275088548364400416034343698195532669045687137, + 41898567149130146, + 21888242871839275222246405745257275088548364400416034343698144540053431425347, + 21888242871839275222246405745257275088548364400416034343698067819694396423562, + 51983014168570339, + 72045189523126990, + 22671629912143772, + 21888242871839275222246405745257275088548364400416034343698098046375328579989, + 89501077258283908, + 21048272300968929, + 21888242871839275222246405745257275088548364400416034343698100521573080404177, + 21888242871839275222246405745257275088548364400416034343698142839772667123714, + 96247845231070744, + 21888242871839275222246405745257275088548364400416034343698145981249063998537, + 21888242871839275222246405745257275088548364400416034343698152227737478465939, + 64923937424254181, + 57220880686823770, + 21888242871839275222246405745257275088548364400416034343698070796756946322283, + 21888242871839275222246405745257275088548364400416034343698133151566423772066, + 62305666723917901, + 7691697713862784, + 57934679114169544, + 36681367004408673, + 21888242871839275222246405745257275088548364400416034343698110575208076906534, + 104942137296733610, + 70714536220768271, + 21888242871839275222246405745257275088548364400416034343698110670093579235227, + 107878209221553, + 91437103000037493, + 21888242871839275222246405745257275088548364400416034343698158667258460550289, + 67012708949747123, + 21888242871839275222246405745257275088548364400416034343698147957734313273725, + 21888242871839275222246405745257275088548364400416034343698095405637720928642, + 21888242871839275222246405745257275088548364400416034343698085196855882473760, + 137138869797766817, + 21888242871839275222246405745257275088548364400416034343698064554771923085486, + 104576777446571295, + 21888242871839275222246405745257275088548364400416034343698181798332892117159, + 21888242871839275222246405745257275088548364400416034343698159616640627625289, + 9122252975124900, + 68745893802590082, + 21888242871839275222246405745257275088548364400416034343698060823783254038535, + 21888242871839275222246405745257275088548364400416034343698071446591909402177, + 38801195889590264, + 127998180436278846, + 125628438318689218, + 98858090021414678, + 58502833109557453, + 21888242871839275222246405745257275088548364400416034343698102572961255117189, + 60627072884797582, + 21888242871839275222246405745257275088548364400416034343698180192995312358286, + 21888242871839275222246405745257275088548364400416034343698063208451509049687, + 21888242871839275222246405745257275088548364400416034343698126263389856751904, + 21888242871839275222246405745257275088548364400416034343698098530391561126842, + 21888242871839275222246405745257275088548364400416034343698074970067223007736, + 118208676808823342, + 126864338189476849, + 21888242871839275222246405745257275088548364400416034343698088329713197828449, + 24819446780752027, + 21888242871839275222246405745257275088548364400416034343698127453701814826733, + 21888242871839275222246405745257275088548364400416034343698190328458239187185, + 21888242871839275222246405745257275088548364400416034343698197851931457832249, + 86789209353987679, + 94378393337233972, + 21888242871839275222246405745257275088548364400416034343698187226010843255402, + 21888242871839275222246405745257275088548364400416034343698126915128249970009, + 21888242871839275222246405745257275088548364400416034343698196420886293365794, + 108324109215795854, + 21888242871839275222246405745257275088548364400416034343698110419208028929229, + 21888242871839275222246405745257275088548364400416034343698106670705269996186, + 21888242871839275222246405745257275088548364400416034343698067836133391820657, + 21888242871839275222246405745257275088548364400416034343698073244753042605487, + 21888242871839275222246405745257275088548364400416034343698198381170523364514, + 21888242871839275222246405745257275088548364400416034343698157533279538541601, + 129207782760118281, + 87000505503941270, + 21888242871839275222246405745257275088548364400416034343698077172304108549224, + 61366438642970497, + 50912693019667583, + 106292674114315740, + 110461210763603988, + 21888242871839275222246405745257275088548364400416034343698165781655023185775, + 21888242871839275222246405745257275088548364400416034343698154770845579087750, + 21888242871839275222246405745257275088548364400416034343698157677976005350917, + 21888242871839275222246405745257275088548364400416034343698091477876057758902, + 70252782397651348, + 21888242871839275222246405745257275088548364400416034343698072334533543618948, + 12134135689163647, + 21888242871839275222246405745257275088548364400416034343698194882402219823681, + 139228006515340480, + 21888242871839275222246405745257275088548364400416034343698085895390546489423, + 21888242871839275222246405745257275088548364400416034343698159831318204455178, + 126807696547804798, + 143828825122241718, + 132292569598482742, + 108719404082747301, + 85507143407333649, + 21888242871839275222246405745257275088548364400416034343698086667422285065880, + 21888242871839275222246405745257275088548364400416034343698152742081934478232, + 21888242871839275222246405745257275088548364400416034343698120498468896846736, + 21888242871839275222246405745257275088548364400416034343698165725970189027847, + 21888242871839275222246405745257275088548364400416034343698069813475493871763, + 21888242871839275222246405745257275088548364400416034343698118008057231759350, + 124533224376905512, + 14922471439607325, + 21888242871839275222246405745257275088548364400416034343698203362024256506618, + 140113715474814915, + 21888242871839275222246405745257275088548364400416034343698116112431316158692, + 21888242871839275222246405745257275088548364400416034343698095916106021907070, + 21888242871839275222246405745257275088548364400416034343698125882051935033360, + 22016820342792614, + 50144385956963679, + 38674265425366727, + 21888242871839275222246405745257275088548364400416034343698176563790492009951, + 21888242871839275222246405745257275088548364400416034343698075217795283301322, + 21888242871839275222246405745257275088548364400416034343698079838907164554330, + 21888242871839275222246405745257275088548364400416034343698082090978384954037, + 21888242871839275222246405745257275088548364400416034343698157757267794228493, + 21888242871839275222246405745257275088548364400416034343698170465754882382049, + 21888242871839275222246405745257275088548364400416034343698100521449241548495, + 21888242871839275222246405745257275088548364400416034343698203861385788863713, + 21888242871839275222246405745257275088548364400416034343698153119589903317687, + 21888242871839275222246405745257275088548364400416034343698089485455229033483, + 13014893921810006, + 21888242871839275222246405745257275088548364400416034343698196393033549087756, + 21888242871839275222246405745257275088548364400416034343698145311652654727201, + 21888242871839275222246405745257275088548364400416034343698142987970320843877, + 21888242871839275222246405745257275088548364400416034343698146508304635201971, + 142284437155839556, + 33566980929487234, + 21888242871839275222246405745257275088548364400416034343698173647336602288563, + 21888242871839275222246405745257275088548364400416034343698182845420328841935, + 66712390689562303, + 67597627400419584, + 21888242871839275222246405745257275088548364400416034343698196220575388176067, + 138104132179100286, + 21888242871839275222246405745257275088548364400416034343698115747114837904429, + 21888242871839275222246405745257275088548364400416034343698076110172717257022, + 21888242871839275222246405745257275088548364400416034343698194623518148075736, + 21888242871839275222246405745257275088548364400416034343698079827993865591831, + 21888242871839275222246405745257275088548364400416034343698177677179867659164, + 15676509741032742, + 21888242871839275222246405745257275088548364400416034343698126973703948164831, + 133427403301450654, + 21888242871839275222246405745257275088548364400416034343698071495382176536346, + 21888242871839275222246405745257275088548364400416034343698156257644267758889, + 93186511754775082, + 21888242871839275222246405745257275088548364400416034343698145463989683606950, + 21888242871839275222246405745257275088548364400416034343698143862929642640599, + 21888242871839275222246405745257275088548364400416034343698137939847726739312, + 21888242871839275222246405745257275088548364400416034343698112083064285615742, + 79363705142902775, + 21888242871839275222246405745257275088548364400416034343698121272205715640645, + 21888242871839275222246405745257275088548364400416034343698169926137096171707, + 21888242871839275222246405745257275088548364400416034343698164772129816969182, + 21888242871839275222246405745257275088548364400416034343698149137299178574799, + 21888242871839275222246405745257275088548364400416034343698067103729003967570, + 21888242871839275222246405745257275088548364400416034343698190454723821096409, + 21888242871839275222246405745257275088548364400416034343698164619666734867415, + 21888242871839275222246405745257275088548364400416034343698086069006818821670, + 21888242871839275222246405745257275088548364400416034343698126561158401504987, + 102984701181063317, + 21888242871839275222246405745257275088548364400416034343698151499701486677066, + 24534106191940841, + 21888242871839275222246405745257275088548364400416034343698070945833021521648, + 61933943426131342, + 56025946463279395, + 108000201099871875, + 48611384195343849, + 57419890837286290, + 21888242871839275222246405745257275088548364400416034343698143009176813510631, + 52351571667648003, + 9197815766902915, + 21888242871839275222246405745257275088548364400416034343698139155600620599550, + 21888242871839275222246405745257275088548364400416034343698161900740324776612, + 60328176933961721, + 129469011077504983, + 21888242871839275222246405745257275088548364400416034343698064921048710333843, + 21888242871839275222246405745257275088548364400416034343698094728537210436571, + 21888242871839275222246405745257275088548364400416034343698162260296865597684, + 21888242871839275222246405745257275088548364400416034343698192523242496874253, + 21888242871839275222246405745257275088548364400416034343698128990053625655644, + 21888242871839275222246405745257275088548364400416034343698146154915032438991, + 102921984115387089, + 21888242871839275222246405745257275088548364400416034343698079407458936158287, + 81482672969399910, + 21888242871839275222246405745257275088548364400416034343698153192500746089558, + 21888242871839275222246405745257275088548364400416034343698103803584732870096, + 21888242871839275222246405745257275088548364400416034343698062195590393135315, + 21888242871839275222246405745257275088548364400416034343698151510222032185111, + 140265053269432345, + 21888242871839275222246405745257275088548364400416034343698118001502547370262, + 79536115080300505, + 21888242871839275222246405745257275088548364400416034343698181592103892941084, + 21888242871839275222246405745257275088548364400416034343698167592693694292344, + 21888242871839275222246405745257275088548364400416034343698164254231706920877, + 21888242871839275222246405745257275088548364400416034343698099620556588659076, + 21888242871839275222246405745257275088548364400416034343698155100811501656284, + 109525106920446167, + 21888242871839275222246405745257275088548364400416034343698069059883637181973, + 21888242871839275222246405745257275088548364400416034343698190986051730611364, + 21888242871839275222246405745257275088548364400416034343698062545937639345463, + 106655299939305050, + 18539653564983658, + 631123491462378, + 83863600372184855, + 21888242871839275222246405745257275088548364400416034343698199381917713376836, + 97213360605602213, + 39805282824844534, + 115078652815972128, + 21888242871839275222246405745257275088548364400416034343698102828563240305246, + 70438225959559493, + 21888242871839275222246405745257275088548364400416034343698193520639416044126, + 21888242871839275222246405745257275088548364400416034343698124633961584259765, + 133222735248644956, + 21888242871839275222246405745257275088548364400416034343698122639339697673336, + 106320289034363304, + 21888242871839275222246405745257275088548364400416034343698171909479173277923, + 21888242871839275222246405745257275088548364400416034343698122693559352094631, + 21888242871839275222246405745257275088548364400416034343698114231564685506941, + 133491644367318711, + 21888242871839275222246405745257275088548364400416034343698200194563949814907, + 21888242871839275222246405745257275088548364400416034343698151586655406344933, + 21888242871839275222246405745257275088548364400416034343698138337579594715855, + 9103471389421124, + 21888242871839275222246405745257275088548364400416034343698125159772838539145, + 21888242871839275222246405745257275088548364400416034343698193615888075282705, + 24240223308455896, + 21888242871839275222246405745257275088548364400416034343698061387295732287414, + 87897267496843088, + 744965141374284, + 21888242871839275222246405745257275088548364400416034343698174285297427974824, + 79285947946348597, + 21888242871839275222246405745257275088548364400416034343698144290608891896664, + 21888242871839275222246405745257275088548364400416034343698199443082438601864, + 21888242871839275222246405745257275088548364400416034343698109882489519917758, + 21888242871839275222246405745257275088548364400416034343698087293683701186122, + 21888242871839275222246405745257275088548364400416034343698160110174602136701, + 143988816371553321, + 21888242871839275222246405745257275088548364400416034343698062567172790078317, + 21888242871839275222246405745257275088548364400416034343698192901241106397943, + 129660710063686895, + 12248313809125994, + 21888242871839275222246405745257275088548364400416034343698127197254865533072, + 17762410352401653, + 21888242871839275222246405745257275088548364400416034343698175328301399685119, + 21888242871839275222246405745257275088548364400416034343698098005569747206610, + 21888242871839275222246405745257275088548364400416034343698176614776489365830, + 116867943352816533, + 81157482742396703, + 21888242871839275222246405745257275088548364400416034343698162415005148636206, + 11507693408957104, + 96546865785188088, + 130798637316387351, + 21888242871839275222246405745257275088548364400416034343698064041698113756572, + 21888242871839275222246405745257275088548364400416034343698193133481434733784, + 21888242871839275222246405745257275088548364400416034343698062258673550950651, + 21888242871839275222246405745257275088548364400416034343698174395060431880085, + 21888242871839275222246405745257275088548364400416034343698133732213880005447, + 64726623102685708, + 21888242871839275222246405745257275088548364400416034343698178472939685441049, + 21888242871839275222246405745257275088548364400416034343698085836622970394433, + 21888242871839275222246405745257275088548364400416034343698062905703176752406, + 21888242871839275222246405745257275088548364400416034343698177071634906351547, + 21888242871839275222246405745257275088548364400416034343698091259174886837599, + 21888242871839275222246405745257275088548364400416034343698135664330403840417, + 64360045958565922, + 21888242871839275222246405745257275088548364400416034343698154146216198998023, + 74384614280204677, + 75097078820234979, + 117720873211749554, + 90737298304995541, + 114066930615264505, + 38089238313423080, + 21888242871839275222246405745257275088548364400416034343698132392226746072097, + 74421149859745944, + 21888242871839275222246405745257275088548364400416034343698103229949860150503, + 10808225784569118, + 55436128432436755, + 21888242871839275222246405745257275088548364400416034343698076570882171756654, + 91694324820755035, + 34105189366301457, + 74011404696026717, + 22047851539657114, + 6290707732973299, + 21888242871839275222246405745257275088548364400416034343698180186158639573010, + 95115442581813438, + 120587332636406235, + 90187603777759127, + 100933109856114503, + 124640207966581593, + 47865929213150141, + 21888242871839275222246405745257275088548364400416034343698115490716438512226, + 92970346370986086, + 21888242871839275222246405745257275088548364400416034343698191519194018704566, + 21888242871839275222246405745257275088548364400416034343698062178030418852853, + 21888242871839275222246405745257275088548364400416034343698074903974432058433, + 62438826938405486, + 36696427725987114, + 21888242871839275222246405745257275088548364400416034343698156447236789294600, + 48654460495480827, + 63957884659644775, + 131109597150712136, + 63301945712809621, + 21888242871839275222246405745257275088548364400416034343698145919658746567609, + 109957235770826881, + 21888242871839275222246405745257275088548364400416034343698170743100536014278, + 109962043705578723, + 21888242871839275222246405745257275088548364400416034343698085090985561925706, + 84566131256892953, + 21888242871839275222246405745257275088548364400416034343698132461588000273807, + 63794210567438770, + 81814186600611851, + 21888242871839275222246405745257275088548364400416034343698086376816518739515, + 6952132911589509, + 94583639772795179, + 121501671789901735, + 21888242871839275222246405745257275088548364400416034343698130929879601869877, + 136317186738506630, + 110821742989150231, + 21888242871839275222246405745257275088548364400416034343698081852753678495545, + 93506055399723265, + 47163945625498232, + 49061805734436333, + 21888242871839275222246405745257275088548364400416034343698072479971708932594, + 21888242871839275222246405745257275088548364400416034343698179787438153700023, + 12226326747836056, + 21888242871839275222246405745257275088548364400416034343698168002378400080319, + 21888242871839275222246405745257275088548364400416034343698192524800726863625, + 21888242871839275222246405745257275088548364400416034343698202857761118889333, + 21888242871839275222246405745257275088548364400416034343698078869715845580528, + 49657088594667203, + 90408599961331489, + 15269535840639429, + 21888242871839275222246405745257275088548364400416034343698081832357138286223, + 21888242871839275222246405745257275088548364400416034343698149972495952510522, + 59029172127868426, + 21888242871839275222246405745257275088548364400416034343698195648722439573148, + 21888242871839275222246405745257275088548364400416034343698175946118302805383, + 5360183100519476, + 21888242871839275222246405745257275088548364400416034343698184915412316192870, + 21888242871839275222246405745257275088548364400416034343698122734902740020898, + 57630734909301069, + 142099759875031887, + 95892497645025451, + 9327634342813592, + 21888242871839275222246405745257275088548364400416034343698075731428637359666, + 68635641673024846, + 82448960193737228, + 53353683035747657, + 137260272683280283, + 21888242871839275222246405745257275088548364400416034343698071451428653735958, + 21888242871839275222246405745257275088548364400416034343698154303219072946651, + 21888242871839275222246405745257275088548364400416034343698087524501721928484, + 21888242871839275222246405745257275088548364400416034343698189825835315487615, + 142691873868563840, + 87864394177196391, + 44463102393556769, + 21888242871839275222246405745257275088548364400416034343698175461476919008185, + 125758049747801303, + 24474840069611799, + 56625261354347503, + 137463132241599195, + 11359813193070859, + 30601002663418704, + 15300122538925028, + 96804314234675025, + 143996610494194360, + 96211817447889943, + 13948630398725851, + 15552868905237112, + 129563750541433447, + 21888242871839275222246405745257275088548364400416034343698120358643266973541, + 78224906574411035, + 62347792282443402, + 36885033683403530, + 21888242871839275222246405745257275088548364400416034343698060940959907626560, + 42614410284243512, + 21888242871839275222246405745257275088548364400416034343698075366379030147044, + 21888242871839275222246405745257275088548364400416034343698090892382676948353, + 21888242871839275222246405745257275088548364400416034343698070009204562983024, + 21888242871839275222246405745257275088548364400416034343698137726443704164284, + 609629480465228, + 136405585666946020, + 21888242871839275222246405745257275088548364400416034343698112139905405792717, + 76061667960219693, + 140650814018662563, + 6889843290247151, + 21888242871839275222246405745257275088548364400416034343698175226230376022524, + 109901234133161707, + 21888242871839275222246405745257275088548364400416034343698120003035027377299, + 21888242871839275222246405745257275088548364400416034343698111471148260886002, + 133939745462469175, + 21888242871839275222246405745257275088548364400416034343698126292253404216345, + 18425877087722774, + 61135728670417238, + 99103240538200502, + 21888242871839275222246405745257275088548364400416034343698201861984881638601, + 90707839746043788, + 21888242871839275222246405745257275088548364400416034343698118111793861818125, + 29324050462959214, + 21888242871839275222246405745257275088548364400416034343698085020696235324769, + 139939317681734962, + 115335589047534705, + 113715047263833316, + 121338191569891477, + 21888242871839275222246405745257275088548364400416034343698111947927206999200, + 21888242871839275222246405745257275088548364400416034343698153905052149094343, + 13476497148642831, + 21888242871839275222246405745257275088548364400416034343698086802080776150405, + 490836224293607, + 138525256415781541, + 21888242871839275222246405745257275088548364400416034343698151852007222212623, + 21888242871839275222246405745257275088548364400416034343698119105248938306682, + 50933322046567863, + 21888242871839275222246405745257275088548364400416034343698163451624647282066, + 21888242871839275222246405745257275088548364400416034343698191177681192440307, + 26282945256951214, + 21888242871839275222246405745257275088548364400416034343698102739843448897133, + 21888242871839275222246405745257275088548364400416034343698093422797321456257, + 87783005198742229, + 81563748748715522, + 21888242871839275222246405745257275088548364400416034343698078691479950813206, + 21888242871839275222246405745257275088548364400416034343698099081782828150364, + 21888242871839275222246405745257275088548364400416034343698176202765545940004, + 21888242871839275222246405745257275088548364400416034343698153836783318713579, + 21888242871839275222246405745257275088548364400416034343698199369684257837823, + 55282966246077727, + 21888242871839275222246405745257275088548364400416034343698069376478762176101, + 21888242871839275222246405745257275088548364400416034343698136483241214539203, + 21888242871839275222246405745257275088548364400416034343698146925653324347124, + 78922555775631990, + 83869243929512938, + 100496380349467645, + 18970875506709091, + 104458301992549794, + 98160988278420173, + 21888242871839275222246405745257275088548364400416034343698118437903684723360, + 83232904309953592, + 40236061467281541, + 21888242871839275222246405745257275088548364400416034343698138168857581062977, + 107597979404973305, + 21888242871839275222246405745257275088548364400416034343698075574639015054744, + 21888242871839275222246405745257275088548364400416034343698146343902935539194, + 21888242871839275222246405745257275088548364400416034343698117038853777558790, + 21888242871839275222246405745257275088548364400416034343698118766829941460657, + 21888242871839275222246405745257275088548364400416034343698070974314321564418, + 32214692411915093, + 109169590023591511, + 35095615564082464, + 112595408761818855, + 21888242871839275222246405745257275088548364400416034343698149288792324257118, + 21888242871839275222246405745257275088548364400416034343698192482704429232399, + 31515939829675606, + 21888242871839275222246405745257275088548364400416034343698107094505515658666, + 21888242871839275222246405745257275088548364400416034343698111866415731727854, + 137450719212488963, + 21888242871839275222246405745257275088548364400416034343698136854815945005721, + 29357948927353963, + 21888242871839275222246405745257275088548364400416034343698138440785239272501, + 41624435518025885, + 122631523678168420, + 21888242871839275222246405745257275088548364400416034343698198655110046072986, + 92213492517948368, + 86321667619382913, + 21888242871839275222246405745257275088548364400416034343698157360335153643679, + 108243151473492607, + 21888242871839275222246405745257275088548364400416034343698149968638815128610, + 74304200104794097, + 5183581609156003, + 3148871868416980, + 54994448572606184, + 21888242871839275222246405745257275088548364400416034343698203348610319074585, + 44361164016431818, + 21888242871839275222246405745257275088548364400416034343698084246797818123891, + 93742510325038038, + 21888242871839275222246405745257275088548364400416034343698148579315565550912, + 135501916338728317, + 21888242871839275222246405745257275088548364400416034343698160277495383235924, + 130485602569555674, + 64255802265667037, + 109404753077476469, + 21888242871839275222246405745257275088548364400416034343698172016401476364888, + 21888242871839275222246405745257275088548364400416034343698201947121642248889, + 21888242871839275222246405745257275088548364400416034343698116044270321706441, + 21888242871839275222246405745257275088548364400416034343698135980084762480405, + 21888242871839275222246405745257275088548364400416034343698168607324596917649, + 21888242871839275222246405745257275088548364400416034343698080059076998801997, + 113091089974497262, + 21888242871839275222246405745257275088548364400416034343698114977081924121953, + 106921070926733905, + 85841171469488204, + 18670506022892981, + 21888242871839275222246405745257275088548364400416034343698071262623267616222, + 21888242871839275222246405745257275088548364400416034343698069314130860438160, + 17473499809627562, + 21888242871839275222246405745257275088548364400416034343698068089900148828137, + 111410262034288827, + 141575836323071570, + 21888242871839275222246405745257275088548364400416034343698060830538638534282, + 21888242871839275222246405745257275088548364400416034343698167295578708243840, + 114989644122416130, + 21888242871839275222246405745257275088548364400416034343698152154552082318599, + 21888242871839275222246405745257275088548364400416034343698128281663341301452, + 79299022376894176, + 85942752406657934, + 21888242871839275222246405745257275088548364400416034343698094882602042231764, + 111318841732758984, + 21888242871839275222246405745257275088548364400416034343698095389966392699331, + 59841742255838574, + 40051787045376675, + 133023050953254748, + 21888242871839275222246405745257275088548364400416034343698125961404680502533, + 21888242871839275222246405745257275088548364400416034343698092669368591678855, + 68252426509054876, + 21888242871839275222246405745257275088548364400416034343698181521845180575316, + 35312740704803879, + 21888242871839275222246405745257275088548364400416034343698110944334501251164, + 21888242871839275222246405745257275088548364400416034343698096015021080638829, + 11263270870415988, + 126549396085176971, + 21888242871839275222246405745257275088548364400416034343698155124906433359640, + 31539391051241468, + 21888242871839275222246405745257275088548364400416034343698100468119101080739, + 21888242871839275222246405745257275088548364400416034343698189360955592409885, + 21888242871839275222246405745257275088548364400416034343698191866623830055682, + 30984885987818457, + 95119454198153352, + 21888242871839275222246405745257275088548364400416034343698193124818192013333, + 123377063834034508, + 111862414973236056, + 21888242871839275222246405745257275088548364400416034343698146331384433625357, + 54243589107292894, + 99110442579693678, + 27726255173970982, + 95817551435031563, + 116247373774729189, + 87704734933165112, + 93609871428573849, + 21888242871839275222246405745257275088548364400416034343698133133905857657727, + 21888242871839275222246405745257275088548364400416034343698077142109197126475, + 137816314551710873, + 21888242871839275222246405745257275088548364400416034343698195373825729383384, + 107566590501665401, + 21888242871839275222246405745257275088548364400416034343698109551768582105232, + 39451707699881155, + 108528815343693312, + 118881530449048859, + 29771013813908187, + 21888242871839275222246405745257275088548364400416034343698151334099230699253, + 57389283103344561, + 123978166726906545, + 23586700651960850, + 108744283334283327, + 128871065577704223, + 21888242871839275222246405745257275088548364400416034343698075486843158877162, + 21888242871839275222246405745257275088548364400416034343698160458939134343520, + 141250199266298171, + 80934562342660537, + 5465143803616960, + 21888242871839275222246405745257275088548364400416034343698076115190904977553, + 111156459566033729, + 50975101639987582, + 21888242871839275222246405745257275088548364400416034343698169116198147289590, + 21888242871839275222246405745257275088548364400416034343698141172548034978860, + 21888242871839275222246405745257275088548364400416034343698171409884112323470, + 53317459723380002, + 21888242871839275222246405745257275088548364400416034343698173633992367930608, + 21888242871839275222246405745257275088548364400416034343698166689951112430031, + 45037227066948908, + 21888242871839275222246405745257275088548364400416034343698140093376472573181, + 21888242871839275222246405745257275088548364400416034343698109302145653410874, + 21888242871839275222246405745257275088548364400416034343698193167058223642365, + 21888242871839275222246405745257275088548364400416034343698149167171758175905, + 21888242871839275222246405745257275088548364400416034343698098793881152637113, + 120705094466575887, + 21888242871839275222246405745257275088548364400416034343698063316333610997894, + 21888242871839275222246405745257275088548364400416034343698117770695547662829, + 21888242871839275222246405745257275088548364400416034343698116971829742949789, + 21888242871839275222246405745257275088548364400416034343698120975660106280306, + 21888242871839275222246405745257275088548364400416034343698100174984712495117, + 47670258595195879, + 21888242871839275222246405745257275088548364400416034343698184248844072751447, + 51214156774477100, + 85779987702112696, + 78617956033634703, + 44360701895655697, + 126245448808231747, + 21888242871839275222246405745257275088548364400416034343698187218895632298144, + 21888242871839275222246405745257275088548364400416034343698120030450372701305, + 21888242871839275222246405745257275088548364400416034343698160891368432053968, + 136399155505548156, + 43084300012464193, + 21888242871839275222246405745257275088548364400416034343698191566287186820138, + 21888242871839275222246405745257275088548364400416034343698182467557127810877, + 109525481449202889, + 21888242871839275222246405745257275088548364400416034343698160921571192381096, + 21888242871839275222246405745257275088548364400416034343698145780064470964204, + 16116299837650358, + 21888242871839275222246405745257275088548364400416034343698193004475715629493, + 40397174037838464, + 21888242871839275222246405745257275088548364400416034343698200978641816938700, + 131066966177869100, + 21888242871839275222246405745257275088548364400416034343698191435173949103750, + 21888242871839275222246405745257275088548364400416034343698173505772489134386, + 68552637404598091, + 60752058849134922, + 38552574380208437, + 21888242871839275222246405745257275088548364400416034343698084746026142104345, + 21888242871839275222246405745257275088548364400416034343698189479383327444751, + 133364674599678111, + 21888242871839275222246405745257275088548364400416034343698187269073424937553, + 21888242871839275222246405745257275088548364400416034343698153787402796352011, + 21888242871839275222246405745257275088548364400416034343698177143913619651242, + 101044828986092661, + 19324973890204993, + 56190639437124913, + 71153511923505225, + 21888242871839275222246405745257275088548364400416034343698190030777053991974, + 21888242871839275222246405745257275088548364400416034343698074544381658240845, + 32586239077933365, + 118607888848162762, + 21888242871839275222246405745257275088548364400416034343698110646813095886260, + 21888242871839275222246405745257275088548364400416034343698200958728693872160, + 21888242871839275222246405745257275088548364400416034343698166325270506940073, + 56931344567302212, + 136994855328666731, + 21888242871839275222246405745257275088548364400416034343698108855786266712124, + 29996037960036868, + 34936840176419950, + 21888242871839275222246405745257275088548364400416034343698103798880862714973, + 111308453704597980, + 60838783879677259, + 21888242871839275222246405745257275088548364400416034343698185759709519314648, + 74078989965020128, + 49617124372739438, + 34103086138908809, + 38429633117185884, + 21888242871839275222246405745257275088548364400416034343698106758686369910063, + 21888242871839275222246405745257275088548364400416034343698155344155729517572, + 21888242871839275222246405745257275088548364400416034343698069378631007300968, + 21888242871839275222246405745257275088548364400416034343698094186551930451628, + 105540178270266359, + 5785555687793949, + 137903081014145730, + 21888242871839275222246405745257275088548364400416034343698134220595551902948, + 61045968178805242, + 22391398304599969, + 103043752159081966, + 21888242871839275222246405745257275088548364400416034343698121555390273110669, + 21888242871839275222246405745257275088548364400416034343698103829355405109544, + 83606870255710880, + 131420142688879185, + 84269531038727477, + 21888242871839275222246405745257275088548364400416034343698147873496163893046, + 21888242871839275222246405745257275088548364400416034343698160285082167950640, + 21888242871839275222246405745257275088548364400416034343698134279086595804669, + 21888242871839275222246405745257275088548364400416034343698181086583082923914, + 72340345105935135, + 73626953299432591, + 48008646296892445, + 21888242871839275222246405745257275088548364400416034343698115883038305740260, + 21888242871839275222246405745257275088548364400416034343698101089647532828769, + 21888242871839275222246405745257275088548364400416034343698063403051648624388, + 21888242871839275222246405745257275088548364400416034343698148313953760860971, + 21888242871839275222246405745257275088548364400416034343698188957289224467401, + 21888242871839275222246405745257275088548364400416034343698121607163779681957, + 21888242871839275222246405745257275088548364400416034343698188604883377182278, + 21888242871839275222246405745257275088548364400416034343698179204106046401236, + 21888242871839275222246405745257275088548364400416034343698151308601055233556, + 21888242871839275222246405745257275088548364400416034343698105206373864639156, + 48072865766935994, + 19535786314170355, + 53362414695271991, + 21888242871839275222246405745257275088548364400416034343698135917761698260148, + 97177363220690838, + 45352149775357880, + 21888242871839275222246405745257275088548364400416034343698087834230453988902, + 53906484223454773, + 77139820089912897, + 21888242871839275222246405745257275088548364400416034343698176263703792261173, + 91548460142438352, + 60827485338710201, + 27627413580956601, + 17034483656301487, + 21888242871839275222246405745257275088548364400416034343698064313705800927229, + 21888242871839275222246405745257275088548364400416034343698066742038132114627, + 103227811752088034, + 107382879019217806, + 57758253395756697, + 21888242871839275222246405745257275088548364400416034343698146612581956173707, + 36238784720596990, + 41586840842519475, + 21888242871839275222246405745257275088548364400416034343698179406907612986258, + 68269497882201121, + 21888242871839275222246405745257275088548364400416034343698119064180199939939, + 21888242871839275222246405745257275088548364400416034343698111229768950346995, + 50789842369769634, + 87984846818473950, + 21888242871839275222246405745257275088548364400416034343698143340688043913096, + 21888242871839275222246405745257275088548364400416034343698111887676316849018, + 21888242871839275222246405745257275088548364400416034343698078780127201174187, + 135944204545038169, + 21888242871839275222246405745257275088548364400416034343698143022573073773749, + 123028807254502140, + 21888242871839275222246405745257275088548364400416034343698081670846798872451, + 21888242871839275222246405745257275088548364400416034343698162541217769288523, + 103515615937499330, + 32141374041019852, + 21888242871839275222246405745257275088548364400416034343698095558798461160095, + 115066180990233275, + 21888242871839275222246405745257275088548364400416034343698089236004421863810, + 42210284889294434, + 43605117518349686, + 52975724754820563, + 21888242871839275222246405745257275088548364400416034343698165085802402271548, + 21888242871839275222246405745257275088548364400416034343698188420888237399830, + 21888242871839275222246405745257275088548364400416034343698164362509938349412, + 21888242871839275222246405745257275088548364400416034343698116497767550096600, + 21888242871839275222246405745257275088548364400416034343698072881659513650152, + 21888242871839275222246405745257275088548364400416034343698118519207067082408, + 71433997219397091, + 21888242871839275222246405745257275088548364400416034343698065525852312907836, + 31030911423368666, + 21888242871839275222246405745257275088548364400416034343698150410922191692169, + 21888242871839275222246405745257275088548364400416034343698127406955308157642, + 21888242871839275222246405745257275088548364400416034343698102186851655918474, + 106712579097208822, + 61477584248934842, + 21888242871839275222246405745257275088548364400416034343698062022823895579146, + 116515910582312480, + 46667604455196683, + 35570400854004251, + 133994627754612602, + 21888242871839275222246405745257275088548364400416034343698186452712345544103, + 48301120395024584, + 21888242871839275222246405745257275088548364400416034343698116733368805883622, + 21888242871839275222246405745257275088548364400416034343698110807693243964036, + 21888242871839275222246405745257275088548364400416034343698145515072759885945, + 70094928135961381, + 21888242871839275222246405745257275088548364400416034343698076886636169211240, + 21888242871839275222246405745257275088548364400416034343698126083967605683662, + 21888242871839275222246405745257275088548364400416034343698195960344551954032, + 21888242871839275222246405745257275088548364400416034343698136925163138181164, + 21888242871839275222246405745257275088548364400416034343698182741113130828853, + 86399953887282687, + 110306741492716817, + 77069404325998585, + 63134922755227137, + 15133515986900092, + 21888242871839275222246405745257275088548364400416034343698103864492246583204, + 21888242871839275222246405745257275088548364400416034343698143273645037783970, + 21888242871839275222246405745257275088548364400416034343698169277112816187539, + 93478209680134884, + 21888242871839275222246405745257275088548364400416034343698067006773224754433, + 117602510034973831, + 21888242871839275222246405745257275088548364400416034343698176449161796429064, + 6331316731449101, + 21888242871839275222246405745257275088548364400416034343698193753993698262309, + 118034615839767065, + 128844024359841508, + 36225551608953275, + 21888242871839275222246405745257275088548364400416034343698158956809305657570, + 128766618498857849, + 21888242871839275222246405745257275088548364400416034343698162937225538925995, + 125203575517525744, + 21888242871839275222246405745257275088548364400416034343698150274380671123585, + 21888242871839275222246405745257275088548364400416034343698167305480920915998, + 21888242871839275222246405745257275088548364400416034343698172689105627547117, + 21888242871839275222246405745257275088548364400416034343698195891758865315496, + 135710505464060841, + 95468501766479275, + 21888242871839275222246405745257275088548364400416034343698178274706020928738, + 21888242871839275222246405745257275088548364400416034343698093052538368966651, + 21888242871839275222246405745257275088548364400416034343698185594684673179349, + 37732153715825616, + 21888242871839275222246405745257275088548364400416034343698061500110466465797, + 21888242871839275222246405745257275088548364400416034343698096550226242324965, + 21888242871839275222246405745257275088548364400416034343698160722597788639731, + 21888242871839275222246405745257275088548364400416034343698074415374600966632, + 21888242871839275222246405745257275088548364400416034343698103954899879014395, + 21888242871839275222246405745257275088548364400416034343698123733597772299452, + 135611856049440401, + 101671809029103347, + 21888242871839275222246405745257275088548364400416034343698200580876635546425, + 12605974252736076, + 55272254076816805, + 59044263712449453, + 21888242871839275222246405745257275088548364400416034343698120057239481253855, + 93338488323587128, + 21888242871839275222246405745257275088548364400416034343698132804134813956981, + 50833015580665401, + 98371528203307186, + 21888242871839275222246405745257275088548364400416034343698125107137436912064, + 20714531549163523, + 21888242871839275222246405745257275088548364400416034343698137421178371855962, + 82784138756234238, + 21888242871839275222246405745257275088548364400416034343698122869242846972430, + 78877351109513696, + 21888242871839275222246405745257275088548364400416034343698076749882398368978, + 72065877345543418, + 21888242871839275222246405745257275088548364400416034343698083830246269459033, + 21888242871839275222246405745257275088548364400416034343698201887342581209028, + 21888242871839275222246405745257275088548364400416034343698184037262262447179, + 6151451684402027, + 21888242871839275222246405745257275088548364400416034343698148522042264254995, + 84857183148206021, + 8602161579857952, + 21888242871839275222246405745257275088548364400416034343698128011424629335646, + 21888242871839275222246405745257275088548364400416034343698139465907652713002, + 21888242871839275222246405745257275088548364400416034343698139441050311297295, + 21888242871839275222246405745257275088548364400416034343698092189071952699581, + 21888242871839275222246405745257275088548364400416034343698081840715325934477, + 21888242871839275222246405745257275088548364400416034343698084029332221935339, + 51281116926940360, + 21888242871839275222246405745257275088548364400416034343698184717595859100227, + 73460012238771865, + 18363450755411152, + 63175738499898442, + 21888242871839275222246405745257275088548364400416034343698195826321385471381, + 21888242871839275222246405745257275088548364400416034343698117712362871589625, + 1724687682857898, + 11473941626107627, + 21888242871839275222246405745257275088548364400416034343698072430848475452441, + 78074298970545915, + 21888242871839275222246405745257275088548364400416034343698148083500768915127, + 21888242871839275222246405745257275088548364400416034343698098004241102217945, + 21888242871839275222246405745257275088548364400416034343698108607312408986659, + 21888242871839275222246405745257275088548364400416034343698128222806502581140, + 21888242871839275222246405745257275088548364400416034343698149045693530508219, + 21888242871839275222246405745257275088548364400416034343698191285753502634419, + 21888242871839275222246405745257275088548364400416034343698143908344038991929, + 21888242871839275222246405745257275088548364400416034343698130840084556255345, + 21888242871839275222246405745257275088548364400416034343698151059501606836629, + 21888242871839275222246405745257275088548364400416034343698192393743358368983, + 21888242871839275222246405745257275088548364400416034343698194844435019648091, + 121181834417054487, + 35452760979266767, + 47773904152401220, + 21888242871839275222246405745257275088548364400416034343698174476654001830350, + 21888242871839275222246405745257275088548364400416034343698195462702457068612, + 21888242871839275222246405745257275088548364400416034343698129181013507228539, + 47716473799942143, + 105191213447940298, + 21888242871839275222246405745257275088548364400416034343698157581366696270652, + 21888242871839275222246405745257275088548364400416034343698076537760914118850, + 63232100183163691, + 21888242871839275222246405745257275088548364400416034343698178178645976904748, + 86408376289361007, + 31248059039758795, + 97409072276718212, + 127287392235501903, + 21888242871839275222246405745257275088548364400416034343698181331774755764278, + 128441383757307028, + 21888242871839275222246405745257275088548364400416034343698102496878931965675, + 89009280232807608, + 21888242871839275222246405745257275088548364400416034343698076305484401398718, + 21888242871839275222246405745257275088548364400416034343698118020801728193057, + 26809333082739193, + 131144568457105860, + 21888242871839275222246405745257275088548364400416034343698119083033001328920, + 30076873948265764, + 140640570925009965, + 138951663800073392, + 126124421859622012, + 21888242871839275222246405745257275088548364400416034343698146155452833769379, + 21888242871839275222246405745257275088548364400416034343698149400132763024890, + 91798478409547293, + 21888242871839275222246405745257275088548364400416034343698186621004426746585, + 4960242770909196, + 24714786791531115, + 132069733703356195, + 21888242871839275222246405745257275088548364400416034343698134988592170953421, + 25219152763670188, + 117934587374123801, + 21888242871839275222246405745257275088548364400416034343698088107825614193096, + 60445390388319225, + 12873722070099960, + 109777031154150239, + 60308479639457775, + 21888242871839275222246405745257275088548364400416034343698089374779404722268, + 52331308744654733, + 24679388327305616, + 92341125476196533, + 107561966028139192, + 41198723632084306, + 21888242871839275222246405745257275088548364400416034343698100955278053510713, + 82543346950196855, + 95296118250229170, + 21888242871839275222246405745257275088548364400416034343698074161241592512954, + 65234812499545322, + 102365666358949955, + 140589872984297372, + 21888242871839275222246405745257275088548364400416034343698165938465146383667, + 21888242871839275222246405745257275088548364400416034343698198375001980638713, + 139517819070101106, + 21888242871839275222246405745257275088548364400416034343698092792755720798470, + 85414345925999163, + 21888242871839275222246405745257275088548364400416034343698102687311318247330, + 30665036608820383, + 101548625665401204, + 21888242871839275222246405745257275088548364400416034343698122818041912791922, + 21888242871839275222246405745257275088548364400416034343698146722990136989126, + 21888242871839275222246405745257275088548364400416034343698134892645008584622, + 21888242871839275222246405745257275088548364400416034343698106160293061025499, + 115767638391489430, + 21888242871839275222246405745257275088548364400416034343698168734267542780428, + 21888242871839275222246405745257275088548364400416034343698182489504264021020, + 21888242871839275222246405745257275088548364400416034343698163449229708609395, + 39328788187637886, + 117564716137874706, + 21888242871839275222246405745257275088548364400416034343698190976194937620830, + 21888242871839275222246405745257275088548364400416034343698147355102636904829, + 21888242871839275222246405745257275088548364400416034343698110612088597114538, + 21888242871839275222246405745257275088548364400416034343698077987901958605181, + 21888242871839275222246405745257275088548364400416034343698113762937227839533, + 21888242871839275222246405745257275088548364400416034343698192613150008225113, + 96650188569922100, + 9790168519986869, + 21888242871839275222246405745257275088548364400416034343698086382040478856965, + 21888242871839275222246405745257275088548364400416034343698204020122940337857, + 21888242871839275222246405745257275088548364400416034343698158148935430083201, + 105559956285355842, + 21888242871839275222246405745257275088548364400416034343698168722060079800962, + 43002246595950919, + 124458450203838021, + 103331815826349572, + 94710164360941403, + 21888242871839275222246405745257275088548364400416034343698118552588356543706, + 21888242871839275222246405745257275088548364400416034343698149103832479049391, + 63279441087862081, + 21888242871839275222246405745257275088548364400416034343698140252982210459749, + 14848348939227981, + 21888242871839275222246405745257275088548364400416034343698185452566545539403, + 71188484468134864, + 21888242871839275222246405745257275088548364400416034343698081518198945381440, + 21888242871839275222246405745257275088548364400416034343698188141096411935740, + 34976433436220906, + 25792173728019689, + 21888242871839275222246405745257275088548364400416034343698088896309456871192, + 143924659231641956, + 21888242871839275222246405745257275088548364400416034343698119058079323005327, + 105032245600988460, + 49406742135643762, + 96330384103728522, + 136449981249666562, + 136968520469564739, + 21888242871839275222246405745257275088548364400416034343698142573757556884002, + 21888242871839275222246405745257275088548364400416034343698162727068945294483, + 21888242871839275222246405745257275088548364400416034343698132404870193280555, + 62835591297830299, + 13936345544481703, + 21888242871839275222246405745257275088548364400416034343698201768762677399463, + 97339245159331793, + 82061614384424558, + 33542235779434679, + 21888242871839275222246405745257275088548364400416034343698173927403389037903, + 54579461317609358, + 21888242871839275222246405745257275088548364400416034343698184716994121700775, + 21888242871839275222246405745257275088548364400416034343698140167596117141536, + 110196122664713465, + 21888242871839275222246405745257275088548364400416034343698131135995149387542, + 21888242871839275222246405745257275088548364400416034343698073482304083387589, + 21888242871839275222246405745257275088548364400416034343698088318530185027223, + 21888242871839275222246405745257275088548364400416034343698133822221763155636, + 21888242871839275222246405745257275088548364400416034343698097562762497526224, + 21888242871839275222246405745257275088548364400416034343698084658568797814643, + 21888242871839275222246405745257275088548364400416034343698069728523817333850, + 21888242871839275222246405745257275088548364400416034343698067710281026580768, + 71669557342256043, + 105372007830013608, + 21888242871839275222246405745257275088548364400416034343698201916746760417745, + 95035480428925688, + 2272429476884318, + 74361022537012176, + 69945528396214718, + 32908689725755003, + 122121725554892497, + 11317134519302288, + 18499803298491832, + 21888242871839275222246405745257275088548364400416034343698196554156860353426, + 88174283719478892, + 19472039037721511, + 21888242871839275222246405745257275088548364400416034343698141017825659433593, + 21888242871839275222246405745257275088548364400416034343698138593852320242956, + 21888242871839275222246405745257275088548364400416034343698107714131053062888, + 21888242871839275222246405745257275088548364400416034343698166083286084662796, + 21888242871839275222246405745257275088548364400416034343698129905615184871006, + 26052326379680156, + 21888242871839275222246405745257275088548364400416034343698105648468174071981, + 21888242871839275222246405745257275088548364400416034343698153452358676452281, + 21888242871839275222246405745257275088548364400416034343698189385311720937324, + 135377985909435268, + 118623739400895248, + 67456931146485704, + 21888242871839275222246405745257275088548364400416034343698095599599869229175, + 129211845018052000, + 21888242871839275222246405745257275088548364400416034343698199961369312670105, + 21888242871839275222246405745257275088548364400416034343698199189134875732881, + 21888242871839275222246405745257275088548364400416034343698190311384149282177, + 60215681833062569, + 86035171479507116, + 21888242871839275222246405745257275088548364400416034343698142947118807413166, + 18196004657354399, + 17279263866303583, + 101093125963802945, + 21888242871839275222246405745257275088548364400416034343698099962309270640476, + 121655411030861693, + 94451049514918347, + 86257241949725412, + 40919029672566617, + 21888242871839275222246405745257275088548364400416034343698117237643783573941, + 21888242871839275222246405745257275088548364400416034343698070623104113348721, + 136222681134829863, + 21888242871839275222246405745257275088548364400416034343698163221600235878052, + 21888242871839275222246405745257275088548364400416034343698159262698517538339, + 125647419017223141, + 35308363284035279, + 34699412254111842, + 21888242871839275222246405745257275088548364400416034343698068028770110122331, + 21888242871839275222246405745257275088548364400416034343698101476372981613899, + 21888242871839275222246405745257275088548364400416034343698176820609515970132, + 21888242871839275222246405745257275088548364400416034343698152979751049562334, + 21888242871839275222246405745257275088548364400416034343698067815185193602772, + 21888242871839275222246405745257275088548364400416034343698066073667329076714, + 21888242871839275222246405745257275088548364400416034343698135528469867439125, + 78032944323589705, + 104124550533250035, + 21888242871839275222246405745257275088548364400416034343698111946723448014949, + 119215984220573108, + 112371868161923092, + 61337794033581088, + 21888242871839275222246405745257275088548364400416034343698102669748616188854, + 35269054532787213, + 21888242871839275222246405745257275088548364400416034343698149632816718025016, + 35423384316895049, + 54252062682815210, + 61081110938652769, + 67109647131679972, + 21888242871839275222246405745257275088548364400416034343698093240894375688180, + 21888242871839275222246405745257275088548364400416034343698122880856730158854, + 132327838684896490, + 70749616481186784, + 21888242871839275222246405745257275088548364400416034343698103940765513403709, + 5368079722800995, + 21888242871839275222246405745257275088548364400416034343698187977360669380438, + 87469549244931453, + 72810991004228530, + 21888242871839275222246405745257275088548364400416034343698117111824395499642, + 65508173100095929, + 55004966558076368, + 21888242871839275222246405745257275088548364400416034343698064136229513841814, + 21888242871839275222246405745257275088548364400416034343698162205223264231491, + 21888242871839275222246405745257275088548364400416034343698168170863157014184, + 40789120639653032, + 21888242871839275222246405745257275088548364400416034343698094934015309799941, + 125411852270357586, + 71260036035706252, + 35173896793135668, + 21888242871839275222246405745257275088548364400416034343698132083014619545577, + 21888242871839275222246405745257275088548364400416034343698150995557360519420, + 143931336525388093, + 20093840960944059, + 35011201133911641, + 21888242871839275222246405745257275088548364400416034343698159634921221251886, + 93845444637613526, + 21888242871839275222246405745257275088548364400416034343698147483639501892682, + 21888242871839275222246405745257275088548364400416034343698152361099077267645, + 78584700031733751, + 21888242871839275222246405745257275088548364400416034343698145332734004176144, + 38842201553006032, + 21888242871839275222246405745257275088548364400416034343698146175001683093556, + 21888242871839275222246405745257275088548364400416034343698080247421471215988, + 111458296198693559, + 27331973599882349, + 129852312179596447, + 21888242871839275222246405745257275088548364400416034343698070080805376278550, + 21888242871839275222246405745257275088548364400416034343698061747795619535716, + 21888242871839275222246405745257275088548364400416034343698186113684327697589, + 21888242871839275222246405745257275088548364400416034343698103400913480774644, + 12539506655976420, + 21888242871839275222246405745257275088548364400416034343698115272223006534565, + 86900634218921033, + 3818075065574049, + 132543594932316323, + 74182495108548953, + 107026362865046857, + 21888242871839275222246405745257275088548364400416034343698149808913159234948, + 21888242871839275222246405745257275088548364400416034343698107440886942368638, + 21888242871839275222246405745257275088548364400416034343698137982067778815931, + 21888242871839275222246405745257275088548364400416034343698095113655714551107, + 3975783807088934, + 118836563856062817, + 78592968126227207, + 21888242871839275222246405745257275088548364400416034343698107852794103399687, + 91414924746154902, + 81714968032981924, + 21888242871839275222246405745257275088548364400416034343698140961305981176911, + 50231658260373995, + 124794674295259027, + 20725963671076152, + 92244225599895862, + 21888242871839275222246405745257275088548364400416034343698199484229346007171, + 21888242871839275222246405745257275088548364400416034343698061833413170674073, + 63758834449920961, + 21888242871839275222246405745257275088548364400416034343698131785031520519403, + 24025034261340951, + 21888242871839275222246405745257275088548364400416034343698078660749851716842, + 21888242871839275222246405745257275088548364400416034343698166114312320754294, + 21888242871839275222246405745257275088548364400416034343698074218120282539133, + 21888242871839275222246405745257275088548364400416034343698133024508556738001, + 34656866931766595, + 125975327001767861, + 93905776190757796, + 21888242871839275222246405745257275088548364400416034343698130067933142966702, + 49550832144630606, + 48990664493495249, + 21888242871839275222246405745257275088548364400416034343698165848500683214266, + 68483366367668752, + 21888242871839275222246405745257275088548364400416034343698080210622633397041, + 109246625652331566, + 21888242871839275222246405745257275088548364400416034343698094319859756653741, + 21888242871839275222246405745257275088548364400416034343698130944261621952285, + 21888242871839275222246405745257275088548364400416034343698143496023593628140, + 38884028309238825, + 21888242871839275222246405745257275088548364400416034343698184876402685771362, + 74541888655755969, + 21888242871839275222246405745257275088548364400416034343698078851233248791293, + 62975708092955759, + 113360340258826851, + 21888242871839275222246405745257275088548364400416034343698108863347610640820, + 134020690543718127, + 21888242871839275222246405745257275088548364400416034343698126669172653448230, + 36975316819579982, + 21888242871839275222246405745257275088548364400416034343698130949024549295568, + 21888242871839275222246405745257275088548364400416034343698181459926036603894, + 21888242871839275222246405745257275088548364400416034343698112980145175818028, + 21888242871839275222246405745257275088548364400416034343698163848856047468926, + 21888242871839275222246405745257275088548364400416034343698171588374517282023, + 21888242871839275222246405745257275088548364400416034343698071353257950075866, + 21888242871839275222246405745257275088548364400416034343698101518942290831371, + 21888242871839275222246405745257275088548364400416034343698199117671670502910, + 56151857485716954, + 70946792243229367, + 21888242871839275222246405745257275088548364400416034343698067157131937595316, + 21888242871839275222246405745257275088548364400416034343698148653595513419110, + 21888242871839275222246405745257275088548364400416034343698084610888360877016, + 127254113932665175, + 21888242871839275222246405745257275088548364400416034343698063268146825307196, + 21888242871839275222246405745257275088548364400416034343698183910776229536047, + 69527568032194943, + 21888242871839275222246405745257275088548364400416034343698124835514266615845, + 87731422182995848, + 21888242871839275222246405745257275088548364400416034343698162468408977776889, + 21888242871839275222246405745257275088548364400416034343698098987169086429893, + 140486093121257491, + 49821129530369087, + 21888242871839275222246405745257275088548364400416034343698110913035381279432, + 41768244001303018, + 88345448363287727, + 73201200542680091, + 21888242871839275222246405745257275088548364400416034343698154241867985770584, + 21888242871839275222246405745257275088548364400416034343698147773829950407592, + 19832078091142700, + 65206669110963751, + 14350957170895849, + 21888242871839275222246405745257275088548364400416034343698086569196928234216, + 118011898076060607, + 21888242871839275222246405745257275088548364400416034343698178167391989502192, + 43746650455787860, + 141883400378695437, + 21888242871839275222246405745257275088548364400416034343698203038347473544087, + 104446172432076502, + 110584284267455534, + 21888242871839275222246405745257275088548364400416034343698153329213794901684, + 21888242871839275222246405745257275088548364400416034343698152270697181093545, + 21888242871839275222246405745257275088548364400416034343698145836150975137908, + 40709955841354548, + 60815412627189715, + 21888242871839275222246405745257275088548364400416034343698073285845602756973, + 21888242871839275222246405745257275088548364400416034343698176265217878196745, + 91427612520764810, + 21888242871839275222246405745257275088548364400416034343698093589663159678098, + 111234895431240625, + 15111252309085428, + 21888242871839275222246405745257275088548364400416034343698103300658840725183, + 108194211494421657, + 120656725218102657, + 95367376820852714, + 21888242871839275222246405745257275088548364400416034343698112876772388774039, + 89720420049472644, + 21888242871839275222246405745257275088548364400416034343698086669650826545306, + 21888242871839275222246405745257275088548364400416034343698140051202324815704, + 21888242871839275222246405745257275088548364400416034343698091385412521051152, + 21888242871839275222246405745257275088548364400416034343698127600159831499406, + 21888242871839275222246405745257275088548364400416034343698106220399409433289, + 21888242871839275222246405745257275088548364400416034343698082354872023622454, + 14127701661798668, + 21888242871839275222246405745257275088548364400416034343698115680991329105823, + 12442847441305239, + 138053238818057113, + 135681156708175105, + 21888242871839275222246405745257275088548364400416034343698184136647475591946, + 95060719121157906, + 21888242871839275222246405745257275088548364400416034343698142652676653698876, + 21888242871839275222246405745257275088548364400416034343698072376233145600865, + 12417866071569390, + 21888242871839275222246405745257275088548364400416034343698144326131715013906, + 39042411322037955, + 119041646422565781, + 21888242871839275222246405745257275088548364400416034343698094759644393613556, + 21888242871839275222246405745257275088548364400416034343698113902568695470970, + 21888242871839275222246405745257275088548364400416034343698061188573150659154, + 75826225938015422, + 81075525040231915, + 21888242871839275222246405745257275088548364400416034343698171556808890451298, + 21888242871839275222246405745257275088548364400416034343698128772034724848672, + 3969848858233605, + 54614658847031798, + 124465407369541070, + 3542384443576121, + 21888242871839275222246405745257275088548364400416034343698109867439496356802, + 21888242871839275222246405745257275088548364400416034343698129443348984279254, + 1139922919204544, + 21888242871839275222246405745257275088548364400416034343698124661939116494075, + 65372741449634458, + 142765382600023255, + 21888242871839275222246405745257275088548364400416034343698164303233772647715, + 21888242871839275222246405745257275088548364400416034343698120813496758215819, + 21888242871839275222246405745257275088548364400416034343698142998221510964934, + 21888242871839275222246405745257275088548364400416034343698174395591538875878, + 21888242871839275222246405745257275088548364400416034343698082750985243138988, + 50421773809158402, + 21888242871839275222246405745257275088548364400416034343698183810778831369087, + 21888242871839275222246405745257275088548364400416034343698076783924459949243, + 21888242871839275222246405745257275088548364400416034343698123154967913320700, + 92359330033663407, + 27594366202935674, + 21888242871839275222246405745257275088548364400416034343698124513551052764251, + 21888242871839275222246405745257275088548364400416034343698168975710963723986, + 83861368449983395, + 21888242871839275222246405745257275088548364400416034343698142225514375119968, + 21888242871839275222246405745257275088548364400416034343698161925135472863774, + 21888242871839275222246405745257275088548364400416034343698110805216159166224, + 21888242871839275222246405745257275088548364400416034343698131979359093213514, + 58014675879636267, + 82961754196438952, + 21888242871839275222246405745257275088548364400416034343698103033747135474356, + 21888242871839275222246405745257275088548364400416034343698167753341606983399, + 21888242871839275222246405745257275088548364400416034343698060438033095277127, + 47659154114339196, + 21888242871839275222246405745257275088548364400416034343698161599037635748078, + 66606060491849060, + 21888242871839275222246405745257275088548364400416034343698078285106422077045, + 116064854093906260, + 21888242871839275222246405745257275088548364400416034343698194717975730516504, + 21888242871839275222246405745257275088548364400416034343698180596016397391745, + 21888242871839275222246405745257275088548364400416034343698136446924677218918, + 21888242871839275222246405745257275088548364400416034343698170434637488479503, + 21888242871839275222246405745257275088548364400416034343698168452694944433504, + 21888242871839275222246405745257275088548364400416034343698110259479824843793, + 99208627436128782, + 113577692995249503, + 21888242871839275222246405745257275088548364400416034343698197622450940314766, + 63877160120217309, + 21888242871839275222246405745257275088548364400416034343698165685993999807888, + 45618556601457078, + 40304552750124605, + 21888242871839275222246405745257275088548364400416034343698111558849836068828, + 20503440168432819, + 21888242871839275222246405745257275088548364400416034343698060962204525668850, + 53865250703592372, + 21888242871839275222246405745257275088548364400416034343698100424819554622206, + 21888242871839275222246405745257275088548364400416034343698098809200839765528, + 21888242871839275222246405745257275088548364400416034343698169693514288988244, + 21888242871839275222246405745257275088548364400416034343698160708368958817068, + 52276041784071241, + 40005867805446052, + 21888242871839275222246405745257275088548364400416034343698116600006431554962, + 16037023105391707, + 21888242871839275222246405745257275088548364400416034343698096591955991615570, + 98940554753306843, + 21888242871839275222246405745257275088548364400416034343698127754017614567090, + 117742843382141093, + 21888242871839275222246405745257275088548364400416034343698069436203452752497, + 85365536153573581, + 21888242871839275222246405745257275088548364400416034343698091982805311847651, + 117320187331348457, + 21888242871839275222246405745257275088548364400416034343698176839007037108100, + 21888242871839275222246405745257275088548364400416034343698096638193931961397, + 101870895482871183, + 130153673415068237, + 21888242871839275222246405745257275088548364400416034343698085693839953862518, + 134975839764274761, + 122000114954286681, + 86572852702808839, + 87125578949211682, + 16139302283905383, + 7885559104911508, + 21888242871839275222246405745257275088548364400416034343698122643482807742840, + 21888242871839275222246405745257275088548364400416034343698076283475327884109, + 21888242871839275222246405745257275088548364400416034343698131623270470514306, + 86159110534791341, + 21888242871839275222246405745257275088548364400416034343698146995664676470881, + 7584719754469925, + 21888242871839275222246405745257275088548364400416034343698075664965931494351, + 21888242871839275222246405745257275088548364400416034343698192436401717085093, + 21888242871839275222246405745257275088548364400416034343698150272776526360188, + 21888242871839275222246405745257275088548364400416034343698147361027456896595, + 21888242871839275222246405745257275088548364400416034343698089839112240622923, + 50302608408293202, + 21888242871839275222246405745257275088548364400416034343698069497123519276244, + 21888242871839275222246405745257275088548364400416034343698116247058165157396, + 136832394051158930, + 21888242871839275222246405745257275088548364400416034343698075146049002157579, + 115637583435739003, + 21888242871839275222246405745257275088548364400416034343698103450042794419494, + 121102965642459580, + 35961410823464088, + 21888242871839275222246405745257275088548364400416034343698151195043782987813, + 21888242871839275222246405745257275088548364400416034343698077382331867607282, + 59818720000243783, + 21888242871839275222246405745257275088548364400416034343698088700098273258444, + 21888242871839275222246405745257275088548364400416034343698178381784127158722, + 141607636925472028, + 21888242871839275222246405745257275088548364400416034343698177593577892132355, + 21888242871839275222246405745257275088548364400416034343698071151960321910490, + 116866434149312809, + 21888242871839275222246405745257275088548364400416034343698084644181111956785, + 21888242871839275222246405745257275088548364400416034343698150909927218483040, + 75837594283256946, + 140003167766043862, + 110255682960062111, + 78713898883977180, + 41047127720253407, + 90282284381628475, + 23836287126289788, + 61332268035655977, + 21888242871839275222246405745257275088548364400416034343698148127145907686482, + 46593960948615485, + 108106471202987519, + 21888242871839275222246405745257275088548364400416034343698100473319516514575, + 82729801533691673, + 21888242871839275222246405745257275088548364400416034343698172807287775801636, + 21888242871839275222246405745257275088548364400416034343698188796125363677131, + 39355828873368858, + 21888242871839275222246405745257275088548364400416034343698130904767447901655, + 841262377292909, + 120682471305567292, + 11036144586846168, + 103712163508985382, + 21888242871839275222246405745257275088548364400416034343698114779050472861857, + 101492269434748646, + 21888242871839275222246405745257275088548364400416034343698124593360072487303, + 88038505007359986, + 21888242871839275222246405745257275088548364400416034343698118122792904819848, + 60222935506848644, + 106992290746570433, + 68798144367112045, + 46631363765585122, + 21888242871839275222246405745257275088548364400416034343698118553572579743171, + 137031233672183024, + 21888242871839275222246405745257275088548364400416034343698168069198595183084, + 21888242871839275222246405745257275088548364400416034343698105320251359698835, + 21888242871839275222246405745257275088548364400416034343698091574754128048140, + 55136543816094402, + 21888242871839275222246405745257275088548364400416034343698174317769045146956, + 21888242871839275222246405745257275088548364400416034343698166025362714250726, + 31340937452785955, + 16819260199445807, + 21888242871839275222246405745257275088548364400416034343698149817132091037359, + 21888242871839275222246405745257275088548364400416034343698086966919166688835, + 7894252853806765, + 21888242871839275222246405745257275088548364400416034343698197260277024712105, + 21888242871839275222246405745257275088548364400416034343698093961726277749520, + 109687447042632106, + 101080658617490007, + 95427737580491206, + 45956626026450940, + 21888242871839275222246405745257275088548364400416034343698198773143464119790, + 24192781186354645, + 21888242871839275222246405745257275088548364400416034343698171442905975187376, + 21888242871839275222246405745257275088548364400416034343698075250778053975136, + 21888242871839275222246405745257275088548364400416034343698140855626646734256, + 53662755838820005, + 21888242871839275222246405745257275088548364400416034343698085210869980585975, + 21888242871839275222246405745257275088548364400416034343698143919176081711294, + 31586974553359756, + 21888242871839275222246405745257275088548364400416034343698106092235817859299, + 21888242871839275222246405745257275088548364400416034343698179966534803029506, + 21888242871839275222246405745257275088548364400416034343698104216091373812986, + 21888242871839275222246405745257275088548364400416034343698164699332883095278, + 136955115569541574, + 21888242871839275222246405745257275088548364400416034343698114941106970955682, + 21888242871839275222246405745257275088548364400416034343698121570077018719215, + 4444182956235463, + 123179385940906937, + 21888242871839275222246405745257275088548364400416034343698098052348576206440, + 69889297996788118, + 40431225976333450, + 21888242871839275222246405745257275088548364400416034343698067158698416437454, + 43283111156406690, + 74658116292959711, + 21888242871839275222246405745257275088548364400416034343698171397614009622770, + 77834610834823495, + 21888242871839275222246405745257275088548364400416034343698144467506202286025, + 75969353360053172, + 21888242871839275222246405745257275088548364400416034343698197239371821111722, + 25877183277444892, + 21888242871839275222246405745257275088548364400416034343698114737513202238184, + 21888242871839275222246405745257275088548364400416034343698105940465205359342, + 21888242871839275222246405745257275088548364400416034343698096756351886253547, + 21888242871839275222246405745257275088548364400416034343698126678439468400400, + 21888242871839275222246405745257275088548364400416034343698077439516838336772, + 135420416402769718, + 21888242871839275222246405745257275088548364400416034343698180685840521288110, + 21888242871839275222246405745257275088548364400416034343698153752919054068403, + 21888242871839275222246405745257275088548364400416034343698122848145544334563, + 21888242871839275222246405745257275088548364400416034343698067920094726576362, + 123171313426465466, + 15753879019928476, + 21888242871839275222246405745257275088548364400416034343698132411257228690294, + 20990094194980013, + 21888242871839275222246405745257275088548364400416034343698106808928826604489, + 2773021611845296, + 61709421665672795, + 21888242871839275222246405745257275088548364400416034343698062144383759104173, + 30282173248253801, + 21888242871839275222246405745257275088548364400416034343698110052590032675872, + 21888242871839275222246405745257275088548364400416034343698126499459347724532, + 1822832793182210, + 21888242871839275222246405745257275088548364400416034343698136448765927529725, + 60705615117588956, + 83552123743105458, + 33641940549033961, + 115207554468878550, + 21888242871839275222246405745257275088548364400416034343698108382873208984494, + 27318390678396751, + 140272273704818987, + 21888242871839275222246405745257275088548364400416034343698089488930374773831, + 21888242871839275222246405745257275088548364400416034343698116617490649197514, + 130185040579323427, + 138837544443398941, + 51417756865695950, + 51922406937132234, + 21888242871839275222246405745257275088548364400416034343698078611726063726272, + 135241698132937763, + 21888242871839275222246405745257275088548364400416034343698163869302479169679, + 27830246250785246, + 130794078349860904, + 21888242871839275222246405745257275088548364400416034343698060869840388341417, + 21888242871839275222246405745257275088548364400416034343698176942499729027098, + 112279038825630563, + 21888242871839275222246405745257275088548364400416034343698138342246273052382, + 29847509518015739, + 142007699696876717, + 21888242871839275222246405745257275088548364400416034343698150402111521862261, + 119393905569296023, + 21888242871839275222246405745257275088548364400416034343698076232581544243509, + 82517557743677639, + 21888242871839275222246405745257275088548364400416034343698194169914349082891, + 54013332271357587, + 21888242871839275222246405745257275088548364400416034343698134859933758420084, + 13172622965517398, + 58971349528731279, + 98658314274958011, + 21888242871839275222246405745257275088548364400416034343698170252531033127843, + 126246946137314456, + 21888242871839275222246405745257275088548364400416034343698197177766737446436, + 21888242871839275222246405745257275088548364400416034343698150999625506785512, + 21888242871839275222246405745257275088548364400416034343698108580598314822566, + 139168992843362233, + 119654684181946144, + 21888242871839275222246405745257275088548364400416034343698200090599873863734, + 126848484678435376, + 21888242871839275222246405745257275088548364400416034343698072390681121828220, + 21888242871839275222246405745257275088548364400416034343698122717649128513829, + 11596238387587805, + 58353300289353982, + 96309874018846705, + 21888242871839275222246405745257275088548364400416034343698161128622302241948, + 63832432794552951, + 68160779698876497, + 21888242871839275222246405745257275088548364400416034343698060886499990296506, + 21888242871839275222246405745257275088548364400416034343698089689757458828016, + 21888242871839275222246405745257275088548364400416034343698150550554761572766, + 78434878329302635, + 43756335288526528, + 122172289314797804, + 21888242871839275222246405745257275088548364400416034343698122307811809281943, + 53366870509709836, + 6802424938037813, + 10454150095057641, + 21888242871839275222246405745257275088548364400416034343698107951662563832729, + 21888242871839275222246405745257275088548364400416034343698176501238781512786, + 21888242871839275222246405745257275088548364400416034343698096532408137327142, + 21888242871839275222246405745257275088548364400416034343698196214779677842167, + 105137778925731414, + 101735500435956302, + 21888242871839275222246405745257275088548364400416034343698130701911263997817, + 21888242871839275222246405745257275088548364400416034343698188801973058215783, + 135773504239169778, + 18588580468877614, + 36569117943639686, + 21888242871839275222246405745257275088548364400416034343698107955883738391323, + 21888242871839275222246405745257275088548364400416034343698100603283191079898, + 58363158068527524, + 26195921668396578, + 97723941475472948, + 21888242871839275222246405745257275088548364400416034343698071525392463489685, + 64993587770468826, + 29863343402986685, + 21888242871839275222246405745257275088548364400416034343698186510576144528293, + 133115830783005315, + 21888242871839275222246405745257275088548364400416034343698191278686478531252, + 124116768438634520, + 21888242871839275222246405745257275088548364400416034343698125439359689940449, + 21888242871839275222246405745257275088548364400416034343698068634924529857534, + 104152990349699491, + 21888242871839275222246405745257275088548364400416034343698087167878049850626, + 21888242871839275222246405745257275088548364400416034343698177800940035824736, + 21888242871839275222246405745257275088548364400416034343698202309900510232475, + 21888242871839275222246405745257275088548364400416034343698097279536524693084, + 38966433149251482, + 66128634556311402, + 21888242871839275222246405745257275088548364400416034343698139982078846153735, + 9136517497747335, + 21888242871839275222246405745257275088548364400416034343698114893375662067539, + 106399917620356054, + 133197146422043938, + 70784355846416313, + 21888242871839275222246405745257275088548364400416034343698148099577937890622, + 21888242871839275222246405745257275088548364400416034343698165525184786743728, + 21888242871839275222246405745257275088548364400416034343698066825361229841518, + 21888242871839275222246405745257275088548364400416034343698078877730011097758, + 126010899007407094, + 21888242871839275222246405745257275088548364400416034343698072447006955338118, + 56942351240570311, + 115109797977906720, + 97144347049059720, + 21888242871839275222246405745257275088548364400416034343698068842776225624536, + 87228150030887060, + 39210115858266471, + 6055172618357703, + 26645096620262927, + 21888242871839275222246405745257275088548364400416034343698201732435352221362, + 21888242871839275222246405745257275088548364400416034343698120177845470002288, + 21888242871839275222246405745257275088548364400416034343698203659627123265544, + 21888242871839275222246405745257275088548364400416034343698073714715321145831, + 21888242871839275222246405745257275088548364400416034343698140132378080030861, + 36759707511781235, + 21888242871839275222246405745257275088548364400416034343698099411763072686420, + 31433956977884470, + 21888242871839275222246405745257275088548364400416034343698122224319548025927, + 21888242871839275222246405745257275088548364400416034343698070671087118033601, + 21888242871839275222246405745257275088548364400416034343698176546179234849156, + 21888242871839275222246405745257275088548364400416034343698189563846057993121, + 117158812983563378, + 51291598375292675, + 21888242871839275222246405745257275088548364400416034343698175297347073187933, + 39140161768129239, + 73357221019127062, + 128449097391268456, + 21888242871839275222246405745257275088548364400416034343698201910049478929426, + 136847797773542327, + 44693331366306883, + 96163960027874029, + 98365957461593835, + 21888242871839275222246405745257275088548364400416034343698124758003208269225, + 47466338171914460, + 21888242871839275222246405745257275088548364400416034343698167752990854230214, + 76573835675146141, + 15111772622485063, + 27606299096399921, + 21888242871839275222246405745257275088548364400416034343698191971597492428570, + 21888242871839275222246405745257275088548364400416034343698116053341544916819, + 52217645781546863, + 31029072285616898, + 21888242871839275222246405745257275088548364400416034343698129471413969381460, + 10882689122920537, + 42077319292924076, + 21888242871839275222246405745257275088548364400416034343698069967460880655993, + 22929497239184504, + 21888242871839275222246405745257275088548364400416034343698068169753986606677, + 2731475586401609, + 21888242871839275222246405745257275088548364400416034343698090177062128663394, + 4938031512676173, + 21888242871839275222246405745257275088548364400416034343698109053157018020060, + 51639975229308773, + 73533245134236045, + 21888242871839275222246405745257275088548364400416034343698150998214005815948, + 21888242871839275222246405745257275088548364400416034343698158721046778153421, + 21888242871839275222246405745257275088548364400416034343698202129082093178088, + 90323873322249083, + 78330552142522827, + 21888242871839275222246405745257275088548364400416034343698103130733871655124, + 21888242871839275222246405745257275088548364400416034343698067423590927097653, + 21888242871839275222246405745257275088548364400416034343698119422044747892736, + 21888242871839275222246405745257275088548364400416034343698172202839351924102, + 67263982667779004, + 21888242871839275222246405745257275088548364400416034343698150816479739097061, + 90948383097672088, + 11036739113649030, + 21888242871839275222246405745257275088548364400416034343698099270263751119329, + 21888242871839275222246405745257275088548364400416034343698082649421818968054, + 21888242871839275222246405745257275088548364400416034343698154593364791373231, + 21888242871839275222246405745257275088548364400416034343698178455838927886384, + 121642525013090359, + 62549291252589633, + 2148364682379913, + 20321317756229414, + 98754366234334372, + 107805962074260074, + 75540005364510462, + 94472698069182083, + 21888242871839275222246405745257275088548364400416034343698180107184865174755, + 21888242871839275222246405745257275088548364400416034343698091777155855351097, + 21888242871839275222246405745257275088548364400416034343698129511981496444922, + 117049652882230097, + 21888242871839275222246405745257275088548364400416034343698104921824966697611, + 88388267365478290, + 96494704353123517, + 21888242871839275222246405745257275088548364400416034343698093211143216134056, + 80438584472694193, + 96440934952219209, + 43708201629395415, + 137909500705699677, + 21888242871839275222246405745257275088548364400416034343698198964002468460981, + 21888242871839275222246405745257275088548364400416034343698070928218611307058, + 41012317289796396, + 25277966383015811, + 21888242871839275222246405745257275088548364400416034343698145419558453594664, + 68790910388277298, + 23309845999113496, + 112032211120483835, + 35478194861746721, + 21888242871839275222246405745257275088548364400416034343698176144186288043436, + 99786470121962834, + 21888242871839275222246405745257275088548364400416034343698146793219931253689, + 21888242871839275222246405745257275088548364400416034343698097218740571045797, + 21888242871839275222246405745257275088548364400416034343698170531397666875971, + 21888242871839275222246405745257275088548364400416034343698111965005665166925, + 21888242871839275222246405745257275088548364400416034343698142942491893690919, + 21888242871839275222246405745257275088548364400416034343698159539038063224674, + 21888242871839275222246405745257275088548364400416034343698097582148996409981, + 21888242871839275222246405745257275088548364400416034343698202760841167404648, + 21888242871839275222246405745257275088548364400416034343698124239892156380637, + 70563274263135188, + 21888242871839275222246405745257275088548364400416034343698079984353636512615, + 21888242871839275222246405745257275088548364400416034343698060231735866825482, + 21888242871839275222246405745257275088548364400416034343698186194898276746539, + 14723700228051526, + 21888242871839275222246405745257275088548364400416034343698103712775823421159, + 21888242871839275222246405745257275088548364400416034343698081309686618409817, + 142603533516859635, + 88176981528732212, + 21888242871839275222246405745257275088548364400416034343698147250837513274479, + 28551504488941125, + 21888242871839275222246405745257275088548364400416034343698179016520435244075, + 21888242871839275222246405745257275088548364400416034343698084040926475513913, + 21888242871839275222246405745257275088548364400416034343698199733125884516077, + 21888242871839275222246405745257275088548364400416034343698066402496633648829, + 59466431522335595, + 21888242871839275222246405745257275088548364400416034343698066882931940444879, + 21888242871839275222246405745257275088548364400416034343698200150630342916173, + 21888242871839275222246405745257275088548364400416034343698061775051317503699, + 21888242871839275222246405745257275088548364400416034343698076685137837849286, + 112101591058876559, + 121393755245892440, + 107332183548761525, + 62351213296982273, + 102525940997176686, + 21888242871839275222246405745257275088548364400416034343698174994926029762325, + 16856855229007778, + 23985123913144679, + 137766792735628018, + 21888242871839275222246405745257275088548364400416034343698159239550905826106, + 129403590045392450, + 86744150475394252, + 21888242871839275222246405745257275088548364400416034343698203953618850200449, + 1220778109753694, + 21888242871839275222246405745257275088548364400416034343698124471027255134113, + 64773832054815933, + 21888242871839275222246405745257275088548364400416034343698128374946007978924, + 21888242871839275222246405745257275088548364400416034343698139472554078429841, + 21888242871839275222246405745257275088548364400416034343698085422482362436162, + 21888242871839275222246405745257275088548364400416034343698166800430008944845, + 70386872940218425, + 21888242871839275222246405745257275088548364400416034343698081081918938561269, + 126549463427001427, + 21888242871839275222246405745257275088548364400416034343698153480610777578999, + 63977088942906650, + 52790903122031236, + 72687626158320080, + 21888242871839275222246405745257275088548364400416034343698130174119500010986, + 21888242871839275222246405745257275088548364400416034343698124400003750811780, + 21888242871839275222246405745257275088548364400416034343698077965596723362453, + 63605520297092618, + 21888242871839275222246405745257275088548364400416034343698145424022468282347, + 21888242871839275222246405745257275088548364400416034343698117211590219464872, + 21888242871839275222246405745257275088548364400416034343698130728802515271882, + 68656933061740176, + 43626813722792630, + 52520923223784098, + 21888242871839275222246405745257275088548364400416034343698091368090283471131, + 71627003334187835, + 11385335454664993, + 58758092327647201, + 9273106180804171, + 21888242871839275222246405745257275088548364400416034343698088729922751230067, + 105152440411135255, + 21888242871839275222246405745257275088548364400416034343698128247685014438191, + 21888242871839275222246405745257275088548364400416034343698176102541359136565, + 49830585675526720, + 33993063344803130, + 17402994440016394, + 21888242871839275222246405745257275088548364400416034343698177550156679587179, + 110968259387400761, + 11379913209049348, + 89561231348602264, + 21888242871839275222246405745257275088548364400416034343698061657819913338723, + 21888242871839275222246405745257275088548364400416034343698198009363457002565, + 63849100268181836, + 21888242871839275222246405745257275088548364400416034343698081937206612024029, + 21888242871839275222246405745257275088548364400416034343698142019312613936933, + 21888242871839275222246405745257275088548364400416034343698169780321951558406, + 21888242871839275222246405745257275088548364400416034343698153334506503053658, + 21888242871839275222246405745257275088548364400416034343698095180012734860383, + 119709809047543729, + 137989386400858457, + 21888242871839275222246405745257275088548364400416034343698098978294119203941, + 131656846698783664, + 21888242871839275222246405745257275088548364400416034343698061493522431723355, + 89197815153599832, + 79894860106506, + 21888242871839275222246405745257275088548364400416034343698113696030956760282, + 21888242871839275222246405745257275088548364400416034343698072393936741385999, + 21888242871839275222246405745257275088548364400416034343698169872518966132340, + 135883606346161170, + 21888242871839275222246405745257275088548364400416034343698135561784378038705, + 21888242871839275222246405745257275088548364400416034343698095371554786666765, + 96692771571904775, + 84511627283764943, + 96050649815145968, + 21888242871839275222246405745257275088548364400416034343698166972282928242051, + 52426946567925028, + 86306959491776736, + 21888242871839275222246405745257275088548364400416034343698114221072724526599, + 55357464436990041, + 21888242871839275222246405745257275088548364400416034343698101113476557109420, + 21888242871839275222246405745257275088548364400416034343698168867735697237091, + 16840105894848373, + 21888242871839275222246405745257275088548364400416034343698066313063047124655, + 69146922747568751, + 21888242871839275222246405745257275088548364400416034343698188665962192319505, + 2874524848118048, + 102136444542819712, + 118728527625717532, + 21888242871839275222246405745257275088548364400416034343698197947957305254775, + 21888242871839275222246405745257275088548364400416034343698090172796837539824, + 21888242871839275222246405745257275088548364400416034343698131280358373482846, + 121881105810941454, + 83113194415457110, + 21888242871839275222246405745257275088548364400416034343698103212272070777104, + 21888242871839275222246405745257275088548364400416034343698184505565012321340, + 21888242871839275222246405745257275088548364400416034343698183974882294246458, + 129287760474967429, + 21888242871839275222246405745257275088548364400416034343698170357540749808298, + 124440225893401761, + 82578424131378688, + 7273951779362056, + 64786100154165111, + 125032525331392152, + 10518298064659352, + 21888242871839275222246405745257275088548364400416034343698062760102355504844, + 32540937719869316, + 21888242871839275222246405745257275088548364400416034343698129712781587231684, + 21888242871839275222246405745257275088548364400416034343698157475435843458587, + 132692585092067484, + 69533351532800920, + 21888242871839275222246405745257275088548364400416034343698064464406099690170, + 76687296108057531, + 11944978915989794, + 47585253259716357, + 21888242871839275222246405745257275088548364400416034343698129273852329752146, + 107173045836942737, + 21888242871839275222246405745257275088548364400416034343698198537422242648403, + 21888242871839275222246405745257275088548364400416034343698086404057257742910, + 110492441285314199, + 47216966598946139, + 21888242871839275222246405745257275088548364400416034343698127328121483090016, + 21888242871839275222246405745257275088548364400416034343698187781600997791772, + 21888242871839275222246405745257275088548364400416034343698161422579427110565, + 128536825486213108, + 140221851979530365, + 16007294624431927, + 21888242871839275222246405745257275088548364400416034343698154196739236594037, + 43036802984601401, + 73136629434122966, + 21888242871839275222246405745257275088548364400416034343698191101816049018321, + 24734588887763256, + 20383361466915006, + 111560018216326260, + 21888242871839275222246405745257275088548364400416034343698122505645085886589, + 125947300669934768, + 84173552563249555, + 128253707278889449, + 21888242871839275222246405745257275088548364400416034343698170650640093476427, + 21888242871839275222246405745257275088548364400416034343698187889333173819569, + 21888242871839275222246405745257275088548364400416034343698063335287165826265, + 21888242871839275222246405745257275088548364400416034343698171885660236316092, + 112312675289171355, + 21888242871839275222246405745257275088548364400416034343698165505525479860835, + 21888242871839275222246405745257275088548364400416034343698164288098080173378, + 21888242871839275222246405745257275088548364400416034343698137000424751593348, + 21888242871839275222246405745257275088548364400416034343698119324506956876558, + 48594273733996901, + 43571716365106329, + 32286781850978229, + 21888242871839275222246405745257275088548364400416034343698154316293947298077, + 21888242871839275222246405745257275088548364400416034343698181758470540352855, + 95650426264340327, + 21888242871839275222246405745257275088548364400416034343698144697461994423975, + 21888242871839275222246405745257275088548364400416034343698152353103984682486, + 98863143151200560, + 21888242871839275222246405745257275088548364400416034343698078607726709289355, + 6098458765561465, + 21888242871839275222246405745257275088548364400416034343698124846452327304831, + 116992913319393682, + 54003653868189498, + 133493343192586880, + 21888242871839275222246405745257275088548364400416034343698066506790557669074, + 21888242871839275222246405745257275088548364400416034343698124362231327493280, + 21888242871839275222246405745257275088548364400416034343698072246982285304019, + 111230791744191543, + 21888242871839275222246405745257275088548364400416034343698093996310578802098, + 110606757136423879, + 21888242871839275222246405745257275088548364400416034343698154461965143986048, + 21888242871839275222246405745257275088548364400416034343698149896986009665585, + 21888242871839275222246405745257275088548364400416034343698089686258762430470, + 23069403847011759, + 119176186501407061, + 105627696758166, + 24502684124177224, + 20638900211780628, + 34417512424730074, + 11670497043211059, + 76456600293288103, + 51305348004400432, + 100231402593085836, + 21888242871839275222246405745257275088548364400416034343698117319411753272038, + 21888242871839275222246405745257275088548364400416034343698149316543866665349, + 72441074729647065, + 70479564058774484, + 21888242871839275222246405745257275088548364400416034343698098111034612041614, + 21888242871839275222246405745257275088548364400416034343698180092469387122865, + 70631389496230258, + 12075779891362424, + 41668488281593721, + 21888242871839275222246405745257275088548364400416034343698066514943019981925, + 21888242871839275222246405745257275088548364400416034343698086974930688050297, + 21888242871839275222246405745257275088548364400416034343698151115854137200970, + 100255938922314222, + 27313907862889625, + 21888242871839275222246405745257275088548364400416034343698130382403030877760, + 78331837151024475, + 21888242871839275222246405745257275088548364400416034343698192410620376142944, + 21888242871839275222246405745257275088548364400416034343698136198936702524300, + 21888242871839275222246405745257275088548364400416034343698126650394570274663, + 21888242871839275222246405745257275088548364400416034343698122828986611949609, + 72134826528083133, + 21888242871839275222246405745257275088548364400416034343698114897680141809358, + 21888242871839275222246405745257275088548364400416034343698162040200765933403, + 21888242871839275222246405745257275088548364400416034343698072776776011310109, + 21888242871839275222246405745257275088548364400416034343698077875689431422902, + 21888242871839275222246405745257275088548364400416034343698130232671567858523, + 21888242871839275222246405745257275088548364400416034343698065335694352657541, + 49822289124688155, + 71199641449302677, + 21888242871839275222246405745257275088548364400416034343698060930654776029362, + 128689125999084492, + 21888242871839275222246405745257275088548364400416034343698078425078182950758, + 21888242871839275222246405745257275088548364400416034343698183018237122740355, + 61487383522086765, + 119046025340634055, + 21888242871839275222246405745257275088548364400416034343698163094285080884851, + 21888242871839275222246405745257275088548364400416034343698141907080086373754, + 21888242871839275222246405745257275088548364400416034343698117900619275862512, + 21888242871839275222246405745257275088548364400416034343698194531461069525052, + 21888242871839275222246405745257275088548364400416034343698077568811662017520, + 143350824075260446, + 21888242871839275222246405745257275088548364400416034343698133964573824499457, + 21888242871839275222246405745257275088548364400416034343698199042912500805434, + 21888242871839275222246405745257275088548364400416034343698199186146447159489, + 131427343441146053, + 21888242871839275222246405745257275088548364400416034343698091097880368554396, + 21888242871839275222246405745257275088548364400416034343698185497656093659661, + 24699284721833042, + 27835198479717317, + 763421926522566, + 21888242871839275222246405745257275088548364400416034343698129635409138276829, + 21888242871839275222246405745257275088548364400416034343698189501747732728272, + 30428339301137775, + 21888242871839275222246405745257275088548364400416034343698197286532042571885, + 21888242871839275222246405745257275088548364400416034343698061909643257300336, + 86427592056904706, + 42913683131025789, + 21888242871839275222246405745257275088548364400416034343698171280704809431017, + 59005224391509267, + 21888242871839275222246405745257275088548364400416034343698072648562515173420, + 52778082987865445, + 23368645132099982, + 21888242871839275222246405745257275088548364400416034343698158934989487292820, + 21888242871839275222246405745257275088548364400416034343698202854810490420349, + 133439729163036051, + 46343633361441756, + 46095158858406588, + 21888242871839275222246405745257275088548364400416034343698070016350605049879, + 21888242871839275222246405745257275088548364400416034343698066526371412612518, + 62095096867767471, + 21888242871839275222246405745257275088548364400416034343698119316241800817202, + 14398550360972418, + 21888242871839275222246405745257275088548364400416034343698126050241266909431, + 143902320333597455, + 131113432033586827, + 21888242871839275222246405745257275088548364400416034343698078623185503265589, + 21888242871839275222246405745257275088548364400416034343698179655337290030911, + 21888242871839275222246405745257275088548364400416034343698107372088093396226, + 75617999677037077, + 21888242871839275222246405745257275088548364400416034343698179813473156333181, + 23056563545923798, + 5449938841438319, + 38217300148021033, + 21888242871839275222246405745257275088548364400416034343698079046454852767777, + 21888242871839275222246405745257275088548364400416034343698072960860095201507, + 58123358262524168, + 52953215839776999, + 21888242871839275222246405745257275088548364400416034343698196352862994828807, + 21888242871839275222246405745257275088548364400416034343698171316535503822138, + 117184446511376544, + 137907110502202198, + 80837707816428090, + 4645697402101111, + 98477342962618338, + 72544320241717827, + 38026360473751555, + 21888242871839275222246405745257275088548364400416034343698169952317465987726, + 21888242871839275222246405745257275088548364400416034343698061214058581566132, + 21888242871839275222246405745257275088548364400416034343698112183696492923330, + 47385100153837734, + 14264773016787802, + 21888242871839275222246405745257275088548364400416034343698147442802417044621, + 25851237596901309, + 21888242871839275222246405745257275088548364400416034343698113105993161724105, + 40365578968519806, + 60218671729737520, + 57433415751970978, + 21888242871839275222246405745257275088548364400416034343698108795904984202939, + 121022907980647807, + 110133920076605027, + 21888242871839275222246405745257275088548364400416034343698164145565128242755, + 21888242871839275222246405745257275088548364400416034343698138339370315360041, + 21888242871839275222246405745257275088548364400416034343698098142371185344657, + 60508245674016452, + 21888242871839275222246405745257275088548364400416034343698101533838164516979, + 21888242871839275222246405745257275088548364400416034343698173051431014157040, + 21888242871839275222246405745257275088548364400416034343698087408276266526052, + 49834471478194074, + 105828925840472878, + 21888242871839275222246405745257275088548364400416034343698159954382796763931, + 130907965075096412, + 21888242871839275222246405745257275088548364400416034343698067570668367387102, + 93765389626672573, + 21888242871839275222246405745257275088548364400416034343698170039802389800377, + 21888242871839275222246405745257275088548364400416034343698082849868104881941, + 21888242871839275222246405745257275088548364400416034343698150060175189904737, + 58990567922231906, + 21888242871839275222246405745257275088548364400416034343698193901683004663566, + 79942138144066182, + 39173921730168598, + 21888242871839275222246405745257275088548364400416034343698179782804379645145, + 111981790036108488, + 55176357517975902, + 13644021856850510, + 29193348535145236, + 76436120040220653, + 21888242871839275222246405745257275088548364400416034343698160541980844749117, + 82322970594123440, + 21888242871839275222246405745257275088548364400416034343698134998387632198199, + 49561820640576792, + 21888242871839275222246405745257275088548364400416034343698179228244301196012, + 21888242871839275222246405745257275088548364400416034343698118067752231785594, + 21888242871839275222246405745257275088548364400416034343698161303965807028355, + 97593822300846905, + 98340267989215843, + 127156407212178968, + 21888242871839275222246405745257275088548364400416034343698117479642211618647, + 58726895955609886, + 21888242871839275222246405745257275088548364400416034343698139462411298375049, + 88989687216018691, + 21888242871839275222246405745257275088548364400416034343698144201144882902785, + 21888242871839275222246405745257275088548364400416034343698065823900528264639, + 21888242871839275222246405745257275088548364400416034343698155142066715235311, + 21888242871839275222246405745257275088548364400416034343698061996857157662804, + 64614570058359282, + 70185742284673018, + 21888242871839275222246405745257275088548364400416034343698200239589723371761, + 21888242871839275222246405745257275088548364400416034343698196625530246346694, + 77611408760925188, + 21888242871839275222246405745257275088548364400416034343698060864824867041357, + 130759919638121456, + 21888242871839275222246405745257275088548364400416034343698064986215372843960, + 21888242871839275222246405745257275088548364400416034343698082286329895199440, + 111463615710033251, + 97266031906673150, + 21888242871839275222246405745257275088548364400416034343698155856464231150374, + 21888242871839275222246405745257275088548364400416034343698113483508837298713, + 28604664964725094, + 130127949146067367, + 21888242871839275222246405745257275088548364400416034343698154759063623851050, + 21888242871839275222246405745257275088548364400416034343698136627006431744694, + 21888242871839275222246405745257275088548364400416034343698148276710486556574, + 16490793817231836, + 21888242871839275222246405745257275088548364400416034343698173037629638876746, + 21888242871839275222246405745257275088548364400416034343698074956945524377450, + 44119962729921357, + 48739942347854043, + 21888242871839275222246405745257275088548364400416034343698178653608758615923, + 21888242871839275222246405745257275088548364400416034343698099606768550028661, + 21888242871839275222246405745257275088548364400416034343698062841824477368318, + 21888242871839275222246405745257275088548364400416034343698150702706217630608, + 67936093448429315, + 21888242871839275222246405745257275088548364400416034343698139587711245862886, + 21888242871839275222246405745257275088548364400416034343698184529432919762735, + 21888242871839275222246405745257275088548364400416034343698172448194414793296, + 129920354304639537, + 38645445970305554, + 21888242871839275222246405745257275088548364400416034343698081455698204226770, + 21888242871839275222246405745257275088548364400416034343698168495325508793272, + 47993814296297930, + 79229824473612407, + 21888242871839275222246405745257275088548364400416034343698128322315386940616, + 21888242871839275222246405745257275088548364400416034343698093217967080782004, + 21888242871839275222246405745257275088548364400416034343698189722253179904271, + 56710309276167344, + 130682975922651434, + 51827306174758804, + 21888242871839275222246405745257275088548364400416034343698075343651333013799, + 124274770010752649, + 142874022746659356, + 21888242871839275222246405745257275088548364400416034343698095713307212463749, + 21888242871839275222246405745257275088548364400416034343698108353855870360159, + 21888242871839275222246405745257275088548364400416034343698113607711751580032, + 44247091239047822, + 53086690412254211, + 94242642367309249, + 21888242871839275222246405745257275088548364400416034343698123313496334078003, + 11524040632462530, + 21888242871839275222246405745257275088548364400416034343698135496878940356621, + 21888242871839275222246405745257275088548364400416034343698160550190715712757, + 40375451368476300, + 14323278896371080, + 21888242871839275222246405745257275088548364400416034343698188905786846578846, + 21888242871839275222246405745257275088548364400416034343698145627138262465614, + 17506370371562544, + 111914274350061399, + 21888242871839275222246405745257275088548364400416034343698075947945338743860, + 21888242871839275222246405745257275088548364400416034343698181009509226208422, + 7095567277186584, + 93557731195417426, + 39899090803415027, + 21888242871839275222246405745257275088548364400416034343698071301184352106844, + 21888242871839275222246405745257275088548364400416034343698188602896286149375, + 21888242871839275222246405745257275088548364400416034343698156510064284789413, + 21888242871839275222246405745257275088548364400416034343698147285129523489950, + 6942051819095796, + 21888242871839275222246405745257275088548364400416034343698167554294110487952, + 21888242871839275222246405745257275088548364400416034343698190133535689579610, + 10259066929388129, + 21888242871839275222246405745257275088548364400416034343698189352061162536295, + 21888242871839275222246405745257275088548364400416034343698102014757709242940, + 122860781130320901, + 52336100412852363, + 21888242871839275222246405745257275088548364400416034343698103336105813683948, + 36358670636043780, + 74410057020777767, + 21888242871839275222246405745257275088548364400416034343698145619934080838364, + 74868222596741697, + 120452993182152760, + 107037586362546692, + 21888242871839275222246405745257275088548364400416034343698192916266388193972, + 137977204620441639, + 21888242871839275222246405745257275088548364400416034343698164405333516618012, + 21888242871839275222246405745257275088548364400416034343698172478645472846342, + 94534499347338616, + 34290188513545391, + 109146288481215828, + 21888242871839275222246405745257275088548364400416034343698146670053678362366, + 86336650134499746, + 7200216352776535, + 123435769584020286, + 104849355562063204, + 91119039921419153, + 21888242871839275222246405745257275088548364400416034343698172101218460454960, + 23616270181722654, + 80256368989819195, + 793422933184558, + 38626460351094186, + 50397981230676140, + 21888242871839275222246405745257275088548364400416034343698108934476674897000, + 21888242871839275222246405745257275088548364400416034343698186433682402731741, + 21888242871839275222246405745257275088548364400416034343698140379021241477076, + 102211788828119, + 21888242871839275222246405745257275088548364400416034343698202498911881974832, + 21888242871839275222246405745257275088548364400416034343698064433581229501000, + 21888242871839275222246405745257275088548364400416034343698060987422012958493, + 21888242871839275222246405745257275088548364400416034343698139284853169379482, + 21888242871839275222246405745257275088548364400416034343698094161286305268679, + 21888242871839275222246405745257275088548364400416034343698151248061342042624, + 21888242871839275222246405745257275088548364400416034343698070379582014227331, + 5993730054249024, + 35382282439115478, + 35166045764649868, + 21888242871839275222246405745257275088548364400416034343698172167787851668730, + 21888242871839275222246405745257275088548364400416034343698113404295617525793, + 50198285289379795, + 85796780889538830, + 21888242871839275222246405745257275088548364400416034343698163591311364952046, + 21888242871839275222246405745257275088548364400416034343698130892086227816438, + 98077680436114552, + 21888242871839275222246405745257275088548364400416034343698146882803499659628, + 21888242871839275222246405745257275088548364400416034343698080946613034917626, + 21888242871839275222246405745257275088548364400416034343698119642228950283446, + 5102084219016647, + 14488474837574896, + 30849052021178679, + 21888242871839275222246405745257275088548364400416034343698141552503079247844, + 21888242871839275222246405745257275088548364400416034343698101136340790879078, + 21888242871839275222246405745257275088548364400416034343698203499681459697823, + 21888242871839275222246405745257275088548364400416034343698177761873419165910, + 21888242871839275222246405745257275088548364400416034343698195923226817744400, + 59623107383677393, + 4874218332356408, + 21888242871839275222246405745257275088548364400416034343698129576976296177642, + 65804156278110298, + 21888242871839275222246405745257275088548364400416034343698090774017256533341, + 21888242871839275222246405745257275088548364400416034343698148040767515097575, + 106438191019450609, + 88002794057011761, + 21888242871839275222246405745257275088548364400416034343698180948106766068476, + 76317273079734912, + 104960193130402753, + 134223198224503904, + 134936228654794165, + 87977725502388225, + 104397870265371432, + 68372729444084220, + 62113129782378188, + 118715744065229250, + 21888242871839275222246405745257275088548364400416034343698123224260309458707, + 136347736558002817, + 21888242871839275222246405745257275088548364400416034343698086695854168066416, + 137668880550285268, + 40419853461325165, + 21888242871839275222246405745257275088548364400416034343698147808502928528201, + 72051905287280929, + 19786158395502785, + 21888242871839275222246405745257275088548364400416034343698136778911490112853, + 21888242871839275222246405745257275088548364400416034343698162577543022323751, + 122358992351438792, + 21888242871839275222246405745257275088548364400416034343698198053732013137623, + 21888242871839275222246405745257275088548364400416034343698067304112144154746, + 89373632493582834, + 94718956404868170, + 137835939139817574, + 21888242871839275222246405745257275088548364400416034343698161671173848480350, + 21888242871839275222246405745257275088548364400416034343698199835727159752855, + 76401903896853484, + 108093078161424164, + 21888242871839275222246405745257275088548364400416034343698072182230374128983, + 21888242871839275222246405745257275088548364400416034343698121876355452217813, + 21888242871839275222246405745257275088548364400416034343698088172571811785453, + 122876455594102337, + 21888242871839275222246405745257275088548364400416034343698130145514745293473, + 21888242871839275222246405745257275088548364400416034343698198038339541738127, + 21888242871839275222246405745257275088548364400416034343698173377872453276267, + 21888242871839275222246405745257275088548364400416034343698175139273935858061, + 125138941498621169, + 23435477864984169, + 21888242871839275222246405745257275088548364400416034343698069792331203087177, + 101368075961422838, + 78042674324223513, + 63671978179317809, + 71217021449589991, + 21888242871839275222246405745257275088548364400416034343698172055369582149781, + 21888242871839275222246405745257275088548364400416034343698188034647095897493, + 21888242871839275222246405745257275088548364400416034343698117238435619682530, + 127469188149568148, + 21888242871839275222246405745257275088548364400416034343698189674202870701909, + 21888242871839275222246405745257275088548364400416034343698132035911416028749, + 36136736096948787, + 53056615782293459, + 21888242871839275222246405745257275088548364400416034343698094201731520283399, + 21022529991675358, + 21888242871839275222246405745257275088548364400416034343698066444188246414412, + 21888242871839275222246405745257275088548364400416034343698084579529357559329, + 21888242871839275222246405745257275088548364400416034343698095134197878628027, + 79137179220515473, + 555438420205317, + 21888242871839275222246405745257275088548364400416034343698191198376285380825, + 21888242871839275222246405745257275088548364400416034343698169628725165769945, + 8344766158667623, + 21888242871839275222246405745257275088548364400416034343698096756708310633252, + 21888242871839275222246405745257275088548364400416034343698142284642615268733, + 21888242871839275222246405745257275088548364400416034343698087201717957275021, + 21888242871839275222246405745257275088548364400416034343698139369982698213374, + 64124604302373306, + 60041982027777014, + 21888242871839275222246405745257275088548364400416034343698098860946816604554, + 117266412584249138, + 34714570327597983, + 21888242871839275222246405745257275088548364400416034343698179738181086715476, + 122831128244984766, + 119095724033121817, + 1738669154876219, + 21888242871839275222246405745257275088548364400416034343698119127851984996951, + 47471479835925759, + 10037132267040922, + 88595887730715372, + 21888242871839275222246405745257275088548364400416034343698152342545056386241, + 117467442218156521, + 21888242871839275222246405745257275088548364400416034343698139823662985002770, + 45301127871925445, + 21888242871839275222246405745257275088548364400416034343698153041359210017595, + 21888242871839275222246405745257275088548364400416034343698109304086065822221, + 103736947220195391, + 21888242871839275222246405745257275088548364400416034343698163860961885204818, + 73565886267750861, + 21888242871839275222246405745257275088548364400416034343698147270783729416387, + 21888242871839275222246405745257275088548364400416034343698077891313783246477, + 60949538084618512, + 21888242871839275222246405745257275088548364400416034343698152243189437832533, + 10564853158813634, + 25440083544127202, + 110782827463415761, + 130610600711916236, + 95140371482009256, + 21888242871839275222246405745257275088548364400416034343698161683026620581173, + 21888242871839275222246405745257275088548364400416034343698079619417794969680, + 21888242871839275222246405745257275088548364400416034343698110809325686097704, + 95866089290398243, + 21888242871839275222246405745257275088548364400416034343698168395247761379625, + 120011248685610811, + 120063117246122202, + 70894704356793872, + 40399892362028353, + 21888242871839275222246405745257275088548364400416034343698060614844052835631, + 21888242871839275222246405745257275088548364400416034343698067334442214339761, + 21888242871839275222246405745257275088548364400416034343698169107966792732567, + 45766065118056534, + 34946604316069711, + 21888242871839275222246405745257275088548364400416034343698171442032919070670, + 21888242871839275222246405745257275088548364400416034343698179651651432361983, + 113402596646227941, + 127856159604422918, + 21888242871839275222246405745257275088548364400416034343698177035594071460533, + 28394073952581285, + 118463868594400569, + 67432766944233886, + 21888242871839275222246405745257275088548364400416034343698159806899347130585, + 57089052706349588, + 21888242871839275222246405745257275088548364400416034343698100365113665421799, + 45020615784743115, + 21888242871839275222246405745257275088548364400416034343698161646467975545946, + 21888242871839275222246405745257275088548364400416034343698155481759820319244, + 47705488987042096, + 124256240207074200, + 30192236188722925, + 21888242871839275222246405745257275088548364400416034343698181472024447052600, + 77285305977155598, + 21888242871839275222246405745257275088548364400416034343698118633788007907553, + 76657413593931291, + 12909014046473616, + 21888242871839275222246405745257275088548364400416034343698078230449509101011, + 25025029628245968, + 21888242871839275222246405745257275088548364400416034343698143886469288057269, + 21888242871839275222246405745257275088548364400416034343698064144766658056522, + 86551870128967906, + 125704311506468302, + 21888242871839275222246405745257275088548364400416034343698074411003455650523, + 102702070704029549, + 29264513318458282, + 82311085340513597, + 21888242871839275222246405745257275088548364400416034343698063185574700799039, + 90274043599134231, + 21888242871839275222246405745257275088548364400416034343698070591748080140424, + 21888242871839275222246405745257275088548364400416034343698092388128871180626, + 95089178023485760, + 37559372788469701, + 35466490684563271, + 85024518011493091, + 21888242871839275222246405745257275088548364400416034343698129382359371038532, + 90548132215015018, + 132463297350491068, + 51289319650900481, + 21888242871839275222246405745257275088548364400416034343698065285780790247541, + 21888242871839275222246405745257275088548364400416034343698068317789882105443, + 21888242871839275222246405745257275088548364400416034343698061051807315252030, + 54235192032941566, + 17714294052432516, + 62737151943941629, + 21888242871839275222246405745257275088548364400416034343698071519755217493050, + 21888242871839275222246405745257275088548364400416034343698136436062901169895, + 86013919656498389, + 21888242871839275222246405745257275088548364400416034343698121600051186175205, + 48739391191559263, + 21888242871839275222246405745257275088548364400416034343698066926709394021317, + 21888242871839275222246405745257275088548364400416034343698161313629087369367, + 21888242871839275222246405745257275088548364400416034343698065502337204429480, + 111591361048652992, + 118569468012491338, + 21888242871839275222246405745257275088548364400416034343698173841377604464176, + 21888242871839275222246405745257275088548364400416034343698191914776449342048, + 78867760636363892, + 112650769070156646, + 21888242871839275222246405745257275088548364400416034343698065750101526542072, + 21888242871839275222246405745257275088548364400416034343698097946599770443231, + 132723537605532774, + 81123334616028008, + 99917334883217408, + 21888242871839275222246405745257275088548364400416034343698197211818861513090, + 43580180969486082, + 21888242871839275222246405745257275088548364400416034343698195936861058419192, + 17888763698617874, + 21888242871839275222246405745257275088548364400416034343698197547029411832553, + 99248682913321386, + 21888242871839275222246405745257275088548364400416034343698089814296914886692, + 21888242871839275222246405745257275088548364400416034343698198733679741929109, + 21888242871839275222246405745257275088548364400416034343698061834221959522456, + 21888242871839275222246405745257275088548364400416034343698190822610076729831, + 21888242871839275222246405745257275088548364400416034343698155401882277285226, + 132511762163974216, + 116924498600480140, + 35112562726810818, + 21888242871839275222246405745257275088548364400416034343698170091773198003838, + 21888242871839275222246405745257275088548364400416034343698113041642133741215, + 22696737756632953, + 21888242871839275222246405745257275088548364400416034343698078559162762619592, + 50752886398403006, + 21888242871839275222246405745257275088548364400416034343698178282798791702364, + 104435492797894799, + 136873023623059111, + 21888242871839275222246405745257275088548364400416034343698188739855516778468, + 21888242871839275222246405745257275088548364400416034343698130598485325182919, + 63290239920302729, + 1175564513917911, + 50946438658721007, + 108359097631605831, + 111473540911347528, + 21888242871839275222246405745257275088548364400416034343698192437090685017823, + 21888242871839275222246405745257275088548364400416034343698140075219081793496, + 61069042426284954, + 92355731065457787, + 98953376490373636, + 21888242871839275222246405745257275088548364400416034343698142250966485990678, + 125080163321280794, + 21888242871839275222246405745257275088548364400416034343698141738672802810257, + 77740506242975407, + 21888242871839275222246405745257275088548364400416034343698142431019355505675, + 21888242871839275222246405745257275088548364400416034343698189877637650427258, + 21888242871839275222246405745257275088548364400416034343698190478847841795811, + 74004897577362841, + 21888242871839275222246405745257275088548364400416034343698202841971269208556, + 48551903873697986, + 142826559943487823, + 21888242871839275222246405745257275088548364400416034343698159209767283735424, + 53943962623613540, + 21888242871839275222246405745257275088548364400416034343698135391513616157655, + 21888242871839275222246405745257275088548364400416034343698108977132302623685, + 55242468249490982, + 83147426917260610, + 21888242871839275222246405745257275088548364400416034343698094352007980871724, + 77524566239768572, + 80878959004967133, + 31206142197320548, + 32979353803339178, + 21888242871839275222246405745257275088548364400416034343698061826713066173334, + 47346797192439738, + 21888242871839275222246405745257275088548364400416034343698073145611786862013, + 21888242871839275222246405745257275088548364400416034343698178980763768161611, + 126773583796154267, + 21888242871839275222246405745257275088548364400416034343698090275974705777445, + 21888242871839275222246405745257275088548364400416034343698130563124895019598, + 140179623108098669, + 21888242871839275222246405745257275088548364400416034343698171373376320915100, + 21888242871839275222246405745257275088548364400416034343698147145279881124355, + 31053622692562089, + 58086647365367516, + 88816240971180773, + 21888242871839275222246405745257275088548364400416034343698061922745868656154, + 116710458277408259, + 27948587661886819, + 80484504896686750, + 21888242871839275222246405745257275088548364400416034343698112816526480663632, + 51757441339953496, + 21888242871839275222246405745257275088548364400416034343698076835446205919659, + 61063638077151557, + 21888242871839275222246405745257275088548364400416034343698171916711033168772, + 21888242871839275222246405745257275088548364400416034343698199482733693804750, + 11698069537363199, + 21888242871839275222246405745257275088548364400416034343698177251248857362970, + 23182613782033649, + 100505212845019094, + 21888242871839275222246405745257275088548364400416034343698201839678175694583, + 98549152358708702, + 21888242871839275222246405745257275088548364400416034343698077585538952654556, + 11163629486446910, + 23395774774552300, + 21888242871839275222246405745257275088548364400416034343698075438141246926909, + 93497429356469674, + 90313398625965656, + 120541028822150767, + 21888242871839275222246405745257275088548364400416034343698109466448132994689, + 88824877841593338, + 21888242871839275222246405745257275088548364400416034343698199482381042952993, + 75413715744958488, + 5633395737575029, + 5429924378623980, + 118020835747508495, + 25804524710022171, + 21888242871839275222246405745257275088548364400416034343698087010497008864060, + 67636227279221384, + 35392416605687380, + 21888242871839275222246405745257275088548364400416034343698081943630445635716, + 58117658573998110, + 21888242871839275222246405745257275088548364400416034343698167531255362970317, + 86298405816394451, + 119923312945344835, + 21888242871839275222246405745257275088548364400416034343698199855926436349287, + 21888242871839275222246405745257275088548364400416034343698116911420870569026, + 107251494435205840, + 21888242871839275222246405745257275088548364400416034343698193691705880774750, + 21888242871839275222246405745257275088548364400416034343698105771498061626787, + 21888242871839275222246405745257275088548364400416034343698180305104344175079, + 21888242871839275222246405745257275088548364400416034343698065897815083970125, + 21888242871839275222246405745257275088548364400416034343698140368460032826235, + 91980410895450605, + 21888242871839275222246405745257275088548364400416034343698136792883496394890, + 21888242871839275222246405745257275088548364400416034343698123253985111982097, + 21888242871839275222246405745257275088548364400416034343698115884163855843324, + 65384936358155147, + 21888242871839275222246405745257275088548364400416034343698070516333092131435, + 21888242871839275222246405745257275088548364400416034343698071938085055090253, + 21888242871839275222246405745257275088548364400416034343698176960522073380561, + 21888242871839275222246405745257275088548364400416034343698141848908503630187, + 21888242871839275222246405745257275088548364400416034343698145778877886941100, + 94195185521784563, + 11704991756815438, + 24983000968432412, + 3667235188147185, + 21888242871839275222246405745257275088548364400416034343698077869279710505059, + 32672191682561714, + 1245592285181850, + 11143842614056605, + 21888242871839275222246405745257275088548364400416034343698069725870172874042, + 21888242871839275222246405745257275088548364400416034343698152492596102199090, + 71393066629109258, + 121706791882509301, + 21888242871839275222246405745257275088548364400416034343698115537508751885923, + 21888242871839275222246405745257275088548364400416034343698150415031872634978, + 5574123704287075, + 123862433812512511, + 21888242871839275222246405745257275088548364400416034343698123201175434584345, + 62173194758065090, + 21888242871839275222246405745257275088548364400416034343698139105737319536449, + 112394504348328650, + 46237320670058141, + 21888242871839275222246405745257275088548364400416034343698154227051846646394, + 116699597044614985, + 93380344841934973, + 20835264388840367, + 65574817430463690, + 76015786977377637, + 21888242871839275222246405745257275088548364400416034343698106150174404964980, + 49373051450875061, + 21888242871839275222246405745257275088548364400416034343698075973599990502012, + 83043925298585186, + 18945856656785558, + 105401447009448537, + 57944796774381863, + 44169973474499135, + 21888242871839275222246405745257275088548364400416034343698179840415208076866, + 125392356191408724, + 66447577976544901, + 21888242871839275222246405745257275088548364400416034343698120177430667880045, + 15037084487078044, + 21888242871839275222246405745257275088548364400416034343698097504673420737824, + 104365905345989429, + 21888242871839275222246405745257275088548364400416034343698160765864338841130, + 133391483397970107, + 25828622291572969, + 21888242871839275222246405745257275088548364400416034343698132965682520039488, + 21888242871839275222246405745257275088548364400416034343698188141156208697642, + 21888242871839275222246405745257275088548364400416034343698124507089705069451, + 56209057912391142, + 57832278134637128, + 21888242871839275222246405745257275088548364400416034343698131180247622917014, + 127330411794517030, + 21888242871839275222246405745257275088548364400416034343698174003011533825399, + 66394156205602259, + 21888242871839275222246405745257275088548364400416034343698085434293740789967, + 21888242871839275222246405745257275088548364400416034343698148837182175148543, + 21888242871839275222246405745257275088548364400416034343698093892590669245729, + 21888242871839275222246405745257275088548364400416034343698103418079471117091, + 21888242871839275222246405745257275088548364400416034343698115007818191307202, + 21888242871839275222246405745257275088548364400416034343698075798744859761549, + 21888242871839275222246405745257275088548364400416034343698075442434587043609, + 21888242871839275222246405745257275088548364400416034343698199492641857503238, + 9593718568605886, + 21888242871839275222246405745257275088548364400416034343698082538214039079586, + 21888242871839275222246405745257275088548364400416034343698080920613354498404, + 118339020081819036, + 21888242871839275222246405745257275088548364400416034343698088983801721516505, + 21888242871839275222246405745257275088548364400416034343698105682799404512467, + 21888242871839275222246405745257275088548364400416034343698194816215374822803, + 128663981631318516, + 21888242871839275222246405745257275088548364400416034343698126759770382478719, + 21888242871839275222246405745257275088548364400416034343698179854585901234422, + 41908515187652579, + 21888242871839275222246405745257275088548364400416034343698129150326514658354, + 21888242871839275222246405745257275088548364400416034343698069358125253539502, + 21888242871839275222246405745257275088548364400416034343698116881185340752359, + 21888242871839275222246405745257275088548364400416034343698198559712983786334, + 21888242871839275222246405745257275088548364400416034343698200981482767837563, + 70516325020249063, + 21899796434516866, + 91995673165151768, + 27146140109208709, + 21888242871839275222246405745257275088548364400416034343698106192571009404532, + 21888242871839275222246405745257275088548364400416034343698113721518761301709, + 21888242871839275222246405745257275088548364400416034343698123990050616759633, + 21888242871839275222246405745257275088548364400416034343698067822116035288480, + 21888242871839275222246405745257275088548364400416034343698190262415378789116, + 47299566222746457, + 21888242871839275222246405745257275088548364400416034343698107350841831691163, + 21888242871839275222246405745257275088548364400416034343698176834024915928805, + 81336829151232971, + 117817153670162274, + 79413206638979107, + 88458979628682596, + 21888242871839275222246405745257275088548364400416034343698133868018094349359, + 21888242871839275222246405745257275088548364400416034343698187472730697391588, + 21888242871839275222246405745257275088548364400416034343698182467394640747870, + 46267643973283792, + 99119827584203591, + 21888242871839275222246405745257275088548364400416034343698075688438645551214, + 91539787325094173, + 21888242871839275222246405745257275088548364400416034343698114212447759680911, + 21888242871839275222246405745257275088548364400416034343698115788040532618097, + 10022238254052707, + 21888242871839275222246405745257275088548364400416034343698103149598285249978, + 96444726305881822, + 21888242871839275222246405745257275088548364400416034343698147816248978487802, + 21888242871839275222246405745257275088548364400416034343698125982582362224490, + 21888242871839275222246405745257275088548364400416034343698133270228373755775, + 44497228794066189, + 25868967341082291, + 51879412925182366, + 21888242871839275222246405745257275088548364400416034343698071408518809946586, + 141199116076632701, + 21888242871839275222246405745257275088548364400416034343698186190964654227528, + 62755224076194900, + 21888242871839275222246405745257275088548364400416034343698076684638710970282, + 135244200993987150, + 10999208774444984, + 30897017049225957, + 21888242871839275222246405745257275088548364400416034343698110757792399272893, + 66008742130894263, + 21888242871839275222246405745257275088548364400416034343698197695951165591095, + 122696848881101237, + 21888242871839275222246405745257275088548364400416034343698155134059121661101, + 21888242871839275222246405745257275088548364400416034343698073514848285034076, + 98221698537776438, + 37399507333042234, + 21888242871839275222246405745257275088548364400416034343698101617305032902077, + 21888242871839275222246405745257275088548364400416034343698106831243809604793, + 21888242871839275222246405745257275088548364400416034343698197632392682048032, + 21888242871839275222246405745257275088548364400416034343698066909359080401820, + 54024953289698069, + 21888242871839275222246405745257275088548364400416034343698127933623286851376, + 21888242871839275222246405745257275088548364400416034343698143490079659708022, + 21888242871839275222246405745257275088548364400416034343698166123663675991210, + 21888242871839275222246405745257275088548364400416034343698095165987488753224, + 11060594199522513, + 21888242871839275222246405745257275088548364400416034343698156402134037071950, + 21888242871839275222246405745257275088548364400416034343698089658320610470436, + 21888242871839275222246405745257275088548364400416034343698100035780349640260, + 21888242871839275222246405745257275088548364400416034343698089591543188635701, + 21888242871839275222246405745257275088548364400416034343698168738587826214995, + 90295337303253922, + 21888242871839275222246405745257275088548364400416034343698105991572739633861, + 39240582804176721, + 21888242871839275222246405745257275088548364400416034343698170253562334385055, + 116159891039274222, + 65563343015413911, + 133064529449116398, + 21888242871839275222246405745257275088548364400416034343698080878979172116110, + 21888242871839275222246405745257275088548364400416034343698105841132178916294, + 33572857729373028, + 21888242871839275222246405745257275088548364400416034343698130935957319802017, + 21888242871839275222246405745257275088548364400416034343698089671884189351018, + 29402503270472619, + 137573695820353246, + 21888242871839275222246405745257275088548364400416034343698183509658174686900, + 129914347617671830, + 132660547462355831, + 70525351930746657, + 111767002555002109, + 21888242871839275222246405745257275088548364400416034343698157331309905515859, + 140955461278434494, + 119217025657943642, + 21888242871839275222246405745257275088548364400416034343698149017571140684238, + 34718423006095588, + 21888242871839275222246405745257275088548364400416034343698070459047325502803, + 57996842856816288, + 21888242871839275222246405745257275088548364400416034343698193783650492774445, + 57543934207963629, + 91378708701954794, + 21783460542519328, + 1721149415366588, + 21888242871839275222246405745257275088548364400416034343698080351787824845765, + 125090297726240289, + 21888242871839275222246405745257275088548364400416034343698155999035811513820, + 106237397314002142, + 21888242871839275222246405745257275088548364400416034343698060798712251018200, + 81184414549004798, + 21888242871839275222246405745257275088548364400416034343698077171877324463780, + 21888242871839275222246405745257275088548364400416034343698101993671533136396, + 26877712388336695, + 46257962822290153, + 58476944673672489, + 126112023971624765, + 21888242871839275222246405745257275088548364400416034343698063465317560330815, + 54272238659626108, + 120196470447040009, + 80982183576657514, + 21888242871839275222246405745257275088548364400416034343698182034319631607544, + 21888242871839275222246405745257275088548364400416034343698147069850428394726, + 21888242871839275222246405745257275088548364400416034343698203867042204655121, + 15081710724568474, + 21888242871839275222246405745257275088548364400416034343698139720871490883191, + 86125553429263865, + 21888242871839275222246405745257275088548364400416034343698105233970504737384, + 21888242871839275222246405745257275088548364400416034343698136412933185350200, + 21888242871839275222246405745257275088548364400416034343698122648739391125508, + 21888242871839275222246405745257275088548364400416034343698167910609687438888, + 52857570963464230, + 94180705817700172, + 69573602110191555, + 18731486829631405, + 121086261001707342, + 86232057065384744, + 98541049485281925, + 24276676258348272, + 45355207572954401, + 21888242871839275222246405745257275088548364400416034343698070702196521066482, + 108946841716413199, + 107870669391282054, + 21888242871839275222246405745257275088548364400416034343698122569904243776338, + 21888242871839275222246405745257275088548364400416034343698174114724201669671, + 122300630037951230, + 91240517185595218, + 21888242871839275222246405745257275088548364400416034343698176649876634530267, + 21888242871839275222246405745257275088548364400416034343698175562698705187692, + 21888242871839275222246405745257275088548364400416034343698192001508382474565, + 55989639635592625, + 21888242871839275222246405745257275088548364400416034343698084480313183224269, + 21888242871839275222246405745257275088548364400416034343698100852954003049941, + 21888242871839275222246405745257275088548364400416034343698192494567133223668, + 141577038551916828, + 110983110208608387, + 21888242871839275222246405745257275088548364400416034343698076363616563280785, + 101792056228492268, + 21888242871839275222246405745257275088548364400416034343698158878299673048267, + 105303909608905021, + 21888242871839275222246405745257275088548364400416034343698105862398874310972, + 21888242871839275222246405745257275088548364400416034343698168290169975453780, + 21888242871839275222246405745257275088548364400416034343698110963408368421437, + 75298670322403932, + 21888242871839275222246405745257275088548364400416034343698157190812618471561, + 127590426037625250, + 21888242871839275222246405745257275088548364400416034343698147382107329741293, + 21888242871839275222246405745257275088548364400416034343698181691321329327901, + 21992299039999819, + 21888242871839275222246405745257275088548364400416034343698178086269196331226, + 21888242871839275222246405745257275088548364400416034343698176489501793783531, + 15267878401343832, + 1520244865290793, + 21888242871839275222246405745257275088548364400416034343698107276318920331684, + 94278047667889055, + 21888242871839275222246405745257275088548364400416034343698105430987711575313, + 21888242871839275222246405745257275088548364400416034343698178230953987709997, + 21888242871839275222246405745257275088548364400416034343698087103824603357107, + 111447101467421764, + 132640582834284405, + 133303301755435406, + 21888242871839275222246405745257275088548364400416034343698137366081868363115, + 21888242871839275222246405745257275088548364400416034343698083644377774339696, + 99610485877741879, + 63549222409349282, + 21888242871839275222246405745257275088548364400416034343698098480210301057780, + 21888242871839275222246405745257275088548364400416034343698123443194294008007, + 21888242871839275222246405745257275088548364400416034343698087633510810928231, + 21888242871839275222246405745257275088548364400416034343698161655696325612848, + 21888242871839275222246405745257275088548364400416034343698166999775104839275, + 43242959189732539, + 21888242871839275222246405745257275088548364400416034343698090579893337710232, + 112811719400188044, + 21888242871839275222246405745257275088548364400416034343698150080206677016788, + 27680428650484044, + 41846127950039772, + 21888242871839275222246405745257275088548364400416034343698186033491318785561, + 125295698117735673, + 21888242871839275222246405745257275088548364400416034343698175104151615927473, + 21888242871839275222246405745257275088548364400416034343698146536937015584480, + 125055948536504508, + 44785868010652304, + 18851383461360776, + 128780895340466558, + 28563499866678587, + 31030229194974350, + 113318988526701212, + 21888242871839275222246405745257275088548364400416034343698129774766808661661, + 1802527555693880, + 6932769284158723, + 78654523884330934, + 76371101599811059, ]), Polynomial::new([ - 37725859941421338, - 21888242871839275222246405745257275088548364400416034343698153549126098348779, - 21888242871839275222246405745257275088548364400416034343698137608829353930107, - 21888242871839275222246405745257275088548364400416034343698137557410412299254, - 21888242871839275222246405745257275088548364400416034343698202255944969467406, - 21888242871839275222246405745257275088548364400416034343698136944794128634133, - 21888242871839275222246405745257275088548364400416034343698142731790984122868, - 36201577801054645, - 21888242871839275222246405745257275088548364400416034343698197545836857131095, - 21888242871839275222246405745257275088548364400416034343698194518041935181523, - 25683994062877957, - 21888242871839275222246405745257275088548364400416034343698182336196647326636, - 21888242871839275222246405745257275088548364400416034343698176494346371652799, - 21888242871839275222246405745257275088548364400416034343698154248905753060347, - 23695431845741505, - 37914713847160043, - 21888242871839275222246405745257275088548364400416034343698191084376010951046, - 5015850164666560, - 18420942784940755, - 21888242871839275222246405745257275088548364400416034343698158225420499151698, - 38644340135356242, - 21888242871839275222246405745257275088548364400416034343698157777747644702221, - 8231635739400503, - 21888242871839275222246405745257275088548364400416034343698133152512428720566, - 21888242871839275222246405745257275088548364400416034343698170041096296862952, - 9405137357953907, - 34451041107098451, - 21888242871839275222246405745257275088548364400416034343698166772767268800279, - 61749258574974213, - 41990542689500246, - 6620336637924543, - 21888242871839275222246405745257275088548364400416034343698136311340221935218, - 21888242871839275222246405745257275088548364400416034343698181358704497177134, - 21888242871839275222246405745257275088548364400416034343698132857841305040942, - 21888242871839275222246405745257275088548364400416034343698173153101416089600, - 38095062094557945, - 21888242871839275222246405745257275088548364400416034343698181644076260524287, - 52590742450685270, - 10533257055261182, - 21888242871839275222246405745257275088548364400416034343698143084845844306604, - 21888242871839275222246405745257275088548364400416034343698187787815715257179, - 33311531730786963, - 21888242871839275222246405745257275088548364400416034343698162372769417937376, - 21888242871839275222246405745257275088548364400416034343698154250974395001730, - 21888242871839275222246405745257275088548364400416034343698145874411382978856, - 21888242871839275222246405745257275088548364400416034343698153325940790150343, - 21888242871839275222246405745257275088548364400416034343698192115072390360124, - 15932672054490055, - 36479511458500224, - 21888242871839275222246405745257275088548364400416034343698196068871544015735, - 57503751131167503, - 21888242871839275222246405745257275088548364400416034343698175248874151629901, - 28697492017996827, - 21888242871839275222246405745257275088548364400416034343698151949337972742933, - 1483608406557209, - 21888242871839275222246405745257275088548364400416034343698178980974781133514, - 62021792997422190, - 21888242871839275222246405745257275088548364400416034343698156821132056220919, - 21888242871839275222246405745257275088548364400416034343698191829256806012714, - 21888242871839275222246405745257275088548364400416034343698148417827157575285, - 21888242871839275222246405745257275088548364400416034343698157677338320495141, - 51779933333103552, - 21888242871839275222246405745257275088548364400416034343698147813910861268999, - 21888242871839275222246405745257275088548364400416034343698160567573197680864, - 60266568874413446, - 21888242871839275222246405745257275088548364400416034343698196538671125200095, - 69988670031460406, - 21888242871839275222246405745257275088548364400416034343698203619122199618991, - 52971382960496540, - 21888242871839275222246405745257275088548364400416034343698161157739085344055, - 21888242871839275222246405745257275088548364400416034343698142666149785620658, - 21888242871839275222246405745257275088548364400416034343698203871350263825222, - 28574868731440217, - 21888242871839275222246405745257275088548364400416034343698178392656911463347, - 45695166811594926, - 61316200611978117, - 55019218947191721, - 21888242871839275222246405745257275088548364400416034343698153858105092726639, - 21888242871839275222246405745257275088548364400416034343698187464335946982980, - 65112351210303639, - 16764976793944849, - 486770995368389, - 21888242871839275222246405745257275088548364400416034343698138067378027355079, - 47352627206610611, - 21888242871839275222246405745257275088548364400416034343698148706709929324224, - 21888242871839275222246405745257275088548364400416034343698178599919396997526, - 21888242871839275222246405745257275088548364400416034343698172418404654448787, - 62347283329494524, - 47371279402059741, - 21888242871839275222246405745257275088548364400416034343698186762616738691723, - 21888242871839275222246405745257275088548364400416034343698196200150089820508, - 32620976238901602, - 61271602107378293, - 64328080086502115, - 21888242871839275222246405745257275088548364400416034343698146040987194193936, - 21888242871839275222246405745257275088548364400416034343698140874887195011093, - 13933978725371327, - 23146668000298859, - 21888242871839275222246405745257275088548364400416034343698197060707025125257, - 21888242871839275222246405745257275088548364400416034343698132585130600170363, - 21888242871839275222246405745257275088548364400416034343698194276489231361495, - 37142866079111877, - 30492255242769082, - 49317500151335319, - 21888242871839275222246405745257275088548364400416034343698179419735604054654, - 39739742731616995, - 21888242871839275222246405745257275088548364400416034343698142788889518280337, - 21888242871839275222246405745257275088548364400416034343698203531870455924611, - 29863530247483742, - 14866871871165698, - 28078420067401661, - 66758299579244811, - 68507300505643987, - 21888242871839275222246405745257275088548364400416034343698166925994346463279, - 18710708140177227, - 21888242871839275222246405745257275088548364400416034343698151853032911394685, - 24463431417833723, - 52366396017495125, - 21888242871839275222246405745257275088548364400416034343698152086445376485748, - 21888242871839275222246405745257275088548364400416034343698193649201630332065, - 21888242871839275222246405745257275088548364400416034343698186643799355089116, - 21888242871839275222246405745257275088548364400416034343698181526796564526477, - 7838974035384587, - 21888242871839275222246405745257275088548364400416034343698147072920457013975, - 21888242871839275222246405745257275088548364400416034343698147805502024245385, - 34657824279207996, - 10095753383781142, - 58725896581249623, - 21888242871839275222246405745257275088548364400416034343698181050954768618503, - 436211327606270, - 21540846988063529, - 55700425019369892, - 21888242871839275222246405745257275088548364400416034343698179899522530629874, - 21888242871839275222246405745257275088548364400416034343698165275578436227801, - 21888242871839275222246405745257275088548364400416034343698167627400500917244, - 29158378910610673, - 21888242871839275222246405745257275088548364400416034343698171566702971664799, - 21888242871839275222246405745257275088548364400416034343698174285079330839122, - 16671831548088964, - 1454059713114042, - 21888242871839275222246405745257275088548364400416034343698174675182396621438, - 21888242871839275222246405745257275088548364400416034343698144496417927347559, - 8062397294627909, - 21888242871839275222246405745257275088548364400416034343698138953897486590328, - 61158176004531300, - 32449794526609204, - 21888242871839275222246405745257275088548364400416034343698183963569056369765, - 21888242871839275222246405745257275088548364400416034343698179433985802532888, - 29015523812723985, - 14918918365963037, - 58892740597067599, - 21888242871839275222246405745257275088548364400416034343698169646461564310386, - 8108160335806958, - 21888242871839275222246405745257275088548364400416034343698171733741359286724, - 21888242871839275222246405745257275088548364400416034343698177323014872699380, - 41479183054557860, - 28249184204688060, - 52023759861273570, - 21888242871839275222246405745257275088548364400416034343698155910720824410890, - 21888242871839275222246405745257275088548364400416034343698175606671751348275, - 21888242871839275222246405745257275088548364400416034343698132427767002720746, - 21888242871839275222246405745257275088548364400416034343698149950992007039134, - 34329983837889251, - 3390688422893094, - 63876243552533083, - 17670818450988844, - 21888242871839275222246405745257275088548364400416034343698173403840997838457, - 3260538717266019, - 21888242871839275222246405745257275088548364400416034343698149798153892874793, - 21888242871839275222246405745257275088548364400416034343698200763253543707132, - 61792658372416462, - 21888242871839275222246405745257275088548364400416034343698183445155298119843, - 29983104647311988, - 21888242871839275222246405745257275088548364400416034343698200628607225877581, - 21888242871839275222246405745257275088548364400416034343698167705775688005636, - 56591124314140137, - 23843095204204649, - 21888242871839275222246405745257275088548364400416034343698189051836196028223, - 21888242871839275222246405745257275088548364400416034343698201382377106739355, - 44230709789732873, - 25021409890837455, - 21888242871839275222246405745257275088548364400416034343698191131547201504985, - 67648727762365328, - 21888242871839275222246405745257275088548364400416034343698172559062336016155, - 3940216991941788, - 21888242871839275222246405745257275088548364400416034343698169195732979927233, - 21888242871839275222246405745257275088548364400416034343698193632855775778894, - 1351048248710036, - 21711818950274376, - 48912746566539311, - 21888242871839275222246405745257275088548364400416034343698191472798466207642, - 23624282616149070, - 21888242871839275222246405745257275088548364400416034343698203843985440400957, - 21888242871839275222246405745257275088548364400416034343698167108135806504403, - 44749933680081094, - 54785440095699072, - 21888242871839275222246405745257275088548364400416034343698170393847855706991, - 21888242871839275222246405745257275088548364400416034343698156371912193698595, - 29074111153908681, - 21888242871839275222246405745257275088548364400416034343698170571041443670188, - 504872687011661, - 21888242871839275222246405745257275088548364400416034343698153483337398759763, - 21888242871839275222246405745257275088548364400416034343698135480301715451575, - 21888242871839275222246405745257275088548364400416034343698155599803583495484, - 36886147463342201, - 21888242871839275222246405745257275088548364400416034343698148415131533536808, - 21888242871839275222246405745257275088548364400416034343698145995087375760059, - 21888242871839275222246405745257275088548364400416034343698172242877425263011, - 21888242871839275222246405745257275088548364400416034343698201184816127616822, - 10998820720518589, - 62233672300337412, - 21888242871839275222246405745257275088548364400416034343698151548899003078581, - 21888242871839275222246405745257275088548364400416034343698197386575417798512, - 27262357791994407, - 4916619234086628, - 21888242871839275222246405745257275088548364400416034343698201627538576307032, - 54335677739034707, - 21888242871839275222246405745257275088548364400416034343698173944707464240615, - 21888242871839275222246405745257275088548364400416034343698196797609488608904, - 15275306040049804, - 21888242871839275222246405745257275088548364400416034343698165230694885195751, - 21888242871839275222246405745257275088548364400416034343698157066985825425149, - 48570816504065091, - 53235817303365444, - 64297155733716059, - 32951062606173571, - 17712067594594797, - 21888242871839275222246405745257275088548364400416034343698197205447164746628, - 21888242871839275222246405745257275088548364400416034343698173953200541914047, - 21888242871839275222246405745257275088548364400416034343698198418759206275633, - 22888885816411207, - 69979158019058131, - 21888242871839275222246405745257275088548364400416034343698146433430390992017, - 60285244029758467, - 21888242871839275222246405745257275088548364400416034343698146379097407436244, - 40421049100800531, - 21888242871839275222246405745257275088548364400416034343698146552059526340575, - 4048194631320534, - 22177050364673424, - 21888242871839275222246405745257275088548364400416034343698181511698429399953, - 25874920000107610, - 21888242871839275222246405745257275088548364400416034343698202881666452167487, - 45181919111039114, - 21888242871839275222246405745257275088548364400416034343698170174708526931746, - 40529697232347848, - 21888242871839275222246405745257275088548364400416034343698139228407009583991, - 23717982056419695, - 46797601040984312, - 21888242871839275222246405745257275088548364400416034343698133646108931571914, - 45428088202199651, - 65762290941419096, - 21888242871839275222246405745257275088548364400416034343698150677429927384219, - 21888242871839275222246405745257275088548364400416034343698172363983046825535, - 56207657847478106, - 21888242871839275222246405745257275088548364400416034343698138042465290594684, - 21888242871839275222246405745257275088548364400416034343698141859620663879744, - 21888242871839275222246405745257275088548364400416034343698191059079106237661, - 21888242871839275222246405745257275088548364400416034343698143044000512967330, - 21888242871839275222246405745257275088548364400416034343698190292696545877489, - 21888242871839275222246405745257275088548364400416034343698172941379771753271, - 21888242871839275222246405745257275088548364400416034343698155495293079760317, - 43825339561138410, - 17234539796170768, - 6702912172138905, - 13157556343848977, - 17856052080484814, - 21888242871839275222246405745257275088548364400416034343698156017447125754610, - 21888242871839275222246405745257275088548364400416034343698186510831289674358, - 21888242871839275222246405745257275088548364400416034343698179858502988149507, - 21888242871839275222246405745257275088548364400416034343698183226041498895825, - 63786229438133028, - 52161278066255212, - 9300927863371954, - 21888242871839275222246405745257275088548364400416034343698203734841047573698, - 21888242871839275222246405745257275088548364400416034343698138993639320126833, - 21888242871839275222246405745257275088548364400416034343698162477277725466290, - 21888242871839275222246405745257275088548364400416034343698141507534272380715, - 54300638274048715, - 21888242871839275222246405745257275088548364400416034343698134864685762844200, - 27680994582151091, - 12915824534079322, - 55959366580709192, - 21888242871839275222246405745257275088548364400416034343698175705349937706756, - 6425305436100141, - 27019670010960570, - 21888242871839275222246405745257275088548364400416034343698195989698655564512, - 21888242871839275222246405745257275088548364400416034343698188674706675786626, - 66248320554223435, - 21888242871839275222246405745257275088548364400416034343698197303333138355623, - 54099460689092246, - 21888242871839275222246405745257275088548364400416034343698132497970945753372, - 21888242871839275222246405745257275088548364400416034343698132328090575204650, - 21888242871839275222246405745257275088548364400416034343698161642280343841296, - 61787558276296856, - 22548651230662346, - 10492350831704000, - 17421193566787033, - 21888242871839275222246405745257275088548364400416034343698136148536559487816, - 21888242871839275222246405745257275088548364400416034343698148978255681906905, - 21888242871839275222246405745257275088548364400416034343698146652968618430163, - 21888242871839275222246405745257275088548364400416034343698155615805063272726, - 15766920007266923, - 42090971913307357, - 21888242871839275222246405745257275088548364400416034343698172600860901932580, - 21888242871839275222246405745257275088548364400416034343698151555090082881873, - 21888242871839275222246405745257275088548364400416034343698196871935601408180, - 21888242871839275222246405745257275088548364400416034343698180098674056351901, - 21888242871839275222246405745257275088548364400416034343698197177767999895879, - 21888242871839275222246405745257275088548364400416034343698147261404286674768, - 64991459437185173, - 22553014584948827, - 21888242871839275222246405745257275088548364400416034343698164474634305478280, - 21888242871839275222246405745257275088548364400416034343698148402390644569734, - 10708801700242482, - 21888242871839275222246405745257275088548364400416034343698165315950022903917, - 51981268098280681, - 31651597402227694, - 21888242871839275222246405745257275088548364400416034343698172033929958182042, - 52551522206043285, - 40493676304262808, - 46127415116204016, - 31322084180145922, - 21888242871839275222246405745257275088548364400416034343698161357621092902869, - 21888242871839275222246405745257275088548364400416034343698154091096236159545, - 23646745164439460, - 39337734187424827, - 40397328798110217, - 21888242871839275222246405745257275088548364400416034343698192127669528961828, - 50224678000972072, - 18558117955003713, - 21888242871839275222246405745257275088548364400416034343698141222833532745167, - 930731547128101, - 12426920096723591, - 21888242871839275222246405745257275088548364400416034343698137959712694846799, - 21888242871839275222246405745257275088548364400416034343698160286783453508013, - 21888242871839275222246405745257275088548364400416034343698175570868523775845, - 21888242871839275222246405745257275088548364400416034343698164835123691161548, - 21544034250689477, - 65931557955963691, - 45608356077708093, - 31503485581624304, - 51582290274155315, - 35077034916027792, - 71788308939786164, - 35530812960370662, - 21888242871839275222246405745257275088548364400416034343698137017637252991590, - 21888242871839275222246405745257275088548364400416034343698166026976074078178, - 21888242871839275222246405745257275088548364400416034343698157131484554021152, - 21888242871839275222246405745257275088548364400416034343698148287321037458503, - 21888242871839275222246405745257275088548364400416034343698196709296552320423, - 69723935418309943, - 60477424762103406, - 21888242871839275222246405745257275088548364400416034343698146349345097564822, - 69481756712332169, - 11566623163331625, - 69683625297936464, - 21888242871839275222246405745257275088548364400416034343698141907807013667197, - 52399696627878805, - 8372949699886963, - 21888242871839275222246405745257275088548364400416034343698181180993659867114, - 38619037194935402, - 14339302121625694, - 23619655429059866, - 21888242871839275222246405745257275088548364400416034343698197996667677259863, - 43479713456316874, - 39782235671012608, - 21888242871839275222246405745257275088548364400416034343698178375396042110259, - 11625638915713238, - 21888242871839275222246405745257275088548364400416034343698196956647128473012, - 55097772713523422, - 68784734796600939, - 15835704013063282, - 58075541524742751, - 20188312152338996, - 65878256348458348, - 49404233876544595, - 21888242871839275222246405745257275088548364400416034343698184596639477955138, - 27465792760466285, - 55197916517874144, - 20053297140262989, - 44299348117986908, - 21888242871839275222246405745257275088548364400416034343698149594291272742070, - 60400657136038275, - 31565642929324300, - 21888242871839275222246405745257275088548364400416034343698191249153782812695, - 16916391822172602, - 21888242871839275222246405745257275088548364400416034343698200954417165843485, - 21888242871839275222246405745257275088548364400416034343698147925681145969871, - 21888242871839275222246405745257275088548364400416034343698138472038168579873, - 21888242871839275222246405745257275088548364400416034343698139802506118801010, - 29169013561935117, - 21888242871839275222246405745257275088548364400416034343698154977324754508915, - 21888242871839275222246405745257275088548364400416034343698164441492979460040, - 21888242871839275222246405745257275088548364400416034343698136626647409478306, - 59411433606679701, - 31729950153130335, - 48673630231931810, - 21888242871839275222246405745257275088548364400416034343698139269953401150561, - 21888242871839275222246405745257275088548364400416034343698147416946349897335, - 21888242871839275222246405745257275088548364400416034343698137263390076041055, - 21888242871839275222246405745257275088548364400416034343698177459657919601863, - 21888242871839275222246405745257275088548364400416034343698149824617411419437, - 62337715892555620, - 21888242871839275222246405745257275088548364400416034343698182706148586522174, - 21888242871839275222246405745257275088548364400416034343698150196490552423987, - 12459085073075645, - 21888242871839275222246405745257275088548364400416034343698143408892685826530, - 44198594331247544, - 21888242871839275222246405745257275088548364400416034343698167994031139136354, - 46097103775031889, - 38874260267503102, - 21888242871839275222246405745257275088548364400416034343698177273772180203434, - 21888242871839275222246405745257275088548364400416034343698168834645097463796, - 63657131337419990, - 21888242871839275222246405745257275088548364400416034343698154443156594255737, - 21888242871839275222246405745257275088548364400416034343698201566310958251437, - 25338954083034064, - 61498196152243884, - 12323528329361973, - 1294992438583404, - 2114928935043089, - 21888242871839275222246405745257275088548364400416034343698165747550769171328, - 48880883029258222, - 21888242871839275222246405745257275088548364400416034343698134379240448580758, - 35113260769541330, - 58377022180069721, - 5948302695206517, - 21888242871839275222246405745257275088548364400416034343698135303992918590103, - 21888242871839275222246405745257275088548364400416034343698163373792086776112, - 48947638905150466, - 38038313127264855, - 38074503162935122, - 21888242871839275222246405745257275088548364400416034343698184603878274034753, - 21888242871839275222246405745257275088548364400416034343698157241874284799405, - 22443650518428236, - 21888242871839275222246405745257275088548364400416034343698153939553588252383, - 35517503163067425, - 21888242871839275222246405745257275088548364400416034343698143101185202418590, - 21888242871839275222246405745257275088548364400416034343698196807293727238825, - 21888242871839275222246405745257275088548364400416034343698197972943663371472, - 50936361917093470, - 21516485666600072, - 21888242871839275222246405745257275088548364400416034343698191592896365647879, - 21888242871839275222246405745257275088548364400416034343698175333966906342871, - 21888242871839275222246405745257275088548364400416034343698179205888967200207, - 50456337447687610, - 43633328692405747, - 57278821807100199, - 28991621068717525, - 21888242871839275222246405745257275088548364400416034343698145560792938082497, - 21888242871839275222246405745257275088548364400416034343698201800704584140524, - 21888242871839275222246405745257275088548364400416034343698150581813300357543, - 18370954775287272, - 5867814094638648, - 21888242871839275222246405745257275088548364400416034343698183006500721503477, - 21888242871839275222246405745257275088548364400416034343698172263252517075656, - 21888242871839275222246405745257275088548364400416034343698192286824664160374, - 66719956196633807, - 54264937990219395, - 69440225193428722, - 21888242871839275222246405745257275088548364400416034343698171631942503518901, - 21888242871839275222246405745257275088548364400416034343698143181780326994538, - 45540191290035519, - 21888242871839275222246405745257275088548364400416034343698171699838727047492, - 21888242871839275222246405745257275088548364400416034343698135413481670181072, - 21888242871839275222246405745257275088548364400416034343698187985650598383115, - 39610444597790073, - 21888242871839275222246405745257275088548364400416034343698147055447298167372, - 21888242871839275222246405745257275088548364400416034343698196033622260852332, - 21888242871839275222246405745257275088548364400416034343698177826388727060247, - 24029864857631224, - 21888242871839275222246405745257275088548364400416034343698171893582802637197, - 21888242871839275222246405745257275088548364400416034343698132189088857003785, - 53909940774930867, - 21888242871839275222246405745257275088548364400416034343698168053657440826589, - 21888242871839275222246405745257275088548364400416034343698176259743304635837, - 8522548846504141, - 21888242871839275222246405745257275088548364400416034343698163989804573476053, - 8292903130344890, - 21888242871839275222246405745257275088548364400416034343698174523842906426329, - 14317872399238587, - 21888242871839275222246405745257275088548364400416034343698182780309882262869, - 26345413967338801, - 21888242871839275222246405745257275088548364400416034343698135063421737524585, - 62056129452035531, - 29063579141065748, - 21888242871839275222246405745257275088548364400416034343698140988919627545634, - 68547480299444904, - 33549141158096298, - 21888242871839275222246405745257275088548364400416034343698147981334220891403, - 52195132237351080, - 70819051015558607, - 21888242871839275222246405745257275088548364400416034343698151771608140257959, - 21888242871839275222246405745257275088548364400416034343698204180033344930045, - 21888242871839275222246405745257275088548364400416034343698201337665099243600, - 21888242871839275222246405745257275088548364400416034343698192774716504162385, - 50312475835775877, - 48287218889756257, - 21888242871839275222246405745257275088548364400416034343698189581071753923593, - 21888242871839275222246405745257275088548364400416034343698153008913225720045, - 30779941238320513, - 21888242871839275222246405745257275088548364400416034343698152255079985734769, - 21888242871839275222246405745257275088548364400416034343698134737149026226664, - 48010903632105566, - 68312243788331311, - 21888242871839275222246405745257275088548364400416034343698156409490903911777, - 21888242871839275222246405745257275088548364400416034343698137660017860919529, - 21888242871839275222246405745257275088548364400416034343698165527831710515180, - 48894199037196281, - 21888242871839275222246405745257275088548364400416034343698190718231156407298, - 21888242871839275222246405745257275088548364400416034343698195257144857618643, - 6232150385558575, - 50095403683765665, - 15592259815495366, - 21888242871839275222246405745257275088548364400416034343698143308862063116540, - 21888242871839275222246405745257275088548364400416034343698142294203499631147, - 21888242871839275222246405745257275088548364400416034343698144397431162698524, - 13931989821477212, - 21888242871839275222246405745257275088548364400416034343698157132226956691037, - 21402479306869934, - 21888242871839275222246405745257275088548364400416034343698173445560769115246, - 21104814868568301, - 21888242871839275222246405745257275088548364400416034343698194203108229146868, - 21888242871839275222246405745257275088548364400416034343698201262954135660905, - 61286880357812043, - 21888242871839275222246405745257275088548364400416034343698140119001274393802, - 23337507486512754, - 50248762553657211, - 21888242871839275222246405745257275088548364400416034343698175218996746695502, - 32958012861504009, - 55190638632520520, - 21888242871839275222246405745257275088548364400416034343698178592173960838300, - 21888242871839275222246405745257275088548364400416034343698139760328386472315, - 21888242871839275222246405745257275088548364400416034343698160530354620748660, - 21888242871839275222246405745257275088548364400416034343698185641927202453731, - 21888242871839275222246405745257275088548364400416034343698135801476196512755, - 21888242871839275222246405745257275088548364400416034343698136132675571028745, - 21888242871839275222246405745257275088548364400416034343698198107133296621074, - 71589824737865154, - 1469363974734504, - 21888242871839275222246405745257275088548364400416034343698196014366237440720, - 21888242871839275222246405745257275088548364400416034343698202194617241404680, - 31334629966003013, - 21888242871839275222246405745257275088548364400416034343698168638827359728621, - 43993266523634848, - 56910601422483413, - 2358987273215218, - 21888242871839275222246405745257275088548364400416034343698158797419451708162, - 3573339128303802, - 69843720603175605, - 31419428985274380, - 21888242871839275222246405745257275088548364400416034343698171574604664120635, - 21888242871839275222246405745257275088548364400416034343698186572932537824746, - 21888242871839275222246405745257275088548364400416034343698192296176965197977, - 21888242871839275222246405745257275088548364400416034343698132814439091214021, - 10999834365772682, - 23315859632122331, - 21888242871839275222246405745257275088548364400416034343698132912331619296711, - 13566748031117867, - 21888242871839275222246405745257275088548364400416034343698178759675154527827, - 63821592538906638, - 45835896259329875, - 20296244018696141, - 21888242871839275222246405745257275088548364400416034343698184618837109605820, - 36535939046150752, - 21888242871839275222246405745257275088548364400416034343698157745510311849623, - 66940208940129354, - 41043683631237214, - 61558917722616589, - 70324675528349061, - 21888242871839275222246405745257275088548364400416034343698190886099451153399, - 21888242871839275222246405745257275088548364400416034343698181420787000888055, - 21888242871839275222246405745257275088548364400416034343698153599515141881239, - 21888242871839275222246405745257275088548364400416034343698191149848172412687, - 21888242871839275222246405745257275088548364400416034343698183057529135341979, - 19310251928341106, - 21888242871839275222246405745257275088548364400416034343698200090318978539004, - 70710367456071577, - 12060085647823999, - 21888242871839275222246405745257275088548364400416034343698181878603381517367, - 21888242871839275222246405745257275088548364400416034343698157071175732213359, - 21888242871839275222246405745257275088548364400416034343698149369814264695029, - 21888242871839275222246405745257275088548364400416034343698158411281246732452, - 36952874839051867, - 21888242871839275222246405745257275088548364400416034343698201085673895508380, - 46633338948258501, - 19430771170040558, - 21888242871839275222246405745257275088548364400416034343698173036564515073410, - 21888242871839275222246405745257275088548364400416034343698149816430596908826, - 7015200498202642, - 21888242871839275222246405745257275088548364400416034343698189594758715700167, - 38209430302771203, - 21888242871839275222246405745257275088548364400416034343698158340599821165410, - 14273787147189819, - 21888242871839275222246405745257275088548364400416034343698166899302252957803, - 42172291599312153, - 21888242871839275222246405745257275088548364400416034343698176156346683876549, - 60410522454951750, - 21888242871839275222246405745257275088548364400416034343698139327957852660834, - 21888242871839275222246405745257275088548364400416034343698188929127035748548, - 21888242871839275222246405745257275088548364400416034343698146972512465169463, - 19527562568681182, - 62138908860675852, - 21888242871839275222246405745257275088548364400416034343698134510309559458300, - 3355386590957781, - 33887119521753048, - 36012254333507527, - 21888242871839275222246405745257275088548364400416034343698149561910991253167, - 21888242871839275222246405745257275088548364400416034343698181723766233328684, - 21888242871839275222246405745257275088548364400416034343698164611329830128777, - 6256553417432972, - 70204807116782069, - 21888242871839275222246405745257275088548364400416034343698152869210716525908, - 40807069661114760, - 15044320924222186, - 49517111636751386, - 21888242871839275222246405745257275088548364400416034343698188476098794586165, - 21888242871839275222246405745257275088548364400416034343698195175738381560189, - 8716271812182362, - 21888242871839275222246405745257275088548364400416034343698136106559660300787, - 36571477207852432, - 32821830267621516, - 61949727660560316, - 21888242871839275222246405745257275088548364400416034343698143224463370687672, - 21888242871839275222246405745257275088548364400416034343698185331653851904268, - 47430393238885072, - 53802480295981097, - 21888242871839275222246405745257275088548364400416034343698149971610862318586, - 21888242871839275222246405745257275088548364400416034343698159358663788605886, - 15670773604671329, - 29382699704597275, - 21888242871839275222246405745257275088548364400416034343698153990570954784868, - 21888242871839275222246405745257275088548364400416034343698194687877965057831, - 17227355474150652, - 7298635882007460, - 69210361140107046, - 5676927043859403, - 67561681813354528, - 21888242871839275222246405745257275088548364400416034343698155378501752065026, - 17345490746644748, - 21888242871839275222246405745257275088548364400416034343698146038723492727552, - 21888242871839275222246405745257275088548364400416034343698183236658114811925, - 21888242871839275222246405745257275088548364400416034343698162870621578141277, - 16829169994939884, - 21888242871839275222246405745257275088548364400416034343698186149309815517172, - 21888242871839275222246405745257275088548364400416034343698174149767460785586, - 21888242871839275222246405745257275088548364400416034343698164492572175203606, - 21888242871839275222246405745257275088548364400416034343698178701425143305022, - 21888242871839275222246405745257275088548364400416034343698132214171368061547, - 21888242871839275222246405745257275088548364400416034343698185547893733608623, - 23216002769847061, - 21888242871839275222246405745257275088548364400416034343698199238490722687172, - 12499027729427958, - 21888242871839275222246405745257275088548364400416034343698194895528171232056, - 21913498652415876, - 21888242871839275222246405745257275088548364400416034343698132918703015297130, - 21888242871839275222246405745257275088548364400416034343698189585322913562898, - 27517207622681488, - 21755565794203892, - 21888242871839275222246405745257275088548364400416034343698187778524373813138, - 57303841392653169, - 71396660553013324, - 26375224667614770, - 55240975935508165, - 51746139626018922, - 21888242871839275222246405745257275088548364400416034343698191334229294257892, - 46357201589783201, - 21888242871839275222246405745257275088548364400416034343698181392518519826340, - 21888242871839275222246405745257275088548364400416034343698182423901932989904, - 29537818124400418, - 56364663231098950, - 37152498566965093, - 33176093857735987, - 21888242871839275222246405745257275088548364400416034343698174774723405600026, - 21888242871839275222246405745257275088548364400416034343698162470763118473026, - 17039079592383600, - 29318834042756119, - 21888242871839275222246405745257275088548364400416034343698164074673611073423, - 21888242871839275222246405745257275088548364400416034343698201555420469713056, - 21888242871839275222246405745257275088548364400416034343698161847355983402663, - 41503933821271464, - 21888242871839275222246405745257275088548364400416034343698139575097947409001, - 21888242871839275222246405745257275088548364400416034343698195503309086801201, - 71454088241185897, - 44491850240356187, - 21888242871839275222246405745257275088548364400416034343698177991996111218772, - 13893945243533974, - 42757312787971027, - 14927063954514038, - 61828243698509340, - 56903492693843720, - 29766622817300313, - 29367954315683610, - 21888242871839275222246405745257275088548364400416034343698169810714559707269, - 21888242871839275222246405745257275088548364400416034343698168223130377864400, - 21888242871839275222246405745257275088548364400416034343698182169642741654730, - 21888242871839275222246405745257275088548364400416034343698192292415776334096, - 21888242871839275222246405745257275088548364400416034343698184983651570262569, - 40592958686232112, - 21888242871839275222246405745257275088548364400416034343698133259353478539023, - 50474400543427620, - 21888242871839275222246405745257275088548364400416034343698189856467800188610, - 62741290789219979, - 38024412107052748, - 21888242871839275222246405745257275088548364400416034343698192090836420305856, - 20500422209534565, - 39008319169001595, - 31511958320400761, - 63391125522047290, - 68618273750410350, - 55055301624806549, - 21888242871839275222246405745257275088548364400416034343698152452481625356691, - 58487907670704069, - 21888242871839275222246405745257275088548364400416034343698135091272026302641, - 14989742236343202, - 21888242871839275222246405745257275088548364400416034343698201272025222754929, - 11853756918253789, - 65175373568447639, - 33580102446450370, - 21888242871839275222246405745257275088548364400416034343698142927215341161715, - 21888242871839275222246405745257275088548364400416034343698150540313268579536, - 21888242871839275222246405745257275088548364400416034343698139486678257559792, - 2748142374149915, - 21888242871839275222246405745257275088548364400416034343698169857286013749164, - 21888242871839275222246405745257275088548364400416034343698179238222187424612, - 1116414584700405, - 21888242871839275222246405745257275088548364400416034343698136835359645411217, - 21888242871839275222246405745257275088548364400416034343698204017349247108137, - 21888242871839275222246405745257275088548364400416034343698170103819869684466, - 21888242871839275222246405745257275088548364400416034343698203938718682139315, - 21888242871839275222246405745257275088548364400416034343698172723709362290573, - 8196827692773987, - 62011077169564509, - 30445779843015686, - 21888242871839275222246405745257275088548364400416034343698156809650304196088, - 21888242871839275222246405745257275088548364400416034343698181234972776838961, - 70358722618263255, - 47899972170558952, - 21888242871839275222246405745257275088548364400416034343698138561662420987406, - 69945348771223426, - 47335900860040227, - 5039617749242855, - 44495478333739825, - 21888242871839275222246405745257275088548364400416034343698187016255188175176, - 18902983044433241, - 21888242871839275222246405745257275088548364400416034343698201348913338754137, - 21888242871839275222246405745257275088548364400416034343698174731561411423579, - 21888242871839275222246405745257275088548364400416034343698172275148237563904, - 21888242871839275222246405745257275088548364400416034343698182486440303000928, - 36336535254020161, - 1634366803218400, - 21888242871839275222246405745257275088548364400416034343698180652027245099836, - 21888242871839275222246405745257275088548364400416034343698168054772577226578, - 7557619126780861, - 61392650708629301, - 41683945717742449, - 63234491710036474, - 51018117477022210, - 21888242871839275222246405745257275088548364400416034343698200951368899832698, - 40739716851988055, - 21888242871839275222246405745257275088548364400416034343698178556605447970640, - 21888242871839275222246405745257275088548364400416034343698182933812444317846, - 21888242871839275222246405745257275088548364400416034343698160739411525290495, - 21888242871839275222246405745257275088548364400416034343698151135529667277746, - 56778786599176001, - 40716160772238243, - 21888242871839275222246405745257275088548364400416034343698160553749624951808, - 42217755889664125, - 32858413109120761, - 21888242871839275222246405745257275088548364400416034343698148569268368450248, - 21888242871839275222246405745257275088548364400416034343698154769920620059862, - 67017607930800305, - 21888242871839275222246405745257275088548364400416034343698171249973782241573, - 21888242871839275222246405745257275088548364400416034343698185146813342688270, - 22446314647645934, - 47653601046479540, - 21888242871839275222246405745257275088548364400416034343698149292677943710941, - 21888242871839275222246405745257275088548364400416034343698169575376290452520, - 21888242871839275222246405745257275088548364400416034343698132983386074206061, - 21888242871839275222246405745257275088548364400416034343698188948348453862125, - 21888242871839275222246405745257275088548364400416034343698159318948381484789, - 51702921128274492, - 21888242871839275222246405745257275088548364400416034343698178906907523556645, - 21888242871839275222246405745257275088548364400416034343698165138662587962384, - 21888242871839275222246405745257275088548364400416034343698186926962657186842, - 21888242871839275222246405745257275088548364400416034343698145533621630586546, - 21888242871839275222246405745257275088548364400416034343698165666204051570074, - 59421785273626851, - 1661267754541365, - 21888242871839275222246405745257275088548364400416034343698172097340653060978, - 21888242871839275222246405745257275088548364400416034343698163396842680924599, - 21888242871839275222246405745257275088548364400416034343698185799941280121159, - 57825546358844969, - 69026759441776915, - 71889497767266563, - 21888242871839275222246405745257275088548364400416034343698185034399774394412, - 21888242871839275222246405745257275088548364400416034343698202919380635770184, - 59075678040784503, - 8018391365677737, - 21888242871839275222246405745257275088548364400416034343698181240646454523507, - 21888242871839275222246405745257275088548364400416034343698144402001088212322, - 2000311812116037, - 21888242871839275222246405745257275088548364400416034343698203578928387168435, - 52024319679005884, - 1471927215257992, - 21888242871839275222246405745257275088548364400416034343698158780042084728061, - 21888242871839275222246405745257275088548364400416034343698149984265361431346, - 21888242871839275222246405745257275088548364400416034343698189483017264626512, - 21888242871839275222246405745257275088548364400416034343698182024585712544043, - 21888242871839275222246405745257275088548364400416034343698158786712961529940, - 28130829012836677, - 21888242871839275222246405745257275088548364400416034343698141013030008880293, - 21888242871839275222246405745257275088548364400416034343698133570911009773747, - 21888242871839275222246405745257275088548364400416034343698166797891152550829, - 21888242871839275222246405745257275088548364400416034343698135949409738629760, - 57880720469835788, - 21888242871839275222246405745257275088548364400416034343698179659711954411552, - 21888242871839275222246405745257275088548364400416034343698140001696995942143, - 57751886350889174, - 42602195265412019, - 21888242871839275222246405745257275088548364400416034343698197395884060813698, - 21888242871839275222246405745257275088548364400416034343698140247744782715122, - 21888242871839275222246405745257275088548364400416034343698185852310434960825, - 21888242871839275222246405745257275088548364400416034343698175611478715655166, - 24626341596157473, - 71409311799562229, - 21888242871839275222246405745257275088548364400416034343698148482993984291794, - 16847132305717579, - 21888242871839275222246405745257275088548364400416034343698182518617005613474, - 1317803296616781, - 21888242871839275222246405745257275088548364400416034343698152431069736532390, - 53338446180720469, - 8815484128766434, - 17302013175000777, - 21888242871839275222246405745257275088548364400416034343698171710420721588633, - 7029945455244556, - 4781565099190883, - 21888242871839275222246405745257275088548364400416034343698201147919630048568, - 21888242871839275222246405745257275088548364400416034343698141196699822087510, - 21888242871839275222246405745257275088548364400416034343698137395775936389011, - 21888242871839275222246405745257275088548364400416034343698197710910893257683, - 21888242871839275222246405745257275088548364400416034343698137544901208726227, - 21888242871839275222246405745257275088548364400416034343698150411325136303108, - 53204725624172125, - 21888242871839275222246405745257275088548364400416034343698162698606680177921, - 21888242871839275222246405745257275088548364400416034343698202067391542135131, - 21888242871839275222246405745257275088548364400416034343698142517217118305563, - 45121011955405131, - 71868007344523355, - 55354158563100778, - 33849226897198015, - 28523901480507104, - 62437098290978203, - 25849260739476150, - 21888242871839275222246405745257275088548364400416034343698182751806437551699, - 21888242871839275222246405745257275088548364400416034343698175834961561740455, - 58323526145136474, - 21888242871839275222246405745257275088548364400416034343698148183226684447951, - 21888242871839275222246405745257275088548364400416034343698134190775984736741, - 21888242871839275222246405745257275088548364400416034343698190448974867990196, - 54282482568914475, - 21888242871839275222246405745257275088548364400416034343698133167711442618483, - 63822735824675014, - 21888242871839275222246405745257275088548364400416034343698160338525970118562, - 58718055569953649, - 33412565337014531, - 70673989433945056, - 63608656117355386, - 21888242871839275222246405745257275088548364400416034343698140412804426860933, - 21888242871839275222246405745257275088548364400416034343698135313385367131841, - 26671596575896896, - 21888242871839275222246405745257275088548364400416034343698139958986298517921, - 6052093933838970, - 25057878567273520, - 32265283842337322, - 21888242871839275222246405745257275088548364400416034343698193221703402195785, - 71891968554871971, - 23530997183946235, - 209562315205395, - 60630387177689895, - 32232028807570939, - 12196951406796244, - 51759619136801024, - 40695368154464221, - 30529491983013229, - 21888242871839275222246405745257275088548364400416034343698148886120499263180, - 14512898340265305, - 21888242871839275222246405745257275088548364400416034343698143149766589310701, - 21888242871839275222246405745257275088548364400416034343698185179214320354596, - 21888242871839275222246405745257275088548364400416034343698137773078825867324, - 21888242871839275222246405745257275088548364400416034343698200709670827916700, - 21888242871839275222246405745257275088548364400416034343698133504044071065277, - 37624507829056117, - 21888242871839275222246405745257275088548364400416034343698164375683777547651, - 21888242871839275222246405745257275088548364400416034343698178751274925118887, - 41052955969829757, - 68090845653896314, - 56544185067078590, - 35877971542593847, - 54698909996253935, - 21888242871839275222246405745257275088548364400416034343698162885825115199849, - 21888242871839275222246405745257275088548364400416034343698194653328894748889, - 21888242871839275222246405745257275088548364400416034343698168519181901184668, - 21888242871839275222246405745257275088548364400416034343698184554850292891049, - 30256544167175764, - 21888242871839275222246405745257275088548364400416034343698200011883423925835, - 70523221590347158, - 21888242871839275222246405745257275088548364400416034343698183373119652083064, - 21888242871839275222246405745257275088548364400416034343698192409832943273757, - 21888242871839275222246405745257275088548364400416034343698138155609191781137, - 21888242871839275222246405745257275088548364400416034343698146600609491139867, - 49679496092985078, - 24361858738091790, - 21888242871839275222246405745257275088548364400416034343698184497994671054662, - 34414561901425035, - 21888242871839275222246405745257275088548364400416034343698136773241451447364, - 21888242871839275222246405745257275088548364400416034343698170244305718763637, - 37112597895098420, - 21888242871839275222246405745257275088548364400416034343698154460957286119571, - 21888242871839275222246405745257275088548364400416034343698196032780869065616, - 45278924485493536, - 21888242871839275222246405745257275088548364400416034343698191253972826832086, - 48056565341098943, - 40904576662419440, - 31819595271611111, - 21888242871839275222246405745257275088548364400416034343698199598948266827557, - 49346169401125318, - 21888242871839275222246405745257275088548364400416034343698133621859781425503, - 21888242871839275222246405745257275088548364400416034343698152328721168949201, - 21888242871839275222246405745257275088548364400416034343698169988565064354029, - 8564008040206530, - 21888242871839275222246405745257275088548364400416034343698134611332051743501, - 50149101344249146, - 44489338005878820, - 26783796310572862, - 1598118365932114, - 21888242871839275222246405745257275088548364400416034343698140190701135089902, - 21888242871839275222246405745257275088548364400416034343698168889124862330482, - 21888242871839275222246405745257275088548364400416034343698165779736857917400, - 2044553162348058, - 21888242871839275222246405745257275088548364400416034343698178031674012666066, - 63461331302675169, - 21888242871839275222246405745257275088548364400416034343698144137246030264759, - 34201514060569550, - 65793476706672553, - 21888242871839275222246405745257275088548364400416034343698185762271467263955, - 50281575652352453, - 21888242871839275222246405745257275088548364400416034343698146114397521927070, - 63706529122956115, - 21888242871839275222246405745257275088548364400416034343698201503730626317891, - 21888242871839275222246405745257275088548364400416034343698182189298642975009, - 21888242871839275222246405745257275088548364400416034343698174110297665561866, - 21888242871839275222246405745257275088548364400416034343698185222109911282649, - 41329821632393888, - 21888242871839275222246405745257275088548364400416034343698136512556067846359, - 21888242871839275222246405745257275088548364400416034343698170203505089668388, - 18661898638295606, - 21888242871839275222246405745257275088548364400416034343698198116507427636953, - 54857664760307221, - 50840762047113096, - 21888242871839275222246405745257275088548364400416034343698145358905168056950, - 21888242871839275222246405745257275088548364400416034343698187076316734711488, - 21888242871839275222246405745257275088548364400416034343698158021022017810651, - 38456914543286903, - 29555742490225679, - 65659986954339464, - 21888242871839275222246405745257275088548364400416034343698154940144357999827, - 45335328452084989, - 21888242871839275222246405745257275088548364400416034343698158644433799956806, - 14856476799679172, - 21888242871839275222246405745257275088548364400416034343698142732582340571346, - 21888242871839275222246405745257275088548364400416034343698200151435375164036, - 37153818922685651, - 21888242871839275222246405745257275088548364400416034343698144440763950071978, - 21888242871839275222246405745257275088548364400416034343698177949234005413764, - 7217468106071198, - 70687983661427515, - 21888242871839275222246405745257275088548364400416034343698197723090909977094, - 21888242871839275222246405745257275088548364400416034343698195890732602697548, - 21888242871839275222246405745257275088548364400416034343698161842462284287494, - 58456121742710837, - 21888242871839275222246405745257275088548364400416034343698204061711154219595, - 17448113701605559, - 33629413340882029, - 38427164624468015, - 21888242871839275222246405745257275088548364400416034343698159155463871499907, - 21888242871839275222246405745257275088548364400416034343698153784886729638384, - 71830821141408610, - 44689627156299851, - 5121604993749036, - 17866328546656090, - 21888242871839275222246405745257275088548364400416034343698193286351858093039, - 21888242871839275222246405745257275088548364400416034343698161989149987607351, - 21888242871839275222246405745257275088548364400416034343698198800537302897400, - 22949550252649102, - 21888242871839275222246405745257275088548364400416034343698184225013392282437, - 3922955560723736, - 21888242871839275222246405745257275088548364400416034343698201840546173827915, - 59400775889745642, - 32620794360411767, - 53860432903110602, - 66495414761528492, - 63462444619061875, - 21888242871839275222246405745257275088548364400416034343698182326032474956746, - 21652136872742476, - 21888242871839275222246405745257275088548364400416034343698199616158269314495, - 41829083446239057, - 21888242871839275222246405745257275088548364400416034343698161842135032150747, - 21888242871839275222246405745257275088548364400416034343698176852368974252463, - 5912440683261921, - 21888242871839275222246405745257275088548364400416034343698143541956207409439, - 21888242871839275222246405745257275088548364400416034343698183971341939811669, - 16357595429231336, - 56286559674785791, - 21888242871839275222246405745257275088548364400416034343698146122711954188901, - 21888242871839275222246405745257275088548364400416034343698172620810543572880, - 21888242871839275222246405745257275088548364400416034343698162131663174880900, - 21888242871839275222246405745257275088548364400416034343698199003885052502344, - 19775693914050191, - 31937928345564655, - 20665647114689404, - 21888242871839275222246405745257275088548364400416034343698147214818867077117, - 40695750323530437, - 53331260226324495, - 21888242871839275222246405745257275088548364400416034343698194581426863501572, - 64819405708331947, - 21888242871839275222246405745257275088548364400416034343698189490141439305264, - 22073035700461334, - 39242095658112986, - 42136501892347104, - 21888242871839275222246405745257275088548364400416034343698181997527650450960, - 21888242871839275222246405745257275088548364400416034343698135715183798443472, - 48159663981540648, - 3187071568713253, - 21888242871839275222246405745257275088548364400416034343698165841989806797876, - 4786338602378667, - 57011178306819615, - 21888242871839275222246405745257275088548364400416034343698197031356303996542, - 21888242871839275222246405745257275088548364400416034343698194947189238056207, - 71017754327468768, - 68983385560603620, - 21888242871839275222246405745257275088548364400416034343698139215721813309394, - 21699006105097139, - 62991224508662193, - 21888242871839275222246405745257275088548364400416034343698167961480821573357, - 4537886221772170, - 37735727450187898, - 39039646657729851, - 21888242871839275222246405745257275088548364400416034343698186046812144351461, - 38325815961692660, - 21888242871839275222246405745257275088548364400416034343698184151608560760894, - 67134040566083963, - 40107573585585182, - 57479811339692628, - 43501622157429420, - 34927772900619309, - 49527412776267983, - 28424510648036321, - 2481836174765113, - 21888242871839275222246405745257275088548364400416034343698176563352755095500, - 21888242871839275222246405745257275088548364400416034343698162351542368725906, - 36950591594685429, - 16444704568566855, - 26120363078632927, - 53607277362233162, - 21888242871839275222246405745257275088548364400416034343698139114766414327023, - 21888242871839275222246405745257275088548364400416034343698141153194097336301, - 21888242871839275222246405745257275088548364400416034343698132910129992767062, - 14800437951326876, - 21888242871839275222246405745257275088548364400416034343698192862600188802210, - 21888242871839275222246405745257275088548364400416034343698187843215226247088, - 21888242871839275222246405745257275088548364400416034343698199998475735350921, - 14857767588793532, - 61521731342894870, - 33557414567546706, - 47785047990996310, - 19483302165253683, - 18889550634367257, - 68472891632070609, - 21888242871839275222246405745257275088548364400416034343698163599887236003430, - 64924959501600577, - 21888242871839275222246405745257275088548364400416034343698140139882953599570, - 21888242871839275222246405745257275088548364400416034343698160155490249004748, - 21888242871839275222246405745257275088548364400416034343698165637266948897010, - 21888242871839275222246405745257275088548364400416034343698134287260957467404, - 21888242871839275222246405745257275088548364400416034343698136870413067429759, - 49717169900459435, - 21888242871839275222246405745257275088548364400416034343698194154960704909472, - 21888242871839275222246405745257275088548364400416034343698142102194630561563, - 21888242871839275222246405745257275088548364400416034343698178682841346883543, - 21888242871839275222246405745257275088548364400416034343698173702854260115472, - 50090773089897719, - 29118827578646506, - 21888242871839275222246405745257275088548364400416034343698137667200871422827, - 51047893893599251, - 21888242871839275222246405745257275088548364400416034343698182048148925192559, - 21888242871839275222246405745257275088548364400416034343698153282534675116337, - 62799449017805118, - 37413351564753688, - 16901630418188291, - 6398907639679729, - 34099422035186815, - 22775816646646487, - 21888242871839275222246405745257275088548364400416034343698199724284805399813, - 59477497556289164, - 9996882515751784, - 44716371798598680, - 21888242871839275222246405745257275088548364400416034343698160815063506172008, - 50313179738445606, - 21888242871839275222246405745257275088548364400416034343698176966111393635391, - 66874230134275140, - 21888242871839275222246405745257275088548364400416034343698186072099989319450, - 21888242871839275222246405745257275088548364400416034343698164349428069620139, - 21888242871839275222246405745257275088548364400416034343698168695979113666291, - 21888242871839275222246405745257275088548364400416034343698149157257182884172, - 49487942536030616, - 21888242871839275222246405745257275088548364400416034343698174057917596305558, - 59815054288854403, - 62292443314015881, - 21888242871839275222246405745257275088548364400416034343698152375609421993461, - 21888242871839275222246405745257275088548364400416034343698179258921970815920, - 21888242871839275222246405745257275088548364400416034343698136606593350603803, - 21888242871839275222246405745257275088548364400416034343698173358547652818042, - 21888242871839275222246405745257275088548364400416034343698169427069074644195, - 21888242871839275222246405745257275088548364400416034343698175970036570918613, - 35634474974758526, - 21888242871839275222246405745257275088548364400416034343698137033910387239024, - 28114278162047098, - 21888242871839275222246405745257275088548364400416034343698139830187855155731, - 21779025427045481, - 35321088984247261, - 42907363440883784, - 13029667309451605, - 57532956705869535, - 21888242871839275222246405745257275088548364400416034343698184163212394242772, - 21888242871839275222246405745257275088548364400416034343698184616003339156361, - 21888242871839275222246405745257275088548364400416034343698161528270480938698, - 65731530749701205, - 21888242871839275222246405745257275088548364400416034343698188968609234183499, - 21888242871839275222246405745257275088548364400416034343698147675697507240192, - 21888242871839275222246405745257275088548364400416034343698137317704005708098, - 33386319616629618, - 55874465724763290, - 21888242871839275222246405745257275088548364400416034343698188143179081296814, - 21957526805697146, - 21888242871839275222246405745257275088548364400416034343698197998589982404866, - 21888242871839275222246405745257275088548364400416034343698153425199251393335, - 68630805044842243, - 21888242871839275222246405745257275088548364400416034343698138000253019480701, - 7943059616270213, - 21888242871839275222246405745257275088548364400416034343698136438820996470430, - 21888242871839275222246405745257275088548364400416034343698160278738960471732, - 59040181493823083, - 21888242871839275222246405745257275088548364400416034343698174741798867542170, - 21888242871839275222246405745257275088548364400416034343698158165765177859393, - 22866117096124612, - 21888242871839275222246405745257275088548364400416034343698150498500158099689, - 21888242871839275222246405745257275088548364400416034343698167147808887835224, - 39903024029059434, - 3084412521774527, - 21888242871839275222246405745257275088548364400416034343698134035913592095373, - 21888242871839275222246405745257275088548364400416034343698197606086302571386, - 21888242871839275222246405745257275088548364400416034343698162787039522963554, - 21373479318820688, - 21888242871839275222246405745257275088548364400416034343698188411679052838182, - 69767197574475673, - 6811200150038963, - 46589450234203043, - 71112654961781006, - 21888242871839275222246405745257275088548364400416034343698153700299184718197, - 21888242871839275222246405745257275088548364400416034343698154042478493128468, - 21888242871839275222246405745257275088548364400416034343698153261351586170513, - 25747317118710162, - 30680726218459524, - 21888242871839275222246405745257275088548364400416034343698163472014063330444, - 36145303662174063, - 21888242871839275222246405745257275088548364400416034343698177809266130976421, - 21888242871839275222246405745257275088548364400416034343698149555638202495741, - 70351419573102969, - 48455653302646472, - 43860069168236278, - 21888242871839275222246405745257275088548364400416034343698139040080584417749, - 21888242871839275222246405745257275088548364400416034343698171508787017006678, - 21888242871839275222246405745257275088548364400416034343698135464367690534706, - 72038522878313250, - 21888242871839275222246405745257275088548364400416034343698134702054165452607, - 21888242871839275222246405745257275088548364400416034343698201688212176530256, - 47843711207930654, - 48851747383076621, - 61665524209355625, - 21888242871839275222246405745257275088548364400416034343698178966583375460991, - 21888242871839275222246405745257275088548364400416034343698173201432215394476, - 7810091985926540, - 14155865888358888, - 71484531552005597, - 21888242871839275222246405745257275088548364400416034343698190877381912244901, - 21888242871839275222246405745257275088548364400416034343698136800183621792386, - 61150048602903218, - 8978139785158373, - 68147263540022678, - 40864442049969652, - 21888242871839275222246405745257275088548364400416034343698174126604430398968, - 21888242871839275222246405745257275088548364400416034343698197430929661210331, - 21888242871839275222246405745257275088548364400416034343698184301053748882689, - 7348281695559840, - 21888242871839275222246405745257275088548364400416034343698153517200013556170, - 41047000099227721, - 20194477823465267, - 21888242871839275222246405745257275088548364400416034343698134652883962605469, - 42959255149998338, - 36421197856653084, - 9988644487909290, - 21888242871839275222246405745257275088548364400416034343698147969161902651521, - 67830635999533227, - 21888242871839275222246405745257275088548364400416034343698185342382793817096, - 69861075807508697, - 48803886989381821, - 21888242871839275222246405745257275088548364400416034343698141559220302378437, - 21888242871839275222246405745257275088548364400416034343698187997894092903721, - 21888242871839275222246405745257275088548364400416034343698149254779334223707, - 63731816307691948, - 50207358044694129, - 21888242871839275222246405745257275088548364400416034343698148078692388189868, - 21888242871839275222246405745257275088548364400416034343698152407402474829962, - 36352315953717424, - 21888242871839275222246405745257275088548364400416034343698147941105609596745, - 10564055400762958, - 11886495691621089, - 15481455225091537, - 21888242871839275222246405745257275088548364400416034343698150393223238886895, - 21109529892014921, - 21888242871839275222246405745257275088548364400416034343698203055213630436275, - 21888242871839275222246405745257275088548364400416034343698175942702621702359, - 21888242871839275222246405745257275088548364400416034343698132972671794252804, - 39882550530906339, - 21888242871839275222246405745257275088548364400416034343698164515774363677323, - 21888242871839275222246405745257275088548364400416034343698150497201137626086, - 65779110099532154, - 21888242871839275222246405745257275088548364400416034343698141452004111193692, - 21888242871839275222246405745257275088548364400416034343698141047236448120598, - 44977116402174291, - 37333861545367780, - 21888242871839275222246405745257275088548364400416034343698134607305886989659, - 21888242871839275222246405745257275088548364400416034343698175787067469786951, - 21888242871839275222246405745257275088548364400416034343698145101165987109356, - 21888242871839275222246405745257275088548364400416034343698133654965958727301, - 11044387539379877, - 23188354214150992, - 21888242871839275222246405745257275088548364400416034343698158747398621553207, - 21888242871839275222246405745257275088548364400416034343698166072046383435940, - 21888242871839275222246405745257275088548364400416034343698201873671608960217, - 21888242871839275222246405745257275088548364400416034343698140797819930694385, - 21888242871839275222246405745257275088548364400416034343698162841220125019918, - 21888242871839275222246405745257275088548364400416034343698149748416263333329, - 21888242871839275222246405745257275088548364400416034343698139249369614378301, - 21888242871839275222246405745257275088548364400416034343698140175151645694053, - 27819861060575355, - 36852008047754868, - 21888242871839275222246405745257275088548364400416034343698151155636916707144, - 22914158286461303, - 21888242871839275222246405745257275088548364400416034343698197126346308739206, - 21888242871839275222246405745257275088548364400416034343698182214766049341074, - 21888242871839275222246405745257275088548364400416034343698160540843702145150, - 21888242871839275222246405745257275088548364400416034343698156488268535041187, - 12254321008963620, - 6749960396341328, - 21888242871839275222246405745257275088548364400416034343698202915085415586160, - 62998261210981350, - 21888242871839275222246405745257275088548364400416034343698165022651141724567, - 21888242871839275222246405745257275088548364400416034343698185172362657585771, - 61618683782806658, - 16643699081712129, - 21888242871839275222246405745257275088548364400416034343698157701369061882164, - 28700896780150986, - 28832088015532588, - 24458767834209619, - 31898755541256532, - 21888242871839275222246405745257275088548364400416034343698135643188312290855, - 21888242871839275222246405745257275088548364400416034343698184801141011629920, - 42339077061606358, - 3012417511512997, - 21888242871839275222246405745257275088548364400416034343698179009212928238670, - 21888242871839275222246405745257275088548364400416034343698151910436297574498, - 21888242871839275222246405745257275088548364400416034343698185217974879681661, - 20728784045149141, - 44213425977649083, - 21166820140554772, - 21888242871839275222246405745257275088548364400416034343698155043426581392089, - 14151523190464332, - 37997679122651168, - 21888242871839275222246405745257275088548364400416034343698143018895625340404, - 21888242871839275222246405745257275088548364400416034343698180694546820051005, - 21888242871839275222246405745257275088548364400416034343698174586015318105923, - 21888242871839275222246405745257275088548364400416034343698137232099141274423, - 21888242871839275222246405745257275088548364400416034343698189469271032822157, - 21888242871839275222246405745257275088548364400416034343698187783777969906821, - 31202548868021948, - 21888242871839275222246405745257275088548364400416034343698181658436985581248, - 21888242871839275222246405745257275088548364400416034343698163913650473704491, - 32162557387418385, - 21888242871839275222246405745257275088548364400416034343698134058060560939550, - 33695610203476998, - 29819042536234679, - 21888242871839275222246405745257275088548364400416034343698160623494941529289, - 61467113601241415, - 21888242871839275222246405745257275088548364400416034343698173784084670142843, - 21888242871839275222246405745257275088548364400416034343698132616845854362098, - 70265652271798938, - 21888242871839275222246405745257275088548364400416034343698177925035959039780, - 47476478609746448, - 21888242871839275222246405745257275088548364400416034343698141987655591869114, - 21888242871839275222246405745257275088548364400416034343698155873138214661236, - 21888242871839275222246405745257275088548364400416034343698158457608941530262, - 22414839607424786, - 70761034694266678, - 21888242871839275222246405745257275088548364400416034343698139584892065228962, - 21888242871839275222246405745257275088548364400416034343698136651847602712157, - 21888242871839275222246405745257275088548364400416034343698144174880905965862, - 21888242871839275222246405745257275088548364400416034343698174374979038321082, - 21888242871839275222246405745257275088548364400416034343698144312733420039466, - 21888242871839275222246405745257275088548364400416034343698184474636803611314, - 21888242871839275222246405745257275088548364400416034343698197213407691549200, - 36447967310140774, - 21888242871839275222246405745257275088548364400416034343698140734685943042364, - 57348744510166214, - 21888242871839275222246405745257275088548364400416034343698191348322530753708, - 21888242871839275222246405745257275088548364400416034343698155842566738008976, - 21888242871839275222246405745257275088548364400416034343698167750841550313320, - 29962359255309045, - 59494480162803837, - 62186869498613468, - 19766637097152697, - 63878017012003454, - 39914647214955747, - 4643718072483665, - 21888242871839275222246405745257275088548364400416034343698179779312365287733, - 49698161028669927, - 29013967377939582, - 58673354625946908, - 21888242871839275222246405745257275088548364400416034343698156737723496515991, - 21888242871839275222246405745257275088548364400416034343698192127973510439506, - 26431361033766582, - 21888242871839275222246405745257275088548364400416034343698174982110997387613, - 21888242871839275222246405745257275088548364400416034343698201501075152577534, - 6806703288678607, - 21888242871839275222246405745257275088548364400416034343698202061844372390698, - 66784150306324927, - 50269002791806930, - 32693780934702627, - 3591118472923819, - 21888242871839275222246405745257275088548364400416034343698162842343284745160, - 21888242871839275222246405745257275088548364400416034343698171891407258840174, - 31491412173808824, - 69789177827754988, - 21888242871839275222246405745257275088548364400416034343698161354262757569989, - 21888242871839275222246405745257275088548364400416034343698161115390869620906, - 21888242871839275222246405745257275088548364400416034343698171211216266515830, - 21888242871839275222246405745257275088548364400416034343698147113139969595430, - 33188971954601271, - 25095571051044733, - 21888242871839275222246405745257275088548364400416034343698132794321463748220, - 35134096280049768, - 11419946664526410, - 5879927674363893, - 21888242871839275222246405745257275088548364400416034343698161269502398396903, - 21888242871839275222246405745257275088548364400416034343698149163149101701606, - 28702857980432433, - 2378415699347601, - 38933608405093106, - 21888242871839275222246405745257275088548364400416034343698184055181157785108, - 21888242871839275222246405745257275088548364400416034343698135847268331205029, - 21888242871839275222246405745257275088548364400416034343698188860684733625244, - 21888242871839275222246405745257275088548364400416034343698144230509711777863, - 21888242871839275222246405745257275088548364400416034343698180409573811435563, - 10526767028393260, - 16397289323071730, - 21888242871839275222246405745257275088548364400416034343698143371726483760784, - 21888242871839275222246405745257275088548364400416034343698169685519723288648, - 21888242871839275222246405745257275088548364400416034343698154321878709238170, - 55892312976607755, - 21888242871839275222246405745257275088548364400416034343698175252271290483074, - 21888242871839275222246405745257275088548364400416034343698136943226478784937, - 21888242871839275222246405745257275088548364400416034343698203246543879606598, - 21888242871839275222246405745257275088548364400416034343698154361444355619184, - 12983227071686541, - 66219326642391042, - 21888242871839275222246405745257275088548364400416034343698180180696087037596, - 21888242871839275222246405745257275088548364400416034343698162637707731148967, - 10951685542814505, - 21888242871839275222246405745257275088548364400416034343698171586529126691093, - 21888242871839275222246405745257275088548364400416034343698142269844773633170, - 49295237340846158, - 21888242871839275222246405745257275088548364400416034343698182113847434163409, - 21888242871839275222246405745257275088548364400416034343698133893977413926142, - 11035330139050411, - 21888242871839275222246405745257275088548364400416034343698199488667233538274, - 21888242871839275222246405745257275088548364400416034343698155761502206544977, - 21888242871839275222246405745257275088548364400416034343698178841011912306802, - 39108394365349054, - 21888242871839275222246405745257275088548364400416034343698201923424884516158, - 26675088581446108, - 36832162406563343, - 22336850296901790, - 60374351346655099, - 32402382630632860, - 21888242871839275222246405745257275088548364400416034343698151142005258731894, - 61749309445551141, - 21888242871839275222246405745257275088548364400416034343698165136503604239221, - 27971302697422977, - 21888242871839275222246405745257275088548364400416034343698144950418294998123, - 21888242871839275222246405745257275088548364400416034343698169056046769350468, - 54504879590771372, - 44171391627104367, - 8827775982643974, - 47855515207432511, - 21888242871839275222246405745257275088548364400416034343698147082140489537376, - 21888242871839275222246405745257275088548364400416034343698195665402989552841, - 21888242871839275222246405745257275088548364400416034343698172035779148480747, - 21888242871839275222246405745257275088548364400416034343698167105659288831218, - 37900740655258069, - 21888242871839275222246405745257275088548364400416034343698200483013883815232, - 1724229640386115, - 21888242871839275222246405745257275088548364400416034343698175558481847176320, - 24164204618436180, - 21888242871839275222246405745257275088548364400416034343698135936729568680131, - 21888242871839275222246405745257275088548364400416034343698137782918857031363, - 21888242871839275222246405745257275088548364400416034343698172833105816445085, - 41594784823218882, - 62812218535513267, - 56477621650133829, - 21888242871839275222246405745257275088548364400416034343698165001639216913521, - 49989960490778066, - 33202252222134166, - 21888242871839275222246405745257275088548364400416034343698177641626105016931, - 19434805915580244, - 21888242871839275222246405745257275088548364400416034343698174332152508052405, - 21888242871839275222246405745257275088548364400416034343698188197810138691457, - 26031364835158003, - 19977295496384355, - 21888242871839275222246405745257275088548364400416034343698199133804662818786, - 21888242871839275222246405745257275088548364400416034343698177948140293663083, - 21888242871839275222246405745257275088548364400416034343698194023009869139120, - 48673257766190302, - 21888242871839275222246405745257275088548364400416034343698190778080723564913, - 355301499806208, - 30999361732108136, - 60746713521115385, - 21888242871839275222246405745257275088548364400416034343698161082452975371431, - 18147336321831546, - 43476804328245117, - 4224223701475004, - 21888242871839275222246405745257275088548364400416034343698198067702115466357, - 42388391671068515, - 21888242871839275222246405745257275088548364400416034343698181296725856453935, - 21888242871839275222246405745257275088548364400416034343698134406749855736657, - 21888242871839275222246405745257275088548364400416034343698181943907163012461, - 21888242871839275222246405745257275088548364400416034343698133872774950114402, - 21888242871839275222246405745257275088548364400416034343698176256866726409513, - 68909462318764847, - 21888242871839275222246405745257275088548364400416034343698179187251534163485, - 2107816882280287, - 34754284683034883, - 21888242871839275222246405745257275088548364400416034343698153709317502563865, - 21888242871839275222246405745257275088548364400416034343698158349253873950371, - 12109737011216382, - 21888242871839275222246405745257275088548364400416034343698185808344487593596, - 21888242871839275222246405745257275088548364400416034343698166301957962569316, - 2188022549815497, - 21888242871839275222246405745257275088548364400416034343698179150558469132613, - 21888242871839275222246405745257275088548364400416034343698133471607605105338, - 21888242871839275222246405745257275088548364400416034343698184468278872086463, - 21888242871839275222246405745257275088548364400416034343698164680672121489828, - 40476850914335083, - 57399983343000379, - 21888242871839275222246405745257275088548364400416034343698200905896087883754, - 54207737060604403, - 21888242871839275222246405745257275088548364400416034343698152278222851111945, - 21888242871839275222246405745257275088548364400416034343698145484736352618851, - 21888242871839275222246405745257275088548364400416034343698162233794630155754, - 9828926175408250, - 62121822225055982, - 21888242871839275222246405745257275088548364400416034343698188027394005796906, - 63419759673884600, - 13681611547036737, - 21888242871839275222246405745257275088548364400416034343698151315368073397721, - 36335016648432163, - 52637414978360882, - 51348510187212293, - 29768585447663182, - 32783190525742178, - 21888242871839275222246405745257275088548364400416034343698203703486855630006, - 21888242871839275222246405745257275088548364400416034343698183316897624813258, - 60732820844151108, - 42640185080816953, - 28741759398633099, - 21888242871839275222246405745257275088548364400416034343698159014185001772315, - 51621313258746506, - 26783660012009066, - 51127517786410675, - 21888242871839275222246405745257275088548364400416034343698135924955201025304, - 21888242871839275222246405745257275088548364400416034343698151222985490363030, - 21888242871839275222246405745257275088548364400416034343698179401107890579943, - 21888242871839275222246405745257275088548364400416034343698186260623127075701, - 10482088835739452, - 46231252211534824, - 53209014099491958, - 7596264691245, - 66458755937051264, - 13124124620391411, - 21888242871839275222246405745257275088548364400416034343698133357717924321419, - 38309400030320308, - 21888242871839275222246405745257275088548364400416034343698174140724449242463, - 27115191876177291, - 21888242871839275222246405745257275088548364400416034343698186873928371700157, - 33047424405700271, - 21636046547266490, - 12546591729578453, - 20061643149224562, - 5476383832217331, - 57781623401233839, - 1408836607363122, - 41832229634624998, - 53587965634034755, - 21888242871839275222246405745257275088548364400416034343698144024604027498541, - 21888242871839275222246405745257275088548364400416034343698201207802975188292, - 21888242871839275222246405745257275088548364400416034343698137352171668246523, - 21888242871839275222246405745257275088548364400416034343698147949312018895307, - 18384672986291577, - 71608519164716856, - 21888242871839275222246405745257275088548364400416034343698187491304611542815, - 52963366996065105, - 21888242871839275222246405745257275088548364400416034343698165397376948388258, - 23239573211010371, - 7903408311431769, - 21888242871839275222246405745257275088548364400416034343698145239161072245110, - 16909482126349882, - 34380898060492235, - 13240144850665273, - 60764736511179617, - 37843587404864733, - 21888242871839275222246405745257275088548364400416034343698198305503385804930, - 54101938805792002, - 21888242871839275222246405745257275088548364400416034343698193283189888384080, - 21888242871839275222246405745257275088548364400416034343698201136455890461418, - 1663362536730357, - 21888242871839275222246405745257275088548364400416034343698175732019929374120, - 37863701403282577, - 63893057673820752, - 61587515792554223, - 21888242871839275222246405745257275088548364400416034343698154004928577186357, - 21888242871839275222246405745257275088548364400416034343698160214141601418281, - 21888242871839275222246405745257275088548364400416034343698136084825971927430, - 21888242871839275222246405745257275088548364400416034343698202393516196574551, - 21888242871839275222246405745257275088548364400416034343698148369689815344914, - 25160353409611851, - 67684143579289394, - 21888242871839275222246405745257275088548364400416034343698189626079379035770, - 21888242871839275222246405745257275088548364400416034343698203081132296645599, - 21888242871839275222246405745257275088548364400416034343698158639066583007955, - 21888242871839275222246405745257275088548364400416034343698132495580513981706, - 50721039654440409, - 21888242871839275222246405745257275088548364400416034343698156794410046643910, - 21888242871839275222246405745257275088548364400416034343698154780353959549206, - 29745506065626287, - 21888242871839275222246405745257275088548364400416034343698179003585155847420, - 21888242871839275222246405745257275088548364400416034343698138024017324669278, - 3823561231382218, - 21888242871839275222246405745257275088548364400416034343698192425588555341521, - 21888242871839275222246405745257275088548364400416034343698144615628520822629, - 21888242871839275222246405745257275088548364400416034343698200442755405344531, - 40157397581558787, - 29691610446695715, - 38191483934058415, - 36786533223413406, - 21888242871839275222246405745257275088548364400416034343698192738278481309329, - 21888242871839275222246405745257275088548364400416034343698181777888190055686, - 21888242871839275222246405745257275088548364400416034343698152346593166307250, - 58666690759556247, - 27893797919110569, - 1155230252386840, - 21888242871839275222246405745257275088548364400416034343698137591636074770814, - 21888242871839275222246405745257275088548364400416034343698161351796978673858, - 21888242871839275222246405745257275088548364400416034343698203171280497749616, - 21888242871839275222246405745257275088548364400416034343698145838095589338878, - 13764343130751831, - 21888242871839275222246405745257275088548364400416034343698137774044133017545, - 10688667166481406, - 65466356572606692, - 71314233504693400, - 21948023699524728, - 71433327621411531, - 56610407069652407, - 21888242871839275222246405745257275088548364400416034343698190976071953598917, - 21888242871839275222246405745257275088548364400416034343698159232432480159549, - 3962195780080179, - 21888242871839275222246405745257275088548364400416034343698149996671066933700, - 56441288538113441, - 21888242871839275222246405745257275088548364400416034343698148557583112676001, - 70581521504003028, - 50816162282889919, - 49971246845549107, - 15598133424670865, - 21888242871839275222246405745257275088548364400416034343698133504708206058894, - 21888242871839275222246405745257275088548364400416034343698152227512023253589, - 66524863969309223, - 34069026714828647, - 21888242871839275222246405745257275088548364400416034343698165876860935201493, - 21888242871839275222246405745257275088548364400416034343698185306816081499284, - 21888242871839275222246405745257275088548364400416034343698191723074830161161, - 21888242871839275222246405745257275088548364400416034343698171051836313773140, - 21888242871839275222246405745257275088548364400416034343698132814571114972959, - 16005663214882000, - 64756785801210763, - 21888242871839275222246405745257275088548364400416034343698196392956847886435, - 21888242871839275222246405745257275088548364400416034343698145057802985591739, - 21888242871839275222246405745257275088548364400416034343698157460885493202581, - 43539961474728675, - 21888242871839275222246405745257275088548364400416034343698154633005076108672, - 21888242871839275222246405745257275088548364400416034343698166625321916973709, - 32880673510995440, - 21888242871839275222246405745257275088548364400416034343698162831986487959781, - 6796610288254951, - 21888242871839275222246405745257275088548364400416034343698153591960011228250, - 21888242871839275222246405745257275088548364400416034343698136236804873497755, - 21888242871839275222246405745257275088548364400416034343698174884500137294387, - 5449675413437995, - 53878329311322404, - 46282380296681852, - 24945904154883326, - 1828277568630975, - 59602481633374312, - 21888242871839275222246405745257275088548364400416034343698181791666440738648, - 21888242871839275222246405745257275088548364400416034343698139454202675924065, - 27921824028078500, - 21888242871839275222246405745257275088548364400416034343698172307742743754547, - 21888242871839275222246405745257275088548364400416034343698138973164655440975, - 9804290086308561, - 40258332261455833, - 45661481800486673, - 30067352136140644, - 18905551233809477, - 53565630275740032, - 21888242871839275222246405745257275088548364400416034343698152602315352502135, - 21888242871839275222246405745257275088548364400416034343698141678676431778546, - 21888242871839275222246405745257275088548364400416034343698193617712600816365, - 21888242871839275222246405745257275088548364400416034343698194727672890836086, - 72046246168649851, - 4274786888188932, - 69395223012862254, - 21888242871839275222246405745257275088548364400416034343698133728443003639713, - 21888242871839275222246405745257275088548364400416034343698147153779249288621, - 21888242871839275222246405745257275088548364400416034343698159884212724008686, - 21888242871839275222246405745257275088548364400416034343698181843273844807189, - 21158308894461454, - 21888242871839275222246405745257275088548364400416034343698149670353092578929, - 21888242871839275222246405745257275088548364400416034343698190810861573680710, - 21888242871839275222246405745257275088548364400416034343698143013818360489213, - 21888242871839275222246405745257275088548364400416034343698138750853233467423, - 21303805958640964, - 21888242871839275222246405745257275088548364400416034343698154983159920676491, - 17648259076924640, - 65514658305287094, - 21888242871839275222246405745257275088548364400416034343698191583696110296741, - 1541274420176675, - 49802142315336884, - 21888242871839275222246405745257275088548364400416034343698201757678973897050, - 21888242871839275222246405745257275088548364400416034343698159329507155653153, - 51016905168121763, - 7861891418565533, - 22628459798608387, - 21888242871839275222246405745257275088548364400416034343698150235670004998609, - 21888242871839275222246405745257275088548364400416034343698146281213394040580, - 21888242871839275222246405745257275088548364400416034343698134858769626456225, - 8277246679759021, - 62937183215971281, - 30405858977737790, - 21888242871839275222246405745257275088548364400416034343698158854982727051296, - 21888242871839275222246405745257275088548364400416034343698136864882051726669, - 27963949234327954, - 21888242871839275222246405745257275088548364400416034343698188566304092578048, - 21888242871839275222246405745257275088548364400416034343698178461075487038922, - 21888242871839275222246405745257275088548364400416034343698187744183671568060, - 36748933399724520, - 21888242871839275222246405745257275088548364400416034343698154808122360502581, - 21888242871839275222246405745257275088548364400416034343698141906242216222099, - 43985349693878101, - 37598418265893200, - 19715337191201207, - 65163825320300164, - 29989822439510398, - 24282798006479952, - 50754949681817301, - 59931429134853647, - 21888242871839275222246405745257275088548364400416034343698201617838403309468, - 21888242871839275222246405745257275088548364400416034343698178831238847156186, - 21888242871839275222246405745257275088548364400416034343698134633388258675006, - 59660267676101710, - 16137059272426584, - 21888242871839275222246405745257275088548364400416034343698197805166804186958, - 38214299564948403, - 15571356419989319, - 1400265165529387, - 707882531962369, - 51865033023664642, - 33641666142895236, - 4248882043685464, - 21888242871839275222246405745257275088548364400416034343698186477572930647061, - 21888242871839275222246405745257275088548364400416034343698146443043431970751, - 50539752222877919, - 66517774772934295, - 2216116033329472, - 21888242871839275222246405745257275088548364400416034343698185207624389518975, - 38939796618863673, - 66065223945930205, - 44753378182758072, - 11607642919979396, - 64270631201238587, - 21888242871839275222246405745257275088548364400416034343698181132218263567393, - 31309325615515373, - 49983120768679028, - 11438928024391657, - 42364878321634836, - 40851298071260320, - 21888242871839275222246405745257275088548364400416034343698143530864052120897, - 21888242871839275222246405745257275088548364400416034343698160326705447143936, - 21888242871839275222246405745257275088548364400416034343698152113080050894386, - 10623808857270408, - 21888242871839275222246405745257275088548364400416034343698150603747494862451, - 47459058379914688, - 57886584776182017, - 6129172365920123, - 53790903350188845, - 21888242871839275222246405745257275088548364400416034343698150479280342032757, - 60770514411488984, - 21888242871839275222246405745257275088548364400416034343698155577671889951057, - 34629529637473208, - 224909827168500, - 17574412574875623, - 50519799788525897, - 21888242871839275222246405745257275088548364400416034343698148367766363088259, - 15223542898094341, - 39827462802694533, - 21888242871839275222246405745257275088548364400416034343698178702475960429410, - 59787711393604292, - 16734251186061351, - 63224078620983263, - 21888242871839275222246405745257275088548364400416034343698200003726893692060, - 46187642622496066, - 2512717247315740, - 9613604121044002, - 21888242871839275222246405745257275088548364400416034343698171227204812116266, - 21888242871839275222246405745257275088548364400416034343698195178017754074460, - 21888242871839275222246405745257275088548364400416034343698157138565955948400, - 54371081323526089, - 2826930673270500, - 21888242871839275222246405745257275088548364400416034343698167179613381829983, - 2999321791628550, - 46575680733626891, - 21888242871839275222246405745257275088548364400416034343698152292249092734360, - 21888242871839275222246405745257275088548364400416034343698174685314525020385, - 21888242871839275222246405745257275088548364400416034343698189789398905461254, - 65515506001551912, - 21888242871839275222246405745257275088548364400416034343698141388942562383773, - 8706228083830732, - 21888242871839275222246405745257275088548364400416034343698154785542445228652, - 69327146413214679, - 70991091693245722, - 21888242871839275222246405745257275088548364400416034343698155316329441724550, - 47474285016177195, - 21888242871839275222246405745257275088548364400416034343698165653259383333498, - 21888242871839275222246405745257275088548364400416034343698176401607858426178, - 21888242871839275222246405745257275088548364400416034343698178089377436914620, - 16321781318225566, - 21888242871839275222246405745257275088548364400416034343698143120266244168618, - 21888242871839275222246405745257275088548364400416034343698203210634024657261, - 21888242871839275222246405745257275088548364400416034343698183374143371991006, - 29041189326508956, - 27356889863514170, - 44620299336881152, - 21888242871839275222246405745257275088548364400416034343698146960590341644824, - 27631466032134328, - 21888242871839275222246405745257275088548364400416034343698165955647398406805, - 11706053661290905, - 21808666688259681, - 21888242871839275222246405745257275088548364400416034343698132336612532915265, - 21888242871839275222246405745257275088548364400416034343698174610425123562829, - 46054048553848872, - 30590236560125497, - 21888242871839275222246405745257275088548364400416034343698140259217818355164, - 250771360608706, - 21888242871839275222246405745257275088548364400416034343698155539363900973105, - 21888242871839275222246405745257275088548364400416034343698169995305075731727, - 21888242871839275222246405745257275088548364400416034343698144555983150342077, - 35949480371417299, - 11874320485978700, - 21888242871839275222246405745257275088548364400416034343698195807226768799821, - 40456478518421577, - 46072172409666394, - 21888242871839275222246405745257275088548364400416034343698145450793726373243, - 5717564954615704, - 30763463051116857, - 62207635134348350, - 21888242871839275222246405745257275088548364400416034343698183558547340925278, - 61646988060660093, - 21888242871839275222246405745257275088548364400416034343698136160735158201582, - 21888242871839275222246405745257275088548364400416034343698198417860053353605, - 21888242871839275222246405745257275088548364400416034343698143049836408011995, - 52512331481780782, - 21888242871839275222246405745257275088548364400416034343698173893851284247095, - 57317715977335543, - 6272566139498919, - 41532122867641011, - 21888242871839275222246405745257275088548364400416034343698141853791477813504, - 21888242871839275222246405745257275088548364400416034343698189473468099493826, - 21888242871839275222246405745257275088548364400416034343698191592391940652253, - 21888242871839275222246405745257275088548364400416034343698148674780612812783, - 27819729234470231, - 21888242871839275222246405745257275088548364400416034343698135155135266927353, - 21888242871839275222246405745257275088548364400416034343698191647769301391716, - 21888242871839275222246405745257275088548364400416034343698203926934100231918, - 21888242871839275222246405745257275088548364400416034343698178849002186754412, - 17337327954084845, - 33423022147155924, - 42829831469172642, - 21888242871839275222246405745257275088548364400416034343698146080919031185205, - 7048361486459658, - 21888242871839275222246405745257275088548364400416034343698194539756060179501, - 43280926712647168, - 21888242871839275222246405745257275088548364400416034343698198956528131267112, - 21888242871839275222246405745257275088548364400416034343698158789835504911154, - 14489432054044855, - 28634493007515469, - 1501758136518544, - 43665181338542516, - 11220202987153276, - 21888242871839275222246405745257275088548364400416034343698187163184407663479, - 21888242871839275222246405745257275088548364400416034343698182634570392574159, - 21888242871839275222246405745257275088548364400416034343698160132785029089336, - 46679473501220605, - 21888242871839275222246405745257275088548364400416034343698163048048157973986, - 13602501403239203, - 21888242871839275222246405745257275088548364400416034343698179087777173082282, - 21888242871839275222246405745257275088548364400416034343698154901685420995001, - 21888242871839275222246405745257275088548364400416034343698133643033157742947, - 21888242871839275222246405745257275088548364400416034343698196176223534464892, - 21888242871839275222246405745257275088548364400416034343698176103540450738048, - 5837525884961659, - 21888242871839275222246405745257275088548364400416034343698132896095663358028, - 21888242871839275222246405745257275088548364400416034343698174990821843751356, - 4659267449552402, - 21888242871839275222246405745257275088548364400416034343698183672159811883768, - 21888242871839275222246405745257275088548364400416034343698167128865522667828, - 21888242871839275222246405745257275088548364400416034343698154459005396942808, - 51184382998131205, - 21888242871839275222246405745257275088548364400416034343698160578365180854771, - 21888242871839275222246405745257275088548364400416034343698141088020393399672, - 54331088624981346, - 44471384436926076, - 21888242871839275222246405745257275088548364400416034343698176440580370584017, - 21888242871839275222246405745257275088548364400416034343698202342447256389604, - 44188910481499965, - 809906477052876, - 21799764007222875, - 21888242871839275222246405745257275088548364400416034343698189295089867754708, - 21888242871839275222246405745257275088548364400416034343698155406025687209955, - 21888242871839275222246405745257275088548364400416034343698194784163653101451, - 3184111151123391, - 21888242871839275222246405745257275088548364400416034343698181436049899807302, - 164813826971891, - 15530012033590940, - 21888242871839275222246405745257275088548364400416034343698202399621461798084, - 21888242871839275222246405745257275088548364400416034343698173355102300120687, - 21888242871839275222246405745257275088548364400416034343698132730281054717182, - 7849987232237283, - 1301825324446900, - 21888242871839275222246405745257275088548364400416034343698171945355345809012, - 50646356197097417, - 4965441965102609, - 21888242871839275222246405745257275088548364400416034343698168677394126163916, - 32954504279322198, - 21888242871839275222246405745257275088548364400416034343698178531290150369076, - 32012291317064163, - 21888242871839275222246405745257275088548364400416034343698194153801164317616, - 36204353588390238, - 9372314216112912, - 53557485102285787, - 7664768048461478, - 72002765589543701, - 21888242871839275222246405745257275088548364400416034343698140327287288424734, - 21888242871839275222246405745257275088548364400416034343698146098818911129737, - 21888242871839275222246405745257275088548364400416034343698183216791916468263, - 2073216800578640, - 8522791498764303, - 21888242871839275222246405745257275088548364400416034343698189919306708203814, - 21888242871839275222246405745257275088548364400416034343698136069606289310735, - 21888242871839275222246405745257275088548364400416034343698193131164439348400, - 12348958813970047, - 21888242871839275222246405745257275088548364400416034343698171229775747539307, - 21888242871839275222246405745257275088548364400416034343698135911205802347833, - 33966662629272245, - 49208047015685284, - 21888242871839275222246405745257275088548364400416034343698162794042795612059, - 21888242871839275222246405745257275088548364400416034343698181223832412645669, - 21888242871839275222246405745257275088548364400416034343698152963768501675853, - 66237070702795099, - 16991442828327786, - 21888242871839275222246405745257275088548364400416034343698197636342194328518, - 21888242871839275222246405745257275088548364400416034343698187742628880195202, - 16536045022544764, - 21888242871839275222246405745257275088548364400416034343698140987327802265389, - 21888242871839275222246405745257275088548364400416034343698148145761911634448, - 21888242871839275222246405745257275088548364400416034343698134351266400719074, - 14305075449113140, - 11767822758665625, - 10291065706629466, - 58920867721713385, - 68168449169125433, - 57957452277367048, - 21888242871839275222246405745257275088548364400416034343698185712372257796066, - 21888242871839275222246405745257275088548364400416034343698183921003444427156, - 24551065267392152, - 48420374541834513, - 37011431623380094, - 28101253035277579, - 21888242871839275222246405745257275088548364400416034343698132189240797966802, - 17664291210156099, - 58207771903908202, - 21888242871839275222246405745257275088548364400416034343698158426159660051768, - 21888242871839275222246405745257275088548364400416034343698196636925649483738, - 21888242871839275222246405745257275088548364400416034343698153707125001746315, - 21888242871839275222246405745257275088548364400416034343698169906830199603282, - 42449351645599469, - 14344528978373313, - 21888242871839275222246405745257275088548364400416034343698145511071882726453, - 21888242871839275222246405745257275088548364400416034343698202201745366135755, - 33798428228089693, - 21888242871839275222246405745257275088548364400416034343698144320581982139750, - 66773369085107327, - 21888242871839275222246405745257275088548364400416034343698179922616741643460, - 36266452003263052, - 36603516437913655, - 72051144510578250, - 39902210506020791, - 21888242871839275222246405745257275088548364400416034343698162454578537470327, - 21888242871839275222246405745257275088548364400416034343698178476018653212513, - 21888242871839275222246405745257275088548364400416034343698142231550430975781, - 21888242871839275222246405745257275088548364400416034343698194520631882468070, - 534560435900381, - 21888242871839275222246405745257275088548364400416034343698187504833604704040, - 58474029155610268, - 21888242871839275222246405745257275088548364400416034343698135870295400944278, - 33170312623922653, - 21888242871839275222246405745257275088548364400416034343698154215831598330689, - 21888242871839275222246405745257275088548364400416034343698152054316080472169, - 21888242871839275222246405745257275088548364400416034343698175332329503316429, - 57468497477141639, - 3232236911299873, - 21888242871839275222246405745257275088548364400416034343698199791421033574366, - 21888242871839275222246405745257275088548364400416034343698132281039559214665, - 63137618410143169, - 70049247221120856, - 13149900054163820, - 21888242871839275222246405745257275088548364400416034343698145213915483429112, - 70366995005560440, - 68471102103098590, - 43707178649926813, - 26841925292950227, - 58366362454124331, - 21888242871839275222246405745257275088548364400416034343698181821770795261661, - 65960445907949468, - 21888242871839275222246405745257275088548364400416034343698155301580613023693, - 16704992921875366, - 26573603435188424, - 55876059950279466, - 21888242871839275222246405745257275088548364400416034343698202069896940800097, - 21888242871839275222246405745257275088548364400416034343698173274784754586791, - 21888242871839275222246405745257275088548364400416034343698139228924296671840, - 37381913211630269, - 34197290690901246, - 64766294853210756, - 21970123448743283, - 21888242871839275222246405745257275088548364400416034343698151051281112426229, - 21888242871839275222246405745257275088548364400416034343698177081566414076496, - 21888242871839275222246405745257275088548364400416034343698183908835952237639, - 21888242871839275222246405745257275088548364400416034343698141274186986427731, - 21888242871839275222246405745257275088548364400416034343698195612531915900751, - 21888242871839275222246405745257275088548364400416034343698183542486860021956, - 57504693509653413, - 63027391191297759, - 41669827181776426, - 44369394640690639, - 21888242871839275222246405745257275088548364400416034343698179682814808416579, - 21888242871839275222246405745257275088548364400416034343698156870287243979082, - 21888242871839275222246405745257275088548364400416034343698168915990608915849, - 58849128491531889, - 28016269713690296, - 21888242871839275222246405745257275088548364400416034343698132419621678184890, - 8150657608587883, - 21888242871839275222246405745257275088548364400416034343698168185865843616905, - 21888242871839275222246405745257275088548364400416034343698152428618728384420, - 50025303019067542, - 21888242871839275222246405745257275088548364400416034343698152653860426966700, - 21888242871839275222246405745257275088548364400416034343698183768351085245613, - 21888242871839275222246405745257275088548364400416034343698189476952394361874, - 21888242871839275222246405745257275088548364400416034343698137342086530684043, - 69021163992251542, - 21888242871839275222246405745257275088548364400416034343698146803529765586806, - 21888242871839275222246405745257275088548364400416034343698195418322413477214, - 3710598673842798, - 21888242871839275222246405745257275088548364400416034343698153202713756161865, - 21888242871839275222246405745257275088548364400416034343698166280425034937893, - 62071950041849575, - 68938412610257818, - 25783652120050049, - 21888242871839275222246405745257275088548364400416034343698174933353087181828, - 21888242871839275222246405745257275088548364400416034343698165826847451927411, - 21888242871839275222246405745257275088548364400416034343698200484090076094772, - 60459207444111899, - 21888242871839275222246405745257275088548364400416034343698167478103697280105, - 34410021825436536, - 43830801953868983, - 21888242871839275222246405745257275088548364400416034343698161209201599135587, - 34511747124955501, - 21888242871839275222246405745257275088548364400416034343698138700806562915005, - 21888242871839275222246405745257275088548364400416034343698193249022020448595, - 21888242871839275222246405745257275088548364400416034343698195611068002035296, - 21888242871839275222246405745257275088548364400416034343698152898246824867144, - 70879579065662292, - 22512448862983453, - 21888242871839275222246405745257275088548364400416034343698171130718802125815, - 59138923149039859, - 21888242871839275222246405745257275088548364400416034343698158696292756776565, - 21888242871839275222246405745257275088548364400416034343698162567966933090563, - 69852208591396548, - 21888242871839275222246405745257275088548364400416034343698159611104239987384, - 21888242871839275222246405745257275088548364400416034343698157322789171773345, - 3307390095815246, - 21888242871839275222246405745257275088548364400416034343698202174022714056558, - 21888242871839275222246405745257275088548364400416034343698152186033903161157, - 21888242871839275222246405745257275088548364400416034343698196990755343343750, - 21888242871839275222246405745257275088548364400416034343698136299752936416117, - 2902639000487675, - 21888242871839275222246405745257275088548364400416034343698197361159726180269, - 14161902424035265, - 61330177387531024, - 59411255918076112, - 21888242871839275222246405745257275088548364400416034343698174472344874225283, - 60947218927918972, - 21888242871839275222246405745257275088548364400416034343698151459373776371528, - 11189735785017787, - 22602103720281458, - 1145290434016090, - 67124606519832445, - 21888242871839275222246405745257275088548364400416034343698172624019861836448, - 21888242871839275222246405745257275088548364400416034343698169776192009967718, - 21888242871839275222246405745257275088548364400416034343698150378632858950015, - 5320217032971351, - 11245010763076999, - 5344957269965447, - 21888242871839275222246405745257275088548364400416034343698152768259607310085, - 57354907744412434, - 65866174666886962, - 21888242871839275222246405745257275088548364400416034343698175797028628567426, - 10814651677181475, - 21888242871839275222246405745257275088548364400416034343698189551243219199347, - 23054959345750254, - 21888242871839275222246405745257275088548364400416034343698174319358219112349, - 21888242871839275222246405745257275088548364400416034343698164552354198749140, - 21888242871839275222246405745257275088548364400416034343698184616629949349821, - 21888242871839275222246405745257275088548364400416034343698168468032861220205, - 21888242871839275222246405745257275088548364400416034343698184671534959096692, - 52597195746784525, - 40337125107403841, - 10078064844428892, - 17955035750610424, - 55414115906496876, - 21888242871839275222246405745257275088548364400416034343698201922212955921066, - 21888242871839275222246405745257275088548364400416034343698173489969934345348, - 65277489164474388, - 21888242871839275222246405745257275088548364400416034343698194931667897631847, - 21888242871839275222246405745257275088548364400416034343698193580942792140652, - 9805100081413846, - 50381715374008205, - 8792838514993212, - 21888242871839275222246405745257275088548364400416034343698158597387399830823, - 21888242871839275222246405745257275088548364400416034343698143460055910765909, - 21888242871839275222246405745257275088548364400416034343698204131968348707636, - 7221451197232273, - 21888242871839275222246405745257275088548364400416034343698133620870143688948, - 29200597421370067, - 36993917442214916, - 21888242871839275222246405745257275088548364400416034343698197512538914394237, - 21888242871839275222246405745257275088548364400416034343698196748870782812374, - 67535334363102644, - 32901806372102494, - 21888242871839275222246405745257275088548364400416034343698164359634891315981, - 49300706794019683, - 21888242871839275222246405745257275088548364400416034343698159957566578542019, - 21888242871839275222246405745257275088548364400416034343698202053925330328350, - 58678090651236804, - 21888242871839275222246405745257275088548364400416034343698138179074017231417, - 46455605380500659, - 21888242871839275222246405745257275088548364400416034343698161280908760623740, - 21888242871839275222246405745257275088548364400416034343698138834347696346503, - 21888242871839275222246405745257275088548364400416034343698191775707015507242, - 7606025605489420, - 8693728064982271, - 20652109653151514, - 4174998960027445, - 21888242871839275222246405745257275088548364400416034343698159716571554302112, - 36206089579256742, - 21888242871839275222246405745257275088548364400416034343698185973804140155197, - 34686947553608365, - 21888242871839275222246405745257275088548364400416034343698159163422709513924, - 21888242871839275222246405745257275088548364400416034343698170952954029499832, - 12636517090395992, - 21888242871839275222246405745257275088548364400416034343698180941251368596618, - 21888242871839275222246405745257275088548364400416034343698132792463881253574, - 46543862711456496, - 66862582740788504, - 43211047537505180, - 21316438338849302, - 51327490256284215, - 64527099771963275, - 21888242871839275222246405745257275088548364400416034343698158692601551919340, - 65917966199335199, - 21888242871839275222246405745257275088548364400416034343698176842742591537571, - 1434380368405750, - 21888242871839275222246405745257275088548364400416034343698159448274650113680, - 55680925959328155, - 7556698104721394, - 21888242871839275222246405745257275088548364400416034343698133261110768815318, - 21888242871839275222246405745257275088548364400416034343698162559173661039629, - 23382152063700445, - 21888242871839275222246405745257275088548364400416034343698197306242647804931, - 60017845627202407, - 21888242871839275222246405745257275088548364400416034343698199761413673017223, - 23780557892052038, - 21888242871839275222246405745257275088548364400416034343698190063540902997866, - 8822827045925925, - 21888242871839275222246405745257275088548364400416034343698142362636878792023, - 44048358759962479, - 21888242871839275222246405745257275088548364400416034343698153329822768497532, - 21888242871839275222246405745257275088548364400416034343698154864229381127425, - 3388805289746255, - 2858592774877451, - 21888242871839275222246405745257275088548364400416034343698147806289933014640, - 21888242871839275222246405745257275088548364400416034343698159230506909503312, - 21888242871839275222246405745257275088548364400416034343698171417853413951677, - 21888242871839275222246405745257275088548364400416034343698186663305745924794, - 21888242871839275222246405745257275088548364400416034343698156154814253002367, - 21888242871839275222246405745257275088548364400416034343698159314445397790702, - 52717691724282085, - 32439451890594691, - 21888242871839275222246405745257275088548364400416034343698201035695560246615, - 21888242871839275222246405745257275088548364400416034343698138423401836592236, - 21888242871839275222246405745257275088548364400416034343698147240290154238010, - 21888242871839275222246405745257275088548364400416034343698202994794943460376, - 21888242871839275222246405745257275088548364400416034343698136605913326166172, - 70042515690988906, - 21888242871839275222246405745257275088548364400416034343698161631561756630496, - 21888242871839275222246405745257275088548364400416034343698134432131328579716, - 21888242871839275222246405745257275088548364400416034343698152369031243248097, - 21888242871839275222246405745257275088548364400416034343698203116695921428490, - 21888242871839275222246405745257275088548364400416034343698146601345426589937, - 21888242871839275222246405745257275088548364400416034343698183932680182423146, - 49175361603105135, - 21888242871839275222246405745257275088548364400416034343698201601865923082973, - 71244410066220577, - 53218477689168751, - 21888242871839275222246405745257275088548364400416034343698139016928192168807, - 21888242871839275222246405745257275088548364400416034343698173244371093851752, - 7533004446637273, - 63315986983463928, - 21888242871839275222246405745257275088548364400416034343698159214017199089481, - 8919063269959503, - 6377098414244630, - 21888242871839275222246405745257275088548364400416034343698164610993500790389, - 21888242871839275222246405745257275088548364400416034343698187483919986075655, - 21888242871839275222246405745257275088548364400416034343698193224070364124670, - 16931397769197789, - 21888242871839275222246405745257275088548364400416034343698191896407363161741, - 21888242871839275222246405745257275088548364400416034343698193078342430150060, - 21888242871839275222246405745257275088548364400416034343698164622710051051269, - 3570702742879416, - 55049289837918119, - 21888242871839275222246405745257275088548364400416034343698178484971648651487, - 32791285483662741, - 21888242871839275222246405745257275088548364400416034343698195760149238743583, - 21888242871839275222246405745257275088548364400416034343698171722102933435735, - 21888242871839275222246405745257275088548364400416034343698183706355899743500, - 14309774674356500, - 1111061849404844, - 686555918401867, - 1724150086324471, - 21888242871839275222246405745257275088548364400416034343698155827978791117947, - 51173525835947554, - 21888242871839275222246405745257275088548364400416034343698166291660402088723, - 21888242871839275222246405745257275088548364400416034343698152984821798062793, - 21888242871839275222246405745257275088548364400416034343698197025185593834872, - 21888242871839275222246405745257275088548364400416034343698160579641826499174, - 21888242871839275222246405745257275088548364400416034343698146978867688494760, - 7676057701051671, - 21888242871839275222246405745257275088548364400416034343698148417692201962286, - 62970763899579983, - 21888242871839275222246405745257275088548364400416034343698194787959989621743, - 21888242871839275222246405745257275088548364400416034343698148243818059092404, - 21888242871839275222246405745257275088548364400416034343698186359068454803635, - 19988583209626136, - 15700374339409575, - 21888242871839275222246405745257275088548364400416034343698170271634267564861, - 19558586795524123, - 9311730086451241, - 21888242871839275222246405745257275088548364400416034343698170820285551386500, - 10317182031064487, - 21888242871839275222246405745257275088548364400416034343698172563625849614281, - 21888242871839275222246405745257275088548364400416034343698196797547466919284, - 21888242871839275222246405745257275088548364400416034343698138959674177408077, - 21888242871839275222246405745257275088548364400416034343698174700519617545386, - 21888242871839275222246405745257275088548364400416034343698141769465881013767, - 21888242871839275222246405745257275088548364400416034343698194898614663921687, - 11481692380760613, - 21888242871839275222246405745257275088548364400416034343698166898690892595084, - 50440517779067584, - 25725112545960306, - 21888242871839275222246405745257275088548364400416034343698197826252850941134, - 23794929549005961, - 67908032798656806, - 21888242871839275222246405745257275088548364400416034343698201675966853014362, - 21888242871839275222246405745257275088548364400416034343698198544484346764506, - 21888242871839275222246405745257275088548364400416034343698202754228960130421, - 21888242871839275222246405745257275088548364400416034343698154724186276145110, - 42806325169296546, - 69084911583262584, - 38248475877433921, - 21888242871839275222246405745257275088548364400416034343698203915721996084026, - 21888242871839275222246405745257275088548364400416034343698198278537670902996, - 71549515667799670, - 4335318779580903, - 70503791595997449, - 21888242871839275222246405745257275088548364400416034343698165560378891075877, - 10827360989941538, - 26853444224394321, - 69492383444201589, - 21888242871839275222246405745257275088548364400416034343698146472349404485388, - 21888242871839275222246405745257275088548364400416034343698158922646609606541, - 69183115114687539, - 31216297263912068, - 6570629417369208, - 21888242871839275222246405745257275088548364400416034343698146993190056235712, - 43169677957687472, - 21888242871839275222246405745257275088548364400416034343698162292606054670322, - 22676827922669304, - 21888242871839275222246405745257275088548364400416034343698154876096720330841, - 44816911992423189, - 31430114057642206, - 21888242871839275222246405745257275088548364400416034343698186750941374711986, - 34308818408780619, - 915710872941407, - 21888242871839275222246405745257275088548364400416034343698172388232864274913, - 65848408738856228, - 21888242871839275222246405745257275088548364400416034343698170948049675198362, - 62786768993412015, - 44197952481928547, - 21888242871839275222246405745257275088548364400416034343698186308478164983763, - 21888242871839275222246405745257275088548364400416034343698188297774269171682, - 60419377231204502, - 12552804371617508, - 13251277730758254, - 21888242871839275222246405745257275088548364400416034343698199159094206606496, - 21888242871839275222246405745257275088548364400416034343698190831374041867154, - 21888242871839275222246405745257275088548364400416034343698161362850930090846, - 21888242871839275222246405745257275088548364400416034343698190838747591647933, - 4542677488791292, - 21888242871839275222246405745257275088548364400416034343698188580858254135966, - 21888242871839275222246405745257275088548364400416034343698146835323370041858, - 21888242871839275222246405745257275088548364400416034343698148859955450812860, - 19701900731400260, - 21888242871839275222246405745257275088548364400416034343698196924074457071406, - 21888242871839275222246405745257275088548364400416034343698146802108201648654, - 44403588397758450, - 14097789919573152, - 57496799404106657, - 29766330148955282, - 54586104195255101, - 64837081757096872, - 21888242871839275222246405745257275088548364400416034343698199089080329012712, - 21888242871839275222246405745257275088548364400416034343698132694659574371141, - 21888242871839275222246405745257275088548364400416034343698179670202786687147, - 21888242871839275222246405745257275088548364400416034343698134173770135627804, - 21888242871839275222246405745257275088548364400416034343698134360857795970156, - 54705074816695379, - 21888242871839275222246405745257275088548364400416034343698180321674213308240, - 21888242871839275222246405745257275088548364400416034343698190202212941307838, - 21888242871839275222246405745257275088548364400416034343698172987007790428441, - 21888242871839275222246405745257275088548364400416034343698172247111539459935, - 21888242871839275222246405745257275088548364400416034343698203177066531662191, - 21888242871839275222246405745257275088548364400416034343698140951657914950373, - 28033994503789668, - 24914043102012932, - 21888242871839275222246405745257275088548364400416034343698135245849114407763, - 21888242871839275222246405745257275088548364400416034343698146777842238328020, - 21888242871839275222246405745257275088548364400416034343698140385815793547954, - 39705945347689949, - 21888242871839275222246405745257275088548364400416034343698168204778301181138, - 54179666252390500, - 21888242871839275222246405745257275088548364400416034343698168183845885821209, - 21888242871839275222246405745257275088548364400416034343698179166488999595340, - 21888242871839275222246405745257275088548364400416034343698147766125562695585, - 21888242871839275222246405745257275088548364400416034343698172007918801133475, - 21888242871839275222246405745257275088548364400416034343698158735913888797818, - 21888242871839275222246405745257275088548364400416034343698147927712326181665, - 21888242871839275222246405745257275088548364400416034343698164879175809326608, - 21888242871839275222246405745257275088548364400416034343698172154878682876035, - 68176693170882928, - 64248182298075840, - 21888242871839275222246405745257275088548364400416034343698185787266440254138, - 21888242871839275222246405745257275088548364400416034343698147516488462516404, - 21888242871839275222246405745257275088548364400416034343698139931303978398990, - 21888242871839275222246405745257275088548364400416034343698157562988724324449, - 9345859956419314, - 21888242871839275222246405745257275088548364400416034343698188957171222745710, - 56381140553523213, - 21888242871839275222246405745257275088548364400416034343698145604429026954529, - 15108725871749003, - 33178433484292410, - 39135781047374082, - 21888242871839275222246405745257275088548364400416034343698173885538387815889, - 21888242871839275222246405745257275088548364400416034343698170724393493197935, - 39436947918467274, - 21888242871839275222246405745257275088548364400416034343698133595553505367714, - 12161314819413499, - 21888242871839275222246405745257275088548364400416034343698140315598123082230, - 52297794730147656, - 29454440481618437, - 28611621593307972, - 21888242871839275222246405745257275088548364400416034343698155051431595578955, - 21888242871839275222246405745257275088548364400416034343698188683652371904377, - 30763112723845131, - 21888242871839275222246405745257275088548364400416034343698150326122815277449, - 21888242871839275222246405745257275088548364400416034343698175738824705034746, - 39035937445818394, - 58574053889749866, - 21888242871839275222246405745257275088548364400416034343698165032340690400631, - 58177904931483823, - 21888242871839275222246405745257275088548364400416034343698154737463011504577, - 21888242871839275222246405745257275088548364400416034343698159650426929506672, - 21888242871839275222246405745257275088548364400416034343698144453804985832539, - 21888242871839275222246405745257275088548364400416034343698150885312258525480, - 13552552051083478, - 38362545688010614, - 56303476870795868, - 20680062600693226, - 21888242871839275222246405745257275088548364400416034343698140293214362721594, - 15992393987785423, - 21888242871839275222246405745257275088548364400416034343698143485556917088307, - 35194882785337421, - 21888242871839275222246405745257275088548364400416034343698178244455713201665, - 21888242871839275222246405745257275088548364400416034343698137978017317847548, - 36276885071574652, - 50192278718462560, - 14438026348430766, - 49305874398436202, - 21888242871839275222246405745257275088548364400416034343698148996059916857576, - 21888242871839275222246405745257275088548364400416034343698156569332206961672, - 54172609020256565, - 21897577139980219, - 21888242871839275222246405745257275088548364400416034343698156288686814057422, - 61579867075260065, - 1364316158818547, - 66165944804959517, - 16699975565169054, - 21888242871839275222246405745257275088548364400416034343698172369567530569687, - 34681315618237645, - 21888242871839275222246405745257275088548364400416034343698165684319153797933, - 21888242871839275222246405745257275088548364400416034343698157650713870023484, - 21888242871839275222246405745257275088548364400416034343698136236349992000942, - 21888242871839275222246405745257275088548364400416034343698182580528590247154, - 21888242871839275222246405745257275088548364400416034343698147385820528848090, - 21888242871839275222246405745257275088548364400416034343698168872092182295447, - 4672037475484985, - 21888242871839275222246405745257275088548364400416034343698151284439331297345, - 21888242871839275222246405745257275088548364400416034343698196444160443489039, - 21888242871839275222246405745257275088548364400416034343698149916440426787219, - 21888242871839275222246405745257275088548364400416034343698171449648628202418, - 21888242871839275222246405745257275088548364400416034343698150503985491743638, - 42054175749556220, - 43227543978032807, - 21888242871839275222246405745257275088548364400416034343698177895926588147206, - 21888242871839275222246405745257275088548364400416034343698154429475098800219, - 20427525150457121, - 21888242871839275222246405745257275088548364400416034343698178148494801669781, - 69092146288499550, - 21888242871839275222246405745257275088548364400416034343698192394083054870217, - 21888242871839275222246405745257275088548364400416034343698178677264463537905, - 21888242871839275222246405745257275088548364400416034343698168514284426882647, - 21888242871839275222246405745257275088548364400416034343698135079644162881046, - 21888242871839275222246405745257275088548364400416034343698170137919914858957, - 70097981500219085, - 19925198399925721, - 21888242871839275222246405745257275088548364400416034343698155231050360517119, - 21888242871839275222246405745257275088548364400416034343698161971415478647471, - 50426501632289838, - 21888242871839275222246405745257275088548364400416034343698152472134399789775, - 21888242871839275222246405745257275088548364400416034343698177440809784703718, - 68433308155847558, - 21888242871839275222246405745257275088548364400416034343698156569296104534122, - 21888242871839275222246405745257275088548364400416034343698176918393021634519, - 5944928113689582, - 21888242871839275222246405745257275088548364400416034343698201540607235434555, - 59461838191742681, - 21888242871839275222246405745257275088548364400416034343698147691936747772727, - 18563133169726720, - 21888242871839275222246405745257275088548364400416034343698199092682817403708, - 21888242871839275222246405745257275088548364400416034343698171390128901693705, - 65934371710121330, - 21888242871839275222246405745257275088548364400416034343698193291376413480717, - 21888242871839275222246405745257275088548364400416034343698197842614543795538, - 21888242871839275222246405745257275088548364400416034343698186171121630360169, - 17717581731573750, - 29602818794278732, - 21888242871839275222246405745257275088548364400416034343698173896792035596263, - 44101045770620500, - 21888242871839275222246405745257275088548364400416034343698195033659824813077, - 17804994372888054, - 45654390645212021, - 47119146262387471, - 14859386214293516, - 21888242871839275222246405745257275088548364400416034343698159279128356796688, - 21888242871839275222246405745257275088548364400416034343698184400445590135863, - 21888242871839275222246405745257275088548364400416034343698194231711380084325, - 21888242871839275222246405745257275088548364400416034343698178818322310208357, - 21888242871839275222246405745257275088548364400416034343698132371542167376939, - 31289744007515720, - 21888242871839275222246405745257275088548364400416034343698146596791227858447, - 66987432085502659, - 21888242871839275222246405745257275088548364400416034343698194146880514102931, - 56103758266446480, - 21888242871839275222246405745257275088548364400416034343698133794423213432801, - 21888242871839275222246405745257275088548364400416034343698160271001392366676, - 21888242871839275222246405745257275088548364400416034343698150892271427080953, - 19380533561475790, - 56391887165859692, - 21888242871839275222246405745257275088548364400416034343698148776774566220935, - 21888242871839275222246405745257275088548364400416034343698190576648109368167, - 46686281955661170, - 21888242871839275222246405745257275088548364400416034343698152165829469054736, - 21888242871839275222246405745257275088548364400416034343698191246141616497112, - 21888242871839275222246405745257275088548364400416034343698165613942369871212, - 21888242871839275222246405745257275088548364400416034343698154288210725040000, - 26398151913683301, - 47010532485326818, - 21888242871839275222246405745257275088548364400416034343698196679465581610643, - 26996562711042936, - 24034366878297045, - 21888242871839275222246405745257275088548364400416034343698201622215755822749, - 21888242871839275222246405745257275088548364400416034343698194593995966428860, - 21888242871839275222246405745257275088548364400416034343698135442467787759928, - 21888242871839275222246405745257275088548364400416034343698196056350399204030, - 21888242871839275222246405745257275088548364400416034343698198410084552975954, - 49236258096454404, - 21888242871839275222246405745257275088548364400416034343698169657627018698016, - 21888242871839275222246405745257275088548364400416034343698156010901453399038, - 21888242871839275222246405745257275088548364400416034343698192347565566570916, - 50980645105376683, - 61000109084350693, - 21888242871839275222246405745257275088548364400416034343698199530107940666805, - 63097562020844467, - 32576131593601896, - 36834611203713739, - 24362052256666976, - 21888242871839275222246405745257275088548364400416034343698179151734895439297, - 15263963407376392, - 21888242871839275222246405745257275088548364400416034343698161995703071570638, - 21888242871839275222246405745257275088548364400416034343698187551630363121212, - 21888242871839275222246405745257275088548364400416034343698159052672842001232, - 21888242871839275222246405745257275088548364400416034343698148228554258718453, - 58115517477352682, - 16494367013919744, - 55892281438722434, - 21888242871839275222246405745257275088548364400416034343698171852051039537871, - 56398250313720977, - 709823097122386, - 21888242871839275222246405745257275088548364400416034343698165243367960743893, - 21888242871839275222246405745257275088548364400416034343698140906763446268065, - 21888242871839275222246405745257275088548364400416034343698140759221030490153, - 21888242871839275222246405745257275088548364400416034343698152884817858819146, - 69060371743203305, - 21888242871839275222246405745257275088548364400416034343698177570912408622275, - 21888242871839275222246405745257275088548364400416034343698146703862318086387, - 4237651192457606, - 21888242871839275222246405745257275088548364400416034343698152734918193282989, - 42131858057163672, - 5036314511980669, - 21888242871839275222246405745257275088548364400416034343698181662641258909340, - 21888242871839275222246405745257275088548364400416034343698160522115188769184, - 21888242871839275222246405745257275088548364400416034343698165711796365941794, - 48335987279396356, - 46896031617506319, - 24494150027078766, - 69570887912337672, - 12382938916718702, - 24747712777713479, - 21888242871839275222246405745257275088548364400416034343698158270033780972279, - 42341283397318708, - 56021022048534935, - 21888242871839275222246405745257275088548364400416034343698190640024347132423, - 24232545132529607, - 54948420516546487, - 21888242871839275222246405745257275088548364400416034343698169910693242122226, - 21888242871839275222246405745257275088548364400416034343698150555357090613770, - 20558370351540, - 24902797928302571, - 54977436775051033, - 24555403719188078, - 28232365087933042, - 69384269693630833, - 12015315822241584, - 12805576892411996, - 21888242871839275222246405745257275088548364400416034343698149039747518622002, - 21888242871839275222246405745257275088548364400416034343698154043075939757247, - 50154840622357392, - 26259213306581100, - 27701376287898987, - 21795912429218252, - 12173807753170180, - 67394560275488531, - 21888242871839275222246405745257275088548364400416034343698187763714046838282, - 50225926949556128, - 55972064744881685, - 16716499543053154, - 21888242871839275222246405745257275088548364400416034343698141314634138524144, - 3422375941620455, - 21888242871839275222246405745257275088548364400416034343698150331356535894713, - 9559516247892476, - 14478529130314024, - 64891691801356739, - 21888242871839275222246405745257275088548364400416034343698202128719628676229, - 21888242871839275222246405745257275088548364400416034343698159538852054247473, - 21888242871839275222246405745257275088548364400416034343698198800473579696955, - 41039214934582585, - 21888242871839275222246405745257275088548364400416034343698157933806953980358, - 21888242871839275222246405745257275088548364400416034343698163239864058938589, - 15670297586924621, - 31130780354482543, - 13003043955789639, - 21888242871839275222246405745257275088548364400416034343698172155621537134634, - 21888242871839275222246405745257275088548364400416034343698175835180071394382, - 21888242871839275222246405745257275088548364400416034343698198677257234899814, - 21888242871839275222246405745257275088548364400416034343698141989712590514854, - 21888242871839275222246405745257275088548364400416034343698158725594453987701, - 21888242871839275222246405745257275088548364400416034343698163773038394024519, - 21888242871839275222246405745257275088548364400416034343698183588343810314316, - 14541684753385435, - 17669030692206170, - 21888242871839275222246405745257275088548364400416034343698191622946188880394, - 21888242871839275222246405745257275088548364400416034343698142768273994365462, - 21888242871839275222246405745257275088548364400416034343698164336527548596615, - 20893765033317128, - 62838671726721116, - 21888242871839275222246405745257275088548364400416034343698136123299889745006, - 21888242871839275222246405745257275088548364400416034343698188869366938652744, - 20573875248056588, - 3428655156872553, - 21888242871839275222246405745257275088548364400416034343698183237960149146944, - 25475814083867630, - 21888242871839275222246405745257275088548364400416034343698201801329786890901, - 7963948342733693, - 21888242871839275222246405745257275088548364400416034343698172730666406646532, - 21888242871839275222246405745257275088548364400416034343698201580119692357738, - 29948832197509510, - 69838695272961363, - 22625565512719072, - 40641921027977677, - 21888242871839275222246405745257275088548364400416034343698171642494469186197, - 52412599842994374, - 21888242871839275222246405745257275088548364400416034343698203379226526590562, - 21888242871839275222246405745257275088548364400416034343698185947347913916565, - 21888242871839275222246405745257275088548364400416034343698147055602483588381, - 47860072091905882, - 21888242871839275222246405745257275088548364400416034343698156403853321679185, - 52314453422127141, - 47131545851716863, - 66181743363706029, - 23606717037796610, - 61891422924233788, - 21888242871839275222246405745257275088548364400416034343698151620372326259807, - 69071371615636920, - 61330012017107662, - 66524213963812257, - 21888242871839275222246405745257275088548364400416034343698164312058736406825, - 21888242871839275222246405745257275088548364400416034343698193197344448066362, - 21888242871839275222246405745257275088548364400416034343698182936422767928722, - 51322108372617060, - 11105697930917001, - 21888242871839275222246405745257275088548364400416034343698169402263557974142, - 23328389827327376, - 16979013311301782, - 21888242871839275222246405745257275088548364400416034343698151584237074548443, - 34615206295384480, - 21888242871839275222246405745257275088548364400416034343698163658869022538758, - 21888242871839275222246405745257275088548364400416034343698155442798607960964, - 34746504535426825, - 25761858594980269, - 21888242871839275222246405745257275088548364400416034343698140012973563875455, - 21888242871839275222246405745257275088548364400416034343698163325719818239608, - 21888242871839275222246405745257275088548364400416034343698158209048203357627, - 42599633922167176, - 44599290067039778, - 42380384425240436, - 51149237664974379, - 21888242871839275222246405745257275088548364400416034343698203016822696213356, - 36260510880060938, - 5465407723824722, - 28890091992881602, - 62013406479466805, - 21888242871839275222246405745257275088548364400416034343698141835706763914586, - 21888242871839275222246405745257275088548364400416034343698135305308354437933, - 21888242871839275222246405745257275088548364400416034343698163050391882072339, - 21888242871839275222246405745257275088548364400416034343698191860289831646622, - 21888242871839275222246405745257275088548364400416034343698132834872468421820, - 21888242871839275222246405745257275088548364400416034343698198181508625611331, - 44430043864849859, - 21888242871839275222246405745257275088548364400416034343698181890905570282562, - 21888242871839275222246405745257275088548364400416034343698156854095831048939, - 21888242871839275222246405745257275088548364400416034343698201373797916138689, - 25962018079541050, - 24525611276600674, - 24447359861004196, - 21888242871839275222246405745257275088548364400416034343698162616389642732792, - 44722065527985637, - 62411104980998390, - 8186401245349850, - 22984595393804698, - 34567339551287315, - 31862282914616519, - 21222307000897679, - 5534964748563608, - 20531684525348204, - 21888242871839275222246405745257275088548364400416034343698203701380544562725, - 32509831121365924, - 11561078411572062, - 21888242871839275222246405745257275088548364400416034343698147489413961331373, - 21888242871839275222246405745257275088548364400416034343698181110889474439345, - 12286730002998722, - 21888242871839275222246405745257275088548364400416034343698178680271947698247, - 26028337182997176, - 71481578056270920, - 54584952466738692, - 47877939683279997, - 31753705734757606, - 21888242871839275222246405745257275088548364400416034343698160067073790135286, - 19460696656072246, - 21888242871839275222246405745257275088548364400416034343698159568044784803133, - 28552990692499687, - 55223135515503242, - 21888242871839275222246405745257275088548364400416034343698188794565344699732, - 50445144039943806, - 21888242871839275222246405745257275088548364400416034343698192965765800859342, - 48310768065701737, - 21888242871839275222246405745257275088548364400416034343698200103246205953655, - 21888242871839275222246405745257275088548364400416034343698152704837346625736, - 21888242871839275222246405745257275088548364400416034343698143804000389604430, - 24817385170709836, - 21888242871839275222246405745257275088548364400416034343698146805317611581037, - 42203333564529046, - 28938774592900700, - 21888242871839275222246405745257275088548364400416034343698197438897457612573, - 21888242871839275222246405745257275088548364400416034343698145840891931750993, - 21888242871839275222246405745257275088548364400416034343698134955992422420036, - 21888242871839275222246405745257275088548364400416034343698180528259725270663, - 21888242871839275222246405745257275088548364400416034343698165796274630619409, - 21888242871839275222246405745257275088548364400416034343698162479274577086146, - 65342813475283315, - 21888242871839275222246405745257275088548364400416034343698197086769665240404, - 21888242871839275222246405745257275088548364400416034343698167050673551642959, - 21888242871839275222246405745257275088548364400416034343698159143987312827587, - 34753047035583616, - 21888242871839275222246405745257275088548364400416034343698186638692039940736, - 21888242871839275222246405745257275088548364400416034343698160406706925100516, - 21888242871839275222246405745257275088548364400416034343698198193361011789756, - 21888242871839275222246405745257275088548364400416034343698164502528439040741, - 53161159531254012, - 46365365861762040, - 21888242871839275222246405745257275088548364400416034343698197195983909823754, - 12044291279809227, - 43442349154195395, - 33681894612693053, - 21888242871839275222246405745257275088548364400416034343698171237413040985391, - 21888242871839275222246405745257275088548364400416034343698133317168042291510, - 31748216862871189, - 21888242871839275222246405745257275088548364400416034343698170868379069952064, - 23672867636828039, - 21888242871839275222246405745257275088548364400416034343698164255604650615215, - 26538069099598357, - 48520651234993830, - 58243621029496741, - 14697833831783870, - 28191291651266934, - 21888242871839275222246405745257275088548364400416034343698172736842810427782, - 21888242871839275222246405745257275088548364400416034343698190638112183957410, - 21888242871839275222246405745257275088548364400416034343698172752262476836781, - 21888242871839275222246405745257275088548364400416034343698153245236295318625, - 21888242871839275222246405745257275088548364400416034343698142244925301730096, - 49948406396732622, - 21888242871839275222246405745257275088548364400416034343698161582800660126309, - 45253776016293759, - 21888242871839275222246405745257275088548364400416034343698170323789744896583, - 21888242871839275222246405745257275088548364400416034343698160069858463889328, - 21888242871839275222246405745257275088548364400416034343698140291976819973229, - 2905694786623009, - 21888242871839275222246405745257275088548364400416034343698193401728088103879, - 24838437502508144, - 36760567402568971, - 33352021744892213, - 24967317874791577, - 32030731410609580, - 21888242871839275222246405745257275088548364400416034343698147794064605314352, - 17476043805541946, - 40557149999495141, - 69454246547996966, - 546410924112444, - 67321437743940988, - 21888242871839275222246405745257275088548364400416034343698146838016750911401, - 13680215295019465, - 21888242871839275222246405745257275088548364400416034343698176487071721240441, - 21888242871839275222246405745257275088548364400416034343698163283117286242415, - 13539517772586887, - 10258314717923905, - 40552769363771815, - 21888242871839275222246405745257275088548364400416034343698192167176069075978, - 21888242871839275222246405745257275088548364400416034343698197018108327635446, - 8779145305763640, - 21888242871839275222246405745257275088548364400416034343698189970136783854513, - 21888242871839275222246405745257275088548364400416034343698162754756634331338, - 56273444677827389, - 21888242871839275222246405745257275088548364400416034343698148302203916967934, - 52421948998394168, - 58169771481648294, - 21888242871839275222246405745257275088548364400416034343698143310250154593187, - 65404494734293171, - 21888242871839275222246405745257275088548364400416034343698137300021031272393, - 5464244201260325, - 67709683714429106, - 21888242871839275222246405745257275088548364400416034343698194133006060783638, - 21888242871839275222246405745257275088548364400416034343698134069594271030305, - 5975232277347688, - 31831192181318107, - 21888242871839275222246405745257275088548364400416034343698197624276638260064, - 19517110121577844, - 21888242871839275222246405745257275088548364400416034343698166067121720390742, - 21888242871839275222246405745257275088548364400416034343698134797105832583685, - 49128837624071013, - 21888242871839275222246405745257275088548364400416034343698172680061549105387, - 63209332979056391, - 3721576885129558, - 40699987958795469, - 21888242871839275222246405745257275088548364400416034343698174820628019206730, - 21411542391521306, - 21888242871839275222246405745257275088548364400416034343698195946554145777552, - 21888242871839275222246405745257275088548364400416034343698182809081397537730, - 21888242871839275222246405745257275088548364400416034343698199352599118436671, - 65996853595440320, - 71841476068232142, - 21888242871839275222246405745257275088548364400416034343698142270992037312732, - 16324776251139413, - 30038878359530368, - 40210674120065239, - 22686901382360685, - 42825830615661382, - 40471066092473686, - 21888242871839275222246405745257275088548364400416034343698156741173336288579, - 21888242871839275222246405745257275088548364400416034343698189385193374689285, - 21888242871839275222246405745257275088548364400416034343698199056456150231352, - 21888242871839275222246405745257275088548364400416034343698176838879941138654, - 21888242871839275222246405745257275088548364400416034343698169686786989686657, - 60478819910486590, - 16025625552840718, - 32734974151999410, - 46266636773266130, - 21888242871839275222246405745257275088548364400416034343698134745519889898807, - 21888242871839275222246405745257275088548364400416034343698147004646040310141, - 21888242871839275222246405745257275088548364400416034343698168136816837177571, - 63356462315247454, - 21888242871839275222246405745257275088548364400416034343698198127937444457923, - 53940487703178787, - 21888242871839275222246405745257275088548364400416034343698163398930722638161, - 21888242871839275222246405745257275088548364400416034343698149057386701238856, - 66849395684398136, - 45131946654097952, - 21888242871839275222246405745257275088548364400416034343698168891704053471685, - 24791209246954646, - 21888242871839275222246405745257275088548364400416034343698134751251355609347, - 21888242871839275222246405745257275088548364400416034343698145030675121649735, - 32696223982867506, - 59100614254853502, - 44377604306224623, - 21888242871839275222246405745257275088548364400416034343698153646654219452973, - 21888242871839275222246405745257275088548364400416034343698138352098284907968, - 21888242871839275222246405745257275088548364400416034343698203415922339674846, - 1678960702817660, - 21888242871839275222246405745257275088548364400416034343698202827769926897602, - 66696002340198293, - 21888242871839275222246405745257275088548364400416034343698170471430319983869, - 63270558726866244, - 21888242871839275222246405745257275088548364400416034343698143802565631162800, - 21888242871839275222246405745257275088548364400416034343698171298598000994190, - 21888242871839275222246405745257275088548364400416034343698195054124673801668, - 21888242871839275222246405745257275088548364400416034343698159979900842021439, - 21888242871839275222246405745257275088548364400416034343698144946375394403133, - 28728895243660370, - 5145911311369695, - 21888242871839275222246405745257275088548364400416034343698149066288946376221, - 21888242871839275222246405745257275088548364400416034343698147995412428371567, - 21888242871839275222246405745257275088548364400416034343698171131386580298604, - 48332866035386324, - 71430115475180527, - 29836716767962308, - 21888242871839275222246405745257275088548364400416034343698135878236036082226, - 30538690231642011, - 11622973450851805, - 53740979938768426, - 14201238480724769, - 64405926145734395, - 21888242871839275222246405745257275088548364400416034343698176146565051204456, - 21888242871839275222246405745257275088548364400416034343698170785818921827086, - 21888242871839275222246405745257275088548364400416034343698154892011258572300, - 21888242871839275222246405745257275088548364400416034343698192540349832759528, - 61608645300043088, - 21888242871839275222246405745257275088548364400416034343698161045004091109481, - 13242468989111486, - 7961538258878500, - 21888242871839275222246405745257275088548364400416034343698191691020903933250, - 21888242871839275222246405745257275088548364400416034343698193762191058041126, - 48532590714959374, - 46277905657855525, - 21888242871839275222246405745257275088548364400416034343698163969248351815108, - 19228379298825900, - 45369246343759120, - 49807506839117523, - 4789323326408716, - 21888242871839275222246405745257275088548364400416034343698134138796654852374, - 23755632917304555, - 40916441454706393, - 21888242871839275222246405745257275088548364400416034343698150527154625281277, - 52131956776438180, - 12279939927105075, - 52975390906697214, - 21888242871839275222246405745257275088548364400416034343698158877482711959877, - 9136391068385695, - 14335989830900928, - 11166456098736679, - 21888242871839275222246405745257275088548364400416034343698166258495259285711, - 19249793792773750, - 21888242871839275222246405745257275088548364400416034343698175126536197386300, - 35330295063952463, - 7014816110946956, - 22469211873437636, - 67487994844337516, - 21888242871839275222246405745257275088548364400416034343698155439153160035159, - 28024139280189225, - 21888242871839275222246405745257275088548364400416034343698186680285647229077, - 21888242871839275222246405745257275088548364400416034343698160257375470932676, - 66002013900804056, - 21888242871839275222246405745257275088548364400416034343698168861336774152787, - 52620891339319098, - 21888242871839275222246405745257275088548364400416034343698192869353607642600, - 21888242871839275222246405745257275088548364400416034343698144599788788838042, - 6861793972203742, - 21888242871839275222246405745257275088548364400416034343698137128011732255743, - 21888242871839275222246405745257275088548364400416034343698172262778718733487, - 71740944202048691, - 21888242871839275222246405745257275088548364400416034343698156104779217381566, - 54822246067743607, - 21888242871839275222246405745257275088548364400416034343698159363965298882311, - 11432625936108192, - 42475689737284940, - 21888242871839275222246405745257275088548364400416034343698150800829904472351, - 21888242871839275222246405745257275088548364400416034343698169177506444241720, - 4146819410256235, - 21878157430608771, - 35693767650189040, - 21888242871839275222246405745257275088548364400416034343698166475652017814698, - 21888242871839275222246405745257275088548364400416034343698202120568935237244, - 25202634959581498, - 43667763149811159, - 21888242871839275222246405745257275088548364400416034343698186198067735244853, - 21888242871839275222246405745257275088548364400416034343698137348798047687366, - 21888242871839275222246405745257275088548364400416034343698141673055719903784, - 21888242871839275222246405745257275088548364400416034343698167814843355150711, - 64754489878527134, - 2911457612759078, - 68820724724349930, - 21888242871839275222246405745257275088548364400416034343698178473577829223802, - 40737450954497444, - 26440117851227245, - 13916615569759088, - 22082748501634225, - 21888242871839275222246405745257275088548364400416034343698137797510058846816, - 65510041104575965, - 52156549227587589, - 21888242871839275222246405745257275088548364400416034343698199391599245384191, - 21888242871839275222246405745257275088548364400416034343698139105901318041942, - 21888242871839275222246405745257275088548364400416034343698148867061541518522, - 21888242871839275222246405745257275088548364400416034343698202348712158915481, - 21888242871839275222246405745257275088548364400416034343698188102437465475466, - 21888242871839275222246405745257275088548364400416034343698165132361645867857, - 67018233670842056, - 9558349999236776, - 10415170622082986, - 63407827113005415, - 1028412191638992, - 65797073243446775, - 21888242871839275222246405745257275088548364400416034343698168257821086154226, - 54406467654624380, - 21888242871839275222246405745257275088548364400416034343698144235103331664549, - 21888242871839275222246405745257275088548364400416034343698193461694529462751, - 21888242871839275222246405745257275088548364400416034343698165181133459154313, - 21888242871839275222246405745257275088548364400416034343698197984006077496205, - 21888242871839275222246405745257275088548364400416034343698146800838402488534, - 36176445599680555, - 15955871364707503, - 21888242871839275222246405745257275088548364400416034343698194918344076472334, - 21888242871839275222246405745257275088548364400416034343698158962115176928732, - 21888242871839275222246405745257275088548364400416034343698181510852133137309, - 30651186569013109, - 67489713535568337, - 21888242871839275222246405745257275088548364400416034343698156101056583435861, - 21888242871839275222246405745257275088548364400416034343698134450070835785850, - 21888242871839275222246405745257275088548364400416034343698188976930090949572, - 51813791459173803, - 59089661825061785, - 21888242871839275222246405745257275088548364400416034343698132572141623065264, - 62537630691737882, - 21720527579488274, - 21888242871839275222246405745257275088548364400416034343698197103395238555862, - 21888242871839275222246405745257275088548364400416034343698175188223840269938, - 52494059348627391, - 21888242871839275222246405745257275088548364400416034343698167266860878757528, - 21888242871839275222246405745257275088548364400416034343698138769162948943693, - 6682277697921562, - 21888242871839275222246405745257275088548364400416034343698191301728907073974, - 55158227348209163, - 21888242871839275222246405745257275088548364400416034343698178134079856009833, - 21888242871839275222246405745257275088548364400416034343698187279648914275811, - 69405178349200611, - 54285921334536738, - 21888242871839275222246405745257275088548364400416034343698155492046820092559, - 45534310678633721, - 60579392246003265, - 4478284384233111, - 21888242871839275222246405745257275088548364400416034343698133701506248307250, - 16276363771353070, - 21888242871839275222246405745257275088548364400416034343698133354026411534769, - 21888242871839275222246405745257275088548364400416034343698204135785123015688, - 21888242871839275222246405745257275088548364400416034343698168616327024124359, - 21888242871839275222246405745257275088548364400416034343698143248216877570053, - 21888242871839275222246405745257275088548364400416034343698147682094150277007, - 21888242871839275222246405745257275088548364400416034343698151299445874737784, - 21888242871839275222246405745257275088548364400416034343698159026275153426845, - 36923723430518752, - 2770234299055030, - 21888242871839275222246405745257275088548364400416034343698135682034548434988, - 43057615930290117, - 21888242871839275222246405745257275088548364400416034343698188002333198658864, - 21888242871839275222246405745257275088548364400416034343698175782719346855744, - 35653849219852083, - 21888242871839275222246405745257275088548364400416034343698161600268287931783, - 67178933397085216, - 14515517639528897, - 41748923410585370, - 21888242871839275222246405745257275088548364400416034343698139301858663207347, - 64980769674245053, - 43999708950675010, - 21888242871839275222246405745257275088548364400416034343698196966707428035844, - 32759061441638007, - 11058253390543628, - 21888242871839275222246405745257275088548364400416034343698155873417283427121, - 21888242871839275222246405745257275088548364400416034343698149146761935228482, - 21888242871839275222246405745257275088548364400416034343698156132057556815006, - 21888242871839275222246405745257275088548364400416034343698167344795383756593, - 21888242871839275222246405745257275088548364400416034343698201670922139361390, - 21888242871839275222246405745257275088548364400416034343698155801693260694932, - 51414133967879407, - 21888242871839275222246405745257275088548364400416034343698202362750594328277, - 21888242871839275222246405745257275088548364400416034343698178330004158860785, - 17879569504329096, - 64893149701953356, - 21888242871839275222246405745257275088548364400416034343698173267964045472191, - 42062921175064896, - 60762798765847685, - 71033593427849720, - 51258178074325960, - 21888242871839275222246405745257275088548364400416034343698155255142686607554, - 52171793739573728, - 15141495660137789, - 21888242871839275222246405745257275088548364400416034343698151820620539910453, - 46526123487855117, - 1980014301479244, - 273557436933460, - 21888242871839275222246405745257275088548364400416034343698149998070430374264, - 21888242871839275222246405745257275088548364400416034343698147388887063596815, - 21888242871839275222246405745257275088548364400416034343698177267372817822592, - 46062842332096353, - 21888242871839275222246405745257275088548364400416034343698156321090687508776, - 19028617492327912, - 21888242871839275222246405745257275088548364400416034343698178359956003647556, - 7587724931669401, - 21888242871839275222246405745257275088548364400416034343698147265136644136805, - 21888242871839275222246405745257275088548364400416034343698185083567534013521, - 21888242871839275222246405745257275088548364400416034343698195749261931196374, - 21888242871839275222246405745257275088548364400416034343698159195391727090705, - 68726276859336445, - 21888242871839275222246405745257275088548364400416034343698203655579757404380, - 21888242871839275222246405745257275088548364400416034343698178675544915317425, - 21888242871839275222246405745257275088548364400416034343698178067300367220904, - 28379351457288223, - 22418583832134329, - 21888242871839275222246405745257275088548364400416034343698148974422183737975, - 21888242871839275222246405745257275088548364400416034343698150430913510497774, - 21888242871839275222246405745257275088548364400416034343698160827229819777916, - 350090259381337, - 64502506912570552, - 21888242871839275222246405745257275088548364400416034343698201257651643106480, - 45509736516894119, - 21888242871839275222246405745257275088548364400416034343698138100108344007892, - 21888242871839275222246405745257275088548364400416034343698179665582326320433, - 21543836573146347, - 21888242871839275222246405745257275088548364400416034343698168454992651710739, - 21888242871839275222246405745257275088548364400416034343698174703028689025521, - 21888242871839275222246405745257275088548364400416034343698179962647130010719, - 21888242871839275222246405745257275088548364400416034343698185081313677969411, - 49573658856956620, - 30459689594479221, - 21888242871839275222246405745257275088548364400416034343698144883997069608223, - 21888242871839275222246405745257275088548364400416034343698162404117996832650, - 70476560711398371, - 21888242871839275222246405745257275088548364400416034343698196249547155230467, - 21888242871839275222246405745257275088548364400416034343698141362779782540659, - 15813019202968515, - 21888242871839275222246405745257275088548364400416034343698203459051133533137, - 11999366119866213, - 21888242871839275222246405745257275088548364400416034343698149892901370292658, - 40555238460555054, - 45409198759914152, - 11284243012680208, - 21888242871839275222246405745257275088548364400416034343698140601482812149531, - 21888242871839275222246405745257275088548364400416034343698169084370418602158, - 21888242871839275222246405745257275088548364400416034343698171446425064169147, - 21888242871839275222246405745257275088548364400416034343698200935735852830958, - 19984183235920006, - 24780440945162452, - 21888242871839275222246405745257275088548364400416034343698196175783560525342, - 21888242871839275222246405745257275088548364400416034343698150057693366282380, - 21888242871839275222246405745257275088548364400416034343698170198095991380847, - 65654174671050346, - 21888242871839275222246405745257275088548364400416034343698199838860567535163, - 21888242871839275222246405745257275088548364400416034343698156875021170112796, - 21888242871839275222246405745257275088548364400416034343698193397988767139070, - 21888242871839275222246405745257275088548364400416034343698144962099218818773, - 32004288622462444, - 61885733378407512, - 66537421893445275, - 21888242871839275222246405745257275088548364400416034343698136180003455643453, - 21888242871839275222246405745257275088548364400416034343698150683227933882193, - 29515300290937750, - 21888242871839275222246405745257275088548364400416034343698163473388688538936, - 21888242871839275222246405745257275088548364400416034343698175937663121862128, - 34054022764416640, - 71736600244650917, - 21888242871839275222246405745257275088548364400416034343698177603578234423228, - 21888242871839275222246405745257275088548364400416034343698174009985062096262, - 21888242871839275222246405745257275088548364400416034343698141475358475954289, - 21888242871839275222246405745257275088548364400416034343698152475261535839233, - 49811563460993626, - 29170229397852026, - 21888242871839275222246405745257275088548364400416034343698182653459225589864, - 21888242871839275222246405745257275088548364400416034343698179522669403746142, - 21888242871839275222246405745257275088548364400416034343698140572175770567165, - 21888242871839275222246405745257275088548364400416034343698149383219646729007, - 42424966210925577, - 36619392615719191, - 8868491423520739, - 21888242871839275222246405745257275088548364400416034343698186201810152126027, - 60800759018744463, - 21888242871839275222246405745257275088548364400416034343698194652077129924613, - 41018132999229221, - 21888242871839275222246405745257275088548364400416034343698162180383107133031, - 37865679552963408, - 50247432688999205, - 21888242871839275222246405745257275088548364400416034343698132725046257133426, - 21888242871839275222246405745257275088548364400416034343698199143260927366944, - 21888242871839275222246405745257275088548364400416034343698179642293733521211, - 46484459472526718, - 21888242871839275222246405745257275088548364400416034343698185437088000961809, - 57717978851167005, - 21888242871839275222246405745257275088548364400416034343698140935537010323178, - 21888242871839275222246405745257275088548364400416034343698191385417988485002, - 31912174164615121, - 21888242871839275222246405745257275088548364400416034343698139829696808105366, - 21888242871839275222246405745257275088548364400416034343698166643136937111671, - 34661558192027551, - 61391165536960534, - 45808990170567046, - 21888242871839275222246405745257275088548364400416034343698194927112498377255, - 66668007331221505, - 38452021760855946, - 2469569093184171, - 21888242871839275222246405745257275088548364400416034343698184011280462392472, - 21888242871839275222246405745257275088548364400416034343698156922516031813844, - 21888242871839275222246405745257275088548364400416034343698142265283195463793, - 28676211525905431, - 21888242871839275222246405745257275088548364400416034343698133763963089597823, - 21888242871839275222246405745257275088548364400416034343698151876639037131273, - 21888242871839275222246405745257275088548364400416034343698169583631506402566, - 21888242871839275222246405745257275088548364400416034343698144279647307288375, - 69227803130335573, - 21888242871839275222246405745257275088548364400416034343698144672755822234109, - 21888242871839275222246405745257275088548364400416034343698153290273882476483, - 21888242871839275222246405745257275088548364400416034343698141238024865393634, - 21888242871839275222246405745257275088548364400416034343698192025291749078521, - 48676545899185655, - 31322065550152417, - 21888242871839275222246405745257275088548364400416034343698176942685148454714, - 21888242871839275222246405745257275088548364400416034343698159384011796748767, - 21888242871839275222246405745257275088548364400416034343698184902377391888553, - 37174888930730742, - 21888242871839275222246405745257275088548364400416034343698179670100842968877, - 21888242871839275222246405745257275088548364400416034343698162409175125995072, - 64646234084763230, - 21888242871839275222246405745257275088548364400416034343698169155365661134816, - 21888242871839275222246405745257275088548364400416034343698192171563909718991, - 21888242871839275222246405745257275088548364400416034343698164406663334849273, - 18924762021362665, - 856280449124403, - 21888242871839275222246405745257275088548364400416034343698171040919381958365, - 21888242871839275222246405745257275088548364400416034343698138538221407417013, - 49399221565167201, - 14438030181120747, - 70952032684240484, - 21888242871839275222246405745257275088548364400416034343698139365450518803259, - 42965237764474891, - 332676110899566, - 21888242871839275222246405745257275088548364400416034343698176206111922675771, - 21888242871839275222246405745257275088548364400416034343698187741443404494619, - 22009266603550001, - 21888242871839275222246405745257275088548364400416034343698200809873866009402, - 21888242871839275222246405745257275088548364400416034343698153737746803709021, - 21888242871839275222246405745257275088548364400416034343698140127733370535049, - 13120868638458924, - 44577515378998399, - 21888242871839275222246405745257275088548364400416034343698171191610822600715, - 21888242871839275222246405745257275088548364400416034343698179164523325760348, - 23104952592911573, - 32531178391447221, - 70643719433580341, - 21888242871839275222246405745257275088548364400416034343698191931384411658497, - 63152203868578176, - 21888242871839275222246405745257275088548364400416034343698173424105826614504, - 32912008167529886, - 58968823925411356, - 21888242871839275222246405745257275088548364400416034343698159572811868834129, - 40236440651333788, - 5398753277383765, - 21888242871839275222246405745257275088548364400416034343698192981981647234590, - 21888242871839275222246405745257275088548364400416034343698133082231587119961, - 35584157931464614, - 4909568477776928, - 21888242871839275222246405745257275088548364400416034343698143508290655119266, - 21888242871839275222246405745257275088548364400416034343698155255353680382148, - 63257774483391027, - 21888242871839275222246405745257275088548364400416034343698159404955430956630, - 73459183976016, - 15081874800835424, - 21888242871839275222246405745257275088548364400416034343698155339421918318823, - 21888242871839275222246405745257275088548364400416034343698187371123599506979, - 33549666605053465, - 3971881999430334, - 41224108552811916, - 21888242871839275222246405745257275088548364400416034343698147000661117090118, - 34630730449876852, - 41959210424299447, - 51571007116311575, - 21888242871839275222246405745257275088548364400416034343698168746210025045502, - 8422009860697087, - 21888242871839275222246405745257275088548364400416034343698196732850491345431, - 21888242871839275222246405745257275088548364400416034343698148546529993472920, - 41996393230839210, - 4552556597212728, - 35206080918466501, - 13916868784751091, - 21888242871839275222246405745257275088548364400416034343698141277604824839804, - 21888242871839275222246405745257275088548364400416034343698152717255934518169, - 13311207832831150, - 21888242871839275222246405745257275088548364400416034343698166978270447518223, - 20332872648415095, - 14366418019288966, - 68167051933548672, - 34193124254167928, - 21888242871839275222246405745257275088548364400416034343698138779347431961318, - 41834240756832871, - 20087842484403436, - 21888242871839275222246405745257275088548364400416034343698185032722386627022, - 21888242871839275222246405745257275088548364400416034343698148470506002966164, - 2968721646914192, - 21888242871839275222246405745257275088548364400416034343698193057642941855789, - 35402776134658803, - 62627450558843073, - 21888242871839275222246405745257275088548364400416034343698170212100683636465, - 63973780609519166, - 21888242871839275222246405745257275088548364400416034343698151902404833795467, - 30566587010566664, - 21888242871839275222246405745257275088548364400416034343698159282490326190360, - 5656956199131427, - 39869985440267565, - 21888242871839275222246405745257275088548364400416034343698186722968681534803, - 19871553533203288, - 21888242871839275222246405745257275088548364400416034343698179418958071059764, - 46805623834843076, - 21888242871839275222246405745257275088548364400416034343698169811246245295038, - 28126717477372054, - 21888242871839275222246405745257275088548364400416034343698189125703072211939, - 21888242871839275222246405745257275088548364400416034343698171917943877505493, - 19949156828962694, - 58000948842012523, - 14907243869981828, - 21888242871839275222246405745257275088548364400416034343698188274349850735345, - 21888242871839275222246405745257275088548364400416034343698162565304805257594, - 31565220593006376, - 21888242871839275222246405745257275088548364400416034343698170139776990607506, - 21888242871839275222246405745257275088548364400416034343698137497222611518965, - 26625216058538305, - 21888242871839275222246405745257275088548364400416034343698142462391954126395, - 70375937425990466, - 21888242871839275222246405745257275088548364400416034343698194877057578215123, - 40007390607414358, - 21888242871839275222246405745257275088548364400416034343698137306137404057211, - 27153287109681984, - 21888242871839275222246405745257275088548364400416034343698200938022873914238, - 31109832360220242, - 9105575561443983, - 21888242871839275222246405745257275088548364400416034343698132482593804176425, - 21888242871839275222246405745257275088548364400416034343698172932203205238611, - 21888242871839275222246405745257275088548364400416034343698160922628555917078, - 45435060673398124, - 21888242871839275222246405745257275088548364400416034343698203943388601399901, - 23083291998352185, - 52022700523961009, - 21888242871839275222246405745257275088548364400416034343698171292211758125858, - 21888242871839275222246405745257275088548364400416034343698191531655337334164, - 21888242871839275222246405745257275088548364400416034343698185075527067718581, - 2957961446024009, - 21888242871839275222246405745257275088548364400416034343698140062129727071814, - 21888242871839275222246405745257275088548364400416034343698176550102033588156, - 25251838333389573, - 65285681785911272, - 67479642731234932, - 21888242871839275222246405745257275088548364400416034343698182619581879967508, - 21888242871839275222246405745257275088548364400416034343698182945558017966582, - 21888242871839275222246405745257275088548364400416034343698199921900701408380, - 21888242871839275222246405745257275088548364400416034343698137651954426434049, - 7213094278601378, - 35084011654837462, - 38489751744720068, - 21888242871839275222246405745257275088548364400416034343698142505199858816177, - 8312747740367217, - 21888242871839275222246405745257275088548364400416034343698163795325335709349, - 11239614774139638, - 14637133068307872, - 62266744695852807, - 21888242871839275222246405745257275088548364400416034343698150910387963489757, - 2620026939747855, - 38417436755494702, - 33843974072513428, - 7674723188520094, - 21888242871839275222246405745257275088548364400416034343698146319788854374350, - 14181938662806723, - 65782365072875405, - 29578012783744687, - 65948607712115313, - 63949780357576704, - 70019915581483425, - 21888242871839275222246405745257275088548364400416034343698155172208925915386, - 21888242871839275222246405745257275088548364400416034343698140569987267777410, - 62893149277451929, - 15528745930080198, - 21888242871839275222246405745257275088548364400416034343698173120932997496169, - 21888242871839275222246405745257275088548364400416034343698194954734714791025, - 21888242871839275222246405745257275088548364400416034343698187383906819421431, - 37202156284428382, - 39219045722545036, - 61477300371366216, - 11382810688815422, - 40958383044866743, - 27663767003637426, - 46223791591941446, - 32413330802945556, - 21888242871839275222246405745257275088548364400416034343698187951813161492890, - 21888242871839275222246405745257275088548364400416034343698147968539725047572, - 28380695907643653, - 66178373215608099, - 5281299351485936, - 33555212795431722, - 20125795198176727, - 64942129112879288, - 26070221606337901, - 62860399071164592, - 21888242871839275222246405745257275088548364400416034343698196490731514241822, - 45700707992015276, - 168377900089155, - 21888242871839275222246405745257275088548364400416034343698200324676204721874, - 21888242871839275222246405745257275088548364400416034343698160049928994785510, - 15944153635828515, - 60201844430818280, - 21888242871839275222246405745257275088548364400416034343698181156904155504960, - 21888242871839275222246405745257275088548364400416034343698141668614027094433, - 21888242871839275222246405745257275088548364400416034343698179671342616266695, - 21888242871839275222246405745257275088548364400416034343698180185378395296939, - 59137443146431362, - 55259630283032361, - 21888242871839275222246405745257275088548364400416034343698201070931527783898, - 67734102101856618, - 21888242871839275222246405745257275088548364400416034343698151914287700605567, - 60887570246759317, - 11739999978885933, - 21888242871839275222246405745257275088548364400416034343698180565861459437908, - 19906495925373535, - 21888242871839275222246405745257275088548364400416034343698161942327154287225, - 21888242871839275222246405745257275088548364400416034343698145215038250547903, - 21888242871839275222246405745257275088548364400416034343698182258901991008759, - 21888242871839275222246405745257275088548364400416034343698167244024125491398, - 58271009281823556, - 3195632309291810, - 68832144990763987, - 15761756650894785, - 21888242871839275222246405745257275088548364400416034343698164929199363380447, - 21888242871839275222246405745257275088548364400416034343698164353626136146464, - 13988981384837919, - 33247233215646531, - 20966188115953117, - 62059628580424319, - 21888242871839275222246405745257275088548364400416034343698145668640975536605, - 57876669511106361, - 21888242871839275222246405745257275088548364400416034343698163248542237348037, - 46372061889183624, - 21888242871839275222246405745257275088548364400416034343698167994434121971313, - 16818740710694225, - 1566147943771863, - 9615941960485923, - 46385449391494585, - 21888242871839275222246405745257275088548364400416034343698166432606643236354, - 21888242871839275222246405745257275088548364400416034343698197877532849919179, - 21888242871839275222246405745257275088548364400416034343698178676429659861427, - 34430948077346271, - 21888242871839275222246405745257275088548364400416034343698196622257401179880, - 5637600188613944, - 21888242871839275222246405745257275088548364400416034343698196279550431053171, - 13015338663365355, - 21888242871839275222246405745257275088548364400416034343698182176070611498076, - 30323606077596316, - 58488151508887911, - 21888242871839275222246405745257275088548364400416034343698150502563846341508, - 30297826472488858, - 32581347775623927, - 21888242871839275222246405745257275088548364400416034343698161906599375219396, - 21888242871839275222246405745257275088548364400416034343698201427090862227673, - 21888242871839275222246405745257275088548364400416034343698189615099652724202, - 21888242871839275222246405745257275088548364400416034343698153821166899435579, - 21888242871839275222246405745257275088548364400416034343698161950987419538769, - 21888242871839275222246405745257275088548364400416034343698194025931571675251, - 21888242871839275222246405745257275088548364400416034343698177829888685365057, - 51395980870757328, - 21888242871839275222246405745257275088548364400416034343698137916172961186457, - 21888242871839275222246405745257275088548364400416034343698164015891624907627, - 30836891426253113, - 21888242871839275222246405745257275088548364400416034343698149997560476585012, - 59427290103982757, - 21888242871839275222246405745257275088548364400416034343698139551549186938490, - 59747685457657617, - 21888242871839275222246405745257275088548364400416034343698162512278504594743, - 4707401939088399, - 39985569349520144, - 6188565053089120, - 21888242871839275222246405745257275088548364400416034343698186750683614925144, - 21888242871839275222246405745257275088548364400416034343698144866921541814915, - 21888242871839275222246405745257275088548364400416034343698149916266917664951, - 21888242871839275222246405745257275088548364400416034343698152271345554306162, - 49287161036206053, - 21888242871839275222246405745257275088548364400416034343698202025064253515924, - 8987793231656208, - 21888242871839275222246405745257275088548364400416034343698184671091577227361, - 21888242871839275222246405745257275088548364400416034343698133342705164601770, - 21888242871839275222246405745257275088548364400416034343698189136275706587566, - 56340054433910961, - 21888242871839275222246405745257275088548364400416034343698139270563188695280, - 21888242871839275222246405745257275088548364400416034343698192206655303452851, - 25553459581419181, - 21888242871839275222246405745257275088548364400416034343698197540630315644756, - 49987071441688874, - 21888242871839275222246405745257275088548364400416034343698183983600995052936, - 11136460280452277, - 49256480586570850, - 21888242871839275222246405745257275088548364400416034343698156188710753488938, - 40608719708851012, - 21888242871839275222246405745257275088548364400416034343698168680489507811881, - 21888242871839275222246405745257275088548364400416034343698168700244298400508, - 57729097576689158, - 38986422906237889, - 21888242871839275222246405745257275088548364400416034343698137789438115624393, - 13165741808100732, - 37979833525616422, - 21888242871839275222246405745257275088548364400416034343698166105765297855313, - 21888242871839275222246405745257275088548364400416034343698192317810382051121, - 50507257803923279, - 55408983691923171, - 50643607887150563, - 21888242871839275222246405745257275088548364400416034343698173872747216701007, - 3022401491473638, - 21888242871839275222246405745257275088548364400416034343698133560636105351095, - 4114840764955808, - 9778107721923347, - 43032981112217859, - 21888242871839275222246405745257275088548364400416034343698153807692270003458, - 21888242871839275222246405745257275088548364400416034343698167829957086224756, - 64903168004527880, - 66606336173472554, - 21888242871839275222246405745257275088548364400416034343698139761943837686938, - 28720428442922051, - 48309886341141325, - 21888242871839275222246405745257275088548364400416034343698144002357938359710, - 52960852548294747, - 21888242871839275222246405745257275088548364400416034343698193097136748390031, - 21888242871839275222246405745257275088548364400416034343698158003570676551103, - 61911716048522367, - 21888242871839275222246405745257275088548364400416034343698145341025591604913, - 21888242871839275222246405745257275088548364400416034343698203770980830654161, - 35019197688616138, - 30744783971303622, - 21888242871839275222246405745257275088548364400416034343698143334156209607691, - 64297644680146844, - 70489921003422835, - 21888242871839275222246405745257275088548364400416034343698199226021443467801, - 21888242871839275222246405745257275088548364400416034343698153384542482877349, - 21888242871839275222246405745257275088548364400416034343698138103431160404114, - 21112116699207062, - 21888242871839275222246405745257275088548364400416034343698143396692421002591, - 20617155466106279, - 21888242871839275222246405745257275088548364400416034343698184669628799260270, - 21888242871839275222246405745257275088548364400416034343698200080424065123193, - 21888242871839275222246405745257275088548364400416034343698141517982226993224, - 50714400356826997, - 65104333820130388, - 3421936605803882, - 21888242871839275222246405745257275088548364400416034343698148683161130597051, - 21888242871839275222246405745257275088548364400416034343698198877276886028194, - 52616597548051935, - 38788620622136309, - 36715816335647438, - 21888242871839275222246405745257275088548364400416034343698165987116984850023, - 54291685763735642, - 24363408732497786, - 43962370016489382, - 21888242871839275222246405745257275088548364400416034343698155506668954089558, - 33048289953870915, - 34757466146586089, - 54527985657553235, - 21888242871839275222246405745257275088548364400416034343698168483256646418941, - 21888242871839275222246405745257275088548364400416034343698172161080676106177, - 21888242871839275222246405745257275088548364400416034343698194186865951992966, - 1735880731293689, - 21888242871839275222246405745257275088548364400416034343698154900567522585822, - 2942687429085231, - 21888242871839275222246405745257275088548364400416034343698154228933923066735, - 62232851908281689, - 21116362594505021, - 21888242871839275222246405745257275088548364400416034343698143433818126115569, - 71738308200987726, - 5884020753235613, - 26116200284858075, - 21888242871839275222246405745257275088548364400416034343698185458961997349852, - 62424692233199146, - 67705579554862345, - 49961861771470680, - 69169689134084617, - 7329992646265376, - 23184554214501272, - 23637638604185537, - 21888242871839275222246405745257275088548364400416034343698138118814551201860, - 21888242871839275222246405745257275088548364400416034343698195787460803831875, - 29147958338558180, - 21888242871839275222246405745257275088548364400416034343698189961667761571719, - 21888242871839275222246405745257275088548364400416034343698186048602499467673, - 21888242871839275222246405745257275088548364400416034343698167843977096093928, - 24891858869747299, - 21888242871839275222246405745257275088548364400416034343698184515919702691106, - 21888242871839275222246405745257275088548364400416034343698203394660426189288, - 66595941929063224, - 63945319684701344, - 21888242871839275222246405745257275088548364400416034343698158477377929332630, - 5037091989414690, - 21888242871839275222246405745257275088548364400416034343698183261210967496688, - 21888242871839275222246405745257275088548364400416034343698189363134084108820, - 37378694717803435, - 2065947853139185, - 50388633579783750, - 42941603311032102, - 31605546184354851, - 21888242871839275222246405745257275088548364400416034343698163503542306973712, - 69062266732345624, - 21888242871839275222246405745257275088548364400416034343698199620619002400716, - 11788854177319581, - 25230548678245462, - 17469563390238388, - 11519394304637094, - 21888242871839275222246405745257275088548364400416034343698187440955751004103, - 3001073542125869, - 66736120583255434, - 6415171461840639, - 9695058650059424, - 48589459373507471, - 52145034347472566, - 66114858348135574, - 31765155017802635, - 21888242871839275222246405745257275088548364400416034343698135535238329730483, - 13266308758354786, - 21888242871839275222246405745257275088548364400416034343698158244731480002653, - 48188268470400006, - 21888242871839275222246405745257275088548364400416034343698188465668151284335, - 21888242871839275222246405745257275088548364400416034343698156857013537692579, - 69423812350879075, - 21888242871839275222246405745257275088548364400416034343698173962013843502926, - 23401737617163312, - 21888242871839275222246405745257275088548364400416034343698179902837708830963, - 59298791283547003, - 41438139820956522, - 34989623597881696, - 59611122934601455, - 21888242871839275222246405745257275088548364400416034343698143486245020012799, - 2054774256114319, - 23947769569682424, - 25886680815810762, - 21888242871839275222246405745257275088548364400416034343698173740883315308874, - 62608250215164096, - 21888242871839275222246405745257275088548364400416034343698172114125273666746, - 21888242871839275222246405745257275088548364400416034343698203986670071290083, - 21888242871839275222246405745257275088548364400416034343698148635951558756085, - 53915654632066409, - 21888242871839275222246405745257275088548364400416034343698188372858228902349, - 21888242871839275222246405745257275088548364400416034343698153866652720844179, - 32434205781605046, - 21888242871839275222246405745257275088548364400416034343698196479502896216347, - 21888242871839275222246405745257275088548364400416034343698203134164784978494, - 42463203946070386, - 21888242871839275222246405745257275088548364400416034343698138319478553911081, - 21846826559516595, - 21888242871839275222246405745257275088548364400416034343698145909921507650526, - 21888242871839275222246405745257275088548364400416034343698157150000860600177, - 21888242871839275222246405745257275088548364400416034343698201215796558612440, - 49140944783400783, - 21888242871839275222246405745257275088548364400416034343698161079837360535752, - 21888242871839275222246405745257275088548364400416034343698176983414279031810, - 58336729584463077, - 21888242871839275222246405745257275088548364400416034343698134133090197385088, - 21888242871839275222246405745257275088548364400416034343698182170359694438185, - 67896439287843235, - 48584950994131177, - 21888242871839275222246405745257275088548364400416034343698175831457727567492, - 31517646550416047, - 60524028559147331, - 21888242871839275222246405745257275088548364400416034343698168101709911234916, - 24735382614002922, - 54802885704762677, - 29238555236789881, - 21888242871839275222246405745257275088548364400416034343698183771430992451338, - 21888242871839275222246405745257275088548364400416034343698178045234207392683, - 55622533353674073, - 40493020418222757, - 21888242871839275222246405745257275088548364400416034343698152647835235506028, - 32065129972014839, - 36331730184156951, - 23180377063595018, - 23134057263965852, - 21888242871839275222246405745257275088548364400416034343698152980591006577726, - 21888242871839275222246405745257275088548364400416034343698170521728393117031, - 56245419561626398, - 21888242871839275222246405745257275088548364400416034343698161002045055558857, - 21888242871839275222246405745257275088548364400416034343698160337363024461717, - 47113739572933681, - 21888242871839275222246405745257275088548364400416034343698200066306756710257, - 21888242871839275222246405745257275088548364400416034343698195524038182397923, - 32856609366768271, - 21888242871839275222246405745257275088548364400416034343698163969592016585134, - 21888242871839275222246405745257275088548364400416034343698155625478058762483, - 14895730193160698, - 21888242871839275222246405745257275088548364400416034343698150903759107116406, - 21888242871839275222246405745257275088548364400416034343698133251490708362629, - 46585652144372209, - 64219340521393348, - 21888242871839275222246405745257275088548364400416034343698198906122357570438, - 21888242871839275222246405745257275088548364400416034343698201086426566834705, - 21888242871839275222246405745257275088548364400416034343698136189440556409395, - 17148157094912984, - 21888242871839275222246405745257275088548364400416034343698167728770287095715, - 21888242871839275222246405745257275088548364400416034343698181319524565922315, - 21888242871839275222246405745257275088548364400416034343698199976629121832342, - 21888242871839275222246405745257275088548364400416034343698167844835383787491, - 57448906054770495, - 21888242871839275222246405745257275088548364400416034343698186332059221037995, - 21888242871839275222246405745257275088548364400416034343698170572107826025231, - 21888242871839275222246405745257275088548364400416034343698175130029794974581, - 21888242871839275222246405745257275088548364400416034343698172128844938916368, - 19697124418882689, - 12136566440671640, - 21888242871839275222246405745257275088548364400416034343698158775686650695562, - 68608301769906023, - 45609416979819912, - 68467194812832597, - 21888242871839275222246405745257275088548364400416034343698195131601655380636, - 38519605557464229, - 21888242871839275222246405745257275088548364400416034343698138909406164560085, - 11557481563343517, - 21888242871839275222246405745257275088548364400416034343698187959991601110873, - 26556955576386962, - 58522241961718138, - 21888242871839275222246405745257275088548364400416034343698203583547649357174, - 21888242871839275222246405745257275088548364400416034343698181648986922600124, - 21888242871839275222246405745257275088548364400416034343698143005099363022824, - 21888242871839275222246405745257275088548364400416034343698161631950628575051, - 21888242871839275222246405745257275088548364400416034343698148375543676251231, - 35490631805014575, - 3808264296374073, - 31243852895159979, - 49258654937295656, - 21888242871839275222246405745257275088548364400416034343698149198205353143332, - 68240769968193565, - 21888242871839275222246405745257275088548364400416034343698169471871265564759, - 21888242871839275222246405745257275088548364400416034343698137253916052860529, - 21888242871839275222246405745257275088548364400416034343698145458092121419872, - 21888242871839275222246405745257275088548364400416034343698169764785336002440, - 21888242871839275222246405745257275088548364400416034343698185266144840857058, - 56575313478077379, - 21888242871839275222246405745257275088548364400416034343698172866485184008300, - 15579855294815147, - 14287681508984492, - 69081613903785929, - 21888242871839275222246405745257275088548364400416034343698133994521123117452, - 14988108788814966, - 55096297935797180, - 21888242871839275222246405745257275088548364400416034343698153201076136298512, - 21888242871839275222246405745257275088548364400416034343698194792077567875690, - 21888242871839275222246405745257275088548364400416034343698138421572605330912, - 21888242871839275222246405745257275088548364400416034343698190746295600940624, - 21888242871839275222246405745257275088548364400416034343698137984882711417479, - 21888242871839275222246405745257275088548364400416034343698168428987042394255, - 26441951853167409, - 21888242871839275222246405745257275088548364400416034343698136128052912423559, - 44394232607645798, - 60022171788092548, - 11882866068299081, - 65048008072631395, - 30296377023528039, - 21888242871839275222246405745257275088548364400416034343698168353268074168154, - 71137744538494234, - 21888242871839275222246405745257275088548364400416034343698148099998101035500, - 68368990856969918, - 37544190808044330, - 21888242871839275222246405745257275088548364400416034343698138278701028265899, - 21888242871839275222246405745257275088548364400416034343698198357001903733051, - 28922878391585661, - 55467111617851937, - 21888242871839275222246405745257275088548364400416034343698180282597768937528, - 56884041617332299, - 21888242871839275222246405745257275088548364400416034343698143206154207356410, - 37460761929079157, - 21888242871839275222246405745257275088548364400416034343698143036928984133341, - 21888242871839275222246405745257275088548364400416034343698147308410264856795, - 8736256065886541, - 46178059318258043, - 21888242871839275222246405745257275088548364400416034343698183137021905739020, - 21888242871839275222246405745257275088548364400416034343698135960502081935639, - 21888242871839275222246405745257275088548364400416034343698175979433027788531, - 21888242871839275222246405745257275088548364400416034343698160261787144106252, - 10470177886084875, - 21888242871839275222246405745257275088548364400416034343698157375519914970093, - 29038976257872503, - 21888242871839275222246405745257275088548364400416034343698144173772926757915, - 21888242871839275222246405745257275088548364400416034343698203385585591035412, - 21888242871839275222246405745257275088548364400416034343698167161879964383904, - 21888242871839275222246405745257275088548364400416034343698188245028399394101, - 16295536026853421, - 4159514952635259, - 21888242871839275222246405745257275088548364400416034343698175904902869682338, - 21888242871839275222246405745257275088548364400416034343698143249716221946207, - 30780262197485094, - 21431479813084693, - 21888242871839275222246405745257275088548364400416034343698177947363335903216, - 21888242871839275222246405745257275088548364400416034343698202369866658836113, - 63666394774736218, - 21888242871839275222246405745257275088548364400416034343698159706479592457836, - 71335536334574724, - 27458527084623963, - 21888242871839275222246405745257275088548364400416034343698157576798579307711, - 25461877949911067, - 1666274257433193, - 21888242871839275222246405745257275088548364400416034343698137542967036458795, - 17461249826917838, - 50573268424806757, - 21888242871839275222246405745257275088548364400416034343698180329797948105628, - 50633771855719249, - 21888242871839275222246405745257275088548364400416034343698165118035412850417, - 36144444855107273, - 54450069290537349, - 21888242871839275222246405745257275088548364400416034343698140525071480339982, - 49884712949783719, - 21888242871839275222246405745257275088548364400416034343698160017810492206515, - 21888242871839275222246405745257275088548364400416034343698165895075283467549, - 5902904575947760, - 21888242871839275222246405745257275088548364400416034343698136841209697102117, - 21888242871839275222246405745257275088548364400416034343698192946532197929940, - 21888242871839275222246405745257275088548364400416034343698139090796510636698, - 53666679501700855, - 21888242871839275222246405745257275088548364400416034343698201025617219642145, - 21888242871839275222246405745257275088548364400416034343698172255320140525818, - 23920518981043918, - 21888242871839275222246405745257275088548364400416034343698154342362677573854, - 32166518303904282, - 21888242871839275222246405745257275088548364400416034343698177908953245490490, - 2774098378800946, - 42168734328915178, - 34849809001494847, - 21888242871839275222246405745257275088548364400416034343698190404758491911169, - 5642214794087928, - 21888242871839275222246405745257275088548364400416034343698151899040933876422, - 21888242871839275222246405745257275088548364400416034343698201861818483433944, - 21888242871839275222246405745257275088548364400416034343698137364984600323619, - 21888242871839275222246405745257275088548364400416034343698196348286081497519, - 21888242871839275222246405745257275088548364400416034343698189681905823671075, - 51248264934805549, - 38441093780654339, - 37213527563727514, - 21888242871839275222246405745257275088548364400416034343698158070538122195052, - 39965596968327712, - 68900431552200193, - 21888242871839275222246405745257275088548364400416034343698143690838879095057, - 9546898720715273, - 21888242871839275222246405745257275088548364400416034343698153770818274125148, - 65747832752917332, - 21888242871839275222246405745257275088548364400416034343698164475855682683215, - 71196299854269366, - 21888242871839275222246405745257275088548364400416034343698172956932716667275, - 21888242871839275222246405745257275088548364400416034343698137934608125942731, - 21888242871839275222246405745257275088548364400416034343698188448793151280913, - 24935300045659491, - 21888242871839275222246405745257275088548364400416034343698139522852812908504, - 69889739673570217, - 21888242871839275222246405745257275088548364400416034343698139778455753690358, - 40801365153012080, - 16592334313845783, - 21888242871839275222246405745257275088548364400416034343698174604081660669712, - 21888242871839275222246405745257275088548364400416034343698162408072279194985, - 21888242871839275222246405745257275088548364400416034343698164296749465017557, - 43460000556717230, - 7520279486674110, - 40219778401408416, - 32843950115225869, - 21888242871839275222246405745257275088548364400416034343698162258290280857523, - 21888242871839275222246405745257275088548364400416034343698161044562089676092, - 21888242871839275222246405745257275088548364400416034343698179898628131557880, - 21888242871839275222246405745257275088548364400416034343698183349906989334754, - 21888242871839275222246405745257275088548364400416034343698152223551089013388, - 36528784166982889, - 38078463812566226, - 64568247716604382, - 33738508332561757, - 32084917754201129, - 21888242871839275222246405745257275088548364400416034343698185597710467452285, - 21888242871839275222246405745257275088548364400416034343698165876618254107396, - 21888242871839275222246405745257275088548364400416034343698137066315034475894, - 21888242871839275222246405745257275088548364400416034343698192372604273967697, - 21888242871839275222246405745257275088548364400416034343698183687200583585210, - 21888242871839275222246405745257275088548364400416034343698193251548712499360, - 21888242871839275222246405745257275088548364400416034343698178156056762408367, - 10725688470579490, - 21888242871839275222246405745257275088548364400416034343698135244633137253468, - 35519930620403361, - 21888242871839275222246405745257275088548364400416034343698174297801109091562, - 21888242871839275222246405745257275088548364400416034343698157781212685962305, - 46241621921153180, - 21888242871839275222246405745257275088548364400416034343698162181852499153246, - 21888242871839275222246405745257275088548364400416034343698184264218952311011, - 4983597361577481, - 21888242871839275222246405745257275088548364400416034343698138409418644069504, - 45246992335502191, - 40669915698650376, - 42178953504647698, - 1064816017643495, - 21888242871839275222246405745257275088548364400416034343698143869298143361468, - 53709449223222109, - 47356260558989775, - 61180032111320457, - 63579952720084334, - 21888242871839275222246405745257275088548364400416034343698190895758278387289, - 21888242871839275222246405745257275088548364400416034343698200618415866613263, - 51793915591665685, - 21888242871839275222246405745257275088548364400416034343698139132366577604781, - 66730007410486726, - 49032318199899389, - 21888242871839275222246405745257275088548364400416034343698171867510095294341, - 21888242871839275222246405745257275088548364400416034343698189207676499859689, - 5941283722509632, - 27344211952959604, - 71428783963541220, - 28601549636367016, - 71790085541202043, - 21888242871839275222246405745257275088548364400416034343698158358090179033139, - 11813177499673301, - 21888242871839275222246405745257275088548364400416034343698182380260266294282, - 21888242871839275222246405745257275088548364400416034343698141766884097037667, - 21888242871839275222246405745257275088548364400416034343698162625203485498366, - 56040278768999491, - 5132911270131833, - 21888242871839275222246405745257275088548364400416034343698159781846959089035, - 21888242871839275222246405745257275088548364400416034343698148767713104661028, - 21888242871839275222246405745257275088548364400416034343698142230795885762703, - 42159111030855708, - 30948456385744159, - 21888242871839275222246405745257275088548364400416034343698185730282379045393, - 21888242871839275222246405745257275088548364400416034343698190421286215217785, - 23868831040132450, - 39097173675619612, - 33589656285317836, - 21888242871839275222246405745257275088548364400416034343698170811053073288124, - 52375103437654857, - 21888242871839275222246405745257275088548364400416034343698167715798400040335, - 21888242871839275222246405745257275088548364400416034343698161062489678961172, - 34984863411202985, - 21888242871839275222246405745257275088548364400416034343698198081841543215622, - 56814059730324967, - 21888242871839275222246405745257275088548364400416034343698155083179107825909, - 21888242871839275222246405745257275088548364400416034343698184844699392725853, - 21888242871839275222246405745257275088548364400416034343698140144415892262056, - 47467813388959754, - 21888242871839275222246405745257275088548364400416034343698200379610250584377, - 5789018079809392, - 49652598974907044, - 21888242871839275222246405745257275088548364400416034343698156097557137544023, - 65691965240092589, - 69415576952845585, - 21888242871839275222246405745257275088548364400416034343698132541060599495407, - 21888242871839275222246405745257275088548364400416034343698196281649066432403, - 21888242871839275222246405745257275088548364400416034343698193462057918127657, - 14612799238252131, - 16768609577307872, - 71885990156691707, - 36257612158096821, - 29436100969369303, - 21888242871839275222246405745257275088548364400416034343698153923745656826997, - 21888242871839275222246405745257275088548364400416034343698193203810788761475, - 21888242871839275222246405745257275088548364400416034343698201196050906868054, - 43725208065328176, - 21888242871839275222246405745257275088548364400416034343698178531872995799286, - 46193147416484135, - 69514421701454770, - 21888242871839275222246405745257275088548364400416034343698146356339148806067, - 63108023898863599, - 21888242871839275222246405745257275088548364400416034343698132638051548603420, - 21888242871839275222246405745257275088548364400416034343698193769382599840508, - 21888242871839275222246405745257275088548364400416034343698143804900929226215, - 21127213518485109, - 21888242871839275222246405745257275088548364400416034343698142432780682322965, - 21888242871839275222246405745257275088548364400416034343698162653206424332190, - 21888242871839275222246405745257275088548364400416034343698197361281661972352, - 21888242871839275222246405745257275088548364400416034343698152901267407112497, - 63529272864203928, - 21888242871839275222246405745257275088548364400416034343698169233825699190840, - 21888242871839275222246405745257275088548364400416034343698194084735834949308, - 33159821020866098, - 21888242871839275222246405745257275088548364400416034343698164131243960007978, - 21888242871839275222246405745257275088548364400416034343698190987853736846839, - 10579723864576391, - 2973290144982471, - 55420719279734768, - 21888242871839275222246405745257275088548364400416034343698135829095599698240, - 21888242871839275222246405745257275088548364400416034343698174495034943963478, - 21888242871839275222246405745257275088548364400416034343698158643474952844122, - 1164769383899489, - 12752197280973907, - 48115441241237222, - 21888242871839275222246405745257275088548364400416034343698190130165446860793, - 21888242871839275222246405745257275088548364400416034343698177437912732920859, - 45131917934530649, - 21888242871839275222246405745257275088548364400416034343698163611855686825534, - 14488887023321408, - 21888242871839275222246405745257275088548364400416034343698148262395404654718, - 64513319412817228, - 8176127471427929, - 15619569089013904, - 2071746674090365, - 21888242871839275222246405745257275088548364400416034343698150837193954500150, - 44641044305427229, - 21888242871839275222246405745257275088548364400416034343698164561290924028154, - 21888242871839275222246405745257275088548364400416034343698152985277863491072, - 59437406924307915, - 28602402512687879, - 21888242871839275222246405745257275088548364400416034343698135119900819154731, - 21888242871839275222246405745257275088548364400416034343698159995183236013532, - 42391617259948497, - 21888242871839275222246405745257275088548364400416034343698132201263162411584, - 21888242871839275222246405745257275088548364400416034343698158789333890038691, - 21888242871839275222246405745257275088548364400416034343698181152014929718772, - 62223383746285456, - 21888242871839275222246405745257275088548364400416034343698143028522284927163, - 21888242871839275222246405745257275088548364400416034343698138272604017589190, - 17064106207240194, - 18399650254160042, - 21888242871839275222246405745257275088548364400416034343698157450537132789496, - 21888242871839275222246405745257275088548364400416034343698142000068335738726, - 22738414387383113, - 66427130715128900, - 39637175251826436, - 21888242871839275222246405745257275088548364400416034343698153242638257405728, - 62101078925116747, - 10462806553438922, - 15708380930432427, - 56967896819954251, - 5482028170133532, - 21888242871839275222246405745257275088548364400416034343698177314243973521457, - 41016385905621178, - 9361662372476579, - 45175998543995967, - 21888242871839275222246405745257275088548364400416034343698141429390263258368, - 21888242871839275222246405745257275088548364400416034343698152214838135478132, - 30907934937603040, - 69641417913775892, - 59074881649884096, - 21888242871839275222246405745257275088548364400416034343698138959146234907410, - 28776825268055566, - 32082321702242446, - 26083430937402725, - 21888242871839275222246405745257275088548364400416034343698144263652716829474, - 21888242871839275222246405745257275088548364400416034343698185180049570832429, - 9157443295192507, - 21888242871839275222246405745257275088548364400416034343698161251177135469088, - 21888242871839275222246405745257275088548364400416034343698187293075160588648, - 68444379856556895, - 21888242871839275222246405745257275088548364400416034343698201702592265002906, - 68747171263982623, - 58641878123795237, - 21888242871839275222246405745257275088548364400416034343698140532377003675224, - 55957132213567008, - 21888242871839275222246405745257275088548364400416034343698169755317047396469, - 21888242871839275222246405745257275088548364400416034343698204037921684801066, - 43639903956534276, - 21888242871839275222246405745257275088548364400416034343698158468366844351396, - 21888242871839275222246405745257275088548364400416034343698152499335025605671, - 21888242871839275222246405745257275088548364400416034343698146330541874026672, - 8635936003559808, - 63383886447981112, - 71472864925750334, - 21888242871839275222246405745257275088548364400416034343698193261975401215298, - 21888242871839275222246405745257275088548364400416034343698197193239945903588, - 71172847302027290, - 21888242871839275222246405745257275088548364400416034343698151029682381479120, - 7433287682908561, - 21888242871839275222246405745257275088548364400416034343698171214078363516207, - 21888242871839275222246405745257275088548364400416034343698178242162971905006, - 21888242871839275222246405745257275088548364400416034343698172436875676382343, - 21888242871839275222246405745257275088548364400416034343698143601253988464515, - 21888242871839275222246405745257275088548364400416034343698178667295652819592, - 21888242871839275222246405745257275088548364400416034343698163255854389124058, - 21888242871839275222246405745257275088548364400416034343698169046065895357163, - 29800878239060782, - 21888242871839275222246405745257275088548364400416034343698136610014524328449, - 29265195056431733, - 62044155803842985, - 69115007878399961, - 21888242871839275222246405745257275088548364400416034343698176796832504670943, - 21888242871839275222246405745257275088548364400416034343698172472205059259569, - 21888242871839275222246405745257275088548364400416034343698176391665803857250, - 21888242871839275222246405745257275088548364400416034343698173743820517474932, - 58671171583785494, - 34198575716892085, - 21888242871839275222246405745257275088548364400416034343698171911317620497755, - 21888242871839275222246405745257275088548364400416034343698187957684252333317, - 70979723538253723, - 45841230088338296, - 31137866716542957, - 21888242871839275222246405745257275088548364400416034343698185784075872334965, - 63550873593932815, - 21888242871839275222246405745257275088548364400416034343698175718527552181039, - 69671841842287672, - 37981124343747556, - 57306709518033234, - 21888242871839275222246405745257275088548364400416034343698145294454396844808, - 13723093974992667, - 22485092369580408, - 21888242871839275222246405745257275088548364400416034343698182200374394306071, - 21888242871839275222246405745257275088548364400416034343698184552552812668765, - 21888242871839275222246405745257275088548364400416034343698204146791262770563, - 21888242871839275222246405745257275088548364400416034343698168984139585543819, - 12066693679831746, - 55689195791671372, - 21888242871839275222246405745257275088548364400416034343698138393608916699596, - 26764994642939370, - 21888242871839275222246405745257275088548364400416034343698151231055402402014, - 21888242871839275222246405745257275088548364400416034343698155268610995319317, - 27995127430725694, - 50628768785311807, - 21888242871839275222246405745257275088548364400416034343698135852496209254498, - 595688642511009, - 32283130237017152, - 21888242871839275222246405745257275088548364400416034343698202913783916809894, - 50466434314061633, - 24701210532378406, - 21888242871839275222246405745257275088548364400416034343698145402139079339352, - 21888242871839275222246405745257275088548364400416034343698158140142720231197, - 60134203740192075, - 21888242871839275222246405745257275088548364400416034343698151929928255031098, - 21888242871839275222246405745257275088548364400416034343698135888367258060408, - 61635665377415406, - 12443908922970453, - 21888242871839275222246405745257275088548364400416034343698200657117097572671, - 30862805919441507, - 14712666804636253, - 51185631415413060, - 21888242871839275222246405745257275088548364400416034343698199269375862958733, - 62484656318375375, - 21888242871839275222246405745257275088548364400416034343698200497116673073521, - 71081910112284104, - 21888242871839275222246405745257275088548364400416034343698140026948433482549, - 56102409296816036, - 21888242871839275222246405745257275088548364400416034343698177488062104994045, - 21888242871839275222246405745257275088548364400416034343698153955437171122627, - 4972947628250410, - 21888242871839275222246405745257275088548364400416034343698141419975245020890, - 21888242871839275222246405745257275088548364400416034343698199345997687269482, - 67140482620873285, - 21888242871839275222246405745257275088548364400416034343698169006437666637524, - 21888242871839275222246405745257275088548364400416034343698153769844091616155, - 57162029881644527, - 21888242871839275222246405745257275088548364400416034343698200389505430353500, - 21888242871839275222246405745257275088548364400416034343698202038495314045466, - 70039919556039023, - 21888242871839275222246405745257275088548364400416034343698186482689232574450, - 21888242871839275222246405745257275088548364400416034343698192607851652443303, - 68893007903819195, - 21888242871839275222246405745257275088548364400416034343698153116713983692949, - 21888242871839275222246405745257275088548364400416034343698193834141952209596, - 21888242871839275222246405745257275088548364400416034343698178963581805451996, - 21888242871839275222246405745257275088548364400416034343698134998388517988450, - 21888242871839275222246405745257275088548364400416034343698193634965551805711, - 15621197543895164, - 13337338068394254, - 21888242871839275222246405745257275088548364400416034343698139327619299200676, - 21888242871839275222246405745257275088548364400416034343698202486877659904881, - 21888242871839275222246405745257275088548364400416034343698188236981352144880, - 21888242871839275222246405745257275088548364400416034343698164893614472634579, - 21888242871839275222246405745257275088548364400416034343698147940428967099507, - 22328739970221540, - 68518590146852501, - 46535068578206453, - 23151427352004212, - 47264279011447237, - 65100166180516352, - 21888242871839275222246405745257275088548364400416034343698196869453742533799, - 21888242871839275222246405745257275088548364400416034343698142354364531076211, - 14282062843950444, - 25705797731247555, - 21888242871839275222246405745257275088548364400416034343698140776162636926548, - 29401553546193460, - 21888242871839275222246405745257275088548364400416034343698156561049078407619, - 21888242871839275222246405745257275088548364400416034343698142940810851434642, - 21888242871839275222246405745257275088548364400416034343698189572505245325029, - 21888242871839275222246405745257275088548364400416034343698150789127851296504, - 57007037789330078, - 11260815210442134, - 61689078061778589, - 21888242871839275222246405745257275088548364400416034343698172512209559521742, - 63442341964941113, - 21888242871839275222246405745257275088548364400416034343698169482841939073184, - 14155825211766898, - 55285942961778484, - 52648044292170000, - 67698054514078930, - 33904712620225390, - 47938025525769960, - 21888242871839275222246405745257275088548364400416034343698203764148826892749, - 21888242871839275222246405745257275088548364400416034343698183055345870793530, - 21888242871839275222246405745257275088548364400416034343698163381206340701885, - 21888242871839275222246405745257275088548364400416034343698181162742256586655, - 44757762818769934, - 21888242871839275222246405745257275088548364400416034343698164777447029568711, - 21888242871839275222246405745257275088548364400416034343698164156464079172634, - 21888242871839275222246405745257275088548364400416034343698180360263352326009, - 21888242871839275222246405745257275088548364400416034343698142414224974597928, - 52694571907624820, - 18782660426747535, - 56726904191909534, - 55807411387416540, - 21888242871839275222246405745257275088548364400416034343698199079101582978948, - 21888242871839275222246405745257275088548364400416034343698142430839300488660, - 25035562863534790, - 45987874159542046, - 46864444556508984, - 21888242871839275222246405745257275088548364400416034343698155542034874369298, - 48253869716834409, - 21888242871839275222246405745257275088548364400416034343698179939489860776064, - 21888242871839275222246405745257275088548364400416034343698146036971456559574, - 21888242871839275222246405745257275088548364400416034343698197581703409049081, - 21888242871839275222246405745257275088548364400416034343698182721279940069983, - 504934176301954, - 21888242871839275222246405745257275088548364400416034343698140588531636100914, - 21888242871839275222246405745257275088548364400416034343698192318944617532004, - 16944910861673332, - 33660172505568929, - 9180853231215420, - 14746405248784918, - 21888242871839275222246405745257275088548364400416034343698138179051561847849, - 21888242871839275222246405745257275088548364400416034343698152680012732818768, - 4828263735433465, - 13174969318261472, - 68982706002181223, - 21697213695295605, - 1853657708236713, - 21888242871839275222246405745257275088548364400416034343698189729853202379845, - 53013441133768625, - 47261432180852910, - 21888242871839275222246405745257275088548364400416034343698150869744207288267, - 14818885037647022, - 65328227648672340, - 44527050337291255, - 44478713561271475, - 59337862555228742, - 32399106456377119, - 21888242871839275222246405745257275088548364400416034343698174022741904560215, - 21888242871839275222246405745257275088548364400416034343698192387877901372906, - 42841433492650302, - 21888242871839275222246405745257275088548364400416034343698175115774006477109, - 11775878038776047, - 21888242871839275222246405745257275088548364400416034343698135768221011176894, - 8351074688746465, - 11363173111928156, - 21888242871839275222246405745257275088548364400416034343698142195045764862162, - 4357688233706387, - 62104383043939643, - 70969301334292042, - 67514858124705226, - 53536125283660874, - 6181646342056450, - 15443217271116358, - 21888242871839275222246405745257275088548364400416034343698176433380521900613, - 21888242871839275222246405745257275088548364400416034343698168538947034452655, - 61876475588277835, - 21888242871839275222246405745257275088548364400416034343698160749025179303568, - 21888242871839275222246405745257275088548364400416034343698179163091097057508, - 21888242871839275222246405745257275088548364400416034343698138579594288888779, - 38228059163830285, - 33307654338301096, - 52940911013050975, - 21888242871839275222246405745257275088548364400416034343698197429655526974000, - 21888242871839275222246405745257275088548364400416034343698179006086290817805, - 21888242871839275222246405745257275088548364400416034343698199315496306807077, - 43241106091173825, - 24662761894356008, - 21888242871839275222246405745257275088548364400416034343698136861251564713472, - 21888242871839275222246405745257275088548364400416034343698165482727556735064, - 21888242871839275222246405745257275088548364400416034343698170562850949438642, - 70458128466940168, - 21888242871839275222246405745257275088548364400416034343698180292520152695891, - 32560801036612812, - 21888242871839275222246405745257275088548364400416034343698156394146930670418, - 21888242871839275222246405745257275088548364400416034343698143638736414079803, - 19087490880172505, - 21888242871839275222246405745257275088548364400416034343698177936660701418813, - 21888242871839275222246405745257275088548364400416034343698192352794228391860, - 35111981944484869, - 30420453635267507, - 21888242871839275222246405745257275088548364400416034343698161841507458093813, - 21888242871839275222246405745257275088548364400416034343698158773501356684626, - 49893729760144151, - 21888242871839275222246405745257275088548364400416034343698144014044077625810, - 21888242871839275222246405745257275088548364400416034343698163931388328131488, - 66292745609918662, - 42200434351936214, - 50074161280314118, - 19563483444980134, - 48609024702477152, - 52635454102995050, - 31268314820025976, - 21888242871839275222246405745257275088548364400416034343698195298687916179272, - 33383689067362900, - 21888242871839275222246405745257275088548364400416034343698132146024973124827, - 21888242871839275222246405745257275088548364400416034343698154884660986222933, - 50919710490336494, - 21888242871839275222246405745257275088548364400416034343698143219373968323790, - 56063705370545112, - 21888242871839275222246405745257275088548364400416034343698187182810893386790, - 47022322524021475, - 41865959179580721, - 39228887214441221, - 24155786016162373, - 57947516178912694, - 70013769911520956, - 9035827057919700, - 21888242871839275222246405745257275088548364400416034343698153163325667039869, - 26876908296267266, - 21888242871839275222246405745257275088548364400416034343698182688253583180820, - 21888242871839275222246405745257275088548364400416034343698168058422525122371, - 7658176084147911, - 21888242871839275222246405745257275088548364400416034343698154962449133924213, - 21888242871839275222246405745257275088548364400416034343698173290014665892801, - 21888242871839275222246405745257275088548364400416034343698200754527558079456, - 21888242871839275222246405745257275088548364400416034343698148959185999635830, - 16567179571895642, - 66525539655848922, - 21888242871839275222246405745257275088548364400416034343698202964320158022302, - 21888242871839275222246405745257275088548364400416034343698180233486616052967, - 38914106197141439, - 34913619439399179, - 49697313968007753, - 6972192126523852, - 21888242871839275222246405745257275088548364400416034343698139447771500593370, - 21888242871839275222246405745257275088548364400416034343698139660597955340127, - 1578684460573750, - 63290524671107392, - 21888242871839275222246405745257275088548364400416034343698143229963342644827, - 43093809177488772, - 21888242871839275222246405745257275088548364400416034343698133228300851814360, - 47255119827691336, - 48485174620615718, - 21888242871839275222246405745257275088548364400416034343698176397807165142528, - 26323145706664166, - 42275389248963106, - 62712872101404139, - 31518886933675282, - 58871333455498173, - 21888242871839275222246405745257275088548364400416034343698175827305181538775, - 21888242871839275222246405745257275088548364400416034343698168865130864131496, - 21888242871839275222246405745257275088548364400416034343698198839417075372560, - 21888242871839275222246405745257275088548364400416034343698168253321247297490, - 21888242871839275222246405745257275088548364400416034343698161113460788048848, - 21888242871839275222246405745257275088548364400416034343698196912007763131980, - 21888242871839275222246405745257275088548364400416034343698202536865264878443, - 27013850886988113, - 25297343687593077, - 57886135331397660, - 21888242871839275222246405745257275088548364400416034343698149321023565485517, - 21888242871839275222246405745257275088548364400416034343698139716042327813353, - 37232329005689551, - 21888242871839275222246405745257275088548364400416034343698177944041026311741, - 21888242871839275222246405745257275088548364400416034343698156930530377647416, - 21888242871839275222246405745257275088548364400416034343698156542109660499158, - 21888242871839275222246405745257275088548364400416034343698143160444641862806, - 21888242871839275222246405745257275088548364400416034343698149170861252571876, - 11482321287985252, - 70291770114400646, - 68769356897009882, - 21888242871839275222246405745257275088548364400416034343698168309843131017251, - 21888242871839275222246405745257275088548364400416034343698169163190879214302, - 47340730121959812, - 9262850613636141, - 16962987190660043, - 21888242871839275222246405745257275088548364400416034343698154031033695310246, - 56892018325816973, - 1419019619425759, - 25799964788705663, - 6255056519060218, - 21888242871839275222246405745257275088548364400416034343698185615314720008793, - 21888242871839275222246405745257275088548364400416034343698194094790330761343, - 43364910730260741, - 32394083451828096, - 21888242871839275222246405745257275088548364400416034343698182091847787428521, - 24670370974890940, - 21888242871839275222246405745257275088548364400416034343698189426549386554768, - 44757636737856732, - 21888242871839275222246405745257275088548364400416034343698195249632709935190, - 40396446858664558, - 17167998289139342, - 63734925855813332, - 3861956374432109, - 21888242871839275222246405745257275088548364400416034343698163997664574232549, - 6059292820346194, - 66856849751035702, - 7892700758455511, - 23954678428854050, - 53196753744371688, - 21888242871839275222246405745257275088548364400416034343698149994387973240194, - 62308318891675489, - 24909400962236989, - 48861548159502755, - 69642973500529113, - 69239863911599643, - 21888242871839275222246405745257275088548364400416034343698170669591440985214, - 21888242871839275222246405745257275088548364400416034343698179459095746613929, - 11754319495624850, - 34177911169124713, - 21888242871839275222246405745257275088548364400416034343698166395846250525803, - 5779757150111167, - 21888242871839275222246405745257275088548364400416034343698158547119444337599, - 2931409036567404, - 34509793233257274, - 7176422238975578, - 21888242871839275222246405745257275088548364400416034343698156080612913444123, - 21888242871839275222246405745257275088548364400416034343698159944264834966324, - 21888242871839275222246405745257275088548364400416034343698163080742946384347, - 21888242871839275222246405745257275088548364400416034343698176173170557461400, - 34172396464716443, - 21888242871839275222246405745257275088548364400416034343698157233032051265000, - 16310659120530281, - 29932389907044874, - 24035923269085431, - 24348284672960686, - 40692646103109048, - 21888242871839275222246405745257275088548364400416034343698135474964776509676, - 21888242871839275222246405745257275088548364400416034343698172713897894757118, - 51278360378025220, - 21888242871839275222246405745257275088548364400416034343698194501180027372297, - 45235541718554220, - 19311530296113851, - 21888242871839275222246405745257275088548364400416034343698185857525091741931, - 12144965526312600, - 21888242871839275222246405745257275088548364400416034343698159331805629509469, - 26173192337222632, - 2611853847479524, - 52686054378996018, - 13422408192792792, - 21888242871839275222246405745257275088548364400416034343698182684858251263290, - 7953802480678682, - 21888242871839275222246405745257275088548364400416034343698141800534140082554, - 12630503318243967, - 60435951853576559, - 70339268707476065, - 21888242871839275222246405745257275088548364400416034343698141220800005132138, - 23636508791342210, - 20325162266111874, - 69890320291478120, - 10767396739040806, - 21888242871839275222246405745257275088548364400416034343698137785142356244541, - 20022700772994063, - 21888242871839275222246405745257275088548364400416034343698191199334080308412, - 42614270521364520, - 21888242871839275222246405745257275088548364400416034343698163432180045282793, - 50253846379831521, - 21888242871839275222246405745257275088548364400416034343698168935458262994314, - 21888242871839275222246405745257275088548364400416034343698173428165924919015, - 21888242871839275222246405745257275088548364400416034343698176918136524797039, - 23483408806097510, - 21888242871839275222246405745257275088548364400416034343698137642404407869871, - 4764283002655234, - 14355396753483593, - 21888242871839275222246405745257275088548364400416034343698202787877250651384, - 21888242871839275222246405745257275088548364400416034343698186424806055239900, - 21888242871839275222246405745257275088548364400416034343698175584402404403055, - 21888242871839275222246405745257275088548364400416034343698133675420048566452, - 21888242871839275222246405745257275088548364400416034343698151197089168994208, - 21888242871839275222246405745257275088548364400416034343698185058399865435855, - 890835811342811, - 52071380288810291, - 21888242871839275222246405745257275088548364400416034343698160431614087912219, - 21888242871839275222246405745257275088548364400416034343698158107033566898444, - 21888242871839275222246405745257275088548364400416034343698192572959866875872, - 21888242871839275222246405745257275088548364400416034343698179186744005628429, - 56153942694760509, - 66342310957135979, - 64424389873238375, - 70212285297994150, - 24264422945146899, - 57903789293978729, - 1090595406391694, - 41484357960747740, - 21888242871839275222246405745257275088548364400416034343698152164109887601334, - 69600927734190973, - 68842150905943448, - 51059578631113297, - 65324811742331973, - 45145871674805483, - 18808664059164774, - 21888242871839275222246405745257275088548364400416034343698179052440583024431, - 21888242871839275222246405745257275088548364400416034343698187589481928905789, - 9433678919779553, - 48761819169074869, - 63348202671644179, - 21888242871839275222246405745257275088548364400416034343698140086565660996440, - 21888242871839275222246405745257275088548364400416034343698132219657997814061, - 21888242871839275222246405745257275088548364400416034343698183317715069274547, - 19965477550781871, - 21888242871839275222246405745257275088548364400416034343698194692416698798477, - 21888242871839275222246405745257275088548364400416034343698172115502061846857, - 58183109438769515, - 21888242871839275222246405745257275088548364400416034343698141205228285317767, - 21888242871839275222246405745257275088548364400416034343698203929381680643242, - 21888242871839275222246405745257275088548364400416034343698170809873691968750, - 36584872397963918, - 66664217819410949, - 53835196379214544, - 21888242871839275222246405745257275088548364400416034343698132610627150248691, - 21888242871839275222246405745257275088548364400416034343698178037773496065956, - 63695260551207123, - 21888242871839275222246405745257275088548364400416034343698139668251785555787, - 15808595362225038, - 21888242871839275222246405745257275088548364400416034343698156325783914195848, - 21888242871839275222246405745257275088548364400416034343698168468041905119422, - 21888242871839275222246405745257275088548364400416034343698182465171300441845, - 53935115945620072, - 7536430137191939, - 30892156489978079, - 21888242871839275222246405745257275088548364400416034343698188318120184265426, - 21888242871839275222246405745257275088548364400416034343698150335160699963720, - 21888242871839275222246405745257275088548364400416034343698134622293523474148, - 21888242871839275222246405745257275088548364400416034343698140618012893182563, - 2084183458663263, - 36412437050120826, - 47057221616255631, - 21888242871839275222246405745257275088548364400416034343698138217343588241207, - 21888242871839275222246405745257275088548364400416034343698200012520674848131, - 21888242871839275222246405745257275088548364400416034343698136339486045490727, - 3847892797653653, - 21888242871839275222246405745257275088548364400416034343698135282329622637654, - 21888242871839275222246405745257275088548364400416034343698186987219075147603, - 21888242871839275222246405745257275088548364400416034343698191256437996196085, - 21888242871839275222246405745257275088548364400416034343698168205831855367825, - 21888242871839275222246405745257275088548364400416034343698149579746753707137, - 22308968209979384, - 31150148116330381, - 12993189408554367, - 21888242871839275222246405745257275088548364400416034343698156671820441605107, - 21888242871839275222246405745257275088548364400416034343698181477588958271234, - 21888242871839275222246405745257275088548364400416034343698141823390655189433, - 14766122296119610, - 4102944361259541, - 21888242871839275222246405745257275088548364400416034343698203217368542105403, - 21888242871839275222246405745257275088548364400416034343698191314159711280880, - 21888242871839275222246405745257275088548364400416034343698160834889411757738, - 21888242871839275222246405745257275088548364400416034343698195668412420821182, - 21888242871839275222246405745257275088548364400416034343698185376144651944730, - 21888242871839275222246405745257275088548364400416034343698142662903779387599, - 21888242871839275222246405745257275088548364400416034343698193759429519019387, - 30230503545146492, - 21888242871839275222246405745257275088548364400416034343698196806726016722735, - 21888242871839275222246405745257275088548364400416034343698151235026953989065, - 21888242871839275222246405745257275088548364400416034343698187934689671083875, - 21827098354139168, - 38576812366413675, - 23209822787358323, - 16888436469278796, - 21888242871839275222246405745257275088548364400416034343698153996476916889399, - 21888242871839275222246405745257275088548364400416034343698196900384774685789, - 21888242871839275222246405745257275088548364400416034343698159823091219411629, - 27590128805119292, - 21888242871839275222246405745257275088548364400416034343698171396954888335930, - 21888242871839275222246405745257275088548364400416034343698163395118801938593, - 21888242871839275222246405745257275088548364400416034343698184518120951143259, - 21888242871839275222246405745257275088548364400416034343698190526089677863395, - 21888242871839275222246405745257275088548364400416034343698155083942770296388, - 21888242871839275222246405745257275088548364400416034343698191942534010232303, - 21888242871839275222246405745257275088548364400416034343698181491034779218858, - 40242342391437338, - 21888242871839275222246405745257275088548364400416034343698157611642071204960, - 21888242871839275222246405745257275088548364400416034343698201977193385056663, - 2053030170566901, - 21888242871839275222246405745257275088548364400416034343698185835767437883470, - 21888242871839275222246405745257275088548364400416034343698143550271274224473, - 21888242871839275222246405745257275088548364400416034343698195742693645737632, - 21888242871839275222246405745257275088548364400416034343698148005754103612037, - 70352080886117206, - 328557456807419, - 19539817963802065, - 21888242871839275222246405745257275088548364400416034343698150850190298890194, - 21888242871839275222246405745257275088548364400416034343698181581648556070610, - 5175870975637220, - 21888242871839275222246405745257275088548364400416034343698171604730074986693, - 21888242871839275222246405745257275088548364400416034343698185979475147226743, - 21888242871839275222246405745257275088548364400416034343698158418094651051128, - 21888242871839275222246405745257275088548364400416034343698153111784524376459, - 21888242871839275222246405745257275088548364400416034343698173344217511273454, - 69869111861491039, - 40225300395813249, - 21888242871839275222246405745257275088548364400416034343698150024140748373575, - 28321020528176958, - 59471527405700293, - 21888242871839275222246405745257275088548364400416034343698145713309377337111, - 12432320068658253, - 21888242871839275222246405745257275088548364400416034343698165572609200876119, - 21888242871839275222246405745257275088548364400416034343698151673609549799418, - 59461273476941800, - 21888242871839275222246405745257275088548364400416034343698175472755650211559, - 20109549814155803, - 30433901994144959, - 66553743458104706, - 52839848049065988, - 17463124499358016, - 21888242871839275222246405745257275088548364400416034343698156999484899949684, - 21888242871839275222246405745257275088548364400416034343698146209790509923225, - 12043597042224141, - 71663658361701250, - 24771699156481200, - 21888242871839275222246405745257275088548364400416034343698203463619405374935, - 21888242871839275222246405745257275088548364400416034343698189867139744596027, - 9451687757876787, - 21888242871839275222246405745257275088548364400416034343698201096381208584714, - 21888242871839275222246405745257275088548364400416034343698187988128215055053, - 39577672991920097, - 21888242871839275222246405745257275088548364400416034343698203246941919297447, - 21888242871839275222246405745257275088548364400416034343698190553510266891426, - 21888242871839275222246405745257275088548364400416034343698167532160764287566, - 13263918370048195, - 21888242871839275222246405745257275088548364400416034343698132806612646938021, - 21888242871839275222246405745257275088548364400416034343698172882194124580773, - 19350275494613134, - 14347077524529110, - 21888242871839275222246405745257275088548364400416034343698179929902546828379, - 68210380544122259, - 29189134801304243, - 44958147592374651, - 21888242871839275222246405745257275088548364400416034343698159315866758268629, - 37505943828189082, - 38777095826025922, - 68701865828977648, - 5805408241931101, - 21888242871839275222246405745257275088548364400416034343698174816042161221155, - 58395949073187444, - 21888242871839275222246405745257275088548364400416034343698200305729693821504, - 11600995041627985, - 21888242871839275222246405745257275088548364400416034343698151731488350432934, - 21888242871839275222246405745257275088548364400416034343698163164083479769577, - 21888242871839275222246405745257275088548364400416034343698161255110682982141, - 15960685918547380, - 24825352051841169, - 20780115228398163, - 25526053537791838, - 21888242871839275222246405745257275088548364400416034343698167320935344555756, - 15543483975899162, - 21888242871839275222246405745257275088548364400416034343698165120451306988902, - 21888242871839275222246405745257275088548364400416034343698154687883690079055, - 10354249217069015, - 21888242871839275222246405745257275088548364400416034343698200853448789483292, - 64632062354266978, - 70280720001925592, - 21888242871839275222246405745257275088548364400416034343698194663459271577022, - 9209642861865646, - 21888242871839275222246405745257275088548364400416034343698137716899921034351, - 21888242871839275222246405745257275088548364400416034343698185463252058069549, - 65687519299089681, - 60755617453280296, - 52779180535288299, - 19000000521281798, - 54158009419461978, - 21888242871839275222246405745257275088548364400416034343698203229357241080996, - 23094335922496792, - 21888242871839275222246405745257275088548364400416034343698201624127064650243, - 49999156365965926, - 69618660805901132, - 21888242871839275222246405745257275088548364400416034343698169493846924936599, - 32788853028890216, - 21888242871839275222246405745257275088548364400416034343698147895087519145669, - 4294110441167636, - 13381209085932994, - 21888242871839275222246405745257275088548364400416034343698178662009665018466, - 43483605460786417, - 11738907206376642, - 71821118983102585, - 21888242871839275222246405745257275088548364400416034343698201043246187264892, - 11881584781574082, - 21888242871839275222246405745257275088548364400416034343698167336393053564205, - 44980857798894319, - 64434407767459026, - 21888242871839275222246405745257275088548364400416034343698149011237411344213, - 21888242871839275222246405745257275088548364400416034343698134423838151002934, - 21888242871839275222246405745257275088548364400416034343698149792758530466316, - 10739379089833912, - 25335069545374464, - 33510602524762891, - 12035334542000678, - 21888242871839275222246405745257275088548364400416034343698146799262431305386, - 42345547371445076, - 51390195850568632, - 53380946781188687, - 21668685306721604, - 71197907386662898, - 62741651267090128, - 21888242871839275222246405745257275088548364400416034343698184967198641914203, - 21888242871839275222246405745257275088548364400416034343698182883235269705863, - 4673581063225936, - 25489756430783847, - 26609499916978178, - 5525582080929477, - 21888242871839275222246405745257275088548364400416034343698139318521809108804, - 21888242871839275222246405745257275088548364400416034343698174295648445400563, - 21888242871839275222246405745257275088548364400416034343698137141768801077460, - 21888242871839275222246405745257275088548364400416034343698134240925414863938, - 21378716483298079, - 1203074712498294, - 21888242871839275222246405745257275088548364400416034343698185539676815236373, - 21888242871839275222246405745257275088548364400416034343698182115345582104731, - 21888242871839275222246405745257275088548364400416034343698150764816199318823, - 25577618369541981, - 21888242871839275222246405745257275088548364400416034343698151269461551515980, - 13466323328301718, - 40752097664525822, - 21888242871839275222246405745257275088548364400416034343698165868570786566801, - 23368178478404889, - 21888242871839275222246405745257275088548364400416034343698189024660522539838, - 21888242871839275222246405745257275088548364400416034343698193797455178188697, - 37068087333074242, - 21888242871839275222246405745257275088548364400416034343698165038870806102603, - 21888242871839275222246405745257275088548364400416034343698149581371654956786, - 51073666044683361, - 14292275495872387, - 15039721091893705, - 21888242871839275222246405745257275088548364400416034343698172308165429383045, - 36128422616555549, - 21888242871839275222246405745257275088548364400416034343698157608166226061419, - 21888242871839275222246405745257275088548364400416034343698180009480866576578, - 59293203994031166, - 27020770573194001, - 26058639334201392, - 21888242871839275222246405745257275088548364400416034343698201301388785015311, - 23513367538406697, - 21888242871839275222246405745257275088548364400416034343698194619590093025492, - 21888242871839275222246405745257275088548364400416034343698179243527278503400, - 21888242871839275222246405745257275088548364400416034343698168121804211018103, - 41052862995110127, - 21888242871839275222246405745257275088548364400416034343698154795704611158870, - 21888242871839275222246405745257275088548364400416034343698159898713941752878, - 21888242871839275222246405745257275088548364400416034343698179537742374877907, - 21888242871839275222246405745257275088548364400416034343698154182120636243519, - 21888242871839275222246405745257275088548364400416034343698140928259093122723, - 21888242871839275222246405745257275088548364400416034343698183209093318960104, - 55935131166214668, - 40869854780137244, - 17613550741215502, - 21888242871839275222246405745257275088548364400416034343698143307321603350434, - 21888242871839275222246405745257275088548364400416034343698202777697142465169, - 41803123295877433, - 21888242871839275222246405745257275088548364400416034343698185164432132644604, - 21888242871839275222246405745257275088548364400416034343698181424930044885908, - 22120652721412301, - 21888242871839275222246405745257275088548364400416034343698132267167035496305, - 2499830291866542, - 21888242871839275222246405745257275088548364400416034343698159049707991502512, - 34215270826842075, - 65588327720807465, - 17474489436622313, - 7069200412989615, - 65099475890095873, - 55127033599133373, - 21888242871839275222246405745257275088548364400416034343698134755991509777268, - 63523491771463325, - 57804414787216790, - 21888242871839275222246405745257275088548364400416034343698169264636673173756, - 21888242871839275222246405745257275088548364400416034343698179597437602441604, - 29062079595123341, - 21888242871839275222246405745257275088548364400416034343698161816020296591931, - 59596892332681298, - 21888242871839275222246405745257275088548364400416034343698181708600677765693, - 22665597658134281, - 3868728360031224, - 21888242871839275222246405745257275088548364400416034343698141591733357546718, - 26683201428729051, - 21888242871839275222246405745257275088548364400416034343698155627797825736640, - 21888242871839275222246405745257275088548364400416034343698151481387202942472, - 21888242871839275222246405745257275088548364400416034343698203405538206313676, - 19426376892103903, - 21888242871839275222246405745257275088548364400416034343698200432421353681454, - 62548033723310923, - 5295761345169734, - 21888242871839275222246405745257275088548364400416034343698152639718922663185, - 23615654356528574, - 36718419156861579, - 21888242871839275222246405745257275088548364400416034343698202043309451985648, - 21888242871839275222246405745257275088548364400416034343698203374120723422039, - 21888242871839275222246405745257275088548364400416034343698180148607185389618, - 21888242871839275222246405745257275088548364400416034343698170928615661860314, - 21888242871839275222246405745257275088548364400416034343698141704036408487130, - 67121912816557778, - 21888242871839275222246405745257275088548364400416034343698170762265486784529, - 21888242871839275222246405745257275088548364400416034343698184514922848311351, - 36860848957980038, - 38852109545546204, - 56536245080984898, - 21888242871839275222246405745257275088548364400416034343698159834437905718497, - 50442564648242918, - 18376251291281604, - 21888242871839275222246405745257275088548364400416034343698194348236427204512, - 16075388435456916, - 3161684380939979, - 66092530205772700, - 40162312397624931, - 40565327180812360, - 21888242871839275222246405745257275088548364400416034343698144070887150094641, - 47852685168099839, - 21888242871839275222246405745257275088548364400416034343698167786308266368300, - 71971236365922296, - 66084782767146369, - 21888242871839275222246405745257275088548364400416034343698145537084629119290, - 49600888017615938, - 35881609759977665, - 21888242871839275222246405745257275088548364400416034343698134289843845859765, - 12501504950813964, - 49551257297758276, - 40960654487639685, - 21888242871839275222246405745257275088548364400416034343698159698903032191945, - 32130076391064903, - 21888242871839275222246405745257275088548364400416034343698152564022159279610, - 21888242871839275222246405745257275088548364400416034343698188462876333625688, - 21888242871839275222246405745257275088548364400416034343698137197047232645124, - 22708787608249521, - 21888242871839275222246405745257275088548364400416034343698140897765694372263, - 21888242871839275222246405745257275088548364400416034343698144006516238694902, - 22797172370288667, - 21888242871839275222246405745257275088548364400416034343698136726403533861438, - 65139483918439622, - 21888242871839275222246405745257275088548364400416034343698171054981390649291, - 21888242871839275222246405745257275088548364400416034343698157964767192076491, - 33581506792011637, - 13080601495368928, - 21888242871839275222246405745257275088548364400416034343698203562964757809395, - 46719059976672499, - 58438740206038050, - 21888242871839275222246405745257275088548364400416034343698142636655522363242, - 21888242871839275222246405745257275088548364400416034343698146528253066202915, - 21888242871839275222246405745257275088548364400416034343698191920432861734607, - 42878076148158517, - 39353885468433607, - 21888242871839275222246405745257275088548364400416034343698141206821228669652, - 27333386318085801, - 21888242871839275222246405745257275088548364400416034343698191122687442186367, - 15899110983728824, - 5246171018339963, - 18400745038456012, - 21888242871839275222246405745257275088548364400416034343698201640023291577761, - 21888242871839275222246405745257275088548364400416034343698133263593388260120, - 21888242871839275222246405745257275088548364400416034343698187273974732064954, - 31764684913647647, - 21888242871839275222246405745257275088548364400416034343698203934966971118244, - 21888242871839275222246405745257275088548364400416034343698178248669460865762, - 45041609089387992, - 21888242871839275222246405745257275088548364400416034343698173342504484058775, - 7929464564115789, - 21888242871839275222246405745257275088548364400416034343698171135958443504266, - 10101619479578798, - 47192106409582278, - 21888242871839275222246405745257275088548364400416034343698186708682977135448, - 21888242871839275222246405745257275088548364400416034343698187447843288660595, - 9196479167633783, - 21888242871839275222246405745257275088548364400416034343698183994197607639912, - 21888242871839275222246405745257275088548364400416034343698153154943061082088, - 21888242871839275222246405745257275088548364400416034343698190533600982495830, - 63255574198201697, - 21888242871839275222246405745257275088548364400416034343698180827136495565357, - 21888242871839275222246405745257275088548364400416034343698153350249773899328, - 21888242871839275222246405745257275088548364400416034343698189633483272539131, - 45928648278486795, - 21888242871839275222246405745257275088548364400416034343698142085853876172021, - 14232153797623988, - 21888242871839275222246405745257275088548364400416034343698151973513309343357, - 21888242871839275222246405745257275088548364400416034343698202438823447654380, - 34524280187325997, - 21888242871839275222246405745257275088548364400416034343698174570309623263742, - 21888242871839275222246405745257275088548364400416034343698165863310255118185, - 40401116036730630, - 21888242871839275222246405745257275088548364400416034343698144619415727931053, - 21888242871839275222246405745257275088548364400416034343698155189128137835839, - 55597689257405838, - 21888242871839275222246405745257275088548364400416034343698197848823495359272, - 21888242871839275222246405745257275088548364400416034343698187298985646251177, - 21888242871839275222246405745257275088548364400416034343698197634603275642418, - 43649972964111669, - 32493214813219428, - 21888242871839275222246405745257275088548364400416034343698156238798083728488, - 21888242871839275222246405745257275088548364400416034343698148806888766966421, - 21888242871839275222246405745257275088548364400416034343698196687292236873222, - 49859783352662519, - 33954981968735804, - 10836984023956714, - 11475547258770493, - 21888242871839275222246405745257275088548364400416034343698150442355274221485, - 21888242871839275222246405745257275088548364400416034343698189289780374473830, - 2124775434509510, - 68377036964295243, - 21888242871839275222246405745257275088548364400416034343698178149099531192940, - 27622959265684565, - 7020512912909773, - 21888242871839275222246405745257275088548364400416034343698200732445649915325, - 21888242871839275222246405745257275088548364400416034343698141425123314457098, - 21888242871839275222246405745257275088548364400416034343698203117381621131523, - 30246180980400215, - 21888242871839275222246405745257275088548364400416034343698142229183772083321, - 21888242871839275222246405745257275088548364400416034343698167620933837606743, - 19268010957390057, - 4589684955310637, - 5709498155605023, - 21888242871839275222246405745257275088548364400416034343698159864743140507439, - 21888242871839275222246405745257275088548364400416034343698156639015040440708, - 33230707372610006, - 4588292625787582, - 9119495586698363, - 1999589335823636, - 21888242871839275222246405745257275088548364400416034343698194825177182671080, - 24234355308164736, - 21888242871839275222246405745257275088548364400416034343698196863148131972432, - 54144094730920031, - 21888242871839275222246405745257275088548364400416034343698171605554801355480, - 21888242871839275222246405745257275088548364400416034343698140662754146912515, - 21888242871839275222246405745257275088548364400416034343698196516465449297348, - 21888242871839275222246405745257275088548364400416034343698203735937348008811, - 21888242871839275222246405745257275088548364400416034343698165452160311520631, - 35698421754160124, - 21888242871839275222246405745257275088548364400416034343698159156374140596023, - 68339718685687986, - 21888242871839275222246405745257275088548364400416034343698185849390270283064, - 35020222898322196, - 21888242871839275222246405745257275088548364400416034343698203454440188254670, - 21888242871839275222246405745257275088548364400416034343698133558869523818614, - 19648370849967786, - 21888242871839275222246405745257275088548364400416034343698170433744627618889, - 21888242871839275222246405745257275088548364400416034343698166464367198824706, - 34122087072876729, - 18441871190022078, - 21888242871839275222246405745257275088548364400416034343698166009509544148042, - 34013554223937488, - 34550811516936604, - 29624832248223027, - 68754767062268935, - 21888242871839275222246405745257275088548364400416034343698179213717436568804, - 33315108953984207, - 21888242871839275222246405745257275088548364400416034343698197898385269051157, - 17407459156740074, - 21888242871839275222246405745257275088548364400416034343698166618179154319580, - 49130020068489874, - 21540607564272754, - 21888242871839275222246405745257275088548364400416034343698171598546567640567, - 56600968960216217, - 37995482827555901, - 58586028800365548, - 21888242871839275222246405745257275088548364400416034343698143061938355510131, - 13131203931875191, - 66550625637801057, - 57347471283465314, - 21888242871839275222246405745257275088548364400416034343698133707181168217816, - 21888242871839275222246405745257275088548364400416034343698134251053411946380, - 69122112601685934, - 16538020743483814, - 21888242871839275222246405745257275088548364400416034343698183644912120591286, - 21888242871839275222246405745257275088548364400416034343698161069835894577039, - 34166980746608217, - 36233371128109725, - 21888242871839275222246405745257275088548364400416034343698157553394366227424, - 8453858319791913, - 21888242871839275222246405745257275088548364400416034343698140374662148135361, - 21888242871839275222246405745257275088548364400416034343698175092014528912731, - 37240940629466157, - 1153455420797507, - 30344289336849442, - 47623528803850162, - 21888242871839275222246405745257275088548364400416034343698178232647615618051, - 21888242871839275222246405745257275088548364400416034343698189008660297721321, - 21888242871839275222246405745257275088548364400416034343698201364123438146890, - 6785513271247945, - 16544031383600012, - 21888242871839275222246405745257275088548364400416034343698135292789873416456, - 24408218766846449, - 21888242871839275222246405745257275088548364400416034343698193810191319669614, - 15189276531441584, - 50912792620890574, - 21888242871839275222246405745257275088548364400416034343698203264330002486391, - 33627845745068820, - 16702238493951624, - 57838735448256306, - 65269585594396977, - 57200903857113632, - 59508098449326879, - 21888242871839275222246405745257275088548364400416034343698199038248824350312, - 21888242871839275222246405745257275088548364400416034343698183357250927191140, - 59304015214932433, - 23567299553839431, - 21888242871839275222246405745257275088548364400416034343698137888902789978794, - 62521153706207328, - 37757603251964675, - 52466725678771697, - 21897439157196198, - 7571270788487300, - 21888242871839275222246405745257275088548364400416034343698172087151901489435, - 29046295241961451, - 60654818217476920, - 45990091132054533, - 41303824770393882, - 21888242871839275222246405745257275088548364400416034343698195740305829956176, - 42422000743854241, - 25786086525837386, - 9634618585627133, - 21888242871839275222246405745257275088548364400416034343698202218557542979975, - 21888242871839275222246405745257275088548364400416034343698160478579726297597, - 21888242871839275222246405745257275088548364400416034343698135309046814576183, - 15731730795251495, - 26763547323363689, - 44859949907800642, - 4816519998097998, - 21888242871839275222246405745257275088548364400416034343698183612374933079332, - 49702838852830371, - 21888242871839275222246405745257275088548364400416034343698186912106556319310, - 21888242871839275222246405745257275088548364400416034343698193164930056967076, - 12949526477002321, - 21888242871839275222246405745257275088548364400416034343698159243711686479789, - 25868264123900380, - 56613783345146433, - 45251551612068204, - 35147305698548518, - 45064722441428545, - 27266875423070765, - 36908255129732214, - 21888242871839275222246405745257275088548364400416034343698155378598128273043, - 28320355518264207, - 55968580183358206, - 21888242871839275222246405745257275088548364400416034343698185800671556724538, - 39315452429505461, - 67104953609989381, - 46757577578575425, - 21888242871839275222246405745257275088548364400416034343698146236112529577538, - 56772473238752128, - 63744216019910336, - 62357412443567069, - 44517226942633776, - 21888242871839275222246405745257275088548364400416034343698160191822144380163, - 21888242871839275222246405745257275088548364400416034343698135297467883892043, - 21888242871839275222246405745257275088548364400416034343698169468837643023808, - 21888242871839275222246405745257275088548364400416034343698184557341143647918, - 67211041825426098, - 32859513991968533, - 10200477218316414, - 37577159058765070, - 21888242871839275222246405745257275088548364400416034343698179878952665945482, - 21888242871839275222246405745257275088548364400416034343698193356897965140280, - 21888242871839275222246405745257275088548364400416034343698178560381135288842, - 21888242871839275222246405745257275088548364400416034343698145695978670460983, - 38322725138758657, - 50834872686052288, - 21888242871839275222246405745257275088548364400416034343698201658152934400326, - 34828439022160093, - 21888242871839275222246405745257275088548364400416034343698136214726047617788, - 21888242871839275222246405745257275088548364400416034343698146136877386001750, - 21888242871839275222246405745257275088548364400416034343698165551194268635181, - 48017871801153641, - 21888242871839275222246405745257275088548364400416034343698155014998267063259, - 21888242871839275222246405745257275088548364400416034343698167554286014004654, - 4143536834285140, - 39954880094347820, - 21888242871839275222246405745257275088548364400416034343698165183395906129843, - 21888242871839275222246405745257275088548364400416034343698148714793532599190, - 106362899079124, - 31793822189047871, - 21888242871839275222246405745257275088548364400416034343698193894394062461731, - 59312183519040915, - 21888242871839275222246405745257275088548364400416034343698149695751078069597, - 21888242871839275222246405745257275088548364400416034343698134936125859020248, - 21888242871839275222246405745257275088548364400416034343698193380203339197356, - 21888242871839275222246405745257275088548364400416034343698138768395016486571, - 36446458077080304, - 51450727247657768, - 21888242871839275222246405745257275088548364400416034343698174257212955482493, - 21888242871839275222246405745257275088548364400416034343698193394437754658303, - 67274835865594635, - 36914827277737271, - 35918382822138607, - 21888242871839275222246405745257275088548364400416034343698170871996528181710, - 26595274721180323, - 52745434331164379, - 15515728333304997, - 51722253601989176, - 21888242871839275222246405745257275088548364400416034343698173915429601538022, - 21888242871839275222246405745257275088548364400416034343698141642125028103981, - 21888242871839275222246405745257275088548364400416034343698197295958637153428, - 21888242871839275222246405745257275088548364400416034343698179648421401012583, - 21888242871839275222246405745257275088548364400416034343698148489584938336524, - 21888242871839275222246405745257275088548364400416034343698163956981828615632, - 62062063878795741, - 27538680096872248, - 21888242871839275222246405745257275088548364400416034343698167286008286040536, - 31031719001764590, - 20075963363669577, - 21888242871839275222246405745257275088548364400416034343698156795924672090417, - 21888242871839275222246405745257275088548364400416034343698180575783998074477, - 21888242871839275222246405745257275088548364400416034343698155008582583052489, - 49763196765010354, - 21888242871839275222246405745257275088548364400416034343698200146265792963912, - 15312781696409806, - 21888242871839275222246405745257275088548364400416034343698156078508264491075, - 21888242871839275222246405745257275088548364400416034343698144599132421324448, - 20893915040462758, - 21888242871839275222246405745257275088548364400416034343698145609312602360999, - 30418188589934095, - 21888242871839275222246405745257275088548364400416034343698201557286792585897, - 21888242871839275222246405745257275088548364400416034343698174577510216883171, - 16490712835019279, - 8619445410655127, - 35359761641419614, - 21888242871839275222246405745257275088548364400416034343698156600455254942229, - 21888242871839275222246405745257275088548364400416034343698180206137639742910, - 47744797174856563, - 21888242871839275222246405745257275088548364400416034343698190866688932375846, - 21888242871839275222246405745257275088548364400416034343698162181133536014820, - 69278024068717289, - 21888242871839275222246405745257275088548364400416034343698179115856304416673, - 21888242871839275222246405745257275088548364400416034343698176210290468040743, - 21888242871839275222246405745257275088548364400416034343698182407380236517641, - 25322760216063297, - 54432216386952226, - 31850850797115686, - 21888242871839275222246405745257275088548364400416034343698150098317346366530, - 65274497995739845, - 50378619731037169, - 21888242871839275222246405745257275088548364400416034343698137150028889860898, - 21888242871839275222246405745257275088548364400416034343698190032322430661242, - 61845329326007039, - 70598138499887502, - 7204828627468540, - 49092908839788748, - 21888242871839275222246405745257275088548364400416034343698194654401624828147, - 46142795392239891, - 21888242871839275222246405745257275088548364400416034343698194969938448209941, - 65209871053085886, - 849076353261184, - 33484399277237767, - 21888242871839275222246405745257275088548364400416034343698154905458978753319, - 64801992022633068, - 33561396517130117, - 21888242871839275222246405745257275088548364400416034343698168150108736584203, - 39175920363447452, - 50811999457581996, - 54399240341614698, - 22660712750086803, - 26143976910340732, - 8065985765846253, - 21888242871839275222246405745257275088548364400416034343698164726929850736993, - 21888242871839275222246405745257275088548364400416034343698186462585469210098, - 21888242871839275222246405745257275088548364400416034343698179514074015457484, - 21888242871839275222246405745257275088548364400416034343698165366561514529112, - 45942597557117919, - 67559529482807647, - 27288263179920539, - 46729609351192953, - 21888242871839275222246405745257275088548364400416034343698181663567576933916, - 21888242871839275222246405745257275088548364400416034343698196442700480722860, - 21888242871839275222246405745257275088548364400416034343698188470678549299126, - 61785271177403884, - 21888242871839275222246405745257275088548364400416034343698186774955709063805, - 26794832198757177, - 46832775056587704, - 23882901444167898, - 21888242871839275222246405745257275088548364400416034343698167275030440422121, - 21888242871839275222246405745257275088548364400416034343698183163709429429415, - 46007494978481812, - 49699134035168830, - 21888242871839275222246405745257275088548364400416034343698191159664752720368, - 21888242871839275222246405745257275088548364400416034343698136279263349732386, - 31727699648367927, - 15231033586855681, - 21888242871839275222246405745257275088548364400416034343698145091089816059588, - 6671071267096742, - 21888242871839275222246405745257275088548364400416034343698138211556240569615, - 21888242871839275222246405745257275088548364400416034343698151770013185232904, - 47505473136319210, - 40838189533728113, - 21888242871839275222246405745257275088548364400416034343698183120845137866356, - 7592912261224554, - 56813070140953983, - 28736142250780721, - 21888242871839275222246405745257275088548364400416034343698179256930619854749, - 21888242871839275222246405745257275088548364400416034343698148347240686942159, - 30816299172872647, - 32408284374310784, - 55192752153353616, - 3674559883225037, - 16544729360985246, - 21888242871839275222246405745257275088548364400416034343698195956931420859616, - 21888242871839275222246405745257275088548364400416034343698155226722965320752, - 1833833224184518, - 2592801852286578, - 20774750854066660, - 66100366095873006, - 21888242871839275222246405745257275088548364400416034343698160736929495907967, - 7691634985490729, - 21888242871839275222246405745257275088548364400416034343698147843172016235305, - 45170703498681641, - 33959552238988396, - 31727137383064188, - 15037682749819825, - 21888242871839275222246405745257275088548364400416034343698139219731688895121, - 21888242871839275222246405745257275088548364400416034343698176985899515914332, - 21888242871839275222246405745257275088548364400416034343698194445193936765474, - 21888242871839275222246405745257275088548364400416034343698154829625798980189, - 21888242871839275222246405745257275088548364400416034343698171916985811236170, - 21888242871839275222246405745257275088548364400416034343698180269957639025525, - 70773900505623282, - 21888242871839275222246405745257275088548364400416034343698185222631753609607, - 21888242871839275222246405745257275088548364400416034343698195266406308582911, - 26380192558525901, - 17157953937490743, - 21888242871839275222246405745257275088548364400416034343698193056535022900661, - 21888242871839275222246405745257275088548364400416034343698167890064602137446, - 21888242871839275222246405745257275088548364400416034343698159231101167134066, - 21888242871839275222246405745257275088548364400416034343698148723352296785034, - 26286329606193478, - 21888242871839275222246405745257275088548364400416034343698157480821240746401, - 13229118009695691, - 21888242871839275222246405745257275088548364400416034343698168823816244398917, - 21888242871839275222246405745257275088548364400416034343698200085960392606088, - 21888242871839275222246405745257275088548364400416034343698186373702894702681, - 21888242871839275222246405745257275088548364400416034343698157982226076304397, - 578162852345770, - 21888242871839275222246405745257275088548364400416034343698143938841910047746, - 21888242871839275222246405745257275088548364400416034343698176141319485346614, - 21888242871839275222246405745257275088548364400416034343698162925788191840648, - 21888242871839275222246405745257275088548364400416034343698189170367339757617, - 21888242871839275222246405745257275088548364400416034343698176328438288001216, - 21888242871839275222246405745257275088548364400416034343698166714336306531389, - 21888242871839275222246405745257275088548364400416034343698136184262391792382, - 53631441656634857, - 33572409956425818, - 21888242871839275222246405745257275088548364400416034343698183224851788933012, - 21888242871839275222246405745257275088548364400416034343698134185903740608561, - 21888242871839275222246405745257275088548364400416034343698167943039436832453, - 46726769239232204, - 46739752915393436, - 21888242871839275222246405745257275088548364400416034343698170229678875755936, - 20719565433183659, - 5773683996953860, - 28364181817014770, - 54506818806768473, - 21888242871839275222246405745257275088548364400416034343698160170826116367481, - 59038437075026521, - 21888242871839275222246405745257275088548364400416034343698157562937886453209, - 21888242871839275222246405745257275088548364400416034343698197279022337001125, - 24099254764878560, - 31047908565899147, - 21888242871839275222246405745257275088548364400416034343698145129116846484695, - 21888242871839275222246405745257275088548364400416034343698151017112609383781, - 21888242871839275222246405745257275088548364400416034343698167656437073173222, - 21888242871839275222246405745257275088548364400416034343698164364278268579963, - 21888242871839275222246405745257275088548364400416034343698145378476757942354, - 21888242871839275222246405745257275088548364400416034343698197468316123959058, - 21888242871839275222246405745257275088548364400416034343698145029540571351365, - 21888242871839275222246405745257275088548364400416034343698196211917689134474, - 21888242871839275222246405745257275088548364400416034343698164401159479516668, - 21734066085391921, - 63074201875556993, - 68775915653762852, - 21888242871839275222246405745257275088548364400416034343698178978635125704073, - 27893049427739007, - 48101213532259327, - 21888242871839275222246405745257275088548364400416034343698148034565037026517, - 21888242871839275222246405745257275088548364400416034343698178389659840274656, - 21888242871839275222246405745257275088548364400416034343698190239499579425936, - 42692968137595570, - 37480612020269206, - 61456276375696795, - 54558245106366735, - 21888242871839275222246405745257275088548364400416034343698192608053489275215, - 13611862538747533, - 7845500010082253, - 21888242871839275222246405745257275088548364400416034343698184251033758898004, - 21888242871839275222246405745257275088548364400416034343698138663639421807773, - 33924876844313686, - 21888242871839275222246405745257275088548364400416034343698166950098048211427, - 68352185638426213, - 51600739707892646, - 20041415357039986, - 3501720740729269, - 21888242871839275222246405745257275088548364400416034343698134711260493302648, - 21888242871839275222246405745257275088548364400416034343698160841547175711128, - 34388359489605320, - 21888242871839275222246405745257275088548364400416034343698179849805811458641, - 60746353336700947, - 31298318671285731, - 21888242871839275222246405745257275088548364400416034343698143251318560885305, - 58202930230165269, - 31278594950876461, - 21888242871839275222246405745257275088548364400416034343698156521010608233519, - 15436208511941549, - 21888242871839275222246405745257275088548364400416034343698188366425134267714, - 21888242871839275222246405745257275088548364400416034343698185012713299030750, - 58990918778290658, - 21888242871839275222246405745257275088548364400416034343698140679935707330862, - 21888242871839275222246405745257275088548364400416034343698138918095406490346, - 67537987362014474, - 21888242871839275222246405745257275088548364400416034343698195591186348713027, - 23295289223411409, - 16340232676779055, - 21888242871839275222246405745257275088548364400416034343698158399500137236409, - 21888242871839275222246405745257275088548364400416034343698165534600151168187, - 21888242871839275222246405745257275088548364400416034343698174489675052002810, - 34653602353436381, - 44351425058603255, - 21888242871839275222246405745257275088548364400416034343698188713681461292787, - 21888242871839275222246405745257275088548364400416034343698159133082881479964, - 9170919305964869, - 41291034976209350, - 68882333864646614, - 55375653923026566, - 3315880759944809, - 45402556212322922, - 21888242871839275222246405745257275088548364400416034343698200174059337938325, - 23761307194660813, - 21888242871839275222246405745257275088548364400416034343698190330440104084777, - 55996780203499984, - 29500631428356166, - 63158910295890286, - 21888242871839275222246405745257275088548364400416034343698155336562117182174, - 21888242871839275222246405745257275088548364400416034343698182212313823000131, - 21888242871839275222246405745257275088548364400416034343698191097089585915502, - 21888242871839275222246405745257275088548364400416034343698166629022784925643, - 3486706335601778, - 67194387235249960, - 21888242871839275222246405745257275088548364400416034343698188079173887567420, - 69015789786896818, - 21888242871839275222246405745257275088548364400416034343698156979525856727124, - 65100662622289855, - 2602248663601523, - 21888242871839275222246405745257275088548364400416034343698157972595353151140, - 21888242871839275222246405745257275088548364400416034343698181257342590504033, - 681833732864669, - 21888242871839275222246405745257275088548364400416034343698190348751176819219, - 12780126849877340, - 21471707535998226, - 21888242871839275222246405745257275088548364400416034343698160468279832794788, - 21888242871839275222246405745257275088548364400416034343698138949211191047616, - 21888242871839275222246405745257275088548364400416034343698141409179340358941, - 21888242871839275222246405745257275088548364400416034343698136699756925424111, - 24616795866890617, - 21888242871839275222246405745257275088548364400416034343698196433637419230406, - 59119958603433945, - 47136706673971933, - 12484236479361904, - 44984341630140559, - 21888242871839275222246405745257275088548364400416034343698162096637333777593, - 21888242871839275222246405745257275088548364400416034343698159922204297925377, - 21888242871839275222246405745257275088548364400416034343698150091889240504631, - 21888242871839275222246405745257275088548364400416034343698199204426648418644, - 12377147709847504, - 26676219960626269, - 58808373677223838, - 42228648761296502, - 21888242871839275222246405745257275088548364400416034343698183587806107609987, - 35998410980846316, - 21888242871839275222246405745257275088548364400416034343698192518981642649939, - 55026328590302216, - 12635301037770227, - 66408529423333717, - 22449961308536704, - 2529305185800889, - 30383962140350982, - 46646420021512678, - 20677803021691969, - 62660885228675782, - 15893306400071538, - 21888242871839275222246405745257275088548364400416034343698154471879105738018, - 67461203614065833, - 21888242871839275222246405745257275088548364400416034343698177508475935290632, - 69133070119781304, - 71193711668359153, - 43265096754571013, - 21888242871839275222246405745257275088548364400416034343698135377605854366721, - 59735308499528030, - 4734355582029555, - 35089844135391077, - 44305089456178922, - 68618206345869802, - 32957778157217843, - 18913774063241965, - 21888242871839275222246405745257275088548364400416034343698191596214447174892, - 21888242871839275222246405745257275088548364400416034343698196594704631792496, - 21888242871839275222246405745257275088548364400416034343698150117039864513318, - 23217582731803842, - 21888242871839275222246405745257275088548364400416034343698148491183471750931, - 21888242871839275222246405745257275088548364400416034343698163857735859876988, - 21888242871839275222246405745257275088548364400416034343698201380552327287883, - 52629824941598856, - 38252339750899170, - 44346910948547030, - 21888242871839275222246405745257275088548364400416034343698161305359784129008, - 21888242871839275222246405745257275088548364400416034343698134847559590655842, - 21888242871839275222246405745257275088548364400416034343698153512557885818612, - 69877617783898287, - 21888242871839275222246405745257275088548364400416034343698153644724584404656, - 61363673781398373, - 71421340687314550, - 69734396611313110, - 21888242871839275222246405745257275088548364400416034343698203797482228296838, - 21888242871839275222246405745257275088548364400416034343698145572425617284738, - 14471316546996826, - 47075002814959027, - 10237671479696766, - 46805506289385689, - 3217579952150694, - 16654570954888140, - 180183228354362, - 15800226821138671, - 21888242871839275222246405745257275088548364400416034343698204086616552171396, - 29915473666351072, - 8956761932641135, - 4489378561108573, - 11499332698296482, - 21888242871839275222246405745257275088548364400416034343698135097968267015059, - 21888242871839275222246405745257275088548364400416034343698203455941465207128, - 62244684877527892, - 12111243563342532, - 67223804392993775, - 10590446812107069, - 21888242871839275222246405745257275088548364400416034343698201178112054517629, - 5009797768605302, - 6233713697522916, - 52585910082002271, - 33284015695698989, - 22107807599785019, - 21888242871839275222246405745257275088548364400416034343698196000345002638925, - 65506755442546569, - 21888242871839275222246405745257275088548364400416034343698163026163465530816, - 21888242871839275222246405745257275088548364400416034343698164163293042477899, - 21888242871839275222246405745257275088548364400416034343698185492514906541347, - 21888242871839275222246405745257275088548364400416034343698203382338402937602, - 21888242871839275222246405745257275088548364400416034343698198460814079974020, - 21888242871839275222246405745257275088548364400416034343698163714046386178272, - 21888242871839275222246405745257275088548364400416034343698145747873543474464, - 21888242871839275222246405745257275088548364400416034343698184165524003134347, - 48514651897837287, - 32485533155339476, - 21888242871839275222246405745257275088548364400416034343698195358392901914098, - 21888242871839275222246405745257275088548364400416034343698179367119081509785, - 21888242871839275222246405745257275088548364400416034343698161935597562311796, - 21888242871839275222246405745257275088548364400416034343698167293792066303274, - 29165133023119045, - 21888242871839275222246405745257275088548364400416034343698181097866717887557, - 2642383285038278, - 11978264354085552, - 62603309838042498, - 21888242871839275222246405745257275088548364400416034343698145193377880110634, - 21888242871839275222246405745257275088548364400416034343698135190456471716625, - 51209580681834258, - 21888242871839275222246405745257275088548364400416034343698145224550553742114, - 19010871607773668, - 21888242871839275222246405745257275088548364400416034343698188151020277706858, - 19463451018378674, - 21888242871839275222246405745257275088548364400416034343698179581346337857690, - 21888242871839275222246405745257275088548364400416034343698191887031324747172, - 21888242871839275222246405745257275088548364400416034343698196505947150809774, - 21888242871839275222246405745257275088548364400416034343698168395254984353951, - 33748826690220615, - 58527195448382990, - 26239109516337575, - 21888242871839275222246405745257275088548364400416034343698143511387382523689, - 66956372420277556, - 21888242871839275222246405745257275088548364400416034343698192698720117461003, - 30285191485341626, - 21888242871839275222246405745257275088548364400416034343698176564882949615466, - 5289995682898728, - 21888242871839275222246405745257275088548364400416034343698173858346974654125, - 21888242871839275222246405745257275088548364400416034343698166873505019099384, - 21888242871839275222246405745257275088548364400416034343698167112372460118713, - 21888242871839275222246405745257275088548364400416034343698190525366799808902, - 21888242871839275222246405745257275088548364400416034343698162255195280321835, - 46901951162396023, - 7568461037280228, - 33130561837452321, - 57394319095494225, - 59377855536315545, - 21888242871839275222246405745257275088548364400416034343698194784082289749245, - 28725840343563718, - 21888242871839275222246405745257275088548364400416034343698133632810182178334, - 50453627327336278, - 21888242871839275222246405745257275088548364400416034343698138425354212431042, - 21888242871839275222246405745257275088548364400416034343698160816117186665966, - 20907811263743212, - 67987889603971298, - 9397264883523073, - 66565030966550241, - 21888242871839275222246405745257275088548364400416034343698160067741451564153, - 36751185714833149, - 21888242871839275222246405745257275088548364400416034343698173909822335273258, - 10647823920206512, - 21888242871839275222246405745257275088548364400416034343698172594966274645864, - 7931788464758306, - 44616629889665503, - 28608504192262360, - 41681430493504258, - 44063222326441680, - 21888242871839275222246405745257275088548364400416034343698146241061167320485, - 66419809131270651, - 21888242871839275222246405745257275088548364400416034343698166325004424265059, - 57915377618892816, - 6880374018207589, - 38110200828581612, - 14107127215824439, - 14916412685724307, - 31915113062642974, - 21888242871839275222246405745257275088548364400416034343698203966348317468488, - 21888242871839275222246405745257275088548364400416034343698198461876271002219, - 65455380193149327, - 51947516962884991, - 21888242871839275222246405745257275088548364400416034343698194118343442364303, - 21888242871839275222246405745257275088548364400416034343698147742973603759329, - 21888242871839275222246405745257275088548364400416034343698148214151603282922, - 21888242871839275222246405745257275088548364400416034343698136000818091166694, - 28841207869985419, - 21888242871839275222246405745257275088548364400416034343698143622040681709090, - 21888242871839275222246405745257275088548364400416034343698156081049391749102, - 21888242871839275222246405745257275088548364400416034343698174038844319119313, - 39143740936736239, - 21888242871839275222246405745257275088548364400416034343698167735524453807295, - 21888242871839275222246405745257275088548364400416034343698150360286946616016, - 21888242871839275222246405745257275088548364400416034343698202766113898217759, - 21888242871839275222246405745257275088548364400416034343698191381762169828396, - 43975038022243011, - 21888242871839275222246405745257275088548364400416034343698146439698351799340, - 21888242871839275222246405745257275088548364400416034343698178085598796553477, - 21888242871839275222246405745257275088548364400416034343698182870786252507894, - 21888242871839275222246405745257275088548364400416034343698175383487152993586, - 21888242871839275222246405745257275088548364400416034343698200144272063005519, - 21888242871839275222246405745257275088548364400416034343698203723961004632035, - 61701726687295057, - 49267085706690448, - 21888242871839275222246405745257275088548364400416034343698138177720588735377, - 2546391026360453, - 21888242871839275222246405745257275088548364400416034343698196275501491765030, - 21888242871839275222246405745257275088548364400416034343698183964508134866073, - 21888242871839275222246405745257275088548364400416034343698201208637394085174, - 14320690110046615, - 21888242871839275222246405745257275088548364400416034343698145668787750725148, - 21888242871839275222246405745257275088548364400416034343698199354011413581286, - 21888242871839275222246405745257275088548364400416034343698167176180856736075, - 21888242871839275222246405745257275088548364400416034343698149123769835734281, - 21888242871839275222246405745257275088548364400416034343698193317966907081406, - 21888242871839275222246405745257275088548364400416034343698202491944416376982, - 21888242871839275222246405745257275088548364400416034343698177267947894616164, - 21888242871839275222246405745257275088548364400416034343698161390043398417926, - 21888242871839275222246405745257275088548364400416034343698154807069251147994, - 21888242871839275222246405745257275088548364400416034343698136572557955024702, - 5010648623262867, - 21888242871839275222246405745257275088548364400416034343698170871762212286201, - 21888242871839275222246405745257275088548364400416034343698176823292407845128, - 66117743336994422, - 21888242871839275222246405745257275088548364400416034343698166218225131451761, - 21888242871839275222246405745257275088548364400416034343698140314487027375786, - 52197206956354275, - 21888242871839275222246405745257275088548364400416034343698199250205975990844, - 52251166848737579, - 47200459245651932, - 17084255887192702, - 21888242871839275222246405745257275088548364400416034343698165345894339260597, - 9281405979539750, - 45933501998410502, - 56786996267097179, - 21888242871839275222246405745257275088548364400416034343698148863411788895761, - 20433283771618555, - 21888242871839275222246405745257275088548364400416034343698168564885606285505, - 22599327561206771, - 21888242871839275222246405745257275088548364400416034343698161426363814560854, - 21888242871839275222246405745257275088548364400416034343698156771675992153024, - 9452712783376437, - 23655402119168926, - 12647039533943038, - 21888242871839275222246405745257275088548364400416034343698160658386419746447, - 55924935553049925, - 21888242871839275222246405745257275088548364400416034343698177663261620154562, - 21888242871839275222246405745257275088548364400416034343698171429440791877035, - 21888242871839275222246405745257275088548364400416034343698181296538370290658, - 40884651575761523, - 23490009539289245, - 2940941979700527, - 7376658083903406, - 3517085328952878, - 4073697092873538, - 6084974799020995, - 22266622646879770, - 13858431986002335, - 7615459862008472, - 21888242871839275222246405745257275088548364400416034343698167040453219938682, - 21888242871839275222246405745257275088548364400416034343698141038765436770582, - 57589756847464580, - 21888242871839275222246405745257275088548364400416034343698148414829702394737, - 14333802818253917, - 21888242871839275222246405745257275088548364400416034343698155764631293838469, - 24398894960156156, - 21888242871839275222246405745257275088548364400416034343698191935803385349563, - 21888242871839275222246405745257275088548364400416034343698180663027642722478, - 21888242871839275222246405745257275088548364400416034343698196159274788930267, - 51579855112418305, - 12175463189962406, - 21888242871839275222246405745257275088548364400416034343698163201989813333730, - 42026197184733380, - 43754756022967062, - 21888242871839275222246405745257275088548364400416034343698195902698310388068, - 30619114292675291, - 21888242871839275222246405745257275088548364400416034343698199829951482919519, - 21888242871839275222246405745257275088548364400416034343698163208598285660932, - 21888242871839275222246405745257275088548364400416034343698135665034476013086, - 21888242871839275222246405745257275088548364400416034343698153727768896699699, - 21888242871839275222246405745257275088548364400416034343698184337629570029806, - 21888242871839275222246405745257275088548364400416034343698175143492528506479, - 29897173028729465, - 1924751627004207, - 52634747223820723, - 21888242871839275222246405745257275088548364400416034343698135266479137935217, - 22814581199067604, - 21888242871839275222246405745257275088548364400416034343698181154952149785120, - 37085176282079168, - 38818928827770241, - 46533542200913581, - 21888242871839275222246405745257275088548364400416034343698149171878672304520, - 21888242871839275222246405745257275088548364400416034343698166580970182531833, - 43477675707817591, - 21888242871839275222246405745257275088548364400416034343698179339233594365356, - 21888242871839275222246405745257275088548364400416034343698179468119296317485, - 18218938118843359, - 30932194210238652, - 21888242871839275222246405745257275088548364400416034343698188985017640738057, - 54170130602493985, - 21888242871839275222246405745257275088548364400416034343698175889496563846063, - 71983478935316300, - 62951181923814191, - 21888242871839275222246405745257275088548364400416034343698138255169082436383, - 21888242871839275222246405745257275088548364400416034343698165241416800067185, - 21888242871839275222246405745257275088548364400416034343698178967424653900354, - 30350306171858633, - 21888242871839275222246405745257275088548364400416034343698136817717513225714, - 7094873155699873, - 14886860358732632, - 21888242871839275222246405745257275088548364400416034343698146728267039743154, - 44748437757196824, - 21888242871839275222246405745257275088548364400416034343698185147015565439541, - 66680745391287410, - 21888242871839275222246405745257275088548364400416034343698188749488532353620, - 36425210963441836, - 21888242871839275222246405745257275088548364400416034343698183749326572768483, - 40958373687099166, - 22728411172734757, - 40864805384376716, - 21888242871839275222246405745257275088548364400416034343698192093666727681737, - 10383186628804314, - 21888242871839275222246405745257275088548364400416034343698199366012723435970, - 53484653400585003, - 21888242871839275222246405745257275088548364400416034343698203982830941787786, - 21888242871839275222246405745257275088548364400416034343698190076501215712656, - 21888242871839275222246405745257275088548364400416034343698195971083770832675, - 56193610758773817, - 69383197781660569, - 21888242871839275222246405745257275088548364400416034343698193038930303644183, - 21888242871839275222246405745257275088548364400416034343698146314925229825828, - 22937996438667911, - 63835460962214885, - 47701601744766639, - 29724672223463213, - 10244876975921701, - 21888242871839275222246405745257275088548364400416034343698182582747254070452, - 53402445926631195, - 7802697406037663, - 21888242871839275222246405745257275088548364400416034343698195631574238825537, - 21888242871839275222246405745257275088548364400416034343698192972291502166329, - 21888242871839275222246405745257275088548364400416034343698152368406989081838, - 21888242871839275222246405745257275088548364400416034343698149798004328080288, - 21888242871839275222246405745257275088548364400416034343698160810472648591275, - 21888242871839275222246405745257275088548364400416034343698174324044698258183, - 12105860602309971, - 21888242871839275222246405745257275088548364400416034343698180398314966683140, - 46917733423648944, - 13169846398498988, - 43720352274386297, - 21888242871839275222246405745257275088548364400416034343698180322249695254902, - 45907061574723258, - 21888242871839275222246405745257275088548364400416034343698133297015991918095, - 21888242871839275222246405745257275088548364400416034343698140882802309553310, - 25031284802995844, - 21888242871839275222246405745257275088548364400416034343698198975932505314556, - 21888242871839275222246405745257275088548364400416034343698169333529555628445, - 19777848138575886, - 52816944280597011, - 52970258951782055, - 21888242871839275222246405745257275088548364400416034343698140494602421695082, - 21888242871839275222246405745257275088548364400416034343698175570954155224034, - 57374483452378326, - 21888242871839275222246405745257275088548364400416034343698179341508041755471, - 8795537629026642, - 21888242871839275222246405745257275088548364400416034343698154652222371564409, - 52312895967338247, - 21888242871839275222246405745257275088548364400416034343698154266984412138298, - 21888242871839275222246405745257275088548364400416034343698175579311082559005, - 18189358520475186, - 21888242871839275222246405745257275088548364400416034343698184959194125917798, - 18720197153486853, - 24326457438148393, - 21888242871839275222246405745257275088548364400416034343698196518383524730353, - 21888242871839275222246405745257275088548364400416034343698199023968178293726, - 43640068995903609, - 8773854279499739, - 21888242871839275222246405745257275088548364400416034343698181582054053372082, - 68325737033748977, - 4947129527493731, - 42798748673697581, - 21888242871839275222246405745257275088548364400416034343698177534565045240310, - 51157078181538060, - 3371862808078779, - 21888242871839275222246405745257275088548364400416034343698149541467230110647, - 21888242871839275222246405745257275088548364400416034343698166777214261841907, - 21888242871839275222246405745257275088548364400416034343698144998979059928790, - 67684401332069814, - 21888242871839275222246405745257275088548364400416034343698135003693427734413, - 21888242871839275222246405745257275088548364400416034343698138581607356313589, - 51855040352694698, - 7798694344268307, - 56782056407165614, - 45026456986940650, - 21888242871839275222246405745257275088548364400416034343698134639409247203551, - 21888242871839275222246405745257275088548364400416034343698179688568012726844, - 58714046860199536, - 21888242871839275222246405745257275088548364400416034343698180015094469974862, - 21888242871839275222246405745257275088548364400416034343698200748840741830141, - 21888242871839275222246405745257275088548364400416034343698165850851820523073, - 21888242871839275222246405745257275088548364400416034343698158046199518906369, - 62163672046007684, - 21888242871839275222246405745257275088548364400416034343698203270877912787214, - 21888242871839275222246405745257275088548364400416034343698148753418290407342, - 35657355075235739, - 21888242871839275222246405745257275088548364400416034343698156317775395892733, - 22103642329009903, - 17653685173382132, - 21888242871839275222246405745257275088548364400416034343698160318538972609969, - 21888242871839275222246405745257275088548364400416034343698182536486710195791, - 21888242871839275222246405745257275088548364400416034343698147379181151466737, - 21888242871839275222246405745257275088548364400416034343698154467798118734539, - 21888242871839275222246405745257275088548364400416034343698157524721001126249, - 14196251590272180, - 26373714785443423, - 22156568208136858, - 6489885820589773, - 21888242871839275222246405745257275088548364400416034343698168680182627099760, - 11145364506011577, - 31097096293804411, - 49349658528616521, - 21888242871839275222246405745257275088548364400416034343698152718312185660611, - 21888242871839275222246405745257275088548364400416034343698173698144145434201, - 56691260772485204, - 53240017114472215, - 70670753972226768, - 67717854442258152, - 21888242871839275222246405745257275088548364400416034343698156846705903447109, - 464758330233620, - 10197915342340875, - 21888242871839275222246405745257275088548364400416034343698175338995493363344, - 21888242871839275222246405745257275088548364400416034343698173505394356831840, - 21888242871839275222246405745257275088548364400416034343698199184965980287418, - 21888242871839275222246405745257275088548364400416034343698134059109031660134, - 21888242871839275222246405745257275088548364400416034343698134844128073290963, - 21888242871839275222246405745257275088548364400416034343698177914332351681087, - 66284607412331074, - 45724083360154472, - 64551151644046416, - 11927829258062065, - 21888242871839275222246405745257275088548364400416034343698183969374589764197, - 21888242871839275222246405745257275088548364400416034343698148430698784738988, - 21888242871839275222246405745257275088548364400416034343698158811529059867385, - 21888242871839275222246405745257275088548364400416034343698202858722335207654, - 29891479911610519, - 21888242871839275222246405745257275088548364400416034343698192443827994582312, - 16971432573329788, - 31268161833992091, - 21888242871839275222246405745257275088548364400416034343698187792479216759379, - 21888242871839275222246405745257275088548364400416034343698183007291626400706, - 21888242871839275222246405745257275088548364400416034343698162002047022630786, - 53573410957386664, - 39424590268008282, - 21888242871839275222246405745257275088548364400416034343698159333881304601696, - 63480504561718431, - 2367141083087947, - 21888242871839275222246405745257275088548364400416034343698155341180332818370, - 54884312686366173, - 18182831975708989, - 21888242871839275222246405745257275088548364400416034343698189915481424455559, - 21888242871839275222246405745257275088548364400416034343698163424376984297204, - 21888242871839275222246405745257275088548364400416034343698147727199638122109, - 28339320405356925, - 21888242871839275222246405745257275088548364400416034343698160459264150627471, - 21888242871839275222246405745257275088548364400416034343698145337653509757495, - 21888242871839275222246405745257275088548364400416034343698132771845968435997, - 21888242871839275222246405745257275088548364400416034343698183127589226865413, - 17655225151030592, - 21888242871839275222246405745257275088548364400416034343698167282726197142351, - 21888242871839275222246405745257275088548364400416034343698192255971781515898, - 21888242871839275222246405745257275088548364400416034343698172887103557962012, - 21888242871839275222246405745257275088548364400416034343698167072867600765908, - 47756080415744668, - 21888242871839275222246405745257275088548364400416034343698162933136507938903, - 21888242871839275222246405745257275088548364400416034343698164280768641956459, - 56852566552248731, - 21888242871839275222246405745257275088548364400416034343698151789927498423984, - 21888242871839275222246405745257275088548364400416034343698162709635474662430, - 21888242871839275222246405745257275088548364400416034343698179150631977053812, - 21888242871839275222246405745257275088548364400416034343698178176329510826469, - 13107553179691692, - 36049463791483683, - 21888242871839275222246405745257275088548364400416034343698199592615653392115, - 21888242871839275222246405745257275088548364400416034343698145057354778547091, - 23414412039676986, - 21888242871839275222246405745257275088548364400416034343698200771153392281147, - 56250419888078260, - 21888242871839275222246405745257275088548364400416034343698170983306924946413, - 21888242871839275222246405745257275088548364400416034343698158267262204869268, - 25657206291838655, - 21888242871839275222246405745257275088548364400416034343698177272896418859206, - 21888242871839275222246405745257275088548364400416034343698198025857437119844, - 21888242871839275222246405745257275088548364400416034343698194212274599342956, - 67981572853519302, - 29279891939871990, - 1635906527236001, - 35296165694571441, - 17899477160183034, - 21888242871839275222246405745257275088548364400416034343698185107706215327962, - 72012745655442599, - 21888242871839275222246405745257275088548364400416034343698166759463124632486, - 64086224497805742, - 21888242871839275222246405745257275088548364400416034343698140153255728556330, - 47522302539581382, - 23072285259142210, - 21888242871839275222246405745257275088548364400416034343698144718626838823042, - 21888242871839275222246405745257275088548364400416034343698155381612638470168, - 15149251236261854, - 23641339006364004, - 21888242871839275222246405745257275088548364400416034343698177411767930743742, - 21888242871839275222246405745257275088548364400416034343698151560622027871792, - 21888242871839275222246405745257275088548364400416034343698178348888621525575, - 21888242871839275222246405745257275088548364400416034343698133336561385425762, - 21888242871839275222246405745257275088548364400416034343698176174239362621819, - 53207502074907404, - 50018043244406736, - 3939704243204885, - 21888242871839275222246405745257275088548364400416034343698144247019128679265, - 21888242871839275222246405745257275088548364400416034343698146194494607113342, - 21888242871839275222246405745257275088548364400416034343698197882684389452456, - 37471383754110088, - 21888242871839275222246405745257275088548364400416034343698194495522571733390, - 21888242871839275222246405745257275088548364400416034343698161155557170211854, - 21888242871839275222246405745257275088548364400416034343698178412310244661960, - 21888242871839275222246405745257275088548364400416034343698143750081925518372, - 21888242871839275222246405745257275088548364400416034343698173327338390712634, - 21888242871839275222246405745257275088548364400416034343698169011003764809540, - 59470301968353148, - 21888242871839275222246405745257275088548364400416034343698132797943376609436, - 21888242871839275222246405745257275088548364400416034343698150290801629685772, - 21888242871839275222246405745257275088548364400416034343698135803594081052183, - 54247509101796643, - 37137792466621191, - 21888242871839275222246405745257275088548364400416034343698160215663628073147, - 21888242871839275222246405745257275088548364400416034343698188769877572168465, - 21888242871839275222246405745257275088548364400416034343698200379218561283885, - 21888242871839275222246405745257275088548364400416034343698188067491666243478, - 21888242871839275222246405745257275088548364400416034343698141479469082158705, - 21888242871839275222246405745257275088548364400416034343698161093361499618742, - 21888242871839275222246405745257275088548364400416034343698135506568696656233, - 21888242871839275222246405745257275088548364400416034343698155662463675534145, - 21888242871839275222246405745257275088548364400416034343698199168687486554170, - 58262757669047463, - 21888242871839275222246405745257275088548364400416034343698143166409706333915, - 38235597011996025, - 35353775578050615, - 40187655070364208, - 16274486745391061, - 21888242871839275222246405745257275088548364400416034343698166106227409194820, - 21888242871839275222246405745257275088548364400416034343698197657687057048476, - 30803579998202569, - 61035296017736933, - 21888242871839275222246405745257275088548364400416034343698141197803359388119, - 21888242871839275222246405745257275088548364400416034343698180999682353829777, - 21888242871839275222246405745257275088548364400416034343698185981077972273602, - 21888242871839275222246405745257275088548364400416034343698201946834597396116, - 65461715019262034, - 58820567927608137, - 21888242871839275222246405745257275088548364400416034343698132910041152175940, - 21888242871839275222246405745257275088548364400416034343698181108228386949786, - 50314101991588278, - 45445312467217402, - 33676233913892872, - 27449440923047211, - 35398461953684542, - 21888242871839275222246405745257275088548364400416034343698146375189240011098, - 21888242871839275222246405745257275088548364400416034343698196744240946207273, - 39644979529520003, - 2920481290015599, - 50008627487730079, - 37276151636949224, - 45407895803508846, - 26873852470443870, - 21888242871839275222246405745257275088548364400416034343698148798627252968610, - 21888242871839275222246405745257275088548364400416034343698174983459659991871, - 21888242871839275222246405745257275088548364400416034343698197759945625712519, - 21888242871839275222246405745257275088548364400416034343698192724812814359223, - 21888242871839275222246405745257275088548364400416034343698175238909975264373, - 1164807476105503, - 24111577364803754, - 55812950522542530, - 67872478014158030, - 21888242871839275222246405745257275088548364400416034343698203380458504542942, - 30679861844748447, - 26960434528951768, - 21888242871839275222246405745257275088548364400416034343698153641733878118703, - 21888242871839275222246405745257275088548364400416034343698133627496158287288, - 21888242871839275222246405745257275088548364400416034343698146681667241591081, - 48541282978247982, - 18641984979222352, - 17192772591600584, - 43383761609431856, - 67411725947583216, - 70882607395884081, - 21888242871839275222246405745257275088548364400416034343698166258448983388711, - 21888242871839275222246405745257275088548364400416034343698142239338658769482, - 60742039927635568, - 61061706193172969, - 1903088600133082, - 41428081812456165, - 21888242871839275222246405745257275088548364400416034343698165212801007535215, - 21888242871839275222246405745257275088548364400416034343698158375953097146801, - 4715176743671101, - 62688032035528217, - 551840102207240, - 55530685824651863, - 15938309743216181, - 21888242871839275222246405745257275088548364400416034343698144988537198171580, - 21888242871839275222246405745257275088548364400416034343698170433007487316081, - 712626744308198, - 21888242871839275222246405745257275088548364400416034343698189720226785265821, - 21888242871839275222246405745257275088548364400416034343698151823530520463939, - 10641578672253854, - 21888242871839275222246405745257275088548364400416034343698185061146698774882, - 21888242871839275222246405745257275088548364400416034343698190728436439196816, - 61047555654875437, - 21888242871839275222246405745257275088548364400416034343698178421883887980042, - 21888242871839275222246405745257275088548364400416034343698159676252759866817, - 22128103473841434, - 21888242871839275222246405745257275088548364400416034343698194132497147928983, - 21888242871839275222246405745257275088548364400416034343698172884163951564281, - 21888242871839275222246405745257275088548364400416034343698163933691018066300, - 3459402798557007, - 21888242871839275222246405745257275088548364400416034343698164995659898903305, - 21888242871839275222246405745257275088548364400416034343698135351731838514334, - 21888242871839275222246405745257275088548364400416034343698137148843050425198, - 46104668079278034, - 44990227952220542, - 69990560051840804, - 34186609139196562, - 42227469242633222, - 27202422427685437, - 24293851388981081, - 21888242871839275222246405745257275088548364400416034343698196728927480596944, - 61002303908053191, - 21888242871839275222246405745257275088548364400416034343698181175932503157780, - 21888242871839275222246405745257275088548364400416034343698203224281764523789, - 4349988018129475, - 69658500227230024, - 21888242871839275222246405745257275088548364400416034343698133460567688301405, - 24211353466894872, - 17523037974668673, - 21888242871839275222246405745257275088548364400416034343698158924655107255435, - 21888242871839275222246405745257275088548364400416034343698167282553174192478, - 21888242871839275222246405745257275088548364400416034343698150441492872080678, - 21888242871839275222246405745257275088548364400416034343698141072603569732423, - 45496432132898783, - 21888242871839275222246405745257275088548364400416034343698187000099533920886, - 21888242871839275222246405745257275088548364400416034343698149220229675558393, - 69127878752494546, - 57842194731708327, - 21888242871839275222246405745257275088548364400416034343698197082675372756838, - 21888242871839275222246405745257275088548364400416034343698178091726866607101, - 21888242871839275222246405745257275088548364400416034343698195718832525665727, - 21888242871839275222246405745257275088548364400416034343698186497620306266144, - 36785523297572243, - 1529590539415783, - 21888242871839275222246405745257275088548364400416034343698164185061606159133, - 21888242871839275222246405745257275088548364400416034343698200563254189915100, - 5723936669425003, - 30813104717361230, - 21888242871839275222246405745257275088548364400416034343698186574779567892734, - 43417647386807928, - 39575827420087758, - 21888242871839275222246405745257275088548364400416034343698162932896656867213, - 25830155333008248, - 56201206378617489, - 60454844589024776, - 5241375051953621, - 21888242871839275222246405745257275088548364400416034343698175255376350824899, - 21888242871839275222246405745257275088548364400416034343698143848793082502737, - 23601723456650839, - 19741154545489465, - 12034375602913591, - 21888242871839275222246405745257275088548364400416034343698200500232954492719, - 34075947707127126, - 46984036437391892, - 21888242871839275222246405745257275088548364400416034343698145262281829564152, - 21888242871839275222246405745257275088548364400416034343698164209057925773689, - 39138078272084325, - 40794251091645336, - 19284130087094611, - 25841362852124354, - 21888242871839275222246405745257275088548364400416034343698175481158665780890, - 21888242871839275222246405745257275088548364400416034343698188616414998288173, - 10319705881727326, - 2853457578401536, - 54240104006431552, - 21888242871839275222246405745257275088548364400416034343698166932483505151085, - 49960255581744008, - 21888242871839275222246405745257275088548364400416034343698195752716812048433, - 21888242871839275222246405745257275088548364400416034343698175984540577762697, - 21888242871839275222246405745257275088548364400416034343698135147804056322161, - 7435015041005501, - 33458047625343816, - 62784391992752475, - 21888242871839275222246405745257275088548364400416034343698143230904107394033, - 36770558296257909, - 6501892936419568, - 8819926273782192, - 65819483308282891, - 21888242871839275222246405745257275088548364400416034343698186099521346446405, - 70433431993347856, - 21888242871839275222246405745257275088548364400416034343698197721052792845294, - 21888242871839275222246405745257275088548364400416034343698201683080746759264, - 21888242871839275222246405745257275088548364400416034343698153095357194410369, - 21888242871839275222246405745257275088548364400416034343698158476357289294856, - 21888242871839275222246405745257275088548364400416034343698196544847422217615, - 5682714846278752, - 21888242871839275222246405745257275088548364400416034343698180780275048601493, - 8752191677446094, - 24905071937781, - 47607525423861959, - 21888242871839275222246405745257275088548364400416034343698194351555675795114, - 42245630397535497, - 21888242871839275222246405745257275088548364400416034343698165199715606643097, - 1754713891430592, - 67628800703418794, - 29805308321976377, - 48461239412799591, - 21888242871839275222246405745257275088548364400416034343698133400512055062629, - 21888242871839275222246405745257275088548364400416034343698169594592082717754, - 21888242871839275222246405745257275088548364400416034343698147101284887129937, - 31179960555867764, - 3221954382192573, - 27484958533622761, - 21888242871839275222246405745257275088548364400416034343698191778542469075067, - 21888242871839275222246405745257275088548364400416034343698189030191959512352, - 21888242871839275222246405745257275088548364400416034343698199987229147023513, - 51677710018873867, - 7873379227989219, - 4410768635167268, - 21888242871839275222246405745257275088548364400416034343698176987134866914436, - 21888242871839275222246405745257275088548364400416034343698132841032852829302, - 21888242871839275222246405745257275088548364400416034343698187881611659440160, - 56142533997142704, - 3279288147329650, - 30852317808107797, - 48298783773817214, - 21888242871839275222246405745257275088548364400416034343698202315628733753808, - 39118989529601200, - 18835398547225700, - 55146897414087804, - 41624700845332381, - 58272382252290700, - 21888242871839275222246405745257275088548364400416034343698133019442627322004, - 61493477993339473, - 65835577320742365, - 21888242871839275222246405745257275088548364400416034343698198084203628198367, - 21888242871839275222246405745257275088548364400416034343698154398010035612295, - 21888242871839275222246405745257275088548364400416034343698148085237244569000, - 21888242871839275222246405745257275088548364400416034343698176116560890398792, - 15097984852415784, - 27271508592410439, - 21888242871839275222246405745257275088548364400416034343698165054300885606956, - 5101074932094559, - 54989179055852933, - 6062912996901530, - 21888242871839275222246405745257275088548364400416034343698153889795150453327, - 1054385920237324, - 21888242871839275222246405745257275088548364400416034343698170090342987424587, - 21888242871839275222246405745257275088548364400416034343698202105090985858400, - 41115491998114586, - 21888242871839275222246405745257275088548364400416034343698167852373053980547, - 56409445853567767, - 3540581719113264, - 21888242871839275222246405745257275088548364400416034343698148924748902573291, - 50766724479340541, - 21888242871839275222246405745257275088548364400416034343698195941306757931695, - 21888242871839275222246405745257275088548364400416034343698183096237038761335, - 62491104639348078, - 21888242871839275222246405745257275088548364400416034343698159896535316808643, - 21888242871839275222246405745257275088548364400416034343698136755592765478507, - 56396474591714132, - 21888242871839275222246405745257275088548364400416034343698159059442931481780, - 47169726744107737, - 21888242871839275222246405745257275088548364400416034343698201601856542679926, - 21888242871839275222246405745257275088548364400416034343698134207866333787032, - 21888242871839275222246405745257275088548364400416034343698191144569653647493, - 16456524974376101, - 16899577138553625, - 21888242871839275222246405745257275088548364400416034343698154679673678844263, - 50379551077125634, - 21888242871839275222246405745257275088548364400416034343698143163216045514633, - 11491648148419959, - 12682392274264300, - 56185158527385065, - 62205917699707885, - 11845970614210733, - 7118280694596865, - 21888242871839275222246405745257275088548364400416034343698190838818246029556, - 21888242871839275222246405745257275088548364400416034343698155990475340259770, - 21888242871839275222246405745257275088548364400416034343698200036670211831352, - 12080139173699206, - 4441590167723547, - 4195721767807678, - 21888242871839275222246405745257275088548364400416034343698168586527981261145, - 21888242871839275222246405745257275088548364400416034343698196427663598882666, - 21888242871839275222246405745257275088548364400416034343698194767572343639064, - 4507564960590998, - 11880199068718883, - 24551072655113377, - 21888242871839275222246405745257275088548364400416034343698190687252748025584, - 21888242871839275222246405745257275088548364400416034343698170962736959069055, - 69511932186723395, - 15005965222112828, - 55422968596099444, - 63242931868541063, - 21888242871839275222246405745257275088548364400416034343698157362279006490251, - 46246926734379420, - 21205939608523925, - 63584709004568526, - 21888242871839275222246405745257275088548364400416034343698144957192105413148, - 21888242871839275222246405745257275088548364400416034343698145560388923556617, - 43869991008395709, - 21888242871839275222246405745257275088548364400416034343698132270507982363338, - 89236082145330, - 21888242871839275222246405745257275088548364400416034343698134481681267762166, - 64540601932650286, - 7813772327316134, - 56234021582673521, - 41259458443971671, - 23208916739369190, - 21888242871839275222246405745257275088548364400416034343698159452966784213843, - 431412512683756, - 21888242871839275222246405745257275088548364400416034343698173031096511235011, - 21888242871839275222246405745257275088548364400416034343698133538884187381491, - 21888242871839275222246405745257275088548364400416034343698181736368983590991, - 21888242871839275222246405745257275088548364400416034343698176228128435708732, - 21888242871839275222246405745257275088548364400416034343698145652915346464022, - 21888242871839275222246405745257275088548364400416034343698166259956416742722, - 43763817678266055, - 21888242871839275222246405745257275088548364400416034343698181771770735236524, - 21888242871839275222246405745257275088548364400416034343698148781493756823293, - 44508511186638519, - 22576099404637664, - 21888242871839275222246405745257275088548364400416034343698137230011457624379, - 21888242871839275222246405745257275088548364400416034343698150772346203136367, - 11593753831894890, - 21888242871839275222246405745257275088548364400416034343698189979012894209454, - 54249059407939664, - 21888242871839275222246405745257275088548364400416034343698189937305789119687, - 21888242871839275222246405745257275088548364400416034343698169556031978197323, - 46187925031673187, - 71530339917364033, - 59893487380656661, - 21888242871839275222246405745257275088548364400416034343698141033857500651789, - 6815356271858088, - 21888242871839275222246405745257275088548364400416034343698163790957099004873, - 30230433005823558, - 4501679590033252, - 32341982934818217, - 61569932916119653, - 10632916468776486, - 41655752414327633, - 21888242871839275222246405745257275088548364400416034343698171989117977418128, - 21888242871839275222246405745257275088548364400416034343698148399132162808311, - 21888242871839275222246405745257275088548364400416034343698147785757403648869, - 21888242871839275222246405745257275088548364400416034343698170257233259168344, - 21888242871839275222246405745257275088548364400416034343698132909784889502460, - 21888242871839275222246405745257275088548364400416034343698144640735081033834, - 22923493728660826, - 27352192430630362, - 21888242871839275222246405745257275088548364400416034343698164712372078956595, - 43007655853346228, - 33947012238949455, - 21888242871839275222246405745257275088548364400416034343698191021441792669421, - 10004631562827752, - 7925977611616967, - 5881296287772945, - 21888242871839275222246405745257275088548364400416034343698201634588001166951, - 33544698848665018, - 21888242871839275222246405745257275088548364400416034343698182192388616144781, - 17683513385226287, - 21888242871839275222246405745257275088548364400416034343698193066046546621418, - 20857838427553869, - 21888242871839275222246405745257275088548364400416034343698196043233289798490, - 52103799944405762, - 15437895581088346, - 14649309966736500, - 3049708643786075, - 21888242871839275222246405745257275088548364400416034343698200943070575270860, - 21888242871839275222246405745257275088548364400416034343698158277592392308837, - 21888242871839275222246405745257275088548364400416034343698182602129407207655, - 70639794677258823, - 21888242871839275222246405745257275088548364400416034343698163130026017390943, - 21888242871839275222246405745257275088548364400416034343698194199190564565624, - 1848883919974675, - 60015246580953092, - 21888242871839275222246405745257275088548364400416034343698150996826172048267, - 21888242871839275222246405745257275088548364400416034343698181015189857393908, - 21888242871839275222246405745257275088548364400416034343698140726441951405828, - 21888242871839275222246405745257275088548364400416034343698198373962221710567, - 21888242871839275222246405745257275088548364400416034343698181912178855701282, - 21888242871839275222246405745257275088548364400416034343698139060976926319510, - 21888242871839275222246405745257275088548364400416034343698195686701408062480, - 27037495596749145, - 21888242871839275222246405745257275088548364400416034343698136469146216523562, - 7048144327705513, - 40464195426211930, - 21888242871839275222246405745257275088548364400416034343698162459950502964167, - 28237246973452917, - 21888242871839275222246405745257275088548364400416034343698139649423950152285, - 21888242871839275222246405745257275088548364400416034343698192026148258601342, - 21888242871839275222246405745257275088548364400416034343698171091184510760142, - 33942876304902125, - 809738994775271, - 21888242871839275222246405745257275088548364400416034343698151781692746398081, - 41767441574419269, - 64168579951293767, - 28403475749249241, - 21888242871839275222246405745257275088548364400416034343698150566976440714871, - 21888242871839275222246405745257275088548364400416034343698136625253337729782, - 21888242871839275222246405745257275088548364400416034343698166825027561096073, - 5137427529969896, - 55246807806383729, - 21888242871839275222246405745257275088548364400416034343698160048723881109256, - 21888242871839275222246405745257275088548364400416034343698161726170221794288, - 24527175743913639, - 21888242871839275222246405745257275088548364400416034343698166076980173578147, - 55097924129658560, - 40655586083821473, - 55254516028684424, - 65854049175602817, - 21888242871839275222246405745257275088548364400416034343698203745193045656455, - 29151839408300597, - 65934176653556498, - 41970277187569780, - 21888242871839275222246405745257275088548364400416034343698145782090707804970, - 59095872554743977, - 21888242871839275222246405745257275088548364400416034343698148325540278260070, - 49445414515857619, - 21888242871839275222246405745257275088548364400416034343698176462473509216068, - 5092957245143639, - 21888242871839275222246405745257275088548364400416034343698171176631925632025, - 59334137750714112, - 45836029847757105, - 21888242871839275222246405745257275088548364400416034343698176121685201461913, - 21888242871839275222246405745257275088548364400416034343698154108441792626124, - 21888242871839275222246405745257275088548364400416034343698192314645868351973, - 21888242871839275222246405745257275088548364400416034343698177926119688215565, - 21888242871839275222246405745257275088548364400416034343698152295778277792987, - 21888242871839275222246405745257275088548364400416034343698181300040553271388, - 21888242871839275222246405745257275088548364400416034343698140554909696706840, - 71342492109783765, - 21888242871839275222246405745257275088548364400416034343698135369697973957986, - 21888242871839275222246405745257275088548364400416034343698190710364584312561, - 28117502938626795, - 71938233250921385, - 2525948806152328, - 21888242871839275222246405745257275088548364400416034343698179523547031984512, - 21888242871839275222246405745257275088548364400416034343698145566692901674903, - 27345152937857322, - 11292738221151568, - 42946810975268056, - 23736140444955318, - 21888242871839275222246405745257275088548364400416034343698189299269622642085, - 21888242871839275222246405745257275088548364400416034343698164189951626075375, - 21888242871839275222246405745257275088548364400416034343698141804675260494190, - 21888242871839275222246405745257275088548364400416034343698153769684391900420, - 57629009328750725, - 71643127771198661, - 11512733105446590, - 28410102586029141, - 11205568014222650, - 21888242871839275222246405745257275088548364400416034343698178395016744567576, - 21888242871839275222246405745257275088548364400416034343698144971123014350014, - 21888242871839275222246405745257275088548364400416034343698190461460570973095, - 21888242871839275222246405745257275088548364400416034343698185385329647951367, - 48071679480158699, - 21888242871839275222246405745257275088548364400416034343698196643634859560528, - 10370283654261795, - 21888242871839275222246405745257275088548364400416034343698167736283467548518, - 21888242871839275222246405745257275088548364400416034343698154465409355095021, - 21888242871839275222246405745257275088548364400416034343698152066247136363390, - 21888242871839275222246405745257275088548364400416034343698148638578422393051, - 21888242871839275222246405745257275088548364400416034343698174663233215471315, - 21888242871839275222246405745257275088548364400416034343698197214105469517626, - 21888242871839275222246405745257275088548364400416034343698170017569772043632, - 70717215174219145, - 21888242871839275222246405745257275088548364400416034343698186116882229510659, - 21888242871839275222246405745257275088548364400416034343698183100749779679413, - 21888242871839275222246405745257275088548364400416034343698167844569080509729, - 21888242871839275222246405745257275088548364400416034343698177905205990488648, - 21888242871839275222246405745257275088548364400416034343698149056926298464448, - 21888242871839275222246405745257275088548364400416034343698185260507681596140, - 21888242871839275222246405745257275088548364400416034343698189285340389646378, - 22268768466161229, - 21888242871839275222246405745257275088548364400416034343698182084860466479728, - 21888242871839275222246405745257275088548364400416034343698162661250332696436, - 21888242871839275222246405745257275088548364400416034343698187694612382476229, - 68099297566696811, - 21888242871839275222246405745257275088548364400416034343698199040933590072541, - 15405748187344556, - 21888242871839275222246405745257275088548364400416034343698142694634276553672, - 21888242871839275222246405745257275088548364400416034343698198746110593555216, - 22507389660164138, - 11554934472893310, - 21888242871839275222246405745257275088548364400416034343698153165326585953935, - 68539181855684437, - 21888242871839275222246405745257275088548364400416034343698192171090531790448, - 21888242871839275222246405745257275088548364400416034343698181809787259890845, - 62408840110330105, - 21888242871839275222246405745257275088548364400416034343698171404328801120981, - 35365534243023528, - 21888242871839275222246405745257275088548364400416034343698150880242383350154, - 48906239635590380, - 21888242871839275222246405745257275088548364400416034343698178724399025920569, - 21193496450187249, - 47545078672266225, - 2438604902560710, - 21888242871839275222246405745257275088548364400416034343698139256508318028519, - 21888242871839275222246405745257275088548364400416034343698151676973284892195, - 13003366515415139, - 21888242871839275222246405745257275088548364400416034343698190911081593146931, - 21888242871839275222246405745257275088548364400416034343698174477172613057868, - 21888242871839275222246405745257275088548364400416034343698138253736191418524, - 21888242871839275222246405745257275088548364400416034343698137445353675274433, - 3611125377250342, - 21888242871839275222246405745257275088548364400416034343698189060805231810056, - 21888242871839275222246405745257275088548364400416034343698171517668634886238, - 21888242871839275222246405745257275088548364400416034343698176073121957329971, - 13039002608208345, - 21888242871839275222246405745257275088548364400416034343698133832673639303262, - 21888242871839275222246405745257275088548364400416034343698156570628281578641, - 21888242871839275222246405745257275088548364400416034343698135916886739295790, - 62138715865739804, - 31950863535548066, - 21888242871839275222246405745257275088548364400416034343698176135242430729831, - 69219868136737948, - 21888242871839275222246405745257275088548364400416034343698152323902662105512, - 56844518814311663, - 21888242871839275222246405745257275088548364400416034343698159650918694744190, - 56204920275320036, - 33281258672521674, - 52545850205087245, - 63553910581320765, - 21888242871839275222246405745257275088548364400416034343698174656568575873532, - 21888242871839275222246405745257275088548364400416034343698163572205754938621, - 27348488337134089, - 21888242871839275222246405745257275088548364400416034343698138312034119341660, - 21888242871839275222246405745257275088548364400416034343698172641338878571158, - 48912855386982592, - 21888242871839275222246405745257275088548364400416034343698197023689605191282, - 11040044223109708, - 21888242871839275222246405745257275088548364400416034343698197411946211054362, - 31323133324433781, - 12070898413511938, - 21888242871839275222246405745257275088548364400416034343698201325876834811621, - 21888242871839275222246405745257275088548364400416034343698164399144683410021, - 36720145519359130, - 7973180051930070, - 37813001232804322, - 54270221131661093, - 48656951214413700, - 21888242871839275222246405745257275088548364400416034343698177764935335538300, - 19550543483230890, - 21410524417677875, - 55306360687463158, - 65155702407176378, - 50022257034156538, - 21888242871839275222246405745257275088548364400416034343698193125578388901100, - 21888242871839275222246405745257275088548364400416034343698147030132864544133, - 59430195386266906, - 21888242871839275222246405745257275088548364400416034343698147534828453565791, - 6775158001032371, - 20531147009804936, - 2289259821386910, - 21888242871839275222246405745257275088548364400416034343698138869419334379116, - 21888242871839275222246405745257275088548364400416034343698154067099254996164, - 21888242871839275222246405745257275088548364400416034343698161200292384558700, - 30777563208641780, - 31035263398519390, - 41918580600603403, - 21888242871839275222246405745257275088548364400416034343698189150643975987216, - 21888242871839275222246405745257275088548364400416034343698171257500309096714, - 21888242871839275222246405745257275088548364400416034343698194322528120829447, - 21888242871839275222246405745257275088548364400416034343698181844586260612809, - 51057496882199526, - 21888242871839275222246405745257275088548364400416034343698192491493761852578, - 21888242871839275222246405745257275088548364400416034343698148732334130668308, - 43251529676842347, - 21888242871839275222246405745257275088548364400416034343698203542441182488237, - 21888242871839275222246405745257275088548364400416034343698139155328718222607, - 21888242871839275222246405745257275088548364400416034343698188148699565466646, - 65117038772740128, - 62201748226412330, - 45147024032519635, - 59218305307410847, - 26528908924596660, - 21888242871839275222246405745257275088548364400416034343698136565388837469033, - 9668440959920046, - 14939237245192844, - 21888242871839275222246405745257275088548364400416034343698189718134857181956, - 21888242871839275222246405745257275088548364400416034343698134384186943457144, - 19554847005771130, - 21888242871839275222246405745257275088548364400416034343698171813163206764736, - 21888242871839275222246405745257275088548364400416034343698170986482505442066, - 21888242871839275222246405745257275088548364400416034343698200236633608538773, - 69751844724128818, - 67418013538056359, - 21888242871839275222246405745257275088548364400416034343698152282974793523953, - 50329100525751716, - 32058790248548168, - 21888242871839275222246405745257275088548364400416034343698203244696436045248, - 21888242871839275222246405745257275088548364400416034343698150628265272116643, - 21888242871839275222246405745257275088548364400416034343698187161477377244208, - 21888242871839275222246405745257275088548364400416034343698157013369928082462, - 21888242871839275222246405745257275088548364400416034343698156022332229276279, - 26537449917609119, - 25159387356028246, - 21888242871839275222246405745257275088548364400416034343698182318490301395387, - 21888242871839275222246405745257275088548364400416034343698156165426515609794, - 59577181206142856, - 21888242871839275222246405745257275088548364400416034343698172232615447931262, - 21888242871839275222246405745257275088548364400416034343698172190948874971251, - 21888242871839275222246405745257275088548364400416034343698176648104622393400, - 2402154874025196, - 22517933396526213, - 21888242871839275222246405745257275088548364400416034343698148938980333046407, - 21888242871839275222246405745257275088548364400416034343698174423010604784576, - 21888242871839275222246405745257275088548364400416034343698189974801315813500, - 21888242871839275222246405745257275088548364400416034343698154849216607992473, - 53193101957542973, - 21888242871839275222246405745257275088548364400416034343698193005721603595555, - 9197326830990633, - 21888242871839275222246405745257275088548364400416034343698147909813989721512, - 747992241145558, - 21888242871839275222246405745257275088548364400416034343698169998902122739633, - 21888242871839275222246405745257275088548364400416034343698196040042440279714, - 20891718914647073, - 21888242871839275222246405745257275088548364400416034343698150765573143583874, - 21888242871839275222246405745257275088548364400416034343698192432355507653087, - 21888242871839275222246405745257275088548364400416034343698176662508763910071, - 14992752699793357, - 21888242871839275222246405745257275088548364400416034343698170673006441929313, - 13961274018407817, - 41513516871101081, - 43681466065569404, - 21888242871839275222246405745257275088548364400416034343698173952484459468242, - 767184770463319, - 21888242871839275222246405745257275088548364400416034343698179013486614454887, - 21888242871839275222246405745257275088548364400416034343698183459332693824547, - 21888242871839275222246405745257275088548364400416034343698201623939858124127, - 21888242871839275222246405745257275088548364400416034343698138411029521366613, - 60090113270528872, - 21888242871839275222246405745257275088548364400416034343698187106933724447835, - 21888242871839275222246405745257275088548364400416034343698152385188052275094, - 30425490592032089, - 50498163418740149, - 21888242871839275222246405745257275088548364400416034343698190198882743367810, - 59980078626661460, - 31741646014953728, - 63705324665679009, - 21888242871839275222246405745257275088548364400416034343698183587237000101982, - 26329727591386055, - 21888242871839275222246405745257275088548364400416034343698168047819158771750, - 21888242871839275222246405745257275088548364400416034343698160917614793945853, - 21888242871839275222246405745257275088548364400416034343698138324285950739582, - 52218160171972220, - 16755847815867610, - 21888242871839275222246405745257275088548364400416034343698146558667517991265, - 408494059140505, - 21888242871839275222246405745257275088548364400416034343698175983412193105323, - 21888242871839275222246405745257275088548364400416034343698141693792015781287, - 63533283986883031, - 21888242871839275222246405745257275088548364400416034343698177221113766100277, - 21888242871839275222246405745257275088548364400416034343698150023361893607741, - 10589065911683310, - 52139165999147588, - 7920576261911767, - 21888242871839275222246405745257275088548364400416034343698156028495268842257, - 59598740771305352, - 21888242871839275222246405745257275088548364400416034343698140038860757675739, - 64103800423179366, - 37194041856460363, - 12285009012444058, - 21888242871839275222246405745257275088548364400416034343698151794999632305720, - 39895050168629790, - 21888242871839275222246405745257275088548364400416034343698200199207863208151, - 71066492802326133, - 21888242871839275222246405745257275088548364400416034343698179526616511912355, - 2883574900591145, - 3168368820172394, - 21888242871839275222246405745257275088548364400416034343698147620015773502564, - 21888242871839275222246405745257275088548364400416034343698142580574940697180, - 21888242871839275222246405745257275088548364400416034343698140174523297776698, - 21888242871839275222246405745257275088548364400416034343698141965690005927238, - 21888242871839275222246405745257275088548364400416034343698162310217222691479, - 71585971735536169, - 21888242871839275222246405745257275088548364400416034343698182614491396514670, - 2570642543925081, - 9603832040828269, - 8973288562180655, - 54353774865256016, - 23053173529663173, - 15146428499824927, - 21888242871839275222246405745257275088548364400416034343698136494051834580543, - 9836622360896288, - 21888242871839275222246405745257275088548364400416034343698140761600176257550, - 21888242871839275222246405745257275088548364400416034343698177990646249010714, - 40997086324129519, - 21888242871839275222246405745257275088548364400416034343698147049813222152422, - 21888242871839275222246405745257275088548364400416034343698178096779482880847, - 47341197206256663, - 21888242871839275222246405745257275088548364400416034343698190432980893533138, - 67342438348231454, - 15541853640200021, - 21888242871839275222246405745257275088548364400416034343698183738344582023585, - 21888242871839275222246405745257275088548364400416034343698176027174921304709, - 21888242871839275222246405745257275088548364400416034343698188945229069342342, - 22163038727429237, - 21888242871839275222246405745257275088548364400416034343698160947480950792011, - 21888242871839275222246405745257275088548364400416034343698151483630849637298, - 21888242871839275222246405745257275088548364400416034343698166669454654042848, - 44818681713822945, - 56402993664186271, - 50479898310380356, - 21888242871839275222246405745257275088548364400416034343698169598416027277838, - 21888242871839275222246405745257275088548364400416034343698198307448577544931, - 29263738083819132, - 21888242871839275222246405745257275088548364400416034343698194776709647264393, - 603665968086970, - 15746231345642693, - 21888242871839275222246405745257275088548364400416034343698132980087341352269, - 42053568254581568, - 53159086593284058, - 21888242871839275222246405745257275088548364400416034343698141534017800330359, - 21888242871839275222246405745257275088548364400416034343698183518216379878332, - 33383114119234395, - 21888242871839275222246405745257275088548364400416034343698144039272228877274, - 21888242871839275222246405745257275088548364400416034343698169554245336880592, - 16468193673645291, - 21888242871839275222246405745257275088548364400416034343698142060874084634268, - 24926697187326869, - 21888242871839275222246405745257275088548364400416034343698164318578426184422, - 21888242871839275222246405745257275088548364400416034343698174937460991780212, - 21888242871839275222246405745257275088548364400416034343698182683493223292646, - 61311546705158585, - 21888242871839275222246405745257275088548364400416034343698149667487513113715, - 21888242871839275222246405745257275088548364400416034343698149135357584532597, - 21888242871839275222246405745257275088548364400416034343698178953291485929949, - 44213544127873534, - 21888242871839275222246405745257275088548364400416034343698170244302104337208, - 21888242871839275222246405745257275088548364400416034343698202029901984960314, - 21888242871839275222246405745257275088548364400416034343698198227042219279618, - 42281950848581834, - 21888242871839275222246405745257275088548364400416034343698181324992212475893, - 21888242871839275222246405745257275088548364400416034343698196417057234179653, - 21888242871839275222246405745257275088548364400416034343698152577820421164723, - 21888242871839275222246405745257275088548364400416034343698194995878773700765, - 8086280197889875, - 21888242871839275222246405745257275088548364400416034343698193119197781368964, - 21888242871839275222246405745257275088548364400416034343698178711511438555857, - 21888242871839275222246405745257275088548364400416034343698142251869327508041, - 29211722231656383, - 62630483375669243, - 21888242871839275222246405745257275088548364400416034343698138255480041928278, - 21888242871839275222246405745257275088548364400416034343698193129521270277300, - 2216451961049614, - 21888242871839275222246405745257275088548364400416034343698139973928549284193, - 21888242871839275222246405745257275088548364400416034343698135066583391166509, - 5628872661218652, - 72053541779225126, - 21888242871839275222246405745257275088548364400416034343698145642145975027113, - 21888242871839275222246405745257275088548364400416034343698171911275896752810, - 21888242871839275222246405745257275088548364400416034343698170811305971975232, - 21888242871839275222246405745257275088548364400416034343698165207715197305441, - 6066644774101993, - 30575801651545062, - 25333823265858036, - 35920358395527252, - 21888242871839275222246405745257275088548364400416034343698150653696268263175, - 21888242871839275222246405745257275088548364400416034343698173081102736693340, - 21888242871839275222246405745257275088548364400416034343698151502569426399128, - 25882138053019191, - 47529844233654534, - 21888242871839275222246405745257275088548364400416034343698202532813555169936, - 21888242871839275222246405745257275088548364400416034343698139699194518121939, - 21888242871839275222246405745257275088548364400416034343698161629743827125324, - 40730997421180322, - 21888242871839275222246405745257275088548364400416034343698186223783337774175, - 21888242871839275222246405745257275088548364400416034343698185569874585293948, - 39961511137996127, - 21888242871839275222246405745257275088548364400416034343698194945073862104642, - 21888242871839275222246405745257275088548364400416034343698198946997142794561, - 51760653086947547, - 21888242871839275222246405745257275088548364400416034343698176435185697602078, - 4926167682569331, - 21888242871839275222246405745257275088548364400416034343698136262916231897988, - 56388042581733686, - 21888242871839275222246405745257275088548364400416034343698153104074482982769, - 55812461668639148, - 21888242871839275222246405745257275088548364400416034343698187243343364229440, - 21888242871839275222246405745257275088548364400416034343698184973364174300370, - 52476340930678878, - 21888242871839275222246405745257275088548364400416034343698145286213015372440, - 47458161129957286, - 42510481721208730, - 9183180453629210, - 62302062555945497, - 21888242871839275222246405745257275088548364400416034343698171509636155454686, - 21888242871839275222246405745257275088548364400416034343698140914595976514491, - 38371360863153713, - 21888242871839275222246405745257275088548364400416034343698144637274308602493, - 21888242871839275222246405745257275088548364400416034343698143360602735089590, - 21888242871839275222246405745257275088548364400416034343698190545310445012210, - 21888242871839275222246405745257275088548364400416034343698185671308394084082, - 21888242871839275222246405745257275088548364400416034343698140955873064961046, - 21888242871839275222246405745257275088548364400416034343698167081910252826258, - 21888242871839275222246405745257275088548364400416034343698183565484007354117, - 21888242871839275222246405745257275088548364400416034343698152419287316169254, - 21888242871839275222246405745257275088548364400416034343698160431857599215130, - 21888242871839275222246405745257275088548364400416034343698201462868476323110, - 59857487222796506, - 21888242871839275222246405745257275088548364400416034343698176437349565596873, - 8666512748138102, - 21888242871839275222246405745257275088548364400416034343698194849149664798477, - 60754287519900942, - 21888242871839275222246405745257275088548364400416034343698151065487228204596, - 38798393421167834, - 22093417049952184, - 21888242871839275222246405745257275088548364400416034343698165250061163905276, - 22190320059522710, - 53087263103860538, - 36877619950159600, - 21888242871839275222246405745257275088548364400416034343698168162464604304150, - 43468902154989857, - 62045583817230337, - 32273872499278891, - 21888242871839275222246405745257275088548364400416034343698166519199997401414, - 21888242871839275222246405745257275088548364400416034343698182189385418868561, - 38643434948091256, - 21888242871839275222246405745257275088548364400416034343698160592777041906684, - 36911288152959358, - 3516432038121645, - 21888242871839275222246405745257275088548364400416034343698136605215810163356, - 21888242871839275222246405745257275088548364400416034343698167757754205813769, - 21888242871839275222246405745257275088548364400416034343698201417257111025178, - 21888242871839275222246405745257275088548364400416034343698145890419718407501, - 21888242871839275222246405745257275088548364400416034343698199305135195941485, - 21888242871839275222246405745257275088548364400416034343698184320545965064238, - 21888242871839275222246405745257275088548364400416034343698183104392572457087, - 50083752068626890, - 39369133086740741, - 21888242871839275222246405745257275088548364400416034343698200986378886680417, - 21888242871839275222246405745257275088548364400416034343698136658188854620389, - 21888242871839275222246405745257275088548364400416034343698194947594137082958, - 6264377894083226, - 59329441195961355, - 21888242871839275222246405745257275088548364400416034343698140276667227953342, - 21888242871839275222246405745257275088548364400416034343698187522928637370964, - 21888242871839275222246405745257275088548364400416034343698143285970613855060, - 21888242871839275222246405745257275088548364400416034343698163420632823438739, - 21888242871839275222246405745257275088548364400416034343698197913267035171818, - 1008013454644097, - 21888242871839275222246405745257275088548364400416034343698191486159351642399, - 49233631310161463, - 21888242871839275222246405745257275088548364400416034343698195955025435553247, - 42961301353337146, - 21888242871839275222246405745257275088548364400416034343698171064674810509710, - 21888242871839275222246405745257275088548364400416034343698148005024198394260, - 40842764189535505, - 21888242871839275222246405745257275088548364400416034343698139816661027821812, - 21888242871839275222246405745257275088548364400416034343698163181399053983982, - 21888242871839275222246405745257275088548364400416034343698180533895836816073, - 21888242871839275222246405745257275088548364400416034343698193839863217770742, - 17073558763381260, - 21888242871839275222246405745257275088548364400416034343698167960942284377313, - 21888242871839275222246405745257275088548364400416034343698203776879515922685, - 3603701440230022, - 42451785690910076, - 21888242871839275222246405745257275088548364400416034343698203058672809015977, - 5696633436496043, - 21888242871839275222246405745257275088548364400416034343698141029920107122041, - 21888242871839275222246405745257275088548364400416034343698158552411526802139, - 8701864890476904, - 21888242871839275222246405745257275088548364400416034343698202786315271790845, - 21888242871839275222246405745257275088548364400416034343698159299831658294254, - 21888242871839275222246405745257275088548364400416034343698146290859137082826, - 51729178087804069, - 45725920279139877, - 21888242871839275222246405745257275088548364400416034343698137864065701302986, - 4980949463517351, - 21888242871839275222246405745257275088548364400416034343698168438340508036506, - 21888242871839275222246405745257275088548364400416034343698175989983759013157, - 21888242871839275222246405745257275088548364400416034343698137020638367313919, - 28242802988003406, - 23884738884133841, - 21888242871839275222246405745257275088548364400416034343698178395395806926765, - 21888242871839275222246405745257275088548364400416034343698189977161553754169, - 56032092197266578, - 21888242871839275222246405745257275088548364400416034343698195908553569326376, - 10775347831911672, - 19207979507713437, - 21888242871839275222246405745257275088548364400416034343698203926104795635810, - 38192871975323370, - 72013428995760404, - 70551342938121812, - 49029935099712038, - 29212812119557411, - 21888242871839275222246405745257275088548364400416034343698201981510774943393, - 69958197178946734, - 21888242871839275222246405745257275088548364400416034343698200550296234304829, - 32348684608487753, - 22681985277561383, - 21888242871839275222246405745257275088548364400416034343698175525153939582201, - 21888242871839275222246405745257275088548364400416034343698160840321850377135, - 21888242871839275222246405745257275088548364400416034343698184013591795785938, - 21888242871839275222246405745257275088548364400416034343698172511999600666139, - 540361796654050, - 21888242871839275222246405745257275088548364400416034343698144494778401585723, - 21888242871839275222246405745257275088548364400416034343698198704731483769918, - 21888242871839275222246405745257275088548364400416034343698172665689969351667, - 21888242871839275222246405745257275088548364400416034343698157675389212632188, - 2618086283985931, - 21888242871839275222246405745257275088548364400416034343698171123840033183910, - 21888242871839275222246405745257275088548364400416034343698147089765670877485, - 7635313772621161, - 26276690772656890, - 540652202538578, - 21888242871839275222246405745257275088548364400416034343698191232808493652509, - 59653101807889740, - 17995743355315744, - 36399758880543483, - 39558491379691470, - 70758050761607097, - 21888242871839275222246405745257275088548364400416034343698184600510024304774, - 21888242871839275222246405745257275088548364400416034343698177743719932728925, - 21888242871839275222246405745257275088548364400416034343698170421999727222892, - 49968525408711444, - 21888242871839275222246405745257275088548364400416034343698189189916479143592, - 56284738614618139, - 21888242871839275222246405745257275088548364400416034343698203928472216492939, - 21888242871839275222246405745257275088548364400416034343698154642369910217605, - 21888242871839275222246405745257275088548364400416034343698182622857938416741, - 21888242871839275222246405745257275088548364400416034343698185662933492868274, - 21888242871839275222246405745257275088548364400416034343698163487579552191176, - 21888242871839275222246405745257275088548364400416034343698164533180051766198, - 21888242871839275222246405745257275088548364400416034343698159750147253510549, - 21888242871839275222246405745257275088548364400416034343698187532167373886420, - 59358654648937432, - 64538056820086581, - 67770485403217640, - 64782527877208206, - 21012030210967210, - 21888242871839275222246405745257275088548364400416034343698164019832054424805, - 1492548566979847, - 17082056165991554, - 60408035649925327, - 21888242871839275222246405745257275088548364400416034343698136545737473418918, - 21888242871839275222246405745257275088548364400416034343698150308752429110054, - 14960453235754143, - 21888242871839275222246405745257275088548364400416034343698166910408787701284, - 21888242871839275222246405745257275088548364400416034343698193694228681447559, - 17548039161159382, - 21888242871839275222246405745257275088548364400416034343698163931541360652859, - 22703811290233312, - 21888242871839275222246405745257275088548364400416034343698139942451420780435, - 9781874429089292, - 21888242871839275222246405745257275088548364400416034343698188863756594598346, - 21888242871839275222246405745257275088548364400416034343698146945672262442556, - 21888242871839275222246405745257275088548364400416034343698190437408752984283, - 21888242871839275222246405745257275088548364400416034343698173758831574754984, - 33171796066768762, - 21888242871839275222246405745257275088548364400416034343698137594153597692474, - 21888242871839275222246405745257275088548364400416034343698198946828978910804, - 21888242871839275222246405745257275088548364400416034343698144115705660223660, - 21888242871839275222246405745257275088548364400416034343698190373217524128823, - 21888242871839275222246405745257275088548364400416034343698136739597236458078, - 21888242871839275222246405745257275088548364400416034343698153083997827665687, - 55547247467055124, - 21888242871839275222246405745257275088548364400416034343698134420054188131958, - 5072552046829500, - 44108173179513686, - 4703449622956770, - 15664787545211825, - 21888242871839275222246405745257275088548364400416034343698149979293357191634, - 21888242871839275222246405745257275088548364400416034343698154585729800443932, - 21888242871839275222246405745257275088548364400416034343698173479783274597611, - 21888242871839275222246405745257275088548364400416034343698198921489537574952, - 44475065731747671, - 9399141849556501, - 3712442142417950, - 21888242871839275222246405745257275088548364400416034343698204057125734806392, - 21888242871839275222246405745257275088548364400416034343698154502502814193883, - 14549086378204329, - 21888242871839275222246405745257275088548364400416034343698154150153146109008, - 62125203269815177, - 5208888611703656, - 21888242871839275222246405745257275088548364400416034343698181347949724076541, - 4107520532910286, - 47444520340605897, - 5495332831530060, - 21888242871839275222246405745257275088548364400416034343698145225395196995587, - 21888242871839275222246405745257275088548364400416034343698195769465120497562, - 61842733396165840, - 21888242871839275222246405745257275088548364400416034343698140109390048732990, - 21888242871839275222246405745257275088548364400416034343698143724609679744939, - 21888242871839275222246405745257275088548364400416034343698153561057340668263, - 21888242871839275222246405745257275088548364400416034343698167181804460885050, - 41448616273565075, - 63302763486143138, - 69846360331416451, - 21888242871839275222246405745257275088548364400416034343698141004734104409367, - 21888242871839275222246405745257275088548364400416034343698157900910350257661, - 18040883434468940, - 21933193793204193, - 21888242871839275222246405745257275088548364400416034343698157469496508072854, - 21888242871839275222246405745257275088548364400416034343698188751517550531284, - 21888242871839275222246405745257275088548364400416034343698155343033832461464, - 21888242871839275222246405745257275088548364400416034343698133603492301041579, - 21888242871839275222246405745257275088548364400416034343698156443932008854001, - 21888242871839275222246405745257275088548364400416034343698132834265667323591, - 21888242871839275222246405745257275088548364400416034343698144509852824308512, - 21888242871839275222246405745257275088548364400416034343698159791799100859665, - 25263752182287127, - 21888242871839275222246405745257275088548364400416034343698156829516518847297, - 21888242871839275222246405745257275088548364400416034343698198216121122611660, - 45216996141476863, - 21888242871839275222246405745257275088548364400416034343698148932721901466114, - 13588231431223881, - 46289846847931905, - 35707540195310463, - 21888242871839275222246405745257275088548364400416034343698193075172454269466, - 33975923966851494, - 21888242871839275222246405745257275088548364400416034343698179567943284344539, - 61558412530712746, - 50838009261350885, - 70447590863815651, - 20748635151624799, - 52166802330022447, - 36648377276104613, - 1224534617773076, - 29167483291504668, - 16143649261843289, - 21888242871839275222246405745257275088548364400416034343698187738749516355269, - 4717598644880187, - 62218813099107395, - 9045495737310388, - 21888242871839275222246405745257275088548364400416034343698181635979676694309, - 21888242871839275222246405745257275088548364400416034343698157680919171060493, - 21203177303434250, - 21888242871839275222246405745257275088548364400416034343698201159905369794807, - 12932017562456215, - 21888242871839275222246405745257275088548364400416034343698160249412130233850, - 9804625290345055, - 42856818395047045, - 21888242871839275222246405745257275088548364400416034343698156105639071885970, - 21888242871839275222246405745257275088548364400416034343698140970945101824628, - 21888242871839275222246405745257275088548364400416034343698151428066740262410, - 15559226445241130, - 21888242871839275222246405745257275088548364400416034343698178238232695894597, - 21888242871839275222246405745257275088548364400416034343698201091685496053277, - 54303929640108722, - 65407733051448821, - 63130084020694798, - 22613050834824832, - 25199078243748710, - 21888242871839275222246405745257275088548364400416034343698175404149218344458, - 65374146109617753, - 56600219264769260, - 21888242871839275222246405745257275088548364400416034343698191214348323131363, - 22756835277899598, - 3637901742704536, - 68998838989276253, - 54279823623706878, - 21888242871839275222246405745257275088548364400416034343698198536435185452480, - 21888242871839275222246405745257275088548364400416034343698169605859667348671, - 32476858071699906, - 21888242871839275222246405745257275088548364400416034343698145995110979637416, - 21888242871839275222246405745257275088548364400416034343698188630772219504175, - 55896185344028988, - 21888242871839275222246405745257275088548364400416034343698169692549172027025, - 21888242871839275222246405745257275088548364400416034343698198025210234799310, - 21888242871839275222246405745257275088548364400416034343698192568734715775360, - 52607641221098103, - 71389879031498401, - 21888242871839275222246405745257275088548364400416034343698202778045341331506, - 44272170132399609, - 21888242871839275222246405745257275088548364400416034343698203808502538855032, - 21888242871839275222246405745257275088548364400416034343698171068973973497377, - 45635544139756348, - 44199342901338914, - 21888242871839275222246405745257275088548364400416034343698184945133995158526, - 21888242871839275222246405745257275088548364400416034343698133889920234895996, - 21888242871839275222246405745257275088548364400416034343698170572728567724237, - 22070444113472022, - 21888242871839275222246405745257275088548364400416034343698155703837067741994, - 21888242871839275222246405745257275088548364400416034343698163599247177007889, - 13544886911198064, - 21888242871839275222246405745257275088548364400416034343698185274768567006693, - 3363392947279618, - 21888242871839275222246405745257275088548364400416034343698159010985756532965, - 21888242871839275222246405745257275088548364400416034343698193028426411808284, - 46304592557757514, - 52756826457642789, - 52111286639926871, - 49810940266118765, - 330043691427278, - 63511535609152006, - 14926801462919529, - 37766803279733236, - 44332790293758031, - 20364642676517354, - 21888242871839275222246405745257275088548364400416034343698154788921405166987, - 22925066044573129, - 21888242871839275222246405745257275088548364400416034343698143201797518500541, - 46182874755706249, - 6547327577461245, - 49837964404596910, - 21888242871839275222246405745257275088548364400416034343698196860531450876185, - 12911931857853133, - 21888242871839275222246405745257275088548364400416034343698164895338922317738, - 59248891415694141, - 30781754149338118, - 15855554002661195, - 21888242871839275222246405745257275088548364400416034343698200263603679395528, - 67333252480603201, - 66322716950751178, - 21888242871839275222246405745257275088548364400416034343698135137220903048085, - 21888242871839275222246405745257275088548364400416034343698192491139856545358, - 21888242871839275222246405745257275088548364400416034343698158398881451394345, - 21888242871839275222246405745257275088548364400416034343698165498923864480310, - 33578451200093589, - 66520595729024403, - 21888242871839275222246405745257275088548364400416034343698160436702008131248, - 30130022446122826, - 20439038440592575, - 21888242871839275222246405745257275088548364400416034343698145575416095701910, - 21888242871839275222246405745257275088548364400416034343698180469876229721724, - 21888242871839275222246405745257275088548364400416034343698164237835249437289, - 21888242871839275222246405745257275088548364400416034343698182350801809056808, - 1041138165230503, - 21888242871839275222246405745257275088548364400416034343698172497338413740121, - 21888242871839275222246405745257275088548364400416034343698163763624555337391, - 38066679500125138, - 21888242871839275222246405745257275088548364400416034343698193252746025581470, - 18312089685240488, - 21888242871839275222246405745257275088548364400416034343698203830744081949829, - 455294569814856, - 68410741280512702, - 71219997613773169, - 21888242871839275222246405745257275088548364400416034343698150832538208359110, - 21888242871839275222246405745257275088548364400416034343698151858329644442358, - 21888242871839275222246405745257275088548364400416034343698169697749739473112, - 22458486298560243, - 22873173637552939, - 25970007994841987, - 21888242871839275222246405745257275088548364400416034343698169507374772690454, - 64230909280235428, - 21888242871839275222246405745257275088548364400416034343698138288162452538504, - 30361267255755129, - 21888242871839275222246405745257275088548364400416034343698151368734750627149, - 21888242871839275222246405745257275088548364400416034343698148781412604247289, - 21888242871839275222246405745257275088548364400416034343698164724143415987587, - 21888242871839275222246405745257275088548364400416034343698197448542211770660, - 11968370168987275, - 37076388150484612, - 21888242871839275222246405745257275088548364400416034343698193023519084582764, - 17983783529692813, - 61519452947738873, - 21888242871839275222246405745257275088548364400416034343698153040260352847591, - 58272967146711420, - 24149892960993951, - 21888242871839275222246405745257275088548364400416034343698183836734656749001, - 68428174785383903, - 59022279217068025, - 21888242871839275222246405745257275088548364400416034343698156435721800829314, - 21888242871839275222246405745257275088548364400416034343698184301407339515036, - 21888242871839275222246405745257275088548364400416034343698150104380347307887, - 21888242871839275222246405745257275088548364400416034343698133854581062555764, - 66686911120394622, - 19438152216985490, - 21888242871839275222246405745257275088548364400416034343698204139308707956144, - 21888242871839275222246405745257275088548364400416034343698199470402825393921, - 21888242871839275222246405745257275088548364400416034343698164503314763287989, - 36506077684445609, - 21888242871839275222246405745257275088548364400416034343698135087728170121451, - 21888242871839275222246405745257275088548364400416034343698199026375766795021, - 21888242871839275222246405745257275088548364400416034343698182123804011528472, - 27734944247994913, - 21888242871839275222246405745257275088548364400416034343698135842895857617920, - 21888242871839275222246405745257275088548364400416034343698166371690558913544, - 41624225884258168, - 21888242871839275222246405745257275088548364400416034343698187379185008377932, - 21888242871839275222246405745257275088548364400416034343698157723611955491069, - 21888242871839275222246405745257275088548364400416034343698196807575175337310, - 60625418056659601, - 21888242871839275222246405745257275088548364400416034343698136942152770947876, - 21888242871839275222246405745257275088548364400416034343698139711523333814076, - 21888242871839275222246405745257275088548364400416034343698140597022698659515, - 29153290466407761, - 21888242871839275222246405745257275088548364400416034343698176335254687365788, - 21888242871839275222246405745257275088548364400416034343698177745352846390070, - 26992308567664914, - 21888242871839275222246405745257275088548364400416034343698133610421673405165, - 21888242871839275222246405745257275088548364400416034343698139794119654841520, - 21888242871839275222246405745257275088548364400416034343698189574251493604479, - 21888242871839275222246405745257275088548364400416034343698139035719726235051, - 21888242871839275222246405745257275088548364400416034343698159639713611366492, - 21210733641944874, - 20849162458038888, - 55600683707538163, - 21888242871839275222246405745257275088548364400416034343698160761302356960801, - 14500690930327657, - 48412236255850850, - 21888242871839275222246405745257275088548364400416034343698167503496959721054, - 21888242871839275222246405745257275088548364400416034343698190269272019060341, - 21888242871839275222246405745257275088548364400416034343698172576758007116424, - 21888242871839275222246405745257275088548364400416034343698160127570233025305, - 34562058992193854, - 21888242871839275222246405745257275088548364400416034343698146813489205343304, - 71153250583312830, - 50324115104814765, - 21888242871839275222246405745257275088548364400416034343698173703754300701144, - 27708373178712553, - 21888242871839275222246405745257275088548364400416034343698181806289505084063, - 21888242871839275222246405745257275088548364400416034343698188924514699879282, - 70225224980623567, - 21888242871839275222246405745257275088548364400416034343698153054006466002450, - 21888242871839275222246405745257275088548364400416034343698168976350280486808, - 54476875865173926, - 20980696431891826, - 28638474670378164, - 21888242871839275222246405745257275088548364400416034343698187389775213663595, - 21888242871839275222246405745257275088548364400416034343698139058856189774422, - 21888242871839275222246405745257275088548364400416034343698186066389679844995, - 21888242871839275222246405745257275088548364400416034343698138674683430359115, - 21888242871839275222246405745257275088548364400416034343698199357063877201565, - 21888242871839275222246405745257275088548364400416034343698140935397581086981, - 21888242871839275222246405745257275088548364400416034343698150436465666267638, - 45093726228769042, - 21888242871839275222246405745257275088548364400416034343698203498904188651118, - 21888242871839275222246405745257275088548364400416034343698133506030525800919, - 21888242871839275222246405745257275088548364400416034343698158018015438551782, - 21888242871839275222246405745257275088548364400416034343698176947807400852568, - 21888242871839275222246405745257275088548364400416034343698173649511451547369, - 21888242871839275222246405745257275088548364400416034343698157857508998282922, - 21888242871839275222246405745257275088548364400416034343698159216209043523353, - 23438322238344071, - 21888242871839275222246405745257275088548364400416034343698172056659356822763, - 17725962927703763, - 30668211516849977, - 21888242871839275222246405745257275088548364400416034343698179974534833830061, - 21888242871839275222246405745257275088548364400416034343698197566360266163558, - 3580166311139387, - 21888242871839275222246405745257275088548364400416034343698178732728234731416, - 21888242871839275222246405745257275088548364400416034343698141051163724028400, - 36117617106855872, - 4991364579317144, - 21888242871839275222246405745257275088548364400416034343698169843296273982005, - 6207338223466162, - 21888242871839275222246405745257275088548364400416034343698140663801464634935, - 21888242871839275222246405745257275088548364400416034343698158202377592449934, - 21888242871839275222246405745257275088548364400416034343698139009093611867261, - 57341987368297928, - 60127841229086587, - 51135260993487635, - 69232761248658598, - 1147588662271512, - 21888242871839275222246405745257275088548364400416034343698157927165173522694, - 16010684807546769, - 21888242871839275222246405745257275088548364400416034343698143121139003097263, - 34473257328565397, - 21888242871839275222246405745257275088548364400416034343698148519589047946077, - 1551046715154113, - 15182849064465516, - 60665047007610232, - 10779206091747135, - 29863337715527498, - 57132878309078140, - 21888242871839275222246405745257275088548364400416034343698134272940819368464, - 14103452276699889, - 56830483078860897, - 47425439604504395, - 59136687841515134, - 21888242871839275222246405745257275088548364400416034343698196922414022637025, - 38553749481587245, - 21888242871839275222246405745257275088548364400416034343698177630957084660913, - 21888242871839275222246405745257275088548364400416034343698198023099341240469, - 21888242871839275222246405745257275088548364400416034343698190973386534556205, - 23658685021178754, - 21888242871839275222246405745257275088548364400416034343698135170844514928433, - 47692389612721053, - 21888242871839275222246405745257275088548364400416034343698193332622847351278, - 22894999630941542, - 21888242871839275222246405745257275088548364400416034343698192981458532098868, - 42149498775845014, - 21888242871839275222246405745257275088548364400416034343698182547782790884983, - 68246264279606619, - 52429073641825174, - 21888242871839275222246405745257275088548364400416034343698160883146120752734, - 50379430403327558, - 15546365349158732, - 4877352328437459, - 21888242871839275222246405745257275088548364400416034343698171742291312980360, - 21888242871839275222246405745257275088548364400416034343698163657600609378313, - 21888242871839275222246405745257275088548364400416034343698160926140365290877, - 3588269522984177, - 21888242871839275222246405745257275088548364400416034343698190286212784974509, - 18719570838402276, - 21782257380014613, - 61893192931762975, - 21888242871839275222246405745257275088548364400416034343698188769911386725958, - 34957657835617060, - 21888242871839275222246405745257275088548364400416034343698188360141743152445, - 55792838905142910, - 62741610352445913, - 21888242871839275222246405745257275088548364400416034343698184548018278785411, - 21888242871839275222246405745257275088548364400416034343698163002570048762254, - 21088343754421581, - 21888242871839275222246405745257275088548364400416034343698173638347635092838, - 42572829486158451, - 21888242871839275222246405745257275088548364400416034343698156661057335879985, - 40561200484105684, - 22797108737388569, - 21888242871839275222246405745257275088548364400416034343698162895463291888984, - 21888242871839275222246405745257275088548364400416034343698133647053419165897, - 28852500113803901, - 21888242871839275222246405745257275088548364400416034343698173017289207412051, - 21888242871839275222246405745257275088548364400416034343698144655077158284267, - 68537967829423988, - 58871633704836508, - 21888242871839275222246405745257275088548364400416034343698165092611950834725, - 21888242871839275222246405745257275088548364400416034343698149010871483824371, - 21888242871839275222246405745257275088548364400416034343698202295690816198193, - 60401686005073723, - 54571382067035300, - 21910936439888498, - 21888242871839275222246405745257275088548364400416034343698165277319314859435, - 21888242871839275222246405745257275088548364400416034343698178683412641516155, - 49846996418355071, - 21888242871839275222246405745257275088548364400416034343698133262633314858015, - 21888242871839275222246405745257275088548364400416034343698199154494189909443, - 21888242871839275222246405745257275088548364400416034343698141243581823425562, - 23537236228902620, - 21888242871839275222246405745257275088548364400416034343698163439160582468346, - 30553831844197270, - 31137518843621895, - 21888242871839275222246405745257275088548364400416034343698197178175062753186, - 21888242871839275222246405745257275088548364400416034343698142188992135397144, - 21888242871839275222246405745257275088548364400416034343698162093104175854462, - 21741223211114521, - 21888242871839275222246405745257275088548364400416034343698200917762327221333, - 21888242871839275222246405745257275088548364400416034343698152625919493697353, - 19872229351161447, - 51519328546978978, - 22703971154581950, - 61886973014515404, - 13242521016402663, - 21888242871839275222246405745257275088548364400416034343698195907094506174683, - 21888242871839275222246405745257275088548364400416034343698142396487531832555, - 21888242871839275222246405745257275088548364400416034343698155333941052812343, - 62339738129661661, - 21888242871839275222246405745257275088548364400416034343698136638381183185431, - 32598429152926713, - 55909307535689129, - 21888242871839275222246405745257275088548364400416034343698161806109779917083, - 21888242871839275222246405745257275088548364400416034343698172434233798175119, - 12901821494218706, - 15848836338399576, - 21888242871839275222246405745257275088548364400416034343698196042698583949113, - 21888242871839275222246405745257275088548364400416034343698190765950072094351, - 56009357432257447, - 21888242871839275222246405745257275088548364400416034343698174443798561786627, - 21888242871839275222246405745257275088548364400416034343698158774041576304651, - 21888242871839275222246405745257275088548364400416034343698167699147614884343, - 21888242871839275222246405745257275088548364400416034343698187394799813037204, - 21888242871839275222246405745257275088548364400416034343698155979914221322338, - 21888242871839275222246405745257275088548364400416034343698149897365286115177, - 50946277564303932, - 21888242871839275222246405745257275088548364400416034343698145155430759032687, - 20052920243723185, - 45296622047022822, - 57924403454808102, - 21888242871839275222246405745257275088548364400416034343698174748127770504341, - 61340964694610308, - 58933437659501724, - 21888242871839275222246405745257275088548364400416034343698164715372991644835, - 54126719764738137, - 6909927599531686, - 39813039368881366, - 3931496658166238, - 68405068407793939, - 40684503198603610, - 49133917230367613, - 21888242871839275222246405745257275088548364400416034343698200726355637141351, - 21888242871839275222246405745257275088548364400416034343698163663375849950371, - 25834844955388346, - 21888242871839275222246405745257275088548364400416034343698147579637521145436, - 41028231149089132, - 1740496650502379, - 21888242871839275222246405745257275088548364400416034343698196174768316750398, - 25203040680253290, - 24701703753420186, - 743973543653565, - 11239332255920310, - 21888242871839275222246405745257275088548364400416034343698132898920495134199, - 21888242871839275222246405745257275088548364400416034343698164820549342224344, - 26046800459144183, - 48846412593048183, - 17840685040470837, - 21888242871839275222246405745257275088548364400416034343698200698147268532181, - 6327322661364358, - 21888242871839275222246405745257275088548364400416034343698200341332553245996, - 21888242871839275222246405745257275088548364400416034343698199739200441542593, - 17775468947929496, - 21888242871839275222246405745257275088548364400416034343698193826431984366170, - 21888242871839275222246405745257275088548364400416034343698164934079617350505, - 38029516714777047, - 21888242871839275222246405745257275088548364400416034343698171860998630599054, - 21888242871839275222246405745257275088548364400416034343698180940653564774449, - 21888242871839275222246405745257275088548364400416034343698192643140414243175, - 21888242871839275222246405745257275088548364400416034343698133707059690939862, - 21888242871839275222246405745257275088548364400416034343698142538830844906698, - 1261151825799544, - 6456874032514820, - 49437558336386711, - 15155114080183473, - 53511191982164765, - 21888242871839275222246405745257275088548364400416034343698141013326305451284, - 11658191081597715, - 46689744700548074, - 19876484891452274, - 21888242871839275222246405745257275088548364400416034343698133013899768257740, - 21888242871839275222246405745257275088548364400416034343698160053655875212403, - 21888242871839275222246405745257275088548364400416034343698198519057823517265, - 32745748280257349, - 18722134139104278, - 51688840955573648, - 21888242871839275222246405745257275088548364400416034343698174044582006591788, - 48426457274909255, - 38936638041572314, - 21888242871839275222246405745257275088548364400416034343698197929765819031867, - 71059323383318001, - 4878378852181518, - 66017807707053415, - 21888242871839275222246405745257275088548364400416034343698151745632774550078, - 36663543034309834, - 21888242871839275222246405745257275088548364400416034343698158687584650119071, - 21888242871839275222246405745257275088548364400416034343698194869916561608490, - 21888242871839275222246405745257275088548364400416034343698203488145135205679, - 63164407382911581, - 21888242871839275222246405745257275088548364400416034343698145649322570853250, - 21888242871839275222246405745257275088548364400416034343698174022344946638308, - 21888242871839275222246405745257275088548364400416034343698170116387350791648, - 21888242871839275222246405745257275088548364400416034343698202794337605303347, - 21888242871839275222246405745257275088548364400416034343698160530618284300419, - 62054457677594010, - 21888242871839275222246405745257275088548364400416034343698165814744102687285, - 21888242871839275222246405745257275088548364400416034343698165448069524431825, - 21888242871839275222246405745257275088548364400416034343698172391793415901305, - 21888242871839275222246405745257275088548364400416034343698183743739575107177, - 17632570408183775, - 21888242871839275222246405745257275088548364400416034343698182126215952708153, - 21888242871839275222246405745257275088548364400416034343698144482255248228908, - 57306118034297811, - 21888242871839275222246405745257275088548364400416034343698147870829075118155, - 21888242871839275222246405745257275088548364400416034343698172193506181773483, - 42801471249314387, - 21888242871839275222246405745257275088548364400416034343698189545281133302919, - 13997815643079011, - 37705657788231352, - 21888242871839275222246405745257275088548364400416034343698136085503728117479, - 21888242871839275222246405745257275088548364400416034343698187935499806196213, - 40189752557883249, - 14462073966359411, - 11749109653881288, - 50824904920813246, - 61823024916482657, - 48138125770420901, - 21888242871839275222246405745257275088548364400416034343698144170372683002288, - 21888242871839275222246405745257275088548364400416034343698162789966505738179, - 21888242871839275222246405745257275088548364400416034343698144239850880357969, - 21888242871839275222246405745257275088548364400416034343698162446394751902159, - 57780697873348252, - 22267029599299982, - 63539857576973773, - 44601039589885572, - 13776345322822701, - 21888242871839275222246405745257275088548364400416034343698135534088641688941, - 21888242871839275222246405745257275088548364400416034343698197369723680760641, - 21888242871839275222246405745257275088548364400416034343698144429165909270628, - 21888242871839275222246405745257275088548364400416034343698136855759186854975, - 21888242871839275222246405745257275088548364400416034343698170656376611102558, - 53481885337313188, - 21888242871839275222246405745257275088548364400416034343698170105595838031883, - 21888242871839275222246405745257275088548364400416034343698141630191752076166, - 23177114697833108, - 67062210459456755, - 21888242871839275222246405745257275088548364400416034343698148071517821496646, - 21888242871839275222246405745257275088548364400416034343698144343455838646240, - 45830489914592117, - 45931374582277286, - 21888242871839275222246405745257275088548364400416034343698180162731707469607, - 30623057723690285, - 5092746832962386, - 21888242871839275222246405745257275088548364400416034343698148752578983628350, - 21888242871839275222246405745257275088548364400416034343698178256624846904434, - 4164972749635043, - 21888242871839275222246405745257275088548364400416034343698143235720521008654, - 19678713724599194, - 21888242871839275222246405745257275088548364400416034343698197092448663779808, - 56310024822954489, - 21888242871839275222246405745257275088548364400416034343698174763058132307171, - 21888242871839275222246405745257275088548364400416034343698135370331993575274, - 21888242871839275222246405745257275088548364400416034343698195667407843278062, - 21888242871839275222246405745257275088548364400416034343698139284420239123958, - 21888242871839275222246405745257275088548364400416034343698203507214324755345, - 21888242871839275222246405745257275088548364400416034343698142068189666662783, - 21888242871839275222246405745257275088548364400416034343698141363931309740084, - 63301521776632985, - 21888242871839275222246405745257275088548364400416034343698149377463924337752, - 21888242871839275222246405745257275088548364400416034343698167721052151836176, - 21888242871839275222246405745257275088548364400416034343698194715525477418290, - 21888242871839275222246405745257275088548364400416034343698177284639560476221, - 21888242871839275222246405745257275088548364400416034343698139142762217830574, - 21888242871839275222246405745257275088548364400416034343698155227081950060204, - 21888242871839275222246405745257275088548364400416034343698201395629084616600, - 21888242871839275222246405745257275088548364400416034343698152073150699172484, - 57998225881744876, - 45828995951520824, - 50287989796987134, - 21888242871839275222246405745257275088548364400416034343698199333239271824335, - 42508229476675105, - 21888242871839275222246405745257275088548364400416034343698160625651835242848, - 50166055166855780, - 9139247203505417, - 25669127713916037, - 21888242871839275222246405745257275088548364400416034343698145907657604217979, - 21888242871839275222246405745257275088548364400416034343698155500438313650091, - 21888242871839275222246405745257275088548364400416034343698176621156918710561, - 9157968760850791, - 21888242871839275222246405745257275088548364400416034343698172989189850126128, - 21888242871839275222246405745257275088548364400416034343698190388270642824416, - 62859959326750087, - 21888242871839275222246405745257275088548364400416034343698157849662040787799, - 1248438145059021, - 26814485433737640, - 21888242871839275222246405745257275088548364400416034343698155324824119792265, - 3080659676304883, - 21888242871839275222246405745257275088548364400416034343698196139275152044606, - 59326745986375182, - 49104047598275932, - 51035312575491198, - 36695067017861440, - 5034922651993252, - 52314734337143674, - 23398537618894382, - 21888242871839275222246405745257275088548364400416034343698149568887854944056, - 50869206760607231, - 61227226613680295, - 49400962870239483, - 38144728530873001, - 21888242871839275222246405745257275088548364400416034343698169134497650050625, - 21888242871839275222246405745257275088548364400416034343698190151135515141187, - 21888242871839275222246405745257275088548364400416034343698142830192258692022, - 64481141054435427, - 21888242871839275222246405745257275088548364400416034343698159876685031284203, - 21888242871839275222246405745257275088548364400416034343698183242607393759460, - 21888242871839275222246405745257275088548364400416034343698136963724858603841, - 21888242871839275222246405745257275088548364400416034343698169595602860307914, - 21888242871839275222246405745257275088548364400416034343698185805507478445943, - 21888242871839275222246405745257275088548364400416034343698139051280633446121, - 21888242871839275222246405745257275088548364400416034343698132461672924033932, - 21888242871839275222246405745257275088548364400416034343698160550654041416344, - 21888242871839275222246405745257275088548364400416034343698185768772165065932, - 34654364104989360, - 21888242871839275222246405745257275088548364400416034343698166066965889322115, - 21888242871839275222246405745257275088548364400416034343698203675186264411460, - 22876026267041541, - 21888242871839275222246405745257275088548364400416034343698164291936249479190, - 21888242871839275222246405745257275088548364400416034343698152153302098392129, - 21888242871839275222246405745257275088548364400416034343698140476614617422817, - 48191109141169111, - 62125339158257644, - 21888242871839275222246405745257275088548364400416034343698153279583038554550, - 21888242871839275222246405745257275088548364400416034343698166174424198387292, - 21888242871839275222246405745257275088548364400416034343698143443929262646447, - 6256736045674705, - 25454762152115874, - 21888242871839275222246405745257275088548364400416034343698182636580610186078, - 21888242871839275222246405745257275088548364400416034343698173875742172163811, - 32828321723354265, - 21888242871839275222246405745257275088548364400416034343698150409244716805208, - 59368157293309552, - 21888242871839275222246405745257275088548364400416034343698138786996396490288, - 15152594857744908, - 21888242871839275222246405745257275088548364400416034343698197823168550037979, - 2781843294749104, - 21888242871839275222246405745257275088548364400416034343698189991110846259455, - 21888242871839275222246405745257275088548364400416034343698199965447370107915, - 27183032452879301, - 21888242871839275222246405745257275088548364400416034343698181011321488954735, - 66937730010854777, - 42011553220152097, - 59592958649873205, - 21888242871839275222246405745257275088548364400416034343698170089924633110727, - 21888242871839275222246405745257275088548364400416034343698143180897255491990, - 3569638963491870, - 21888242871839275222246405745257275088548364400416034343698171842377608184938, - 21888242871839275222246405745257275088548364400416034343698174969856169872765, - 21888242871839275222246405745257275088548364400416034343698199933438498109183, - 67232446526810192, - 4828407253138973, - 61983693871224668, - 21888242871839275222246405745257275088548364400416034343698188396127058234971, - 21888242871839275222246405745257275088548364400416034343698195599160858566244, - 71416229405127678, - 21888242871839275222246405745257275088548364400416034343698186194880659510988, - 21888242871839275222246405745257275088548364400416034343698149054611199095847, - 30532542224787465, - 48621696646922158, - 21888242871839275222246405745257275088548364400416034343698156571437479061258, - 21888242871839275222246405745257275088548364400416034343698161984889860003888, - 26775515853591717, - 19521958919871842, - 56055502105994851, - 43603388133564034, - 21888242871839275222246405745257275088548364400416034343698157133309266074302, - 21888242871839275222246405745257275088548364400416034343698138570740487773510, - 66237255972383416, - 33677553439061716, - 63663725968930055, - 66670296824215802, - 58130813302664794, - 44854346745221377, - 21888242871839275222246405745257275088548364400416034343698176956932585564059, - 21888242871839275222246405745257275088548364400416034343698169918746889853530, - 21888242871839275222246405745257275088548364400416034343698180092359883531120, - 31397415147634684, - 21888242871839275222246405745257275088548364400416034343698183406607831980214, - 21888242871839275222246405745257275088548364400416034343698162009041013434157, - 66210491279041567, - 21888242871839275222246405745257275088548364400416034343698202895234540083470, - 68990026116242335, - 61887089614058116, - 21888242871839275222246405745257275088548364400416034343698202429534761885089, - 21888242871839275222246405745257275088548364400416034343698139409294564814802, - 21888242871839275222246405745257275088548364400416034343698189840479754202632, - 24174253850569222, - 48715364150327809, - 20376540133054302, - 2610034394706361, - 9958623097476670, - 38035113121860661, - 21888242871839275222246405745257275088548364400416034343698178600722337893255, - 21888242871839275222246405745257275088548364400416034343698138861405952720731, - 21888242871839275222246405745257275088548364400416034343698203993514036086309, - 21888242871839275222246405745257275088548364400416034343698150990340808163750, - 2398329743079708, - 70474851481970508, - 21888242871839275222246405745257275088548364400416034343698141747105387817545, - 21888242871839275222246405745257275088548364400416034343698158453674187336895, - 64683013989836201, - 47393047726240608, - 62648190400039235, - 21888242871839275222246405745257275088548364400416034343698173698648940625405, - 61977612707193903, - 54242100588778083, - 21888242871839275222246405745257275088548364400416034343698188388238570204936, - 17851205910069425, - 21888242871839275222246405745257275088548364400416034343698196958564936892957, - 21888242871839275222246405745257275088548364400416034343698190887718035174634, - 21888242871839275222246405745257275088548364400416034343698183047362080639454, - 70618841585168133, - 21888242871839275222246405745257275088548364400416034343698187623210473897141, - 21888242871839275222246405745257275088548364400416034343698189930021028301218, - 21888242871839275222246405745257275088548364400416034343698189978668603120666, - 21888242871839275222246405745257275088548364400416034343698162398112593854199, - 21888242871839275222246405745257275088548364400416034343698144647884952171608, - 21888242871839275222246405745257275088548364400416034343698139147226109678761, - 41972807393133152, - 21888242871839275222246405745257275088548364400416034343698147686659353131464, - 21888242871839275222246405745257275088548364400416034343698155103826343809797, - 29390795856446537, - 21888242871839275222246405745257275088548364400416034343698171989814378309509, - 21888242871839275222246405745257275088548364400416034343698166800057910228613, - 34570725899656392, - 61172131830439531, - 21888242871839275222246405745257275088548364400416034343698149147984807999561, - 67376807629993632, - 21888242871839275222246405745257275088548364400416034343698142572444941480475, - 21888242871839275222246405745257275088548364400416034343698199443796702417245, - 46226895605475778, - 21888242871839275222246405745257275088548364400416034343698187118112166417540, - 21888242871839275222246405745257275088548364400416034343698158328697318565964, - 21888242871839275222246405745257275088548364400416034343698180017254921273731, - 21888242871839275222246405745257275088548364400416034343698199128139819464400, - 8055177248535130, - 21888242871839275222246405745257275088548364400416034343698161499583092777306, - 55328360551654505, - 20102616911510171, - 21888242871839275222246405745257275088548364400416034343698155098240728493276, - 21888242871839275222246405745257275088548364400416034343698173488273727042590, - 41487331508219841, - 21888242871839275222246405745257275088548364400416034343698148767163052886858, - 21888242871839275222246405745257275088548364400416034343698159643188750141907, - 32383752583589829, - 67410533934196997, - 21888242871839275222246405745257275088548364400416034343698199885217327623789, - 62656740635361501, - 21888242871839275222246405745257275088548364400416034343698155513980673524596, - 21888242871839275222246405745257275088548364400416034343698202541102778883307, - 66363541214386960, - 21888242871839275222246405745257275088548364400416034343698162225363199771930, - 21888242871839275222246405745257275088548364400416034343698146451441453370249, - 17651928243076697, - 21888242871839275222246405745257275088548364400416034343698183081452529346005, - 3171739067310122, - 8271585676032268, - 21888242871839275222246405745257275088548364400416034343698151861713345804935, - 21888242871839275222246405745257275088548364400416034343698204058830091859287, - 13748716769607184, - 69063390492366839, - 21888242871839275222246405745257275088548364400416034343698185780813390881683, - 38765469754588621, - 21888242871839275222246405745257275088548364400416034343698182878371987906427, - 21888242871839275222246405745257275088548364400416034343698157396726088660640, - 21888242871839275222246405745257275088548364400416034343698203246191610089731, - 6918871292820488, - 46404642060452601, - 7975379080754579, - 21888242871839275222246405745257275088548364400416034343698180242776240672689, - 25708447154187941, - 22767850050011909, - 21888242871839275222246405745257275088548364400416034343698162668191744741961, - 27555262098700175, - 35568144443541756, - 21888242871839275222246405745257275088548364400416034343698142975883266761390, - 21888242871839275222246405745257275088548364400416034343698156939596996848058, - 21888242871839275222246405745257275088548364400416034343698161873493476043568, - 29957772762373292, - 33775472160407825, - 35672276817805001, - 34052032531386541, - 21888242871839275222246405745257275088548364400416034343698170633649646605189, - 21556476120517541, - 21888242871839275222246405745257275088548364400416034343698143841612471509513, - 21888242871839275222246405745257275088548364400416034343698180340028944630008, - 61514566803536257, - 21888242871839275222246405745257275088548364400416034343698197679818768572220, - 66121400834696377, - 32068155944124601, - 21888242871839275222246405745257275088548364400416034343698180765797658152614, - 20639179092136737, - 60178386984850402, - 16347052602172706, - 21888242871839275222246405745257275088548364400416034343698177634992966857542, - 5024768303363583, - 21888242871839275222246405745257275088548364400416034343698161214322127414157, - 69234755028865099, - 21888242871839275222246405745257275088548364400416034343698150289272745865022, - 21888242871839275222246405745257275088548364400416034343698172436976633761086, - 62554109207213222, - 21888242871839275222246405745257275088548364400416034343698153096426152353814, - 36826439393149844, - 21888242871839275222246405745257275088548364400416034343698151699531216025990, - 21888242871839275222246405745257275088548364400416034343698153497614653870301, - 68544700252912480, - 13552940300420768, - 21888242871839275222246405745257275088548364400416034343698177058755607115150, - 21888242871839275222246405745257275088548364400416034343698158395139661172586, - 55729129449956288, - 9445439528881275, - 21888242871839275222246405745257275088548364400416034343698195894261317751324, - 6803171311677594, - 1773946981610485, - 21888242871839275222246405745257275088548364400416034343698188670826542352062, - 21888242871839275222246405745257275088548364400416034343698163700822177486976, - 2943180167743620, - 44939905872605526, - 648938406518727, - 21888242871839275222246405745257275088548364400416034343698140367717927700391, - 21888242871839275222246405745257275088548364400416034343698193246738664385680, - 18845112459943653, - 21888242871839275222246405745257275088548364400416034343698167479060993818806, - 48334033676292217, - 56010637909177514, - 21888242871839275222246405745257275088548364400416034343698164342472718096926, - 21888242871839275222246405745257275088548364400416034343698174172841560697361, - 21888242871839275222246405745257275088548364400416034343698171649224931985997, - 21888242871839275222246405745257275088548364400416034343698180092645805469117, - 51671536412289265, - 39037278841384286, - 40134177707997927, - 4768395286545204, - 21888242871839275222246405745257275088548364400416034343698186664597342578013, - 21888242871839275222246405745257275088548364400416034343698173138672154476098, - 21888242871839275222246405745257275088548364400416034343698175363452129996553, - 55991375816970577, - 21888242871839275222246405745257275088548364400416034343698155967937536775551, - 49685589640345367, - 27015966824438745, - 69727964043409398, - 45267125567676645, - 21888242871839275222246405745257275088548364400416034343698143621868144526558, - 34326030393825337, - 21888242871839275222246405745257275088548364400416034343698159118267918089046, - 70512718088658186, - 21888242871839275222246405745257275088548364400416034343698160255683151642616, - 67760964867328319, - 50500295009564479, - 71021133416940768, - 21888242871839275222246405745257275088548364400416034343698169875925327111887, - 62955019628863510, - 21888242871839275222246405745257275088548364400416034343698153836263474128466, - 21888242871839275222246405745257275088548364400416034343698181044742873050788, - 21888242871839275222246405745257275088548364400416034343698137017555920137393, - 51610300272271917, - 21888242871839275222246405745257275088548364400416034343698194134978003092325, - 21888242871839275222246405745257275088548364400416034343698179846809413868327, - 60576166583477680, - 31856256190014021, - 65463804271840481, - 21888242871839275222246405745257275088548364400416034343698173175156672592396, - 54784562308958082, - 21888242871839275222246405745257275088548364400416034343698138962282792774785, - 21888242871839275222246405745257275088548364400416034343698140909382755458249, - 21888242871839275222246405745257275088548364400416034343698136319772164744019, - 36042275509854514, - 51695117997259076, - 21888242871839275222246405745257275088548364400416034343698154942151603473387, - 21888242871839275222246405745257275088548364400416034343698142859449741963081, - 21888242871839275222246405745257275088548364400416034343698162132064079413123, - 21888242871839275222246405745257275088548364400416034343698166388661317695538, - 21888242871839275222246405745257275088548364400416034343698185310672516064005, - 34934930852379476, - 71518639305077547, - 21888242871839275222246405745257275088548364400416034343698132316591551846943, - 4185137461036425, - 21888242871839275222246405745257275088548364400416034343698134809717790488681, - 21888242871839275222246405745257275088548364400416034343698142597740942381494, - 62953090873577920, - 58877353918321625, - 19015944292775312, - 21888242871839275222246405745257275088548364400416034343698199889941751609902, - 21888242871839275222246405745257275088548364400416034343698170779350883330959, - 28757378329020029, - 21888242871839275222246405745257275088548364400416034343698181192825760913297, - 45082169285395581, - 1504687560209127, - 20029765510865922, - 64017410562254655, - 21888242871839275222246405745257275088548364400416034343698183269651782651523, - 21888242871839275222246405745257275088548364400416034343698200940231283468827, - 21888242871839275222246405745257275088548364400416034343698133928484800453413, - 71897843139523334, - 38804703599367404, - 21888242871839275222246405745257275088548364400416034343698161522142637549295, - 48104551719630467, - 57630780974282558, - 21888242871839275222246405745257275088548364400416034343698134419321010749704, - 21888242871839275222246405745257275088548364400416034343698201836354200938663, - 32024473225979489, - 41021795537042244, - 21888242871839275222246405745257275088548364400416034343698168466516836027148, - 21888242871839275222246405745257275088548364400416034343698155610111399124565, - 18766150354483391, - 2248241261388469, - 23254494850760669, - 18721535656825919, - 21888242871839275222246405745257275088548364400416034343698190214402239317947, - 21888242871839275222246405745257275088548364400416034343698193033522455167525, - 71561433599358536, - 43703409862142408, - 21888242871839275222246405745257275088548364400416034343698199681823459647844, - 21888242871839275222246405745257275088548364400416034343698160806859992389869, - 21888242871839275222246405745257275088548364400416034343698186024576429444422, - 56145677649985774, - 21888242871839275222246405745257275088548364400416034343698160126816757791570, - 4836238819449992, - 23503709713785393, - 21888242871839275222246405745257275088548364400416034343698141408169667246108, - 65822283648735439, - 21888242871839275222246405745257275088548364400416034343698149056732854961000, - 21888242871839275222246405745257275088548364400416034343698134067594221775157, - 21888242871839275222246405745257275088548364400416034343698191909391728232252, - 54334010352182862, - 46799308986917538, - 63141148614083388, - 65362411871283232, - 47258009248739299, - 19808104034806646, - 21888242871839275222246405745257275088548364400416034343698169196725350759105, - 21888242871839275222246405745257275088548364400416034343698193517065252735663, - 8121730733215191, - 49324110264557262, - 68808306033118230, - 21888242871839275222246405745257275088548364400416034343698160857396608763313, - 21888242871839275222246405745257275088548364400416034343698137922012414700665, - 30848805692479237, - 64901245233346507, - 21888242871839275222246405745257275088548364400416034343698174380069118205971, - 41308298230100491, - 68336762675488307, - 54627548735971698, - 21888242871839275222246405745257275088548364400416034343698150620380248502649, - 21888242871839275222246405745257275088548364400416034343698169952360597839783, - 28706527920745285, - 21888242871839275222246405745257275088548364400416034343698178974814968835981, - 17956975264122717, - 21888242871839275222246405745257275088548364400416034343698162258309863314764, - 21888242871839275222246405745257275088548364400416034343698161695937911765880, - 29050818310011567, - 21888242871839275222246405745257275088548364400416034343698202183134706749480, - 21888242871839275222246405745257275088548364400416034343698189503884007863843, - 21888242871839275222246405745257275088548364400416034343698203594946629387275, - 21888242871839275222246405745257275088548364400416034343698203544671560296856, - 21888242871839275222246405745257275088548364400416034343698194816559263394189, - 21888242871839275222246405745257275088548364400416034343698189155190229674414, - 21888242871839275222246405745257275088548364400416034343698170440481792135176, - 21888242871839275222246405745257275088548364400416034343698143950480290971565, - 48137971283460451, - 11633709555775401, - 21888242871839275222246405745257275088548364400416034343698166694461672408110, - 62761542910690499, - 8317861594460922, - 28713955627554449, - 21888242871839275222246405745257275088548364400416034343698134227115528586322, - 56085376733384999, - 21358968549678703, - 21888242871839275222246405745257275088548364400416034343698176656636054481503, - 43024381385363899, - 46695796814991780, - 21888242871839275222246405745257275088548364400416034343698182629689361984984, - 16318513521094129, - 54848854074484666, - 21888242871839275222246405745257275088548364400416034343698136380972280790011, - 64918926422024984, - 21888242871839275222246405745257275088548364400416034343698146627135948802533, - 21888242871839275222246405745257275088548364400416034343698153046560485395477, - 68351018364537961, - 21888242871839275222246405745257275088548364400416034343698187665001815433402, - 65024589295893872, - 28490751569141234, - 68930769170343272, - 21888242871839275222246405745257275088548364400416034343698139865466026545005, - 21888242871839275222246405745257275088548364400416034343698175672584090406052, - 21888242871839275222246405745257275088548364400416034343698162177929037934452, - 56935126324510009, - 49102756038966708, - 21888242871839275222246405745257275088548364400416034343698155352938286330109, - 21888242871839275222246405745257275088548364400416034343698149495916419727511, - 21888242871839275222246405745257275088548364400416034343698173882434220779239, - 21888242871839275222246405745257275088548364400416034343698193050790137233364, - 46942522098293382, - 21888242871839275222246405745257275088548364400416034343698164296266419874505, - 21888242871839275222246405745257275088548364400416034343698196998491984041466, - 21888242871839275222246405745257275088548364400416034343698174138926709415845, - 63614322637338915, - 21888242871839275222246405745257275088548364400416034343698137308463694861587, - 69152861198344926, - 11699797174116113, - 21888242871839275222246405745257275088548364400416034343698146841837447544508, - 53789417823718694, - 21888242871839275222246405745257275088548364400416034343698164016092849799231, - 21888242871839275222246405745257275088548364400416034343698154069427299566919, - 21888242871839275222246405745257275088548364400416034343698167569205393362151, - 18362894144080834, - 21888242871839275222246405745257275088548364400416034343698176999645129470180, - 21888242871839275222246405745257275088548364400416034343698166229770027681275, - 21888242871839275222246405745257275088548364400416034343698202786713906085001, - 58309345044230701, - 64744188796090179, - 50111310796886451, - 21888242871839275222246405745257275088548364400416034343698154770944626359834, - 57700878668362463, - 21888242871839275222246405745257275088548364400416034343698132534093713712783, - 47802413010451411, - 21888242871839275222246405745257275088548364400416034343698190752341044538463, - 21078727510981438, - 20391930848854457, - 21888242871839275222246405745257275088548364400416034343698181440257167146504, - 21888242871839275222246405745257275088548364400416034343698158165154974093790, - 21888242871839275222246405745257275088548364400416034343698140843560939629486, - 24961943314278449, - 21888242871839275222246405745257275088548364400416034343698156168284886769794, - 45890122057935473, - 21888242871839275222246405745257275088548364400416034343698162372635338859042, - 52091336564492201, - 21888242871839275222246405745257275088548364400416034343698147752552921445509, - 13215478006421086, - 396787139329149, - 70048210313011825, - 21888242871839275222246405745257275088548364400416034343698140763291764988068, - 21888242871839275222246405745257275088548364400416034343698196825371500760904, - 21888242871839275222246405745257275088548364400416034343698183431227411458830, - 61106455333150883, - 21888242871839275222246405745257275088548364400416034343698175689085634745443, - 66274814200742039, - 21888242871839275222246405745257275088548364400416034343698184913097456723815, - 21888242871839275222246405745257275088548364400416034343698195405615793702701, - 18807492997681802, - 4278323958076258, - 21888242871839275222246405745257275088548364400416034343698194411708772351577, - 52980895853550725, - 26329197446128876, - 21888242871839275222246405745257275088548364400416034343698194801822264540652, - 21888242871839275222246405745257275088548364400416034343698161112217190297796, - 7750818837842899, - 21888242871839275222246405745257275088548364400416034343698185842323772070907, - 21888242871839275222246405745257275088548364400416034343698172212837061363843, - 21888242871839275222246405745257275088548364400416034343698138745322381133015, - 21888242871839275222246405745257275088548364400416034343698144235644721115440, - 21888242871839275222246405745257275088548364400416034343698146365456722262506, - 66452191794883039, - 21888242871839275222246405745257275088548364400416034343698153518783825732392, - 21888242871839275222246405745257275088548364400416034343698132627025528959651, - 21888242871839275222246405745257275088548364400416034343698164807031667481704, - 21888242871839275222246405745257275088548364400416034343698175322201871840716, - 21888242871839275222246405745257275088548364400416034343698164546967963478769, - 21888242871839275222246405745257275088548364400416034343698158869729662965023, - 68068010149577777, - 68963013928491249, - 21888242871839275222246405745257275088548364400416034343698174113864683928965, - 30382395604217114, - 64434603537767964, - 21888242871839275222246405745257275088548364400416034343698140345679415704632, - 24525152056371619, - 21888242871839275222246405745257275088548364400416034343698192631551927014612, - 21888242871839275222246405745257275088548364400416034343698141991950020298850, - 21888242871839275222246405745257275088548364400416034343698134744584183693934, - 21888242871839275222246405745257275088548364400416034343698144838328280731711, - 21888242871839275222246405745257275088548364400416034343698162278478419969232, - 880986703494254, - 69520026318267888, - 63234645828223034, - 21888242871839275222246405745257275088548364400416034343698184299401145602195, - 47483135434147193, - 15356424151973269, - 49885695320020148, - 62758564409792269, - 60833170352596688, - 21888242871839275222246405745257275088548364400416034343698171710001137664464, - 19865124885209349, - 58762426225659151, - 21888242871839275222246405745257275088548364400416034343698158379277061587136, - 47950782511840910, - 26718835040578963, - 64881150355686465, - 39424368410954418, - 21888242871839275222246405745257275088548364400416034343698188239681372437095, - 21888242871839275222246405745257275088548364400416034343698185245565255754940, - 21888242871839275222246405745257275088548364400416034343698133975850586600052, - 29719503016190837, - 21888242871839275222246405745257275088548364400416034343698165480792697716760, - 27824964483227937, - 21888242871839275222246405745257275088548364400416034343698194134737941907512, - 14207396002534601, - 20950096895980798, - 21888242871839275222246405745257275088548364400416034343698137577491321730585, - 50561063819476392, - 56128410869957003, - 16658372637545898, - 25058111856624240, - 49843457870643654, - 28691802240838295, - 21888242871839275222246405745257275088548364400416034343698148509676564850737, - 53384540972732178, - 21888242871839275222246405745257275088548364400416034343698143393413417018862, - 21888242871839275222246405745257275088548364400416034343698143354037398138751, - 21888242871839275222246405745257275088548364400416034343698166737396924262775, - 54877933273166629, - 3611923277810109, - 69371024455026547, - 21888242871839275222246405745257275088548364400416034343698174637350863872598, - 21888242871839275222246405745257275088548364400416034343698149185869323466654, - 17647575872089383, - 21888242871839275222246405745257275088548364400416034343698193869977651702696, - 21888242871839275222246405745257275088548364400416034343698159701923378304371, - 21888242871839275222246405745257275088548364400416034343698158700007723531206, - 11119223967700248, - 21888242871839275222246405745257275088548364400416034343698181643894697351803, - 21722721490688671, - 21888242871839275222246405745257275088548364400416034343698180561223358056830, - 21888242871839275222246405745257275088548364400416034343698194601343227657418, - 21888242871839275222246405745257275088548364400416034343698198661381895670168, - 10530905132127492, - 38672488273153588, - 44027759455697619, - 35009969345112381, - 21888242871839275222246405745257275088548364400416034343698199575047284100667, - 28317716503873147, - 33773289530890908, - 25916865819235408, - 13812948982521573, - 5793852488116485, - 48055162217170305, - 21888242871839275222246405745257275088548364400416034343698140662721608429830, - 21888242871839275222246405745257275088548364400416034343698138933485090934069, - 30926612103292559, - 21888242871839275222246405745257275088548364400416034343698196714169281270534, - 16655318809147166, - 21888242871839275222246405745257275088548364400416034343698195976316587194001, - 21888242871839275222246405745257275088548364400416034343698132772952113451691, - 54941238767915362, - 26988059627395992, - 21888242871839275222246405745257275088548364400416034343698143652132774108131, - 21888242871839275222246405745257275088548364400416034343698136899578188463028, - 65802171327254721, - 45348952306975220, - 21888242871839275222246405745257275088548364400416034343698200087638341303611, - 21888242871839275222246405745257275088548364400416034343698163389966752234468, - 21888242871839275222246405745257275088548364400416034343698168755197599707060, - 45803661951711860, - 3035667224505332, - 21888242871839275222246405745257275088548364400416034343698153046018407965508, - 16332962550934491, - 3210309432719876, - 8183819624277558, - 21888242871839275222246405745257275088548364400416034343698202453419678783682, - 53515780430304347, - 39807296262977162, - 7640839145828144, - 21888242871839275222246405745257275088548364400416034343698187726332083071203, - 21888242871839275222246405745257275088548364400416034343698184275296271796056, - 38041776741958366, - 21888242871839275222246405745257275088548364400416034343698166997709078498943, - 56531218728976446, - 22391308567264399, - 21888242871839275222246405745257275088548364400416034343698132616327396136380, - 21888242871839275222246405745257275088548364400416034343698137887377864167849, - 35827895094805289, - 31322371958178875, - 27515245031828543, - 11014883337915559, - 21888242871839275222246405745257275088548364400416034343698171728124758005039, - 67723314220927252, - 15813508612969053, - 21888242871839275222246405745257275088548364400416034343698132347901736939733, - 49756435714772727, - 21888242871839275222246405745257275088548364400416034343698162042468996115329, - 21888242871839275222246405745257275088548364400416034343698146212119451314440, - 55079028979889305, - 7169175780136086, - 59288957552619244, - 21888242871839275222246405745257275088548364400416034343698155483040122104868, - 21888242871839275222246405745257275088548364400416034343698181754699342672954, - 7255137059510080, - 13624067978119477, - 13937162785114620, - 21888242871839275222246405745257275088548364400416034343698201244526524518304, - 55040400624000549, - 36504162666516233, - 23094435946890215, - 65780487327063756, - 21888242871839275222246405745257275088548364400416034343698181607958713320533, - 21888242871839275222246405745257275088548364400416034343698146346944146297288, - 21888242871839275222246405745257275088548364400416034343698173608696257540126, - 20660646115701693, - 28626418659351469, - 21888242871839275222246405745257275088548364400416034343698134018514999477987, - 36685758639599238, - 25480820202957042, - 63181267220677015, - 21888242871839275222246405745257275088548364400416034343698158747454850460530, - 40792233058113110, - 48892561829876282, - 21888242871839275222246405745257275088548364400416034343698162360012822579109, - 61590415407497635, - 52825100745796791, - 23030755201643911, - 7029973145533488, - 21888242871839275222246405745257275088548364400416034343698185095317587558520, - 25928791405201378, - 21888242871839275222246405745257275088548364400416034343698166124615232791202, - 39422970568710400, - 21888242871839275222246405745257275088548364400416034343698182337312862375174, - 21888242871839275222246405745257275088548364400416034343698182824285020312838, - 21888242871839275222246405745257275088548364400416034343698176803978839431653, - 21888242871839275222246405745257275088548364400416034343698195133100252382988, - 21888242871839275222246405745257275088548364400416034343698168021564738173457, - 21888242871839275222246405745257275088548364400416034343698145151276805809758, - 21888242871839275222246405745257275088548364400416034343698197717635308595883, - 21888242871839275222246405745257275088548364400416034343698135900808343988128, - 21888242871839275222246405745257275088548364400416034343698169191102827635885, - 21294081561235826, - 21888242871839275222246405745257275088548364400416034343698142387675693186667, - 31317285033542343, - 17381786995639756, - 21888242871839275222246405745257275088548364400416034343698158682209645308613, - 21888242871839275222246405745257275088548364400416034343698198957447909289454, - 50036007087531697, - 17720014140033952, - 21888242871839275222246405745257275088548364400416034343698145251095154944996, - 5828616699500793, - 21888242871839275222246405745257275088548364400416034343698163791191323627172, - 63145401430526972, - 63065681660075176, - 21888242871839275222246405745257275088548364400416034343698154889239215733781, - 60682145828660131, - 21888242871839275222246405745257275088548364400416034343698146526712473828647, - 27571396419073087, - 21888242871839275222246405745257275088548364400416034343698185149035961270587, - 31584799851397155, - 6253143859137590, - 21888242871839275222246405745257275088548364400416034343698198930431108611162, - 21888242871839275222246405745257275088548364400416034343698167108076347784015, - 14634998509612100, - 44557168454123661, - 21888242871839275222246405745257275088548364400416034343698189911385529096218, - 21888242871839275222246405745257275088548364400416034343698183518260143892664, - 70513060158680229, - 21888242871839275222246405745257275088548364400416034343698133203604128632989, - 32054026682315705, - 21888242871839275222246405745257275088548364400416034343698188240247107017700, - 54541693982569112, - 21888242871839275222246405745257275088548364400416034343698168856957146379378, - 21888242871839275222246405745257275088548364400416034343698168483067253761595, - 21888242871839275222246405745257275088548364400416034343698150969210565326824, - 21888242871839275222246405745257275088548364400416034343698150870140690730486, - 54565457423399491, - 21888242871839275222246405745257275088548364400416034343698157501367370356578, - 28254714159605836, - 21888242871839275222246405745257275088548364400416034343698195642207145933877, - 21888242871839275222246405745257275088548364400416034343698185682010892000534, - 21888242871839275222246405745257275088548364400416034343698200401930294785019, - 26674784297995882, - 21888242871839275222246405745257275088548364400416034343698178118476161403021, - 21888242871839275222246405745257275088548364400416034343698199655362473596508, - 71954648444669189, - 50078139847893455, - 63950626285967598, - 20806771784117237, - 51112516780528431, - 21888242871839275222246405745257275088548364400416034343698167919877122340764, - 21888242871839275222246405745257275088548364400416034343698140518474216005118, - 21888242871839275222246405745257275088548364400416034343698132800629210977313, - 30063098190116703, - 21888242871839275222246405745257275088548364400416034343698143470030475277971, - 21888242871839275222246405745257275088548364400416034343698203710176084749169, - 41115341975034689, - 31331346655065755, - 65572210268842754, - 21888242871839275222246405745257275088548364400416034343698169334764726828761, - 24761123533642723, - 58170498727661069, - 22258116780439568, - 25954433832384608, - 21888242871839275222246405745257275088548364400416034343698185574623951973838, - 64093746403766341, - 70259642502746754, - 39362745300582068, - 15861911050134097, - 21888242871839275222246405745257275088548364400416034343698180529111193213895, - 29971929410364586, - 21888242871839275222246405745257275088548364400416034343698202205066569112296, - 21888242871839275222246405745257275088548364400416034343698164884273380145748, - 21888242871839275222246405745257275088548364400416034343698185305341150692427, - 21888242871839275222246405745257275088548364400416034343698194511834052265366, - 21888242871839275222246405745257275088548364400416034343698158727773227919407, - 21888242871839275222246405745257275088548364400416034343698147767637406004250, - 28312317311990417, - 4215294517126357, - 30293849596594865, - 21888242871839275222246405745257275088548364400416034343698183088472422321401, - 21888242871839275222246405745257275088548364400416034343698161096279778389352, - 21888242871839275222246405745257275088548364400416034343698150010419562518121, - 21888242871839275222246405745257275088548364400416034343698162349028974990689, - 21888242871839275222246405745257275088548364400416034343698177076255856237874, - 21888242871839275222246405745257275088548364400416034343698149730638673352416, - 39945747545628428, - 54560737093418251, - 4473049746836395, - 21888242871839275222246405745257275088548364400416034343698157298861246376793, - 60982773876934888, - 23682794183185697, - 41697222217943237, - 21888242871839275222246405745257275088548364400416034343698155958516483690757, - 21888242871839275222246405745257275088548364400416034343698146199048935978896, - 53770088515270220, - 18032881955662933, - 61588976021243005, - 21888242871839275222246405745257275088548364400416034343698174183975365781868, - 21888242871839275222246405745257275088548364400416034343698138979866213861578, - 12833979916476194, - 21888242871839275222246405745257275088548364400416034343698155243979459902381, - 5104362553395082, - 6493037063158851, - 14857003857059321, - 71086705484941159, - 21888242871839275222246405745257275088548364400416034343698140642215350851097, - 21888242871839275222246405745257275088548364400416034343698188852300701311629, - 21888242871839275222246405745257275088548364400416034343698177273605776136493, - 21888242871839275222246405745257275088548364400416034343698172876581836422791, - 2796852043574216, - 71595925674050132, - 44163764204601484, - 21888242871839275222246405745257275088548364400416034343698192478210075107798, - 21888242871839275222246405745257275088548364400416034343698196035468993014163, - 44954434661740525, - 21888242871839275222246405745257275088548364400416034343698176957145212865409, - 21888242871839275222246405745257275088548364400416034343698193633525735087627, - 37230468519053798, - 51404613583314929, - 21888242871839275222246405745257275088548364400416034343698167844989097450956, - 21888242871839275222246405745257275088548364400416034343698184001994785803983, - 21888242871839275222246405745257275088548364400416034343698171085054579102427, - 21888242871839275222246405745257275088548364400416034343698196594856463352139, - 35204006834323283, - 21888242871839275222246405745257275088548364400416034343698171413315726381070, - 21888242871839275222246405745257275088548364400416034343698192345764259920493, - 21888242871839275222246405745257275088548364400416034343698174232607096400929, - 47910700064067784, - 13649960645832318, - 12566218721659951, - 21888242871839275222246405745257275088548364400416034343698143822495755250067, - 21888242871839275222246405745257275088548364400416034343698180439226374690691, - 3577902444759583, - 21888242871839275222246405745257275088548364400416034343698150414456424698662, - 21888242871839275222246405745257275088548364400416034343698188619324093222146, - 21888242871839275222246405745257275088548364400416034343698198235003906153381, - 21888242871839275222246405745257275088548364400416034343698159021383113495187, - 21888242871839275222246405745257275088548364400416034343698149184283651667534, - 67044197054953920, - 21888242871839275222246405745257275088548364400416034343698166175268018131012, - 25095748451554233, - 21888242871839275222246405745257275088548364400416034343698147545251314703069, - 21130022772057, - 9837677875393100, - 21888242871839275222246405745257275088548364400416034343698193184600198511742, - 21888242871839275222246405745257275088548364400416034343698169850839089251945, - 21888242871839275222246405745257275088548364400416034343698194107867417294239, - 21888242871839275222246405745257275088548364400416034343698188711249311162552, - 22279332437392007, - 21888242871839275222246405745257275088548364400416034343698156429396239585913, - 30470678037480519, - 21888242871839275222246405745257275088548364400416034343698139910384199552960, - 21888242871839275222246405745257275088548364400416034343698156576763645154032, - 21888242871839275222246405745257275088548364400416034343698155950996120670114, - 21888242871839275222246405745257275088548364400416034343698133036769309919678, - 21888242871839275222246405745257275088548364400416034343698139490908607568160, - 21888242871839275222246405745257275088548364400416034343698187438053120920372, - 21888242871839275222246405745257275088548364400416034343698185770570759258871, - 21888242871839275222246405745257275088548364400416034343698143546127118346364, - 21888242871839275222246405745257275088548364400416034343698201552500180053520, - 19978930421593242, - 25018387570174159, - 21888242871839275222246405745257275088548364400416034343698152895438438199381, - 65788407521966770, - 23575206715118990, - 20638451044917421, - 21888242871839275222246405745257275088548364400416034343698193850389031338952, - 5748423455557875, - 50112595804946889, - 21888242871839275222246405745257275088548364400416034343698149633525970543235, - 21888242871839275222246405745257275088548364400416034343698143896723566377589, - 50543324740468959, - 21888242871839275222246405745257275088548364400416034343698173706100991885897, - 54867007524578444, - 21888242871839275222246405745257275088548364400416034343698155738297540746128, - 1133159184713320, - 21888242871839275222246405745257275088548364400416034343698162074139335827320, - 21888242871839275222246405745257275088548364400416034343698164268807759123243, - 21888242871839275222246405745257275088548364400416034343698174616636788393776, - 21888242871839275222246405745257275088548364400416034343698187565437048457394, - 54512360662667738, - 4575514947179182, - 21888242871839275222246405745257275088548364400416034343698136643460863593909, - 21888242871839275222246405745257275088548364400416034343698139098502948983184, - 21888242871839275222246405745257275088548364400416034343698181557542623212344, - 26836634960001270, - 21888242871839275222246405745257275088548364400416034343698147826749976682419, - 44560201853337861, - 21888242871839275222246405745257275088548364400416034343698179148101164149521, - 21888242871839275222246405745257275088548364400416034343698162576107453778291, - 21888242871839275222246405745257275088548364400416034343698187866220620525851, - 48779217512931434, - 47826159069223478, - 21888242871839275222246405745257275088548364400416034343698153162525994863314, - 21888242871839275222246405745257275088548364400416034343698150485631611447997, - 21888242871839275222246405745257275088548364400416034343698194918053837543734, - 4391734363771110, - 20539450530153811, - 67066561638177560, - 46174114289219785, - 1957225977971388, - 56879328443077121, - 21888242871839275222246405745257275088548364400416034343698142863248328509381, - 28797687051431785, - 21888242871839275222246405745257275088548364400416034343698172135434243706065, - 21888242871839275222246405745257275088548364400416034343698142948077034537851, - 21888242871839275222246405745257275088548364400416034343698144617643023964677, - 33954637378883040, - 53230491540693480, - 21888242871839275222246405745257275088548364400416034343698186576434215214789, - 21888242871839275222246405745257275088548364400416034343698175826567083552688, - 4741158862620193, - 48887358349473648, - 46586437012663703, - 54160678572349859, - 21888242871839275222246405745257275088548364400416034343698200566497903918875, - 59918574390220483, - 46529505770412413, - 21888242871839275222246405745257275088548364400416034343698148073607721563598, - 35881647612958320, - 42282126428584580, - 29201606060635296, - 20617367468510346, - 25304377280535580, - 21888242871839275222246405745257275088548364400416034343698197568987564364958, - 50411554659733764, - 21888242871839275222246405745257275088548364400416034343698143114589120199492, - 21888242871839275222246405745257275088548364400416034343698176478576936375434, - 21888242871839275222246405745257275088548364400416034343698162796123665873205, - 23875588059426078, - 7419158066027320, - 21888242871839275222246405745257275088548364400416034343698201508911793086762, - 51887061634939827, - 68112818890563517, - 44141145348743332, - 3488028756939082, - 18196812755105443, - 69142817796740996, - 21888242871839275222246405745257275088548364400416034343698151379205117125447, - 21888242871839275222246405745257275088548364400416034343698179593538219060831, - 21888242871839275222246405745257275088548364400416034343698154652968885293858, - 21888242871839275222246405745257275088548364400416034343698149635694913826265, - 21888242871839275222246405745257275088548364400416034343698132662427055582468, - 21048576924720654, - 47994109578234563, - 21888242871839275222246405745257275088548364400416034343698179276869824671212, - 19019523892797878, - 52796195374689982, - 53791579394642739, - 21888242871839275222246405745257275088548364400416034343698176396593923161127, - 34945034193519940, - 46811243303585328, - 21888242871839275222246405745257275088548364400416034343698188291003259063665, - 1422781226261226, - 21888242871839275222246405745257275088548364400416034343698175318427891068334, - 21888242871839275222246405745257275088548364400416034343698196752419550341257, - 12612698245100861, - 20738223320082339, - 21888242871839275222246405745257275088548364400416034343698146864733301000955, - 21888242871839275222246405745257275088548364400416034343698175737631984015179, - 67997961922926251, - 21888242871839275222246405745257275088548364400416034343698203388709040095073, - 21888242871839275222246405745257275088548364400416034343698158511763211816197, - 21888242871839275222246405745257275088548364400416034343698137942749452618874, - 21888242871839275222246405745257275088548364400416034343698195310713518132153, - 21888242871839275222246405745257275088548364400416034343698154018796037759355, - 21888242871839275222246405745257275088548364400416034343698151181937531114670, - 21888242871839275222246405745257275088548364400416034343698163135921942623762, - 47116703435698205, - 40128716329362593, - 21888242871839275222246405745257275088548364400416034343698160718170401668333, - 41263972909983947, - 60175077853442246, - 12075687270578239, - 21888242871839275222246405745257275088548364400416034343698156827560772289350, - 8443161222986995, - 15265859573806710, - 21888242871839275222246405745257275088548364400416034343698142199901533918786, - 24078220837574997, - 21888242871839275222246405745257275088548364400416034343698189759991258181588, - 47822010719372209, - 21888242871839275222246405745257275088548364400416034343698157280021381549736, - 21888242871839275222246405745257275088548364400416034343698171404609995956343, - 21888242871839275222246405745257275088548364400416034343698142674529883873759, - 21888242871839275222246405745257275088548364400416034343698135519990852312957, - 24806275079437265, - 21888242871839275222246405745257275088548364400416034343698144777113801779168, - 8453287473640705, - 21888242871839275222246405745257275088548364400416034343698144190725389359264, - 38050225097665092, - 18114478886704665, - 21888242871839275222246405745257275088548364400416034343698188657435541652229, - 60917591892681091, - 21888242871839275222246405745257275088548364400416034343698170790201306054497, - 36506530931558032, - 21888242871839275222246405745257275088548364400416034343698168666896156272188, - 21888242871839275222246405745257275088548364400416034343698171760580119552692, - 12683842986032438, + 95282518797874191, + 21888242871839275222246405745257275088548364400416034343698105854589644872676, + 114070426057075984, + 140868119924168158, + 21888242871839275222246405745257275088548364400416034343698080964953835925250, + 21888242871839275222246405745257275088548364400416034343698202337320291400439, + 50712302451085027, + 21888242871839275222246405745257275088548364400416034343698169685672736712680, + 54633973480724763, + 121528606512376422, + 21888242871839275222246405745257275088548364400416034343698170185251519389714, + 21888242871839275222246405745257275088548364400416034343698144352033629889959, + 52624133439082660, + 131369944665217977, + 39873698027562585, + 68215280572976285, + 107902547875158540, + 73903619430949277, + 21888242871839275222246405745257275088548364400416034343698135534194957455860, + 21888242871839275222246405745257275088548364400416034343698104947390163869582, + 21888242871839275222246405745257275088548364400416034343698109699659894700496, + 130181653877603381, + 21888242871839275222246405745257275088548364400416034343698128426846632859177, + 21888242871839275222246405745257275088548364400416034343698113046787714576189, + 64235241904967940, + 72970370944367227, + 58362653061018044, + 106539035125600622, + 21888242871839275222246405745257275088548364400416034343698061444719598122393, + 21888242871839275222246405745257275088548364400416034343698075300835967910244, + 21888242871839275222246405745257275088548364400416034343698116838012499426284, + 82293117106966887, + 21888242871839275222246405745257275088548364400416034343698167219917304731045, + 110579849374656124, + 21888242871839275222246405745257275088548364400416034343698104141934001547734, + 65253190202393500, + 21888242871839275222246405745257275088548364400416034343698079466574202552507, + 21888242871839275222246405745257275088548364400416034343698108829891742825347, + 143951320277178960, + 103593021564423562, + 137552764653083860, + 21888242871839275222246405745257275088548364400416034343698136685259090692440, + 21888242871839275222246405745257275088548364400416034343698083389046320756504, + 108097742833012764, + 21888242871839275222246405745257275088548364400416034343698159350287723021139, + 21888242871839275222246405745257275088548364400416034343698156677175374311218, + 114648043799799380, + 21888242871839275222246405745257275088548364400416034343698083462076416014907, + 21888242871839275222246405745257275088548364400416034343698180477165368514768, + 21711016274230042, + 21888242871839275222246405745257275088548364400416034343698137522095875605256, + 81932297150595560, + 21888242871839275222246405745257275088548364400416034343698149717761773466201, + 21888242871839275222246405745257275088548364400416034343698112202569753681819, + 58774857069266334, + 21888242871839275222246405745257275088548364400416034343698154557213157263056, + 35830067912483490, + 21888242871839275222246405745257275088548364400416034343698142690212834169077, + 21888242871839275222246405745257275088548364400416034343698163458423201559722, + 31091944955331235, + 66855540584019513, + 21888242871839275222246405745257275088548364400416034343698143594226437608472, + 21888242871839275222246405745257275088548364400416034343698162568604662739958, + 21888242871839275222246405745257275088548364400416034343698115731480035099265, + 21888242871839275222246405745257275088548364400416034343698185676935750694791, + 35073514850877681, + 56712977600110915, + 21888242871839275222246405745257275088548364400416034343698090444981388012638, + 21888242871839275222246405745257275088548364400416034343698148548438797529895, + 21888242871839275222246405745257275088548364400416034343698183928429996444158, + 21888242871839275222246405745257275088548364400416034343698121975482751608334, + 21888242871839275222246405745257275088548364400416034343698128502918280115451, + 21888242871839275222246405745257275088548364400416034343698173208057463259196, + 21888242871839275222246405745257275088548364400416034343698103421027517371660, + 67183983042684117, + 21888242871839275222246405745257275088548364400416034343698196828104237328977, + 21888242871839275222246405745257275088548364400416034343698066294552655691155, + 43623055837773777, + 36130541609385894, + 93668659020063361, + 19083667798450476, + 21888242871839275222246405745257275088548364400416034343698160792460598572379, + 21888242871839275222246405745257275088548364400416034343698167678185089894643, + 21888242871839275222246405745257275088548364400416034343698117917460673568043, + 21888242871839275222246405745257275088548364400416034343698133616209834312279, + 21888242871839275222246405745257275088548364400416034343698180783243874139424, + 21888242871839275222246405745257275088548364400416034343698171575500154645598, + 21888242871839275222246405745257275088548364400416034343698154159831666317619, + 140325959775861662, + 117041193846928781, + 51404339139511822, + 128748692342597639, + 21888242871839275222246405745257275088548364400416034343698105122536528929614, + 39158870151628709, + 21888242871839275222246405745257275088548364400416034343698070407045209006886, + 24487539228383682, + 21888242871839275222246405745257275088548364400416034343698197827245048742273, + 35924575872984368, + 21888242871839275222246405745257275088548364400416034343698085457579165427075, + 104186423467342754, + 30606211665538481, + 102942498359749313, + 41295188230696660, + 123898187129794554, + 21888242871839275222246405745257275088548364400416034343698099171646494656257, + 21888242871839275222246405745257275088548364400416034343698198317369734087802, + 21888242871839275222246405745257275088548364400416034343698068151164933618223, + 21888242871839275222246405745257275088548364400416034343698126036630049916193, + 61532633066902700, + 21888242871839275222246405745257275088548364400416034343698082163767460658327, + 21888242871839275222246405745257275088548364400416034343698076299968708972699, + 66321028925168883, + 21888242871839275222246405745257275088548364400416034343698115778153971312286, + 106597410564680624, + 59324407853141233, + 21888242871839275222246405745257275088548364400416034343698116446310594424167, + 21888242871839275222246405745257275088548364400416034343698128212715999600378, + 75877241944263131, + 2637702188756080, + 21888242871839275222246405745257275088548364400416034343698132625120644835133, + 40605019109221575, + 21888242871839275222246405745257275088548364400416034343698192018795835419091, + 115113166028849356, + 21888242871839275222246405745257275088548364400416034343698151567127968592942, + 137147709337575999, + 113464798032813044, + 21888242871839275222246405745257275088548364400416034343698172859334832455452, + 29909470144352955, + 32242215515054445, + 21888242871839275222246405745257275088548364400416034343698114608069465118113, + 20210991828566256, + 48135589175783730, + 88198215649754537, + 21888242871839275222246405745257275088548364400416034343698108928618237751209, + 21888242871839275222246405745257275088548364400416034343698154384906819560016, + 58116422022617237, + 64028104327923325, + 21888242871839275222246405745257275088548364400416034343698081916786254868722, + 115620019286765929, + 21888242871839275222246405745257275088548364400416034343698136149883709119687, + 8306769100840426, + 21888242871839275222246405745257275088548364400416034343698077701385995400665, + 21888242871839275222246405745257275088548364400416034343698199072388416803295, + 126039921007871849, + 114131782193062456, + 76772716547663914, + 21888242871839275222246405745257275088548364400416034343698196926235576761169, + 20378793666572403, + 21888242871839275222246405745257275088548364400416034343698167835659859525099, + 135848920813912008, + 21888242871839275222246405745257275088548364400416034343698121549625060213711, + 21888242871839275222246405745257275088548364400416034343698130532362884732518, + 95136434049544501, + 21888242871839275222246405745257275088548364400416034343698094163928834577084, + 21888242871839275222246405745257275088548364400416034343698127480296138747782, + 21888242871839275222246405745257275088548364400416034343698089390816341456191, + 32345498859061193, + 21888242871839275222246405745257275088548364400416034343698079917148932860652, + 21888242871839275222246405745257275088548364400416034343698060401623132629468, + 21888242871839275222246405745257275088548364400416034343698188210844331523642, + 21888242871839275222246405745257275088548364400416034343698066475876661307781, + 55382143927792209, + 77431256359668201, + 21888242871839275222246405745257275088548364400416034343698122579584932976932, + 139792963032411846, + 117657979720856328, + 136136978471836281, + 21888242871839275222246405745257275088548364400416034343698124798748259761229, + 21888242871839275222246405745257275088548364400416034343698148506986071807405, + 137265311164617547, + 34298362217734884, + 21888242871839275222246405745257275088548364400416034343698105659854131490039, + 140272022339150605, + 62333971796762035, + 126332462047717219, + 21888242871839275222246405745257275088548364400416034343698082888613358022410, + 21888242871839275222246405745257275088548364400416034343698161678769328442404, + 21888242871839275222246405745257275088548364400416034343698173814354818782998, + 21888242871839275222246405745257275088548364400416034343698072515904648487044, + 138681144096140210, + 21888242871839275222246405745257275088548364400416034343698160752044190850437, + 21888242871839275222246405745257275088548364400416034343698182727305846109260, + 77861122387416935, + 21888242871839275222246405745257275088548364400416034343698131009096707624789, + 136894822608006955, + 79825654507695444, + 21888242871839275222246405745257275088548364400416034343698177341165523032276, + 21888242871839275222246405745257275088548364400416034343698184102450469316607, + 90426855862266851, + 21888242871839275222246405745257275088548364400416034343698127038583146564801, + 21888242871839275222246405745257275088548364400416034343698144267244343338083, + 21888242871839275222246405745257275088548364400416034343698203241044608197454, + 21888242871839275222246405745257275088548364400416034343698190278410686162593, + 128954399921592330, + 21888242871839275222246405745257275088548364400416034343698187854368143893361, + 21888242871839275222246405745257275088548364400416034343698194044896041946875, + 62313341982081703, + 34096952666527176, + 106974933769304319, + 36530108536974146, + 49594222291169144, + 116394020954296533, + 21888242871839275222246405745257275088548364400416034343698071576189022241263, + 21888242871839275222246405745257275088548364400416034343698099697140302250285, + 58236347093970544, + 96320379903320988, + 21888242871839275222246405745257275088548364400416034343698110702878839158364, + 21888242871839275222246405745257275088548364400416034343698127805217460104062, + 21888242871839275222246405745257275088548364400416034343698078127212477436647, + 119359918046387945, + 57203347030929712, + 21888242871839275222246405745257275088548364400416034343698163107181947769476, + 21888242871839275222246405745257275088548364400416034343698170062603997128980, + 21888242871839275222246405745257275088548364400416034343698185991451572563650, + 132648446776142615, + 21888242871839275222246405745257275088548364400416034343698138769259660212607, + 21888242871839275222246405745257275088548364400416034343698110499248285000026, + 44364576343395945, + 46426458951052396, + 21888242871839275222246405745257275088548364400416034343698177960510356852766, + 21888242871839275222246405745257275088548364400416034343698099151307872104626, + 21888242871839275222246405745257275088548364400416034343698133644746300061069, + 21888242871839275222246405745257275088548364400416034343698166990583878196189, + 77885944187795962, + 50808641776894491, + 123852419343799449, + 57000253540035681, + 21888242871839275222246405745257275088548364400416034343698083804612535658843, + 21888242871839275222246405745257275088548364400416034343698083292488235439501, + 21888242871839275222246405745257275088548364400416034343698150421410074161381, + 21888242871839275222246405745257275088548364400416034343698141614088629119670, + 82309310195829512, + 21888242871839275222246405745257275088548364400416034343698099120183307005057, + 143427194790732473, + 21888242871839275222246405745257275088548364400416034343698187674958264999105, + 133520879542913625, + 21888242871839275222246405745257275088548364400416034343698086643803154505714, + 30776760604218780, + 21888242871839275222246405745257275088548364400416034343698081507866299856238, + 22222078095931304, + 55426249392450813, + 98694363163046414, + 21888242871839275222246405745257275088548364400416034343698060428291259111378, + 102144802678274855, + 21888242871839275222246405745257275088548364400416034343698156338040949726610, + 21888242871839275222246405745257275088548364400416034343698112443259881978543, + 92322963328417766, + 21888242871839275222246405745257275088548364400416034343698193624085785914288, + 80532533194747355, + 123629439380961343, + 21888242871839275222246405745257275088548364400416034343698123590120895237369, + 99592858385349160, + 21888242871839275222246405745257275088548364400416034343698074671194213545740, + 112843902456549696, + 73605014749609119, + 58372981989135747, + 34368345872862238, + 21888242871839275222246405745257275088548364400416034343698079148036861789972, + 21888242871839275222246405745257275088548364400416034343698067468837168538255, + 21888242871839275222246405745257275088548364400416034343698157268557503758738, + 84013315009608416, + 35294779921986516, + 12763248713459605, + 25562448329693618, + 21888242871839275222246405745257275088548364400416034343698150048341485598401, + 71129298591703531, + 21888242871839275222246405745257275088548364400416034343698177719076790562185, + 42500592086922992, + 65072917881037778, + 21888242871839275222246405745257275088548364400416034343698150978606950387527, + 21888242871839275222246405745257275088548364400416034343698096444399396949558, + 21888242871839275222246405745257275088548364400416034343698164678367489428522, + 29707581023182571, + 81244351151761814, + 125087674421966955, + 21888242871839275222246405745257275088548364400416034343698084073894887469998, + 21888242871839275222246405745257275088548364400416034343698129005897482409114, + 18348001938710622, + 109821335514709619, + 21888242871839275222246405745257275088548364400416034343698140681136274188813, + 143861557212476772, + 21888242871839275222246405745257275088548364400416034343698197039352065956780, + 98850138708663425, + 21888242871839275222246405745257275088548364400416034343698089836864863256631, + 46190981116383890, + 21888242871839275222246405745257275088548364400416034343698133005994554092312, + 129742770260546299, + 21888242871839275222246405745257275088548364400416034343698126846726384577099, + 28164898727022118, + 21888242871839275222246405745257275088548364400416034343698187534776961866437, + 21888242871839275222246405745257275088548364400416034343698132657010678589470, + 75113527646684697, + 21888242871839275222246405745257275088548364400416034343698132710606314969984, + 8206652508538593, + 21888242871839275222246405745257275088548364400416034343698130203375046765030, + 133647077453628850, + 21888242871839275222246405745257275088548364400416034343698140995142334320113, + 93651156329121327, + 21888242871839275222246405745257275088548364400416034343698070140369954896882, + 21888242871839275222246405745257275088548364400416034343698072389541737132377, + 21888242871839275222246405745257275088548364400416034343698083800572611559025, + 11069770320023066, + 21888242871839275222246405745257275088548364400416034343698187387092626123448, + 21888242871839275222246405745257275088548364400416034343698113334418653274688, + 21888242871839275222246405745257275088548364400416034343698101167589844163827, + 61352105591103971, + 67664510188316394, + 82985970122913365, + 91436073475768359, + 21888242871839275222246405745257275088548364400416034343698104834640805923513, + 21888242871839275222246405745257275088548364400416034343698154828119136896689, + 136931816866255979, + 12811762338313725, + 21888242871839275222246405745257275088548364400416034343698190594598984281432, + 21888242871839275222246405745257275088548364400416034343698118805753868031830, + 36346852307697418, + 67940079025163176, + 70110248406435448, + 21888242871839275222246405745257275088548364400416034343698177877124582470532, + 21888242871839275222246405745257275088548364400416034343698169032862773039914, + 76307982218880875, + 100199543619829794, + 70524209440353913, + 21888242871839275222246405745257275088548364400416034343698101875164779603858, + 21888242871839275222246405745257275088548364400416034343698113336005765835568, + 55414515470260283, + 21888242871839275222246405745257275088548364400416034343698189260877971577044, + 2350517352648367, + 132363968840163193, + 21888242871839275222246405745257275088548364400416034343698188044585848271699, + 21888242871839275222246405745257275088548364400416034343698098891027696224963, + 86942635486313883, + 21888242871839275222246405745257275088548364400416034343698060863650366086503, + 21888242871839275222246405745257275088548364400416034343698143216606960582511, + 114934019579855859, + 89764037043389075, + 5995561159226516, + 21888242871839275222246405745257275088548364400416034343698138934156298669918, + 21888242871839275222246405745257275088548364400416034343698153175494896463778, + 21888242871839275222246405745257275088548364400416034343698080891087997549215, + 101530588261278043, + 34537466030907153, + 21888242871839275222246405745257275088548364400416034343698170277485944828058, + 82798767528568702, + 107518002982875429, + 21888242871839275222246405745257275088548364400416034343698135207204044204049, + 21888242871839275222246405745257275088548364400416034343698070428361797070959, + 107784478689675113, + 17827004648403314, + 8365434576853032, + 38941379104114998, + 21888242871839275222246405745257275088548364400416034343698079825066309718853, + 79592142666883454, + 21888242871839275222246405745257275088548364400416034343698097656859597694837, + 109706392450411439, + 64143071026046638, + 21888242871839275222246405745257275088548364400416034343698133442321206211434, + 21888242871839275222246405745257275088548364400416034343698127969508270878183, + 21888242871839275222246405745257275088548364400416034343698107970287206891477, + 21888242871839275222246405745257275088548364400416034343698105215557602028516, + 21888242871839275222246405745257275088548364400416034343698082879954665736426, + 21888242871839275222246405745257275088548364400416034343698135999790614529009, + 7321000087997095, + 21888242871839275222246405745257275088548364400416034343698164382874519582493, + 112099609209240511, + 10283699297436242, + 21888242871839275222246405745257275088548364400416034343698198886816875609603, + 11518946187989187, + 92468868653132261, + 21888242871839275222246405745257275088548364400416034343698084972760069499750, + 21888242871839275222246405745257275088548364400416034343698143402006893808344, + 21888242871839275222246405745257275088548364400416034343698075945625842357686, + 21888242871839275222246405745257275088548364400416034343698110166096814745105, + 25293284002230997, + 15311623537385829, + 8266301393885591, + 45306349541027303, + 21888242871839275222246405745257275088548364400416034343698192302717883040548, + 21888242871839275222246405745257275088548364400416034343698078408398894523102, + 21888242871839275222246405745257275088548364400416034343698185280054295627332, + 21888242871839275222246405745257275088548364400416034343698103426030754493224, + 44149076145659185, + 21888242871839275222246405745257275088548364400416034343698188897697850571679, + 21888242871839275222246405745257275088548364400416034343698077297277237202152, + 21888242871839275222246405745257275088548364400416034343698183144464610432913, + 21888242871839275222246405745257275088548364400416034343698170703744500442127, + 21888242871839275222246405745257275088548364400416034343698140029996380519429, + 21888242871839275222246405745257275088548364400416034343698084515066208645712, + 21888242871839275222246405745257275088548364400416034343698179789870809846992, + 53418200312700872, + 123172803651814372, + 21888242871839275222246405745257275088548364400416034343698149779219803629433, + 92116986318855128, + 21888242871839275222246405745257275088548364400416034343698183204934379567100, + 135183361128796200, + 117347300873599214, + 21888242871839275222246405745257275088548364400416034343698077565251814217918, + 21888242871839275222246405745257275088548364400416034343698167605589120707554, + 115555687962842253, + 21888242871839275222246405745257275088548364400416034343698134575828509669975, + 21888242871839275222246405745257275088548364400416034343698075883648356088319, + 21888242871839275222246405745257275088548364400416034343698203317133353064335, + 21888242871839275222246405745257275088548364400416034343698080423933726131288, + 127314160728770504, + 87127050882713033, + 21888242871839275222246405745257275088548364400416034343698069011860158809905, + 21888242871839275222246405745257275088548364400416034343698125060051931533567, + 68345697853703418, + 21888242871839275222246405745257275088548364400416034343698176642369223164224, + 21888242871839275222246405745257275088548364400416034343698165567129893749480, + 107343434623499349, + 21888242871839275222246405745257275088548364400416034343698080637331646008705, + 116033194223565220, + 138294564537479020, + 76602568152993563, + 21888242871839275222246405745257275088548364400416034343698117506429157462420, + 21888242871839275222246405745257275088548364400416034343698122704325945209969, + 31715018798145509, + 21888242871839275222246405745257275088548364400416034343698143477503773707679, + 80208267593321113, + 21888242871839275222246405745257275088548364400416034343698064309828691527501, + 21888242871839275222246405745257275088548364400416034343698068192029572795129, + 21888242871839275222246405745257275088548364400416034343698178707735559650021, + 108484322905814143, + 21888242871839275222246405745257275088548364400416034343698079408476680568765, + 21888242871839275222246405745257275088548364400416034343698097756684598098854, + 117011782083885992, + 21888242871839275222246405745257275088548364400416034343698145036661074901285, + 26329314051910327, + 21888242871839275222246405745257275088548364400416034343698116035164342386433, + 106801717346366237, + 123245781790023371, + 62330444153227484, + 143923266807347420, + 13246051385550014, + 136339331211385439, + 21888242871839275222246405745257275088548364400416034343698143080228429760506, + 21888242871839275222246405745257275088548364400416034343698075693219502273988, + 21888242871839275222246405745257275088548364400416034343698110752147288416574, + 21888242871839275222246405745257275088548364400416034343698189546591094160704, + 44332072668639550, + 21888242871839275222246405745257275088548364400416034343698131674375721102364, + 28741472680271368, + 21888242871839275222246405745257275088548364400416034343698066523041462158620, + 21888242871839275222246405745257275088548364400416034343698155833590937121120, + 21888242871839275222246405745257275088548364400416034343698083855524287410789, + 36412806649897976, + 44893258229800895, + 21888242871839275222246405745257275088548364400416034343698160912700372131749, + 63090056112798740, + 53393948973015005, + 21888242871839275222246405745257275088548364400416034343698106402343015871342, + 139283250855415531, + 83072866394083169, + 21888242871839275222246405745257275088548364400416034343698067348741614231212, + 21888242871839275222246405745257275088548364400416034343698129458440869209440, + 21888242871839275222246405745257275088548364400416034343698146789994663522120, + 21888242871839275222246405745257275088548364400416034343698171843104264461840, + 21888242871839275222246405745257275088548364400416034343698068728387291877544, + 76540788361773059, + 14830983686351883, + 21888242871839275222246405745257275088548364400416034343698077997970868394484, + 21888242871839275222246405745257275088548364400416034343698173727560829521511, + 21888242871839275222246405745257275088548364400416034343698156156815895855345, + 21888242871839275222246405745257275088548364400416034343698201776083020605939, + 21888242871839275222246405745257275088548364400416034343698104261511856328407, + 70702281130913092, + 21888242871839275222246405745257275088548364400416034343698083803184785359850, + 21888242871839275222246405745257275088548364400416034343698135086593436897233, + 21888242871839275222246405745257275088548364400416034343698113892091252012061, + 91658021623293983, + 21888242871839275222246405745257275088548364400416034343698148716656130964447, + 129695772926597954, + 83652572182694634, + 21888242871839275222246405745257275088548364400416034343698079941273426968272, + 121820990544179043, + 115167503575379630, + 21888242871839275222246405745257275088548364400416034343698105404986211841811, + 102816602583385962, + 21888242871839275222246405745257275088548364400416034343698166737380940906788, + 51192661574188510, + 21888242871839275222246405745257275088548364400416034343698076003647111372581, + 21888242871839275222246405745257275088548364400416034343698133627106812703663, + 21888242871839275222246405745257275088548364400416034343698136905883394784507, + 115316527522442672, + 46896230732222581, + 104477878876451642, + 21888242871839275222246405745257275088548364400416034343698167899262334640612, + 72603922404354838, + 21888242871839275222246405745257275088548364400416034343698172555250688428812, + 84885745458022427, + 18338590266023759, + 21888242871839275222246405745257275088548364400416034343698161107720961632940, + 21888242871839275222246405745257275088548364400416034343698138217440951773076, + 21888242871839275222246405745257275088548364400416034343698128249605698029809, + 21888242871839275222246405745257275088548364400416034343698192197360719560010, + 21888242871839275222246405745257275088548364400416034343698187091183149863024, + 102275164539643157, + 21395345185596125, + 92918039118346121, + 21888242871839275222246405745257275088548364400416034343698083434848364740721, + 54059344173791360, + 21888242871839275222246405745257275088548364400416034343698089608101742166524, + 74004723041710554, + 110244680888595447, + 21888242871839275222246405745257275088548364400416034343698131929588202562444, + 66530546764930822, + 21888242871839275222246405745257275088548364400416034343698079378032759136249, + 21888242871839275222246405745257275088548364400416034343698061913769406342363, + 97609137058313682, + 130132507578482621, + 21888242871839275222246405745257275088548364400416034343698156164827288663187, + 73543387871265873, + 21888242871839275222246405745257275088548364400416034343698191527993037781395, + 21888242871839275222246405745257275088548364400416034343698072025860367390979, + 21888242871839275222246405745257275088548364400416034343698144702425189511781, + 40847708470776276, + 21888242871839275222246405745257275088548364400416034343698065461160222634772, + 94303505962299468, + 21888242871839275222246405745257275088548364400416034343698169765623417884336, + 21888242871839275222246405745257275088548364400416034343698128883612255590867, + 96735316883776753, + 21888242871839275222246405745257275088548364400416034343698203744341874071171, + 21888242871839275222246405745257275088548364400416034343698159681997618589654, + 21888242871839275222246405745257275088548364400416034343698145200476450438668, + 21888242871839275222246405745257275088548364400416034343698189868303464754521, + 21888242871839275222246405745257275088548364400416034343698193278275614939128, + 69095529795670449, + 39651984450671835, + 21888242871839275222246405745257275088548364400416034343698124416515353468722, + 128005583866628116, + 131643958554394230, + 21888242871839275222246405745257275088548364400416034343698159621350418514001, + 38541958623006428, + 21888242871839275222246405745257275088548364400416034343698169961096318151239, + 116745223552663314, + 107766091815081248, + 21888242871839275222246405745257275088548364400416034343698191023259710117565, + 138720763543893859, + 76883582190126782, + 115943751969179057, + 95444141334434278, + 52034820651230329, + 18039199854942723, + 21888242871839275222246405745257275088548364400416034343698065753226037975570, + 11374843722821885, + 62441952713315330, + 13067768520084889, + 21888242871839275222246405745257275088548364400416034343698102830290341720586, + 21888242871839275222246405745257275088548364400416034343698194660676133275458, + 11777122317313242, + 28847598725253457, + 15618472567184363, + 142636153340351877, + 9900656437579630, + 121795016105217870, + 21888242871839275222246405745257275088548364400416034343698198251074123061316, + 21888242871839275222246405745257275088548364400416034343698131442559711217608, + 1998249354208392, + 21888242871839275222246405745257275088548364400416034343698140659365425403784, + 21888242871839275222246405745257275088548364400416034343698116959875158587941, + 21888242871839275222246405745257275088548364400416034343698110768247678590944, + 21888242871839275222246405745257275088548364400416034343698061361343769733254, + 21888242871839275222246405745257275088548364400416034343698184503110453771197, + 21888242871839275222246405745257275088548364400416034343698157341365127224490, + 119877992533051076, + 14015534410512363, + 21888242871839275222246405745257275088548364400416034343698099230232237137423, + 31071488926019334, + 21888242871839275222246405745257275088548364400416034343698075386977950802512, + 21888242871839275222246405745257275088548364400416034343698102323931366463494, + 21888242871839275222246405745257275088548364400416034343698189252433988977804, + 21888242871839275222246405745257275088548364400416034343698085378565613848660, + 21888242871839275222246405745257275088548364400416034343698190804139325783319, + 130830836438421322, + 119856243941603574, + 21888242871839275222246405745257275088548364400416034343698094967856013714503, + 133736243064626705, + 21888242871839275222246405745257275088548364400416034343698080105421938455194, + 21888242871839275222246405745257275088548364400416034343698117921569593868073, + 21888242871839275222246405745257275088548364400416034343698108532832824331379, + 21888242871839275222246405745257275088548364400416034343698165453212144493290, + 85309270357996522, + 93796727425119158, + 39971905818419837, + 23227983209785828, + 21888242871839275222246405745257275088548364400416034343698083962998064009337, + 70683016921101051, + 21888242871839275222246405745257275088548364400416034343698124559811758446943, + 21888242871839275222246405745257275088548364400416034343698178962619977254418, + 21888242871839275222246405745257275088548364400416034343698125866036709632255, + 73276651109761908, + 31926172134660483, + 21888242871839275222246405745257275088548364400416034343698068065976316108652, + 21888242871839275222246405745257275088548364400416034343698191166600860947828, + 126149956106107716, + 120069141775969779, + 21888242871839275222246405745257275088548364400416034343698080761757968939627, + 52537020572363430, + 1705336609660150, + 21888242871839275222246405745257275088548364400416034343698086913648063682912, + 81278734129133635, + 21888242871839275222246405745257275088548364400416034343698061165516673831402, + 21888242871839275222246405745257275088548364400416034343698110125230730821274, + 74237293932333213, + 21888242871839275222246405745257275088548364400416034343698197913423286935372, + 74449920605347996, + 56515913305053509, + 1790985497937182, + 21888242871839275222246405745257275088548364400416034343698190157795183137140, + 141243749247972571, + 54840193402171104, + 21888242871839275222246405745257275088548364400416034343698198244044616770381, + 21888242871839275222246405745257275088548364400416034343698150772476945616965, + 21888242871839275222246405745257275088548364400416034343698064974715551423716, + 21888242871839275222246405745257275088548364400416034343698070624692667867014, + 21888242871839275222246405745257275088548364400416034343698199519806414497476, + 21888242871839275222246405745257275088548364400416034343698147935871585353115, + 97266865953890290, + 143077330094599718, + 125724222894725882, + 91470361178055788, + 25397985155762321, + 21888242871839275222246405745257275088548364400416034343698181809621405125224, + 21888242871839275222246405745257275088548364400416034343698131205372954922664, + 21888242871839275222246405745257275088548364400416034343698079332293216551727, + 40915991612092785, + 21888242871839275222246405745257275088548364400416034343698084801067515829059, + 21888242871839275222246405745257275088548364400416034343698198823726861106455, + 21888242871839275222246405745257275088548364400416034343698087157677411137421, + 89731629510777796, + 119363998708665473, + 125772602957856247, + 98399588458120202, + 21888242871839275222246405745257275088548364400416034343698123120143284848232, + 29561283986583789, + 32023719233273950, + 24494271166269177, + 131413337574319875, + 55712619077134829, + 21888242871839275222246405745257275088548364400416034343698066617110468381992, + 21888242871839275222246405745257275088548364400416034343698107700162582318630, + 21888242871839275222246405745257275088548364400416034343698127606114293927750, + 142305700227261799, + 21888242871839275222246405745257275088548364400416034343698144339361093705168, + 21888242871839275222246405745257275088548364400416034343698115315861601910634, + 21888242871839275222246405745257275088548364400416034343698087802895524933253, + 138136627382202322, + 22980896006313197, + 21888242871839275222246405745257275088548364400416034343698089461361326118192, + 23467928124781790, + 125210574019918583, + 21888242871839275222246405745257275088548364400416034343698172176378479912438, + 21888242871839275222246405745257275088548364400416034343698113048123066580182, + 92305590696386046, + 39308604615671986, + 16147727886051267, + 137295961607434280, + 21888242871839275222246405745257275088548364400416034343698111003236889589209, + 58469794835490460, + 42019647808931644, + 96378068536790532, + 104106128474448111, + 21888242871839275222246405745257275088548364400416034343698105521683721521767, + 15345184845017069, + 13710366717917090, + 21888242871839275222246405745257275088548364400416034343698081286818304625197, + 75702025007820854, + 21888242871839275222246405745257275088548364400416034343698101844090310885126, + 21888242871839275222246405745257275088548364400416034343698142402165125851380, + 21888242871839275222246405745257275088548364400416034343698069372041389302902, + 21888242871839275222246405745257275088548364400416034343698142013314985291631, + 18674644981731938, + 87373268966735718, + 21888242871839275222246405745257275088548364400416034343698084804096898531862, + 126570594514432217, + 28880135877709606, + 21888242871839275222246405745257275088548364400416034343698080573481063509422, + 15150222892629933, + 29027458990184337, + 2263384423088994, + 68455539917081077, + 45732622108346681, + 21888242871839275222246405745257275088548364400416034343698169651422187864666, + 65462992558015266, + 31209301463871799, + 79472553175893150, + 21888242871839275222246405745257275088548364400416034343698161133647614886766, + 44481473923321791, + 21888242871839275222246405745257275088548364400416034343698081721879670742040, + 21888242871839275222246405745257275088548364400416034343698167179888878067909, + 21888242871839275222246405745257275088548364400416034343698185798430805569052, + 2497310540996767, + 21888242871839275222246405745257275088548364400416034343698144295820330635113, + 139589075156478719, + 21888242871839275222246405745257275088548364400416034343698124121019743667013, + 21888242871839275222246405745257275088548364400416034343698163554357565423912, + 24400045331706295, + 21888242871839275222246405745257275088548364400416034343698146870897020703670, + 21888242871839275222246405745257275088548364400416034343698108848075207539394, + 63812004067046864, + 120229158435704310, + 21888242871839275222246405745257275088548364400416034343698186663935563749784, + 21888242871839275222246405745257275088548364400416034343698121084042414094999, + 21888242871839275222246405745257275088548364400416034343698120457771963136052, + 24215420880790248, + 15526134723796425, + 98036803153866749, + 91109150312866455, + 21888242871839275222246405745257275088548364400416034343698196563819839005909, + 83323819342340229, + 125953804155275727, + 21888242871839275222246405745257275088548364400416034343698060648983370386154, + 133774658885455397, + 21888242871839275222246405745257275088548364400416034343698174993897411084087, + 21888242871839275222246405745257275088548364400416034343698074554124623443912, + 53540708454776298, + 142055095405359434, + 77193269506202033, + 64321370357225739, + 21888242871839275222246405745257275088548364400416034343698097804069111536017, + 78265856104161757, + 12850834902531330, + 21888242871839275222246405745257275088548364400416034343698125430011662850127, + 80958812820890371, + 21888242871839275222246405745257275088548364400416034343698156350566728195530, + 21888242871839275222246405745257275088548364400416034343698099581967929249178, + 21888242871839275222246405745257275088548364400416034343698147974554539021050, + 21888242871839275222246405745257275088548364400416034343698141138144420157585, + 44913657624119992, + 81638172635479175, + 21888242871839275222246405745257275088548364400416034343698181174919493369498, + 136075496923914095, + 3881886270901247, + 112130730700969606, + 140127426203965742, + 21888242871839275222246405745257275088548364400416034343698072323802799860031, + 67915161704216308, + 8250026891795418, + 99523575532078013, + 21888242871839275222246405745257275088548364400416034343698133097863606366140, + 21888242871839275222246405745257275088548364400416034343698199731500654178503, + 21888242871839275222246405745257275088548364400416034343698154852081061669642, + 21888242871839275222246405745257275088548364400416034343698080124835139292847, + 21372060638046753, + 21888242871839275222246405745257275088548364400416034343698111752251859011386, + 21888242871839275222246405745257275088548364400416034343698178227345940169876, + 21888242871839275222246405745257275088548364400416034343698180498780726758588, + 21888242871839275222246405745257275088548364400416034343698093636091863876667, + 21888242871839275222246405745257275088548364400416034343698125253929921459267, + 21888242871839275222246405745257275088548364400416034343698163380512347177882, + 21888242871839275222246405745257275088548364400416034343698151690284820222938, + 60915489009649652, + 36538109511397217, + 21888242871839275222246405745257275088548364400416034343698172932580000465909, + 1856646879989395, + 21888242871839275222246405745257275088548364400416034343698124783628731825763, + 21888242871839275222246405745257275088548364400416034343698101728995936147955, + 21888242871839275222246405745257275088548364400416034343698186739847510770094, + 21888242871839275222246405745257275088548364400416034343698150632580893880594, + 21888242871839275222246405745257275088548364400416034343698187630837867749121, + 23553153892596481, + 29066372672461262, + 109196837157799125, + 119735140356706534, + 127462467591281607, + 21888242871839275222246405745257275088548364400416034343698095675341420315674, + 62710317238671992, + 21888242871839275222246405745257275088548364400416034343698159862332830624972, + 21888242871839275222246405745257275088548364400416034343698186067264801705228, + 21888242871839275222246405745257275088548364400416034343698124277310131807121, + 78514952585278112, + 127629346523149282, + 21888242871839275222246405745257275088548364400416034343698071605020163881994, + 77712803884357424, + 21888242871839275222246405745257275088548364400416034343698162905130629025038, + 21888242871839275222246405745257275088548364400416034343698088461105887264740, + 89858027979158783, + 21888242871839275222246405745257275088548364400416034343698153674722858137433, + 21888242871839275222246405745257275088548364400416034343698191461984860315490, + 55152837484829828, + 17754390445249916, + 21888242871839275222246405745257275088548364400416034343698084183882515112222, + 21888242871839275222246405745257275088548364400416034343698178928035662456023, + 21888242871839275222246405745257275088548364400416034343698072142302411807837, + 21888242871839275222246405745257275088548364400416034343698084598118764930445, + 54870285624930282, + 21888242871839275222246405745257275088548364400416034343698091871076564490724, + 21888242871839275222246405745257275088548364400416034343698089783763742283224, + 6619627576990496, + 21888242871839275222246405745257275088548364400416034343698080144690935146359, + 128506601578206583, + 21888242871839275222246405745257275088548364400416034343698188579446041249287, + 2910145434641689, + 112812533876448650, + 21888242871839275222246405745257275088548364400416034343698062536960325202702, + 67969214252258623, + 74961487129840334, + 97122285885383403, + 31681555281786097, + 20292241250486946, + 53377800014804110, + 21888242871839275222246405745257275088548364400416034343698123604622427043472, + 57132581604445820, + 21888242871839275222246405745257275088548364400416034343698150568792810489814, + 21888242871839275222246405745257275088548364400416034343698146720590953316499, + 21888242871839275222246405745257275088548364400416034343698094058077509778165, + 78054617987833773, + 21888242871839275222246405745257275088548364400416034343698131562080726217673, + 21888242871839275222246405745257275088548364400416034343698181627360971888966, + 21888242871839275222246405745257275088548364400416034343698175939220310230179, + 21888242871839275222246405745257275088548364400416034343698159609708299505642, + 107577789712750799, + 21888242871839275222246405745257275088548364400416034343698188136997403196515, + 21888242871839275222246405745257275088548364400416034343698181787491532710623, + 21888242871839275222246405745257275088548364400416034343698092294943491876005, + 46228721430590126, + 31939493828893334, + 107007400041748600, + 21888242871839275222246405745257275088548364400416034343698184019761906652526, + 133225358432157026, + 21888242871839275222246405745257275088548364400416034343698146507002608515639, + 142680029108184704, + 8523548225576536, + 21888242871839275222246405745257275088548364400416034343698128219788428090395, + 137997378288823778, + 129489255694384048, + 21888242871839275222246405745257275088548364400416034343698202567067209896507, + 65119586727861647, + 74169428379382907, + 21888242871839275222246405745257275088548364400416034343698137556569008216409, + 99198272921046754, + 102399348638160961, + 105852616989233335, + 86852961187863204, + 21888242871839275222246405745257275088548364400416034343698138513164680194558, + 21888242871839275222246405745257275088548364400416034343698194592331544224413, + 134304548598977930, + 12511079727483822, + 21888242871839275222246405745257275088548364400416034343698189088886756003988, + 21888242871839275222246405745257275088548364400416034343698120329170285096451, + 82572601069151565, + 31154749135014132, + 42626895873815465, + 21888242871839275222246405745257275088548364400416034343698097496475407262964, + 21888242871839275222246405745257275088548364400416034343698152149105822302162, + 21888242871839275222246405745257275088548364400416034343698121024363107447914, + 90190815234278420, + 21888242871839275222246405745257275088548364400416034343698129047632453524976, + 21888242871839275222246405745257275088548364400416034343698184132581830914709, + 90599006687813328, + 31833659233211757, + 100870532885566818, + 21888242871839275222246405745257275088548364400416034343698063202643276406080, + 21888242871839275222246405745257275088548364400416034343698200842484917162098, + 54574185435602933, + 21888242871839275222246405745257275088548364400416034343698109288770482006381, + 135628279013875144, + 21888242871839275222246405745257275088548364400416034343698191192091979852635, + 77290359398446053, + 11870335763568336, + 117661205276317484, + 21888242871839275222246405745257275088548364400416034343698155278179164944297, + 4125380403345894, + 277212412396775, + 21888242871839275222246405745257275088548364400416034343698184299872311078272, + 47327661759024810, + 139398732626580500, + 21888242871839275222246405745257275088548364400416034343698089376249924907029, + 21888242871839275222246405745257275088548364400416034343698174539278766173761, + 53530493994679127, + 132317385434912489, + 21888242871839275222246405745257275088548364400416034343698065674942573061437, + 21888242871839275222246405745257275088548364400416034343698077963210538093701, + 21888242871839275222246405745257275088548364400416034343698154716725489911881, + 110923219792804919, + 23537710779166318, + 38004506731638285, + 18497126010618963, + 21888242871839275222246405745257275088548364400416034343698156507855530538365, + 21888242871839275222246405745257275088548364400416034343698122849211056044655, + 21888242871839275222246405745257275088548364400416034343698147413818270564654, + 21888242871839275222246405745257275088548364400416034343698077988126286820879, + 21888242871839275222246405745257275088548364400416034343698162390553999209031, + 21888242871839275222246405745257275088548364400416034343698126010209077144110, + 63881576678100885, + 21888242871839275222246405745257275088548364400416034343698106718023810436023, + 21888242871839275222246405745257275088548364400416034343698114511934754192473, + 21888242871839275222246405745257275088548364400416034343698167865047217541738, + 21888242871839275222246405745257275088548364400416034343698170194256761405433, + 21888242871839275222246405745257275088548364400416034343698159770283702254930, + 123769616454914483, + 21888242871839275222246405745257275088548364400416034343698102313438062712546, + 101206425582269060, + 21888242871839275222246405745257275088548364400416034343698159933964570630312, + 104033772060670518, + 21888242871839275222246405745257275088548364400416034343698150888690535795028, + 21888242871839275222246405745257275088548364400416034343698133987581241944065, + 53363931889260849, + 99850932196700346, + 8163369915791326, + 21888242871839275222246405745257275088548364400416034343698088633377043015861, + 21888242871839275222246405745257275088548364400416034343698106054131647363070, + 21888242871839275222246405745257275088548364400416034343698176254145465903674, + 21888242871839275222246405745257275088548364400416034343698154205419044305208, + 21888242871839275222246405745257275088548364400416034343698144904621983335167, + 21888242871839275222246405745257275088548364400416034343698125185937653952399, + 92866781074819861, + 134911002871738760, + 18443907345343603, + 21888242871839275222246405745257275088548364400416034343698178446835347122029, + 21888242871839275222246405745257275088548364400416034343698152405726488803405, + 102179149432589043, + 39015834232200171, + 21888242871839275222246405745257275088548364400416034343698186557549400658659, + 21888242871839275222246405745257275088548364400416034343698114046511348684481, + 136196394894035148, + 21888242871839275222246405745257275088548364400416034343698066064956716096207, + 67071087023307433, + 21888242871839275222246405745257275088548364400416034343698170619034597629856, + 21888242871839275222246405745257275088548364400416034343698147779782030107343, + 21888242871839275222246405745257275088548364400416034343698203809962436383145, + 21888242871839275222246405745257275088548364400416034343698091659985463523905, + 28433389825140103, + 21888242871839275222246405745257275088548364400416034343698200596917057816511, + 21888242871839275222246405745257275088548364400416034343698170538607086838432, + 21888242871839275222246405745257275088548364400416034343698086365553911758942, + 21888242871839275222246405745257275088548364400416034343698074830219186961466, + 122118748107510849, + 124728106533265239, + 17791039653134870, + 43056709662391125, + 135804021985538290, + 67003736898954315, + 21888242871839275222246405745257275088548364400416034343698101785501520308735, + 122317256139813879, + 53311874138717335, + 21888242871839275222246405745257275088548364400416034343698114632794008912294, + 19441687412234899, + 92616120891430856, + 21888242871839275222246405745257275088548364400416034343698198769979619936470, + 21888242871839275222246405745257275088548364400416034343698146336242399669989, + 21888242871839275222246405745257275088548364400416034343698150755852866016323, + 18109873782356242, + 21888242871839275222246405745257275088548364400416034343698183365612726945913, + 21888242871839275222246405745257275088548364400416034343698078434606310748543, + 6286147212640574, + 19290012620990284, + 21888242871839275222246405745257275088548364400416034343698150893361158252506, + 68768978015267734, + 21888242871839275222246405745257275088548364400416034343698090215667144798065, + 63303951498535796, + 99520972868366078, + 21888242871839275222246405745257275088548364400416034343698097619643671393742, + 28656000653859973, + 21888242871839275222246405745257275088548364400416034343698146865823950590305, + 21888242871839275222246405745257275088548364400416034343698067452311721730726, + 21888242871839275222246405745257275088548364400416034343698073069700437969914, + 21888242871839275222246405745257275088548364400416034343698153845662540048039, + 33791015808244986, + 126606185553790909, + 36761739607995334, + 21888242871839275222246405745257275088548364400416034343698089832949059621661, + 21888242871839275222246405745257275088548364400416034343698100011321268807698, + 21888242871839275222246405745257275088548364400416034343698148523178420883037, + 74054998053814706, + 21888242871839275222246405745257275088548364400416034343698143367067048465679, + 115473914939022141, + 21888242871839275222246405745257275088548364400416034343698108827224523084781, + 64014623858926160, + 21888242871839275222246405745257275088548364400416034343698078690863173722044, + 21888242871839275222246405745257275088548364400416034343698196896472454308679, + 83779282557332207, + 82960251440480059, + 18732037471325874, + 21888242871839275222246405745257275088548364400416034343698171369984263648691, + 21888242871839275222246405745257275088548364400416034343698157074370262264716, + 77949251216450169, + 21888242871839275222246405745257275088548364400416034343698131415818776607351, + 125858866483673504, + 21888242871839275222246405745257275088548364400416034343698190175344041794728, + 30986309239391235, + 21888242871839275222246405745257275088548364400416034343698114318447030380668, + 21888242871839275222246405745257275088548364400416034343698131365388428480476, + 16538012196933366, + 13376447106038809, + 130343721215046772, + 69013314122446627, + 32637686447161367, + 21888242871839275222246405745257275088548364400416034343698127174642010226798, + 21888242871839275222246405745257275088548364400416034343698190782553157687666, + 21888242871839275222246405745257275088548364400416034343698141813283480499608, + 36654342827184544, + 29452366975074358, + 119108597468112139, + 21888242871839275222246405745257275088548364400416034343698134221106880783089, + 99464846025708662, + 21888242871839275222246405745257275088548364400416034343698123467127947398099, + 33854117531646926, + 21602635026384856, + 65111838998769115, + 21888242871839275222246405745257275088548364400416034343698079496663019404574, + 101073075673114922, + 97472449726283300, + 21888242871839275222246405745257275088548364400416034343698106955924716421700, + 21888242871839275222246405745257275088548364400416034343698113189582784959843, + 68045997347382998, + 55467807223810041, + 21888242871839275222246405745257275088548364400416034343698186710160200222401, + 58859781444577693, + 94585190211659461, + 58369507402243459, + 21888242871839275222246405745257275088548364400416034343698064105570862506889, + 98247079758829324, + 59292497383495812, + 122367588232809254, + 21888242871839275222246405745257275088548364400416034343698156019789615426660, + 124448009607870636, + 21888242871839275222246405745257275088548364400416034343698162202295829368112, + 21888242871839275222246405745257275088548364400416034343698183561710333825684, + 21888242871839275222246405745257275088548364400416034343698075240673434712465, + 68404299736822728, + 30435720510445106, + 29028110788049201, + 9587544905371883, + 104852943671971008, + 21888242871839275222246405745257275088548364400416034343698189835324132365624, + 21888242871839275222246405745257275088548364400416034343698166350574725374067, + 21888242871839275222246405745257275088548364400416034343698105691539311647249, + 52875089246895221, + 20986888610171795, + 21888242871839275222246405745257275088548364400416034343698080598250398016893, + 104988583716870535, + 61412849171189016, + 79366966619234414, + 21888242871839275222246405745257275088548364400416034343698183506666594703251, + 13161369581571662, + 21888242871839275222246405745257275088548364400416034343698162516559904790258, + 64055584469277844, + 21888242871839275222246405745257275088548364400416034343698186768199228833471, + 34513752278839679, + 102672192428718071, + 30642432751216448, + 21888242871839275222246405745257275088548364400416034343698129585984215997041, + 98236115558025655, + 86962861710665672, + 21888242871839275222246405745257275088548364400416034343698119112847836514493, + 21888242871839275222246405745257275088548364400416034343698153336235737131852, + 65687207819722194, + 74892044218717187, + 21888242871839275222246405745257275088548364400416034343698156267477300279603, + 21888242871839275222246405745257275088548364400416034343698103861306223727372, + 21888242871839275222246405745257275088548364400416034343698158358938769501301, + 4911674728099746, + 21888242871839275222246405745257275088548364400416034343698107290326660081590, + 21888242871839275222246405745257275088548364400416034343698129662872315610806, + 21888242871839275222246405745257275088548364400416034343698116778540631096479, + 21888242871839275222246405745257275088548364400416034343698187682314600751934, + 21888242871839275222246405745257275088548364400416034343698144769566933794442, + 96287981243720839, + 21888242871839275222246405745257275088548364400416034343698166943054702807895, + 21888242871839275222246405745257275088548364400416034343698090204255562653831, + 30955036820466029, + 21888242871839275222246405745257275088548364400416034343698113324370865610109, + 21888242871839275222246405745257275088548364400416034343698068691604225027686, + 21888242871839275222246405745257275088548364400416034343698201303957774401531, + 39266807224414333, + 21888242871839275222246405745257275088548364400416034343698171054693509385509, + 21888242871839275222246405745257275088548364400416034343698153427088804494243, + 21888242871839275222246405745257275088548364400416034343698071853065349100698, + 21888242871839275222246405745257275088548364400416034343698130492595679458816, + 21888242871839275222246405745257275088548364400416034343698092960444510924577, + 21888242871839275222246405745257275088548364400416034343698149241193361035532, + 116355369891414809, + 120139494424542243, + 96563351024513500, + 29182896289504684, + 21888242871839275222246405745257275088548364400416034343698177270317561437201, + 116608667799174873, + 21888242871839275222246405745257275088548364400416034343698184400250608936723, + 61751713443622417, + 103033479865412010, + 21888242871839275222246405745257275088548364400416034343698188898342707361717, + 21888242871839275222246405745257275088548364400416034343698062854726234032496, + 21888242871839275222246405745257275088548364400416034343698189877528599737852, + 19828160783260467, + 21888242871839275222246405745257275088548364400416034343698134286121382528455, + 138049383729005124, + 45038906008898887, + 23884018913847535, + 21888242871839275222246405745257275088548364400416034343698176143597249155891, + 21888242871839275222246405745257275088548364400416034343698123021646712821880, + 21888242871839275222246405745257275088548364400416034343698100126764865465267, + 129707850305223228, + 21888242871839275222246405745257275088548364400416034343698075143692554161533, + 21888242871839275222246405745257275088548364400416034343698102080170008995868, + 143084780465356666, + 122505620031424731, + 119288006731814916, + 98612551900335387, + 129771391327184231, + 21888242871839275222246405745257275088548364400416034343698086002215789315694, + 110600965548148677, + 21888242871839275222246405745257275088548364400416034343698108945036940526809, + 129351401732811353, + 21888242871839275222246405745257275088548364400416034343698194284099305712840, + 21888242871839275222246405745257275088548364400416034343698173874827638946281, + 21888242871839275222246405745257275088548364400416034343698131722073753835257, + 5660390826083124, + 28872888285633966, + 59631975583347178, + 21888242871839275222246405745257275088548364400416034343698170791460616191309, + 91701590013674217, + 43859059509768458, + 43106584683193687, + 21888242871839275222246405745257275088548364400416034343698199681337141239371, + 21888242871839275222246405745257275088548364400416034343698099285938910294316, + 54882480369854612, + 116352274219909697, + 21888242871839275222246405745257275088548364400416034343698132757982148423716, + 116365143150337119, + 97064400741128364, + 135858270297716147, + 125751688495240325, + 21888242871839275222246405745257275088548364400416034343698155111179203267278, + 15517616963341027, + 74149993694123599, + 136362943998997747, + 21888242871839275222246405745257275088548364400416034343698091570318560376926, + 21888242871839275222246405745257275088548364400416034343698105534955920750608, + 21888242871839275222246405745257275088548364400416034343698123632387096418854, + 21888242871839275222246405745257275088548364400416034343698108436821122023433, + 21888242871839275222246405745257275088548364400416034343698147730747005803167, + 21888242871839275222246405745257275088548364400416034343698095669032225368518, + 132416950317158249, + 37161855061894469, + 21888242871839275222246405745257275088548364400416034343698183353406198426756, + 21888242871839275222246405745257275088548364400416034343698179612785417703988, + 21888242871839275222246405745257275088548364400416034343698140746436398443749, + 25309291701977563, + 21888242871839275222246405745257275088548364400416034343698160694377760671697, + 64268178843605370, + 21888242871839275222246405745257275088548364400416034343698085577549064148976, + 21888242871839275222246405745257275088548364400416034343698101676411077271909, + 101744743531780899, + 21888242871839275222246405745257275088548364400416034343698113127927985337095, + 21888242871839275222246405745257275088548364400416034343698150914056835561258, + 21888242871839275222246405745257275088548364400416034343698067632766456615364, + 62504211803242586, + 23147365224694227, + 130842108669125461, + 21888242871839275222246405745257275088548364400416034343698078845537159690169, + 62929459899624836, + 21888242871839275222246405745257275088548364400416034343698160796431640882866, + 64225721555403898, + 85949652999469369, + 50168145850986822, + 21888242871839275222246405745257275088548364400416034343698139167867866923293, + 80596426348342646, + 23811139296640829, + 64977694242469028, + 21888242871839275222246405745257275088548364400416034343698137276849131331724, + 21888242871839275222246405745257275088548364400416034343698177370055742778932, + 21888242871839275222246405745257275088548364400416034343698181430733880673900, + 21888242871839275222246405745257275088548364400416034343698140382455113092124, + 21888242871839275222246405745257275088548364400416034343698124776571891296238, + 21888242871839275222246405745257275088548364400416034343698137748355041870280, + 39680559235208302, + 46133590957008450, + 21888242871839275222246405745257275088548364400416034343698092289042516285371, + 40561569490520396, + 21888242871839275222246405745257275088548364400416034343698182613198694260560, + 9485160622858769, + 19296811101158144, + 21888242871839275222246405745257275088548364400416034343698142072748209715206, + 21888242871839275222246405745257275088548364400416034343698174156576150487967, + 60723779203770180, + 132762757812112587, + 27766895683912575, + 56265256206962194, + 21888242871839275222246405745257275088548364400416034343698190267472765068678, + 104592729009375488, + 21888242871839275222246405745257275088548364400416034343698200928551247230273, + 96535487312541429, + 89600488038543896, + 21888242871839275222246405745257275088548364400416034343698144711933354606344, + 21888242871839275222246405745257275088548364400416034343698199642518838732055, + 21888242871839275222246405745257275088548364400416034343698122274348034813373, + 21888242871839275222246405745257275088548364400416034343698121443310014109848, + 21888242871839275222246405745257275088548364400416034343698088573642407365244, + 29567070897417979, + 21888242871839275222246405745257275088548364400416034343698089899581626077271, + 21888242871839275222246405745257275088548364400416034343698176099036796894776, + 21888242871839275222246405745257275088548364400416034343698134600566116604473, + 72472099897438699, + 37179504157564549, + 21888242871839275222246405745257275088548364400416034343698106316874569226929, + 21888242871839275222246405745257275088548364400416034343698203881255603207976, + 21888242871839275222246405745257275088548364400416034343698154373830859383147, + 120944609471006796, + 21888242871839275222246405745257275088548364400416034343698117292266487021848, + 21888242871839275222246405745257275088548364400416034343698099295597055247758, + 16798362580185516, + 21888242871839275222246405745257275088548364400416034343698178591419491625746, + 21888242871839275222246405745257275088548364400416034343698203166359842834759, + 21888242871839275222246405745257275088548364400416034343698179366887222959723, + 21888242871839275222246405745257275088548364400416034343698146299821375652174, + 107874797219774602, + 21888242871839275222246405745257275088548364400416034343698189236207496829487, + 21888242871839275222246405745257275088548364400416034343698153376285629113134, + 66113669818049408, + 21888242871839275222246405745257275088548364400416034343698195583429779610885, + 21888242871839275222246405745257275088548364400416034343698154239602154636969, + 127861929016421511, + 21888242871839275222246405745257275088548364400416034343698099723573111582437, + 21888242871839275222246405745257275088548364400416034343698154281640060152893, + 21888242871839275222246405745257275088548364400416034343698180053870052068735, + 21888242871839275222246405745257275088548364400416034343698141505915022207193, + 21888242871839275222246405745257275088548364400416034343698183716871566018425, + 59817295484263057, + 62802221671069085, + 19007685218765164, + 21888242871839275222246405745257275088548364400416034343698063931612904551016, + 21888242871839275222246405745257275088548364400416034343698156686075420370550, + 21888242871839275222246405745257275088548364400416034343698156153074899252428, + 21888242871839275222246405745257275088548364400416034343698162182952583145763, + 21888242871839275222246405745257275088548364400416034343698203097732913897724, + 21888242871839275222246405745257275088548364400416034343698198391377780618194, + 21888242871839275222246405745257275088548364400416034343698060511186351735991, + 51258728505553324, + 74703636223643847, + 99082270294919874, + 21888242871839275222246405745257275088548364400416034343698101167292683386635, + 39972360217336209, + 103504016206064570, + 56025150454014775, + 21888242871839275222246405745257275088548364400416034343698177940222826758106, + 21888242871839275222246405745257275088548364400416034343698138105594319902241, + 90347748182347940, + 21888242871839275222246405745257275088548364400416034343698107642787697607711, + 21888242871839275222246405745257275088548364400416034343698118058529902340858, + 21888242871839275222246405745257275088548364400416034343698202773096135950333, + 15429168473865790, + 1855543891583251, + 21888242871839275222246405745257275088548364400416034343698202839640088260915, + 77814042137007846, + 21888242871839275222246405745257275088548364400416034343698140152295107695937, + 1742943172211847, + 21888242871839275222246405745257275088548364400416034343698104412847774675916, + 52458290402115306, + 142424346627898273, + 139277043952198205, + 18287308992074439, + 21888242871839275222246405745257275088548364400416034343698188001955617312014, + 92378514285303099, + 74103049456487795, + 21888242871839275222246405745257275088548364400416034343698152517413989006517, + 21888242871839275222246405745257275088548364400416034343698114430927490000916, + 54102724869769017, + 21888242871839275222246405745257275088548364400416034343698169424045069879225, + 21888242871839275222246405745257275088548364400416034343698103773852717402307, + 21888242871839275222246405745257275088548364400416034343698106304275669858311, + 21888242871839275222246405745257275088548364400416034343698100315088179042145, + 62655538117335942, + 21888242871839275222246405745257275088548364400416034343698075921522680336849, + 21888242871839275222246405745257275088548364400416034343698115459518832503986, + 108527336206476047, + 21888242871839275222246405745257275088548364400416034343698082931249999613999, + 21888242871839275222246405745257275088548364400416034343698139002737621568689, + 21888242871839275222246405745257275088548364400416034343698190648183225608007, + 78756299708489743, + 21888242871839275222246405745257275088548364400416034343698086964996360069526, + 95479947589661762, + 105152852381956923, + 21888242871839275222246405745257275088548364400416034343698170775820893381287, + 72575003977014873, + 21888242871839275222246405745257275088548364400416034343698172976294865467232, + 21888242871839275222246405745257275088548364400416034343698080495560852605621, + 52716223638887619, + 21888242871839275222246405745257275088548364400416034343698061530633668855876, + 21888242871839275222246405745257275088548364400416034343698073662805718513428, + 21888242871839275222246405745257275088548364400416034343698113453736726984942, + 107565186285047724, + 21902485650587195, + 17202461253063185, + 135035599182976559, + 14164169678290716, + 139741975314283084, + 21888242871839275222246405745257275088548364400416034343698163532704581743173, + 110118074151861970, + 75710255763476610, + 40058153908903345, + 21888242871839275222246405745257275088548364400416034343698062108880095175329, + 105646734555847059, + 44994284063285415, + 109865962976474070, + 21888242871839275222246405745257275088548364400416034343698069119947954634317, + 21888242871839275222246405745257275088548364400416034343698079368564711947487, + 21888242871839275222246405745257275088548364400416034343698156083561158702196, + 21888242871839275222246405745257275088548364400416034343698200321982710001425, + 21888242871839275222246405745257275088548364400416034343698185765182886587793, + 21888242871839275222246405745257275088548364400416034343698138495497437286444, + 50752556961350482, + 21888242871839275222246405745257275088548364400416034343698199526216471043787, + 21888242871839275222246405745257275088548364400416034343698147497426548186806, + 102996283117382068, + 21888242871839275222246405745257275088548364400416034343698120441054390819326, + 21888242871839275222246405745257275088548364400416034343698124754969085994264, + 44482017182606047, + 139931571136480531, + 83879033627824717, + 21888242871839275222246405745257275088548364400416034343698172737238635278535, + 49499681708576711, + 21888242871839275222246405745257275088548364400416034343698065763710463978638, + 21888242871839275222246405745257275088548364400416034343698149619121748295105, + 53965790285047497, + 82540350251252733, + 31076569633619903, + 21888242871839275222246405745257275088548364400416034343698096819178279435022, + 87201839513796899, + 69112101011778052, + 21888242871839275222246405745257275088548364400416034343698142900288017601821, + 89342870880065913, + 15274902037581185, + 21888242871839275222246405745257275088548364400416034343698064889690723534761, + 21888242871839275222246405745257275088548364400416034343698200744582184236991, + 21888242871839275222246405745257275088548364400416034343698143899033800991090, + 21888242871839275222246405745257275088548364400416034343698090567086364975256, + 21888242871839275222246405745257275088548364400416034343698178937185175552024, + 21888242871839275222246405745257275088548364400416034343698082367228659498435, + 21888242871839275222246405745257275088548364400416034343698097261144719990175, + 115908466294224920, + 21888242871839275222246405745257275088548364400416034343698185338522342338648, + 115477552404513185, + 21888242871839275222246405745257275088548364400416034343698201201735465538232, + 21888242871839275222246405745257275088548364400416034343698183430528101918110, + 21888242871839275222246405745257275088548364400416034343698182304477169364998, + 113639160294371439, + 21888242871839275222246405745257275088548364400416034343698195072592107120378, + 53419900078502941, + 59341618730959165, + 126247587498033175, + 87804082339004973, + 67581358638239338, + 21888242871839275222246405745257275088548364400416034343698090325137887325129, + 71610984046201149, + 5673310388945696, + 21888242871839275222246405745257275088548364400416034343698169336640815535798, + 67360090999512620, + 40448862895755697, + 21888242871839275222246405745257275088548364400416034343698154639017968232198, + 21888242871839275222246405745257275088548364400416034343698195881771495476906, + 21888242871839275222246405745257275088548364400416034343698134028221095587746, + 21888242871839275222246405745257275088548364400416034343698102037047618215445, + 21888242871839275222246405745257275088548364400416034343698094140572494548194, + 22990612561208251, + 21888242871839275222246405745257275088548364400416034343698139387310123306851, + 21888242871839275222246405745257275088548364400416034343698140033098702528930, + 46797805504966016, + 52938791094895481, + 21888242871839275222246405745257275088548364400416034343698180378086393051423, + 21888242871839275222246405745257275088548364400416034343698144480747557314556, + 21888242871839275222246405745257275088548364400416034343698133258589823737061, + 94902009359855899, + 8493323925596228, + 114286147119300550, + 65929528516789826, + 21888242871839275222246405745257275088548364400416034343698079643641831566242, + 21888242871839275222246405745257275088548364400416034343698072608437936002907, + 120264752448846550, + 21888242871839275222246405745257275088548364400416034343698111455711507355091, + 21888242871839275222246405745257275088548364400416034343698200115460744747391, + 73880006878180733, + 40570127605280001, + 4676848864082134, + 21888242871839275222246405745257275088548364400416034343698104567030084340886, + 21888242871839275222246405745257275088548364400416034343698161419897283254788, + 101982427670437452, + 113654306274788947, + 58869452258149742, + 8665244259232840, + 21888242871839275222246405745257275088548364400416034343698118476943595467389, + 21888242871839275222246405745257275088548364400416034343698145929196959418671, + 21888242871839275222246405745257275088548364400416034343698084203794709619991, + 131160933986485582, + 21888242871839275222246405745257275088548364400416034343698184635675394984035, + 25615567906967832, + 108247347385844507, + 88654930468511282, + 21888242871839275222246405745257275088548364400416034343698069697642459109470, + 94183488769237256, + 21888242871839275222246405745257275088548364400416034343698094659412703540217, + 21888242871839275222246405745257275088548364400416034343698088023297208082891, + 127105754161046041, + 21888242871839275222246405745257275088548364400416034343698169622862586139795, + 53816354685818319, + 5143894514883587, + 123231335692737407, + 21888242871839275222246405745257275088548364400416034343698070778932158690678, + 21888242871839275222246405745257275088548364400416034343698110432805416371208, + 21888242871839275222246405745257275088548364400416034343698114251776698568960, + 21888242871839275222246405745257275088548364400416034343698095587089462062446, + 122955380632604801, + 21888242871839275222246405745257275088548364400416034343698169040139690851330, + 131195595353390970, + 96405675763999650, + 21888242871839275222246405745257275088548364400416034343698097999661725823180, + 21888242871839275222246405745257275088548364400416034343698133914538933109430, + 35460846756084247, + 21888242871839275222246405745257275088548364400416034343698085664824045992215, + 21888242871839275222246405745257275088548364400416034343698077002740473856622, + 21888242871839275222246405745257275088548364400416034343698107641478194500369, + 21888242871839275222246405745257275088548364400416034343698158735654907554772, + 21888242871839275222246405745257275088548364400416034343698171306167258630657, + 48041085778025912, + 21888242871839275222246405745257275088548364400416034343698161061065559852370, + 21888242871839275222246405745257275088548364400416034343698137163635445895623, + 69234648478211842, + 21888242871839275222246405745257275088548364400416034343698195656664845449558, + 21888242871839275222246405745257275088548364400416034343698123270529760088377, + 8957753641412101, + 133559480451358924, + 21888242871839275222246405745257275088548364400416034343698131710997525718931, + 21888242871839275222246405745257275088548364400416034343698149529254423836536, + 21888242871839275222246405745257275088548364400416034343698155907236683025745, + 21888242871839275222246405745257275088548364400416034343698168101674031844856, + 37371360861432175, + 21888242871839275222246405745257275088548364400416034343698175175230821647436, + 21888242871839275222246405745257275088548364400416034343698171526522297371082, + 21888242871839275222246405745257275088548364400416034343698068513962843479541, + 83721879347160378, + 88538984331714723, + 90018951771643930, + 102905435754703181, + 21888242871839275222246405745257275088548364400416034343698162597057670533161, + 21888242871839275222246405745257275088548364400416034343698096777784386279258, + 21888242871839275222246405745257275088548364400416034343698114957601109248841, + 75443145337509995, + 21888242871839275222246405745257275088548364400416034343698111190391442259698, + 21888242871839275222246405745257275088548364400416034343698133953315279757380, + 115985183346779118, + 21888242871839275222246405745257275088548364400416034343698200782446772651293, + 118811764285583362, + 21888242871839275222246405745257275088548364400416034343698092992380332201434, + 21888242871839275222246405745257275088548364400416034343698160716127735724774, + 127586489249199136, + 115311424324282587, + 120166626040510487, + 21888242871839275222246405745257275088548364400416034343698199597773157877533, + 21888242871839275222246405745257275088548364400416034343698069468807199693061, + 126927319370345004, + 116721748377537017, + 95987090316409499, + 21888242871839275222246405745257275088548364400416034343698085567370001778036, + 125636336128171648, + 21888242871839275222246405745257275088548364400416034343698126575130387281717, + 21888242871839275222246405745257275088548364400416034343698189529125981874402, + 23113552103975883, + 21888242871839275222246405745257275088548364400416034343698180849696362683274, + 21888242871839275222246405745257275088548364400416034343698156774763869000484, + 22397345333229239, + 85120745485182887, + 21888242871839275222246405745257275088548364400416034343698107166487923076832, + 21888242871839275222246405745257275088548364400416034343698168190736637284540, + 27946805450824729, + 63238739072111239, + 21888242871839275222246405745257275088548364400416034343698086765780488916952, + 40936412362457290, + 21888242871839275222246405745257275088548364400416034343698149400340306552235, + 21888242871839275222246405745257275088548364400416034343698155418037576470135, + 21888242871839275222246405745257275088548364400416034343698074068956246314928, + 21888242871839275222246405745257275088548364400416034343698203288263435144677, + 21888242871839275222246405745257275088548364400416034343698141596437243062525, + 35185970185364483, + 57736880193939821, + 21888242871839275222246405745257275088548364400416034343698172464065041436043, + 21888242871839275222246405745257275088548364400416034343698203340294746657538, + 21888242871839275222246405745257275088548364400416034343698169689099747775999, + 21888242871839275222246405745257275088548364400416034343698111649519901459144, + 21888242871839275222246405745257275088548364400416034343698115414486028590055, + 21888242871839275222246405745257275088548364400416034343698196671932701328448, + 52875903911266234, + 96604721821484540, + 21888242871839275222246405745257275088548364400416034343698108537360063066830, + 21888242871839275222246405745257275088548364400416034343698117344751759033118, + 91054336909799794, + 38195880217480053, + 21888242871839275222246405745257275088548364400416034343698186962948879112322, + 21888242871839275222246405745257275088548364400416034343698060340368133797605, + 21888242871839275222246405745257275088548364400416034343698180700790372731747, + 27230879260300951, + 21888242871839275222246405745257275088548364400416034343698069251474405754145, + 21888242871839275222246405745257275088548364400416034343698145480198138377799, + 98648696495024662, + 21888242871839275222246405745257275088548364400416034343698095935300950961432, + 41735127718241683, + 21888242871839275222246405745257275088548364400416034343698070981244832421665, + 143027566330426725, + 21888242871839275222246405745257275088548364400416034343698154625388847327884, + 95163972770544002, + 21888242871839275222246405745257275088548364400416034343698079694032067072198, + 135538997334889535, + 21888242871839275222246405745257275088548364400416034343698086148054070883863, + 115540899496931065, + 80038477315029872, + 21888242871839275222246405745257275088548364400416034343698183983870765389299, + 114326327566439309, + 21888242871839275222246405745257275088548364400416034343698082402783285020829, + 138073824803304341, + 21888242871839275222246405745257275088548364400416034343698112283539812720296, + 21888242871839275222246405745257275088548364400416034343698201858687127007140, + 127017411211181521, + 141767441706613059, + 21888242871839275222246405745257275088548364400416034343698128923710281025760, + 49193227142396523, + 138589049265593376, + 21888242871839275222246405745257275088548364400416034343698136300301423458665, + 113954386124860265, + 57835239313736371, + 88101208401814065, + 21888242871839275222246405745257275088548364400416034343698185243036090398963, + 21888242871839275222246405745257275088548364400416034343698182954590835486876, + 5263847461493763, + 67507259305663597, + 17571266561912814, + 110865778333418999, + 134189569084768888, + 45166362839733853, + 25944083800776401, + 21888242871839275222246405745257275088548364400416034343698151475853893179654, + 100312339593898679, + 70894637646564996, + 81021726709653314, + 21888242871839275222246405745257275088548364400416034343698086016112742138754, + 21888242871839275222246405745257275088548364400416034343698078313401062080890, + 100499322110875529, + 100118418003858001, + 67225664473309242, + 121791814232916473, + 130279759968780002, + 51743791468001441, + 21888242871839275222246405745257275088548364400416034343698103889176724248847, + 61496576427511534, + 21888242871839275222246405745257275088548364400416034343698149719790715444761, + 21888242871839275222246405745257275088548364400416034343698185851903716235058, + 128710519082479031, + 21888242871839275222246405745257275088548364400416034343698095038079499129719, + 121587006179494581, + 21888242871839275222246405745257275088548364400416034343698122971047283065247, + 21888242871839275222246405745257275088548364400416034343698124652023990476399, + 131370986628692170, + 21888242871839275222246405745257275088548364400416034343698145036102036458369, + 117152917549275724, + 21888242871839275222246405745257275088548364400416034343698183015711871001931, + 104498908379181009, + 21888242871839275222246405745257275088548364400416034343698165180730656409485, + 21888242871839275222246405745257275088548364400416034343698138177347610528790, + 97879975222775272, + 21888242871839275222246405745257275088548364400416034343698174867236096416801, + 21888242871839275222246405745257275088548364400416034343698068051652607341909, + 86093277850339247, + 40222418905736707, + 108746086705861344, + 21888242871839275222246405745257275088548364400416034343698197953953363436546, + 21888242871839275222246405745257275088548364400416034343698184489760844897560, + 51415530693828062, + 21888242871839275222246405745257275088548364400416034343698110475100925110434, + 84205650026044954, + 82007169036924739, + 32575968794545276, + 21888242871839275222246405745257275088548364400416034343698184521527868809486, + 21888242871839275222246405745257275088548364400416034343698151535133298781734, + 21888242871839275222246405745257275088548364400416034343698091037562475073670, + 21888242871839275222246405745257275088548364400416034343698144497125001351713, + 21888242871839275222246405745257275088548364400416034343698086731797448013408, + 6103196332583903, + 135297661993273670, + 123425373353866062, + 99622341382138287, + 21888242871839275222246405745257275088548364400416034343698123785018579327876, + 14673478993598760, + 124727125219984444, + 21888242871839275222246405745257275088548364400416034343698203786261422948866, + 21888242871839275222246405745257275088548364400416034343698100782644752119554, + 21888242871839275222246405745257275088548364400416034343698109716912156385590, + 21888242871839275222246405745257275088548364400416034343698185513353151284886, + 21888242871839275222246405745257275088548364400416034343698088452102026866328, + 33675653170636584, + 21888242871839275222246405745257275088548364400416034343698170833487014060043, + 21888242871839275222246405745257275088548364400416034343698150617188309946202, + 21888242871839275222246405745257275088548364400416034343698066824002610970745, + 40621941110659473, + 28153696834123505, + 21888242871839275222246405745257275088548364400416034343698155918214055574751, + 21888242871839275222246405745257275088548364400416034343698154101841105187866, + 114031399306020235, + 21888242871839275222246405745257275088548364400416034343698128082591425451573, + 88287048010829943, + 21888242871839275222246405745257275088548364400416034343698079287659780149889, + 21888242871839275222246405745257275088548364400416034343698202354970077141906, + 21888242871839275222246405745257275088548364400416034343698148358818357282257, + 108637282033977880, + 14873963604126199, + 99489348551661443, + 21888242871839275222246405745257275088548364400416034343698106432612722503845, + 75630137624282474, + 92817229106358304, + 21888242871839275222246405745257275088548364400416034343698108966661680981726, + 21888242871839275222246405745257275088548364400416034343698161976727612032883, + 10674308620136409, + 51514909933199064, + 21888242871839275222246405745257275088548364400416034343698086058031227975954, + 19209185717528884, + 93099470830937013, + 21888242871839275222246405745257275088548364400416034343698088089233378914446, + 21888242871839275222246405745257275088548364400416034343698108649824063254163, + 35890734037601259, + 26212279710943532, + 93931419818424101, + 26588595134530448, + 21888242871839275222246405745257275088548364400416034343698136740735186185835, + 21888242871839275222246405745257275088548364400416034343698148026092635751879, + 23318447574017335, + 102357947183593951, + 65418468953497399, + 8033522375998539, + 130472345925092015, + 21888242871839275222246405745257275088548364400416034343698141617188694176229, + 21888242871839275222246405745257275088548364400416034343698103373114911740870, + 94424349324294949, + 21888242871839275222246405745257275088548364400416034343698153658141934501665, + 115016198819028308, + 49309463645038013, + 21888242871839275222246405745257275088548364400416034343698159048903032501562, + 21888242871839275222246405745257275088548364400416034343698173496974615440709, + 21888242871839275222246405745257275088548364400416034343698173055759706048649, + 30179067708911312, + 137968551226370418, + 21888242871839275222246405745257275088548364400416034343698070119702310542877, + 21888242871839275222246405745257275088548364400416034343698154214336454192891, + 21888242871839275222246405745257275088548364400416034343698083553786564504198, + 24152408618676769, + 21888242871839275222246405745257275088548364400416034343698084573758054147951, + 140471812135408580, + 4920435054676173, + 21888242871839275222246405745257275088548364400416034343698134816239144578476, + 21888242871839275222246405745257275088548364400416034343698136607583687595289, + 21888242871839275222246405745257275088548364400416034343698137665914268094885, + 32958328447922383, + 21888242871839275222246405745257275088548364400416034343698137303373897616144, + 95038351706803912, + 90070019629114120, + 21888242871839275222246405745257275088548364400416034343698109830040764500712, + 21888242871839275222246405745257275088548364400416034343698116185820378623476, + 111186761140479218, + 70596391173135362, + 45786388400294925, + 8872643392766580, + 21888242871839275222246405745257275088548364400416034343698161792354784662685, + 21888242871839275222246405745257275088548364400416034343698193467187376760995, + 68084016595508174, + 67548783648394507, + 21888242871839275222246405745257275088548364400416034343698081854521998511050, + 21888242871839275222246405745257275088548364400416034343698148555025335271647, + 21888242871839275222246405745257275088548364400416034343698179613182544624005, + 21888242871839275222246405745257275088548364400416034343698131818413478918952, + 21888242871839275222246405745257275088548364400416034343698101093957218603184, + 80195707975601703, + 115213487139372897, + 21888242871839275222246405745257275088548364400416034343698102071538004435850, + 134829083609035548, + 21888242871839275222246405745257275088548364400416034343698109677085367215762, + 21888242871839275222246405745257275088548364400416034343698103362001664359890, + 21888242871839275222246405745257275088548364400416034343698094592147768470792, + 133168725566248127, + 81055379440054758, + 21888242871839275222246405745257275088548364400416034343698147882016699773372, + 21888242871839275222246405745257275088548364400416034343698127325677372131971, + 37646019181534404, + 52888883708869111, + 21888242871839275222246405745257275088548364400416034343698193684881026322756, + 21888242871839275222246405745257275088548364400416034343698075605027577229761, + 21888242871839275222246405745257275088548364400416034343698170691367722646698, + 119446367104037482, + 21888242871839275222246405745257275088548364400416034343698198463693485934763, + 3086420581166419, + 3166063615416350, + 92898166096701387, + 21888242871839275222246405745257275088548364400416034343698171585202232610756, + 33225027950900300, + 55551525832858630, + 21888242871839275222246405745257275088548364400416034343698119628100410237037, + 129836380071586687, + 39314302455049370, + 30436890386416820, + 26670704248970931, + 122714576757314094, + 21888242871839275222246405745257275088548364400416034343698105991329792242088, + 21888242871839275222246405745257275088548364400416034343698196573756939987513, + 21888242871839275222246405745257275088548364400416034343698203909237680784486, + 43728991678638918, + 21888242871839275222246405745257275088548364400416034343698159617583106352066, + 99411660095198806, + 21888242871839275222246405745257275088548364400416034343698114971082447250795, + 21544571513636641, + 85079869992783512, + 21888242871839275222246405745257275088548364400416034343698061235935603492227, + 2245251615423564, + 21888242871839275222246405745257275088548364400416034343698070067557438903756, + 7200884388169763, + 140362893510082325, + 9632047722368691, + 68359829702328495, + 108945597185576687, + 21888242871839275222246405745257275088548364400416034343698104727433956031786, + 74924724186560744, + 45827055201639802, + 54399767088360706, + 21888242871839275222246405745257275088548364400416034343698088694307448435170, + 21888242871839275222246405745257275088548364400416034343698138040894018105883, + 21888242871839275222246405745257275088548364400416034343698138521213472710074, + 21888242871839275222246405745257275088548364400416034343698154512895869339414, + 21888242871839275222246405745257275088548364400416034343698069384806220721144, + 60193618311877284, + 21888242871839275222246405745257275088548364400416034343698120797558668333939, + 21888242871839275222246405745257275088548364400416034343698096528074146885159, + 136228911923362532, + 50442942409760061, + 21888242871839275222246405745257275088548364400416034343698115661749989465209, + 75411407164725307, + 75790466973873761, + 21888242871839275222246405745257275088548364400416034343698108209198758616305, + 21888242871839275222246405745257275088548364400416034343698099051907098653618, + 29633941520604045, + 21888242871839275222246405745257275088548364400416034343698106713118578945847, + 21888242871839275222246405745257275088548364400416034343698108918798111824996, + 135632483318184061, + 143683485733061612, + 21888242871839275222246405745257275088548364400416034343698065555175688049243, + 105827450552279440, + 104803961959147837, + 46832619270651675, + 21888242871839275222246405745257275088548364400416034343698145690246625470648, + 47720225254757754, + 77268838362621176, + 56825925003809304, + 21888242871839275222246405745257275088548364400416034343698131334663161709378, + 21888242871839275222246405745257275088548364400416034343698112507848577039112, + 21888242871839275222246405745257275088548364400416034343698190870175901615213, + 21888242871839275222246405745257275088548364400416034343698084736131853133900, + 21888242871839275222246405745257275088548364400416034343698186329875263834974, + 21888242871839275222246405745257275088548364400416034343698131400083634052655, + 31683728866902052, + 2779058400093828, + 21888242871839275222246405745257275088548364400416034343698077511818637857831, + 125310558546238189, + 2502023863052026, + 81609006629839874, + 26033961461735973, + 73492705379954657, + 74852508262472447, + 21888242871839275222246405745257275088548364400416034343698189915230383287438, + 21888242871839275222246405745257275088548364400416034343698189186584506136199, + 21888242871839275222246405745257275088548364400416034343698123180343700307850, + 82600739888565089, + 2952405830962224, + 101641394322547173, + 53598658068597424, + 136733414278980326, + 97221207338220301, + 14092139633575594, + 692043127640775, + 21888242871839275222246405745257275088548364400416034343698095673975626905860, + 21888242871839275222246405745257275088548364400416034343698097105611864848838, + 21888242871839275222246405745257275088548364400416034343698163324141623469313, + 21888242871839275222246405745257275088548364400416034343698104647509326854971, + 30404738945451124, + 68758349955900586, + 21888242871839275222246405745257275088548364400416034343698165510637487786277, + 13544060875869760, + 125588361804979518, + 142683291179866724, + 21943426039001636, + 52532237892308848, + 15355325541029518, + 73992952788053418, + 99824524213639408, + 21888242871839275222246405745257275088548364400416034343698113784662784211773, + 21888242871839275222246405745257275088548364400416034343698181048433142023542, + 21888242871839275222246405745257275088548364400416034343698127463637735488211, + 21888242871839275222246405745257275088548364400416034343698061637537856766225, + 21888242871839275222246405745257275088548364400416034343698106746978806262278, + 21888242871839275222246405745257275088548364400416034343698082534232875220625, + 21888242871839275222246405745257275088548364400416034343698134046672870875071, + 29167305194702199, + 21888242871839275222246405745257275088548364400416034343698093976890885748703, + 21888242871839275222246405745257275088548364400416034343698060321755373500031, + 80254414538972120, + 80901519438454919, + 117563950371288743, + 42012244797967796, + 21888242871839275222246405745257275088548364400416034343698104044205308264052, + 111822553036184591, + 21888242871839275222246405745257275088548364400416034343698094084947532002285, + 52995026982832985, + 23497427317966299, + 56189744540103486, + 20128429117494442, + 43744936442061438, + 21888242871839275222246405745257275088548364400416034343698109437018536499642, + 2241551551016576, + 21888242871839275222246405745257275088548364400416034343698098345614492808622, + 102398312387726506, + 92764853626438462, + 66736954278213168, + 21888242871839275222246405745257275088548364400416034343698172313856740733397, + 140261977274098408, + 21888242871839275222246405745257275088548364400416034343698155318482019493173, + 21888242871839275222246405745257275088548364400416034343698187027110081950379, + 114220132807907911, + 21888242871839275222246405745257275088548364400416034343698141267601373837433, + 21888242871839275222246405745257275088548364400416034343698173946154936997426, + 21888242871839275222246405745257275088548364400416034343698084626725234936165, + 21888242871839275222246405745257275088548364400416034343698096702984895193967, + 21888242871839275222246405745257275088548364400416034343698193812351669015447, + 92770461570846954, + 21888242871839275222246405745257275088548364400416034343698121502506669351874, + 117897527758868739, + 87021107717574768, + 140059389513409249, + 98412985079928365, + 21888242871839275222246405745257275088548364400416034343698068465364869658535, + 21888242871839275222246405745257275088548364400416034343698203968918195429998, + 131728874999986149, + 8006264658034128, + 21888242871839275222246405745257275088548364400416034343698117766514509277016, + 21888242871839275222246405745257275088548364400416034343698165699844591613276, + 96503674771658256, + 21888242871839275222246405745257275088548364400416034343698116844280529899823, + 86123145493354443, + 68892661830632780, + 81745214106676608, + 21888242871839275222246405745257275088548364400416034343698185038631733694846, + 47101921910133174, + 21888242871839275222246405745257275088548364400416034343698189251767585915000, + 75560923191497050, + 66739023091815171, + 109751588206192150, + 21888242871839275222246405745257275088548364400416034343698096122031606394304, + 91915561440669660, + 21888242871839275222246405745257275088548364400416034343698117861607128712322, + 21888242871839275222246405745257275088548364400416034343698095349307544317552, + 21888242871839275222246405745257275088548364400416034343698181554308174142809, + 21888242871839275222246405745257275088548364400416034343698156028402843284946, + 21888242871839275222246405745257275088548364400416034343698100731628590383030, + 21888242871839275222246405745257275088548364400416034343698183766911990041738, + 21888242871839275222246405745257275088548364400416034343698129792382480507484, + 125823554378968357, + 88153019421688096, + 125548381463008473, + 21888242871839275222246405745257275088548364400416034343698182609564805332435, + 61288659453986752, + 21888242871839275222246405745257275088548364400416034343698161338231807184900, + 5181887256472458, + 36021537489537782, + 84703074988686901, + 21888242871839275222246405745257275088548364400416034343698092563179383499480, + 68826682240712551, + 21888242871839275222246405745257275088548364400416034343698181142426310526490, + 21888242871839275222246405745257275088548364400416034343698180122841066990478, + 18485437940358453, + 21888242871839275222246405745257275088548364400416034343698125569936723609239, + 128841653120855166, + 112135248704267841, + 66369115104821860, + 21888242871839275222246405745257275088548364400416034343698074719349851233303, + 21888242871839275222246405745257275088548364400416034343698139462965345693331, + 63685594010530691, + 21888242871839275222246405745257275088548364400416034343698136585813723948286, + 21888242871839275222246405745257275088548364400416034343698170604332413642528, + 21888242871839275222246405745257275088548364400416034343698155259637026816130, + 38928440927813744, + 21888242871839275222246405745257275088548364400416034343698198929796564567401, + 70902411063360694, + 21888242871839275222246405745257275088548364400416034343698115511814849465112, + 75041586329648049, + 118576104460201177, + 21888242871839275222246405745257275088548364400416034343698188168430772505867, + 33555351930056873, + 21888242871839275222246405745257275088548364400416034343698095139325474241541, + 21888242871839275222246405745257275088548364400416034343698176183870988678470, + 144101678567213096, + 21888242871839275222246405745257275088548364400416034343698144243756514923362, + 21888242871839275222246405745257275088548364400416034343698074144496390960572, + 80146888888547776, + 21888242871839275222246405745257275088548364400416034343698153839306248630694, + 69827105889281564, + 85956288041460048, + 21888242871839275222246405745257275088548364400416034343698152782183034086165, + 64436754203368135, + 21888242871839275222246405745257275088548364400416034343698090672208078815095, + 21888242871839275222246405745257275088548364400416034343698119034806134300919, + 21888242871839275222246405745257275088548364400416034343698096646019621272520, + 87948600269627823, + 127012206771001733, + 20798007914186988, + 46708644493186119, + 33490070203596831, + 21888242871839275222246405745257275088548364400416034343698166365289425348723, + 94196929707752170, + 21888242871839275222246405745257275088548364400416034343698116934681117365942, + 12108752787942386, + 21888242871839275222246405745257275088548364400416034343698068706088089845663, + 56614724008780855, + 21888242871839275222246405745257275088548364400416034343698117251437286696023, + 82848499747386240, + 39047851786662060, + 21888242871839275222246405745257275088548364400416034343698091684742549571177, + 83810353282509659, + 131769602488001753, + 21888242871839275222246405745257275088548364400416034343698180568853194964184, + 21888242871839275222246405745257275088548364400416034343698153292858970982350, + 962653112576522, + 48413361982393253, + 21888242871839275222246405745257275088548364400416034343698115125350936463505, + 21888242871839275222246405745257275088548364400416034343698145553642647351319, + 21888242871839275222246405745257275088548364400416034343698147624449281104261, + 21888242871839275222246405745257275088548364400416034343698140401018480184112, + 35688807874043663, + 91678444715143121, + 48065327597562486, + 128585530633875486, + 115186047503059564, + 58505535082879992, + 138812370438839068, + 120995056626592165, + 30417122212043770, + 21888242871839275222246405745257275088548364400416034343698061849656168221084, + 21888242871839275222246405745257275088548364400416034343698114836596645711135, + 24160660393671084, + 21888242871839275222246405745257275088548364400416034343698140523713343871755, + 38846945350334481, + 2527856103917858, + 12866526119181460, + 21888242871839275222246405745257275088548364400416034343698148968035392583450, + 27427881141612383, + 73711352512829025, + 21888242871839275222246405745257275088548364400416034343698156896226120960794, + 21888242871839275222246405745257275088548364400416034343698093754051436597989, + 110091555473220300, + 92955880049285626, + 21888242871839275222246405745257275088548364400416034343698132081547875065666, + 81901518917563523, + 105436118956318447, + 134189538365812663, + 21888242871839275222246405745257275088548364400416034343698078619695575384510, + 80185368635614273, + 19857962499768118, + 21888242871839275222246405745257275088548364400416034343698082949955773303491, + 136894921254297806, + 21888242871839275222246405745257275088548364400416034343698163070223204777994, + 21888242871839275222246405745257275088548364400416034343698129147210217999918, + 21888242871839275222246405745257275088548364400416034343698117712870935021195, + 21888242871839275222246405745257275088548364400416034343698108773225990782634, + 68405479421100301, + 21888242871839275222246405745257275088548364400416034343698171071966348223857, + 39433730361771364, + 21888242871839275222246405745257275088548364400416034343698063677903732362949, + 21888242871839275222246405745257275088548364400416034343698141466475687168275, + 36639064194429642, + 87315669393070233, + 90391240598815988, + 21888242871839275222246405745257275088548364400416034343698133146177797854946, + 21888242871839275222246405745257275088548364400416034343698139292258619743180, + 21888242871839275222246405745257275088548364400416034343698072774472588983860, + 21888242871839275222246405745257275088548364400416034343698115616810067188768, + 21888242871839275222246405745257275088548364400416034343698138553807380792574, + 21888242871839275222246405745257275088548364400416034343698101325117828621015, + 21888242871839275222246405745257275088548364400416034343698191951283056636896, + 140516915690791379, + 125199598631150477, + 33801324256255743, + 22680163666252268, + 21888242871839275222246405745257275088548364400416034343698113005538730603759, + 21888242871839275222246405745257275088548364400416034343698060195663708260597, + 21888242871839275222246405745257275088548364400416034343698127997624606798289, + 21888242871839275222246405745257275088548364400416034343698094010701008322106, + 143097071802183409, + 21888242871839275222246405745257275088548364400416034343698065959971887838609, + 74787693072889151, + 40826711523052795, + 21888242871839275222246405745257275088548364400416034343698182620193983773459, + 21888242871839275222246405745257275088548364400416034343698083543543285069442, + 137367288295019733, + 21888242871839275222246405745257275088548364400416034343698142834581792278023, + 121652035264239264, + 21888242871839275222246405745257275088548364400416034343698134466804696449120, + 21888242871839275222246405745257275088548364400416034343698148282554360832363, + 89458343505392844, + 15656654970555492, + 21888242871839275222246405745257275088548364400416034343698126748883198167962, + 21888242871839275222246405745257275088548364400416034343698174125529845402501, + 21888242871839275222246405745257275088548364400416034343698119761105334548307, + 21888242871839275222246405745257275088548364400416034343698169892823611339825, + 29100609332598248, + 116725161818136416, + 21888242871839275222246405745257275088548364400416034343698151629634814966416, + 21888242871839275222246405745257275088548364400416034343698166984321787283257, + 79079632920719502, + 21888242871839275222246405745257275088548364400416034343698137306509987396816, + 21888242871839275222246405745257275088548364400416034343698183791420496587980, + 112778609184162247, + 80083254809508182, + 137448359750904260, + 21888242871839275222246405745257275088548364400416034343698196629258064797900, + 21888242871839275222246405745257275088548364400416034343698120462058023841555, + 3274988644540175, + 122485129987150662, + 21888242871839275222246405745257275088548364400416034343698092380482415907452, + 13841443429903647, + 25795145608514875, + 21888242871839275222246405745257275088548364400416034343698146030462771453632, + 21888242871839275222246405745257275088548364400416034343698126770407438666093, + 21888242871839275222246405745257275088548364400416034343698125846442015173557, + 21888242871839275222246405745257275088548364400416034343698060137155565851102, + 21888242871839275222246405745257275088548364400416034343698092212761968684708, + 113294309724741026, + 51791755808077146, + 128711548465851546, + 5972877413045158, + 21888242871839275222246405745257275088548364400416034343698085881889142683394, + 124166188526314928, + 121023117618770174, + 21888242871839275222246405745257275088548364400416034343698202460120333086475, + 21888242871839275222246405745257275088548364400416034343698201959260759177838, + 16823740981187698, + 86274909846886187, + 4545116556136049, + 26343739606988295, + 21888242871839275222246405745257275088548364400416034343698155190381749500848, + 21888242871839275222246405745257275088548364400416034343698157466732782172204, + 21888242871839275222246405745257275088548364400416034343698110956620225492583, + 21888242871839275222246405745257275088548364400416034343698157068969036796877, + 62851453493700011, + 21888242871839275222246405745257275088548364400416034343698167965786057026789, + 31505681342871386, + 21888242871839275222246405745257275088548364400416034343698085957714382382912, + 96953648433592400, + 21888242871839275222246405745257275088548364400416034343698088897488981205333, + 67557171991454533, + 21888242871839275222246405745257275088548364400416034343698123041494597247235, + 21888242871839275222246405745257275088548364400416034343698092300029934751194, + 61222676980762559, + 12208518182562101, + 21888242871839275222246405745257275088548364400416034343698139869530358317315, + 115503286133142408, + 21888242871839275222246405745257275088548364400416034343698069558708178241394, + 21888242871839275222246405745257275088548364400416034343698197965097123515366, + 21888242871839275222246405745257275088548364400416034343698118035544866260427, + 21888242871839275222246405745257275088548364400416034343698060710703325157420, + 21888242871839275222246405745257275088548364400416034343698102074420821785351, + 21888242871839275222246405745257275088548364400416034343698119484771452048940, + 21888242871839275222246405745257275088548364400416034343698073785432171980892, + 21888242871839275222246405745257275088548364400416034343698165005475838688607, + 21888242871839275222246405745257275088548364400416034343698182133170002626076, + 369955230879315, + 21888242871839275222246405745257275088548364400416034343698154746134288640533, + 21888242871839275222246405745257275088548364400416034343698116229299023377180, + 82614034508578498, + 21888242871839275222246405745257275088548364400416034343698065312762679703569, + 4936478147529267, + 21888242871839275222246405745257275088548364400416034343698105601614603675960, + 2870513243584890, + 45169120890265103, + 72241238576268252, + 21888242871839275222246405745257275088548364400416034343698151198728088715527, + 130130555009310705, + 21888242871839275222246405745257275088548364400416034343698084140302473422142, + 21888242871839275222246405745257275088548364400416034343698127044970270432609, + 21888242871839275222246405745257275088548364400416034343698071221100645041563, + 21888242871839275222246405745257275088548364400416034343698128485541034016797, + 21888242871839275222246405745257275088548364400416034343698107300156902482102, + 21888242871839275222246405745257275088548364400416034343698132692503082436675, + 21888242871839275222246405745257275088548364400416034343698117081992452452672, + 86562676929304973, + 50349006642446153, + 21888242871839275222246405745257275088548364400416034343698127210841926724510, + 28368385677306809, + 21888242871839275222246405745257275088548364400416034343698065545703831202246, + 21888242871839275222246405745257275088548364400416034343698180560365632722855, + 21888242871839275222246405745257275088548364400416034343698166454090578728802, + 93064020162772188, + 21888242871839275222246405745257275088548364400416034343698091604212386399587, + 33395548994038136, + 21888242871839275222246405745257275088548364400416034343698143475083221423821, + 116236944054032810, + 20856089882132045, + 11942346850065542, + 21888242871839275222246405745257275088548364400416034343698061389293078164951, + 21888242871839275222246405745257275088548364400416034343698200336624429157179, + 18938876755897416, + 21888242871839275222246405745257275088548364400416034343698128145699640597361, + 17682114880156210, + 21888242871839275222246405745257275088548364400416034343698186775241100542615, + 21888242871839275222246405745257275088548364400416034343698079878519928526682, + 1401534119343374, + 21888242871839275222246405745257275088548364400416034343698073317615580208754, + 21888242871839275222246405745257275088548364400416034343698175866671668540487, + 96237474980489176, + 21888242871839275222246405745257275088548364400416034343698176641466007690046, + 21888242871839275222246405745257275088548364400416034343698090600713993744293, + 108752355031887138, + 21888242871839275222246405745257275088548364400416034343698082547983796796867, + 21888242871839275222246405745257275088548364400416034343698179051561392866437, + 138165724479346934, + 21888242871839275222246405745257275088548364400416034343698132288010198531414, + 3205325133133699, + 45822169149524508, + 10080019056168443, + 100107719837037363, + 68340933635231832, + 21888242871839275222246405745257275088548364400416034343698085436898085407212, + 21888242871839275222246405745257275088548364400416034343698119045771142502804, + 21888242871839275222246405745257275088548364400416034343698081169672532636469, + 19828056502587393, + 76013945909909587, + 21888242871839275222246405745257275088548364400416034343698095743090090767743, + 59745553840911330, + 21888242871839275222246405745257275088548364400416034343698092450584300582952, + 21888242871839275222246405745257275088548364400416034343698117568057634322221, + 23306670240514442, + 135014556682426238, + 138923695130764382, + 110855367083866740, + 21888242871839275222246405745257275088548364400416034343698113538665250658591, + 32305666441066683, + 44680201578678420, + 90196485416799014, + 21888242871839275222246405745257275088548364400416034343698186151537872929027, + 143174949764753543, + 21888242871839275222246405745257275088548364400416034343698167730119847761771, + 21888242871839275222246405745257275088548364400416034343698105404164272546071, + 21888242871839275222246405745257275088548364400416034343698136360680050079957, + 21888242871839275222246405745257275088548364400416034343698081360281344597684, + 21888242871839275222246405745257275088548364400416034343698198070160475563578, + 21888242871839275222246405745257275088548364400416034343698125056698187455474, + 94645341875259735, + 21888242871839275222246405745257275088548364400416034343698109749150206701519, + 21888242871839275222246405745257275088548364400416034343698078504576770818778, + 36141061091450373, + 21888242871839275222246405745257275088548364400416034343698165924263617170925, + 39120139007802030, + 21888242871839275222246405745257275088548364400416034343698195116871627434062, + 14214909173629390, + 21888242871839275222246405745257275088548364400416034343698184265300475781926, + 53459347605738109, + 21888242871839275222246405745257275088548364400416034343698091055332968836008, + 21888242871839275222246405745257275088548364400416034343698178168354165752946, + 71047513410222996, + 21888242871839275222246405745257275088548364400416034343698097989473451201304, + 71582916473845256, + 6228340174622649, + 43780409748466013, + 21888242871839275222246405745257275088548364400416034343698111781420792148458, + 71643498456281567, + 21888242871839275222246405745257275088548364400416034343698195140303114261142, + 91295744701354078, + 87153452935802089, + 21888242871839275222246405745257275088548364400416034343698081042950612250377, + 21888242871839275222246405745257275088548364400416034343698135382183783653643, + 25774410613802046, + 21888242871839275222246405745257275088548364400416034343698095054216314679540, + 34371627404809678, + 21888242871839275222246405745257275088548364400416034343698156674753230685172, + 21888242871839275222246405745257275088548364400416034343698069583567782890556, + 21888242871839275222246405745257275088548364400416034343698163053352346817590, + 135516662679940537, + 21888242871839275222246405745257275088548364400416034343698120527791650264806, + 21888242871839275222246405745257275088548364400416034343698091278229185922349, + 22753109834460314, + 21888242871839275222246405745257275088548364400416034343698203113214408978087, + 115518138176799794, + 21888242871839275222246405745257275088548364400416034343698086828040940326342, + 80409245497813303, + 21888242871839275222246405745257275088548364400416034343698109266863967033086, + 135040197903958363, + 26153101124790488, + 96436359807161569, + 112902490185570638, + 21888242871839275222246405745257275088548364400416034343698068701046656888621, + 21888242871839275222246405745257275088548364400416034343698061764194813667056, + 61794767698414213, + 21888242871839275222246405745257275088548364400416034343698134485320088117983, + 21888242871839275222246405745257275088548364400416034343698074495484094672685, + 21888242871839275222246405745257275088548364400416034343698108656636575131735, + 92358177951559194, + 115408203783206382, + 21888242871839275222246405745257275088548364400416034343698147357417872857580, + 55137127443972624, + 21888242871839275222246405745257275088548364400416034343698184417709137460539, + 21888242871839275222246405745257275088548364400416034343698149642634792223750, + 19405400875007145, + 23811161264826303, + 142705631763394140, + 74129519206267403, + 139671675174886714, + 125333664337351084, + 21888242871839275222246405745257275088548364400416034343698147236269245678746, + 21888242871839275222246405745257275088548364400416034343698122460096807870363, + 124360053741230831, + 50882835230414425, + 32876269391570019, + 21888242871839275222246405745257275088548364400416034343698146327357423777962, + 21888242871839275222246405745257275088548364400416034343698112704283376954743, + 75942908421031688, + 21888242871839275222246405745257275088548364400416034343698166255440975500853, + 21888242871839275222246405745257275088548364400416034343698104216233480400101, + 21888242871839275222246405745257275088548364400416034343698113765103025321085, + 21888242871839275222246405745257275088548364400416034343698148681430411328704, + 66997905242665312, + 63929129191616678, + 21888242871839275222246405745257275088548364400416034343698157313799095251055, + 21888242871839275222246405745257275088548364400416034343698098657596165574237, + 21888242871839275222246405745257275088548364400416034343698099837926343065306, + 104913525361754780, + 21888242871839275222246405745257275088548364400416034343698066323545579223869, + 21888242871839275222246405745257275088548364400416034343698090810240942612920, + 21888242871839275222246405745257275088548364400416034343698087450230602916071, + 29241839213781800, + 21888242871839275222246405745257275088548364400416034343698144461014688674156, + 21888242871839275222246405745257275088548364400416034343698162810190252129259, + 21888242871839275222246405745257275088548364400416034343698154999110964996798, + 21888242871839275222246405745257275088548364400416034343698162731829464661381, + 21888242871839275222246405745257275088548364400416034343698090582797277555131, + 21888242871839275222246405745257275088548364400416034343698199940390631595489, + 142799479515114674, + 69786637833366432, + 21888242871839275222246405745257275088548364400416034343698076122269134841255, + 21888242871839275222246405745257275088548364400416034343698179549418076247310, + 21888242871839275222246405745257275088548364400416034343698079864763852705819, + 21888242871839275222246405745257275088548364400416034343698175859507747721315, + 15828465764614911, + 21888242871839275222246405745257275088548364400416034343698125358706281902232, + 62120387633996138, + 21888242871839275222246405745257275088548364400416034343698095353965348723249, + 104285230437592568, + 109975145409387904, + 21888242871839275222246405745257275088548364400416034343698125533505569720870, + 21888242871839275222246405745257275088548364400416034343698181473197935498203, + 43657647949243671, + 13050261045405782, + 34732426882318702, + 21888242871839275222246405745257275088548364400416034343698147946503330088964, + 34939054352212513, + 21888242871839275222246405745257275088548364400416034343698123568774790709990, + 93121788255778269, + 109383544576556409, + 90467912239692570, + 21888242871839275222246405745257275088548364400416034343698184345053041654427, + 21888242871839275222246405745257275088548364400416034343698125081965171845555, + 21888242871839275222246405745257275088548364400416034343698133472393423555570, + 19252093642298672, + 21888242871839275222246405745257275088548364400416034343698153995766729389018, + 21888242871839275222246405745257275088548364400416034343698118536974897420730, + 138279723251842136, + 21888242871839275222246405745257275088548364400416034343698132245543155267402, + 93831299628964729, + 16508947497771548, + 49932125221023234, + 21888242871839275222246405745257275088548364400416034343698111896693337161615, + 25480229044746128, + 21888242871839275222246405745257275088548364400416034343698171371823012974140, + 2828388962362658, + 58590265882533080, + 111290676247599968, + 78592657526498737, + 5285765441390195, + 21888242871839275222246405745257275088548364400416034343698112804590951990703, + 104308061941740617, + 119580868455357697, + 4643388306264032, + 110137516950478748, + 129737551007970452, + 41762346808287156, + 21888242871839275222246405745257275088548364400416034343698072875283531002186, + 21888242871839275222246405745257275088548364400416034343698177944605731549015, + 63286285473838831, + 18594993782146321, + 21888242871839275222246405745257275088548364400416034343698077137916814199412, + 22837910618740295, + 21888242871839275222246405745257275088548364400416034343698119975638327386143, + 102860387046889026, + 118505746037917320, + 21888242871839275222246405745257275088548364400416034343698197172872109343711, + 107575964995108975, + 21888242871839275222246405745257275088548364400416034343698110349568047019240, + 21888242871839275222246405745257275088548364400416034343698192167538368584403, + 124585425243012296, + 49580268738820573, + 27026981973292439, + 122609583149349407, + 72927100044431415, + 21888242871839275222246405745257275088548364400416034343698083927701160335469, + 21888242871839275222246405745257275088548364400416034343698159071865336062773, + 21888242871839275222246405745257275088548364400416034343698188582358468708138, + 97956052091923723, + 21888242871839275222246405745257275088548364400416034343698161297776686579272, + 121618141021902066, + 9656031465997168, + 21888242871839275222246405745257275088548364400416034343698162251239296787358, + 21888242871839275222246405745257275088548364400416034343698086295059523133581, + 53452444779124751, + 21888242871839275222246405745257275088548364400416034343698171375887688479026, + 5951890163607626, + 116548650328406001, + 661164103439004, + 21888242871839275222246405745257275088548364400416034343698176060466162481507, + 21888242871839275222246405745257275088548364400416034343698113572919960251285, + 41941813859392549, + 21888242871839275222246405745257275088548364400416034343698131725738381906149, + 30914149913181850, + 72676156682862669, + 21888242871839275222246405745257275088548364400416034343698177698754851988367, + 130678070758965270, + 21888242871839275222246405745257275088548364400416034343698061795786933402960, + 21888242871839275222246405745257275088548364400416034343698073588696029793972, + 21888242871839275222246405745257275088548364400416034343698082315202092758681, + 21888242871839275222246405745257275088548364400416034343698151979150686342047, + 21888242871839275222246405745257275088548364400416034343698181620014833545237, + 21888242871839275222246405745257275088548364400416034343698127683734855033334, + 40143113006151975, + 118528634939890461, + 21888242871839275222246405745257275088548364400416034343698192286836509612416, + 21888242871839275222246405745257275088548364400416034343698143153958733530651, + 44852374368654698, + 21888242871839275222246405745257275088548364400416034343698181438433139095090, + 21888242871839275222246405745257275088548364400416034343698182922065087574164, + 65161006584284438, + 21888242871839275222246405745257275088548364400416034343698064159651238744066, + 21888242871839275222246405745257275088548364400416034343698165704484435408221, + 37285832436742911, + 123684406786490680, + 21888242871839275222246405745257275088548364400416034343698138726639112342208, + 141168586847233095, + 64521914729408976, + 21011611605575187, + 98299542340245020, + 5886104740553, + 103945249551856336, + 21888242871839275222246405745257275088548364400416034343698126661857312526852, + 21888242871839275222246405745257275088548364400416034343698140310717816326602, + 21888242871839275222246405745257275088548364400416034343698086282741807068824, + 21888242871839275222246405745257275088548364400416034343698197890788453978836, + 103921620424130447, + 43730553251620991, + 21888242871839275222246405745257275088548364400416034343698176364875738363069, + 21888242871839275222246405745257275088548364400416034343698060638248059610744, + 21888242871839275222246405745257275088548364400416034343698119038811882678583, + 21888242871839275222246405745257275088548364400416034343698062423831423534894, + 82470386805440731, + 136221289272294114, + 21888242871839275222246405745257275088548364400416034343698127072179001984504, + 21888242871839275222246405745257275088548364400416034343698105075734844218070, + 21888242871839275222246405745257275088548364400416034343698118118514714928593, + 21888242871839275222246405745257275088548364400416034343698170988419944525763, + 31928931282636974, + 21888242871839275222246405745257275088548364400416034343698076631728019407382, + 21888242871839275222246405745257275088548364400416034343698098004511195567168, + 133787084466376850, + 78839082518338843, + 21888242871839275222246405745257275088548364400416034343698133971591382949012, + 21888242871839275222246405745257275088548364400416034343698189872198033138720, + 67855781903141496, + 72978131924206925, + 95533742963476825, + 98996532742208738, + 135098424212986879, + 66165413250331816, + 21888242871839275222246405745257275088548364400416034343698116967010321413266, + 114900954686590687, + 110691770226830085, + 75404639724391794, + 39588293835208858, + 82234909382257496, + 21888242871839275222246405745257275088548364400416034343698177732706817933765, + 28578931205575947, + 69702835881510681, + 21888242871839275222246405745257275088548364400416034343698166092874124359295, + 144053293253168410, + 21888242871839275222246405745257275088548364400416034343698167455235710044337, + 21888242871839275222246405745257275088548364400416034343698147237912861854821, + 96084584866291751, + 54501417890562059, + 84476879004389949, + 108441656007263706, + 21888242871839275222246405745257275088548364400416034343698189096539271284340, + 23663891434356266, + 21888242871839275222246405745257275088548364400416034343698176508496748238532, + 19912630605736176, + 21888242871839275222246405745257275088548364400416034343698150032012775686479, + 50650830955389712, + 125712377609342539, + 66343345200867909, + 21888242871839275222246405745257275088548364400416034343698117523296070762945, + 21888242871839275222246405745257275088548364400416034343698196967925532684936, + 21518541265723657, + 42708751657474550, + 67264804678104588, + 21888242871839275222246405745257275088548364400416034343698190427621020319867, + 21888242871839275222246405745257275088548364400416034343698154556945300988781, + 43627567223264281, + 94965583058856880, + 25737973701737851, + 19207717788291686, + 17066576081193202, + 21888242871839275222246405745257275088548364400416034343698142592154917932211, + 24237311783784479, + 21888242871839275222246405745257275088548364400416034343698186366028182979839, + 21888242871839275222246405745257275088548364400416034343698182319391690212040, + 21888242871839275222246405745257275088548364400416034343698076602794677181228, + 39531070406786434, + 112129819354581743, + 21888242871839275222246405745257275088548364400416034343698077040579108136869, + 62754646897938354, + 21888242871839275222246405745257275088548364400416034343698189157295203924632, + 112959817405193838, + 21888242871839275222246405745257275088548364400416034343698200190725570983863, + 15826819862988170, + 21888242871839275222246405745257275088548364400416034343698167769453323491414, + 64546950730118289, + 21888242871839275222246405745257275088548364400416034343698098100519589302831, + 102231875499237644, + 21888242871839275222246405745257275088548364400416034343698087253036889204529, + 21888242871839275222246405745257275088548364400416034343698074374889532752794, + 21888242871839275222246405745257275088548364400416034343698138753173839771861, + 34820660609130981, + 88234656341026327, + 21888242871839275222246405745257275088548364400416034343698071471741193631803, + 133889479154218005, + 21888242871839275222246405745257275088548364400416034343698135258637529593683, + 21888242871839275222246405745257275088548364400416034343698096925036294884141, + 21888242871839275222246405745257275088548364400416034343698143112230010459301, + 21888242871839275222246405745257275088548364400416034343698095686920712658559, + 49967469378436766, + 120726165319986724, + 14813558376751671, + 21888242871839275222246405745257275088548364400416034343698125501913165947598, + 15549604079347490, + 21888242871839275222246405745257275088548364400416034343698157735350579006265, + 21888242871839275222246405745257275088548364400416034343698069140384619172231, + 21888242871839275222246405745257275088548364400416034343698169617701120132107, + 21888242871839275222246405745257275088548364400416034343698069497012266749350, + 6750325809069630, + 21888242871839275222246405745257275088548364400416034343698084860013645322878, + 93187681936547121, + 21888242871839275222246405745257275088548364400416034343698075594491889717597, + 21888242871839275222246405745257275088548364400416034343698166952351735764618, + 21888242871839275222246405745257275088548364400416034343698199831281330408066, + 51436702808199522, + 69255369348610271, + 21888242871839275222246405745257275088548364400416034343698176848166982824922, + 68190723249641598, + 20712392900272385, + 21888242871839275222246405745257275088548364400416034343698140063130124650817, + 86142332772575299, + 41540365066713481, + 21888242871839275222246405745257275088548364400416034343698132055487439759966, + 126757023629425841, + 140744835023489771, + 21888242871839275222246405745257275088548364400416034343698071145134711825203, + 21888242871839275222246405745257275088548364400416034343698145324098819019604, + 80398113100840364, + 21888242871839275222246405745257275088548364400416034343698174771403175287920, + 21888242871839275222246405745257275088548364400416034343698158628076892886400, + 137223991558562284, + 69735795445672756, + 21888242871839275222246405745257275088548364400416034343698065546613150313842, + 21888242871839275222246405745257275088548364400416034343698101279661669543812, + 38553491474027433, + 3228575518229230, + 21888242871839275222246405745257275088548364400416034343698187869953548574647, + 21888242871839275222246405745257275088548364400416034343698121562489809588415, + 21888242871839275222246405745257275088548364400416034343698131290612250294026, + 41965095999770590, + 136019009056273112, + 21888242871839275222246405745257275088548364400416034343698194141716311911379, + 21888242871839275222246405745257275088548364400416034343698175279231021095234, + 21888242871839275222246405745257275088548364400416034343698152642736994390689, + 21888242871839275222246405745257275088548364400416034343698178402900010446386, + 26479941106824812, + 21888242871839275222246405745257275088548364400416034343698185868017456181085, + 89618374065105107, + 21888242871839275222246405745257275088548364400416034343698064884187937071260, + 104962861801818508, + 21888242871839275222246405745257275088548364400416034343698162293258792196139, + 21888242871839275222246405745257275088548364400416034343698107511415917925802, + 32519495198528695, + 21888242871839275222246405745257275088548364400416034343698204027591568435599, + 21888242871839275222246405745257275088548364400416034343698133824702585316921, + 21888242871839275222246405745257275088548364400416034343698143036329730795430, + 13281270246859825, + 21888242871839275222246405745257275088548364400416034343698098989955408056266, + 21888242871839275222246405745257275088548364400416034343698201527129354880461, + 21888242871839275222246405745257275088548364400416034343698137690774711352961, + 95735317326875310, + 93611590654806151, + 93711180197982113, + 21888242871839275222246405745257275088548364400416034343698156982867870143840, + 21888242871839275222246405745257275088548364400416034343698077143374494482391, + 21888242871839275222246405745257275088548364400416034343698132322675816183905, + 50408230337812401, + 21888242871839275222246405745257275088548364400416034343698091805726036290836, + 21888242871839275222246405745257275088548364400416034343698164168581218904668, + 19341452795924164, + 109757779969270832, + 66321828109410971, + 21888242871839275222246405745257275088548364400416034343698129764940504262960, + 61004638566181360, + 116667718120015229, + 21888242871839275222246405745257275088548364400416034343698067920960343859744, + 87396610388269602, + 21888242871839275222246405745257275088548364400416034343698107727637069678318, + 88764883570739310, + 21888242871839275222246405745257275088548364400416034343698182872820005509343, + 21888242871839275222246405745257275088548364400416034343698134767152195671669, + 21888242871839275222246405745257275088548364400416034343698148151091934257531, + 21888242871839275222246405745257275088548364400416034343698198889003623900859, + 21888242871839275222246405745257275088548364400416034343698197892393714498865, + 21888242871839275222246405745257275088548364400416034343698090313222065287455, + 21888242871839275222246405745257275088548364400416034343698095540271535449363, + 21888242871839275222246405745257275088548364400416034343698065620207749110452, + 73387900181465103, + 21888242871839275222246405745257275088548364400416034343698202209863793653664, + 134810436964262309, + 68923436841364371, + 30008036329338853, + 34737511691339753, + 130678336632152959, + 48198182710063149, + 21888242871839275222246405745257275088548364400416034343698168984741169116292, + 21888242871839275222246405745257275088548364400416034343698077214168088789461, + 44331309350349975, + 21888242871839275222246405745257275088548364400416034343698067324660803891990, + 93298325725358953, + 21888242871839275222246405745257275088548364400416034343698115044014096877140, + 21888242871839275222246405745257275088548364400416034343698130686282969709064, + 21888242871839275222246405745257275088548364400416034343698080170143578533877, + 21888242871839275222246405745257275088548364400416034343698165804406564990828, + 119330062244530345, + 135696902666452471, + 37307058456600509, + 21888242871839275222246405745257275088548364400416034343698166374038082595728, + 140014931117231669, + 644119662770487, + 110214830177230928, + 21888242871839275222246405745257275088548364400416034343698115401384710090230, + 21888242871839275222246405745257275088548364400416034343698123675169414827741, + 21888242871839275222246405745257275088548364400416034343698100223446191877847, + 102433943828888105, + 109057404910755323, + 98597950929629619, + 21888242871839275222246405745257275088548364400416034343698174340861944345609, + 21074780415348674, + 21888242871839275222246405745257275088548364400416034343698160236608878140006, + 38450721728799043, + 71582949280444333, + 21888242871839275222246405745257275088548364400416034343698118583298730912470, + 21888242871839275222246405745257275088548364400416034343698194826127458287762, + 13192642102017700, + 89711738047120182, + 21888242871839275222246405745257275088548364400416034343698123074143679130715, + 15651384039693464, + 49095481314575741, + 81923618742083501, + 21888242871839275222246405745257275088548364400416034343698122389025835912277, + 21888242871839275222246405745257275088548364400416034343698092544931978449672, + 111965773322974023, + 143574800657067635, + 21888242871839275222246405745257275088548364400416034343698101108153876224440, + 126250864816481047, + 21888242871839275222246405745257275088548364400416034343698069909108831054094, + 21888242871839275222246405745257275088548364400416034343698084873477685231293, + 21888242871839275222246405745257275088548364400416034343698105938731698674008, + 21788623674609851, + 21888242871839275222246405745257275088548364400416034343698069439727249308045, + 116452109758365952, + 127243185495985102, + 21888242871839275222246405745257275088548364400416034343698190051085322396491, + 21888242871839275222246405745257275088548364400416034343698066983523315013576, + 26415475992621284, + 21888242871839275222246405745257275088548364400416034343698138086967667009751, + 119683809046879677, + 21888242871839275222246405745257275088548364400416034343698162762201883314498, + 51758478050320270, + 62501833293073373, + 87759588117715016, + 108029897184768669, + 21888242871839275222246405745257275088548364400416034343698105621342333012052, + 21888242871839275222246405745257275088548364400416034343698177193845765291867, + 96011152910207406, + 50213704768908631, + 11872074438091407, + 21888242871839275222246405745257275088548364400416034343698078440226780330605, + 36701063792754807, + 92679524658436805, + 21888242871839275222246405745257275088548364400416034343698187516121349652214, + 120639496381079446, + 21888242871839275222246405745257275088548364400416034343698072563240827019811, + 21888242871839275222246405745257275088548364400416034343698191944704076137020, + 21888242871839275222246405745257275088548364400416034343698135065316435054564, + 21888242871839275222246405745257275088548364400416034343698181691888004606466, + 21888242871839275222246405745257275088548364400416034343698144559348823616479, + 21888242871839275222246405745257275088548364400416034343698200035702835750210, + 45083220682383317, + 21888242871839275222246405745257275088548364400416034343698123664429041125996, + 136870026362890155, + 33348507888471678, + 102441600829798323, + 140064682406968762, + 44108851301981632, + 21888242871839275222246405745257275088548364400416034343698085580713049154281, + 117801775522543645, + 65697128768872731, + 21888242871839275222246405745257275088548364400416034343698123884250086260654, + 109831127101407680, + 21888242871839275222246405745257275088548364400416034343698193008760632346350, + 21888242871839275222246405745257275088548364400416034343698134669810271094687, + 21888242871839275222246405745257275088548364400416034343698137786449476570477, + 21888242871839275222246405745257275088548364400416034343698197474457835098221, + 111648785424563050, + 58510696302843586, + 21888242871839275222246405745257275088548364400416034343698150190400035556739, + 81783940762640329, + 21888242871839275222246405745257275088548364400416034343698158507680073645455, + 21888242871839275222246405745257275088548364400416034343698197188578532987736, + 21888242871839275222246405745257275088548364400416034343698090545545978707888, + 21888242871839275222246405745257275088548364400416034343698163654115361265624, + 21888242871839275222246405745257275088548364400416034343698141034694472707634, + 125056555968814706, + 79782660714109653, + 73305836047521812, + 56651605280931008, + 137271409639151337, + 21888242871839275222246405745257275088548364400416034343698092158798254095332, + 21888242871839275222246405745257275088548364400416034343698087800655764012516, + 21888242871839275222246405745257275088548364400416034343698083858442611820825, + 21888242871839275222246405745257275088548364400416034343698124676320477524529, + 87606434829501748, + 21888242871839275222246405745257275088548364400416034343698098281076619509298, + 121038508746160735, + 21888242871839275222246405745257275088548364400416034343698060211597528392767, + 21888242871839275222246405745257275088548364400416034343698094983897376090449, + 21888242871839275222246405745257275088548364400416034343698087344200669544205, + 21888242871839275222246405745257275088548364400416034343698156474663644991375, + 776798178523479, + 3548950551241561, + 21888242871839275222246405745257275088548364400416034343698064296033584637564, + 11201906231020500, + 21888242871839275222246405745257275088548364400416034343698158641898043785958, + 88017089916018342, + 125203059233797989, + 21888242871839275222246405745257275088548364400416034343698111725333420467318, + 132548059663509403, + 21888242871839275222246405745257275088548364400416034343698100366061176696453, + 33307382256682689, + 9133252822933065, + 63294121445181953, + 71095252412280402, + 21888242871839275222246405745257275088548364400416034343698160621423918074600, + 18039869598565134, + 21888242871839275222246405745257275088548364400416034343698196604274926761687, + 21888242871839275222246405745257275088548364400416034343698117910076910498081, + 21888242871839275222246405745257275088548364400416034343698114666875824134471, + 21888242871839275222246405745257275088548364400416034343698178858734419138168, + 21888242871839275222246405745257275088548364400416034343698061926058924475866, + 34179587318021919, + 21888242871839275222246405745257275088548364400416034343698145911969447478022, + 348551261763683, + 57956414589769651, + 5249944233720110, + 21888242871839275222246405745257275088548364400416034343698154473996404537064, + 21888242871839275222246405745257275088548364400416034343698115895170852119734, + 21888242871839275222246405745257275088548364400416034343698111391659610362636, + 1428328863495628, + 120430025221764178, + 79890905052357270, + 48179102282123264, + 21888242871839275222246405745257275088548364400416034343698177409807432903710, + 21979299517575628, + 57836514294984851, + 21888242871839275222246405745257275088548364400416034343698136670337137522453, + 21888242871839275222246405745257275088548364400416034343698096229425985782939, + 21888242871839275222246405745257275088548364400416034343698134943815508797896, + 40645312779908599, + 82672082029866045, + 25248841325786667, + 85098487127690221, + 21888242871839275222246405745257275088548364400416034343698156773772480468263, + 21888242871839275222246405745257275088548364400416034343698080528180883302311, + 9942749791925643, + 21888242871839275222246405745257275088548364400416034343698074716512711853954, + 21888242871839275222246405745257275088548364400416034343698130451192881754494, + 21888242871839275222246405745257275088548364400416034343698120600177240753672, + 21888242871839275222246405745257275088548364400416034343698125156418456620678, + 21888242871839275222246405745257275088548364400416034343698081471325469441937, + 135137337866901270, + 21888242871839275222246405745257275088548364400416034343698082359845842273704, + 21888242871839275222246405745257275088548364400416034343698126790875444857107, + 21888242871839275222246405745257275088548364400416034343698160200970872800350, + 35166786186234300, + 21888242871839275222246405745257275088548364400416034343698168319468279544826, + 99539119000854371, + 21888242871839275222246405745257275088548364400416034343698169232731137925303, + 21888242871839275222246405745257275088548364400416034343698117049069800504235, + 43863307284868688, + 21888242871839275222246405745257275088548364400416034343698161970930194519997, + 21888242871839275222246405745257275088548364400416034343698195285845404993523, + 21888242871839275222246405745257275088548364400416034343698161686523876053184, + 21888242871839275222246405745257275088548364400416034343698190904141330180303, + 46061716459214925, + 23429435526849339, + 143572365612261047, + 34362161077520361, + 142168162602600395, + 21888242871839275222246405745257275088548364400416034343698203636336348623824, + 112818972712327641, + 42364276122832291, + 21888242871839275222246405745257275088548364400416034343698133862779874406626, + 83059993982213636, + 21888242871839275222246405745257275088548364400416034343698163838620041163313, + 21888242871839275222246405745257275088548364400416034343698189080434871321258, + 21888242871839275222246405745257275088548364400416034343698134829940428502908, + 59424330363573822, + 7085607205355315, + 21888242871839275222246405745257275088548364400416034343698134796666216517049, + 21888242871839275222246405745257275088548364400416034343698159481979242446914, + 97586108245877092, + 2649626189502520, + 90248251837642583, + 21888242871839275222246405745257275088548364400416034343698202333726594372360, + 21888242871839275222246405745257275088548364400416034343698182144429655063844, + 21888242871839275222246405745257275088548364400416034343698203259314570302559, + 21888242871839275222246405745257275088548364400416034343698170558965625913263, + 126128471219249104, + 21888242871839275222246405745257275088548364400416034343698170339424886056173, + 94890797487950333, + 106432959503609096, + 56882615378996302, + 21888242871839275222246405745257275088548364400416034343698189639042461017207, + 139591720177698264, + 54738210421004016, + 14523192717617396, + 21888242871839275222246405745257275088548364400416034343698131511664443689326, + 96196357452587515, + 98249226101329464, + 21888242871839275222246405745257275088548364400416034343698104095517683546716, + 21888242871839275222246405745257275088548364400416034343698144737019134298416, + 138021948462306630, + 55695124691628782, + 127642187870117256, + 84518840204520325, + 107600245766391901, + 21888242871839275222246405745257275088548364400416034343698140820783234397785, + 90017353792353331, + 21888242871839275222246405745257275088548364400416034343698092429387125453634, + 102687293985846389, + 73424447887195229, + 21888242871839275222246405745257275088548364400416034343698096358725907171212, + 3324629511754972, + 21888242871839275222246405745257275088548364400416034343698153578918728794572, + 92481965303218391, + 48152400836131997, + 109180700378982401, + 21888242871839275222246405745257275088548364400416034343698063070906472644655, + 21888242871839275222246405745257275088548364400416034343698082404944010103781, + 88772778368577551, + 46330712056872363, + 21888242871839275222246405745257275088548364400416034343698122621442139298431, + 18677210686145262, + 29190783460981237, + 89313853352722702, + 98217502290133229, + 39563959877864410, + 21888242871839275222246405745257275088548364400416034343698144194336751988430, + 21888242871839275222246405745257275088548364400416034343698098064902436564218, + 21888242871839275222246405745257275088548364400416034343698173300763166223507, + 21888242871839275222246405745257275088548364400416034343698167939839147757795, + 47661261609258453, + 63677163148371228, + 128764260677738944, + 21888242871839275222246405745257275088548364400416034343698062240901530693068, + 21888242871839275222246405745257275088548364400416034343698083443150807347388, + 141051199637011529, + 66454145781277755, + 21888242871839275222246405745257275088548364400416034343698116748609915421848, + 21888242871839275222246405745257275088548364400416034343698190106579032404850, + 21888242871839275222246405745257275088548364400416034343698193065858766403685, + 72516313153567365, + 21888242871839275222246405745257275088548364400416034343698062439967635001407, + 80398082946650463, + 21888242871839275222246405745257275088548364400416034343698137466365117834170, + 21888242871839275222246405745257275088548364400416034343698150594504676353087, + 21888242871839275222246405745257275088548364400416034343698078329604993504301, + 16264112987207197, + 21888242871839275222246405745257275088548364400416034343698074435601996482553, + 129625985631575232, + 21888242871839275222246405745257275088548364400416034343698184522658683994243, + 138084051909340071, + 21888242871839275222246405745257275088548364400416034343698161284320410684339, + 21888242871839275222246405745257275088548364400416034343698164093813712905085, + 21888242871839275222246405745257275088548364400416034343698120384694565425265, + 122333045840707170, + 42123248275370668, + 21888242871839275222246405745257275088548364400416034343698120357715699071334, + 140999714575568311, + 26300233202135872, + 21888242871839275222246405745257275088548364400416034343698146398517738552587, + 21888242871839275222246405745257275088548364400416034343698128576272318866660, + 33434675718293973, + 21888242871839275222246405745257275088548364400416034343698134861886572777047, + 101392056588535767, + 21888242871839275222246405745257275088548364400416034343698092555296362628011, + 11807333416885800, + 59267126140422234, + 54112611091394433, + 119147066124984144, + 21888242871839275222246405745257275088548364400416034343698107271400892207355, + 30413276326563762, + 21888242871839275222246405745257275088548364400416034343698169201690152739544, + 5030591612355106, + 93021264752899183, + 21888242871839275222246405745257275088548364400416034343698188318274443728583, + 7976234025172287, + 119740160484211190, + 106189051975009057, + 41426121694963542, + 96763850972632444, + 21888242871839275222246405745257275088548364400416034343698128778760808636151, + 21888242871839275222246405745257275088548364400416034343698083069410902643456, + 29936754507341113, + 21888242871839275222246405745257275088548364400416034343698189921985060133506, + 78601460531838562, + 39556983349230144, + 91334237350675223, + 21888242871839275222246405745257275088548364400416034343698082322605144601218, + 112365018247693113, + 97171913730454661, + 21888242871839275222246405745257275088548364400416034343698156542013635538491, + 21888242871839275222246405745257275088548364400416034343698159915028204327833, + 21888242871839275222246405745257275088548364400416034343698181141469546277026, + 21888242871839275222246405745257275088548364400416034343698197567035364712848, + 80117096069882970, + 21888242871839275222246405745257275088548364400416034343698105288659033217665, + 87279510818233494, + 21888242871839275222246405745257275088548364400416034343698119887569541319757, + 21888242871839275222246405745257275088548364400416034343698100961888200635439, + 48110499845321644, + 21888242871839275222246405745257275088548364400416034343698192491549178025831, + 62944843723665391, + 93596518262361959, + 21888242871839275222246405745257275088548364400416034343698166004383807198032, + 21888242871839275222246405745257275088548364400416034343698183114137938607375, + 88932805991209533, + 21888242871839275222246405745257275088548364400416034343698158324513753876120, + 40361624846959475, + 21888242871839275222246405745257275088548364400416034343698126401430759835862, + 133576251546447748, + 21888242871839275222246405745257275088548364400416034343698106606034789005154, + 80395504479892717, + 85956638935903647, + 69133039647345594, + 21888242871839275222246405745257275088548364400416034343698061876998757235147, + 26158942122613478, + 21888242871839275222246405745257275088548364400416034343698110530198323144243, + 21888242871839275222246405745257275088548364400416034343698134621480126914397, + 32429541777794719, + 21888242871839275222246405745257275088548364400416034343698189581809287002631, + 51431911298320344, + 129093291148570112, + 65992124346030014, + 103676873909580985, + 41849400117458792, + 21888242871839275222246405745257275088548364400416034343698167953386897569984, + 21888242871839275222246405745257275088548364400416034343698087862643824735499, + 33955990177649175, + 21888242871839275222246405745257275088548364400416034343698096014238479261418, + 21888242871839275222246405745257275088548364400416034343698141519291821818769, + 21888242871839275222246405745257275088548364400416034343698136986974721997758, + 42040713258991159, + 21888242871839275222246405745257275088548364400416034343698098998267742140412, + 65999190643720597, + 48427250275238858, + 106914339796014228, + 21888242871839275222246405745257275088548364400416034343698105287766312684908, + 21888242871839275222246405745257275088548364400416034343698129757139076053556, + 67394627486763188, + 93926056788888515, + 21310506228796664, + 21888242871839275222246405745257275088548364400416034343698070083473578984929, + 21888242871839275222246405745257275088548364400416034343698115932513282497125, + 21888242871839275222246405745257275088548364400416034343698061047824251987023, + 29518485302787155, + 142905620030987936, + 21888242871839275222246405745257275088548364400416034343698110533938039126497, + 76421319284510959, + 21888242871839275222246405745257275088548364400416034343698105099885974277108, + 21888242871839275222246405745257275088548364400416034343698200994578656316411, + 107901936760833773, + 21888242871839275222246405745257275088548364400416034343698150144739384099348, + 143229891000321097, + 21888242871839275222246405745257275088548364400416034343698105686040751871794, + 21888242871839275222246405745257275088548364400416034343698067293590539567700, + 21888242871839275222246405745257275088548364400416034343698145961507787708917, + 21888242871839275222246405745257275088548364400416034343698128760721616464762, + 21888242871839275222246405745257275088548364400416034343698172856483124937648, + 44149963842926630, + 20595555982108502, + 44772632042014557, + 78467375778782474, + 29773663217168593, + 21888242871839275222246405745257275088548364400416034343698125623270369140415, + 91437542215767335, + 65351695776033617, + 100214260093642552, + 21888242871839275222246405745257275088548364400416034343698115220438250415846, + 21888242871839275222246405745257275088548364400416034343698096617154916156652, + 21888242871839275222246405745257275088548364400416034343698071921713219641253, + 22744229208102201, + 21888242871839275222246405745257275088548364400416034343698160338441934551659, + 85482045054541253, + 143012307333336955, + 41242898462971222, + 105455005877116801, + 21888242871839275222246405745257275088548364400416034343698177429602447705634, + 135737407332525576, + 118926176400426573, + 11500890517975860, + 21888242871839275222246405745257275088548364400416034343698073092536544072362, + 21888242871839275222246405745257275088548364400416034343698180906305607844606, + 21888242871839275222246405745257275088548364400416034343698170081422838966191, + 21888242871839275222246405745257275088548364400416034343698179674020881689441, + 66467925839632772, + 68250231389630175, + 102515199279803578, + 21888242871839275222246405745257275088548364400416034343698065775346937904645, + 10451775561404946, + 123486993369001272, + 11366656076527859, + 77289115347279429, + 68642245856131474, + 118334441152708885, + 109139902268298236, + 21888242871839275222246405745257275088548364400416034343698125956147354044950, + 59783426751429178, + 104457808916135057, + 21888242871839275222246405745257275088548364400416034343698093937121316222147, + 21888242871839275222246405745257275088548364400416034343698086656998707119885, + 21888242871839275222246405745257275088548364400416034343698132132189794381033, + 21888242871839275222246405745257275088548364400416034343698174353603610895588, + 21888242871839275222246405745257275088548364400416034343698177587148311105666, + 21888242871839275222246405745257275088548364400416034343698075210674613627861, + 122735443604874589, + 21888242871839275222246405745257275088548364400416034343698161374369699448407, + 21888242871839275222246405745257275088548364400416034343698081343642044717682, + 21888242871839275222246405745257275088548364400416034343698107028417433744443, + 120937395461628126, + 21888242871839275222246405745257275088548364400416034343698069169159084485288, + 15390619346266816, + 50083874161020508, + 21888242871839275222246405745257275088548364400416034343698115169864974448720, + 103786965123307065, + 109247380952998750, + 21888242871839275222246405745257275088548364400416034343698166730909954494632, + 111612991287738873, + 82178240489381640, + 3278745643897183, + 136167622250854504, + 21888242871839275222246405745257275088548364400416034343698122537262169596073, + 20583550491595273, + 21888242871839275222246405745257275088548364400416034343698170934765944903347, + 21888242871839275222246405745257275088548364400416034343698190280742686864729, + 105175732134964430, + 56395097877566021, + 104568124754684170, + 21888242871839275222246405745257275088548364400416034343698128701584043083206, + 21888242871839275222246405745257275088548364400416034343698109677150687546752, + 38156678012256832, + 21888242871839275222246405745257275088548364400416034343698171322617938090736, + 48869453796438015, + 116612213173917402, + 41374495177954856, + 21888242871839275222246405745257275088548364400416034343698185422441471412163, + 21888242871839275222246405745257275088548364400416034343698197633752024805185, + 106271779957502090, + 115114561936684003, + 21888242871839275222246405745257275088548364400416034343698171073961912224940, + 36877202443671233, + 49789524534446726, + 21888242871839275222246405745257275088548364400416034343698106022907245719838, + 78832730669335664, + 140009107332497081, + 21888242871839275222246405745257275088548364400416034343698120536067006700428, + 18089135971858837, + 51072111233373229, + 18161508737553696, + 84469160148255444, + 21888242871839275222246405745257275088548364400416034343698068005408019386656, + 110932331153255718, + 21888242871839275222246405745257275088548364400416034343698191203502686015263, + 21888242871839275222246405745257275088548364400416034343698196393596080075768, + 21888242871839275222246405745257275088548364400416034343698140873123356575425, + 49724968448802146, + 21888242871839275222246405745257275088548364400416034343698096820106362844866, + 128970755655143065, + 21888242871839275222246405745257275088548364400416034343698203934264358988129, + 21888242871839275222246405745257275088548364400416034343698202323813028989317, + 21888242871839275222246405745257275088548364400416034343698182730176466783632, + 10924323298335671, + 14839135635731305, + 121485664732063836, + 110482321754708671, + 21888242871839275222246405745257275088548364400416034343698164057626680993044, + 111294468641141686, + 89604670535357934, + 85312165770129642, + 21888242871839275222246405745257275088548364400416034343698073429950726230416, + 21888242871839275222246405745257275088548364400416034343698141066608055199196, + 63259688132176025, + 98749194920594601, + 21888242871839275222246405745257275088548364400416034343698065461422911778458, + 7720170256277339, + 115506694250116168, + 115074481285254804, + 30616409631275146, + 21888242871839275222246405745257275088548364400416034343698152594323281953117, + 21888242871839275222246405745257275088548364400416034343698153198184412053884, + 18253935533692273, + 53891416128521234, + 78018045507077737, + 21888242871839275222246405745257275088548364400416034343698162230900078642744, + 21888242871839275222246405745257275088548364400416034343698116225357293626206, + 61924199007204934, + 50287368087165712, + 21888242871839275222246405745257275088548364400416034343698194732446116195108, + 21888242871839275222246405745257275088548364400416034343698079023948558240916, + 18260446321258085, + 4703100749927486, + 4256956162068751, + 21888242871839275222246405745257275088548364400416034343698165460962815963236, + 21888242871839275222246405745257275088548364400416034343698099456582791834914, + 21888242871839275222246405745257275088548364400416034343698104070743501109431, + 68757184936895740, + 92128717496034665, + 21888242871839275222246405745257275088548364400416034343698182739833109011127, + 125383812254244176, + 21888242871839275222246405745257275088548364400416034343698160369019585560765, + 21888242871839275222246405745257275088548364400416034343698134267649657132003, + 21888242871839275222246405745257275088548364400416034343698092881344430569812, + 130217481629656444, + 80925706115893569, + 30009251669949863, + 49150422548450053, + 21888242871839275222246405745257275088548364400416034343698084024792842672909, + 126958662087811094, + 21888242871839275222246405745257275088548364400416034343698093447744152821824, + 21888242871839275222246405745257275088548364400416034343698070044332118877250, + 21888242871839275222246405745257275088548364400416034343698183890487710423258, + 40334861875016992, + 16026250068434721, + 21888242871839275222246405745257275088548364400416034343698198881037764645070, + 27070653354826039, + 16301301709694782, + 9600313991629819, + 21888242871839275222246405745257275088548364400416034343698200608138612780593, + 20282792956547901, + 12299481893862905, + 72058363198344135, + 21888242871839275222246405745257275088548364400416034343698099025443240903199, + 44681877588953550, + 98896649575699036, + 21888242871839275222246405745257275088548364400416034343698079086301527294504, + 36673830968153156, + 21888242871839275222246405745257275088548364400416034343698110263960550573169, + 13463977867982519, + 21888242871839275222246405745257275088548364400416034343698117572524782608165, + 82457414507541729, + 21888242871839275222246405745257275088548364400416034343698188173655034810923, + 21888242871839275222246405745257275088548364400416034343698127797783283661191, + 21888242871839275222246405745257275088548364400416034343698154914285458916467, + 21888242871839275222246405745257275088548364400416034343698130191386888839492, + 21888242871839275222246405745257275088548364400416034343698140606241985223729, + 21888242871839275222246405745257275088548364400416034343698185042887166510235, + 35309777920682712, + 58288162893823803, + 21888242871839275222246405745257275088548364400416034343698096355662838008356, + 21888242871839275222246405745257275088548364400416034343698183543115822483405, + 21888242871839275222246405745257275088548364400416034343698086170133129283124, + 17137623996360420, + 12415624704420527, + 21888242871839275222246405745257275088548364400416034343698088374683344262371, + 21888242871839275222246405745257275088548364400416034343698063116799013315668, + 21888242871839275222246405745257275088548364400416034343698179415095474964713, + 138661513309505648, + 59650145596277484, + 21888242871839275222246405745257275088548364400416034343698166627473996915906, + 6084569082999681, + 21888242871839275222246405745257275088548364400416034343698100389172983545687, + 86825169643320202, + 91130709397070035, + 79151484087550989, + 60921269797435000, + 101242348371639256, + 21888242871839275222246405745257275088548364400416034343698202813784898453011, + 17530965892848595, + 21888242871839275222246405745257275088548364400416034343698158585134497989535, + 120506379536124659, + 21888242871839275222246405745257275088548364400416034343698152148482643967042, + 17133365470617428, + 21888242871839275222246405745257275088548364400416034343698125066958614861817, + 72082128060531456, + 32760245705820719, + 11391326832274210, + 76975029359685604, + 100684390914774939, + 56860547568914526, + 49559383246261130, + 21888242871839275222246405745257275088548364400416034343698064853811510654187, + 21888242871839275222246405745257275088548364400416034343698137033300947817035, + 97543503846506036, + 13965258835076505, + 42758648002602016, + 21888242871839275222246405745257275088548364400416034343698080543761743523170, + 21888242871839275222246405745257275088548364400416034343698103555560957416679, + 94101435712397815, + 21276656153149951, + 26237220771954301, + 13860612573672794, + 137709238828568132, + 131207558002821628, + 32206255435045021, + 33593171578027071, + 43370095655178063, + 7784787151380671, + 21888242871839275222246405745257275088548364400416034343698092762231065126499, + 103112003328319577, + 113059815688852569, + 12337678831008729, + 127805237806679335, + 138356196913314570, + 21888242871839275222246405745257275088548364400416034343698105149127375379194, + 21888242871839275222246405745257275088548364400416034343698201056162893776509, + 21888242871839275222246405745257275088548364400416034343698067444806987987276, + 94270841182521017, + 103104849757544502, + 21888242871839275222246405745257275088548364400416034343698165845270822973991, + 21888242871839275222246405745257275088548364400416034343698109139018556065010, + 33156132742929372, + 21888242871839275222246405745257275088548364400416034343698062831644722695431, + 12261789189232117, + 21888242871839275222246405745257275088548364400416034343698083037304775665121, + 21888242871839275222246405745257275088548364400416034343698169274196788411244, + 21888242871839275222246405745257275088548364400416034343698071811193954572106, + 76209921791669565, + 21888242871839275222246405745257275088548364400416034343698127725219874142112, + 138572177416027684, + 21888242871839275222246405745257275088548364400416034343698107913790441875122, + 140990535562151977, + 54151448677149672, + 53758650559838589, + 21888242871839275222246405745257275088548364400416034343698096890365743865766, + 36090794134406194, + 21888242871839275222246405745257275088548364400416034343698196106342495965036, + 21888242871839275222246405745257275088548364400416034343698141850737741747543, + 79554223222099779, + 103206671827605483, + 109493061478121767, + 21888242871839275222246405745257275088548364400416034343698186044238143101809, + 21888242871839275222246405745257275088548364400416034343698189188012895580523, + 21888242871839275222246405745257275088548364400416034343698113585975473840324, + 39631025305024051, + 109025534574983577, + 88846693941242913, + 40763491144551192, + 111732317659847887, + 21888242871839275222246405745257275088548364400416034343698150005233283368887, + 21888242871839275222246405745257275088548364400416034343698080505475818783263, + 21888242871839275222246405745257275088548364400416034343698064025202420319665, + 24654508157318768, + 21888242871839275222246405745257275088548364400416034343698191249857212545619, + 21888242871839275222246405745257275088548364400416034343698127227286707268420, + 21888242871839275222246405745257275088548364400416034343698186650442068539878, + 21888242871839275222246405745257275088548364400416034343698064727815037515491, + 21888242871839275222246405745257275088548364400416034343698074330977943428891, + 21888242871839275222246405745257275088548364400416034343698185734184990360112, + 21888242871839275222246405745257275088548364400416034343698071138600898418915, + 21888242871839275222246405745257275088548364400416034343698180517315574869192, + 21888242871839275222246405745257275088548364400416034343698171568886048697753, + 124745700362090329, + 21888242871839275222246405745257275088548364400416034343698149504148008192974, + 141300861282709393, + 21888242871839275222246405745257275088548364400416034343698136616518598657732, + 21888242871839275222246405745257275088548364400416034343698084423823999616380, + 74606949917239455, + 21888242871839275222246405745257275088548364400416034343698200247866842532177, + 21888242871839275222246405745257275088548364400416034343698165190758499987140, + 70592694565778532, + 21888242871839275222246405745257275088548364400416034343698203042927316135897, + 21888242871839275222246405745257275088548364400416034343698168941989266435455, + 68089290934064737, + 25064974062201984, + 72231016824421240, + 21888242871839275222246405745257275088548364400416034343698169695126658973678, + 22099013977549652, + 21888242871839275222246405745257275088548364400416034343698135048961555454670, + 93355555199253014, + 34398742415289865, + 21888242871839275222246405745257275088548364400416034343698089342382283947366, + 63491267106509695, + 21888242871839275222246405745257275088548364400416034343698075332942730886564, + 10096580309217255, + 21888242871839275222246405745257275088548364400416034343698076965907914939544, + 21888242871839275222246405745257275088548364400416034343698090759966928532821, + 141969362880766105, + 21888242871839275222246405745257275088548364400416034343698200173230319002532, + 21888242871839275222246405745257275088548364400416034343698069520639530218827, + 26172134231812594, + 21888242871839275222246405745257275088548364400416034343698174553056151029390, + 1158035857752025, + 21888242871839275222246405745257275088548364400416034343698092307810798721085, + 56227403212294299, + 21888242871839275222246405745257275088548364400416034343698145431590909792990, + 45542136685163981, + 52553136646715389, + 21888242871839275222246405745257275088548364400416034343698082128540649000292, + 21888242871839275222246405745257275088548364400416034343698097531367555842260, + 21888242871839275222246405745257275088548364400416034343698200350909955698236, + 130558629993328049, + 124435085018416952, + 133250761644507849, + 21888242871839275222246405745257275088548364400416034343698062946181586344480, + 43537541563325394, + 21888242871839275222246405745257275088548364400416034343698124673202150164746, + 68992419460145596, + 21888242871839275222246405745257275088548364400416034343698105276814685258511, + 6883963310931279, + 122628511548998317, + 90914844758444375, + 15105604790927872, + 21888242871839275222246405745257275088548364400416034343698194770071091759015, + 21888242871839275222246405745257275088548364400416034343698099599458004619086, + 4374142361814927, + 21888242871839275222246405745257275088548364400416034343698089730024634159407, + 21888242871839275222246405745257275088548364400416034343698142505262253875848, + 21888242871839275222246405745257275088548364400416034343698128268790695429936, + 21888242871839275222246405745257275088548364400416034343698089677959553753934, + 107371854274778839, + 132162145813162041, + 21888242871839275222246405745257275088548364400416034343698121196352499985701, + 21888242871839275222246405745257275088548364400416034343698092191259280699964, + 126285455783372996, + 4051242873126175, + 21888242871839275222246405745257275088548364400416034343698146900365467898102, + 9016850849283287, + 21888242871839275222246405745257275088548364400416034343698072842747722738764, + 18908335777211591, + 87152009679131329, + 21888242871839275222246405745257275088548364400416034343698113209988586555398, + 21888242871839275222246405745257275088548364400416034343698141413072531171595, + 21888242871839275222246405745257275088548364400416034343698067481226959111509, + 55536141580944606, + 123048146822195590, + 123263441103808007, + 21888242871839275222246405745257275088548364400416034343698147530718996820108, + 95076173842569885, + 77042222886246705, + 72668318026171739, + 21888242871839275222246405745257275088548364400416034343698122905014060945809, + 57495613083684895, + 21888242871839275222246405745257275088548364400416034343698096269576622118245, + 28510662378660378, + 21888242871839275222246405745257275088548364400416034343698173667284460500503, + 90322962058372681, + 21888242871839275222246405745257275088548364400416034343698063363438301964808, + 46440931969793025, + 35326882487189972, + 21888242871839275222246405745257275088548364400416034343698183971903290857900, + 107284508564099815, + 37895115175555624, + 21888242871839275222246405745257275088548364400416034343698067452165859939504, + 21888242871839275222246405745257275088548364400416034343698115933409825157645, + 120900779504269214, + 88678767746668743, + 21888242871839275222246405745257275088548364400416034343698077707539874591754, + 135315626997884090, + 21888242871839275222246405745257275088548364400416034343698181130078542590582, + 21888242871839275222246405745257275088548364400416034343698141858351060666210, + 102083336878617684, + 21888242871839275222246405745257275088548364400416034343698143010247792492460, + 21888242871839275222246405745257275088548364400416034343698120144556361307152, + 21888242871839275222246405745257275088548364400416034343698076045397462819519, + 105962699614610677, + 21888242871839275222246405745257275088548364400416034343698110454163512692128, + 21888242871839275222246405745257275088548364400416034343698155428813760583755, + 92803592499158047, + 87891909868771070, + 21888242871839275222246405745257275088548364400416034343698154164776655499413, + 97702039972053862, + 87003805378137334, + 77462138942525952, + 21888242871839275222246405745257275088548364400416034343698113110247480574175, + 21888242871839275222246405745257275088548364400416034343698091653893795647102, + 21888242871839275222246405745257275088548364400416034343698064350569627943767, + 88861555978912275, + 21888242871839275222246405745257275088548364400416034343698130016463534202648, + 63488756071093387, + 106056209503645679, + 75301380293081153, + 61615223345330850, + 35552244410988681, + 21888242871839275222246405745257275088548364400416034343698116979919225693141, + 21888242871839275222246405745257275088548364400416034343698151360888264382942, + 21888242871839275222246405745257275088548364400416034343698164687557030743132, + 78665259158550511, + 21888242871839275222246405745257275088548364400416034343698199526822442743722, + 21888242871839275222246405745257275088548364400416034343698159462516421286821, + 9318222563717043, + 117799202554732675, + 21888242871839275222246405745257275088548364400416034343698160952731022267911, + 21888242871839275222246405745257275088548364400416034343698197150528820810470, + 21888242871839275222246405745257275088548364400416034343698185607346765634236, + 135682468390678759, + 94024128191022169, + 27458727951974516, + 21888242871839275222246405745257275088548364400416034343698125818589561059932, + 106195898109474248, + 21888242871839275222246405745257275088548364400416034343698122632952422284515, + 44451703145187911, + 12458679236060237, + 57327169021007623, + 21888242871839275222246405745257275088548364400416034343698173690831178593740, + 35336816740995283, + 8612982155990657, + 21888242871839275222246405745257275088548364400416034343698118623238827106927, + 134835693795624684, + 39801767677809103, + 39296565890176989, + 26451829184809908, + 21888242871839275222246405745257275088548364400416034343698164794494541771463, + 21888242871839275222246405745257275088548364400416034343698120469968841357959, + 21888242871839275222246405745257275088548364400416034343698144804463801207115, + 21888242871839275222246405745257275088548364400416034343698202831419096783831, + 21888242871839275222246405745257275088548364400416034343698090761603705612470, + 21888242871839275222246405745257275088548364400416034343698103526023244510815, + 21888242871839275222246405745257275088548364400416034343698064367565823951269, + 21888242871839275222246405745257275088548364400416034343698166707303072854328, + 137122228015776380, + 23239677799372737, + 21888242871839275222246405745257275088548364400416034343698120327224382582277, + 21888242871839275222246405745257275088548364400416034343698125540561976201368, + 21888242871839275222246405745257275088548364400416034343698178372653292394645, + 21888242871839275222246405745257275088548364400416034343698145399929033137659, + 21888242871839275222246405745257275088548364400416034343698081006421746903137, + 21888242871839275222246405745257275088548364400416034343698124345810582583987, + 77773431518069280, + 21888242871839275222246405745257275088548364400416034343698192071392226937567, + 77573527959053653, + 21888242871839275222246405745257275088548364400416034343698157639313721171000, + 21888242871839275222246405745257275088548364400416034343698090066189702015739, + 108125948429827431, + 35768666157422749, + 21888242871839275222246405745257275088548364400416034343698196171995411116543, + 21888242871839275222246405745257275088548364400416034343698103390396146721234, + 6571682797894476, + 21888242871839275222246405745257275088548364400416034343698117446006164530600, + 21888242871839275222246405745257275088548364400416034343698164008483187474782, + 21888242871839275222246405745257275088548364400416034343698190744581956311407, + 21888242871839275222246405745257275088548364400416034343698184081268666900559, + 21888242871839275222246405745257275088548364400416034343698129801795613952006, + 21888242871839275222246405745257275088548364400416034343698067040149384439844, + 111227030166090281, + 32130441879151937, + 24292327693428805, + 21888242871839275222246405745257275088548364400416034343698145651311210942113, + 21888242871839275222246405745257275088548364400416034343698154789984005566941, + 21888242871839275222246405745257275088548364400416034343698094425660482441629, + 95878107666282901, + 104030121274543337, + 21888242871839275222246405745257275088548364400416034343698113278245005845378, + 32229445533594821, + 58112244341627401, + 27116639179513801, + 99878455490525867, + 21888242871839275222246405745257275088548364400416034343698114744567475435478, + 21888242871839275222246405745257275088548364400416034343698146355378736667131, + 139831322528112655, + 117420429247488415, + 21888242871839275222246405745257275088548364400416034343698168812966023249520, + 21888242871839275222246405745257275088548364400416034343698126663569255962712, + 21888242871839275222246405745257275088548364400416034343698186240001113852896, + 21888242871839275222246405745257275088548364400416034343698201931962312423290, + 21888242871839275222246405745257275088548364400416034343698127842569414099151, + 21888242871839275222246405745257275088548364400416034343698191298073895837649, + 21888242871839275222246405745257275088548364400416034343698070007459651344170, + 131932523096388794, + 21888242871839275222246405745257275088548364400416034343698108593664054961080, + 21888242871839275222246405745257275088548364400416034343698067236968056227438, + 27241510374949116, + 113521632649704788, + 62433588071516942, + 120277305983050921, + 140650228273485082, + 69806978386552707, + 21888242871839275222246405745257275088548364400416034343698144768442930345522, + 21888242871839275222246405745257275088548364400416034343698140301076548243678, + 21888242871839275222246405745257275088548364400416034343698137445831593112632, + 96963348756146944, + 21888242871839275222246405745257275088548364400416034343698201998256734819958, + 135292141573726137, + 40923583604225236, + 21888242871839275222246405745257275088548364400416034343698111653520207382738, + 133868207896351775, + 21888242871839275222246405745257275088548364400416034343698108468240005361636, + 21888242871839275222246405745257275088548364400416034343698161997178588566980, + 21888242871839275222246405745257275088548364400416034343698193806654281691380, + 21888242871839275222246405745257275088548364400416034343698193860516411459913, + 21888242871839275222246405745257275088548364400416034343698184201705012885447, + 21888242871839275222246405745257275088548364400416034343698120764520935233515, + 21888242871839275222246405745257275088548364400416034343698110392140424964961, + 61653661605617535, + 21888242871839275222246405745257275088548364400416034343698173708284078785245, + 21888242871839275222246405745257275088548364400416034343698097390185295039579, + 21888242871839275222246405745257275088548364400416034343698140496260892532785, + 21888242871839275222246405745257275088548364400416034343698113133719412238175, + 79003134369869594, + 39948957786155062, + 36751374224975452, + 21888242871839275222246405745257275088548364400416034343698073291587583490867, + 21888242871839275222246405745257275088548364400416034343698101518317796600612, + 21888242871839275222246405745257275088548364400416034343698188699258871378738, + 88177914927838752, + 117447959114808256, + 21888242871839275222246405745257275088548364400416034343698070374164027103766, + 21888242871839275222246405745257275088548364400416034343698186727126227213874, + 21888242871839275222246405745257275088548364400416034343698091374732129567825, + 21888242871839275222246405745257275088548364400416034343698152966864690189616, + 116635572229175303, + 98447449630710797, + 46656442574656924, + 47714111003466393, + 21888242871839275222246405745257275088548364400416034343698088074580350251955, + 29399001118431685, + 21888242871839275222246405745257275088548364400416034343698118817603136508080, + 21888242871839275222246405745257275088548364400416034343698095172916820464752, + 102124691986744326, + 130730608706561037, + 21888242871839275222246405745257275088548364400416034343698074584480684445336, + 80988517225560372, + 21888242871839275222246405745257275088548364400416034343698119059756527324626, + 114548086654452154, + 141852634784559398, + 21888242871839275222246405745257275088548364400416034343698196311547523411253, + 6567417846658791, + 1143649316529182, + 21888242871839275222246405745257275088548364400416034343698072959614844898294, + 3253920142488028, + 14194370671210499, + 21888242871839275222246405745257275088548364400416034343698170743872456387534, + 128077770231179536, + 143179063173307112, + 21888242871839275222246405745257275088548364400416034343698176542485866489713, + 21888242871839275222246405745257275088548364400416034343698105112224569358550, + 21888242871839275222246405745257275088548364400416034343698164160824790015358, + 77999807303612798, + 27773178803689316, + 21888242871839275222246405745257275088548364400416034343698194678376330459685, + 389643268896135, + 21888242871839275222246405745257275088548364400416034343698113822564356502700, + 104885943313500142, + 21686010744145236, + 21888242871839275222246405745257275088548364400416034343698183757114262866722, + 84923045325515633, + 86766275956514227, + 33791574437969504, + 21888242871839275222246405745257275088548364400416034343698124145723756878571, + 21888242871839275222246405745257275088548364400416034343698162561645270146820, + 21888242871839275222246405745257275088548364400416034343698164325617945931399, + 122304807500251437, + 12732192416372690, + 143047443669047951, + 21888242871839275222246405745257275088548364400416034343698115585828145132638, + 21888242871839275222246405745257275088548364400416034343698127468422284792176, + 14971780758759794, + 21888242871839275222246405745257275088548364400416034343698091176904070248949, + 21888242871839275222246405745257275088548364400416034343698191742165554340958, + 52633617967458133, + 21888242871839275222246405745257275088548364400416034343698101461023941644070, + 66947903741552884, + 110894475609692289, + 21888242871839275222246405745257275088548364400416034343698074140040804596001, + 21888242871839275222246405745257275088548364400416034343698088175827095414146, + 21888242871839275222246405745257275088548364400416034343698146187337773988515, + 21888242871839275222246405745257275088548364400416034343698166505876384247550, + 21888242871839275222246405745257275088548364400416034343698145452103482289047, + 21888242871839275222246405745257275088548364400416034343698060292603967410291, + 21888242871839275222246405745257275088548364400416034343698096154175707983189, + 112581874119421420, + 21888242871839275222246405745257275088548364400416034343698195897271813166620, + 21888242871839275222246405745257275088548364400416034343698106223210058768560, + 51456262223846170, + 21888242871839275222246405745257275088548364400416034343698122415837293752251, + 10958376453674095, + 58685024373044019, + 52541525827553389, + 21888242871839275222246405745257275088548364400416034343698117994274324955775, + 21888242871839275222246405745257275088548364400416034343698064723355325230529, + 21888242871839275222246405745257275088548364400416034343698110828370510784093, + 33158160160054911, + 21888242871839275222246405745257275088548364400416034343698062760854651262177, + 84788511004542347, + 21888242871839275222246405745257275088548364400416034343698168123375368833367, + 76656705761779072, + 56993728806077010, + 21888242871839275222246405745257275088548364400416034343698077208420236875925, + 21888242871839275222246405745257275088548364400416034343698189140175375927462, + 21888242871839275222246405745257275088548364400416034343698168767360513644400, + 5287286475946709, + 36344547849539849, + 21888242871839275222246405745257275088548364400416034343698065277311365410833, + 21888242871839275222246405745257275088548364400416034343698138558454354549006, + 33061581331950123, + 627172060765275, + 142319238817607709, + 54419362710458228, + 114291952435763286, + 33459541179631873, + 21888242871839275222246405745257275088548364400416034343698199342191284005756, + 21888242871839275222246405745257275088548364400416034343698082580806847285225, + 21888242871839275222246405745257275088548364400416034343698192962887106231954, + 21888242871839275222246405745257275088548364400416034343698133498816526158132, + 21888242871839275222246405745257275088548364400416034343698071057180250171453, + 93071381432717315, + 21203419608328928, + 104932453495121363, + 72569864881785871, + 134966302170350947, + 21888242871839275222246405745257275088548364400416034343698173212218807164389, + 49561796239597243, + 21888242871839275222246405745257275088548364400416034343698189420031718303608, + 21888242871839275222246405745257275088548364400416034343698193242501063057215, + 48686621116801802, + 21888242871839275222246405745257275088548364400416034343698091934443911467649, + 99835811543991905, + 51145244328158053, + 86932457360966244, + 122816234924218313, + 21888242871839275222246405745257275088548364400416034343698138182155509066212, + 40892211977771076, + 110641409727226633, + 21888242871839275222246405745257275088548364400416034343698153035200023950762, + 21888242871839275222246405745257275088548364400416034343698090504714213152570, + 100875676819931557, + 53884703409510890, + 878454995965502, + 21888242871839275222246405745257275088548364400416034343698126900188760081327, + 21888242871839275222246405745257275088548364400416034343698156615706759584900, + 21888242871839275222246405745257275088548364400416034343698143686848450876515, + 21888242871839275222246405745257275088548364400416034343698158071151452550470, + 74794095453483806, + 21888242871839275222246405745257275088548364400416034343698195220444339774086, + 48555586698306965, + 21888242871839275222246405745257275088548364400416034343698093284464509239392, + 21888242871839275222246405745257275088548364400416034343698087605471420837056, + 21888242871839275222246405745257275088548364400416034343698078575682279009978, + 21888242871839275222246405745257275088548364400416034343698066393205051354471, + 21888242871839275222246405745257275088548364400416034343698111723372458256433, + 21888242871839275222246405745257275088548364400416034343698180186510904258955, + 21888242871839275222246405745257275088548364400416034343698072146348214257469, + 88274211894552455, + 7934017963509140, + 108123455902128984, + 133212991929949891, + 21888242871839275222246405745257275088548364400416034343698200130706117470897, + 96650484117237688, + 97339384430178645, + 118809544011544259, + 21888242871839275222246405745257275088548364400416034343698135423799964179690, + 143860200308813898, + 63441692440029750, + 21888242871839275222246405745257275088548364400416034343698079682892005911017, + 21888242871839275222246405745257275088548364400416034343698066595858528096342, + 126428460446486980, + 21888242871839275222246405745257275088548364400416034343698120179657973515527, + 65973950334106794, + 121302788402339262, + 65078580134351309, + 21888242871839275222246405745257275088548364400416034343698113951968192764648, + 21888242871839275222246405745257275088548364400416034343698089615681661462741, + 111935250619883055, + 42857036451682441, + 21888242871839275222246405745257275088548364400416034343698133316732199994376, + 59994838274162128, + 21888242871839275222246405745257275088548364400416034343698204174735621072508, + 87136932480002665, + 72231709920303315, + 82094881082986194, + 128763939045965606, + 749852542416423, + 128224865276158156, + 21888242871839275222246405745257275088548364400416034343698181611881271278331, + 105949500182379798, + 21888242871839275222246405745257275088548364400416034343698067915367591071532, + 116650071099793203, + 29869207541992197, + 21888242871839275222246405745257275088548364400416034343698155794301103134595, + 54693550474726816, + 28787801800861253, + 66267952357472155, + 139956193944968453, + 17461466010078246, + 85598753190310138, + 134058714440989442, + 21888242871839275222246405745257275088548364400416034343698134015059019231383, + 57474167155185935, + 62333089275381610, + 41020058706295176, + 21888242871839275222246405745257275088548364400416034343698068908677216271094, + 84249962705857375, + 36833846067607165, + 99258812271836862, + 42575804448726718, + 21888242871839275222246405745257275088548364400416034343698116690715517309365, + 21888242871839275222246405745257275088548364400416034343698077756904075572492, + 120772283506403510, + 104934854033721413, + 83409152218979717, + 77647928256651708, + 21888242871839275222246405745257275088548364400416034343698101431498139309340, + 6639678303023515, + 21888242871839275222246405745257275088548364400416034343698146709813466443158, + 132436224303295964, + 21888242871839275222246405745257275088548364400416034343698104001571218225989, + 21888242871839275222246405745257275088548364400416034343698156837082228226466, + 21888242871839275222246405745257275088548364400416034343698142163926579588412, + 21888242871839275222246405745257275088548364400416034343698189644332685556378, + 21888242871839275222246405745257275088548364400416034343698082298922109410558, + 21888242871839275222246405745257275088548364400416034343698092906329488054008, + 21888242871839275222246405745257275088548364400416034343698114332505517597687, + 64767028134539530, + 4394201807394519, + 21888242871839275222246405745257275088548364400416034343698152169557261303538, + 133520536470102790, + 21888242871839275222246405745257275088548364400416034343698103427075821418232, + 21039759110772637, + 68027201818800055, + 21888242871839275222246405745257275088548364400416034343698079141407168725825, + 20648867996365285, + 58753413066961613, + 21888242871839275222246405745257275088548364400416034343698187916887193452434, + 21888242871839275222246405745257275088548364400416034343698076644830956187487, + 21888242871839275222246405745257275088548364400416034343698065719512477305693, + 21888242871839275222246405745257275088548364400416034343698071291619004452373, + 21888242871839275222246405745257275088548364400416034343698121691397268404537, + 135494601250190032, + 21888242871839275222246405745257275088548364400416034343698085733554554219754, + 21888242871839275222246405745257275088548364400416034343698185573959994073249, + 87760106561957808, + 21308830649585867, + 21888242871839275222246405745257275088548364400416034343698159916269519279934, + 21888242871839275222246405745257275088548364400416034343698167131428718649962, + 21888242871839275222246405745257275088548364400416034343698200565308878459678, + 59834287261394131, + 51761809979622675, + 36436202903641044, + 21888242871839275222246405745257275088548364400416034343698082970110923783796, + 21888242871839275222246405745257275088548364400416034343698075482002624745178, + 21888242871839275222246405745257275088548364400416034343698095296500805219962, + 21888242871839275222246405745257275088548364400416034343698062785333523263413, + 21888242871839275222246405745257275088548364400416034343698126930951183961819, + 89235290387841429, + 113380833955771130, + 21888242871839275222246405745257275088548364400416034343698090075964108000747, + 129687756714381080, + 43020823850561984, + 106841841661039616, + 98810547795126224, + 21888242871839275222246405745257275088548364400416034343698165741832780971570, + 20446168806114817, + 10996131019208578, + 21888242871839275222246405745257275088548364400416034343698202528594765041277, + 20091396224729147, + 89455220955262670, + 24288611048213151, + 21888242871839275222246405745257275088548364400416034343698081213636540734427, + 16180540986991626, + 116786833668769613, + 77782552271025532, + 108935442626582381, + 21888242871839275222246405745257275088548364400416034343698164128838926171009, + 21888242871839275222246405745257275088548364400416034343698097481783241171001, + 77903635590779337, + 21888242871839275222246405745257275088548364400416034343698116490452184625185, + 66244797136120010, + 132633829099777822, + 109752560803097708, + 21888242871839275222246405745257275088548364400416034343698060356018748793970, + 1278189135455019, + 21888242871839275222246405745257275088548364400416034343698111697874463502741, + 66252769903905526, + 57664693955952307, + 21888242871839275222246405745257275088548364400416034343698186701276585595476, + 21888242871839275222246405745257275088548364400416034343698105333391111741267, + 21888242871839275222246405745257275088548364400416034343698147624363645990379, + 21888242871839275222246405745257275088548364400416034343698158964170691832953, + 21888242871839275222246405745257275088548364400416034343698160782325846409081, + 87511049559044971, + 21888242871839275222246405745257275088548364400416034343698111373095613683206, + 21888242871839275222246405745257275088548364400416034343698060076204213810121, + 51124354936131224, + 43344503211507185, + 18648075348555082, + 40968422215689811, + 92738444684781003, + 137775563553106704, + 21888242871839275222246405745257275088548364400416034343698070739929044843107, + 21888242871839275222246405745257275088548364400416034343698063953633367783714, + 21888242871839275222246405745257275088548364400416034343698088028739500005328, + 21888242871839275222246405745257275088548364400416034343698148770987560353977, + 80246595338939189, + 21888242871839275222246405745257275088548364400416034343698145191629548435553, + 21888242871839275222246405745257275088548364400416034343698181907223274706249, + 21888242871839275222246405745257275088548364400416034343698128126211711941176, + 137257369623629069, + 100038827758735645, + 6581693373588693, + 21888242871839275222246405745257275088548364400416034343698135026256418801325, + 21888242871839275222246405745257275088548364400416034343698067773696609773446, + 64412494890587744, + 125439475283978585, + 21888242871839275222246405745257275088548364400416034343698187146884787739221, + 103614561227424435, + 4729874549015295, + 21888242871839275222246405745257275088548364400416034343698137419317324139333, + 31332692366968224, + 21888242871839275222246405745257275088548364400416034343698066566786989502064, + 21888242871839275222246405745257275088548364400416034343698089444965215914908, + 21888242871839275222246405745257275088548364400416034343698165209070320430823, + 26207372701572325, + 134217969765316341, + 57824878855404780, + 22101263569987166, + 119481244696290690, + 21888242871839275222246405745257275088548364400416034343698203422535035327951, + 21888242871839275222246405745257275088548364400416034343698147834616039890069, + 78876924661068004, + 21888242871839275222246405745257275088548364400416034343698116722719654252146, + 128838978598713258, + 21888242871839275222246405745257275088548364400416034343698179612706470948915, + 140403989609995267, + 21888242871839275222246405745257275088548364400416034343698073026248875133565, + 137959596515202831, + 21888242871839275222246405745257275088548364400416034343698088710474234521006, + 21888242871839275222246405745257275088548364400416034343698114201023587498291, + 39000374491304317, + 21888242871839275222246405745257275088548364400416034343698165336779358588745, + 21888242871839275222246405745257275088548364400416034343698122484748613928384, + 12974258731421639, + 62646700474244678, + 131309177844319115, + 21888242871839275222246405745257275088548364400416034343698109486452537912245, + 28837809748660509, + 21888242871839275222246405745257275088548364400416034343698089375209336163284, + 21888242871839275222246405745257275088548364400416034343698194205720542730228, + 36998829378156717, + 117332766254531731, + 84186847988944689, + 21888242871839275222246405745257275088548364400416034343698187044629865639122, + 21888242871839275222246405745257275088548364400416034343698156429704611396525, + 61378091926861835, + 48071108020790393, + 87750262350148088, + 104659513904754527, + 21888242871839275222246405745257275088548364400416034343698201813992950964123, + 9770635283149128, + 21888242871839275222246405745257275088548364400416034343698067942173973263066, + 21888242871839275222246405745257275088548364400416034343698178739138086910418, + 21888242871839275222246405745257275088548364400416034343698203816411565430769, + 21888242871839275222246405745257275088548364400416034343698172017859363198462, + 13986073950997312, + 21888242871839275222246405745257275088548364400416034343698192000860014385206, + 21888242871839275222246405745257275088548364400416034343698128437708973784506, + 111824789980899377, + 113286068366383967, + 143832269033189889, + 21888242871839275222246405745257275088548364400416034343698194978538097542179, + 106967631855879455, + 1141701359574171, + 31247072087450619, + 90837874201921137, + 21888242871839275222246405745257275088548364400416034343698190004378791010509, + 138102660912634562, + 21888242871839275222246405745257275088548364400416034343698187040620962732932, + 60602942374175797, + 22349137456575929, + 21888242871839275222246405745257275088548364400416034343698157999527669538396, + 86639503289836481, + 21888242871839275222246405745257275088548364400416034343698133077111176033355, + 21888242871839275222246405745257275088548364400416034343698189345429667542022, + 81932736237457144, + 21888242871839275222246405745257275088548364400416034343698124857883299612957, + 116258066988321807, + 21888242871839275222246405745257275088548364400416034343698176183489279242951, + 21888242871839275222246405745257275088548364400416034343698088985008268006064, + 104151499691313675, + 21888242871839275222246405745257275088548364400416034343698131090297692977335, + 21888242871839275222246405745257275088548364400416034343698140352682539173510, + 21888242871839275222246405745257275088548364400416034343698128898936986902322, + 21888242871839275222246405745257275088548364400416034343698175186854704586428, + 21888242871839275222246405745257275088548364400416034343698137054438327213139, + 21888242871839275222246405745257275088548364400416034343698162851353694260954, + 21888242871839275222246405745257275088548364400416034343698092203135200992814, + 47190412689481777, + 117917319874581946, + 111530824489286168, + 55658090298381357, + 21888242871839275222246405745257275088548364400416034343698082207605761333724, + 21888242871839275222246405745257275088548364400416034343698140046997100776733, + 144022261005802853, + 137486004536740536, + 21888242871839275222246405745257275088548364400416034343698134476145359631977, + 59681864986709038, + 75678014629175557, + 21888242871839275222246405745257275088548364400416034343698091919211575899317, + 34022028953901022, + 74645307054735040, + 21888242871839275222246405745257275088548364400416034343698066321481817403784, + 87337287182922465, + 21888242871839275222246405745257275088548364400416034343698151808895739653254, + 25719101050469168, + 75349174094331603, + 68310553171466902, + 29810574592411048, + 43387018285102070, + 57916008317764558, + 21888242871839275222246405745257275088548364400416034343698086644811347783721, + 21888242871839275222246405745257275088548364400416034343698185733738624862790, + 21888242871839275222246405745257275088548364400416034343698135161380838197265, + 21888242871839275222246405745257275088548364400416034343698125678926458122435, + 21888242871839275222246405745257275088548364400416034343698060772360738905262, + 43765082490914472, + 21888242871839275222246405745257275088548364400416034343698193510494137117132, + 22110103812791369, + 109969341197641931, + 21888242871839275222246405745257275088548364400416034343698089140963856964827, + 28660289864971282, + 127871496991026500, + 88113494485619893, + 65970429334951309, + 21888242871839275222246405745257275088548364400416034343698157963015469670647, + 21888242871839275222246405745257275088548364400416034343698163843341964894099, + 124297489831836073, + 21888242871839275222246405745257275088548364400416034343698148786632275089027, + 21888242871839275222246405745257275088548364400416034343698185026724982998565, + 104629127202451108, + 21888242871839275222246405745257275088548364400416034343698090788170215102538, + 120419348401376922, + 130170562668402063, + 13614247103884421, + 21888242871839275222246405745257275088548364400416034343698190138736376402349, + 21888242871839275222246405745257275088548364400416034343698072494706185024193, + 21888242871839275222246405745257275088548364400416034343698094861748513642308, + 114286328352026743, + 21888242871839275222246405745257275088548364400416034343698130824810010568697, + 21888242871839275222246405745257275088548364400416034343698182885695385677190, + 21888242871839275222246405745257275088548364400416034343698099766009140288117, + 94119237713128143, + 31080038402012318, + 32271420043266503, + 21888242871839275222246405745257275088548364400416034343698085353823444068991, + 21888242871839275222246405745257275088548364400416034343698119824102500185108, + 48743483651057971, + 21888242871839275222246405745257275088548364400416034343698082967261696200325, + 46814359590147079, + 21888242871839275222246405745257275088548364400416034343698170683012500010944, + 33870433921318702, + 133136724731657509, + 21888242871839275222246405745257275088548364400416034343698090544181712490809, + 31140056917650054, + 21888242871839275222246405745257275088548364400416034343698176900178892919184, + 21888242871839275222246405745257275088548364400416034343698074396749312695246, + 21888242871839275222246405745257275088548364400416034343698078541039055088931, + 21888242871839275222246405745257275088548364400416034343698136862467818394950, + 21888242871839275222246405745257275088548364400416034343698083340665870206182, + 21888242871839275222246405745257275088548364400416034343698120846259938382567, + 21888242871839275222246405745257275088548364400416034343698151438804211559395, + 21888242871839275222246405745257275088548364400416034343698093648971463228876, + 48438768546375283, + 21888242871839275222246405745257275088548364400416034343698164815333038096077, + 137952311481338302, + 39522280896950658, + 21888242871839275222246405745257275088548364400416034343698143878291329994170, + 120442427528321427, + 2118505589866274, + 21888242871839275222246405745257275088548364400416034343698066696835480338475, + 45875364318376896, + 96217374029066894, + 65734393507195015, + 124034914381239533, + 78985610862209135, + 21888242871839275222246405745257275088548364400416034343698127028295136238496, + 41738644964949431, + 137017359595080360, + 35246813965477355, + 21888242871839275222246405745257275088548364400416034343698197326051945342110, + 120412184734762753, + 21888242871839275222246405745257275088548364400416034343698128309431194511851, + 21888242871839275222246405745257275088548364400416034343698181197229521292670, + 56534056284186933, + 21888242871839275222246405745257275088548364400416034343698061420535344024502, + 114307255413368311, + 21888242871839275222246405745257275088548364400416034343698140916135538142084, + 21888242871839275222246405745257275088548364400416034343698163218853106981978, + 64039282525864224, + 21888242871839275222246405745257275088548364400416034343698099061544706771268, + 21888242871839275222246405745257275088548364400416034343698128386602886358917, + 21888242871839275222246405745257275088548364400416034343698175263946142596860, + 21888242871839275222246405745257275088548364400416034343698112030122581983945, + 43494215892971692, + 93734343453783436, + 21888242871839275222246405745257275088548364400416034343698140875107395306830, + 21888242871839275222246405745257275088548364400416034343698201385429597507744, + 21562915863233155, + 90475967217824272, + 21888242871839275222246405745257275088548364400416034343698083857572119862711, + 21888242871839275222246405745257275088548364400416034343698115160710621978850, + 21888242871839275222246405745257275088548364400416034343698065433487935544326, + 21888242871839275222246405745257275088548364400416034343698154648241521821018, + 21888242871839275222246405745257275088548364400416034343698144018472036494813, + 21888242871839275222246405745257275088548364400416034343698117138246388093332, + 21888242871839275222246405745257275088548364400416034343698136679970029229513, + 33603430225563059, + 18236198069482814, + 126732925140861367, + 130299607207247241, + 21888242871839275222246405745257275088548364400416034343698065266039863134600, + 21888242871839275222246405745257275088548364400416034343698067505209117379134, + 14781756506327708, + 21888242871839275222246405745257275088548364400416034343698110816032871707196, + 131951453091597867, + 21888242871839275222246405745257275088548364400416034343698114419524527685828, + 21888242871839275222246405745257275088548364400416034343698100359669608270102, + 45243300827587889, + 21888242871839275222246405745257275088548364400416034343698082138144341297954, + 21888242871839275222246405745257275088548364400416034343698107793829402709503, + 107727820686965798, + 21888242871839275222246405745257275088548364400416034343698075217883388794406, + 21888242871839275222246405745257275088548364400416034343698173763604322128124, + 59355077025063676, + 53563467765759895, + 80006840551014253, + 24112429558081072, + 21888242871839275222246405745257275088548364400416034343698066370596740586635, + 21888242871839275222246405745257275088548364400416034343698198428966481741506, + 21888242871839275222246405745257275088548364400416034343698126915731430128814, + 21888242871839275222246405745257275088548364400416034343698103735516966888905, + 38254422230868643, + 21888242871839275222246405745257275088548364400416034343698181125185771371951, + 30846296623501477, + 3948354905198026, + 33353583717371373, + 20388143934867031, + 141632462260481703, + 21888242871839275222246405745257275088548364400416034343698083457872629391824, + 129026006300698460, + 133390548308571804, + 21888242871839275222246405745257275088548364400416034343698190159259784183076, + 21888242871839275222246405745257275088548364400416034343698200137154476089503, + 21888242871839275222246405745257275088548364400416034343698146148890305116123, + 21888242871839275222246405745257275088548364400416034343698142104739849054744, + 21888242871839275222246405745257275088548364400416034343698108315833779717873, + 21888242871839275222246405745257275088548364400416034343698060805258965321344, + 80127310771162128, + 21888242871839275222246405745257275088548364400416034343698088302566108376042, + 103424353861772585, + 21888242871839275222246405745257275088548364400416034343698193950471150033475, + 66089130160926513, + 104234201684463750, + 21888242871839275222246405745257275088548364400416034343698138873406819849884, + 23933203917770557, + 21888242871839275222246405745257275088548364400416034343698078278562880043160, + 21888242871839275222246405745257275088548364400416034343698096695258951135078, + 21888242871839275222246405745257275088548364400416034343698103187508451106158, + 21888242871839275222246405745257275088548364400416034343698166018108127115385, + 21888242871839275222246405745257275088548364400416034343698184455763887940839, + 46539389717563259, + 21888242871839275222246405745257275088548364400416034343698061149308605051466, + 143594084663636796, + 21888242871839275222246405745257275088548364400416034343698103468559195492082, + 21888242871839275222246405745257275088548364400416034343698167133984327978902, + 5302557222389471, + 21888242871839275222246405745257275088548364400416034343698110740473891846000, + 114754037414921617, + 113469470408934001, + 143904727106790904, + 21888242871839275222246405745257275088548364400416034343698130400337823483168, + 50577992992679150, + 138756291751775458, + 21888242871839275222246405745257275088548364400416034343698136433138798856312, + 21888242871839275222246405745257275088548364400416034343698118929509188795023, + 128360576880795692, + 91633896606933388, + 61431304899373018, + 46504696341144944, + 21888242871839275222246405745257275088548364400416034343698133805515561840755, + 15978479319669676, + 21888242871839275222246405745257275088548364400416034343698086238467712985588, + 47157731748533711, + 21888242871839275222246405745257275088548364400416034343698188040136446776792, + 21888242871839275222246405745257275088548364400416034343698084045672069549925, + 21888242871839275222246405745257275088548364400416034343698065735313500143527, + 21888242871839275222246405745257275088548364400416034343698096772870006355180, + 21888242871839275222246405745257275088548364400416034343698087895727659696365, + 21888242871839275222246405745257275088548364400416034343698154242387411501805, + 21888242871839275222246405745257275088548364400416034343698188479379715946241, + 108268988384503417, + 21888242871839275222246405745257275088548364400416034343698195956910577384555, + 21888242871839275222246405745257275088548364400416034343698062336836979233111, + 5028509942296752, + 21888242871839275222246405745257275088548364400416034343698197101689555309153, + 21888242871839275222246405745257275088548364400416034343698106275310158014870, + 21888242871839275222246405745257275088548364400416034343698073852721397305317, + 75424010982198782, + 21888242871839275222246405745257275088548364400416034343698172671583403689756, + 142664972267302538, + 89982172404781059, + 21888242871839275222246405745257275088548364400416034343698150330258505727250, + 21888242871839275222246405745257275088548364400416034343698107172508739010951, + 21888242871839275222246405745257275088548364400416034343698146702674107198043, + 6536636679856311, + 46765143407291767, + 21888242871839275222246405745257275088548364400416034343698181091173509859303, + 64529193990675396, + 61965785388259661, + 53708809642772855, + 21888242871839275222246405745257275088548364400416034343698157287204699734505, + 21888242871839275222246405745257275088548364400416034343698120076396934608848, + 17729288221848951, + 3109512063858591, + 114786600588612933, + 37241982474085647, + 21888242871839275222246405745257275088548364400416034343698084191661375587377, + 21888242871839275222246405745257275088548364400416034343698092712813576892637, + 21888242871839275222246405745257275088548364400416034343698159741027029124796, + 21888242871839275222246405745257275088548364400416034343698109997822995767201, + 2282004389434169, + 25475940253579588, + 24841520961581598, + 21888242871839275222246405745257275088548364400416034343698142145571743284687, + 10234948543602280, + 21888242871839275222246405745257275088548364400416034343698195147674799671982, + 21888242871839275222246405745257275088548364400416034343698123329173091422197, + 13439955434491200, + 21888242871839275222246405745257275088548364400416034343698195349183663815431, + 21888242871839275222246405745257275088548364400416034343698174928160228543341, + 21888242871839275222246405745257275088548364400416034343698190586510345949049, + 29134566562306409, + 100155149340788985, + 98062735107392557, + 21888242871839275222246405745257275088548364400416034343698188624626821084504, + 21888242871839275222246405745257275088548364400416034343698112876686851235525, + 13276547064706051, + 2732414418674981, + 21888242871839275222246405745257275088548364400416034343698166844782972976427, + 82475730705526146, + 111196528372820655, + 127812230109041659, + 21888242871839275222246405745257275088548364400416034343698166804896246577925, + 52518713613032734, + 90269448888896827, + 59522424526174411, + 53795017630709942, + 58148968610370902, + 72276942950489931, + 71027033249760352, + 99473633797477965, + 37851978301792122, + 48580664033783022, + 21888242871839275222246405745257275088548364400416034343698093511782074011370, + 128146099079320127, + 108693775944948587, + 21888242871839275222246405745257275088548364400416034343698078838998402045482, + 21888242871839275222246405745257275088548364400416034343698191467562112839367, + 21945647332906062, + 93454486290250607, + 21888242871839275222246405745257275088548364400416034343698172525154430089907, + 21888242871839275222246405745257275088548364400416034343698132018844566807666, + 21888242871839275222246405745257275088548364400416034343698200552683440741409, + 21888242871839275222246405745257275088548364400416034343698151864424918690621, + 21888242871839275222246405745257275088548364400416034343698136224697451225403, + 83014513506037724, + 21888242871839275222246405745257275088548364400416034343698182519281911912832, + 21888242871839275222246405745257275088548364400416034343698185732931041801777, + 21888242871839275222246405745257275088548364400416034343698161473995421222467, + 85655223562531808, + 21888242871839275222246405745257275088548364400416034343698068427197414926562, + 85927765915392532, + 80714449984666914, + 136466363702850069, + 21888242871839275222246405745257275088548364400416034343698077733853807206062, + 21888242871839275222246405745257275088548364400416034343698140413509392825559, + 21888242871839275222246405745257275088548364400416034343698108505848002827286, + 83128013973563124, + 21888242871839275222246405745257275088548364400416034343698076601319820643251, + 21888242871839275222246405745257275088548364400416034343698063543749092810101, + 21888242871839275222246405745257275088548364400416034343698189420236941102952, + 115721807949428321, + 93448854849984767, + 21888242871839275222246405745257275088548364400416034343698082190910137181562, + 21888242871839275222246405745257275088548364400416034343698090439160503624053, + 21888242871839275222246405745257275088548364400416034343698121539010331318128, + 83682120298983708, + 78988649050391973, + 134017384256473969, + 103500715260992000, + 3470730164752027, + 31223425100297737, + 6056248042149754, + 21888242871839275222246405745257275088548364400416034343698194182116990618883, + 81316950991586359, + 21888242871839275222246405745257275088548364400416034343698198011122616402407, + 21888242871839275222246405745257275088548364400416034343698188355283444690744, + 21888242871839275222246405745257275088548364400416034343698097066664042750844, + 108434416314489342, + 10814226305122548, + 73064195309078039, + 60863363116933263, + 54967580121578058, + 21888242871839275222246405745257275088548364400416034343698192153019880894949, + 134987095315573589, + 123211491055027207, + 21888242871839275222246405745257275088548364400416034343698168141391037973839, + 136973019491483419, + 21888242871839275222246405745257275088548364400416034343698077309440419319079, + 95978814662261863, + 54698896748688224, + 21888242871839275222246405745257275088548364400416034343698203884746026459370, + 89328837314350782, + 21888242871839275222246405745257275088548364400416034343698096026234371762406, + 52923809219201790, + 59881813286939271, + 21888242871839275222246405745257275088548364400416034343698109485586462392281, + 125893397937479431, + 21888242871839275222246405745257275088548364400416034343698076421841160513203, + 43617504638473306, + 30932099610594580, + 93475941790705337, + 107315296560541557, + 21888242871839275222246405745257275088548364400416034343698085022900299183195, + 21888242871839275222246405745257275088548364400416034343698085273770290504105, + 21888242871839275222246405745257275088548364400416034343698100443760331937812, + 25940838183424715, + 129290938712378029, + 80217112581645768, + 21888242871839275222246405745257275088548364400416034343698138522497791258236, + 24012476769151370, + 21888242871839275222246405745257275088548364400416034343698108291706372911142, + 21888242871839275222246405745257275088548364400416034343698198215182147271607, + 21888242871839275222246405745257275088548364400416034343698180211438144386392, + 124845947624473962, + 21888242871839275222246405745257275088548364400416034343698133158863648186535, + 21888242871839275222246405745257275088548364400416034343698138990050310145023, + 21888242871839275222246405745257275088548364400416034343698147959185233938447, + 21888242871839275222246405745257275088548364400416034343698173421871080597348, + 139707766145739091, + 105049744590517435, + 21888242871839275222246405745257275088548364400416034343698129591660053727693, + 24847061510947647, + 122071826086159016, + 54355396109850145, + 132163326642762866, + 21888242871839275222246405745257275088548364400416034343698200017857705661914, + 21888242871839275222246405745257275088548364400416034343698073757259913424402, + 81239911382498188, + 108822117272176037, + 139132260091413780, + 21888242871839275222246405745257275088548364400416034343698089178802416358015, + 21888242871839275222246405745257275088548364400416034343698115567760253884027, + 8986924368495387, + 118975760518179355, + 21888242871839275222246405745257275088548364400416034343698182340061058276096, + 21888242871839275222246405745257275088548364400416034343698072975721722247769, + 21888242871839275222246405745257275088548364400416034343698134396146263481431, + 21888242871839275222246405745257275088548364400416034343698069998303165302547, + 86034493905088934, + 62330344923138005, + 140271882755413826, + 21888242871839275222246405745257275088548364400416034343698169005759054956298, + 21888242871839275222246405745257275088548364400416034343698118557745887800982, + 13607274734589643, + 24759690589927595, + 123842474605120252, + 21888242871839275222246405745257275088548364400416034343698145864677366315976, + 21888242871839275222246405745257275088548364400416034343698121390785306105277, + 123822849228087284, + 21888242871839275222246405745257275088548364400416034343698194295316203598524, + 21888242871839275222246405745257275088548364400416034343698145507074830225467, + 125666269318937431, + 31331158869267621, + 128090446098804578, + 114274302371669503, + 21888242871839275222246405745257275088548364400416034343698176705412555610449, + 67726126067067778, + 21888242871839275222246405745257275088548364400416034343698107812555471018730, + 21888242871839275222246405745257275088548364400416034343698071899750210067113, + 21888242871839275222246405745257275088548364400416034343698106868424115172763, + 21888242871839275222246405745257275088548364400416034343698091824000111567612, + 21888242871839275222246405745257275088548364400416034343698081811824031541716, + 59544869538232724, + 21888242871839275222246405745257275088548364400416034343698170063427492398549, + 20602963126872814, + 21888242871839275222246405745257275088548364400416034343698065692152251781958, + 21888242871839275222246405745257275088548364400416034343698161467905224566188, + 109011826578245655, + 17761160267504035, + 21888242871839275222246405745257275088548364400416034343698172457836956445333, + 76392932062938881, + 120241542227225541, + 21888242871839275222246405745257275088548364400416034343698069391499442856147, + 128262552347289851, + 108776964094126839, + 113317292243189112, + 97251967332380835, + 105104238632410281, + 21888242871839275222246405745257275088548364400416034343698141195334338722669, + 21888242871839275222246405745257275088548364400416034343698143071561434524579, + 21888242871839275222246405745257275088548364400416034343698066286976220852180, + 7497768055206699, + 21888242871839275222246405745257275088548364400416034343698123610829403850006, + 21888242871839275222246405745257275088548364400416034343698145059494446984194, + 48505995413883968, + 36372537611611495, + 21888242871839275222246405745257275088548364400416034343698139758850900948323, + 21888242871839275222246405745257275088548364400416034343698133543369337445855, + 99516676190419522, + 90080435823174986, + 21888242871839275222246405745257275088548364400416034343698165889932917395208, + 47642026222727663, + 21888242871839275222246405745257275088548364400416034343698136172153281775431, + 56703332428024372, + 128433748449790583, + 23860920573244751, + 21888242871839275222246405745257275088548364400416034343698071659248501772410, + 136482792968471060, + 21888242871839275222246405745257275088548364400416034343698089624083219875577, + 21036428557836033, + 21888242871839275222246405745257275088548364400416034343698109471842943083092, + 21888242871839275222246405745257275088548364400416034343698100974894526104322, + 21888242871839275222246405745257275088548364400416034343698155271376321237151, + 45636557577942547, + 20618336939112360, + 21888242871839275222246405745257275088548364400416034343698072986655149359707, + 21888242871839275222246405745257275088548364400416034343698082888872637122764, + 21888242871839275222246405745257275088548364400416034343698200864638349059202, + 21888242871839275222246405745257275088548364400416034343698121800205060726457, + 21888242871839275222246405745257275088548364400416034343698183293064839384599, + 33773618832866671, + 51831648523273001, + 48362538400367950, + 21888242871839275222246405745257275088548364400416034343698143126706720940200, + 21888242871839275222246405745257275088548364400416034343698187888501868398295, + 21888242871839275222246405745257275088548364400416034343698088571100678722594, + 2669881066712216, + 21888242871839275222246405745257275088548364400416034343698192403741216202101, + 21888242871839275222246405745257275088548364400416034343698113825496839678784, + 21888242871839275222246405745257275088548364400416034343698192869140719314246, + 7804511218479497, + 21888242871839275222246405745257275088548364400416034343698089683888620613640, + 21888242871839275222246405745257275088548364400416034343698094379039090806332, + 21888242871839275222246405745257275088548364400416034343698128778159066948817, + 21888242871839275222246405745257275088548364400416034343698144698792774911706, + 38841005622991579, + 39564739380451782, + 21888242871839275222246405745257275088548364400416034343698177834732154243702, + 12871612364483751, + 102098773865942575, + 21888242871839275222246405745257275088548364400416034343698165641629675583726, + 36184860976297384, + 90233412991051663, + 92771774637868401, + 7435694469187379, + 95270259756099341, + 63708597774902238, + 21888242871839275222246405745257275088548364400416034343698188031662262486828, + 21888242871839275222246405745257275088548364400416034343698189578527437268749, + 21888242871839275222246405745257275088548364400416034343698197835362922426411, + 21888242871839275222246405745257275088548364400416034343698080188793593258192, + 119048648619894342, + 142702029454219547, + 69283801979274116, + 88579480828220228, + 21888242871839275222246405745257275088548364400416034343698147736160307687028, + 21888242871839275222246405745257275088548364400416034343698109241951732439720, + 21888242871839275222246405745257275088548364400416034343698097682768533310766, + 21888242871839275222246405745257275088548364400416034343698122171208043388613, + 21888242871839275222246405745257275088548364400416034343698203431236028988772, + 21888242871839275222246405745257275088548364400416034343698159727672870958047, + 128523795026035834, + 21888242871839275222246405745257275088548364400416034343698098944984226558359, + 114528870079065372, + 21888242871839275222246405745257275088548364400416034343698136053046576344294, + 21888242871839275222246405745257275088548364400416034343698122550379683126344, + 21888242871839275222246405745257275088548364400416034343698088822060426730020, + 21888242871839275222246405745257275088548364400416034343698102928194247730124, + 21888242871839275222246405745257275088548364400416034343698135552142351964043, + 132626651097780693, + 130916049204376375, + 30053271323285740, + 21888242871839275222246405745257275088548364400416034343698167277172559533424, + 21888242871839275222246405745257275088548364400416034343698142926142379621067, + 88472071349559450, + 28081179481466332, + 21888242871839275222246405745257275088548364400416034343698088413618897043950, + 21888242871839275222246405745257275088548364400416034343698142294238502026989, + 21888242871839275222246405745257275088548364400416034343698192680659995152134, + 21888242871839275222246405745257275088548364400416034343698083759556584370160, + 21888242871839275222246405745257275088548364400416034343698124417951596687339, + 21888242871839275222246405745257275088548364400416034343698182295191689614945, + 21888242871839275222246405745257275088548364400416034343698191477129161150080, + 21888242871839275222246405745257275088548364400416034343698068540307790871718, + 21888242871839275222246405745257275088548364400416034343698158483831216692977, + 21888242871839275222246405745257275088548364400416034343698082132415951135146, + 90957614538080875, + 21888242871839275222246405745257275088548364400416034343698108481252485138686, + 63708384262290330, + 20762779477037328, + 21888242871839275222246405745257275088548364400416034343698149084417315935587, + 114834108056790625, + 143802479634391488, + 90915007696938100, + 126207758661108433, + 11876260567236809, + 21888242871839275222246405745257275088548364400416034343698177467973971693139, + 21888242871839275222246405745257275088548364400416034343698147122324099997104, + 21888242871839275222246405745257275088548364400416034343698189731333796674936, + 21888242871839275222246405745257275088548364400416034343698081203329622032833, + 12916711619007506, + 21888242871839275222246405745257275088548364400416034343698170428754411710427, + 21888242871839275222246405745257275088548364400416034343698198603353984161717, + 111138399337946659, + 21888242871839275222246405745257275088548364400416034343698139727945097067409, + 21888242871839275222246405745257275088548364400416034343698174736924450920414, + 102816964690555515, + 112412113256673849, + 135825237891329987, + 21888242871839275222246405745257275088548364400416034343698153357239271821777, + 89146010793235942, + 50480752830981333, + 21888242871839275222246405745257275088548364400416034343698068449771397860239, + 21888242871839275222246405745257275088548364400416034343698109155025918111585, + 21888242871839275222246405745257275088548364400416034343698174288751722064138, + 39430465370965567, + 88486525008426838, + 16922634812195455, + 21888242871839275222246405745257275088548364400416034343698155904354300715629, + 21888242871839275222246405745257275088548364400416034343698132713331394900646, + 21888242871839275222246405745257275088548364400416034343698090713354215497361, + 79205437811192096, + 21888242871839275222246405745257275088548364400416034343698108570362780387976, + 134634213036977309, + 21888242871839275222246405745257275088548364400416034343698185760368014449448, + 98768367663414322, + 21888242871839275222246405745257275088548364400416034343698124754383727265485, + 19909260017491492, + 21888242871839275222246405745257275088548364400416034343698132067033215700994, + 32907461857321157, + 21888242871839275222246405745257275088548364400416034343698138668849171976288, + 84936902164578537, + 21888242871839275222246405745257275088548364400416034343698201616383142691527, + 21888242871839275222246405745257275088548364400416034343698070698350673559438, + 32794230793055540, + 19508699614881179, + 93418370250210275, + 21888242871839275222246405745257275088548364400416034343698173306773762032690, + 21888242871839275222246405745257275088548364400416034343698076816915403672147, + 21888242871839275222246405745257275088548364400416034343698130915496702215297, + 13877923847120360, + 96148265572528907, + 21888242871839275222246405745257275088548364400416034343698187793761898583376, + 129481332478201611, + 6301363046391339, + 21888242871839275222246405745257275088548364400416034343698081851959873172361, + 21888242871839275222246405745257275088548364400416034343698110139000968386982, + 21888242871839275222246405745257275088548364400416034343698143217539780339576, + 21888242871839275222246405745257275088548364400416034343698072691884115816754, + 97655740264081794, + 21888242871839275222246405745257275088548364400416034343698127198576143242403, + 21888242871839275222246405745257275088548364400416034343698165044685014068776, + 131153414290247772, + 138827544728633022, + 72802178429594151, + 21888242871839275222246405745257275088548364400416034343698154910140702636338, + 143547893484255461, + 21888242871839275222246405745257275088548364400416034343698119379805342745388, + 30984996865912529, + 21888242871839275222246405745257275088548364400416034343698153644493857839076, + 33121602112712966, + 21888242871839275222246405745257275088548364400416034343698131024781821760468, + 142633416529110894, + 19316307655920871, + 35345887397943215, + 5063470017894275, + 21888242871839275222246405745257275088548364400416034343698111844444185385641, + 51601438624965281, + 68946536248218717, + 21888242871839275222246405745257275088548364400416034343698080120920812759954, + 131352210626769332, + 23427291784958037, + 21888242871839275222246405745257275088548364400416034343698174091466345028646, + 21888242871839275222246405745257275088548364400416034343698067386265134676821, + 92510002736132746, + 21888242871839275222246405745257275088548364400416034343698187506814105127235, + 21888242871839275222246405745257275088548364400416034343698188578030639666051, + 21888242871839275222246405745257275088548364400416034343698120636487907620575, + 93739379697345685, + 21888242871839275222246405745257275088548364400416034343698153107408797028564, + 21888242871839275222246405745257275088548364400416034343698164550186094016242, + 130801088891042070, + 21888242871839275222246405745257275088548364400416034343698154618654014134966, + 21888242871839275222246405745257275088548364400416034343698137724929203652084, + 105299631016906028, + 21888242871839275222246405745257275088548364400416034343698166410211559298181, + 21888242871839275222246405745257275088548364400416034343698179102902530626998, + 65170854927947008, + 21888242871839275222246405745257275088548364400416034343698157079255916763851, + 21888242871839275222246405745257275088548364400416034343698124529114432976280, + 11005656064557405, + 33176240358994627, + 46662604575821699, + 81424838566996008, + 99598837028517437, + 21888242871839275222246405745257275088548364400416034343698117451641652193421, + 66525148921446319, + 97988533174732377, + 113939958094609437, + 21888242871839275222246405745257275088548364400416034343698128110712506031278, + 47596908152026737, + 54775378927659893, + 114252200362509760, + 21888242871839275222246405745257275088548364400416034343698181354321417927974, + 21888242871839275222246405745257275088548364400416034343698157167931408473745, + 95926211067869499, + 21888242871839275222246405745257275088548364400416034343698145989421322938172, + 21888242871839275222246405745257275088548364400416034343698116509162920396758, + 21888242871839275222246405745257275088548364400416034343698079001103266899411, + 88680093535227746, + 133321965385261904, + 21888242871839275222246405745257275088548364400416034343698181570212809912643, + 74096585487178211, + 89741073183038077, + 71585898176864107, + 136079305183982794, + 4447543687615894, + 87106920449250788, + 21888242871839275222246405745257275088548364400416034343698192781164473011198, + 125759522764423764, + 30847347588518643, + 60328733967770326, + 117218997374553822, + 21888242871839275222246405745257275088548364400416034343698167075591723539447, + 58882010031659704, + 21888242871839275222246405745257275088548364400416034343698129842427082448245, + 21888242871839275222246405745257275088548364400416034343698125658448837558713, + 74290389034839461, + 83826947587075121, + 21888242871839275222246405745257275088548364400416034343698099928521253087136, + 142581020115788449, + 37131301412165865, + 21888242871839275222246405745257275088548364400416034343698173620137409341823, + 21888242871839275222246405745257275088548364400416034343698186477657048114579, + 21888242871839275222246405745257275088548364400416034343698173824437762476965, + 21241167423220593, + 21888242871839275222246405745257275088548364400416034343698175346400878322597, + 105727018870424811, + 21888242871839275222246405745257275088548364400416034343698142071900997635548, + 103145783291600812, + 21888242871839275222246405745257275088548364400416034343698108840199340578473, + 80748818373323933, + 21888242871839275222246405745257275088548364400416034343698091212047617619953, + 21888242871839275222246405745257275088548364400416034343698195192033479871309, + 21888242871839275222246405745257275088548364400416034343698150443691234902826, + 21888242871839275222246405745257275088548364400416034343698159946259449439395, + 77026715215258577, + 134324165358282883, + 139130759093288013, + 82391824120904878, + 140004263124182241, + 21888242871839275222246405745257275088548364400416034343698201976610324283631, + 21888242871839275222246405745257275088548364400416034343698107648754825928967, + 21888242871839275222246405745257275088548364400416034343698080751857562335134, + 116705332151246750, + 21888242871839275222246405745257275088548364400416034343698144352657047122203, + 31072447204511311, + 103367685845740285, + 140216625394692285, + 113555585868394060, + 138586501367831183, + 138002576785118012, + 53557811049341590, + 21888242871839275222246405745257275088548364400416034343698093019486590040758, + 90703380007671684, + 21888242871839275222246405745257275088548364400416034343698197944598927901406, + 108793901199822576, + 21888242871839275222246405745257275088548364400416034343698084033270429038729, + 21888242871839275222246405745257275088548364400416034343698126218602932516002, + 21888242871839275222246405745257275088548364400416034343698126974273922298832, + 8496225708800576, + 21888242871839275222246405745257275088548364400416034343698089192641430275145, + 40714551616315643, + 82577783196917256, + 21888242871839275222246405745257275088548364400416034343698139301004540434851, + 21888242871839275222246405745257275088548364400416034343698169134580625455009, + 21888242871839275222246405745257275088548364400416034343698128902468027211737, + 21888242871839275222246405745257275088548364400416034343698106305389372089137, + 61686926859977467, + 21888242871839275222246405745257275088548364400416034343698151858634681013954, + 21888242871839275222246405745257275088548364400416034343698122521751513106961, + 132284448926570468, + 21888242871839275222246405745257275088548364400416034343698179725113335356656, + 93897417746687387, + 86719323057255428, + 21888242871839275222246405745257275088548364400416034343698143610107505446429, + 21888242871839275222246405745257275088548364400416034343698141516030108766850, + 21888242871839275222246405745257275088548364400416034343698116022850171968986, + 21888242871839275222246405745257275088548364400416034343698094346334586315311, + 21888242871839275222246405745257275088548364400416034343698099069293652868302, + 116828858382290833, + 45765377879814082, + 92461911389893678, + 87328576265923127, + 35014806757595877, + 25447134537968155, + 57051194324518810, + 63044899375386767, + 21888242871839275222246405745257275088548364400416034343698106080501834264998, + 21888242871839275222246405745257275088548364400416034343698133225723793076270, + 52426926483973704, + 21888242871839275222246405745257275088548364400416034343698145935011190328395, + 19736097783427552, + 88585321064777442, + 101708971641067553, + 10878140468142724, + 123021265824717026, + 21888242871839275222246405745257275088548364400416034343698061835277508342503, + 60556351875491002, + 41205917970092253, + 21888242871839275222246405745257275088548364400416034343698184213339951787489, + 21888242871839275222246405745257275088548364400416034343698129797077048448076, + 98225008776543826, + 21888242871839275222246405745257275088548364400416034343698063223124135124463, + 21888242871839275222246405745257275088548364400416034343698188817044486228490, + 91027136211509668, + 21888242871839275222246405745257275088548364400416034343698158963069937630186, + 21888242871839275222246405745257275088548364400416034343698100764375490423868, + 21888242871839275222246405745257275088548364400416034343698091711526255876151, + 8166524464387448, + 45017169141315451, + 142977442140341036, + 66925310105744332, + 21888242871839275222246405745257275088548364400416034343698061423813175826078, + 21888242871839275222246405745257275088548364400416034343698069678615388021715, + 6775160080871627, + 21888242871839275222246405745257275088548364400416034343698066937845771115930, + 21888242871839275222246405745257275088548364400416034343698115841758534051025, + 21888242871839275222246405745257275088548364400416034343698168185121849454229, + 21888242871839275222246405745257275088548364400416034343698090404238682173260, + 14044016921532785, + 21888242871839275222246405745257275088548364400416034343698175189459784426910, + 20471990235062052, + 123745969810477452, + 54303641403795294, + 56829982685863046, + 63497057376341700, + 21888242871839275222246405745257275088548364400416034343698123663809062820022, + 21888242871839275222246405745257275088548364400416034343698075811549296602951, + 21888242871839275222246405745257275088548364400416034343698200491839049863068, + 21888242871839275222246405745257275088548364400416034343698148462563731650533, + 34319778596230965, + 21888242871839275222246405745257275088548364400416034343698096425964242766325, + 21888242871839275222246405745257275088548364400416034343698175679779126470243, + 21888242871839275222246405745257275088548364400416034343698156587001310936432, + 21888242871839275222246405745257275088548364400416034343698168518893304870396, + 21888242871839275222246405745257275088548364400416034343698189968897250319287, + 119954877602680578, + 21888242871839275222246405745257275088548364400416034343698070578207802673007, + 119266871558461682, + 21888242871839275222246405745257275088548364400416034343698166846061372111703, + 65307086596963086, + 50608167774792128, + 108954516708990343, + 21888242871839275222246405745257275088548364400416034343698184639137184152464, + 21888242871839275222246405745257275088548364400416034343698163829072288650742, + 21888242871839275222246405745257275088548364400416034343698084973412698571553, + 21888242871839275222246405745257275088548364400416034343698074679385342887664, + 21888242871839275222246405745257275088548364400416034343698190735156386066897, + 21888242871839275222246405745257275088548364400416034343698105373414716418988, + 21888242871839275222246405745257275088548364400416034343698115444989875376291, + 21888242871839275222246405745257275088548364400416034343698113816101606695681, + 40183957414332445, + 40162356998109679, + 21888242871839275222246405745257275088548364400416034343698132746069049892488, + 21888242871839275222246405745257275088548364400416034343698155282590677904644, + 21888242871839275222246405745257275088548364400416034343698072791525117807232, + 130457566213448244, + 21888242871839275222246405745257275088548364400416034343698168043074586187425, + 21888242871839275222246405745257275088548364400416034343698061949624862402655, + 34603944188041117, + 46658579179446661, + 21888242871839275222246405745257275088548364400416034343698167075035268240645, + 45784541242563530, + 21888242871839275222246405745257275088548364400416034343698095752122911328955, + 38792648745160121, + 95792997940027609, + 21888242871839275222246405745257275088548364400416034343698105990161721446873, + 114784170321438754, + 89530800964576037, + 128354017445175140, + 21888242871839275222246405745257275088548364400416034343698201734275984272468, + 32879807839308519, + 21888242871839275222246405745257275088548364400416034343698075878064326796643, + 32583477768333189, + 8259151198983614, + 21888242871839275222246405745257275088548364400416034343698094555427948420254, + 21888242871839275222246405745257275088548364400416034343698076315319570528950, + 93232991630401990, + 108245676757425233, + 21888242871839275222246405745257275088548364400416034343698101315411988327830, + 88883076018149356, + 87906339275394412, + 33095259679373296, + 21888242871839275222246405745257275088548364400416034343698132831178942382823, + 56285864716508881, + 21888242871839275222246405745257275088548364400416034343698065152109592000609, + 21888242871839275222246405745257275088548364400416034343698167872069074193287, + 17711071500961287, + 27613218438682251, + 21888242871839275222246405745257275088548364400416034343698108159209829850084, + 21888242871839275222246405745257275088548364400416034343698194675182864410087, + 21888242871839275222246405745257275088548364400416034343698161311749052175740, + 19111501946109065, + 24473132641026833, + 21888242871839275222246405745257275088548364400416034343698069714575987191760, + 52517740135422853, + 21888242871839275222246405745257275088548364400416034343698170233805941481502, + 21888242871839275222246405745257275088548364400416034343698196784668596293739, + 21888242871839275222246405745257275088548364400416034343698149361167266622429, + 93357003677960513, + 35442494164081479, + 37592179270999569, + 49798695421363128, + 111438800738878143, + 115281404522008156, + 21888242871839275222246405745257275088548364400416034343698131218551232835096, + 36238419327614960, + 21888242871839275222246405745257275088548364400416034343698196431363716163938, + 21888242871839275222246405745257275088548364400416034343698151733565266803554, + 48666603950454941, + 21888242871839275222246405745257275088548364400416034343698130004167039559955, + 21888242871839275222246405745257275088548364400416034343698159361804590520631, + 54471976046755670, + 97207639948294632, + 30158233463857249, + 21888242871839275222246405745257275088548364400416034343698127274630731783800, + 73456993342566750, + 31924567137937014, + 21888242871839275222246405745257275088548364400416034343698190577110181835629, + 21888242871839275222246405745257275088548364400416034343698155438324606205494, + 21888242871839275222246405745257275088548364400416034343698092514492743826706, + 21888242871839275222246405745257275088548364400416034343698199313194430196038, + 84609740291954634, + 107358688345658554, + 24092988145398752, + 21888242871839275222246405745257275088548364400416034343698099706084739588408, + 21888242871839275222246405745257275088548364400416034343698084970095461790778, + 21888242871839275222246405745257275088548364400416034343698188705776229417439, + 21888242871839275222246405745257275088548364400416034343698091933073778858057, + 21888242871839275222246405745257275088548364400416034343698147554759832152337, + 21888242871839275222246405745257275088548364400416034343698062607933039009700, + 21888242871839275222246405745257275088548364400416034343698147063885249069158, + 102301965017726413, + 21888242871839275222246405745257275088548364400416034343698139324926724693989, + 21888242871839275222246405745257275088548364400416034343698112502425299581555, + 21888242871839275222246405745257275088548364400416034343698125698542947419428, + 87410705381314006, + 21888242871839275222246405745257275088548364400416034343698171071004134566107, + 12363465789061276, + 133254378041825205, + 21888242871839275222246405745257275088548364400416034343698067326122157857722, + 125658750910403736, + 126604483188933520, + 38092811583834667, + 115648330795042225, + 21888242871839275222246405745257275088548364400416034343698075029851307322026, + 55297009566722286, + 21888242871839275222246405745257275088548364400416034343698193704037010775155, + 21888242871839275222246405745257275088548364400416034343698094544086082086114, + 137087445107687387, + 21888242871839275222246405745257275088548364400416034343698156134480848098041, + 21916990674908566, + 21888242871839275222246405745257275088548364400416034343698192272241432582054, + 109254611208997166, + 128898143592563377, + 122024791576399655, + 135523622602782832, + 21888242871839275222246405745257275088548364400416034343698132519040062311383, + 37982613456404293, + 30546047930637667, + 21888242871839275222246405745257275088548364400416034343698062420983235368123, + 21888242871839275222246405745257275088548364400416034343698120409254576335336, + 47784192121424639, + 21888242871839275222246405745257275088548364400416034343698166667591311304574, + 37721087115612083, + 21888242871839275222246405745257275088548364400416034343698180432723640446037, + 17414094756146445, + 7994748618034664, + 21888242871839275222246405745257275088548364400416034343698116325634210675042, + 64751751128129517, + 46449507728818318, + 95148932957336455, + 100621795192305486, + 21888242871839275222246405745257275088548364400416034343698124763943403890697, + 117447837879987514, + 24520385510644172, + 76992384215119067, + 21888242871839275222246405745257275088548364400416034343698120312527137462737, + 15208289212394106, + 1653535898313355, + 83790550642703745, + 37624152296263207, + 33504229497375801, + 6519737847042839, + 62176872002714489, + 110867245979618086, + 21888242871839275222246405745257275088548364400416034343698106351718079140207, + 21888242871839275222246405745257275088548364400416034343698105401303879155852, + 33232722295423596, + 21888242871839275222246405745257275088548364400416034343698117222274939880583, + 85290930384436285, + 49538051403605622, + 21888242871839275222246405745257275088548364400416034343698132105628198524279, + 108317137876460841, + 21888242871839275222246405745257275088548364400416034343698096564079492482380, + 143456178009108458, + 21888242871839275222246405745257275088548364400416034343698085280315493522346, + 21888242871839275222246405745257275088548364400416034343698089580190159027438, + 21888242871839275222246405745257275088548364400416034343698194228329194086883, + 21888242871839275222246405745257275088548364400416034343698195492156262844183, + 125526017247155214, + 313761329763316, + 21888242871839275222246405745257275088548364400416034343698179254675325925290, + 21888242871839275222246405745257275088548364400416034343698132829555730538790, + 21888242871839275222246405745257275088548364400416034343698107126170502409928, + 11830480687313213, + 21888242871839275222246405745257275088548364400416034343698084947739048671241, + 13266192637506229, + 21888242871839275222246405745257275088548364400416034343698077588923074795184, + 21888242871839275222246405745257275088548364400416034343698175001845448537475, + 21888242871839275222246405745257275088548364400416034343698153255063130220043, + 21888242871839275222246405745257275088548364400416034343698080376120974031621, + 21888242871839275222246405745257275088548364400416034343698151103965748233670, + 107026834028195084, + 21888242871839275222246405745257275088548364400416034343698169727641767925916, + 59927379773188177, + 21888242871839275222246405745257275088548364400416034343698189744147984734288, + 21888242871839275222246405745257275088548364400416034343698168054862842677334, + 21888242871839275222246405745257275088548364400416034343698188183146483259254, + 21888242871839275222246405745257275088548364400416034343698200419232757480399, + 21888242871839275222246405745257275088548364400416034343698107422174343676263, + 21113646498842405, + 21888242871839275222246405745257275088548364400416034343698191250181829573293, + 87498888263825523, + 21888242871839275222246405745257275088548364400416034343698180325596449687109, + 100765335798163746, + 21888242871839275222246405745257275088548364400416034343698175092941017107934, + 60537648436170910, + 42536805835603906, + 21888242871839275222246405745257275088548364400416034343698066034391116124319, + 46714392455688636, + 21888242871839275222246405745257275088548364400416034343698106825955037963144, + 45649594270577674, + 78761651320027206, + 21888242871839275222246405745257275088548364400416034343698116160485697884746, + 21888242871839275222246405745257275088548364400416034343698065524985329212065, + 21888242871839275222246405745257275088548364400416034343698128335933065063430, + 51022046937519351, + 7070215129258765, + 21888242871839275222246405745257275088548364400416034343698071868060070862294, + 21888242871839275222246405745257275088548364400416034343698192155847007674909, + 123173705800424844, + 44925197613297227, + 106116358367146104, + 21888242871839275222246405745257275088548364400416034343698113084321793209457, + 21888242871839275222246405745257275088548364400416034343698169034455428193863, + 60520566992188968, + 21888242871839275222246405745257275088548364400416034343698200046720068338452, + 28100184965549086, + 21888242871839275222246405745257275088548364400416034343698096279336018261162, + 21888242871839275222246405745257275088548364400416034343698143050426632781758, + 21888242871839275222246405745257275088548364400416034343698199208900627403104, + 25273171911930237, + 21888242871839275222246405745257275088548364400416034343698095141921441401536, + 35990137613397830, + 57828651705731832, + 102213960934146500, + 107766491285275614, + 139580243284397797, + 1345215999110246, + 21888242871839275222246405745257275088548364400416034343698081239441553000007, + 21888242871839275222246405745257275088548364400416034343698081565960934537894, + 21888242871839275222246405745257275088548364400416034343698073728314680656508, + 69379811080757581, + 136881771173939456, + 21888242871839275222246405745257275088548364400416034343698166650129964704987, + 72082435843605250, + 86740841747066594, + 21888242871839275222246405745257275088548364400416034343698184505098685273575, + 3086527886788037, + 53924006732993719, + 84199307282452139, + 21888242871839275222246405745257275088548364400416034343698105576948332660291, + 30439977182029090, + 142168851157255817, + 64843515628045023, + 53189996701097596, + 75331696182346136, + 29563930038124103, + 21888242871839275222246405745257275088548364400416034343698160881341604673513, + 21888242871839275222246405745257275088548364400416034343698095910405940276490, + 21888242871839275222246405745257275088548364400416034343698142370694171061127, + 21888242871839275222246405745257275088548364400416034343698154519677515947983, + 21888242871839275222246405745257275088548364400416034343698132629449655081795, + 26895391641733514, + 21888242871839275222246405745257275088548364400416034343698165358924652309302, + 21888242871839275222246405745257275088548364400416034343698164821615042089314, + 21888242871839275222246405745257275088548364400416034343698138137294090017969, + 21888242871839275222246405745257275088548364400416034343698141819252721421263, + 80017424221362433, + 21888242871839275222246405745257275088548364400416034343698153344166042375446, + 26459886938855201, + 49199864024644892, + 68359411222533140, + 48208376654744409, + 35067036140578964, + 122967210194786527, + 21888242871839275222246405745257275088548364400416034343698181768817668602941, + 15181006268713530, + 79351909762722837, + 21888242871839275222246405745257275088548364400416034343698185882257793124589, + 50937601729955131, + 104755748432423018, + 123588934349627069, + 137193302664916394, + 21888242871839275222246405745257275088548364400416034343698090763668138013417, + 21888242871839275222246405745257275088548364400416034343698178641631697991062, + 30523140625332165, + 59773643603189027, + 54945679349951050, + 21888242871839275222246405745257275088548364400416034343698132518751192727720, + 18747987095330353, + 21888242871839275222246405745257275088548364400416034343698199667156191704078, + 21888242871839275222246405745257275088548364400416034343698171698459224989594, + 21888242871839275222246405745257275088548364400416034343698188669249602622524, + 75596594877603088, + 21888242871839275222246405745257275088548364400416034343698191891602854715887, + 21888242871839275222246405745257275088548364400416034343698070971551254422562, + 21888242871839275222246405745257275088548364400416034343698186672976997361717, + 21888242871839275222246405745257275088548364400416034343698137265190169520603, + 21888242871839275222246405745257275088548364400416034343698121577882022471670, + 21888242871839275222246405745257275088548364400416034343698079027891772573890, + 21888242871839275222246405745257275088548364400416034343698197781588331494021, + 21888242871839275222246405745257275088548364400416034343698123592935361988263, + 21888242871839275222246405745257275088548364400416034343698161724662128790566, + 117909049700600797, + 21888242871839275222246405745257275088548364400416034343698144475265853543933, + 90489911009140131, + 82944754986048916, + 21888242871839275222246405745257275088548364400416034343698174837433860682640, + 84303550891879756, + 143617969321529858, + 137962509771228630, + 109341945111019982, + 21888242871839275222246405745257275088548364400416034343698075344792375422501, + 21888242871839275222246405745257275088548364400416034343698154718062034857032, + 21888242871839275222246405745257275088548364400416034343698070152384462243648, + 21888242871839275222246405745257275088548364400416034343698132960564973053446, + 21888242871839275222246405745257275088548364400416034343698144481317426490763, + 109995841378495317, + 21888242871839275222246405745257275088548364400416034343698131571060349060251, + 21888242871839275222246405745257275088548364400416034343698122216109860115218, + 74157417266228080, + 21888242871839275222246405745257275088548364400416034343698071829625174167877, + 82519230821835844, + 51455053339500859, + 98563495263213905, + 21888242871839275222246405745257275088548364400416034343698150959420686983128, + 8155371626184021, + 124230136235738824, + 142363383143205325, + 116092905872343179, + 4202088869831786, + 21888242871839275222246405745257275088548364400416034343698130601885494386664, + 20191631197362224, + 8187136936594760, + 21888242871839275222246405745257275088548364400416034343698098290208206297684, + 40038193572464931, + 115551232139203468, + 21888242871839275222246405745257275088548364400416034343698104256237734876046, + 21888242871839275222246405745257275088548364400416034343698155075029568914458, + 21888242871839275222246405745257275088548364400416034343698073219992924577375, + 133371269558953333, + 21888242871839275222246405745257275088548364400416034343698108349777946513464, + 130375527804022890, + 58996216583179913, + 3214072285257711, + 93068905867932808, + 42547604349679697, + 67809376455618953, + 50434387687690008, + 41485963141412597, + 48734933087909800, + 21888242871839275222246405745257275088548364400416034343698199877361156043180, + 110397016047712530, + 81849181867148288, + 21888242871839275222246405745257275088548364400416034343698187291447692114621, + 44427810050615708, + 80317500406441660, + 21888242871839275222246405745257275088548364400416034343698159121172691744211, + 21888242871839275222246405745257275088548364400416034343698149493252074211492, + 21888242871839275222246405745257275088548364400416034343698189203455199978970, + 107316429921122413, + 21888242871839275222246405745257275088548364400416034343698174215036468726348, + 21888242871839275222246405745257275088548364400416034343698111574983228787693, + 21888242871839275222246405745257275088548364400416034343698203644424562404780, + 59160291763602966, + 1251486923541404, + 128094304656510351, + 22625663419901918, + 21888242871839275222246405745257275088548364400416034343698158219829347808599, + 21888242871839275222246405745257275088548364400416034343698174438914064944646, + 113123991144267527, + 19904059136189907, + 21888242871839275222246405745257275088548364400416034343698065273106772355548, + 78921335025391983, + 21888242871839275222246405745257275088548364400416034343698199931314193330697, + 21888242871839275222246405745257275088548364400416034343698071255558761501259, + 40106156541178500, + 21888242871839275222246405745257275088548364400416034343698127644304801064851, + 21888242871839275222246405745257275088548364400416034343698067685642302935409, + 133407175729179990, + 21888242871839275222246405745257275088548364400416034343698066136379228866621, + 21888242871839275222246405745257275088548364400416034343698193329333596389202, + 83025095216194379, + 103255460617529633, + 21888242871839275222246405745257275088548364400416034343698127925860687387337, + 119469365244481804, + 52723555527912497, + 143444755405625108, + 14149000415976254, + 121874955907987608, + 21888242871839275222246405745257275088548364400416034343698162230619920072019, + 109232610340240759, + 31187665788886879, + 97764749707441822, + 88943946093897006, + 21888242871839275222246405745257275088548364400416034343698141174890249693336, + 21888242871839275222246405745257275088548364400416034343698121646669018766931, + 21888242871839275222246405745257275088548364400416034343698100117949948579540, + 21888242871839275222246405745257275088548364400416034343698193558890983790604, + 21888242871839275222246405745257275088548364400416034343698143000371612935531, + 21888242871839275222246405745257275088548364400416034343698138846381383853945, + 21888242871839275222246405745257275088548364400416034343698126080957239796444, + 21888242871839275222246405745257275088548364400416034343698099548833333874354, + 54683412661120891, + 21888242871839275222246405745257275088548364400416034343698127411934603429745, + 21888242871839275222246405745257275088548364400416034343698179444244781783911, + 135637805178627164, + 14515270083057565, + 11244573393872497, + 21888242871839275222246405745257275088548364400416034343698106771741942606331, + 96500852950114092, + 21888242871839275222246405745257275088548364400416034343698160339013441805970, + 85645756130358847, + 71802381497823123, + 48698174890554889, + 21888242871839275222246405745257275088548364400416034343698152276713406358208, + 13306690470072168, + 97238494120897386, + 69831324661232811, + 51483097048165493, + 114333927502173821, + 57779700764070617, + 17436276083246445, + 21888242871839275222246405745257275088548364400416034343698167194697565700821, + 21888242871839275222246405745257275088548364400416034343698131998070394171408, + 91827599227490611, + 21888242871839275222246405745257275088548364400416034343698201324482690828679, + 21888242871839275222246405745257275088548364400416034343698189139039078397067, + 77470192419743837, + 116852868734681905, + 78092697443935235, + 21888242871839275222246405745257275088548364400416034343698133035062629034287, + 21888242871839275222246405745257275088548364400416034343698113440789508787317, + 132954146469510292, + 21888242871839275222246405745257275088548364400416034343698179132294998172867, + 143691814874862587, + 124249599244969310, + 87826598849001016, + 43423413230872011, + 14323786183868337, + 21888242871839275222246405745257275088548364400416034343698136291520367295466, + 21888242871839275222246405745257275088548364400416034343698133033992390045756, + 21888242871839275222246405745257275088548364400416034343698154779823154407039, + 21888242871839275222246405745257275088548364400416034343698133041307236778312, + 103919226854386299, + 21888242871839275222246405745257275088548364400416034343698168152027543514148, + 21888242871839275222246405745257275088548364400416034343698183370915369420170, + 134148786369642524, + 20142391529857240, + 21888242871839275222246405745257275088548364400416034343698200036254397063244, + 21888242871839275222246405745257275088548364400416034343698098480489696880846, + 45339469580646735, + 61431883349449516, + 21888242871839275222246405745257275088548364400416034343698098328724347710325, + 90644120656550831, + 21888242871839275222246405745257275088548364400416034343698186928207667522172, + 21888242871839275222246405745257275088548364400416034343698114437769347301344, + 21888242871839275222246405745257275088548364400416034343698128706724108878307, + 21888242871839275222246405745257275088548364400416034343698135161428902894484, + 21888242871839275222246405745257275088548364400416034343698070879226610314654, + 21888242871839275222246405745257275088548364400416034343698193399205501249167, + 122832836044882624, + 2801067720920922, + 21888242871839275222246405745257275088548364400416034343698065266521711369228, + 21888242871839275222246405745257275088548364400416034343698188991934317388937, + 33692587648484131, + 136804528362421219, + 127072689339120466, + 21888242871839275222246405745257275088548364400416034343698135843455162729072, + 93618471236093134, + 21888242871839275222246405745257275088548364400416034343698153094746505930761, + 106701546178935137, + 60468311828347099, + 21888242871839275222246405745257275088548364400416034343698135371267395767632, + 64524982756337121, + 21888242871839275222246405745257275088548364400416034343698151008657532556870, + 21888242871839275222246405745257275088548364400416034343698143210649944950155, + 21888242871839275222246405745257275088548364400416034343698196971931937031278, + 21888242871839275222246405745257275088548364400416034343698181967232164293288, + 21888242871839275222246405745257275088548364400416034343698082233061756010877, + 21888242871839275222246405745257275088548364400416034343698102881449150532116, + 135811145107532669, + 93861405081293009, + 21888242871839275222246405745257275088548364400416034343698151288575079275344, + 21888242871839275222246405745257275088548364400416034343698200320556778764325, + 49333480484382031, + 61078414907530894, + 21888242871839275222246405745257275088548364400416034343698162937236882176673, + 21888242871839275222246405745257275088548364400416034343698102671442119758465, + 21888242871839275222246405745257275088548364400416034343698085940615308456698, + 2495603608262311, + 21888242871839275222246405745257275088548364400416034343698138657799114018937, + 110516837765153687, + 137887180382491298, + 117946730643246814, + 21888242871839275222246405745257275088548364400416034343698190503080206250466, + 21888242871839275222246405745257275088548364400416034343698107050194093049785, + 38668623900156925, + 46562574535146954, + 113123568270862955, + 21888242871839275222246405745257275088548364400416034343698090931482680939190, + 21888242871839275222246405745257275088548364400416034343698138813970150351311, + 129789269940053790, + 88908064396364845, + 72439883860040843, + 21888242871839275222246405745257275088548364400416034343698097491307915701729, + 132871728687382954, + 102482385235618876, + 21888242871839275222246405745257275088548364400416034343698075786910236025855, + 21888242871839275222246405745257275088548364400416034343698085902467021965346, + 11531654478469017, + 102656709541632583, + 21888242871839275222246405745257275088548364400416034343698061217965848225140, + 21888242871839275222246405745257275088548364400416034343698147330325970071117, + 50157034868395884, + 21888242871839275222246405745257275088548364400416034343698087820178789429763, + 96321581935066893, + 21888242871839275222246405745257275088548364400416034343698117313401596928857, + 96715390861900695, + 21888242871839275222246405745257275088548364400416034343698153990695424091346, + 69008990728143270, + 86070657280351587, + 21888242871839275222246405745257275088548364400416034343698170260371455380530, + 111045588496949062, + 21888242871839275222246405745257275088548364400416034343698121632048993766060, + 21888242871839275222246405745257275088548364400416034343698186504020005687955, + 49168276646658638, + 21888242871839275222246405745257275088548364400416034343698164693303090171156, + 21888242871839275222246405745257275088548364400416034343698109570480110398405, + 21888242871839275222246405745257275088548364400416034343698085192838916754641, + 21888242871839275222246405745257275088548364400416034343698168181456644973966, + 21888242871839275222246405745257275088548364400416034343698065324480690948740, + 21888242871839275222246405745257275088548364400416034343698106011830606366398, + 21888242871839275222246405745257275088548364400416034343698142775785597375727, + 21888242871839275222246405745257275088548364400416034343698203538264956218984, + 21888242871839275222246405745257275088548364400416034343698135312566165768276, + 21888242871839275222246405745257275088548364400416034343698119047409421184645, + 125627407569918635, + 136509654248380717, + 65413754862814809, + 21888242871839275222246405745257275088548364400416034343698181251128921431980, + 107415339872355806, + 76701090807608346, + 21888242871839275222246405745257275088548364400416034343698169308221342744196, + 46365704758484025, + 119611457051266372, + 21888242871839275222246405745257275088548364400416034343698085584182870999147, + 21888242871839275222246405745257275088548364400416034343698154003929675520412, + 21888242871839275222246405745257275088548364400416034343698176508025497422931, + 21888242871839275222246405745257275088548364400416034343698171079541884571841, + 21888242871839275222246405745257275088548364400416034343698143340690607986354, + 21888242871839275222246405745257275088548364400416034343698119578186227799681, + 67536419661214287, + 7399832377222486, + 61239511338617450, + 15080771306552434, + 20402954000595225, + 21888242871839275222246405745257275088548364400416034343698105068964822484872, + 21888242871839275222246405745257275088548364400416034343698182290570786782747, + 21888242871839275222246405745257275088548364400416034343698170378479136813829, + 21888242871839275222246405745257275088548364400416034343698067524690613907825, + 120762716980802990, + 109354248629584389, + 21888242871839275222246405745257275088548364400416034343698089397786697363401, + 45969817462561277, + 21888242871839275222246405745257275088548364400416034343698105766450777044987, + 92630976019236070, + 21888242871839275222246405745257275088548364400416034343698199376708866986197, + 21888242871839275222246405745257275088548364400416034343698147782659519263187, + 134634039320040366, + 21888242871839275222246405745257275088548364400416034343698179099554787418332, + 62194063300075093, + 21888242871839275222246405745257275088548364400416034343698140290023764030726, + 127755427822837944, + 121115718245398150, + 21888242871839275222246405745257275088548364400416034343698189042606155894931, + 21888242871839275222246405745257275088548364400416034343698063235374214869252, + 21888242871839275222246405745257275088548364400416034343698202612895664886377, + 76190294044990811, + 21888242871839275222246405745257275088548364400416034343698188925002791206357, + 21888242871839275222246405745257275088548364400416034343698072277292569862997, + 21888242871839275222246405745257275088548364400416034343698081848306276591647, + 128726992834594439, + 21888242871839275222246405745257275088548364400416034343698153113546196958177, + 21888242871839275222246405745257275088548364400416034343698113928340134453379, + 21888242871839275222246405745257275088548364400416034343698148737322635926777, + 64723074573255585, + 21888242871839275222246405745257275088548364400416034343698191428767610373186, + 21888242871839275222246405745257275088548364400416034343698120639534094223666, + 103652428323982127, + 4719933916769571, + 21888242871839275222246405745257275088548364400416034343698196011306813846004, + 67389383205656807, + 21888242871839275222246405745257275088548364400416034343698174704460643241994, + 16354663713560358, + 21888242871839275222246405745257275088548364400416034343698200190899312107948, + 21888242871839275222246405745257275088548364400416034343698079925802370468775, + 21413845943637618, + 126457080956056101, + 73887500095493068, + 98408981774101695, + 139722042260064100, + 125514211728225606, + 48224674358905511, + 117554618052211671, + 142995308129759160, + 21888242871839275222246405745257275088548364400416034343698178560060465180122, + 21888242871839275222246405745257275088548364400416034343698163191487628192307, + 21888242871839275222246405745257275088548364400416034343698122688642930944569, + 92824402106102505, + 21888242871839275222246405745257275088548364400416034343698197800287987001619, + 21888242871839275222246405745257275088548364400416034343698067099477577066107, + 21888242871839275222246405745257275088548364400416034343698083099078402930508, + 21888242871839275222246405745257275088548364400416034343698130815564997506284, + 63886658201593157, + 76699914687746903, + 21888242871839275222246405745257275088548364400416034343698126645784827051130, + 21888242871839275222246405745257275088548364400416034343698163273325534621450, + 26827610674314101, + 21888242871839275222246405745257275088548364400416034343698119671405983228917, + 94477211742217099, + 138785881566920468, + 135636218077987431, + 21888242871839275222246405745257275088548364400416034343698171083474662934525, + 21888242871839275222246405745257275088548364400416034343698067110642916790769, + 21888242871839275222246405745257275088548364400416034343698112738606191696301, + 21888242871839275222246405745257275088548364400416034343698120789731265545039, + 21888242871839275222246405745257275088548364400416034343698132902170284261154, + 21888242871839275222246405745257275088548364400416034343698170677681312385268, + 21888242871839275222246405745257275088548364400416034343698090359827977808880, + 65526532656438620, + 21888242871839275222246405745257275088548364400416034343698159272920094704233, + 50370051089241476, + 2138979685690649, + 21888242871839275222246405745257275088548364400416034343698085861497142227536, + 49214420622587635, + 85341392460109474, + 21888242871839275222246405745257275088548364400416034343698124914527257515949, + 21888242871839275222246405745257275088548364400416034343698158550393485141052, + 21888242871839275222246405745257275088548364400416034343698093153018671530931, + 21888242871839275222246405745257275088548364400416034343698141608523917289369, + 61042089061882324, + 34791658719278569, + 58917308798030542, + 66293232679073395, + 91639338768143007, + 127266240682497838, + 21888242871839275222246405745257275088548364400416034343698133542226451976854, + 21888242871839275222246405745257275088548364400416034343698161847701992153956, + 109154780304394427, + 56418785220299557, + 87828466823855144, + 21888242871839275222246405745257275088548364400416034343698167256471463733823, + 49161396180088221, + 21888242871839275222246405745257275088548364400416034343698063897426528519795, + 21888242871839275222246405745257275088548364400416034343698097401489710742089, + 71871797477484818, + 21888242871839275222246405745257275088548364400416034343698135273893397869223, + 80303122189514391, + 67177130488331805, + 21888242871839275222246405745257275088548364400416034343698128730499156150269, + 47584028755748545, + 21888242871839275222246405745257275088548364400416034343698102731858293437022, + 17845736731150161, + 24306096420534988, + 21888242871839275222246405745257275088548364400416034343698102996274837326404, + 21888242871839275222246405745257275088548364400416034343698155723240685645736, + 21888242871839275222246405745257275088548364400416034343698128407133906935454, + 21888242871839275222246405745257275088548364400416034343698067579102227922001, + 21888242871839275222246405745257275088548364400416034343698203103207908715876, + 113479475600817450, + 4625734852753632, + 132221815670085387, + 21888242871839275222246405745257275088548364400416034343698149415991507461739, + 21888242871839275222246405745257275088548364400416034343698107831746560444871, + 21888242871839275222246405745257275088548364400416034343698164324030093724314, + 112741619565690950, + 21888242871839275222246405745257275088548364400416034343698069415653897855207, + 78485739018208827, + 37771590878756824, + 21888242871839275222246405745257275088548364400416034343698108736753156947446, + 29815673898358487, + 21888242871839275222246405745257275088548364400416034343698088174462006173440, + 21888242871839275222246405745257275088548364400416034343698179785628022394217, + 21888242871839275222246405745257275088548364400416034343698104249970145252061, + 18102629480557192, + 21888242871839275222246405745257275088548364400416034343698102584690988055733, + 114452150890331383, + 31462521704762588, + 92842106532247814, + 21888242871839275222246405745257275088548364400416034343698190901086714574336, + 67304466687107647, + 21888242871839275222246405745257275088548364400416034343698144956056350263485, + 21888242871839275222246405745257275088548364400416034343698148494342379670804, + 134824205660749236, + 21888242871839275222246405745257275088548364400416034343698099406421214573712, + 21888242871839275222246405745257275088548364400416034343698135053857745612289, + 21888242871839275222246405745257275088548364400416034343698168319017438612336, + 65720762848579201, + 141736004609299293, + 130313662040396415, + 21888242871839275222246405745257275088548364400416034343698088310315392303933, + 136632232684265050, + 4573454644681345, + 21888242871839275222246405745257275088548364400416034343698193113186674972447, + 6654319102594252, + 21888242871839275222246405745257275088548364400416034343698154620101681019456, + 124277477030721918, + 100092230132287474, + 21888242871839275222246405745257275088548364400416034343698093761646640265223, + 143560452094568414, + 21888242871839275222246405745257275088548364400416034343698183695024629474645, + 8257319414006993, + 21888242871839275222246405745257275088548364400416034343698130119978769503943, + 115878758225422014, + 21888242871839275222246405745257275088548364400416034343698062243965548422002, + 108418001937988683, + 21888242871839275222246405745257275088548364400416034343698115689853618900829, + 52882013208613454, + 36117549010073759, + 21888242871839275222246405745257275088548364400416034343698072116417720561434, + 142206704376984064, + 21888242871839275222246405745257275088548364400416034343698108554130167047647, + 83866373140727214, + 11824979654201535, + 108971140765874838, + 39725548281763031, + 136921133371077397, + 42546953537734730, + 68771565249032469, + 21888242871839275222246405745257275088548364400416034343698117848908299041535, + 128161337705232745, + 21888242871839275222246405745257275088548364400416034343698087547933831734542, + 21888242871839275222246405745257275088548364400416034343698121808600242962598, + 118513645090100562, + 100185998137996170, + 114154290384502852, + 21888242871839275222246405745257275088548364400416034343698121541180378878242, + 21888242871839275222246405745257275088548364400416034343698131233936032486370, + 111490624522685424, + 88117315403623579, + 21888242871839275222246405745257275088548364400416034343698078224782916617386, + 21888242871839275222246405745257275088548364400416034343698200000004445541714, + 21888242871839275222246405745257275088548364400416034343698162218345905513948, + 21888242871839275222246405745257275088548364400416034343698151646250732507370, + 21888242871839275222246405745257275088548364400416034343698135431647921056332, + 84641015361443403, + 37167392212703733, + 21888242871839275222246405745257275088548364400416034343698144508425338827623, + 46056193907764752, + 102047612821683853, + 135957440115509920, + 42337035147019021, + 8451762039827131, + 90748104970181308, + 21888242871839275222246405745257275088548364400416034343698075780979173020984, + 49084256095290697, + 21888242871839275222246405745257275088548364400416034343698161168049081544050, + 51346163260459225, + 21888242871839275222246405745257275088548364400416034343698098437279137391451, + 21888242871839275222246405745257275088548364400416034343698082678400478413953, + 13504649764628007, + 111279822746620340, + 21888242871839275222246405745257275088548364400416034343698074834625097774839, + 21888242871839275222246405745257275088548364400416034343698182005804755272553, + 17563677256960528, + 21888242871839275222246405745257275088548364400416034343698106798015802222642, + 21888242871839275222246405745257275088548364400416034343698121771130015405227, + 21888242871839275222246405745257275088548364400416034343698115160104910421295, + 41226666209062804, + 113333733668795934, + 28273168598535826, + 81260501747216485, + 134721534512313971, + 51114388464069780, + 1748483253935461, + 138112460198823632, + 21888242871839275222246405745257275088548364400416034343698147704137045826738, + 21888242871839275222246405745257275088548364400416034343698203758465196729428, + 21888242871839275222246405745257275088548364400416034343698168554256119110319, + 21888242871839275222246405745257275088548364400416034343698175096639837260203, + 102223816226864584, + 21888242871839275222246405745257275088548364400416034343698131694192942064141, + 55065898046893595, + 21888242871839275222246405745257275088548364400416034343698101912051867295554, + 118968095663705574, + 86200654900680200, + 21888242871839275222246405745257275088548364400416034343698099292052411534706, + 110941492884640102, + 56523907946868947, + 21888242871839275222246405745257275088548364400416034343698119902181143660124, + 21888242871839275222246405745257275088548364400416034343698185041316160464632, + 21888242871839275222246405745257275088548364400416034343698163736003327450140, + 47735111271643098, + 123877944988517863, + 130335904446249854, + 21888242871839275222246405745257275088548364400416034343698115206879414896017, + 49755139653985020, + 36628448510476134, + 60575809034466836, + 134381894883570089, + 21888242871839275222246405745257275088548364400416034343698061583968174065140, + 21888242871839275222246405745257275088548364400416034343698172745960860546636, + 61081447970491041, + 29871796123863994, + 78012381482491922, + 23127945266638106, + 96993232158189014, + 90378697940627563, + 136908706052369693, + 28259326732211867, + 21888242871839275222246405745257275088548364400416034343698122081564859280622, + 21888242871839275222246405745257275088548364400416034343698188510902023441035, + 76634270954187670, + 73967019374499502, + 94641082414520928, + 5059914013890249, + 21888242871839275222246405745257275088548364400416034343698193285634857473217, + 55383786887842066, + 42182236219019867, + 21888242871839275222246405745257275088548364400416034343698164003330983654913, + 21888242871839275222246405745257275088548364400416034343698201038776279650474, + 68604621568375704, + 104151020970071675, + 37011437937641925, + 2294365118006348, + 21888242871839275222246405745257275088548364400416034343698075902873124897419, + 112952355360391687, + 51383937274888056, + 21888242871839275222246405745257275088548364400416034343698073710508560329392, + 21888242871839275222246405745257275088548364400416034343698069226663923989877, + 108338568126422929, + 140074973123856367, + 21888242871839275222246405745257275088548364400416034343698129749535340854463, + 120906016304857065, + 71720139795325855, + 21888242871839275222246405745257275088548364400416034343698164907734541411249, + 33919427621426762, + 8374813991344016, + 21888242871839275222246405745257275088548364400416034343698156954512137743341, + 21888242871839275222246405745257275088548364400416034343698169061898939129463, + 21888242871839275222246405745257275088548364400416034343698189424879524719595, + 21888242871839275222246405745257275088548364400416034343698127287242123450293, + 21888242871839275222246405745257275088548364400416034343698065840754953541843, + 128746503072128437, + 37393951406307438, + 21888242871839275222246405745257275088548364400416034343698148614534971772672, + 66573247647265320, + 125120103539449043, + 93356256546609504, + 21888242871839275222246405745257275088548364400416034343698100667492547386594, + 249809733530681, + 35834927647253768, + 50832473973537401, + 21888242871839275222246405745257275088548364400416034343698149799490239411925, + 105243999942681797, + 127793910665852298, + 21888242871839275222246405745257275088548364400416034343698087102420543203877, + 21888242871839275222246405745257275088548364400416034343698190932699827252157, + 109970488188145352, + 21888242871839275222246405745257275088548364400416034343698151470694017304497, + 21888242871839275222246405745257275088548364400416034343698187986172789014933, + 12169189569850440, + 21888242871839275222246405745257275088548364400416034343698116723879573279321, + 21884365820768653, + 21888242871839275222246405745257275088548364400416034343698139691026160502615, + 90383675544579271, + 24485846877539472, + 21888242871839275222246405745257275088548364400416034343698170307354176188920, + 21888242871839275222246405745257275088548364400416034343698115919801142467819, + 21888242871839275222246405745257275088548364400416034343698063459504363226101, + 21888242871839275222246405745257275088548364400416034343698186417577215071552, + 21888242871839275222246405745257275088548364400416034343698068643506527184140, + 21888242871839275222246405745257275088548364400416034343698061439586005343445, + 21888242871839275222246405745257275088548364400416034343698127371267657446281, + 8906975727423785, + 89761474590660679, + 29237915282933242, + 21888242871839275222246405745257275088548364400416034343698144029743875649433, + 21888242871839275222246405745257275088548364400416034343698121700603319346084, + 123957177827752302, + 102172556206693655, + 21888242871839275222246405745257275088548364400416034343698089996090102286922, + 21888242871839275222246405745257275088548364400416034343698083392992323649741, + 21888242871839275222246405745257275088548364400416034343698162391700685732953, + 103764418283895877, + 30949608671846479, + 48690661375136204, + 21888242871839275222246405745257275088548364400416034343698177434966914549079, + 84094435172240103, + 143929735593130818, + 21888242871839275222246405745257275088548364400416034343698107910024186457795, + 21888242871839275222246405745257275088548364400416034343698203828711895902908, + 85703244300899057, + 21888242871839275222246405745257275088548364400416034343698102122700180839877, + 16258713394102283, + 21888242871839275222246405745257275088548364400416034343698180787399332783734, + 1940567994260480, + 122036918408015591, + 21888242871839275222246405745257275088548364400416034343698134981552971500997, + 76072851354033408, + 21888242871839275222246405745257275088548364400416034343698073657455019077197, + 65354636252683439, + 21888242871839275222246405745257275088548364400416034343698066278295996386688, + 25040098124149010, + 93575553665820309, + 39566959549976463, + 21888242871839275222246405745257275088548364400416034343698177573159401417060, + 374097884404427, + 21888242871839275222246405745257275088548364400416034343698078309513354789784, + 21888242871839275222246405745257275088548364400416034343698180135348614400531, + 21888242871839275222246405745257275088548364400416034343698114418598624092996, + 14266828622555554, + 39230975787167525, + 21888242871839275222246405745257275088548364400416034343698190561514824309276, + 91334492627256893, + 21888242871839275222246405745257275088548364400416034343698092777856008846511, + 21888242871839275222246405745257275088548364400416034343698201972685138644415, + 99184346389967237, + 40158505219787705, + 46913205780714681, + 57390307368779804, + 21888242871839275222246405745257275088548364400416034343698161735163011698589, + 100887316370729697, + 21888242871839275222246405745257275088548364400416034343698160362929957808684, + 21888242871839275222246405745257275088548364400416034343698123528179019509441, + 2510205339784042, + 41934203421970226, + 21888242871839275222246405745257275088548364400416034343698090506828623009900, + 21888242871839275222246405745257275088548364400416034343698196397470635347638, + 21888242871839275222246405745257275088548364400416034343698170512176885264716, + 21888242871839275222246405745257275088548364400416034343698177814894220879621, + 21888242871839275222246405745257275088548364400416034343698067074832080340783, + 21888242871839275222246405745257275088548364400416034343698170056695920658836, + 21888242871839275222246405745257275088548364400416034343698185426881308879279, + 116351498264074473, + 21888242871839275222246405745257275088548364400416034343698096910674547816027, + 9484909406622436, + 21888242871839275222246405745257275088548364400416034343698083618618569343028, + 73342649358096398, + 21888242871839275222246405745257275088548364400416034343698174717091818361271, + 21888242871839275222246405745257275088548364400416034343698069874906818566664, + 10804111730028929, + 29754944618366437, + 21888242871839275222246405745257275088548364400416034343698156748720188417311, + 31461744993328073, + 55279510494858421, + 113135857523633603, + 42932517572327262, + 21888242871839275222246405745257275088548364400416034343698071203592467267962, + 83888906286664673, + 21888242871839275222246405745257275088548364400416034343698156714339697801498, + 11033351744127160, + 142728682526160478, + 83214444442150539, + 21888242871839275222246405745257275088548364400416034343698169654402675915128, + 22858556510110417, + 85979620532008825, + 21888242871839275222246405745257275088548364400416034343698165053013432020347, + 21888242871839275222246405745257275088548364400416034343698133020849470845058, + 21888242871839275222246405745257275088548364400416034343698063136448375207877, + 21888242871839275222246405745257275088548364400416034343698164191370214600392, + 21888242871839275222246405745257275088548364400416034343698156385154261278443, + 14104609405166437, + 81014315006522639, + 138629807935253523, + 22380382547450768, + 139036467502110208, + 121189710340171653, + 45953157554219086, + 21888242871839275222246405745257275088548364400416034343698123722860999341298, + 24002550784169494, + 103709092181501133, + 21888242871839275222246405745257275088548364400416034343698149025663019269942, + 44921856386155391, + 21888242871839275222246405745257275088548364400416034343698074167539420486804, + 21888242871839275222246405745257275088548364400416034343698202762679985914437, + 21888242871839275222246405745257275088548364400416034343698067005396032893039, + 21888242871839275222246405745257275088548364400416034343698118063432834970296, + 142962832659088713, + 21888242871839275222246405745257275088548364400416034343698111824159066923904, + 21888242871839275222246405745257275088548364400416034343698200848435588154548, + 97980568580019769, + 12789766941482491, + 21888242871839275222246405745257275088548364400416034343698201889496336986940, + 21888242871839275222246405745257275088548364400416034343698074698784780662730, + 116124316330576423, + 9912313728270253, + 21888242871839275222246405745257275088548364400416034343698123845531506746963, + 46815543858706562, + 26593554192061266, + 21888242871839275222246405745257275088548364400416034343698103339652801683423, + 41545982594499750, + 21888242871839275222246405745257275088548364400416034343698201716894275300941, + 21888242871839275222246405745257275088548364400416034343698129842867657885266, + 108729662148741146, + 21888242871839275222246405745257275088548364400416034343698157351421621007881, + 22768647094377519, + 108512988056645413, + 21888242871839275222246405745257275088548364400416034343698100180119427594845, + 21888242871839275222246405745257275088548364400416034343698181597701582711327, + 21888242871839275222246405745257275088548364400416034343698190804863937614154, + 111404642830422380, + 21888242871839275222246405745257275088548364400416034343698158473633364939487, + 21888242871839275222246405745257275088548364400416034343698111263291638886759, + 21888242871839275222246405745257275088548364400416034343698140070160062976831, + 21888242871839275222246405745257275088548364400416034343698110862256641423633, + 21888242871839275222246405745257275088548364400416034343698075040247373271277, + 21888242871839275222246405745257275088548364400416034343698135535913759135813, + 96419686282135177, + 21888242871839275222246405745257275088548364400416034343698097212675615587487, + 21888242871839275222246405745257275088548364400416034343698102653581473891398, + 21888242871839275222246405745257275088548364400416034343698189706484077622701, + 26951421597093832, + 21888242871839275222246405745257275088548364400416034343698096695127726656952, + 120092848762549999, + 21888242871839275222246405745257275088548364400416034343698174294021448269826, + 114978671486611515, + 90355255711687681, + 21888242871839275222246405745257275088548364400416034343698160816602613682789, + 21888242871839275222246405745257275088548364400416034343698139362407206943224, + 63834978901732807, + 21888242871839275222246405745257275088548364400416034343698135057038218917282, + 115000547968324929, + 31829594705781443, + 47409794779427746, + 89429714957009626, + 66007895169519351, + 21888242871839275222246405745257275088548364400416034343698120530329892206390, + 21888242871839275222246405745257275088548364400416034343698093162365087345656, + 21888242871839275222246405745257275088548364400416034343698096535970344188255, + 21888242871839275222246405745257275088548364400416034343698115570724915550301, + 21888242871839275222246405745257275088548364400416034343698071981988729485105, + 72352113703767535, + 21888242871839275222246405745257275088548364400416034343698158549292103453633, + 21888242871839275222246405745257275088548364400416034343698189598795113795059, + 21888242871839275222246405745257275088548364400416034343698129948096334504842, + 21888242871839275222246405745257275088548364400416034343698142130192485782423, + 21888242871839275222246405745257275088548364400416034343698201993508140900486, + 108028008752618551, + 21888242871839275222246405745257275088548364400416034343698071247705140002513, + 21888242871839275222246405745257275088548364400416034343698155400879287189309, + 65538639081806972, + 86707897084054485, + 21888242871839275222246405745257275088548364400416034343698088215382022855842, + 112812976201791434, + 21888242871839275222246405745257275088548364400416034343698107640282418487299, + 29601432543876445, + 110407498965183428, + 21888242871839275222246405745257275088548364400416034343698125445406587611317, + 21888242871839275222246405745257275088548364400416034343698183686082060239087, + 21888242871839275222246405745257275088548364400416034343698194053632977926788, + 21888242871839275222246405745257275088548364400416034343698120091629820255203, + 76059201591354853, + 62304093521448007, + 62831977353139864, + 1875555746608679, + 21888242871839275222246405745257275088548364400416034343698161144199217883713, + 21888242871839275222246405745257275088548364400416034343698118754905183676889, + 21888242871839275222246405745257275088548364400416034343698091836130390732690, + 21888242871839275222246405745257275088548364400416034343698091140425012900713, + 21888242871839275222246405745257275088548364400416034343698068661028596428002, + 21888242871839275222246405745257275088548364400416034343698127414362947820650, + 21888242871839275222246405745257275088548364400416034343698159314846097792536, + 21888242871839275222246405745257275088548364400416034343698092115072805439103, + 21888242871839275222246405745257275088548364400416034343698181633585020807762, + 43513644617797448, + 21888242871839275222246405745257275088548364400416034343698127494416438683535, + 139850384822345022, + 71090143172395560, + 16097536859636091, + 21888242871839275222246405745257275088548364400416034343698191541824404843193, + 21888242871839275222246405745257275088548364400416034343698102372893866168310, + 21888242871839275222246405745257275088548364400416034343698188801417574893854, + 1856428405772259, + 21888242871839275222246405745257275088548364400416034343698185517332659170888, + 126836689451649937, + 21888242871839275222246405745257275088548364400416034343698098216498370532435, + 139098875387060941, + 21888242871839275222246405745257275088548364400416034343698073542385516259949, + 21888242871839275222246405745257275088548364400416034343698098022042738257999, + 100594220407415358, + 21888242871839275222246405745257275088548364400416034343698095468141618150260, + 21888242871839275222246405745257275088548364400416034343698203696750138422138, + 82436298096126899, + 21888242871839275222246405745257275088548364400416034343698112635556999993902, + 31722203519664530, + 21888242871839275222246405745257275088548364400416034343698199148047275031243, + 46120006313226742, + 30008265189147147, + 70898890227338666, + 21888242871839275222246405745257275088548364400416034343698179625440246437785, + 21888242871839275222246405745257275088548364400416034343698142307525566499600, + 21888242871839275222246405745257275088548364400416034343698099021090820035878, + 21888242871839275222246405745257275088548364400416034343698140733868290350757, + 21888242871839275222246405745257275088548364400416034343698137165066312492211, + 21888242871839275222246405745257275088548364400416034343698081077705636295337, + 130771953199926618, + 21888242871839275222246405745257275088548364400416034343698077104474051614243, + 21888242871839275222246405745257275088548364400416034343698106647308164889040, + 59698131486986872, + 80999512489629102, + 66028415228400841, + 126146788220000417, + 134834757169312148, + 108341313742636536, + 21888242871839275222246405745257275088548364400416034343698126636971096454943, + 21888242871839275222246405745257275088548364400416034343698156757559327087160, + 21888242871839275222246405745257275088548364400416034343698163837864106428749, + 21888242871839275222246405745257275088548364400416034343698083089063439916436, + 21888242871839275222246405745257275088548364400416034343698126529380776531572, + 21888242871839275222246405745257275088548364400416034343698122765070712941316, + 21888242871839275222246405745257275088548364400416034343698139312180656082360, + 21888242871839275222246405745257275088548364400416034343698173574590664661050, + 21888242871839275222246405745257275088548364400416034343698086801180467915323, + 10983771307579739, + 141942810223499549, + 73107747900439279, + 21888242871839275222246405745257275088548364400416034343698164606078749815995, + 34623520748788795, + 21888242871839275222246405745257275088548364400416034343698157308303334967514, + 21888242871839275222246405745257275088548364400416034343698186370830405642865, + 92139925609903070, + 21888242871839275222246405745257275088548364400416034343698083149358028734003, + 65716618046494218, + 21888242871839275222246405745257275088548364400416034343698185529615130717567, + 21888242871839275222246405745257275088548364400416034343698201676986309631166, + 21888242871839275222246405745257275088548364400416034343698121414906537410989, + 21888242871839275222246405745257275088548364400416034343698174904691689129014, + 21888242871839275222246405745257275088548364400416034343698098093325815497935, + 21888242871839275222246405745257275088548364400416034343698062795544340989624, + 134324472540362069, + 33854358237944414, + 21888242871839275222246405745257275088548364400416034343698131746903041401834, + 21888242871839275222246405745257275088548364400416034343698127943749171426069, + 25795656875940059, + 65459408139524349, + 21888242871839275222246405745257275088548364400416034343698174656881326876765, + 21888242871839275222246405745257275088548364400416034343698158183593162637597, + 9817345236588527, + 72809151872825103, + 24026014051713427, + 21888242871839275222246405745257275088548364400416034343698096098434762391302, + 85070312523103497, + 21888242871839275222246405745257275088548364400416034343698116235478657486615, + 134347277351848743, + 21888242871839275222246405745257275088548364400416034343698176097817524395625, + 104671854785875329, + 21888242871839275222246405745257275088548364400416034343698165295787108964176, + 32873645080826038, + 21888242871839275222246405745257275088548364400416034343698117701168246112872, + 99971885001912731, + 21888242871839275222246405745257275088548364400416034343698092213072886322370, + 21888242871839275222246405745257275088548364400416034343698062807282405212952, + 81975306822753707, + 44011148003485217, + 21888242871839275222246405745257275088548364400416034343698125386274656989658, + 21888242871839275222246405745257275088548364400416034343698160679658437846946, + 21888242871839275222246405745257275088548364400416034343698143288352440340865, + 123696814141537070, + 21888242871839275222246405745257275088548364400416034343698126311107810546985, + 21888242871839275222246405745257275088548364400416034343698178304554995973790, + 21888242871839275222246405745257275088548364400416034343698093614484091057457, + 20619564375553104, + 43126451062101512, + 134932860687267160, + 135328211865926404, + 21888242871839275222246405745257275088548364400416034343698109471200322625156, + 46865932105758779, + 19635403057220180, + 21888242871839275222246405745257275088548364400416034343698154198055974279518, + 21888242871839275222246405745257275088548364400416034343698159909935758471877, + 103311398598007996, + 41308193281184488, + 131965771432845409, + 131845199545359937, + 30619320351357993, + 21888242871839275222246405745257275088548364400416034343698073748604296281294, + 21888242871839275222246405745257275088548364400416034343698119215399324714294, + 123361748721316817, + 125639156649849204, + 17798809219491455, + 21888242871839275222246405745257275088548364400416034343698124225721301083240, + 61859544231627656, + 99996786048173055, + 21888242871839275222246405745257275088548364400416034343698165739275979378192, + 21888242871839275222246405745257275088548364400416034343698111690500466093335, + 21888242871839275222246405745257275088548364400416034343698105310538020207008, + 100581681876495614, + 115312798808073051, + 2929728190931544, + 21888242871839275222246405745257275088548364400416034343698200186842805735902, + 7014338247000106, + 68900057715809147, + 21888242871839275222246405745257275088548364400416034343698194542247590694329, + 2933521568925282, + 21888242871839275222246405745257275088548364400416034343698088528155845513478, + 21888242871839275222246405745257275088548364400416034343698127686347005379175, + 113610694243530102, + 118143269054374167, + 94951583798467319, + 36049807280276026, + 21888242871839275222246405745257275088548364400416034343698167904455571320661, + 98862905586140124, + 21888242871839275222246405745257275088548364400416034343698169015664397262578, + 21888242871839275222246405745257275088548364400416034343698138192664447398123, + 61679332059654435, + 63104706734485996, + 126653584110379498, + 99704931251511285, + 21888242871839275222246405745257275088548364400416034343698146239596944523007, + 99738987559752712, + 21888242871839275222246405745257275088548364400416034343698186663887834070796, + 21888242871839275222246405745257275088548364400416034343698128661862944909910, + 18544019403668351, + 21888242871839275222246405745257275088548364400416034343698077697305567935888, + 36940839363326222, + 21888242871839275222246405745257275088548364400416034343698072452743955131261, + 21888242871839275222246405745257275088548364400416034343698129261087990409065, + 85182102376043670, + 21888242871839275222246405745257275088548364400416034343698120932909615482844, + 56692774932127566, + 21888242871839275222246405745257275088548364400416034343698171943302696377734, + 21888242871839275222246405745257275088548364400416034343698173728869349312266, + 36861126601694380, + 112231235682645772, + 21888242871839275222246405745257275088548364400416034343698084726730000608359, + 134838252043796894, + 50280589754541162, + 21888242871839275222246405745257275088548364400416034343698172206387617235936, + 21888242871839275222246405745257275088548364400416034343698182912232196606147, + 42404372747117358, + 21888242871839275222246405745257275088548364400416034343698120307431565132099, + 21888242871839275222246405745257275088548364400416034343698124575723163033261, + 91618602240520946, + 138562829725598296, + 134533954087188496, + 21888242871839275222246405745257275088548364400416034343698113454563360199066, + 120813530332233034, + 21888242871839275222246405745257275088548364400416034343698090736102621352144, + 21888242871839275222246405745257275088548364400416034343698195911861040477000, + 124943072084298133, + 113913947666738786, + 21888242871839275222246405745257275088548364400416034343698068812532153570358, + 21888242871839275222246405745257275088548364400416034343698141209979154498520, + 21888242871839275222246405745257275088548364400416034343698152354726253724229, + 21888242871839275222246405745257275088548364400416034343698119962071819987770, + 91297836958546960, + 21888242871839275222246405745257275088548364400416034343698134238901488580369, + 79103395964137623, + 8003941820149047, + 133701948013095188, + 135683905660056392, + 26457128979545740, + 21888242871839275222246405745257275088548364400416034343698189783017051987733, + 21888242871839275222246405745257275088548364400416034343698199027508440833529, + 21888242871839275222246405745257275088548364400416034343698192404960909276691, + 7328447272665043, + 21888242871839275222246405745257275088548364400416034343698109803395241355863, + 21888242871839275222246405745257275088548364400416034343698099926050422273372, + 101268121235867951, + 42833825582134022, + 79989782436835058, + 115073586943710347, + 21888242871839275222246405745257275088548364400416034343698167933794343992455, + 21888242871839275222246405745257275088548364400416034343698081274660140665271, + 21888242871839275222246405745257275088548364400416034343698131103736972545118, + 101922065476410323, + 2351164148216148, + 5580746523760860, + 21888242871839275222246405745257275088548364400416034343698076261262846319448, + 113552437718899513, + 21888242871839275222246405745257275088548364400416034343698113615191066446118, + 72914958032599448, + 25080557383905406, + 21888242871839275222246405745257275088548364400416034343698106882370729367184, + 21888242871839275222246405745257275088548364400416034343698134707775419720620, + 21888242871839275222246405745257275088548364400416034343698170547596652291423, + 28211812824831373, + 77667327816854933, + 21888242871839275222246405745257275088548364400416034343698165915998463130775, + 21888242871839275222246405745257275088548364400416034343698168068646981998753, + 21888242871839275222246405745257275088548364400416034343698130009937055196043, + 21888242871839275222246405745257275088548364400416034343698134085461003789333, + 3847385701622075, + 32330962932305460, + 43570173679642516, + 21888242871839275222246405745257275088548364400416034343698203728636621768935, + 23175285995309760, + 68311193786217314, + 21888242871839275222246405745257275088548364400416034343698173226403210129539, + 79423646783158377, + 117349530569003401, + 21888242871839275222246405745257275088548364400416034343698159357819690920742, + 21888242871839275222246405745257275088548364400416034343698105762003773085657, + 97499870442758463, + 21888242871839275222246405745257275088548364400416034343698196336970199550636, + 11045772039325249, + 39229334362996335, + 6820749011566590, + 69667848345750713, + 31729704832046323, + 21888242871839275222246405745257275088548364400416034343698179432106591865182, + 21888242871839275222246405745257275088548364400416034343698193212313054185759, + 21888242871839275222246405745257275088548364400416034343698067668983038101004, + 21888242871839275222246405745257275088548364400416034343698087823711066404764, + 21888242871839275222246405745257275088548364400416034343698189249685052331693, + 47501279347415232, + 88839850623319854, + 124065823246620731, + 57794517973249713, + 120213762410351239, + 120654173842210035, + 134279013317744245, + 60096507364506096, + 105160814332694846, + 21888242871839275222246405745257275088548364400416034343698153900761086610793, + 21888242871839275222246405745257275088548364400416034343698189571865204289369, + 32692056226780007, + 72129618450601774, + 21888242871839275222246405745257275088548364400416034343698164541078943809690, + 21888242871839275222246405745257275088548364400416034343698133450068975381405, + 21888242871839275222246405745257275088548364400416034343698144050003329341571, + 130113450475944587, + 21888242871839275222246405745257275088548364400416034343698122552072421246493, + 21888242871839275222246405745257275088548364400416034343698182182901525273084, + 21888242871839275222246405745257275088548364400416034343698075936407694597218, + 137016257776768878, + 128962949794552657, + 82623691058260140, + 17762671369073610, + 21888242871839275222246405745257275088548364400416034343698168134011093691587, + 21888242871839275222246405745257275088548364400416034343698060380270846055121, + 125617679680842207, + 21888242871839275222246405745257275088548364400416034343698099292576492181370, + 19765387130130762, + 21888242871839275222246405745257275088548364400416034343698068075054477104645, + 21888242871839275222246405745257275088548364400416034343698165520446685172214, + 21888242871839275222246405745257275088548364400416034343698178064378102564571, + 21888242871839275222246405745257275088548364400416034343698154523329369918176, + 21888242871839275222246405745257275088548364400416034343698068756739568177389, + 108252306156859592, + 123786861789728321, + 135360586677075468, + 21888242871839275222246405745257275088548364400416034343698168977703879926412, + 21888242871839275222246405745257275088548364400416034343698081706874713046320, + 30635836336115920, + 23101240352563523, + 494318036339541, + 65890725294641010, + 26650475965781792, + 21888242871839275222246405745257275088548364400416034343698185988039237629368, + 37846965505394166, + 6731358275053327, + 135371496063067254, + 21888242871839275222246405745257275088548364400416034343698170961976619356242, + 107775313802925921, + 21888242871839275222246405745257275088548364400416034343698103674694753676917, + 21888242871839275222246405745257275088548364400416034343698061430782962177585, + 140186889810753371, + 86521232680485019, + 70849700817952198, + 15806611848419531, + 51509669385252695, + 21888242871839275222246405745257275088548364400416034343698178017633198639271, + 21888242871839275222246405745257275088548364400416034343698141427439461607265, + 86637213231556742, + 21888242871839275222246405745257275088548364400416034343698168794689628680185, + 21888242871839275222246405745257275088548364400416034343698109247479532838453, + 21888242871839275222246405745257275088548364400416034343698071993808957067356, + 21888242871839275222246405745257275088548364400416034343698120081661790820260, + 21888242871839275222246405745257275088548364400416034343698109763249710022229, + 21888242871839275222246405745257275088548364400416034343698069267934351608480, + 21888242871839275222246405745257275088548364400416034343698110221380055005594, + 13775424129962098, + 24180076422038416, + 21888242871839275222246405745257275088548364400416034343698200245794269935793, + 61105347299867033, + 21888242871839275222246405745257275088548364400416034343698087966630058392417, + 52659543215182303, + 114747505547607249, + 64939819613630351, + 21888242871839275222246405745257275088548364400416034343698068837062270691598, + 123195758620405101, + 21888242871839275222246405745257275088548364400416034343698175388506743007663, + 49950127170035, + 21888242871839275222246405745257275088548364400416034343698118966439461447464, + 119430831110875352, + 21888242871839275222246405745257275088548364400416034343698097858564850285791, + 21888242871839275222246405745257275088548364400416034343698166494796149618856, + 21888242871839275222246405745257275088548364400416034343698091789030928050511, + 21888242871839275222246405745257275088548364400416034343698182809794083057418, + 84778258633133746, + 21888242871839275222246405745257275088548364400416034343698092957262654613858, + 10154784897137825, + 74746154507790616, + 21888242871839275222246405745257275088548364400416034343698138370773527465594, + 21888242871839275222246405745257275088548364400416034343698204088133936895134, + 24635120081878303, + 21888242871839275222246405745257275088548364400416034343698146338487455699106, + 21888242871839275222246405745257275088548364400416034343698155202518461367131, + 21888242871839275222246405745257275088548364400416034343698135950119951350142, + 21888242871839275222246405745257275088548364400416034343698147366243315815456, + 21888242871839275222246405745257275088548364400416034343698174613207278202236, + 36778346686735457, + 36329582291971011, + 21888242871839275222246405745257275088548364400416034343698147675151747900261, + 21888242871839275222246405745257275088548364400416034343698174294545994317893, + 20603605642948798, + 21888242871839275222246405745257275088548364400416034343698089370389650239687, + 56808389391547783, + 21888242871839275222246405745257275088548364400416034343698165736868177925702, + 21410032341853076, + 32627437789008474, + 21888242871839275222246405745257275088548364400416034343698120079726653468509, + 15223185769853726, + 138192864953873447, + 133365252714933979, + 21888242871839275222246405745257275088548364400416034343698094688745510891596, + 110736803281552357, + 21888242871839275222246405745257275088548364400416034343698120654542452399559, + 120779495807908524, + 21888242871839275222246405745257275088548364400416034343698183674730377234583, + 21888242871839275222246405745257275088548364400416034343698177679982676059252, + 21888242871839275222246405745257275088548364400416034343698202469405384699705, + 21888242871839275222246405745257275088548364400416034343698196399673146226778, + 43503709600672561, + 33588132254329676, + 45176918248325481, + 21888242871839275222246405745257275088548364400416034343698194288937672380201, + 11220482246706724, + 107945427596294915, + 21888242871839275222246405745257275088548364400416034343698202984367062242132, + 21888242871839275222246405745257275088548364400416034343698149067062599125468, + 6616899046184389, + 71652820866581633, + 21888242871839275222246405745257275088548364400416034343698124587275110435556, + 68829520587830566, + 21888242871839275222246405745257275088548364400416034343698176712506508342905, + 21888242871839275222246405745257275088548364400416034343698114548623389555498, + 21888242871839275222246405745257275088548364400416034343698189478164293317705, + 49443705790814984, + 113308288629748265, + 8916118098733883, + 6945110194926031, + 21888242871839275222246405745257275088548364400416034343698090402734747960145, + 21888242871839275222246405745257275088548364400416034343698132201450562960658, + 74481453194485191, + 21888242871839275222246405745257275088548364400416034343698156469311068608468, + 21888242871839275222246405745257275088548364400416034343698149429225297341348, + 21888242871839275222246405745257275088548364400416034343698089587749940124994, + 92516533706127181, + 108771424064131481, + 32903160571568774, + 21888242871839275222246405745257275088548364400416034343698164306413218301758, + 21888242871839275222246405745257275088548364400416034343698174059996026544692, + 18071346373972546, + 31472396461285038, + 21888242871839275222246405745257275088548364400416034343698111730318419885738, + 69780403438962299, + 129778335832251647, + 23856637482264841, + 21888242871839275222246405745257275088548364400416034343698170139942900632263, + 66420424235850943, + 25717785478088504, + 4124699301239069, + 6714703680429301, + 38061446156233776, + 21888242871839275222246405745257275088548364400416034343698090525121827926748, + 3487126689961083, + 21888242871839275222246405745257275088548364400416034343698128496860552492046, + 93965307022258015, + 21888242871839275222246405745257275088548364400416034343698177187531326702893, + 21888242871839275222246405745257275088548364400416034343698115748500978960056, + 69109177355672390, + 21888242871839275222246405745257275088548364400416034343698132115344938404370, + 63493829163482018, + 3389116255852927, + 21888242871839275222246405745257275088548364400416034343698085008825928209385, + 21888242871839275222246405745257275088548364400416034343698201351017641794632, + 21888242871839275222246405745257275088548364400416034343698079760324694078823, + 36681108969632141, + 59933326883304381, + 21888242871839275222246405745257275088548364400416034343698064399239958701903, + 21888242871839275222246405745257275088548364400416034343698111317512046977212, + 14223136345635626, + 102897651662371052, + 44568374299561239, + 21888242871839275222246405745257275088548364400416034343698184338269526177114, + 116882956343683778, + 21888242871839275222246405745257275088548364400416034343698071461984705140257, + 21888242871839275222246405745257275088548364400416034343698175354925416920945, + 28436151416045634, + 21888242871839275222246405745257275088548364400416034343698146137859540325936, + 21888242871839275222246405745257275088548364400416034343698116107642140867337, + 97476884846563449, + 21888242871839275222246405745257275088548364400416034343698161755804966371714, + 21888242871839275222246405745257275088548364400416034343698082992867251286882, + 84609231983419232, + 21888242871839275222246405745257275088548364400416034343698132057652505503600, + 21888242871839275222246405745257275088548364400416034343698063811404418735329, + 21888242871839275222246405745257275088548364400416034343698201299533697529288, + 21888242871839275222246405745257275088548364400416034343698065104692031356723, + 21888242871839275222246405745257275088548364400416034343698198166139481789665, + 95044575706000562, + 19729942577802906, + 107188137371962316, + 374653399258845, + 21888242871839275222246405745257275088548364400416034343698137203952403563800, + 21888242871839275222246405745257275088548364400416034343698099738269818722336, + 21888242871839275222246405745257275088548364400416034343698112320791200751996, + 138539812401739412, + 97343989018417112, + 117034856272441755, + 47604116038798841, + 21888242871839275222246405745257275088548364400416034343698166146720801870121, + 21888242871839275222246405745257275088548364400416034343698088125994004124014, + 124857763900969376, + 64928005938193138, + 79230037362420130, + 8999673079423458, + 78035465080233241, + 21888242871839275222246405745257275088548364400416034343698106623953860104394, + 55871937173184048, + 21888242871839275222246405745257275088548364400416034343698113649694285736070, + 1687356834784778, + 130301051990180425, + 21888242871839275222246405745257275088548364400416034343698128659212157343957, + 31858286506658153, + 21888242871839275222246405745257275088548364400416034343698188373869913722853, + 73052540018874238, + 66058505126972473, + 21888242871839275222246405745257275088548364400416034343698116621386759013540, + 21888242871839275222246405745257275088548364400416034343698135281341414894750, + 78648819577625852, + 21888242871839275222246405745257275088548364400416034343698145222999410977719, + 21888242871839275222246405745257275088548364400416034343698079499936785475737, + 97748054647029687, + 21888242871839275222246405745257275088548364400416034343698146320386721764984, + 54794278546235147, + 9032321066670539, + 127698720637580640, + 137042701258240488, + 35975755909232915, + 49595620545660731, + 21888242871839275222246405745257275088548364400416034343698146362803729081167, + 21888242871839275222246405745257275088548364400416034343698195182001059744376, + 137534510704110939, + 88365163365007046, + 21888242871839275222246405745257275088548364400416034343698063280402039744827, + 21888242871839275222246405745257275088548364400416034343698144154241637427568, + 21888242871839275222246405745257275088548364400416034343698077422343158776681, + 21888242871839275222246405745257275088548364400416034343698121475086672949675, + 14560758530027840, + 46466304989780040, + 21888242871839275222246405745257275088548364400416034343698110494267420993715, + 21888242871839275222246405745257275088548364400416034343698078388420879302272, + 100612323472204375, + 17024687315405488, + 131559611873275068, + 21888242871839275222246405745257275088548364400416034343698096883168465649411, + 21888242871839275222246405745257275088548364400416034343698069806194271556300, + 21888242871839275222246405745257275088548364400416034343698128385809575601200, + 21888242871839275222246405745257275088548364400416034343698067300448842688777, + 66648186778433159, + 34004506532675830, + 21888242871839275222246405745257275088548364400416034343698141090814497107076, + 76946525357152403, + 28131281347135159, + 18378627416802406, + 21888242871839275222246405745257275088548364400416034343698071554177905792394, + 58627160640287404, + 21888242871839275222246405745257275088548364400416034343698170290261246772831, + 21888242871839275222246405745257275088548364400416034343698171759510407329929, + 117824687927674858, + 115510701898655444, + 134757531952338135, + 21888242871839275222246405745257275088548364400416034343698111794388328542408, + 109602236217890658, + 21888242871839275222246405745257275088548364400416034343698191771216877733288, + 132541088190342865, + 6846487235844520, + 21888242871839275222246405745257275088548364400416034343698098768440045452363, + 79902694573310314, + 21888242871839275222246405745257275088548364400416034343698125358360420628811, + 21888242871839275222246405745257275088548364400416034343698112916732088823667, + 21888242871839275222246405745257275088548364400416034343698089446337217324349, + 21888242871839275222246405745257275088548364400416034343698175036458420402881, + 108638202616729336, + 129824387115422243, + 21888242871839275222246405745257275088548364400416034343698084203900500631413, + 21888242871839275222246405745257275088548364400416034343698151056527962602800, + 21888242871839275222246405745257275088548364400416034343698099890092905656314, + 21888242871839275222246405745257275088548364400416034343698112375338185366906, + 17720688723947431, + 19716127732918967, + 21888242871839275222246405745257275088548364400416034343698068368035244803336, + 21888242871839275222246405745257275088548364400416034343698174615677686332788, + 21888242871839275222246405745257275088548364400416034343698141200357408113690, + 86479126449104860, + 21888242871839275222246405745257275088548364400416034343698180190790893492056, + 21888242871839275222246405745257275088548364400416034343698152262116453430426, + 21888242871839275222246405745257275088548364400416034343698074015697467932996, + 21888242871839275222246405745257275088548364400416034343698092662233215942996, + 99825796662177667, + 56916785325948306, + 21888242871839275222246405745257275088548364400416034343698200385248373078465, + 21888242871839275222246405745257275088548364400416034343698152553107851606284, + 110883484017155027, + 21888242871839275222246405745257275088548364400416034343698142449502749715247, + 21888242871839275222246405745257275088548364400416034343698061904704219619531, + 21888242871839275222246405745257275088548364400416034343698171576984570756301, + 21888242871839275222246405745257275088548364400416034343698152977088647095547, + 21888242871839275222246405745257275088548364400416034343698123155402098865855, + 126325045994630448, + 21888242871839275222246405745257275088548364400416034343698151328155169926845, + 21888242871839275222246405745257275088548364400416034343698139889773047389234, + 21888242871839275222246405745257275088548364400416034343698096410729610733514, + 21888242871839275222246405745257275088548364400416034343698143787105194451947, + 21888242871839275222246405745257275088548364400416034343698197595140738196852, + 21888242871839275222246405745257275088548364400416034343698062743839070128969, + 21888242871839275222246405745257275088548364400416034343698136253436668280968, + 21888242871839275222246405745257275088548364400416034343698100837862731882611, + 140918576621334140, + 140271372906370703, + 117623847059767932, + 70494699944886284, + 95483184038712327, + 38815970747335458, + 21888242871839275222246405745257275088548364400416034343698181306911342390310, + 21888242871839275222246405745257275088548364400416034343698109491923277580715, + 21888242871839275222246405745257275088548364400416034343698134212715120168682, + 21888242871839275222246405745257275088548364400416034343698102193942404843454, + 16540505818891196, + 87082501529152915, + 9728701143267242, + 21888242871839275222246405745257275088548364400416034343698195319291826016784, + 21888242871839275222246405745257275088548364400416034343698065781169599427699, + 21888242871839275222246405745257275088548364400416034343698139316685081257129, + 21888242871839275222246405745257275088548364400416034343698135481011142765649, + 52240677629858054, + 109913359146842095, + 21888242871839275222246405745257275088548364400416034343698164041244264422329, + 21888242871839275222246405745257275088548364400416034343698146582043070165514, + 21888242871839275222246405745257275088548364400416034343698202496374362690104, + 123205333527373259, + 21888242871839275222246405745257275088548364400416034343698089587956235350050, + 67754871736771837, + 34485016354871417, + 21888242871839275222246405745257275088548364400416034343698069037757923013297, + 4403092345246297, + 21888242871839275222246405745257275088548364400416034343698105486824522320406, + 60730605439962320, + 23666070382623675, + 56486511330854561, + 21888242871839275222246405745257275088548364400416034343698144532370167538553, + 132783743760650094, + 21888242871839275222246405745257275088548364400416034343698135841579719467277, + 33696829137342763, + 21888242871839275222246405745257275088548364400416034343698112098548377927211, + 66778367560945379, + 21888242871839275222246405745257275088548364400416034343698143944199474610106, + 21888242871839275222246405745257275088548364400416034343698064950571273162148, + 21888242871839275222246405745257275088548364400416034343698175493623752340991, + 21888242871839275222246405745257275088548364400416034343698094217724475874522, + 21888242871839275222246405745257275088548364400416034343698193992863130878236, + 47847885518205251, + 21888242871839275222246405745257275088548364400416034343698188550144295651973, + 21888242871839275222246405745257275088548364400416034343698133784704138438404, + 21888242871839275222246405745257275088548364400416034343698085089451813731607, + 21888242871839275222246405745257275088548364400416034343698176622561522092807, + 105194618269390834, + 21888242871839275222246405745257275088548364400416034343698110226020447815042, + 21888242871839275222246405745257275088548364400416034343698106152817607752131, + 26654043876176581, + 137349364322995251, + 103966739644886812, + 57806575513179686, + 109056606126173381, + 97603166839266985, + 21888242871839275222246405745257275088548364400416034343698095072934776591499, + 21888242871839275222246405745257275088548364400416034343698164606245180415842, + 21888242871839275222246405745257275088548364400416034343698110814502831176234, + 21888242871839275222246405745257275088548364400416034343698092333817138330663, + 21888242871839275222246405745257275088548364400416034343698189151245815572496, + 37397326835071751, + 97031640208862593, + 58099410925902939, + 21888242871839275222246405745257275088548364400416034343698101640988196555192, + 21888242871839275222246405745257275088548364400416034343698103840098978301587, + 17388190809978626, + 21888242871839275222246405745257275088548364400416034343698108724538064250729, + 8458948152909781, + 122670458925367013, + 121869806541544213, + 112098663268755382, + 65533875811452028, + 20795939069778815, + 21888242871839275222246405745257275088548364400416034343698139634291387604725, + 21888242871839275222246405745257275088548364400416034343698129347376919062961, + 141796507377306243, + 141293235201866235, + 81632323142385633, + 98243240535728190, + 34121214114137635, + 21888242871839275222246405745257275088548364400416034343698121350783416884932, + 26511466914505551, + 11291322808243349, + 21888242871839275222246405745257275088548364400416034343698142673036211120360, + 21888242871839275222246405745257275088548364400416034343698067559690901407641, + 81668706107741043, + 67268377135717389, + 54659995386069926, + 21888242871839275222246405745257275088548364400416034343698066451162818758316, + 122996103187128900, + 21888242871839275222246405745257275088548364400416034343698093389128829197988, + 21888242871839275222246405745257275088548364400416034343698092585864657556090, + 30156593648501806, + 21888242871839275222246405745257275088548364400416034343698082414030054204608, + 21888242871839275222246405745257275088548364400416034343698127080883484833162, + 21888242871839275222246405745257275088548364400416034343698174724061011445105, + 21888242871839275222246405745257275088548364400416034343698155152610569099039, + 21888242871839275222246405745257275088548364400416034343698085278455254715770, + 132079425676523589, + 21888242871839275222246405745257275088548364400416034343698103031450421526985, + 21888242871839275222246405745257275088548364400416034343698176160708728313286, + 21888242871839275222246405745257275088548364400416034343698098216944890275043, + 21888242871839275222246405745257275088548364400416034343698070908484824461530, + 21888242871839275222246405745257275088548364400416034343698135811404554349546, + 4879830010800285, + 9346742417604009, + 21888242871839275222246405745257275088548364400416034343698179824877278571063, + 21888242871839275222246405745257275088548364400416034343698077777663108922657, + 70459389565888915, + 118318908356927073, + 38496910131563854, + 21888242871839275222246405745257275088548364400416034343698150250225735318783, + 21888242871839275222246405745257275088548364400416034343698191995625937656963, + 71934929329952895, + 21888242871839275222246405745257275088548364400416034343698153093808332281213, + 21888242871839275222246405745257275088548364400416034343698067725574805937795, + 21888242871839275222246405745257275088548364400416034343698094769950175411553, + 71245169514130551, + 21888242871839275222246405745257275088548364400416034343698170989551637770776, + 21888242871839275222246405745257275088548364400416034343698081213532848437981, + 21888242871839275222246405745257275088548364400416034343698136517563614435366, + 1444091615138424, + 126444665236399410, + 21888242871839275222246405745257275088548364400416034343698168195857236240261, + 21888242871839275222246405745257275088548364400416034343698098062082589394799, + 99184642083210984, + 60032308771593854, + 21888242871839275222246405745257275088548364400416034343698081443684296392947, + 21888242871839275222246405745257275088548364400416034343698090922557372125386, + 110824191947507579, + 21888242871839275222246405745257275088548364400416034343698101258649050978084, + 21888242871839275222246405745257275088548364400416034343698116689943673717303, + 89457176031975010, + 21888242871839275222246405745257275088548364400416034343698153397844251573290, + 21888242871839275222246405745257275088548364400416034343698096758880241680497, + 21888242871839275222246405745257275088548364400416034343698067060591705444321, + 102326066347779643, + 11103143475562669, + 36035692172746254, + 21888242871839275222246405745257275088548364400416034343698078119419666723313, + 21888242871839275222246405745257275088548364400416034343698086135748377387695, + 21888242871839275222246405745257275088548364400416034343698149559531577112028, + 43732885463185116, + 72308297837149053, + 21888242871839275222246405745257275088548364400416034343698154675913587567005, + 21888242871839275222246405745257275088548364400416034343698085822900795017814, + 21888242871839275222246405745257275088548364400416034343698078880890963226627, + 140688106507103693, + 44251082877276783, + 21888242871839275222246405745257275088548364400416034343698195963257848806871, + 100318675996267355, + 84202337956862883, + 3291867749953900, + 40623582263096563, + 143857989552118372, + 133200987297904701, + 72898902627312666, + 21888242871839275222246405745257275088548364400416034343698080968662714040771, + 21888242871839275222246405745257275088548364400416034343698151322248698578704, + 21888242871839275222246405745257275088548364400416034343698087982621948838280, + 115170379686910662, + 21888242871839275222246405745257275088548364400416034343698171383939487332602, + 21888242871839275222246405745257275088548364400416034343698074885287644111625, + 88782391449337102, + 143115972505952894, + 23714437222779497, + 42515813673946402, + 21888242871839275222246405745257275088548364400416034343698174134345320433055, + 21888242871839275222246405745257275088548364400416034343698193227767823930917, + 66935458782600223, + 83842725607006092, + 81568427282309510, + 118242837876876391, + 21888242871839275222246405745257275088548364400416034343698143271593362944179, + 21888242871839275222246405745257275088548364400416034343698181191686659874466, + 21888242871839275222246405745257275088548364400416034343698121386552684036754, + 56933244147602992, + 82027489597835301, + 21888242871839275222246405745257275088548364400416034343698061668008551382005, + 21888242871839275222246405745257275088548364400416034343698077819951817114949, + 3773052089392325, + 7905472034031318, + 82072885882528657, + 72179452071157326, + 73197002151240885, + 21888242871839275222246405745257275088548364400416034343698121835421911539122, + 69537848030287787, + 30943882974464677, + 21888242871839275222246405745257275088548364400416034343698089057731321058665, + 45574684102543393, + 21888242871839275222246405745257275088548364400416034343698134155643494892340, + 39966067045102157, + 21888242871839275222246405745257275088548364400416034343698081312202789515406, + 77843035151002764, + 21888242871839275222246405745257275088548364400416034343698197774806705136194, + 22795208129649729, + 21888242871839275222246405745257275088548364400416034343698160718276562978874, + 132568859687435934, + 21888242871839275222246405745257275088548364400416034343698069604995499645007, + 21888242871839275222246405745257275088548364400416034343698136588312447069293, + 21888242871839275222246405745257275088548364400416034343698104956263415347724, + 37429998560458486, + 21888242871839275222246405745257275088548364400416034343698165085446953957565, + 72570812477141285, + 132788493383489553, + 21888242871839275222246405745257275088548364400416034343698179065528993356987, + 107665396270318151, + 50770363236790318, + 21888242871839275222246405745257275088548364400416034343698158250591493195182, + 21888242871839275222246405745257275088548364400416034343698110431098437542633, + 128094261969083140, + 21888242871839275222246405745257275088548364400416034343698143105783503427742, + 58845133618761954, + 21888242871839275222246405745257275088548364400416034343698152087588242982708, + 21888242871839275222246405745257275088548364400416034343698147777557372352669, + 21888242871839275222246405745257275088548364400416034343698181606257905205552, + 34108375035053972, + 21888242871839275222246405745257275088548364400416034343698172822137450094220, + 21888242871839275222246405745257275088548364400416034343698116144288959137618, + 92947278809182278, + 21888242871839275222246405745257275088548364400416034343698078264015158041053, + 109115263235131038, + 81814301012789712, + 21888242871839275222246405745257275088548364400416034343698097036542068230091, + 54176768358426093, + 21888242871839275222246405745257275088548364400416034343698073441017965194385, + 122103185543277671, + 21888242871839275222246405745257275088548364400416034343698072535430994888502, + 21888242871839275222246405745257275088548364400416034343698067339179205898795, + 98519215172133896, + 106985373432185035, + 21888242871839275222246405745257275088548364400416034343698169610360746258437, + 59994296495604856, + 21888242871839275222246405745257275088548364400416034343698106417512898263527, + 21888242871839275222246405745257275088548364400416034343698152185252216885520, + 21888242871839275222246405745257275088548364400416034343698122304402496912572, + 117534949331533291, + 53417239178656301, + 21888242871839275222246405745257275088548364400416034343698110684919109593144, + 101203062173343681, + 21888242871839275222246405745257275088548364400416034343698076210472385965060, + 117171740713707402, + 21888242871839275222246405745257275088548364400416034343698185588907311930782, + 21888242871839275222246405745257275088548364400416034343698187642730401899776, + 93928020466153754, + 21888242871839275222246405745257275088548364400416034343698129450645734238206, + 21888242871839275222246405745257275088548364400416034343698099837005064493136, + 21888242871839275222246405745257275088548364400416034343698066380653890356918, + 116424996085431290, + 21888242871839275222246405745257275088548364400416034343698145310129953412017, + 78489975851560414, + 21888242871839275222246405745257275088548364400416034343698193936076093492742, + 21888242871839275222246405745257275088548364400416034343698064200106376934786, + 60143908116564041, + 23162415248387886, + 72323076740924371, + 21888242871839275222246405745257275088548364400416034343698115415118052943382, + 21888242871839275222246405745257275088548364400416034343698190339635461267145, + 21231317048745442, + 21888242871839275222246405745257275088548364400416034343698160357092899692528, + 21888242871839275222246405745257275088548364400416034343698189963906391708329, + 21888242871839275222246405745257275088548364400416034343698173817167393021575, + 115162336153148589, + 96718431916766251, + 53031399203354778, + 89043133470828559, + 9305001629222878, + 80354956451282340, + 111354462411886131, + 21888242871839275222246405745257275088548364400416034343698153854825190033274, + 21888242871839275222246405745257275088548364400416034343698181534112084561515, + 21888242871839275222246405745257275088548364400416034343698167502229941105932, + 21888242871839275222246405745257275088548364400416034343698117257366317795857, + 21888242871839275222246405745257275088548364400416034343698142304895438330691, + 121443796135765514, + 6531684509630351, + 21888242871839275222246405745257275088548364400416034343698184928979875877669, + 21888242871839275222246405745257275088548364400416034343698098660080248256153, + 118207832031007332, + 121383780993150456, + 21888242871839275222246405745257275088548364400416034343698155102005040211565, + 21888242871839275222246405745257275088548364400416034343698116423726459586958, + 21888242871839275222246405745257275088548364400416034343698187743018240876820, + 21888242871839275222246405745257275088548364400416034343698163003608126013160, + 21888242871839275222246405745257275088548364400416034343698130250481261544480, + 21888242871839275222246405745257275088548364400416034343698069754275744110207, + 21888242871839275222246405745257275088548364400416034343698089854324163079996, + 21888242871839275222246405745257275088548364400416034343698076479434383827637, + 21888242871839275222246405745257275088548364400416034343698060938931512638011, + 21888242871839275222246405745257275088548364400416034343698123893630506871424, + 121947444562239634, + 21888242871839275222246405745257275088548364400416034343698196610093636170864, + 21888242871839275222246405745257275088548364400416034343698127050733672813737, + 34372825750204018, + 21888242871839275222246405745257275088548364400416034343698063463969031258800, + 71290533063426287, + 21888242871839275222246405745257275088548364400416034343698103395128354372119, + 21888242871839275222246405745257275088548364400416034343698155907110598652787, + 21888242871839275222246405745257275088548364400416034343698087431368334051513, + 21888242871839275222246405745257275088548364400416034343698067470106846559220, + 21888242871839275222246405745257275088548364400416034343698198589134068198366, + 21888242871839275222246405745257275088548364400416034343698137913415999790154, + 18580739193275601, + 21888242871839275222246405745257275088548364400416034343698111139392397817783, + 21888242871839275222246405745257275088548364400416034343698141314365532455157, + 91802167276024042, + 21888242871839275222246405745257275088548364400416034343698154507526852244756, + 64323923029548003, + 21888242871839275222246405745257275088548364400416034343698111558348769488984, + 21888242871839275222246405745257275088548364400416034343698169311042014842219, + 33018366045924573, + 137250573960804525, + 18596818429944344, + 95345307724003238, + 21888242871839275222246405745257275088548364400416034343698180188492268433238, + 25350225160959096, + 48474159823867828, + 21888242871839275222246405745257275088548364400416034343698176453409811815276, + 21888242871839275222246405745257275088548364400416034343698182863253188330024, + 80583449787303353, + 30439939137975318, + 127243091796166526, + 7107602928784361, + 21888242871839275222246405745257275088548364400416034343698154433313696348679, + 11948747916933113, + 3658156802669095, + 39161466284124874, + 140356753972384513, + 21888242871839275222246405745257275088548364400416034343698129141776078860473, + 24300912374903606, + 99377608916693636, + 21888242871839275222246405745257275088548364400416034343698089344757619205746, + 21888242871839275222246405745257275088548364400416034343698197093344209435683, + 21888242871839275222246405745257275088548364400416034343698173389973819304824, + 45995857196313660, + 143692492116625983, + 21888242871839275222246405745257275088548364400416034343698081698956168773411, + 52828739817827705, + 32597376744443249, + 21888242871839275222246405745257275088548364400416034343698178469455794647352, + 21143780569751147, + 21888242871839275222246405745257275088548364400416034343698092152599526175779, + 21888242871839275222246405745257275088548364400416034343698102524899618308526, + 75840379037562346, + 21888242871839275222246405745257275088548364400416034343698145504613026367820, + 21888242871839275222246405745257275088548364400416034343698064851126528717649, + 21888242871839275222246405745257275088548364400416034343698179873645782420254, + 75573265052683505, + 21888242871839275222246405745257275088548364400416034343698141937965769145277, + 21888242871839275222246405745257275088548364400416034343698173221245278298782, + 94347118562002253, + 82451484025429939, + 21888242871839275222246405745257275088548364400416034343698201367311821559800, + 21888242871839275222246405745257275088548364400416034343698127813126241651376, + 21888242871839275222246405745257275088548364400416034343698129029213431079605, + 21888242871839275222246405745257275088548364400416034343698145383053509310456, + 21888242871839275222246405745257275088548364400416034343698166521789598277854, + 21888242871839275222246405745257275088548364400416034343698116853159220743109, + 104601695303257787, + 21888242871839275222246405745257275088548364400416034343698067579452737255208, + 127288328405054765, + 50068052031550087, + 52587438214783745, + 31133150626737048, + 75023494069380721, + 21888242871839275222246405745257275088548364400416034343698198146506717544925, + 21888242871839275222246405745257275088548364400416034343698174438877490739494, + 21888242871839275222246405745257275088548364400416034343698160043839212044801, + 94432365728187762, + 21888242871839275222246405745257275088548364400416034343698147273254641199496, + 2124386104797830, + 103669988649871374, + 21888242871839275222246405745257275088548364400416034343698199949452293295965, + 19771959007237108, + 21888242871839275222246405745257275088548364400416034343698161355922251868485, + 21888242871839275222246405745257275088548364400416034343698081890162994733854, + 43752332306630304, + 21888242871839275222246405745257275088548364400416034343698129541533687451703, + 21888242871839275222246405745257275088548364400416034343698114816418272547949, + 48885105717382701, + 76536696186506778, + 21888242871839275222246405745257275088548364400416034343698201315373975587645, + 4203813599894241, + 21888242871839275222246405745257275088548364400416034343698065045267602995097, + 107251893557227637, + 21888242871839275222246405745257275088548364400416034343698185481064117440598, + 63790882231506236, + 21888242871839275222246405745257275088548364400416034343698080037818328373600, + 107442388045966461, + 81208069267966636, + 21888242871839275222246405745257275088548364400416034343698073570913155355956, + 21888242871839275222246405745257275088548364400416034343698171769428872632451, + 57033506972430900, + 21888242871839275222246405745257275088548364400416034343698124402923994447219, + 93171286951299279, + 21888242871839275222246405745257275088548364400416034343698190980890992702615, + 52308433658861735, + 21888242871839275222246405745257275088548364400416034343698098360056220055344, + 21888242871839275222246405745257275088548364400416034343698174422735114729151, + 21888242871839275222246405745257275088548364400416034343698169258447217748442, + 16307171983104742, + 21888242871839275222246405745257275088548364400416034343698061825053914365537, + 21888242871839275222246405745257275088548364400416034343698106890966177581680, + 21888242871839275222246405745257275088548364400416034343698189290155529439573, + 73953317759234432, + 21888242871839275222246405745257275088548364400416034343698184118393112667452, + 96549950389458141, + 72988302639269002, + 76358669296028690, + 21888242871839275222246405745257275088548364400416034343698128011141354725845, + 21888242871839275222246405745257275088548364400416034343698091294831043049371, + 21888242871839275222246405745257275088548364400416034343698191679401324855759, + 97947054321252569, + 141735160014630867, + 21888242871839275222246405745257275088548364400416034343698200723458544439928, + 110107862049146109, + 21888242871839275222246405745257275088548364400416034343698177848919255251799, + 108321533839896213, + 21888242871839275222246405745257275088548364400416034343698125591220950664184, + 29889839419637731, + 27373390503966755, + 85615761652036803, + 21888242871839275222246405745257275088548364400416034343698186719103183339917, + 21888242871839275222246405745257275088548364400416034343698124902410749850830, + 19402097172863855, + 21888242871839275222246405745257275088548364400416034343698134987642037338706, + 130350958347120272, + 46134086851764438, + 26501569434032747, + 124234070873582080, + 21888242871839275222246405745257275088548364400416034343698146062077037217064, + 71154277885497146, + 140810708131822372, + 114507048572443940, + 21888242871839275222246405745257275088548364400416034343698143995706170030644, + 133368983064257494, + 76187855954203289, + 15503144451910814, + 21888242871839275222246405745257275088548364400416034343698202785473476397248, + 3294751223789991, + 21888242871839275222246405745257275088548364400416034343698080210376798575553, + 21888242871839275222246405745257275088548364400416034343698076834693560618107, + 23597656100944706, + 21888242871839275222246405745257275088548364400416034343698082198384410840650, + 100703554643926138, + 21888242871839275222246405745257275088548364400416034343698111686025219017364, + 19222605132647068, + 21888242871839275222246405745257275088548364400416034343698085079780929243566, + 55809652103424055, + 98411810942662109, + 21888242871839275222246405745257275088548364400416034343698198732069952369207, + 108935905885762052, + 21888242871839275222246405745257275088548364400416034343698091585495948522823, + 65900881160706672, + 21227381515919126, + 128332486292497035, + 108476365629980493, + 21888242871839275222246405745257275088548364400416034343698180877586836045398, + 133542594338283957, + 21888242871839275222246405745257275088548364400416034343698195849557306313742, + 21888242871839275222246405745257275088548364400416034343698158974331101939998, + 107318830366403539, + 10063517754699067, + 128108268757720714, + 21888242871839275222246405745257275088548364400416034343698164951743563455644, + 21888242871839275222246405745257275088548364400416034343698150944738313582898, + 21888242871839275222246405745257275088548364400416034343698197499207158695283, + 132413604661240038, + 98415595966535434, + 21888242871839275222246405745257275088548364400416034343698194223620691704318, + 21888242871839275222246405745257275088548364400416034343698155146316919768859, + 21888242871839275222246405745257275088548364400416034343698127908572452586021, + 21888242871839275222246405745257275088548364400416034343698182145056197234279, + 21888242871839275222246405745257275088548364400416034343698162999924608890130, + 21888242871839275222246405745257275088548364400416034343698165650365931577322, + 21888242871839275222246405745257275088548364400416034343698094269424102249486, + 122087690430914265, + 21888242871839275222246405745257275088548364400416034343698096807185386032569, + 21888242871839275222246405745257275088548364400416034343698126827582885752286, + 21888242871839275222246405745257275088548364400416034343698164826200289749478, + 21888242871839275222246405745257275088548364400416034343698125859739088144592, + 21888242871839275222246405745257275088548364400416034343698123179218042928672, + 37785630767203588, + 21888242871839275222246405745257275088548364400416034343698132046150372425028, + 21888242871839275222246405745257275088548364400416034343698097401180350297545, + 21888242871839275222246405745257275088548364400416034343698095760710715670838, + 45584292147540091, + 140027515577602230, + 86873149471938393, + 100766142474115469, + 21888242871839275222246405745257275088548364400416034343698155054424007641926, + 21888242871839275222246405745257275088548364400416034343698130838598789138917, + 90626896184524208, + 21888242871839275222246405745257275088548364400416034343698141476545203919339, + 131019195576893398, + 80569649582033617, + 7632290652667749, + 18548202819245425, + 111319043686249692, + 67335171294607566, + 109099473951844427, + 21888242871839275222246405745257275088548364400416034343698096361181835473471, + 21888242871839275222246405745257275088548364400416034343698067975509421077468, + 122352860365350875, + 81619029433468764, + 21888242871839275222246405745257275088548364400416034343698193476261466411707, + 99572324474377928, + 21888242871839275222246405745257275088548364400416034343698121108961988202588, + 21888242871839275222246405745257275088548364400416034343698102014258038642846, + 8990253716356541, + 21888242871839275222246405745257275088548364400416034343698151621828096987682, + 9149175603665991, + 82736198624625468, + 122782261225690441, + 21888242871839275222246405745257275088548364400416034343698082091169006819644, + 21888242871839275222246405745257275088548364400416034343698065434762154702089, + 91965288373495476, + 47253170129553469, + 21888242871839275222246405745257275088548364400416034343698105717128508399188, + 21888242871839275222246405745257275088548364400416034343698133099961463433608, + 21888242871839275222246405745257275088548364400416034343698181427029376058575, + 5039761702828847, + 51024575768402331, + 21888242871839275222246405745257275088548364400416034343698098512165677545923, + 21888242871839275222246405745257275088548364400416034343698183633869043873518, + 112189385358671394, + 21888242871839275222246405745257275088548364400416034343698179798134035042914, + 79547520756897269, + 123266305563146119, + 96273696913848848, + 21888242871839275222246405745257275088548364400416034343698170632635469876712, + 77215103185838265, + 21888242871839275222246405745257275088548364400416034343698075496548566974757, + 21888242871839275222246405745257275088548364400416034343698094824757639207104, + 133861872565594746, + 21888242871839275222246405745257275088548364400416034343698199412024759223267, + 21888242871839275222246405745257275088548364400416034343698068632246063411614, + 138045039254329839, + 47998277301495906, + 21888242871839275222246405745257275088548364400416034343698173269694609818730, + 126030327445583726, + 23808262306163597, + 21888242871839275222246405745257275088548364400416034343698109958552084661574, + 101033066520733597, + 21888242871839275222246405745257275088548364400416034343698099493634945721384, + 21888242871839275222246405745257275088548364400416034343698105466505892267524, + 90022041872297534, + 21888242871839275222246405745257275088548364400416034343698091988144233005229, + 108632026767299558, + 90842898522731396, + 36144804686126008, + 21888242871839275222246405745257275088548364400416034343698160275089331994358, + 138508116061145594, + 21888242871839275222246405745257275088548364400416034343698087706173977641186, + 21888242871839275222246405745257275088548364400416034343698197830482498459879, + 21888242871839275222246405745257275088548364400416034343698090844664845391501, + 21888242871839275222246405745257275088548364400416034343698081021882746147445, + 33680597781100730, + 63966866000106587, + 21888242871839275222246405745257275088548364400416034343698097704875621390639, + 142416978914393310, + 21888242871839275222246405745257275088548364400416034343698095010555407890133, + 21888242871839275222246405745257275088548364400416034343698127347490410381552, + 47954560222115240, + 21888242871839275222246405745257275088548364400416034343698081952992356414577, + 21888242871839275222246405745257275088548364400416034343698094288130714419377, + 4945082799480252, + 21888242871839275222246405745257275088548364400416034343698187272510475718785, + 103342189999261750, + 116638236390043570, + 21888242871839275222246405745257275088548364400416034343698126653699644782766, + 21888242871839275222246405745257275088548364400416034343698062283876556783235, + 89916074791762448, + 94631053459584968, + 21888242871839275222246405745257275088548364400416034343698065776659503602989, + 82432607838041045, + 75725270769944002, + 100636902383724417, + 21888242871839275222246405745257275088548364400416034343698145555905736601992, + 51228879825640495, + 133750444925897668, + 66345833196862699, + 74076211650048535, + 21888242871839275222246405745257275088548364400416034343698127979973584326625, + 21888242871839275222246405745257275088548364400416034343698093670034152625541, + 21888242871839275222246405745257275088548364400416034343698134993377682993261, + 21888242871839275222246405745257275088548364400416034343698117069743072390717, + 5799802711767082, + 59639539738583212, + 81912839035601013, + 21888242871839275222246405745257275088548364400416034343698187133951222707299, + 21888242871839275222246405745257275088548364400416034343698170913759442541060, + 21888242871839275222246405745257275088548364400416034343698101908018780504542, + 83300852766352270, + 21888242871839275222246405745257275088548364400416034343698153894033450864821, + 21888242871839275222246405745257275088548364400416034343698166514362853542541, + 10782272645780433, + 48663656550967475, + 21888242871839275222246405745257275088548364400416034343698200978210283839306, + 21888242871839275222246405745257275088548364400416034343698152997136914592644, + 28699198031005270, + 21888242871839275222246405745257275088548364400416034343698132999827623974223, + 99367502483661110, + 21888242871839275222246405745257275088548364400416034343698082883686332564242, + 21888242871839275222246405745257275088548364400416034343698091740073306296867, + 21888242871839275222246405745257275088548364400416034343698062073712934625738, + 21888242871839275222246405745257275088548364400416034343698149126151354854395, + 91886793523333687, + 125443927073321137, + 21888242871839275222246405745257275088548364400416034343698078892359163394803, + 21888242871839275222246405745257275088548364400416034343698080495587776116390, + 21888242871839275222246405745257275088548364400416034343698066666776967361940, + 23109912415792257, + 21888242871839275222246405745257275088548364400416034343698198454573740322412, + 95585544160272961, + 21888242871839275222246405745257275088548364400416034343698124235109286192099, + 110738823988587163, + 5366488951343498, + 2036701323182792, + 21888242871839275222246405745257275088548364400416034343698156967138647021306, + 74061693430133071, + 21888242871839275222246405745257275088548364400416034343698174650830278368636, + 21888242871839275222246405745257275088548364400416034343698061149389520663851, + 21888242871839275222246405745257275088548364400416034343698067386323178851970, + 50626410606569979, + 131255057477633128, + 21888242871839275222246405745257275088548364400416034343698129597828468529188, + 21888242871839275222246405745257275088548364400416034343698082801879040628043, + 20120379184349095, + 21888242871839275222246405745257275088548364400416034343698186511933980628503, + 21888242871839275222246405745257275088548364400416034343698181526284792327574, + 21888242871839275222246405745257275088548364400416034343698072166668310205776, + 21888242871839275222246405745257275088548364400416034343698104923593152808702, + 9112106719655301, + 21888242871839275222246405745257275088548364400416034343698162575326636709647, + 21888242871839275222246405745257275088548364400416034343698150665891763605017, + 68642038113915669, + 107297277500072764, + 21888242871839275222246405745257275088548364400416034343698197377187872931631, + 126764877832122318, + 79071094920937702, + 21888242871839275222246405745257275088548364400416034343698078242653657532021, + 134858998334946296, + 10694501213008806, + 19774372944058162, + 21888242871839275222246405745257275088548364400416034343698081150911300170441, + 45005375141199704, + 77703971279322571, + 21888242871839275222246405745257275088548364400416034343698157403381110245217, + 21888242871839275222246405745257275088548364400416034343698102185320155165612, + 21888242871839275222246405745257275088548364400416034343698132513473634434769, + 21888242871839275222246405745257275088548364400416034343698183644672861683841, + 21888242871839275222246405745257275088548364400416034343698139992136273305316, + 21888242871839275222246405745257275088548364400416034343698141274908380233928, + 21888242871839275222246405745257275088548364400416034343698167188762224466354, + 26409872079392529, + 21888242871839275222246405745257275088548364400416034343698080618537564225577, + 21888242871839275222246405745257275088548364400416034343698182870848335107914, + 68670181661781134, + 100248547542455952, + 110624296218935275, + 114253903068134815, + 21888242871839275222246405745257275088548364400416034343698134092388570666473, + 21888242871839275222246405745257275088548364400416034343698125914694906353297, + 10243749391364322, + 34412893588573367, + 21888242871839275222246405745257275088548364400416034343698114905811433352179, + 21888242871839275222246405745257275088548364400416034343698148504022750135072, + 21888242871839275222246405745257275088548364400416034343698150307847907128054, + 21888242871839275222246405745257275088548364400416034343698188749423326327043, + 42921910337232870, + 21888242871839275222246405745257275088548364400416034343698071575865148248483, + 21888242871839275222246405745257275088548364400416034343698065604566546906294, + 6174754941940186, + 21888242871839275222246405745257275088548364400416034343698150871863711261003, + 125496338720515007, + 21888242871839275222246405745257275088548364400416034343698121309123127643379, + 21888242871839275222246405745257275088548364400416034343698171092399227292617, + 21888242871839275222246405745257275088548364400416034343698200299409912243260, + 21888242871839275222246405745257275088548364400416034343698195264741325985893, + 109212292541972278, + 92375362413749505, + 21888242871839275222246405745257275088548364400416034343698164539136212247071, + 4631754226641414, + 21888242871839275222246405745257275088548364400416034343698096308384779561341, + 21888242871839275222246405745257275088548364400416034343698178723576326824317, + 21888242871839275222246405745257275088548364400416034343698161510369653910972, + 127426230426742706, + 21888242871839275222246405745257275088548364400416034343698070832146675735865, + 124665647749264910, + 112715977865367716, + 129662690964626037, + 21888242871839275222246405745257275088548364400416034343698105482222661027128, + 36746021232851373, + 25231106307729528, + 21888242871839275222246405745257275088548364400416034343698199806644592362816, + 21888242871839275222246405745257275088548364400416034343698078996532180500087, + 142511528869905711, + 21888242871839275222246405745257275088548364400416034343698066024015957232043, + 21888242871839275222246405745257275088548364400416034343698142462826261896774, + 51206418957386513, + 84300477606390135, + 21888242871839275222246405745257275088548364400416034343698107127825222360547, + 133617996137386718, + 9158954164998081, + 21888242871839275222246405745257275088548364400416034343698097176836893566762, + 75590183290156222, + 21888242871839275222246405745257275088548364400416034343698162437355520915327, + 21888242871839275222246405745257275088548364400416034343698061507769509902803, + 91861072547715955, + 141384650861070366, + 67815950797675990, + 21888242871839275222246405745257275088548364400416034343698184868744572898360, + 21888242871839275222246405745257275088548364400416034343698086144544337361163, + 21888242871839275222246405745257275088548364400416034343698087415596957874719, + 46129666676051057, + 127143689908609869, + 4162702995630324, + 21888242871839275222246405745257275088548364400416034343698066687434189956061, + 21888242871839275222246405745257275088548364400416034343698062542276061376923, + 21888242871839275222246405745257275088548364400416034343698079302953721170857, + 21888242871839275222246405745257275088548364400416034343698111957908861395475, + 43581873349492524, + 103045639086185410, + 21888242871839275222246405745257275088548364400416034343698133551031726217598, + 38218421584892494, + 59830537516553186, + 142592595665947671, + 50473294640952948, + 143286182852834614, + 22276674984479081, + 21888242871839275222246405745257275088548364400416034343698184247800096410643, + 68519122450291346, + 21888242871839275222246405745257275088548364400416034343698154459650459576106, + 68760437227476684, + 21888242871839275222246405745257275088548364400416034343698125569168807017110, + 21888242871839275222246405745257275088548364400416034343698125185508712690067, + 7569150040864661, + 21888242871839275222246405745257275088548364400416034343698199260915728228061, + 61206370443004949, + 136561665074695587, + 21888242871839275222246405745257275088548364400416034343698183691477303686059, + 21888242871839275222246405745257275088548364400416034343698093239829216095960, + 21888242871839275222246405745257275088548364400416034343698200893123235471362, + 125897877372438652, + 21888242871839275222246405745257275088548364400416034343698140825610881375078, + 21888242871839275222246405745257275088548364400416034343698138648077813145161, + 3956759125079516, + 46420691958814305, + 21888242871839275222246405745257275088548364400416034343698132041492288777498, + 21888242871839275222246405745257275088548364400416034343698124078861220322266, + 93586874941103549, + 21888242871839275222246405745257275088548364400416034343698184095357555126574, + 21888242871839275222246405745257275088548364400416034343698193058839482708948, + 21888242871839275222246405745257275088548364400416034343698181761128665399763, + 21888242871839275222246405745257275088548364400416034343698163681042198851750, + 18535229757883462, + 21888242871839275222246405745257275088548364400416034343698133077235510701002, + 111563146586410280, + 56019712474345477, + 97916295286857545, + 29901072163551807, + 21888242871839275222246405745257275088548364400416034343698079396934430395135, + 21888242871839275222246405745257275088548364400416034343698166650452503912624, + 21888242871839275222246405745257275088548364400416034343698126350121861648505, + 26696422471357766, + 91117550846194211, + 38864697788140396, + 76575145236348343, + 51955979141563287, + 29540453875299352, + 32239528916780369, + 111860424527399939, + 21888242871839275222246405745257275088548364400416034343698083506728636131165, + 5074193527202433, + 64529903584785959, + 21888242871839275222246405745257275088548364400416034343698101758740531424438, + 91076236675672663, + 21888242871839275222246405745257275088548364400416034343698086784690413403144, + 80333400217331929, + 21888242871839275222246405745257275088548364400416034343698153218167548721552, + 119478122979263578, + 21888242871839275222246405745257275088548364400416034343698087914234173573212, + 96421993728662263, + 61593071874881172, + 5227476934315707, + 21888242871839275222246405745257275088548364400416034343698193800731317789314, + 24182853057811828, + 139760937295559059, + 21888242871839275222246405745257275088548364400416034343698153082210957208321, + 46233500152912351, + 21888242871839275222246405745257275088548364400416034343698201243688057539729, + 53223342950817063, + 21888242871839275222246405745257275088548364400416034343698077364214232519758, + 93910409231911340, + 34026080248450497, + 21888242871839275222246405745257275088548364400416034343698194795683857590957, + 21888242871839275222246405745257275088548364400416034343698131753722668968400, + 9096581956467336, + 21888242871839275222246405745257275088548364400416034343698180485607365484077, + 21888242871839275222246405745257275088548364400416034343698139705609366450983, + 123855732301166682, + 120510775436414239, + 27557441456940088, + 21888242871839275222246405745257275088548364400416034343698156738854404735585, + 57243725285023920, + 27166318746744848, + 21888242871839275222246405745257275088548364400416034343698084205929753533599, + 97745072238715159, + 9316966291768557, + 37774373830563746, + 21888242871839275222246405745257275088548364400416034343698164136382168174206, + 119066878825563408, + 21888242871839275222246405745257275088548364400416034343698148380745497190469, + 99888846914449529, + 120618445551323450, + 21888242871839275222246405745257275088548364400416034343698091958751309325291, + 121164371222261088, + 21888242871839275222246405745257275088548364400416034343698198310507176607185, + 72446762596879232, + 21888242871839275222246405745257275088548364400416034343698146674547352843601, + 21888242871839275222246405745257275088548364400416034343698186076114535675393, + 121645327806021665, + 21888242871839275222246405745257275088548364400416034343698112319391897643148, + 21888242871839275222246405745257275088548364400416034343698114797413508759279, + 125191797654851655, + 62404635592676765, + 38187800070127635, + 11865995954406124, + 21888242871839275222246405745257275088548364400416034343698126953841358085132, + 21888242871839275222246405745257275088548364400416034343698094560758638869141, + 21888242871839275222246405745257275088548364400416034343698184264128051035308, + 136656988869729713, + 116825907314521750, + 31877540167125002, + 122282307349535849, + 97125766282121608, + 8935340097880899, + 21888242871839275222246405745257275088548364400416034343698176568337352760385, + 21888242871839275222246405745257275088548364400416034343698093294346863108336, + 79782542931678674, + 8617862763297880, + 50377244356702865, + 133041918867755425, + 70140994928355352, + 23937907440079289, + 21888242871839275222246405745257275088548364400416034343698134381752252521041, + 21888242871839275222246405745257275088548364400416034343698112061871185449000, + 21888242871839275222246405745257275088548364400416034343698152195339085687791, + 81937148040003443, + 21888242871839275222246405745257275088548364400416034343698069677463016966328, + 49575022065386738, + 21888242871839275222246405745257275088548364400416034343698121911828958695156, + 21888242871839275222246405745257275088548364400416034343698113775703339450099, + 30216757389479533, + 21888242871839275222246405745257275088548364400416034343698114053125175312747, + 137620461143297619, + 110154360529516771, + 93426547410033283, + 92142444509269152, + 42072761688971204, + 88303223251159798, + 54583621439911645, + 19625020536289022, + 104137067034162088, + 21888242871839275222246405745257275088548364400416034343698070543837175916583, + 121586073363218740, + 6065151383919768, + 58191558507749153, + 85514745833642680, + 21888242871839275222246405745257275088548364400416034343698193839362999846006, + 21888242871839275222246405745257275088548364400416034343698138682425310574651, + 21888242871839275222246405745257275088548364400416034343698182699069533230971, + 21888242871839275222246405745257275088548364400416034343698085406627840539145, + 78871510068307853, + 8552342532054636, + 21888242871839275222246405745257275088548364400416034343698142351468422340539, + 21888242871839275222246405745257275088548364400416034343698172281736604450669, + 21888242871839275222246405745257275088548364400416034343698204036902356999800, + 112322741066098933, + 36364413984878321, + 21888242871839275222246405745257275088548364400416034343698187473008697664630, + 21888242871839275222246405745257275088548364400416034343698069035151774445186, + 21888242871839275222246405745257275088548364400416034343698121139587131772818, + 116578782046271300, + 131601919804959909, + 21888242871839275222246405745257275088548364400416034343698201816967497880384, + 21888242871839275222246405745257275088548364400416034343698160280237351130874, + 21888242871839275222246405745257275088548364400416034343698153559406701304025, + 21888242871839275222246405745257275088548364400416034343698186802656282271624, + 112342769731692023, + 21888242871839275222246405745257275088548364400416034343698111051153812390462, + 1838942160204729, + 21888242871839275222246405745257275088548364400416034343698159149464573626250, + 92326018364309073, + 21888242871839275222246405745257275088548364400416034343698142444347543111818, + 78264361062886600, + 21888242871839275222246405745257275088548364400416034343698203383846686867890, + 143572341711098331, + 21888242871839275222246405745257275088548364400416034343698121407815838586318, + 21176069986556722, + 19426649628407860, + 21888242871839275222246405745257275088548364400416034343698100159332570607176, + 21888242871839275222246405745257275088548364400416034343698087303205794949987, + 21888242871839275222246405745257275088548364400416034343698160871493550356157, + 21888242871839275222246405745257275088548364400416034343698161915318284073770, + 59683921322080049, + 12265225117367390, + 21888242871839275222246405745257275088548364400416034343698125804976254057144, + 21888242871839275222246405745257275088548364400416034343698087470976365636291, + 68824670756926701, + 126757965938906825, + 33327000116038227, + 21888242871839275222246405745257275088548364400416034343698119670968773779165, + 21888242871839275222246405745257275088548364400416034343698188424838608825687, + 14559953934312159, + 21888242871839275222246405745257275088548364400416034343698101992002024379463, + 106339649159191689, + 21888242871839275222246405745257275088548364400416034343698143928887202592343, + 66959620775192612, + 36112265518814431, + 21888242871839275222246405745257275088548364400416034343698177571801250601761, + 66362205477629689, + 138975811479490909, + 21888242871839275222246405745257275088548364400416034343698174086596606774367, + 21888242871839275222246405745257275088548364400416034343698109464375083320445, + 71670415177452166, + 21888242871839275222246405745257275088548364400416034343698093278715854771676, + 142776689003195124, + 55286845469673033, + 46985710835660146, + 21888242871839275222246405745257275088548364400416034343698060200082207540325, + 8554121267104183, + 136258005946052715, + 21888242871839275222246405745257275088548364400416034343698141949050649691325, + 135670094913998682, + 21888242871839275222246405745257275088548364400416034343698079451067291873917, + 21888242871839275222246405745257275088548364400416034343698160075739284230055, + 66681112706173491, + 28439597815570527, + 21888242871839275222246405745257275088548364400416034343698110777911528720310, + 48824494756858960, + 21888242871839275222246405745257275088548364400416034343698173208181448800454, + 48478704050902625, + 43178932149485379, + 21888242871839275222246405745257275088548364400416034343698186568736528280975, + 21888242871839275222246405745257275088548364400416034343698089899448912802075, + 127875175613643527, + 21888242871839275222246405745257275088548364400416034343698170961214178487580, + 42634115113423454, + 5117452712833770, + 47159322717852424, + 21888242871839275222246405745257275088548364400416034343698188986981211378787, + 137049827011070685, + 9550312227278692, + 102216409832906215, + 21888242871839275222246405745257275088548364400416034343698127044445307560437, + 17558793551736608, + 21888242871839275222246405745257275088548364400416034343698103756834523063183, + 64290233913333513, + 21888242871839275222246405745257275088548364400416034343698136076094931195285, + 21888242871839275222246405745257275088548364400416034343698061249979807261969, + 97500812297478253, + 102886763072668783, + 21888242871839275222246405745257275088548364400416034343698104278454531276106, + 130310119506330695, + 9401302935211646, + 21888242871839275222246405745257275088548364400416034343698131924057780040466, + 70673288331599219, + 11862289954779862, + 51766666921011699, + 47711736260404607, + 21888242871839275222246405745257275088548364400416034343698193922956765755461, + 70762826253313437, + 21888242871839275222246405745257275088548364400416034343698098306487573042816, + 69643392573076934, + 17433859899242569, + 47060687916483599, + 21888242871839275222246405745257275088548364400416034343698062857376862402961, + 21888242871839275222246405745257275088548364400416034343698163244162337748532, + 91675187784401395, + 65308567212038576, + 21888242871839275222246405745257275088548364400416034343698095896934836156092, + 21888242871839275222246405745257275088548364400416034343698194017373873789761, + 53752571929537115, + 36784399128986677, + 40105891374194678, + 21888242871839275222246405745257275088548364400416034343698156370905520376169, + 21888242871839275222246405745257275088548364400416034343698068719447755553900, + 110088828388389784, + 21888242871839275222246405745257275088548364400416034343698163866372570318019, + 21888242871839275222246405745257275088548364400416034343698099357468957865254, + 73286915903038964, + 21888242871839275222246405745257275088548364400416034343698147076968828114067, + 48100641061875995, + 21888242871839275222246405745257275088548364400416034343698196883097079893965, + 21888242871839275222246405745257275088548364400416034343698176746064458988116, + 104232007416921951, + 4560004739996378, + 121325056745480613, + 135049523798998826, + 21888242871839275222246405745257275088548364400416034343698084242409241226878, + 129027181555643873, + 21888242871839275222246405745257275088548364400416034343698138613015525558949, + 28934386985501648, + 21888242871839275222246405745257275088548364400416034343698091741994684506620, + 21888242871839275222246405745257275088548364400416034343698147238757955867522, + 21888242871839275222246405745257275088548364400416034343698133919752341974354, + 21888242871839275222246405745257275088548364400416034343698074244085598736606, + 21888242871839275222246405745257275088548364400416034343698074677319525896068, + 21888242871839275222246405745257275088548364400416034343698087782430785881271, + 21888242871839275222246405745257275088548364400416034343698077065559697294119, + 137204111212111446, + 21888242871839275222246405745257275088548364400416034343698140097468333072449, + 70157703451956800, + 98726968488217164, + 21888242871839275222246405745257275088548364400416034343698125961555007648599, + 21888242871839275222246405745257275088548364400416034343698134968654805436850, + 21888242871839275222246405745257275088548364400416034343698147793546046960709, + 120362052403199115, + 21888242871839275222246405745257275088548364400416034343698147806096703593681, + 102068721450414485, + 21888242871839275222246405745257275088548364400416034343698201022892425093656, + 21888242871839275222246405745257275088548364400416034343698138949206127967715, + 94647070626189403, + 21888242871839275222246405745257275088548364400416034343698138507050397058788, + 17053429467036289, + 21888242871839275222246405745257275088548364400416034343698201953647848472088, + 82125286076618807, + 26852748025198429, + 89436757140503255, + 104109587937596089, + 21888242871839275222246405745257275088548364400416034343698076228566871698447, + 39175287765625789, + 105088660245555865, + 100893067204885825, + 21888242871839275222246405745257275088548364400416034343698093540827117413655, + 44025687297188395, + 21888242871839275222246405745257275088548364400416034343698150815592837632568, + 36166631803625624, + 21888242871839275222246405745257275088548364400416034343698156431322632918338, + 142805267987725113, + 21888242871839275222246405745257275088548364400416034343698170497401622474329, + 21888242871839275222246405745257275088548364400416034343698083111056501215674, + 21888242871839275222246405745257275088548364400416034343698080851036824529304, + 58538823297899012, + 5947969261352695, + 21888242871839275222246405745257275088548364400416034343698065280392600367807, + 21888242871839275222246405745257275088548364400416034343698064356895467461629, + 120775582750106989, + 21888242871839275222246405745257275088548364400416034343698148011564633072649, + 46826230524068419, + 66697166883716779, + 68513386339376639, + 21888242871839275222246405745257275088548364400416034343698132023508351090099, + 21888242871839275222246405745257275088548364400416034343698160895663909406555, + 24480170311687256, + 21888242871839275222246405745257275088548364400416034343698110169065519866620, + 21888242871839275222246405745257275088548364400416034343698127319203738396573, + 21888242871839275222246405745257275088548364400416034343698166876235342922603, + 73856863436005540, + 21888242871839275222246405745257275088548364400416034343698183728250426449304, + 45537947868699015, + 102188051951791714, + 21888242871839275222246405745257275088548364400416034343698119324067754815242, + 21888242871839275222246405745257275088548364400416034343698199881330699913461, + 114719220806582285, + 21888242871839275222246405745257275088548364400416034343698113963837031019085, + 96626103363638641, + 70195046496262781, + 76460549252925880, + 21888242871839275222246405745257275088548364400416034343698131450458366506632, + 21888242871839275222246405745257275088548364400416034343698177345750038418824, + 21888242871839275222246405745257275088548364400416034343698119786471315494721, + 102406006813395737, + 57014237147570761, + 21888242871839275222246405745257275088548364400416034343698104735339957669568, + 21888242871839275222246405745257275088548364400416034343698174348938731398244, + 21888242871839275222246405745257275088548364400416034343698069288080577996308, + 45698853746273473, + 28813620762351728, + 21888242871839275222246405745257275088548364400416034343698106840458452281779, + 21888242871839275222246405745257275088548364400416034343698133132660148918330, + 21888242871839275222246405745257275088548364400416034343698183262110935968180, + 21888242871839275222246405745257275088548364400416034343698147055750176086761, + 116295524680974202, + 21888242871839275222246405745257275088548364400416034343698079699943324778670, + 47576988118904216, + 477210183319689, + 21888242871839275222246405745257275088548364400416034343698096824117539624782, + 72880911490405597, + 21888242871839275222246405745257275088548364400416034343698140668725510692828, + 21888242871839275222246405745257275088548364400416034343698092086041226640311, + 21888242871839275222246405745257275088548364400416034343698161426207367744317, + 21888242871839275222246405745257275088548364400416034343698087031422213870345, + 21888242871839275222246405745257275088548364400416034343698177442186361251686, + 21888242871839275222246405745257275088548364400416034343698108852415380264673, + 82920714094989316, + 21888242871839275222246405745257275088548364400416034343698094669266484889147, + 98161245808181356, + 21888242871839275222246405745257275088548364400416034343698113283773147017010, + 21888242871839275222246405745257275088548364400416034343698125566535957350422, + 21888242871839275222246405745257275088548364400416034343698120695787731678284, + 31101229350962336, + 835321805247410, + 21888242871839275222246405745257275088548364400416034343698139090472893010960, + 90254896901442193, + 141142069396495017, + 97421856992462555, + 21888242871839275222246405745257275088548364400416034343698128821195650389261, + 74400633538353004, + 88266128984433052, + 21888242871839275222246405745257275088548364400416034343698081229548796132664, + 130655734071264352, + 21888242871839275222246405745257275088548364400416034343698182284769495759096, + 140639184452085405, + 21888242871839275222246405745257275088548364400416034343698090137547033098325, + 21888242871839275222246405745257275088548364400416034343698067754387215537390, + 123248928180943932, + 21888242871839275222246405745257275088548364400416034343698115260011766236111, + 21888242871839275222246405745257275088548364400416034343698165476868657685806, + 134142877148185139, + 21888242871839275222246405745257275088548364400416034343698082928564467372345, + 21888242871839275222246405745257275088548364400416034343698066222765471627903, + 21888242871839275222246405745257275088548364400416034343698200586906391333893, + 21888242871839275222246405745257275088548364400416034343698084628334861819409, + 45241465581141744, + 84642540800320689, + 45780143732198601, + 21888242871839275222246405745257275088548364400416034343698115617237825485722, + 21888242871839275222246405745257275088548364400416034343698081574143645505594, + 21888242871839275222246405745257275088548364400416034343698072311232210940760, + 38564590549970982, + 4356616855979072, + 139184292883819865, + 21888242871839275222246405745257275088548364400416034343698203519524168513060, + 21888242871839275222246405745257275088548364400416034343698172825270163064546, + 121877147942606193, + 21888242871839275222246405745257275088548364400416034343698132625407414632633, + 21888242871839275222246405745257275088548364400416034343698143069508020192516, + 7443790857679343, + 21888242871839275222246405745257275088548364400416034343698060121551808495213, + 89864626846636884, + 21888242871839275222246405745257275088548364400416034343698149415522249238129, + 74373330856729206, + 87134489296706014, + 5832221118857677, + 21888242871839275222246405745257275088548364400416034343698066187040390267295, + 89090356481649576, + 21888242871839275222246405745257275088548364400416034343698121738182675833154, + 60642995906681870, + 135482105419389726, + 22925834782156949, + 21888242871839275222246405745257275088548364400416034343698119127329372746278, + 82694736252446526, + 21888242871839275222246405745257275088548364400416034343698151687911650039809, + 21888242871839275222246405745257275088548364400416034343698183787866103623849, + 65037528134768348, + 21888242871839275222246405745257275088548364400416034343698179102319855344495, + 21888242871839275222246405745257275088548364400416034343698093120813985154664, + 21888242871839275222246405745257275088548364400416034343698094481473576963526, + 21888242871839275222246405745257275088548364400416034343698175470393984749089, + 22586103112840680, + 37678783330479755, + 21888242871839275222246405745257275088548364400416034343698067871803896742705, + 21888242871839275222246405745257275088548364400416034343698081264068332751701, + 21888242871839275222246405745257275088548364400416034343698103559434092501051, + 21888242871839275222246405745257275088548364400416034343698065133373756697421, + 21888242871839275222246405745257275088548364400416034343698090978278338699870, + 21888242871839275222246405745257275088548364400416034343698184540777101709514, + 21888242871839275222246405745257275088548364400416034343698185323868073415103, + 21888242871839275222246405745257275088548364400416034343698175638635516270479, + 21888242871839275222246405745257275088548364400416034343698125425508128444424, + 39476067046381165, + 21888242871839275222246405745257275088548364400416034343698094485288808981969, + 21888242871839275222246405745257275088548364400416034343698075895138010816252, + 21888242871839275222246405745257275088548364400416034343698068024383499457041, + 20814756810916536, + 21888242871839275222246405745257275088548364400416034343698125728342682242136, + 92751953266445115, + 40396940988912855, + 21888242871839275222246405745257275088548364400416034343698120182758041923342, + 129865465111539548, + 44383223501048996, + 82419258426155605, + 21888242871839275222246405745257275088548364400416034343698124564682851554008, + 21888242871839275222246405745257275088548364400416034343698178328987887108133, + 18690653215085081, + 89431713342517457, + 79701514595702637, + 21888242871839275222246405745257275088548364400416034343698161253717522094566, + 91745105614881369, + 21888242871839275222246405745257275088548364400416034343698122150006055314754, + 21888242871839275222246405745257275088548364400416034343698129695489330781118, + 21888242871839275222246405745257275088548364400416034343698068305983068200541, + 53240997651121381, + 114130897850151356, + 125085242103461764, + 21888242871839275222246405745257275088548364400416034343698123452241064352257, + 21888242871839275222246405745257275088548364400416034343698183593618790127183, + 49521111520362604, + 87616736294173409, + 21888242871839275222246405745257275088548364400416034343698152330595509648519, + 21888242871839275222246405745257275088548364400416034343698182898981914561973, + 21888242871839275222246405745257275088548364400416034343698155890930966808995, + 21888242871839275222246405745257275088548364400416034343698196376761186575808, + 125601062104713207, + 114259313500495691, + 21888242871839275222246405745257275088548364400416034343698091349797686891823, + 28287598789829794, + 21888242871839275222246405745257275088548364400416034343698137798390486552745, + 16458013996798331, + 21888242871839275222246405745257275088548364400416034343698068517016452101203, + 21888242871839275222246405745257275088548364400416034343698114890300992937303, + 21888242871839275222246405745257275088548364400416034343698104716788299547269, + 21888242871839275222246405745257275088548364400416034343698101839753067521480, + 60237267703304765, + 60010617366564427, + 74753297200235549, + 134667652314417207, + 139983585978990036, + 21888242871839275222246405745257275088548364400416034343698180711012333942265, + 4060780072575437, + 21888242871839275222246405745257275088548364400416034343698181387902460707517, + 132414740319332408, + 40907244452371147, + 21888242871839275222246405745257275088548364400416034343698125889139457373947, + 41322689850346609, + 21888242871839275222246405745257275088548364400416034343698124380954249617027, + 21888242871839275222246405745257275088548364400416034343698145922362768759456, + 102888329730094492, + 9882040498710641, + 41905643218326921, + 21888242871839275222246405745257275088548364400416034343698081579345740776971, + 72612163988026183, + 140777379670260172, + 21888242871839275222246405745257275088548364400416034343698150180951991248673, + 21888242871839275222246405745257275088548364400416034343698144887596575581310, + 30138724684305206, + 21888242871839275222246405745257275088548364400416034343698110727408274904782, + 113781152720988177, + 21888242871839275222246405745257275088548364400416034343698202340990704503315, + 96519399727809687, + 21888242871839275222246405745257275088548364400416034343698161421308850000571, + 68967306761382122, + 21888242871839275222246405745257275088548364400416034343698121251820126015775, + 21888242871839275222246405745257275088548364400416034343698152376555089733737, + 21888242871839275222246405745257275088548364400416034343698136912754679954686, + 26282649412268306, + 21888242871839275222246405745257275088548364400416034343698073765285736910146, + 117075988031641430, + 21888242871839275222246405745257275088548364400416034343698126388747881101941, + 123373312489610606, + 21888242871839275222246405745257275088548364400416034343698110009976030856341, + 115702041211108993, + 1126600861650466, + 669226193016072, + 18321129427727145, + 21888242871839275222246405745257275088548364400416034343698062158834601133917, + 21888242871839275222246405745257275088548364400416034343698105672245910958995, + 21888242871839275222246405745257275088548364400416034343698161772114690277882, + 21888242871839275222246405745257275088548364400416034343698102248645472311343, + 21888242871839275222246405745257275088548364400416034343698091122441453484005, + 126742868652981423, + 21888242871839275222246405745257275088548364400416034343698075065638843149318, + 21888242871839275222246405745257275088548364400416034343698079464584919399360, + 12309211290967, + 21888242871839275222246405745257275088548364400416034343698189001449366469253, + 133675811815386678, + 26488973505372759, + 21888242871839275222246405745257275088548364400416034343698196684491312403422, + 21888242871839275222246405745257275088548364400416034343698191365396307310007, + 97046150465899488, + 38081250903404702, + 82427904328547136, + 21888242871839275222246405745257275088548364400416034343698137541595469949885, + 120499133422222046, + 21888242871839275222246405745257275088548364400416034343698070490178124789555, + 13011898949854881, + 21888242871839275222246405745257275088548364400416034343698194642902042619890, + 52096914392717209, + 77714591758867977, + 23930749798428308, + 21888242871839275222246405745257275088548364400416034343698106459063449737732, + 21888242871839275222246405745257275088548364400416034343698195800655213176583, + 21888242871839275222246405745257275088548364400416034343698074853328515695455, + 21888242871839275222246405745257275088548364400416034343698182459867520477569, + 21888242871839275222246405745257275088548364400416034343698098913080727782417, + 104912051278402996, + 20934800692809510, + 66314098625625609, + 26600627071886722, + 95025098329063070, + 92816908420125989, + 79447706597267211, + 21888242871839275222246405745257275088548364400416034343698086171130545135127, + 13370269078828172, + 21888242871839275222246405745257275088548364400416034343698109317853659674798, + 51492694194175799, + 21888242871839275222246405745257275088548364400416034343698153104137009310004, + 121444304804850713, + 110241526827827998, + 21888242871839275222246405745257275088548364400416034343698097698182624428328, + 50871282431752078, + 21888242871839275222246405745257275088548364400416034343698170535026080659100, + 21888242871839275222246405745257275088548364400416034343698157131169900767805, + 21888242871839275222246405745257275088548364400416034343698113611578437755508, + 21888242871839275222246405745257275088548364400416034343698138696650118902305, + 21888242871839275222246405745257275088548364400416034343698164440836621222210, + 21888242871839275222246405745257275088548364400416034343698072498586850140458, + 21888242871839275222246405745257275088548364400416034343698144031826301144491, + 21888242871839275222246405745257275088548364400416034343698068589910811324738, + 87891656045736624, + 21888242871839275222246405745257275088548364400416034343698122938429520349407, + 121287711033138363, + 7470364340228038, + 84940482344090093, + 21888242871839275222246405745257275088548364400416034343698078201935841249855, + 21888242871839275222246405745257275088548364400416034343698076836258881952349, + 134370427493799017, + 21888242871839275222246405745257275088548364400416034343698077144795176284462, + 79411780227943215, + 21888242871839275222246405745257275088548364400416034343698103564844123033952, + 134471542523144050, + 21888242871839275222246405745257275088548364400416034343698133132881455130311, + 21888242871839275222246405745257275088548364400416034343698192481974115170563, + 39897639084479581, + 21888242871839275222246405745257275088548364400416034343698141364123169598217, + 21888242871839275222246405745257275088548364400416034343698196593019140343768, + 21888242871839275222246405745257275088548364400416034343698063580670149560009, + 21888242871839275222246405745257275088548364400416034343698061998673445347784, + 38408070523617494, + 21888242871839275222246405745257275088548364400416034343698177989397629242995, + 21888242871839275222246405745257275088548364400416034343698060742413187605985, + 21888242871839275222246405745257275088548364400416034343698160167588224897343, + 13650183301742300, + 133340217177761340, + 21888242871839275222246405745257275088548364400416034343698130575941488812106, + 63912577261575019, + 31202442529377761, + 97532087812782428, + 12439778264200454, + 37053701095311921, + 21888242871839275222246405745257275088548364400416034343698135616191087064664, + 21888242871839275222246405745257275088548364400416034343698091969729274552806, + 17553860827712071, + 26483317801478596, + 101933609357586823, + 35284265629263828, + 21888242871839275222246405745257275088548364400416034343698159735499469631406, + 84229116049893428, + 21888242871839275222246405745257275088548364400416034343698134114414342818022, + 21888242871839275222246405745257275088548364400416034343698077956004844016997, + 6770101094140262, + 21888242871839275222246405745257275088548364400416034343698071011704254587811, + 21888242871839275222246405745257275088548364400416034343698145458919179124945, + 126853314042616449, + 21888242871839275222246405745257275088548364400416034343698146664936412868952, + 21888242871839275222246405745257275088548364400416034343698138095045230500663, + 21888242871839275222246405745257275088548364400416034343698153178713052416512, + 10934782731952937, + 21888242871839275222246405745257275088548364400416034343698094656404781689562, + 21888242871839275222246405745257275088548364400416034343698148407140054966588, + 51236352066588876, + 119218804634436708, + 21888242871839275222246405745257275088548364400416034343698101551066971167148, + 21888242871839275222246405745257275088548364400416034343698186307529995482088, + 81116211963214498, + 21888242871839275222246405745257275088548364400416034343698120173047358892640, + 37866126085503739, + 52526764571360472, + 67040212235138269, + 73988921617513218, + 56116844189456983, + 21888242871839275222246405745257275088548364400416034343698065391763025136125, + 21888242871839275222246405745257275088548364400416034343698160052688941651720, + 133778118859874265, + 21888242871839275222246405745257275088548364400416034343698128249595825605314, + 21888242871839275222246405745257275088548364400416034343698189997575795634133, + 21888242871839275222246405745257275088548364400416034343698187784027238432556, + 122623655114797035, + 47318772406209792, + 21888242871839275222246405745257275088548364400416034343698172751635111899455, + 21888242871839275222246405745257275088548364400416034343698173519856355398465, + 11272338708495793, + 77401923817922739, + 137277151980581023, + 69275119061843700, + 21888242871839275222246405745257275088548364400416034343698196054008828817210, + 21888242871839275222246405745257275088548364400416034343698177225245534126664, + 110816162624068380, + 104208741875256251, + 21888242871839275222246405745257275088548364400416034343698162580368865605897, + 21888242871839275222246405745257275088548364400416034343698194151345051700565, + 21888242871839275222246405745257275088548364400416034343698076002614924647098, + 89598566234992310, + 21888242871839275222246405745257275088548364400416034343698174139454624571197, + 21888242871839275222246405745257275088548364400416034343698175755887194506644, + 21888242871839275222246405745257275088548364400416034343698089826303170602011, + 117005413483401031, + 21888242871839275222246405745257275088548364400416034343698070898254832495028, + 21888242871839275222246405745257275088548364400416034343698124916437669316054, + 30942673735670452, + 58902109566726400, + 136434721335620968, + 81063148577893053, + 60969843537706162, + 55411712154255691, + 92895024619750473, + 21888242871839275222246405745257275088548364400416034343698136870840260405350, + 119210722579994514, + 21888242871839275222246405745257275088548364400416034343698135557742986651777, + 21888242871839275222246405745257275088548364400416034343698069399520161825647, + 21888242871839275222246405745257275088548364400416034343698108770239428554563, + 21888242871839275222246405745257275088548364400416034343698065897542927789061, + 21888242871839275222246405745257275088548364400416034343698094933662375554165, + 114996589937589441, + 1690060938433752, + 21888242871839275222246405745257275088548364400416034343698112924799678429775, + 73339068021923120, + 21888242871839275222246405745257275088548364400416034343698118956357222570539, + 21888242871839275222246405745257275088548364400416034343698150121068988697058, + 21888242871839275222246405745257275088548364400416034343698106076589740241764, + 21888242871839275222246405745257275088548364400416034343698156633524322539329, + 21888242871839275222246405745257275088548364400416034343698193232271006188019, + 21888242871839275222246405745257275088548364400416034343698148098034485247942, + 21888242871839275222246405745257275088548364400416034343698145637271144981518, + 95536146086991556, + 21888242871839275222246405745257275088548364400416034343698146848439966575461, + 21888242871839275222246405745257275088548364400416034343698158826056170393574, + 21888242871839275222246405745257275088548364400416034343698201332704998702918, + 133044359162865074, + 18578864482254949, + 21888242871839275222246405745257275088548364400416034343698190736671851171482, + 21888242871839275222246405745257275088548364400416034343698095753445363385852, + 21888242871839275222246405745257275088548364400416034343698100562730785366405, + 42057475917051590, + 32821930153217838, + 21888242871839275222246405745257275088548364400416034343698106743497871250131, + 13019008801964742, + 21888242871839275222246405745257275088548364400416034343698065013751353651496, + 2922847244522947, + 14081520654028494, + 64666925601147371, + 21888242871839275222246405745257275088548364400416034343698174396774633133961, + 21888242871839275222246405745257275088548364400416034343698150330287670417662, + 7903311138097453, + 21888242871839275222246405745257275088548364400416034343698167365955821833836, + 41417807576596316, + 69451392459403355, + 92166541577292942, + 15713536975770479, + 21888242871839275222246405745257275088548364400416034343698087675744154767389, + 21888242871839275222246405745257275088548364400416034343698069438838920063173, + 21888242871839275222246405745257275088548364400416034343698144324675396587169, + 21888242871839275222246405745257275088548364400416034343698202913885627957053, + 21888242871839275222246405745257275088548364400416034343698069415468499498150, + 21888242871839275222246405745257275088548364400416034343698107857972494567115, + 133871291987538284, + 21888242871839275222246405745257275088548364400416034343698095081266068740848, + 21888242871839275222246405745257275088548364400416034343698147985887861772901, + 65388102133491574, + 107031737527205984, + 21888242871839275222246405745257275088548364400416034343698194348768455349698, + 61221677172901756, + 9055343271953932, + 72078061755021807, + 85848212652730918, + 21888242871839275222246405745257275088548364400416034343698090874425587228167, + 78561744584353648, + 121900689908047425, + 38536677972844512, + 91754719966645543, + 68905019793746194, + 133480136749509916, + 21888242871839275222246405745257275088548364400416034343698089997393248346394, + 21888242871839275222246405745257275088548364400416034343698115658712898279467, + 21888242871839275222246405745257275088548364400416034343698063329929435129825, + 21888242871839275222246405745257275088548364400416034343698098057577333732382, + 87653186553184971, + 21888242871839275222246405745257275088548364400416034343698159495263317570050, + 123633349198461089, + 21888242871839275222246405745257275088548364400416034343698062386560770984427, + 70911885227724110, + 21888242871839275222246405745257275088548364400416034343698115431990980572348, + 21888242871839275222246405745257275088548364400416034343698120180829062793617, + 21888242871839275222246405745257275088548364400416034343698101792899201750243, + 38881515434252738, + 113372044714732287, + 115588936637490139, + 26549296776091537, + 21888242871839275222246405745257275088548364400416034343698174379275589772424, + 21888242871839275222246405745257275088548364400416034343698094448590277161189, + 71728683439941842, + 14423695192941926, + 21888242871839275222246405745257275088548364400416034343698174786615205888263, + 21888242871839275222246405745257275088548364400416034343698110085840491527800, + 21888242871839275222246405745257275088548364400416034343698083461254242550469, + 13027968794871760, + 74114207386262706, + 64220991023360908, + 21888242871839275222246405745257275088548364400416034343698114993102731213217, + 33822509284125449, + 21888242871839275222246405745257275088548364400416034343698176080230678664009, + 30370822750622282, + 127555408036110657, + 21888242871839275222246405745257275088548364400416034343698185272068054103866, + 21888242871839275222246405745257275088548364400416034343698076818192303417852, + 64313024648199984, + 2623581740214829, + 37707871525031812, + 143129047469420700, + 21888242871839275222246405745257275088548364400416034343698100216407866619913, + 21888242871839275222246405745257275088548364400416034343698196171994361157840, + 69047946977447710, + 68430783158302826, + 21888242871839275222246405745257275088548364400416034343698146362649157837321, + 21888242871839275222246405745257275088548364400416034343698140831564452274998, + 74918408768487448, + 91491208426470370, + 107743614055866278, + 21888242871839275222246405745257275088548364400416034343698110368684708236976, + 21888242871839275222246405745257275088548364400416034343698066963970341656075, + 107550506895669472, + 21888242871839275222246405745257275088548364400416034343698095239331302052597, + 21888242871839275222246405745257275088548364400416034343698163986250093942199, + 21888242871839275222246405745257275088548364400416034343698130263643795339495, + 83098978335472645, + 114305535689565621, + 108106559687707856, + 21888242871839275222246405745257275088548364400416034343698137739301928010774, + 25110396297331947, + 21888242871839275222246405745257275088548364400416034343698117629004608761666, + 58732391751173325, + 21888242871839275222246405745257275088548364400416034343698074270366447397014, + 21888242871839275222246405745257275088548364400416034343698146942455803256138, + 87928251394014097, + 124426863534929864, + 21888242871839275222246405745257275088548364400416034343698125239976829291265, + 21888242871839275222246405745257275088548364400416034343698063231828671381438, + 28682097114922111, + 67635381634148843, + 78613645534718648, + 136145662615832262, + 21888242871839275222246405745257275088548364400416034343698094593596159071685, + 60328045349831440, + 135404726754681947, + 21888242871839275222246405745257275088548364400416034343698194925468373882988, + 21888242871839275222246405745257275088548364400416034343698164020242830471255, + 108165582800314993, + 106351875933400549, + 21888242871839275222246405745257275088548364400416034343698132077582509359909, + 53539581903493502, + 42381126754549071, + 21888242871839275222246405745257275088548364400416034343698116212043016796770, + 21399054843016040, + 21888242871839275222246405745257275088548364400416034343698106744955431301627, + 50873100733667947, + 21888242871839275222246405745257275088548364400416034343698122200229604185530, + 21888242871839275222246405745257275088548364400416034343698148919060820080343, + 21888242871839275222246405745257275088548364400416034343698198130252972442388, + 21888242871839275222246405745257275088548364400416034343698198079192365091558, + 11397968793670974, + 21888242871839275222246405745257275088548364400416034343698129352686544295687, + 85349848954088649, + 21888242871839275222246405745257275088548364400416034343698112449495444996637, + 4506894812764978, + 26374127263834890, + 134727678708447384, + 127547115016667379, + 40508444704420995, + 21888242871839275222246405745257275088548364400416034343698175534406248338948, + 140481451651349295, + 21888242871839275222246405745257275088548364400416034343698179879295677222171, + 21888242871839275222246405745257275088548364400416034343698067811296969144612, + 21888242871839275222246405745257275088548364400416034343698145252850794954350, + 21888242871839275222246405745257275088548364400416034343698146333577103500450, + 21888242871839275222246405745257275088548364400416034343698099188534505193469, + 21888242871839275222246405745257275088548364400416034343698142134997963756564, + 44694518040377198, + 21888242871839275222246405745257275088548364400416034343698142533934441284233, + 21888242871839275222246405745257275088548364400416034343698193002824768546060, + 142439871891724814, + 76105972031950322, + 21888242871839275222246405745257275088548364400416034343698126792861068075287, + 69583764072974346, + 37866971892231224, + 104976721039764000, + 129723649935031507, + 21888242871839275222246405745257275088548364400416034343698176085039015761429, + 120249395263048412, + 21888242871839275222246405745257275088548364400416034343698089747949975134856, + 11238415102911622, + 21888242871839275222246405745257275088548364400416034343698069509374354425733, + 50286666965828640, + 21888242871839275222246405745257275088548364400416034343698163016092446248865, + 21888242871839275222246405745257275088548364400416034343698160977220509049122, + 21888242871839275222246405745257275088548364400416034343698201669174453476050, + 36338863666176576, + 95254743154556921, + 21888242871839275222246405745257275088548364400416034343698068216970408672631, + 21888242871839275222246405745257275088548364400416034343698066218804250474138, + 108566543338581292, + 89100911031619022, + 90684848716613151, + 21888242871839275222246405745257275088548364400416034343698078405237503533141, + 20500223284937326, + 12170013342841119, + 70465852625944539, + 45506208242350944, + 23283184599024372, + 21888242871839275222246405745257275088548364400416034343698193362096451717186, + 21888242871839275222246405745257275088548364400416034343698068901148995626602, + 75129531624603978, + 87955951200210942, + 21888242871839275222246405745257275088548364400416034343698183177815990585730, + 21888242871839275222246405745257275088548364400416034343698130913717652163255, + 47938381861179184, + 98253964034964223, + 1567485313462075, + 21888242871839275222246405745257275088548364400416034343698103601041264059667, + 21888242871839275222246405745257275088548364400416034343698092952086865643424, + 21888242871839275222246405745257275088548364400416034343698129482884376955236, + 21888242871839275222246405745257275088548364400416034343698108120387751613981, + 21888242871839275222246405745257275088548364400416034343698168260154665290659, + 27693400697378522, + 21888242871839275222246405745257275088548364400416034343698104617259546600741, + 21888242871839275222246405745257275088548364400416034343698135448584073396194, + 21888242871839275222246405745257275088548364400416034343698201663027047806348, + 107308464709302426, + 21888242871839275222246405745257275088548364400416034343698065300822594850938, + 21888242871839275222246405745257275088548364400416034343698078114098686755254, + 21888242871839275222246405745257275088548364400416034343698120343258810867504, + 118767217461435569, + 21888242871839275222246405745257275088548364400416034343698066548633992309844, + 21888242871839275222246405745257275088548364400416034343698078351814949847885, + 21888242871839275222246405745257275088548364400416034343698063846737583523273, + 21888242871839275222246405745257275088548364400416034343698137563863739027290, + 40238719288334053, + 111134057444874470, + 137395909992225245, + 21888242871839275222246405745257275088548364400416034343698156660140104368487, + 21888242871839275222246405745257275088548364400416034343698184970718236422474, + 53128788705479570, + 101131143287647876, + 21888242871839275222246405745257275088548364400416034343698067977652540788199, + 21888242871839275222246405745257275088548364400416034343698107129557071828923, + 64887496244766488, + 54155936441068794, + 139543437094622647, + 7146138688074801, + 143360753531293399, + 45747572899302721, + 84557260159994278, + 21888242871839275222246405745257275088548364400416034343698099994646447529855, + 58311663168445819, + 21888242871839275222246405745257275088548364400416034343698064743965023200273, + 21888242871839275222246405745257275088548364400416034343698185944340943107207, + 37666897314950439, + 107302669020222236, + 41661184868324663, + 10173970380361777, + 14740092964481068, + 91738885170249473, + 21888242871839275222246405745257275088548364400416034343698142605272490550680, + 21888242871839275222246405745257275088548364400416034343698165124366295931433, + 31100954317138147, + 45212111764019895, + 78542203987550957, + 31132493735561230, + 123139944435199249, + 21888242871839275222246405745257275088548364400416034343698093810068867178863, + 42017403362726249, + 80733559632727853, + 21888242871839275222246405745257275088548364400416034343698155909321700245583, + 21888242871839275222246405745257275088548364400416034343698185212369796810476, + 126814407439960309, + 11799297971562213, + 21888242871839275222246405745257275088548364400416034343698076396558564792637, + 135803300201630421, + 21888242871839275222246405745257275088548364400416034343698156499792892344374, + 8779984554289576, + 114570586465073741, + 132644560107843157, + 21888242871839275222246405745257275088548364400416034343698085174796690000070, + 120104625308413012, + 21888242871839275222246405745257275088548364400416034343698132633812410547776, + 21888242871839275222246405745257275088548364400416034343698199688530220494311, + 21888242871839275222246405745257275088548364400416034343698079162300029618343, + 132054230562551778, + 21888242871839275222246405745257275088548364400416034343698142189206626478539, + 21888242871839275222246405745257275088548364400416034343698202863398946880844, + 106550620595897268, + 111067696893311336, + 73963698639421593, + 38635203238392414, + 41089733011345344, + 114263026860802105, + 21888242871839275222246405745257275088548364400416034343698186531386410629151, + 140672843620208157, + 21888242871839275222246405745257275088548364400416034343698148369967522154570, + 124422576274201829, + 102852942992966693, + 44899365836621158, + 21888242871839275222246405745257275088548364400416034343698072112525874143557, + 21888242871839275222246405745257275088548364400416034343698202220112973868502, + 112198900170170273, + 21888242871839275222246405745257275088548364400416034343698071771178476911554, + 71403657543920732, + 21888242871839275222246405745257275088548364400416034343698093716151735796597, + 21888242871839275222246405745257275088548364400416034343698100809729150861529, + 133848376834598394, + 52076882449112870, + 2408940061624148, + 21888242871839275222246405745257275088548364400416034343698075815258298971954, + 21888242871839275222246405745257275088548364400416034343698140942011112988881, + 21888242871839275222246405745257275088548364400416034343698201065201349366884, + 21888242871839275222246405745257275088548364400416034343698169634633936714493, + 109376947883256985, + 140229759997735109, + 1916843519282952, + 21888242871839275222246405745257275088548364400416034343698185721005194872337, + 63026920958392860, + 5463237557756119, + 4483174344839480, + 68723635535629325, + 21888242871839275222246405745257275088548364400416034343698134315700328222842, + 21888242871839275222246405745257275088548364400416034343698201939615314501317, + 21888242871839275222246405745257275088548364400416034343698102630391017613347, + 76685990206537157, + 31928515851884207, + 21888242871839275222246405745257275088548364400416034343698091162342510309956, + 35324050326474862, + 21888242871839275222246405745257275088548364400416034343698152425310747665838, + 21888242871839275222246405745257275088548364400416034343698141643253768963576, + 51617406448765988, + 21888242871839275222246405745257275088548364400416034343698187745094067454896, + 94868483324951745, + 12317754827670776, + 61394006785948467, + 21888242871839275222246405745257275088548364400416034343698095904930480406344, + 113543400817691695, + 21888242871839275222246405745257275088548364400416034343698106709917668849240, + 41892897768249005, + 126174853494610507, + 21888242871839275222246405745257275088548364400416034343698116698741389876233, + 21888242871839275222246405745257275088548364400416034343698169238180630280550, + 21888242871839275222246405745257275088548364400416034343698196649036213456585, + 21888242871839275222246405745257275088548364400416034343698094236160942923774, + 21888242871839275222246405745257275088548364400416034343698180700311664298719, + 119930959778185221, + 21888242871839275222246405745257275088548364400416034343698098893661293015797, + 21888242871839275222246405745257275088548364400416034343698197727595073067457, + 21888242871839275222246405745257275088548364400416034343698194917975489969351, + 53616403415338625, + 21888242871839275222246405745257275088548364400416034343698169588784752606704, + 21888242871839275222246405745257275088548364400416034343698064813170782901611, + 130653247814639880, + 46573523219950465, + 48393909660545734, + 18969373932615143, + 21888242871839275222246405745257275088548364400416034343698189671001389684879, + 130631824610521101, + 21888242871839275222246405745257275088548364400416034343698076776873361977145, + 21888242871839275222246405745257275088548364400416034343698152038670146958838, + 13192185779260415, + 35640650382132465, + 53017019256935086, + 92245657691382401, + 21888242871839275222246405745257275088548364400416034343698157290854214313940, + 21888242871839275222246405745257275088548364400416034343698190884387467908929, + 32759243801948005, + 57436637343925710, + 21888242871839275222246405745257275088548364400416034343698200577798467465895, + 88162251758160222, + 53004365946820517, + 21888242871839275222246405745257275088548364400416034343698081116359097798468, + 21888242871839275222246405745257275088548364400416034343698126390012487524701, + 28897437913839890, + 21888242871839275222246405745257275088548364400416034343698071661962967625847, + 21888242871839275222246405745257275088548364400416034343698186513659319136244, + 21888242871839275222246405745257275088548364400416034343698071652993014223445, + 137204594739889072, + 21888242871839275222246405745257275088548364400416034343698161441176052431422, + 71880285209045785, + 21888242871839275222246405745257275088548364400416034343698183084015864726763, + 125857488900241854, + 141698546863083405, + 40424026811215751, + 21888242871839275222246405745257275088548364400416034343698091903523148082634, + 21888242871839275222246405745257275088548364400416034343698108199735615057945, + 21888242871839275222246405745257275088548364400416034343698175075335700394526, + 21888242871839275222246405745257275088548364400416034343698082402997249128758, + 21888242871839275222246405745257275088548364400416034343698159899580322600882, + 21888242871839275222246405745257275088548364400416034343698107768229414243379, + 37206753664663906, + 21888242871839275222246405745257275088548364400416034343698162953923805714319, + 21888242871839275222246405745257275088548364400416034343698158569261468276887, + 120771157201717777, + 21888242871839275222246405745257275088548364400416034343698171086657346815050, + 21888242871839275222246405745257275088548364400416034343698088270713610012450, + 100290184094697225, + 124606163221180270, + 21888242871839275222246405745257275088548364400416034343698126264912984623487, + 95437659217544881, + 21888242871839275222246405745257275088548364400416034343698115981926919144336, + 21888242871839275222246405745257275088548364400416034343698160391622301588050, + 21888242871839275222246405745257275088548364400416034343698117464577449075607, + 13861934392610094, + 21888242871839275222246405745257275088548364400416034343698185963148242989474, + 24798671933515190, + 21888242871839275222246405745257275088548364400416034343698152646497051649364, + 21888242871839275222246405745257275088548364400416034343698112210416330236732, + 95263209943766780, + 21888242871839275222246405745257275088548364400416034343698203912465409922350, + 81213494725782540, + 61852833077095953, + 21888242871839275222246405745257275088548364400416034343698178970898578227508, + 21888242871839275222246405745257275088548364400416034343698135577804500174418, + 58932512113928330, + 29048748810219713, + 21888242871839275222246405745257275088548364400416034343698168210357119739316, + 4309048004302391, + 21888242871839275222246405745257275088548364400416034343698145747864632069254, + 28257520896373651, + 21888242871839275222246405745257275088548364400416034343698152538257099794957, + 49431135366035475, + 131762805949301317, + 21888242871839275222246405745257275088548364400416034343698164196781126448148, + 21888242871839275222246405745257275088548364400416034343698138578101585073735, + 90047440379175722, + 118394648186259465, + 21888242871839275222246405745257275088548364400416034343698189004165198542179, + 21888242871839275222246405745257275088548364400416034343698115132353092073069, + 21888242871839275222246405745257275088548364400416034343698084692070861575007, + 123120662653713581, + 122230547065896025, + 21888242871839275222246405745257275088548364400416034343698146302752330734124, + 21888242871839275222246405745257275088548364400416034343698108338329660957463, + 21888242871839275222246405745257275088548364400416034343698072404710905399651, + 21888242871839275222246405745257275088548364400416034343698130986787834571672, + 21888242871839275222246405745257275088548364400416034343698132119044159583142, + 21979526472702094, + 77562905776830908, + 31138854256704924, + 129708608447655282, + 21888242871839275222246405745257275088548364400416034343698173188325036696374, + 21888242871839275222246405745257275088548364400416034343698093805898490306631, + 41088062880580661, + 21888242871839275222246405745257275088548364400416034343698135185448897641397, + 55017141960007016, + 21888242871839275222246405745257275088548364400416034343698136981947932919028, + 21888242871839275222246405745257275088548364400416034343698171167677216212741, + 127636670017765484, + 44994919290742608, + 71422748582391863, + 21888242871839275222246405745257275088548364400416034343698157480712898532791, + 8990606130976981, + 21888242871839275222246405745257275088548364400416034343698110286959419617545, + 107061221915574314, + 109480964093340061, + 100835721351991295, + 82855065704756040, + 21888242871839275222246405745257275088548364400416034343698118657750741605122, + 18483807936452092, + 21888242871839275222246405745257275088548364400416034343698199447259369442354, + 102428524956664184, + 30202418917003601, + 91811095232234644, + 39918641196447993, + 21888242871839275222246405745257275088548364400416034343698192416285466069591, + 21888242871839275222246405745257275088548364400416034343698116059089119571732, + 21888242871839275222246405745257275088548364400416034343698083519809922347107, + 19596820927749491, + 124947546482495610, + 24230164975058161, + 21888242871839275222246405745257275088548364400416034343698118427078227330928, + 21888242871839275222246405745257275088548364400416034343698112694366505863168, + 19766459690013325, + 64100001483350882, + 22311245940782983, + 21888242871839275222246405745257275088548364400416034343698190856651212908974, + 8249201318123765, + 21888242871839275222246405745257275088548364400416034343698180564619008403342, + 21888242871839275222246405745257275088548364400416034343698089333048546272844, + 110882649306578658, + 94899537787054129, + 21888242871839275222246405745257275088548364400416034343698181770488889242007, + 113317755522632653, + 21888242871839275222246405745257275088548364400416034343698084866571469083417, + 21888242871839275222246405745257275088548364400416034343698095619742450283226, + 86459138090389300, + 21888242871839275222246405745257275088548364400416034343698191997975148950686, + 113879410539522869, + 77231636242703209, + 45203367483462743, + 95846080554121541, + 21888242871839275222246405745257275088548364400416034343698106451857822881394, + 61592919889735983, + 114316331518010363, + 98470585764675450, + 85729929685158478, + 21888242871839275222246405745257275088548364400416034343698130780737780500552, + 6383800573323899, + 21888242871839275222246405745257275088548364400416034343698198947133170637402, + 21888242871839275222246405745257275088548364400416034343698198011280956578786, + 75819134024265657, + 21888242871839275222246405745257275088548364400416034343698125263363689669376, + 101181012563137501, + 130281635360010480, + 77844555867194763, + 272383043821643, + 29053750632200832, + 112687224576879457, + 21888242871839275222246405745257275088548364400416034343698189420724245152006, + 125387331014116166, + 134832673433089248, + 21888242871839275222246405745257275088548364400416034343698195167898195225129, + 106116302686145732, + 126548744633237561, + 10041541129746222, + 21888242871839275222246405745257275088548364400416034343698120506533688559676, + 83347791181597701, + 91724094165389549, + 21888242871839275222246405745257275088548364400416034343698163013444624672852, + 21888242871839275222246405745257275088548364400416034343698095303680345145041, + 21888242871839275222246405745257275088548364400416034343698126238757285120187, + 61677358900745589, + 21888242871839275222246405745257275088548364400416034343698159612889493752112, + 21888242871839275222246405745257275088548364400416034343698202921586501235056, + 120863929504922411, + 86091410386815608, + 21888242871839275222246405745257275088548364400416034343698107457974354947002, + 21888242871839275222246405745257275088548364400416034343698181840501894364991, + 21888242871839275222246405745257275088548364400416034343698162684513319928254, + 21888242871839275222246405745257275088548364400416034343698117751855005791525, + 21888242871839275222246405745257275088548364400416034343698197010433692444850, + 24766788502645810, + 38709364330563983, + 16077917233523540, + 36394321058270660, + 140339718039855103, + 127663277649026728, + 36420033396723360, + 21888242871839275222246405745257275088548364400416034343698169858664941740226, + 21888242871839275222246405745257275088548364400416034343698103859787809963860, + 92587186902695131, + 85734223910523167, + 142309245191750825, + 13333389352414596, + 17841075365981749, + 21888242871839275222246405745257275088548364400416034343698093548948290063756, + 21888242871839275222246405745257275088548364400416034343698200409654962887341, + 129644373777608543, + 21888242871839275222246405745257275088548364400416034343698114746734997573851, + 21888242871839275222246405745257275088548364400416034343698089877968361840667, + 21888242871839275222246405745257275088548364400416034343698126913625461011364, + 77037453072634845, + 31683814099374619, + 21888242871839275222246405745257275088548364400416034343698143360216207122810, + 98464304806621765, + 21888242871839275222246405745257275088548364400416034343698078921323223225898, + 41044001007492960, + 21888242871839275222246405745257275088548364400416034343698104214037702333085, + 21888242871839275222246405745257275088548364400416034343698128523125033337824, + 21888242871839275222246405745257275088548364400416034343698180594976764026513, + 34904843304425971, + 21888242871839275222246405745257275088548364400416034343698067337643883310834, + 62443007715238738, + 21888242871839275222246405745257275088548364400416034343698079284114038285574, + 105560258781355982, + 77207517803218120, + 21888242871839275222246405745257275088548364400416034343698069811849566862369, + 21888242871839275222246405745257275088548364400416034343698060622065207273430, + 21888242871839275222246405745257275088548364400416034343698152263216047687504, + 129288722089579955, + 21888242871839275222246405745257275088548364400416034343698176624013156701966, + 21888242871839275222246405745257275088548364400416034343698074513988879351977, + 41194421569447626, + 21888242871839275222246405745257275088548364400416034343698141506749256125005, + 130144510358061924, + 21888242871839275222246405745257275088548364400416034343698109593743624084736, + 21888242871839275222246405745257275088548364400416034343698095704345580631426, + 97846902567524744, + 21888242871839275222246405745257275088548364400416034343698127246515469716464, + 96760751089446466, + 70120119731447697, + 21888242871839275222246405745257275088548364400416034343698199594758081778054, + 21888242871839275222246405745257275088548364400416034343698202562668299909485, + 21888242871839275222246405745257275088548364400416034343698096721351227677280, ]), ]; -// Global configs for threshold secure preset -pub global N: u32 = 8192; -pub global L: u32 = 3; -pub global QIS: [Field; L] = [144115188098531329, 144115188097220609, 144115188094795777]; -pub global PLAINTEXT_MODULUS: Field = 1000000; -pub global Q_MOD_T: Field = 418497; -pub global Q_MOD_T_CENTERED: Field = 418497; -pub global Q_INVERSE_MOD_T: Field = 536833; - /************************************ ------------------------------------- pk_generation (CIRCUIT 1 - PUBLIC KEY THRESHOLD BFV) @@ -24625,16 +24625,16 @@ pk_generation (CIRCUIT 1 - PUBLIC KEY THRESHOLD BFV) pub global PK_GENERATION_BIT_EEK: u32 = 5; pub global PK_GENERATION_BIT_SK: u32 = 1; pub global PK_GENERATION_BIT_R1: u32 = 13; -pub global PK_GENERATION_BIT_R2: u32 = 57; -pub global PK_GENERATION_BIT_PK: u32 = 57; +pub global PK_GENERATION_BIT_R2: u32 = 58; +pub global PK_GENERATION_BIT_PK: u32 = 58; pub global PK_GENERATION_EEK_BOUND: Field = 20; pub global PK_GENERATION_SK_BOUND: Field = 1; pub global PK_GENERATION_R1_BOUNDS: [Field; L] = [4096, 4096, 4096]; pub global PK_GENERATION_R2_BOUNDS: [Field; L] = - [72057594049265664, 72057594048610304, 72057594047397888]; + [144115188082147328, 144115188081229824, 144115188080869376]; -pub global PK_GENERATION_B_ENC: Field = 7378697629483820646399; +pub global PK_GENERATION_B_ENC: Field = 230584300921369395201; pub global PK_GENERATION_CONFIGS: PkGenerationConfigs = PkGenerationConfigs::new( QIS, @@ -24651,7 +24651,8 @@ pk_aggregation (CIRCUIT 5) ------------------------------------- ************************************/ -pub global PK_AGGREGATION_BIT_PK: u32 = 57; +pub global PK_AGGREGATION_BIT_PK: u32 = 58; + pub global PK_AGGREGATION_CONFIGS: PkAggregationConfigs = PkAggregationConfigs::new(QIS); /************************************ @@ -24660,33 +24661,33 @@ user_data_encryption (USED FOR DATA ENCRYPTION) ------------------------------------- ************************************/ -pub global USER_DATA_ENCRYPTION_BIT_PK: u32 = 57; -pub global USER_DATA_ENCRYPTION_BIT_CT: u32 = 57; +pub global USER_DATA_ENCRYPTION_BIT_PK: u32 = 58; +pub global USER_DATA_ENCRYPTION_BIT_CT: u32 = 58; pub global USER_DATA_ENCRYPTION_BIT_U: u32 = 1; -pub global USER_DATA_ENCRYPTION_BIT_E0: u32 = 73; +pub global USER_DATA_ENCRYPTION_BIT_E0: u32 = 68; pub global USER_DATA_ENCRYPTION_BIT_E1: u32 = 5; -pub global USER_DATA_ENCRYPTION_BIT_K: u32 = 19; -pub global USER_DATA_ENCRYPTION_BIT_R1: u32 = 19; -pub global USER_DATA_ENCRYPTION_BIT_R2: u32 = 57; +pub global USER_DATA_ENCRYPTION_BIT_K: u32 = 20; +pub global USER_DATA_ENCRYPTION_BIT_R1: u32 = 20; +pub global USER_DATA_ENCRYPTION_BIT_R2: u32 = 58; pub global USER_DATA_ENCRYPTION_BIT_P1: u32 = 13; -pub global USER_DATA_ENCRYPTION_BIT_P2: u32 = 57; +pub global USER_DATA_ENCRYPTION_BIT_P2: u32 = 58; pub global USER_DATA_ENCRYPTION_K0IS: [Field; L] = - [108485446029743330, 74405086347525931, 92768820074065274]; + [69692087343893298, 156465571469415058, 282585960705363423]; pub global USER_DATA_ENCRYPTION_PK_BOUNDS: [Field; L] = - [72057594049265664, 72057594048610304, 72057594047397888]; -pub global USER_DATA_ENCRYPTION_E0_BOUND: Field = 7378697629483820646399; + [144115188082147328, 144115188081229824, 144115188080869376]; +pub global USER_DATA_ENCRYPTION_E0_BOUND: Field = 230584300921369395201; pub global USER_DATA_ENCRYPTION_E1_BOUND: Field = 20; pub global USER_DATA_ENCRYPTION_U_BOUND: Field = 1; -pub global USER_DATA_ENCRYPTION_K1_LOW_BOUND: Field = 500000; -pub global USER_DATA_ENCRYPTION_K1_UP_BOUND: Field = 499999; -pub global USER_DATA_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [380482, 262242, 325954]; -pub global USER_DATA_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [380481, 262241, 325953]; +pub global USER_DATA_ENCRYPTION_K1_LOW_BOUND: Field = 0; +pub global USER_DATA_ENCRYPTION_K1_UP_BOUND: Field = 999999; +pub global USER_DATA_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [4097, 4097, 4097]; +pub global USER_DATA_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [245890, 546946, 984514]; pub global USER_DATA_ENCRYPTION_R2_BOUNDS: [Field; L] = - [72057594049265664, 72057594048610304, 72057594047397888]; + [144115188082147328, 144115188081229824, 144115188080869376]; pub global USER_DATA_ENCRYPTION_P1_BOUNDS: [Field; L] = [4096, 4096, 4096]; pub global USER_DATA_ENCRYPTION_P2_BOUNDS: [Field; L] = - [72057594049265664, 72057594048610304, 72057594047397888]; + [144115188082147328, 144115188081229824, 144115188080869376]; /************************************ ------------------------------------- @@ -24726,18 +24727,18 @@ share_decryption (CIRCUIT 6 - THRESHOLD BFV SHARE DECRYPTION) ------------------------------------- ************************************/ -pub global THRESHOLD_SHARE_DECRYPTION_BIT_CT: u32 = 57; -pub global THRESHOLD_SHARE_DECRYPTION_BIT_SK: u32 = 57; -pub global THRESHOLD_SHARE_DECRYPTION_BIT_E_SM: u32 = 57; -pub global THRESHOLD_SHARE_DECRYPTION_BIT_R1: u32 = 69; -pub global THRESHOLD_SHARE_DECRYPTION_BIT_R2: u32 = 57; -pub global THRESHOLD_SHARE_DECRYPTION_BIT_D: u32 = 57; -pub global THRESHOLD_SHARE_DECRYPTION_BIT_D_NATIVE: u32 = 58; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_CT: u32 = 58; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_SK: u32 = 58; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_E_SM: u32 = 58; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_R1: u32 = 70; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_R2: u32 = 58; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_D: u32 = 58; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_D_NATIVE: u32 = 59; pub global THRESHOLD_SHARE_DECRYPTION_R1_BOUNDS: [Field; L] = - [295147905225792157698, 295147905223107803138, 295147905218141747202]; + [590295810384475453442, 590295810380717357058, 590295810379240962050]; pub global THRESHOLD_SHARE_DECRYPTION_R2_BOUNDS: [Field; L] = - [72057594049265664, 72057594048610304, 72057594047397888]; + [144115188082147328, 144115188081229824, 144115188080869376]; pub global THRESHOLD_SHARE_DECRYPTION_CONFIGS: ShareDecryptionConfigs = ShareDecryptionConfigs::new( QIS, @@ -24751,8 +24752,8 @@ decrypted_shares_aggregation (CIRCUIT 7) ------------------------------------- ************************************/ -pub global DECRYPTED_SHARES_AGGREGATION_BIT_NOISE: u32 = 151; -pub global DECRYPTED_SHARES_AGGREGATION_BIT_D_NATIVE: u32 = 58; +pub global DECRYPTED_SHARES_AGGREGATION_BIT_NOISE: u32 = 154; +pub global DECRYPTED_SHARES_AGGREGATION_BIT_D_NATIVE: u32 = 59; pub global DECRYPTED_SHARES_AGGREGATION_CONFIGS: DecryptedSharesAggregationConfigs = DecryptedSharesAggregationConfigs::new(QIS, PLAINTEXT_MODULUS, Q_INVERSE_MOD_T); diff --git a/crates/evm-helpers/src/contracts.rs b/crates/evm-helpers/src/contracts.rs index c70c08c6cf..0548ff32fd 100644 --- a/crates/evm-helpers/src/contracts.rs +++ b/crates/evm-helpers/src/contracts.rs @@ -31,7 +31,7 @@ static NONCE_LOCK: Lazy> = Lazy::new(|| Mutex::new(())); fn crypto_config_id_for_param_set(param_set: u8) -> Result { match param_set { 0 => Ok("0x04f3677e73b0f5066d6caf5cbd92e3fb2e38338edaf5cfc971ab28f7b684da78".parse()?), - 1 => Ok("0xd9c86e581f8291ffb5b63595600e8d096ed30b16e2e0a6634a76c22b1f58fb4e".parse()?), + 1 => Ok("0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb".parse()?), _ => Err(eyre::eyre!("unsupported BFV parameter set: {}", param_set)), } } diff --git a/crates/evm/src/interfold/events.rs b/crates/evm/src/interfold/events.rs index dad7d9c756..b80d283133 100644 --- a/crates/evm/src/interfold/events.rs +++ b/crates/evm/src/interfold/events.rs @@ -504,7 +504,7 @@ mod tests { ), ( 1, - "0xd9c86e581f8291ffb5b63595600e8d096ed30b16e2e0a6634a76c22b1f58fb4e", + "0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb", ), ]; diff --git a/crates/fhe-params/src/bin/search_params.rs b/crates/fhe-params/src/bin/search_params.rs index 6b903c0dd2..d9240d2b64 100644 --- a/crates/fhe-params/src/bin/search_params.rs +++ b/crates/fhe-params/src/bin/search_params.rs @@ -42,7 +42,7 @@ struct Args { k: u128, /// Statistical security parameter λ (negl(λ)=2^{-λ}). - #[arg(long, default_value_t = 38u32)] + #[arg(long, default_value_t = 31u32)] lambda: u32, /// Bound B on the error distribution ψ (e.g. 20 for CBD with σ≈3.2). diff --git a/crates/fhe-params/src/builder.rs b/crates/fhe-params/src/builder.rs index a0f239667f..7797dc1226 100644 --- a/crates/fhe-params/src/builder.rs +++ b/crates/fhe-params/src/builder.rs @@ -350,7 +350,7 @@ mod tests { /// Runtime feasibility guard: the `SmudgingBoundCalculator` must accept the /// Secure-16384 threshold parameters at the full committee (n=20) with the - /// configured smudging `m=z=3`, `mult_depth=3`, `lambda=38`. This encodes + /// configured smudging `m=z=3`, `mult_depth=3`, `lambda=31`. This encodes /// the `2*(B_C + n*B_sm) < Delta` correctness budget; if the constants are /// ever tightened beyond it, this test fails. #[test] diff --git a/crates/fhe-params/src/constants.rs b/crates/fhe-params/src/constants.rs index fb447a86e4..382e921182 100644 --- a/crates/fhe-params/src/constants.rs +++ b/crates/fhe-params/src/constants.rs @@ -39,14 +39,14 @@ pub mod secure_8192 { /// Threshold BFV parameters pub mod threshold { pub const PLAINTEXT_MODULUS: u64 = 1000000; - pub const MODULI: &[u64] = &[0x02000000015a0001, 0x0200000001460001, 0x0200000001210001]; - pub const ERROR1_VARIANCE: &str = "18148392902450051384713312396360971277653333"; + pub const MODULI: &[u64] = &[0x0400000000c00001, 0x0400000000a40001, 0x0400000000990001]; + pub const ERROR1_VARIANCE: &str = "17723039943798878305460955570711717478400"; } /// DKG parameters pub mod dkg { - pub const PLAINTEXT_MODULUS: u64 = 144115188098531329; - pub const MODULI: &[u64] = &[0x0800000000004001, 0x0800000000044001]; + pub const PLAINTEXT_MODULUS: u64 = 288230376164294657; + pub const MODULI: &[u64] = &[0x1000000000024001, 0x1000000000054001]; pub const ERROR1_VARIANCE: &str = "10"; } } @@ -63,19 +63,19 @@ pub mod secure_16384 { pub mod threshold { pub const PLAINTEXT_MODULUS: u64 = 1000; pub const MODULI: &[u64] = &[ - 0x0020000000c70001, - 0x0020000000c10001, - 0x0020000000bf0001, - 0x0020000000b30001, - 0x0020000000970001, + 0x00040000009f0001, + 0x00040000008a0001, + 0x0004000000800001, + 0x00040000007e0001, + 0x0004000000750001, ]; - pub const ERROR1_VARIANCE: &str = "4326914048779023023775413607683413333"; + pub const ERROR1_VARIANCE: &str = "264093875047547791978479834453333"; } /// DKG parameters pub mod dkg { - pub const PLAINTEXT_MODULUS: u64 = 9007199267782657; - pub const MODULI: &[u64] = &[0x0080000000080001, 0x0080000000130001]; + pub const PLAINTEXT_MODULUS: u64 = 1125899917262849; + pub const MODULI: &[u64] = &[0x0010000000060001, 0x00100000000f0001]; pub const ERROR1_VARIANCE: &str = "10"; } } @@ -124,11 +124,11 @@ pub mod defaults { /// Default insecure security parameter (λ). pub const DEFAULT_INSECURE_LAMBDA: usize = 2; /// Default secure security parameter (λ) for the 8192 presets. - pub const DEFAULT_SECURE_LAMBDA: usize = 50; + pub const DEFAULT_SECURE_LAMBDA: usize = 45; /// Statistical security parameter (λ) for the 16384 presets. - pub const DEFAULT_SECURE_16384_LAMBDA: usize = 38; + pub const DEFAULT_SECURE_16384_LAMBDA: usize = 31; - /// Multiplicative depth for insecure-512 preset (no l-BFV support). + /// Multiplicative depth for insecure preset (no l-BFV support). pub const INSECURE_512_MULT_DEPTH: u32 = 0; /// Multiplicative depth for secure-8192 preset (no l-BFV support). pub const SECURE_8192_MULT_DEPTH: u32 = 0; diff --git a/crates/fhe-params/src/presets.rs b/crates/fhe-params/src/presets.rs index ea09769ed0..3e2f9d1e69 100644 --- a/crates/fhe-params/src/presets.rs +++ b/crates/fhe-params/src/presets.rs @@ -225,7 +225,7 @@ pub struct PresetSearchDefaults { pub b_chi: u128, /// Multiplicative depth for l-BFV smudging noise computation. /// - /// Set to 0 for presets without l-BFV support (insecure-512, secure-8192). + /// Set to 0 for presets without l-BFV support (insecure, secure-8192). /// Set to 3 for secure-16384. pub mult_depth: u32, } @@ -349,7 +349,7 @@ impl BfvPreset { } } - /// Parses "insecure"|"secure" or λ (e.g. 2|80) into the threshold preset. Uses [`PAIR_PRESETS`] and [`PresetMetadata`]. + /// Parses `insecure`, `secure-8192`, `secure-16384`, or a preset λ into the threshold preset. pub fn from_security_config_name(name: &str) -> Result { let s = name.trim(); if let Ok(lambda) = s.parse::() { @@ -359,12 +359,12 @@ impl BfvPreset { .find(|p| p.metadata().lambda == lambda) .ok_or_else(|| PresetError::UnknownPreset(format!("lambda {lambda}"))); } - let tier: SecurityTier = s.parse()?; - Self::PAIR_PRESETS - .iter() - .copied() - .find(|p| p.metadata().security == tier) - .ok_or_else(|| PresetError::UnknownPreset(name.to_string())) + match s.to_ascii_lowercase().as_str() { + "insecure" => Ok(Self::InsecureThreshold512), + "secure-8192" => Ok(Self::SecureThreshold8192), + "secure-16384" => Ok(Self::SecureThreshold16384), + _ => Err(PresetError::UnknownPreset(name.to_string())), + } } pub fn list() -> Vec<&'static str> { @@ -511,18 +511,20 @@ impl BfvPreset { self.lambda_config().into_lambda() } - /// Returns the base directory name for circuit artifacts (e.g. `"insecure-512"`, `"secure-8192"`). + /// Returns the base directory name for circuit artifacts (e.g. `"insecure"`, `"secure-8192"`). /// Threshold and DKG presets at the same degree share the same compiled circuits. pub fn artifacts_dir(&self) -> String { let meta = self.metadata(); - format!("{}-{}", meta.security.as_config_str(), meta.degree) + match self { + BfvPreset::InsecureThreshold512 | BfvPreset::InsecureDkg512 => "insecure".to_string(), + _ => format!("{}-{}", meta.security.as_config_str(), meta.degree), + } } - /// Returns the Noir config module name for this preset, e.g. `"insecure-512"`, + /// Returns the Noir config module name for this preset, e.g. `"insecure"`, /// `"secure-8192"`, `"secure-16384"`. Codegen/zk-cli routing must use - /// this (not [`SecurityTier::as_config_str`]) so that `secure-8192` and - /// `secure-16384` resolve to distinct `configs::{module}` rather than both - /// collapsing onto `configs::secure`. + /// this (not [`SecurityTier::as_config_str`]) so that each preset resolves to a distinct + /// `configs::{module}` namespace. /// /// Identical to [`BfvPreset::artifacts_dir`]; the two names are kept in sync /// because artifacts and Noir configs are organized the same way. @@ -530,10 +532,19 @@ impl BfvPreset { self.artifacts_dir() } + /// Returns the valid Noir module name for this preset's generated configs. + pub fn noir_config_module(&self) -> &'static str { + match self { + BfvPreset::InsecureThreshold512 | BfvPreset::InsecureDkg512 => "insecure", + BfvPreset::SecureThreshold8192 | BfvPreset::SecureDkg8192 => "secure_8192", + BfvPreset::SecureThreshold16384 | BfvPreset::SecureDkg16384 => "secure_16384", + } + } + /// Returns the per-committee artifact directory: `"{preset}/{committee}"`. /// /// Use this at runtime so each committee size resolves to its own compiled artifacts - /// (e.g. `"secure-8192/small"`, `"insecure-512/micro"`). + /// (e.g. `"secure-8192/small"`, `"insecure/micro"`). pub fn artifacts_dir_for_committee>(&self, committee: C) -> String { format!("{}/{}", self.artifacts_dir(), committee.as_ref()) } @@ -782,11 +793,8 @@ mod tests { #[test] fn test_artifacts_dir() { - assert_eq!( - BfvPreset::InsecureThreshold512.artifacts_dir(), - "insecure-512" - ); - assert_eq!(BfvPreset::InsecureDkg512.artifacts_dir(), "insecure-512"); + assert_eq!(BfvPreset::InsecureThreshold512.artifacts_dir(), "insecure"); + assert_eq!(BfvPreset::InsecureDkg512.artifacts_dir(), "insecure"); assert_eq!( BfvPreset::SecureThreshold8192.artifacts_dir(), "secure-8192" diff --git a/crates/fhe-params/src/search/bfv.rs b/crates/fhe-params/src/search/bfv.rs index 168b7476af..2510a36537 100644 --- a/crates/fhe-params/src/search/bfv.rs +++ b/crates/fhe-params/src/search/bfv.rs @@ -631,7 +631,7 @@ mod tests { n: 20, z: 3, k: 1000, - lambda: 38, + lambda: 31, mult_depth: 3, b: 20, b_chi: 1, @@ -688,7 +688,7 @@ mod tests { #[test] fn test_bfv_search_mult_depth_3_feasible() { let config = create_test_config(); - let res = bfv_search(&config).expect("search succeeds for n=20 m=3 mult_depth=3 λ=38"); + let res = bfv_search(&config).expect("search succeeds for n=20 m=3 mult_depth=3 λ=31"); assert_eq!(res.d, 16384); assert_eq!(res.mult_depth, 3); assert_eq!(res.selected_primes.len(), 5); diff --git a/crates/tests/tests/integration.rs b/crates/tests/tests/integration.rs index 2bcc9df24d..1bf2e43d4f 100644 --- a/crates/tests/tests/integration.rs +++ b/crates/tests/tests/integration.rs @@ -83,7 +83,7 @@ fn select_benchmark_params() -> BenchmarkParams { let preset_subdir = if is_secure_mode { "secure-8192" } else { - "insecure-512" + "insecure" }; let committee = active_committee(preset_subdir); diff --git a/crates/wasm/src/lib.rs b/crates/wasm/src/lib.rs index 9d46781659..9fc4712ec3 100644 --- a/crates/wasm/src/lib.rs +++ b/crates/wasm/src/lib.rs @@ -197,7 +197,7 @@ pub fn bfv_verifiable_encrypt_vector( /// Retrieves a BFV parameter set by name. /// /// # Parameters -/// * `name` - Parameter set identifier (e.g., "SECURE_THRESHOLD_8192") +/// * `name` - Parameter set identifier (e.g., "SECURE_THRESHOLD_8192" or "SECURE_THRESHOLD_16384") /// /// # Returns /// A JavaScript object with the following structure: @@ -228,7 +228,7 @@ pub fn get_bfv_params(name: &str) -> Result { /// /// # Returns /// Array of parameter set names that can be passed to `get_bfv_params()`. -/// Includes both production-ready sets (e.g., "SECURE_THRESHOLD_8192") and +/// Includes production-ready sets (e.g., "SECURE_THRESHOLD_8192" and "SECURE_THRESHOLD_16384") and /// insecure sets for testing (prefixed with "INSECURE_"). pub fn get_bfv_params_list() -> Vec { BfvPreset::list() diff --git a/crates/zk-helpers/README.md b/crates/zk-helpers/README.md index 53405fa085..f3e3505e90 100644 --- a/crates/zk-helpers/README.md +++ b/crates/zk-helpers/README.md @@ -12,7 +12,7 @@ cargo run -p e3-zk-helpers --bin zk_cli -- --list_circuits cargo run -p e3-zk-helpers --bin zk_cli -- --circuit pk-generation --preset insecure --committee minimum # C2 chunked configs (default: 512 coefficients) -cargo run -p e3-zk-helpers --bin zk_cli -- --circuit share-computation --preset secure --inputs secret-key --chunk-size 512 +cargo run -p e3-zk-helpers --bin zk_cli -- --circuit share-computation --preset secure-8192 --inputs secret-key --chunk-size 512 # Micro or small committee (must match active circuits lib selection) cargo run -p e3-zk-helpers --bin zk_cli -- --circuit pk-generation --preset insecure --committee micro diff --git a/crates/zk-helpers/src/bin/generate_config_modules.rs b/crates/zk-helpers/src/bin/generate_config_modules.rs new file mode 100644 index 0000000000..ff4c6c063b --- /dev/null +++ b/crates/zk-helpers/src/bin/generate_config_modules.rs @@ -0,0 +1,653 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +//! Regenerates the global BFV/CRT config modules in `circuits/lib/src/configs/` +//! (`mod.nr`, `threshold.nr`, `dkg.nr`) for the given preset. +//! +//! These were historically hand-maintained (with the 24k-line `threshold.nr` dominated +//! by the deterministic `CRP` literal). This binary derives every value from the same +//! Rust parameter / bound computation the per-circuit `zk_cli` codegen uses, so the +//! on-disk modules can never silently desync from the prover. +//! +//! Usage: +//! cargo run --release --bin generate_config_modules -- \ +//! --preset INSECURE_THRESHOLD_512 \ +//! [--output-root ] +//! +//! A preset maps to a distinct Noir module (`insecure`, `secure_8192`, or `secure_16384`); the +//! generator writes into `//`. + +use std::path::{Path, PathBuf}; + +use anyhow::{Context, Result}; +use clap::Parser; +use e3_fhe_params::{build_pair_for_preset, BfvPreset, ParameterType}; +use e3_zk_helpers::ciphernodes_committee::CiphernodesCommitteeSize; +use e3_zk_helpers::circuits::dkg::pk::computation::{Bits as DkgPkBits, Configs as DkgPkConfigs}; +use e3_zk_helpers::circuits::dkg::share_encryption::circuit::ShareEncryptionCircuitData; +use e3_zk_helpers::circuits::dkg::share_encryption::Configs as ShareEncryptionConfigs; +use e3_zk_helpers::circuits::threshold::decrypted_shares_aggregation::computation::Configs as DsaConfigs; +use e3_zk_helpers::circuits::threshold::pk_aggregation::Configs as PkAggregationConfigs; +use e3_zk_helpers::circuits::threshold::pk_generation::computation::Configs as PkGenerationConfigs; +use e3_zk_helpers::circuits::threshold::pk_generation::utils::deterministic_crp_crt_polynomial; +use e3_zk_helpers::circuits::threshold::share_decryption::Configs as ThresholdShareDecryptionConfigs; +use e3_zk_helpers::circuits::threshold::user_data_encryption::Configs as UserDataEncryptionConfigs; +use e3_zk_helpers::computation::DkgInputType; +use e3_zk_helpers::utils::{bigint_to_field, ceil_sqrt, compute_msg_bit, join_display}; +use e3_zk_helpers::Computation; +use num_bigint::{BigInt, BigUint}; +use num_traits::ToPrimitive; + +const LICENSE: &str = "// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +"; + +/// Default coefficient count per C2 chunk. Mirrors +/// `crates/zk-prover/src/circuits/aggregation/c2_chunk_config.rs`. +const DEFAULT_C2_CHUNK_SIZE: u32 = 512; +/// Default chunk count per C2 batch. Mirrors the same source. +const DEFAULT_C2_CHUNKS_PER_BATCH: u32 = 4; + +/// The section banner used across the committed config modules: a `/**`...`*/` +/// box with the circuit title centered between two dash lines. +fn banner(title: &str) -> String { + format!( + "/************************************\n\ + -------------------------------------\n\ + {title}\n\ + -------------------------------------\n\ + ************************************/" + ) +} + +/// Prepend the section banner to a body, separating them with a blank line. +fn section(title: &str, body: &str) -> String { + format!("{}\n\n{}", banner(title), body.trim_end()) +} + +fn join_biguint(vals: &[BigUint]) -> String { + join_display(vals, ", ") +} + +fn centered_str(v: &BigInt) -> String { + if *v < BigInt::from(0u32) { + format!("-{}", -v) + } else { + v.to_string() + } +} + +fn moduli_str(moduli: &[u64]) -> String { + join_display(moduli, ", ") +} + +/// Computes the deterministic error bound `B_enc = ceil(sqrt(3 * error1_variance))` +/// for the threshold parameter set, matching `pk_generation` codegen. +fn b_enc_value(preset: BfvPreset) -> Result { + let (threshold_params, _) = build_pair_for_preset(preset) + .with_context(|| format!("build_pair_for_preset({preset:?}) failed"))?; + Ok(ceil_sqrt( + &(BigUint::from(3u32) * threshold_params.get_error1_variance()), + )) +} + +/// Computes the sampler-aligned encryption bound used by the smudging calculator. +fn smudging_b_enc_value(preset: BfvPreset) -> Result { + let (threshold_params, _) = build_pair_for_preset(preset) + .with_context(|| format!("build_pair_for_preset({preset:?}) failed"))?; + let variance = threshold_params.get_error1_variance(); + if variance < &BigUint::from(16u32) { + Ok(BigUint::from(2u64 * variance.to_u64().unwrap())) + } else { + Ok((BigUint::from(3u32) * variance).sqrt()) + } +} + +/// The C2 chunking for a polynomial degree, matching `c2_chunk_layout::C2ChunkLayout::compiled`. +fn c2_chunking(degree: u32) -> (u32, u32, u32, u32) { + let chunk_size = DEFAULT_C2_CHUNK_SIZE.min(degree); + let n_chunks = degree / chunk_size; + let chunks_per_batch = if degree <= DEFAULT_C2_CHUNK_SIZE { + 1 + } else { + DEFAULT_C2_CHUNKS_PER_BATCH + }; + let n_batches = n_chunks / chunks_per_batch; + (chunk_size, n_chunks, chunks_per_batch, n_batches) +} + +/// Serializes the deterministic CRP the same way `crp_matrix_constant_string` does, but +/// one coefficient per line to match the committed 24k-line `threshold.nr` layout: +/// +/// ```text +/// pub global CRP: [Polynomial; L] = [ +/// Polynomial::new([ +/// , +/// , +/// ]), +/// ... +/// ]; +/// ``` +fn crp_block(threshold_params: &std::sync::Arc) -> Result { + let a = deterministic_crp_crt_polynomial(threshold_params) + .context("deterministic_crp_crt_polynomial failed")?; + + let limb_strings: Vec = a + .limbs + .iter() + .map(|limb| { + let coeffs: Vec = limb + .coefficients() + .iter() + .map(|c| format!(" {},", bigint_to_field(c))) + .collect(); + format!(" Polynomial::new([\n{}\n ]),", coeffs.join("\n")) + }) + .collect(); + + Ok(format!( + "pub global CRP: [Polynomial; L] = [\n{}\n];", + limb_strings.join("\n") + )) +} + +fn render_threshold(preset: BfvPreset) -> Result { + let committee = CiphernodesCommitteeSize::Minimum.values(); + + let pkgen = PkGenerationConfigs::compute(preset, &committee) + .context("PkGenerationConfigs::compute failed")?; + let dsa = DsaConfigs::compute(preset, &()).context("DsaConfigs::compute failed")?; + let udec = UserDataEncryptionConfigs::compute(preset, &()) + .context("UserDataEncryptionConfigs::compute failed")?; + let pkagg = PkAggregationConfigs::compute(preset, &()) + .context("PkAggregationConfigs::compute failed")?; + let tsd = ThresholdShareDecryptionConfigs::compute(preset, &()) + .context("ThresholdShareDecryptionConfigs::compute failed")?; + let (threshold_params, _) = build_pair_for_preset(preset) + .with_context(|| format!("build_pair_for_preset({preset:?}) failed"))?; + let crp = crp_block(&threshold_params)?; + let b_enc = b_enc_value(preset)?; + + let slug = preset.noir_config_module(); + let esm_prefix = match preset { + BfvPreset::InsecureThreshold512 => "INSECURE", + BfvPreset::SecureThreshold8192 => "SECURE_8192", + BfvPreset::SecureThreshold16384 => "SECURE_16384", + _ => unreachable!("config generation requires a threshold preset"), + }; + + let header = format!( + "{LICENSE} +use crate::core::threshold::decrypted_shares_aggregation::Configs as DecryptedSharesAggregationConfigs; +use crate::core::threshold::pk_aggregation::Configs as PkAggregationConfigs; +use crate::core::threshold::pk_generation::Configs as PkGenerationConfigs; +use crate::core::threshold::share_decryption::Configs as ShareDecryptionConfigs; +use crate::core::threshold::user_data_encryption_ct0::Configs as UserDataEncryptionCt0Configs; +use crate::core::threshold::user_data_encryption_ct1::Configs as UserDataEncryptionCt1Configs; +use crate::math::polynomial::Polynomial; + +pub use crate::configs::committee::active::{{ + {esm_prefix}_E_SM_BIT as PK_GENERATION_BIT_E_SM, {esm_prefix}_E_SM_BOUND as PK_GENERATION_E_SM_BOUND, +}}; + +// Global configs for threshold {slug} preset +pub global N: u32 = {}; +pub global L: u32 = {}; +pub global QIS: [Field; L] = [{}]; +pub global PLAINTEXT_MODULUS: Field = {}; +pub global Q_MOD_T: Field = {}; +pub global Q_MOD_T_CENTERED: Field = {}; +pub global Q_INVERSE_MOD_T: Field = {}; +pub global PARAMS_SEARCH_Z: Field = {}; +pub global PARAMS_LAMBDA: u32 = {}; +pub global PARAMS_TWO_POW_LAMBDA_PLUS_ONE: Field = {}; +pub global PARAMS_MULT_DEPTH: u32 = {}; +pub global PARAMS_SMUDGING_B_ENC: Field = {}; + +{crp} +\n", + pkgen.n, + pkgen.l, + moduli_str(&pkgen.moduli), + dsa.plaintext_modulus, + dsa.q_mod_t, + centered_str(&dsa.q_mod_t_centered), + dsa.q_inverse_mod_t, + preset + .search_defaults() + .context("search_defaults() missing for threshold preset")? + .z, + preset + .lambda() + .map_err(|e| anyhow::anyhow!(e.to_string()))? + .value(), + 1u128 << (preset + .lambda() + .map_err(|e| anyhow::anyhow!(e.to_string()))? + .value() + + 1), + preset + .search_defaults() + .context("search_defaults() missing for threshold preset")? + .mult_depth, + smudging_b_enc_value(preset)?, + ); + + let pkgen_section = section( + "pk_generation (CIRCUIT 1 - PUBLIC KEY THRESHOLD BFV)", + &format!( + "pub global PK_GENERATION_BIT_EEK: u32 = {}; +pub global PK_GENERATION_BIT_SK: u32 = {}; +pub global PK_GENERATION_BIT_R1: u32 = {}; +pub global PK_GENERATION_BIT_R2: u32 = {}; +pub global PK_GENERATION_BIT_PK: u32 = {}; + +pub global PK_GENERATION_EEK_BOUND: Field = {}; +pub global PK_GENERATION_SK_BOUND: Field = {}; +pub global PK_GENERATION_R1_BOUNDS: [Field; L] = [{}]; +pub global PK_GENERATION_R2_BOUNDS: [Field; L] = [{}]; + +pub global PK_GENERATION_B_ENC: Field = {}; + +pub global PK_GENERATION_CONFIGS: PkGenerationConfigs = PkGenerationConfigs::new( + QIS, + PK_GENERATION_EEK_BOUND, + PK_GENERATION_SK_BOUND, + PK_GENERATION_E_SM_BOUND, + PK_GENERATION_R1_BOUNDS, + PK_GENERATION_R2_BOUNDS, +);", + pkgen.bits.eek_bit, + pkgen.bits.sk_bit, + pkgen.bits.r1_bit, + pkgen.bits.r2_bit, + pkgen.bits.pk_bit, + pkgen.bounds.eek_bound, + pkgen.bounds.sk_bound, + join_biguint(&pkgen.bounds.r1_bounds), + join_biguint(&pkgen.bounds.r2_bounds), + b_enc, + ), + ); + + let pkagg_section = section( + "pk_aggregation (CIRCUIT 5)", + &format!( + "pub global PK_AGGREGATION_BIT_PK: u32 = {}; +\npub global PK_AGGREGATION_CONFIGS: PkAggregationConfigs = PkAggregationConfigs::new(QIS);", + pkagg.bits.pk_bit, + ), + ); + + let udec_section = section( + "user_data_encryption (USED FOR DATA ENCRYPTION)", + &format!( + "pub global USER_DATA_ENCRYPTION_BIT_PK: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_CT: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_U: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_E0: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_E1: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_K: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_R1: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_R2: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_P1: u32 = {}; +pub global USER_DATA_ENCRYPTION_BIT_P2: u32 = {}; + +pub global USER_DATA_ENCRYPTION_K0IS: [Field; L] = [{}]; +pub global USER_DATA_ENCRYPTION_PK_BOUNDS: [Field; L] = [{}]; +pub global USER_DATA_ENCRYPTION_E0_BOUND: Field = {}; +pub global USER_DATA_ENCRYPTION_E1_BOUND: Field = {}; +pub global USER_DATA_ENCRYPTION_U_BOUND: Field = {}; +pub global USER_DATA_ENCRYPTION_K1_LOW_BOUND: Field = {}; +pub global USER_DATA_ENCRYPTION_K1_UP_BOUND: Field = {}; +pub global USER_DATA_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [{}]; +pub global USER_DATA_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [{}]; +pub global USER_DATA_ENCRYPTION_R2_BOUNDS: [Field; L] = [{}]; +pub global USER_DATA_ENCRYPTION_P1_BOUNDS: [Field; L] = [{}]; +pub global USER_DATA_ENCRYPTION_P2_BOUNDS: [Field; L] = [{}];", + udec.bits.pk_bit, + udec.bits.ct_bit, + udec.bits.u_bit, + udec.bits.e0_bit, + udec.bits.e1_bit, + udec.bits.k_bit, + udec.bits.r1_bit, + udec.bits.r2_bit, + udec.bits.p1_bit, + udec.bits.p2_bit, + join_display(&udec.k0is, ", "), + join_biguint(&udec.bounds.pk_bounds), + udec.bounds.e0_bound, + udec.bounds.e1_bound, + udec.bounds.u_bound, + udec.bounds.k1_low_bound, + udec.bounds.k1_up_bound, + join_biguint(&udec.bounds.r1_low_bounds), + join_biguint(&udec.bounds.r1_up_bounds), + join_biguint(&udec.bounds.r2_bounds), + join_biguint(&udec.bounds.p1_bounds), + join_biguint(&udec.bounds.p2_bounds), + ), + ); + + let udec_ct0_section = section( + "user_data_encryption_ct0 (CIRCUIT A - CT0 ENCRYPTION)", + "pub global USER_DATA_ENCRYPTION_CT0_CONFIGS: UserDataEncryptionCt0Configs = UserDataEncryptionCt0Configs::new( + QIS, + USER_DATA_ENCRYPTION_K0IS, + USER_DATA_ENCRYPTION_E0_BOUND, + USER_DATA_ENCRYPTION_U_BOUND, + USER_DATA_ENCRYPTION_R1_LOW_BOUNDS, + USER_DATA_ENCRYPTION_R1_UP_BOUNDS, + USER_DATA_ENCRYPTION_R2_BOUNDS, + USER_DATA_ENCRYPTION_K1_LOW_BOUND, + USER_DATA_ENCRYPTION_K1_UP_BOUND, +);", + ); + + let udec_ct1_section = section( + "user_data_encryption_ct1 (CIRCUIT B - CT1 ENCRYPTION)", + "pub global USER_DATA_ENCRYPTION_CT1_CONFIGS: UserDataEncryptionCt1Configs = UserDataEncryptionCt1Configs::new( + QIS, + USER_DATA_ENCRYPTION_E1_BOUND, + USER_DATA_ENCRYPTION_U_BOUND, + USER_DATA_ENCRYPTION_P1_BOUNDS, + USER_DATA_ENCRYPTION_P2_BOUNDS, +);", + ); + + let tsd_section = section( + "share_decryption (CIRCUIT 6 - THRESHOLD BFV SHARE DECRYPTION)", + &format!( + "pub global THRESHOLD_SHARE_DECRYPTION_BIT_CT: u32 = {}; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_SK: u32 = {}; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_E_SM: u32 = {}; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_R1: u32 = {}; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_R2: u32 = {}; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_D: u32 = {}; +pub global THRESHOLD_SHARE_DECRYPTION_BIT_D_NATIVE: u32 = {}; + +pub global THRESHOLD_SHARE_DECRYPTION_R1_BOUNDS: [Field; L] = [{}]; +pub global THRESHOLD_SHARE_DECRYPTION_R2_BOUNDS: [Field; L] = [{}]; + +pub global THRESHOLD_SHARE_DECRYPTION_CONFIGS: ShareDecryptionConfigs = ShareDecryptionConfigs::new( + QIS, + THRESHOLD_SHARE_DECRYPTION_R1_BOUNDS, + THRESHOLD_SHARE_DECRYPTION_R2_BOUNDS, +);", + tsd.bits.ct_bit, + tsd.bits.sk_bit, + tsd.bits.e_sm_bit, + tsd.bits.r1_bit, + tsd.bits.r2_bit, + tsd.bits.d_bit, + tsd.bits.d_native_bit, + join_biguint(&tsd.bounds.r1_bounds), + join_biguint(&tsd.bounds.r2_bounds), + ), + ); + + let dsa_section = section( + "decrypted_shares_aggregation (CIRCUIT 7)", + &format!( + "pub global DECRYPTED_SHARES_AGGREGATION_BIT_NOISE: u32 = {}; +pub global DECRYPTED_SHARES_AGGREGATION_BIT_D_NATIVE: u32 = {}; + +pub global DECRYPTED_SHARES_AGGREGATION_CONFIGS: DecryptedSharesAggregationConfigs = + DecryptedSharesAggregationConfigs::new(QIS, PLAINTEXT_MODULUS, Q_INVERSE_MOD_T);", + dsa.bits.noise_bit, dsa.bits.d_native_bit, + ), + ); + + Ok(format!( + "{header}{pkgen_section}\n\n{pkagg_section}\n\n{udec_section}\n\n{udec_ct0_section}\n\n{udec_ct1_section}\n\n{tsd_section}\n\n{dsa_section}\n" + )) +} + +fn render_dkg(preset: BfvPreset) -> Result { + let committee = CiphernodesCommitteeSize::Minimum.values(); + + let dkg_pk = DkgPkConfigs::compute(preset, &()).context("DkgPkConfigs::compute failed")?; + let dkg_pk_bits = DkgPkBits::compute(preset, &()).context("DkgPkBits::compute failed")?; + let sd = preset + .search_defaults() + .context("search_defaults() failed")?; + let se_sample = ShareEncryptionCircuitData::generate_sample( + preset, + committee.clone(), + DkgInputType::SecretKey, + sd.z, + ) + .context("ShareEncryptionCircuitData::generate_sample failed")?; + let sh_enc = ShareEncryptionConfigs::compute(preset, &se_sample) + .context("ShareEncryptionConfigs::compute failed")?; + let (_, dkg_params) = build_pair_for_preset(preset) + .with_context(|| format!("build_pair_for_preset({preset:?}) failed"))?; + + let cfg_dir = preset.config_dir(); + let slug = preset.noir_config_module(); + let dkg_plaintext = dkg_params.plaintext(); + let msg_bit = compute_msg_bit(&dkg_params); + let (chunk_size, n_chunks, chunks_per_batch, n_batches) = c2_chunking(dkg_pk.n as u32); + let parity_flag = slug.to_uppercase(); + + let header = format!( + "{LICENSE} +pub use crate::configs::{slug}::threshold::{{ + L as L_THRESHOLD, PK_GENERATION_BIT_E_SM as SHARE_COMPUTATION_E_SM_BIT_SECRET, + QIS as QIS_THRESHOLD, THRESHOLD_SHARE_DECRYPTION_BIT_SK as SHARE_DECRYPTION_BIT_AGG, +}}; +use crate::core::dkg::share_computation::Configs as ShareComputationConfigs; +use crate::core::dkg::share_encryption::Configs as ShareEncryptionConfigs; + +// Global configs for DKG {slug} preset +pub global N: u32 = {}; +pub global L: u32 = {}; +pub global QIS: [Field; L] = [{}]; +pub global PLAINTEXT_MODULUS: Field = {}; +pub global Q_MOD_T: Field = {}; +pub global Q_MOD_T_CENTERED: Field = {}; +pub global DKG_ERROR_BOUND: Field = {}; + +// Parity matrix is sized for the active committee and the {cfg_dir} threshold QIS; +// see `committee/{{name}}/parity_{slug}.nr`. Re-exported via `committee::active`. +pub use crate::configs::committee::active::PARITY_MATRIX_{parity_flag} as PARITY_MATRIX; +\n", + dkg_pk.n, + dkg_pk.l, + moduli_str(&sh_enc.moduli), + dkg_plaintext, + sh_enc.q_mod_t, + centered_str(&sh_enc.q_mod_t_centered), + dkg_params.variance() * 2, + ); + + let pk_section = section( + "pk (CIRCUIT 0)", + &format!( + "// pk - bit parameters +pub global PK_BIT_PK: u32 = {};", + dkg_pk_bits.pk_bit, + ), + ); + + let sc_sk_section = section( + "share_computation_sk (CIRCUIT 2a)", + &format!( + "pub global SHARE_COMPUTATION_BIT_SHARE: u32 = {}; +pub global SHARE_COMPUTATION_SK_BIT_SECRET: u32 = {}; +pub global SHARE_COMPUTATION_CHUNK_SIZE: u32 = {}; +pub global SHARE_COMPUTATION_N_CHUNKS: u32 = {}; +pub global SHARE_COMPUTATION_CHUNKS_PER_BATCH: u32 = {}; +pub global SHARE_COMPUTATION_N_BATCHES: u32 = {}; + +pub global SHARE_COMPUTATION_SK_CONFIGS: ShareComputationConfigs = + ShareComputationConfigs::new(QIS_THRESHOLD);", + msg_bit, 1u32, chunk_size, n_chunks, chunks_per_batch, n_batches, + ), + ); + + let sc_esm_section = section( + "share_computation_e_sm (CIRCUIT 2b)", + "pub global SHARE_COMPUTATION_E_SM_CONFIGS: ShareComputationConfigs = + ShareComputationConfigs::new(QIS_THRESHOLD);", + ); + + let sh_enc_section = section( + "share_encryption_sk (CIRCUIT 3a)\nshare_encryption_e_sm (CIRCUIT 3b)", + &format!( + "pub global SHARE_ENCRYPTION_BIT_PK: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_CT: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_U: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_E0: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_E1: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_MSG: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_R1: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_R2: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_P1: u32 = {}; +pub global SHARE_ENCRYPTION_BIT_P2: u32 = {}; + +pub global SHARE_ENCRYPTION_K0IS: [Field; L] = [{}]; +pub global SHARE_ENCRYPTION_PK_BOUNDS: [Field; L] = [{}]; +pub global SHARE_ENCRYPTION_E0_BOUND: Field = {}; +pub global SHARE_ENCRYPTION_E1_BOUND: Field = {}; +pub global SHARE_ENCRYPTION_U_BOUND: Field = {}; +pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [{}]; +pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [{}]; +pub global SHARE_ENCRYPTION_R2_BOUNDS: [Field; L] = [{}]; +pub global SHARE_ENCRYPTION_P1_BOUNDS: [Field; L] = [{}]; +pub global SHARE_ENCRYPTION_P2_BOUNDS: [Field; L] = [{}]; +pub global SHARE_ENCRYPTION_MSG_BOUND: Field = {}; + +pub global SHARE_ENCRYPTION_CONFIGS: ShareEncryptionConfigs = ShareEncryptionConfigs::new( + PLAINTEXT_MODULUS, + Q_MOD_T, + QIS, + SHARE_ENCRYPTION_K0IS, + SHARE_ENCRYPTION_PK_BOUNDS, + SHARE_ENCRYPTION_E0_BOUND, + SHARE_ENCRYPTION_E1_BOUND, + SHARE_ENCRYPTION_U_BOUND, + SHARE_ENCRYPTION_R1_LOW_BOUNDS, + SHARE_ENCRYPTION_R1_UP_BOUNDS, + SHARE_ENCRYPTION_R2_BOUNDS, + SHARE_ENCRYPTION_P1_BOUNDS, + SHARE_ENCRYPTION_P2_BOUNDS, + SHARE_ENCRYPTION_MSG_BOUND, +);", + sh_enc.bits.pk_bit, + sh_enc.bits.ct_bit, + sh_enc.bits.u_bit, + sh_enc.bits.e0_bit, + sh_enc.bits.e1_bit, + sh_enc.bits.msg_bit, + sh_enc.bits.r1_bit, + sh_enc.bits.r2_bit, + sh_enc.bits.p1_bit, + sh_enc.bits.p2_bit, + join_display(&sh_enc.k0is, ", "), + join_biguint(&sh_enc.bounds.pk_bounds), + sh_enc.bounds.e0_bound, + sh_enc.bounds.e1_bound, + sh_enc.bounds.u_bound, + join_biguint(&sh_enc.bounds.r1_low_bounds), + join_biguint(&sh_enc.bounds.r1_up_bounds), + join_biguint(&sh_enc.bounds.r2_bounds), + join_biguint(&sh_enc.bounds.p1_bounds), + join_biguint(&sh_enc.bounds.p2_bounds), + sh_enc.bounds.msg_bound, + ), + ); + + let sh_dec_section = section( + "share_decryption_sk (CIRCUIT 4a - BFV DECRYPTION SK)\nshare_decryption_e_sm (CIRCUIT 4b - BFV DECRYPTION E_SM)", + &format!( + "pub global SHARE_DECRYPTION_BIT_MSG: u32 = {}; +// SHARE_DECRYPTION_BIT_AGG: see `pub use` of `THRESHOLD_SHARE_DECRYPTION_BIT_SK` (C6 `BIT_SK`).", + msg_bit, + ), + ); + + Ok(format!( + "{header}{pk_section}\n\n{sc_sk_section}\n\n{sc_esm_section}\n\n{sh_enc_section}\n\n{sh_dec_section}\n" + )) +} + +fn render_mod() -> String { + format!("{LICENSE}\npub mod dkg;\npub mod threshold;\n") +} + +fn main() -> Result<()> { + let args = Args::parse(); + let preset = BfvPreset::from_name(&args.preset) + .with_context(|| format!("unknown preset: {:?}", args.preset))?; + if preset.metadata().parameter_type != ParameterType::THRESHOLD { + anyhow::bail!( + "preset {:?} is a DKG-only preset; pass the threshold variant (e.g. INSECURE_THRESHOLD_512)", + preset + ); + } + + let root = output_root(&args)?; + let dir = root.join(preset.noir_config_module()); + std::fs::create_dir_all(&dir).with_context(|| format!("creating {}", dir.display()))?; + + let threshold = render_threshold(preset)?; + let dkg = render_dkg(preset)?; + + let tp = dir.join("threshold.nr"); + let dp = dir.join("dkg.nr"); + let mp = dir.join("mod.nr"); + + std::fs::write(&tp, threshold).with_context(|| format!("writing {}", tp.display()))?; + std::fs::write(&dp, dkg).with_context(|| format!("writing {}", dp.display()))?; + std::fs::write(&mp, render_mod()).with_context(|| format!("writing {}", mp.display()))?; + + println!("{}", tp.display()); + println!("{}", dp.display()); + println!("{}", mp.display()); + + Ok(()) +} + +#[derive(Debug, Parser)] +#[command( + name = "generate_config_modules", + about = "Regenerate a preset's BFV/CRT config module (threshold.nr / dkg.nr / mod.nr)." +)] +struct Args { + /// Preset name (e.g. `INSECURE_THRESHOLD_512`, `SECURE_THRESHOLD_8192`, `SECURE_THRESHOLD_16384`). + #[arg(long)] + preset: String, + + /// Root directory containing the per-preset modules. Defaults to + /// `/circuits/lib/src/configs` relative to the workspace. + #[arg(long)] + output_root: Option, +} + +fn workspace_root() -> Result { + let manifest = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + manifest + .parent() + .and_then(|p| p.parent()) + .map(Path::to_path_buf) + .context("could not locate workspace root from CARGO_MANIFEST_DIR") +} + +fn output_root(args: &Args) -> Result { + if let Some(p) = &args.output_root { + return Ok(p.clone()); + } + Ok(workspace_root()? + .join("circuits") + .join("lib") + .join("src") + .join("configs")) +} diff --git a/crates/zk-helpers/src/bin/generate_parity_matrices.rs b/crates/zk-helpers/src/bin/generate_parity_matrices.rs index 15e5ed4d95..dcc655e80e 100644 --- a/crates/zk-helpers/src/bin/generate_parity_matrices.rs +++ b/crates/zk-helpers/src/bin/generate_parity_matrices.rs @@ -69,18 +69,17 @@ fn output_root(args: &Args) -> Result { } /// Maps a `(preset, committee)` pair to the path of the file that holds its -/// `PARITY_MATRIX` literal. The `_insecure` / `_secure` suffix is the same naming -/// that `committee::active::PARITY_MATRIX_INSECURE / _SECURE` re-export from. +/// `PARITY_MATRIX` literal. The suffix matches the corresponding preset's Noir module. fn file_for(root: &Path, committee: &str, preset: BfvPreset) -> PathBuf { let suffix = match preset { BfvPreset::InsecureThreshold512 => "insecure", - BfvPreset::SecureThreshold8192 => "secure", + BfvPreset::SecureThreshold8192 => "secure_8192", // Codegen runs against the threshold side of each preset family. // DKG-only variants don't need their own file. BfvPreset::InsecureDkg512 => "insecure", - BfvPreset::SecureDkg8192 => "secure", - BfvPreset::SecureThreshold16384 => "secure-16384", - BfvPreset::SecureDkg16384 => "secure-16384", + BfvPreset::SecureDkg8192 => "secure_8192", + BfvPreset::SecureThreshold16384 => "secure_16384", + BfvPreset::SecureDkg16384 => "secure_16384", }; root.join(committee).join(format!("parity_{suffix}.nr")) } @@ -93,8 +92,9 @@ fn smudging_file(root: &Path, committee: &str) -> PathBuf { /// stable across regenerations (so the lefthook check can diff against a fresh run). fn render(committee: &str, preset_suffix: &str, l_module: &str, matrix_literal: &str) -> String { let preset_label = match preset_suffix { - "insecure" => "insecure-512 (L_THRESHOLD=2)", - "secure" => "secure-8192 (L_THRESHOLD=3)", + "insecure" => "insecure (L_THRESHOLD=2)", + "secure_8192" => "secure-8192 (L_THRESHOLD=3)", + "secure_16384" => "secure-16384 (L_THRESHOLD=5)", other => other, }; format!( @@ -121,6 +121,7 @@ fn render_smudging( committee: &str, insecure: &PkGenerationConfigs, secure: &PkGenerationConfigs, + secure_16384: &PkGenerationConfigs, ) -> String { format!( "// SPDX-License-Identifier: LGPL-3.0-only\n\ @@ -136,12 +137,16 @@ fn render_smudging( \n\ pub global INSECURE_E_SM_BIT: u32 = {};\n\ pub global INSECURE_E_SM_BOUND: Field = {};\n\ -pub global SECURE_E_SM_BIT: u32 = {};\n\ -pub global SECURE_E_SM_BOUND: Field = {};\n", +pub global SECURE_8192_E_SM_BIT: u32 = {};\n\ +pub global SECURE_8192_E_SM_BOUND: Field = {};\n\ +pub global SECURE_16384_E_SM_BIT: u32 = {};\n\ +pub global SECURE_16384_E_SM_BOUND: Field = {};\n", insecure.bits.e_sm_bit, insecure.bounds.e_sm_bound, secure.bits.e_sm_bit, secure.bounds.e_sm_bound, + secure_16384.bits.e_sm_bit, + secure_16384.bounds.e_sm_bound, ) } @@ -174,7 +179,8 @@ fn main() -> Result<()> { })?; let (suffix, l_module) = match preset { BfvPreset::InsecureThreshold512 => ("insecure", "insecure"), - BfvPreset::SecureThreshold8192 => ("secure", "secure"), + BfvPreset::SecureThreshold8192 => ("secure_8192", "secure_8192"), + BfvPreset::SecureThreshold16384 => ("secure_16384", "secure_16384"), _ => continue, // PAIR_PRESETS only carries the threshold variants }; let path = file_for(&root, &args.committee, preset); @@ -192,9 +198,14 @@ fn main() -> Result<()> { .context("computing insecure smudging constants")?; let secure = PkGenerationConfigs::compute(BfvPreset::SecureThreshold8192, ¶ms) .context("computing secure smudging constants")?; + let secure_16384 = PkGenerationConfigs::compute(BfvPreset::SecureThreshold16384, ¶ms) + .context("computing secure-16384 smudging constants")?; let path = smudging_file(&root, &args.committee); - std::fs::write(&path, render_smudging(&args.committee, &insecure, &secure)) - .with_context(|| format!("writing {}", path.display()))?; + std::fs::write( + &path, + render_smudging(&args.committee, &insecure, &secure, &secure_16384), + ) + .with_context(|| format!("writing {}", path.display()))?; println!("✓ {}", path.display()); Ok(()) diff --git a/crates/zk-helpers/src/bin/zk_cli.rs b/crates/zk-helpers/src/bin/zk_cli.rs index 542c710f1f..f370d73d61 100644 --- a/crates/zk-helpers/src/bin/zk_cli.rs +++ b/crates/zk-helpers/src/bin/zk_cli.rs @@ -8,7 +8,7 @@ //! //! This binary lists available circuits and generates Prover.toml and configs.nr //! for use with the Noir prover. Use `--list_circuits` to see circuits and -//! `--circuit --preset insecure|secure|2|80 [--committee minimum|micro|small]` to generate artifacts. +//! `--circuit --preset insecure|secure-8192|secure-16384| [--committee minimum|micro|small]` to generate artifacts. //! //! **Share-computation (C2) configs.nr:** set `INTERFOLD_CIRCUITS_ROOT` to the repo `circuits` //! directory (or run from the Interfold repo so it is auto-discovered). After `pnpm build:circuits`, @@ -172,7 +172,7 @@ struct Cli { /// Circuit name to generate artifacts for (e.g. `pk`, `share-computation`). #[arg(long, required_unless_present = "list_circuits")] circuit: Option, - /// Preset: exact name ("SECURE_THRESHOLD_16384", ...) or "insecure"|"secure" or λ (2|38|80). + /// Preset: exact name or `insecure`, `secure-8192`, `secure-16384`, or λ (2|45|31). /// Drives both threshold and DKG params. #[arg(long, required_unless_present = "list_circuits")] preset: Option, @@ -231,8 +231,7 @@ fn main() -> Result<()> { // Unwrap required arguments (clap ensures they're present when list_circuits is false). let circuit = args.circuit.unwrap(); let preset_name = args.preset.unwrap(); - // Accept either an exact preset name (e.g. "SECURE_THRESHOLD_16384") to disambiguate - // among the two secure tiers, or the backward-compatible "insecure"|"secure" / λ form. + // Accept an exact preset name or an explicit preset alias. let preset = BfvPreset::from_name(&preset_name) .or_else(|_| BfvPreset::from_security_config_name(&preset_name))?; @@ -255,7 +254,7 @@ fn main() -> Result<()> { }; if !preset_ok { return Err(anyhow!( - "preset does not match circuit {} which requires {:?} (use insecure or secure)", + "preset does not match circuit {} which requires {:?} (use a matching threshold or DKG preset)", circuit, circuit_param_type )); diff --git a/crates/zk-helpers/src/circuits/dkg/share_computation/codegen.rs b/crates/zk-helpers/src/circuits/dkg/share_computation/codegen.rs index 927e17479e..61bfdafca8 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_computation/codegen.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_computation/codegen.rs @@ -85,7 +85,7 @@ pub fn generate_configs_with_chunk_size( ))); } let chunk_count = degree / chunk_size; - let config_name = preset.config_dir(); + let config_name = preset.noir_config_module(); let parity_matrix_str = parity_matrix_constant_string(&threshold_params, n_parties, threshold)?; let prefix = ::PREFIX; let configs = format!( diff --git a/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs b/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs index bdd85e2f50..8fab25bf0d 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs @@ -243,12 +243,12 @@ impl Computation for Bounds { // CBD bound let cbd_bound = (dkg_params.variance() * 2) as u64; // Uniform bound - let uniform_bound = (dkg_params.get_error1_variance() * BigUint::from(3u32)) - .sqrt() - .to_bigint() - .ok_or_else(|| { - CircuitsErrors::Other("Failed to convert uniform bound to BigInt".into()) - })?; + let uniform_bound = + crate::utils::ceil_sqrt(&(dkg_params.get_error1_variance() * BigUint::from(3u32))) + .to_bigint() + .ok_or_else(|| { + CircuitsErrors::Other("Failed to convert uniform bound to BigInt".into()) + })?; let u_bound = SecretKey::sk_bound() as u128; // u_bound is the same as sk_bound @@ -263,12 +263,9 @@ impl Computation for Bounds { // Message bound: message is in [0, t), so bound is t - 1 let msg_bound = t.clone() - BigInt::from(1); - let ptxt_up_bound = (t.clone() - BigInt::from(1)) / BigInt::from(2); - let ptxt_low_bound: BigInt = if (t.clone() % BigInt::from(2)) == BigInt::from(1) { - -1 * ptxt_up_bound.clone() - } else { - -1 * ptxt_up_bound.clone() - BigInt::from(1) - }; + // Plaintext coefficients are encoded in [0, t), not centered around zero. + let ptxt_low_bound = BigInt::from(0); + let ptxt_up_bound = t.clone() - BigInt::from(1); // Calculate bounds for each CRT basis let moduli: Vec = ctx.moduli_operators().iter().map(|q| **q).collect(); diff --git a/crates/zk-helpers/src/circuits/threshold/pk_generation/codegen.rs b/crates/zk-helpers/src/circuits/threshold/pk_generation/codegen.rs index 71623fb4d5..ea53061d99 100644 --- a/crates/zk-helpers/src/circuits/threshold/pk_generation/codegen.rs +++ b/crates/zk-helpers/src/circuits/threshold/pk_generation/codegen.rs @@ -60,8 +60,9 @@ pub fn generate_configs( let crp_matrix_str = crp_matrix_constant_string(&threshold_params)?; - // B_enc ≈ sqrt(3 * error1_variance) - let b_enc = (BigUint::from(3u32) * threshold_params.get_error1_variance()).sqrt(); + // B_enc is the ceiling of sqrt(3 * error1_variance). + let b_enc = + crate::utils::ceil_sqrt(&(BigUint::from(3u32) * threshold_params.get_error1_variance())); Ok(format!( r#"use crate::core::threshold::pk_generation::Configs as PkGenerationConfigs; diff --git a/crates/zk-helpers/src/circuits/threshold/user_data_encryption/computation.rs b/crates/zk-helpers/src/circuits/threshold/user_data_encryption/computation.rs index 610bb94570..0ec1f3bb11 100644 --- a/crates/zk-helpers/src/circuits/threshold/user_data_encryption/computation.rs +++ b/crates/zk-helpers/src/circuits/threshold/user_data_encryption/computation.rs @@ -221,12 +221,11 @@ impl Computation for Bounds { // CBD bound let cbd_bound = (threshold_params.variance() * 2) as u64; // Uniform bound - let uniform_bound = (threshold_params.get_error1_variance() * BigUint::from(3u32)) - .sqrt() - .to_bigint() - .ok_or_else(|| { - CircuitsErrors::Other("Failed to convert uniform bound to BigInt".into()) - })?; + let uniform_bound = crate::utils::ceil_sqrt( + &(threshold_params.get_error1_variance() * BigUint::from(3u32)), + ) + .to_bigint() + .ok_or_else(|| CircuitsErrors::Other("Failed to convert uniform bound to BigInt".into()))?; let u_bound = SecretKey::sk_bound() as u128; // u_bound is the same as sk_bound @@ -238,12 +237,9 @@ impl Computation for Bounds { }; let e1_bound = cbd_bound; // e1 = e2 in the fhe.rs - let ptxt_up_bound = (t.clone() - BigInt::from(1)) / BigInt::from(2); - let ptxt_low_bound: BigInt = if (t.clone() % BigInt::from(2)) == BigInt::from(1) { - -1 * ptxt_up_bound.clone() - } else { - -1 * ptxt_up_bound.clone() - BigInt::from(1) - }; + // Plaintext coefficients are encoded in [0, t), not centered around zero. + let ptxt_low_bound = BigInt::from(0); + let ptxt_up_bound = t.clone() - BigInt::from(1); let k1_low_bound: BigInt = BigInt::from(-1) * ptxt_low_bound.clone(); let k1_up_bound: BigInt = ptxt_up_bound.clone(); diff --git a/crates/zk-helpers/src/utils.rs b/crates/zk-helpers/src/utils.rs index bd18da3e80..34ed4efaca 100644 --- a/crates/zk-helpers/src/utils.rs +++ b/crates/zk-helpers/src/utils.rs @@ -20,8 +20,8 @@ use ark_ff::PrimeField; use e3_polynomial::{CrtPolynomial, Polynomial}; use e3_safe::SafeSponge; use fhe::bfv::BfvParameters; -use num_bigint::BigInt; use num_bigint::Sign; +use num_bigint::{BigInt, BigUint}; use num_traits::{ToPrimitive, Zero}; use std::fmt::Display; use std::str::FromStr; @@ -166,6 +166,16 @@ pub fn calculate_bit_width(bound: BigInt) -> u32 { bound.bits() as u32 } +/// Calculate the smallest integer square root that is greater than or equal to `value`. +pub fn ceil_sqrt(value: &BigUint) -> BigUint { + let floor = value.sqrt(); + if &floor * &floor == *value { + floor + } else { + floor + BigUint::from(1u32) + } +} + /// Computes the bit width of ring elements (coefficients bounded by the coefficient modulus). /// /// # Arguments @@ -342,6 +352,12 @@ mod tests { assert_eq!(calculate_bit_width(BigInt::from(-1)), 1); } + #[test] + fn ceil_sqrt_rounds_non_square_values_up() { + assert_eq!(ceil_sqrt(&BigUint::from(9u32)), BigUint::from(3u32)); + assert_eq!(ceil_sqrt(&BigUint::from(10u32)), BigUint::from(4u32)); + } + #[test] fn bigint_to_field_reduces_modulus() { let modulus = get_zkp_modulus(); diff --git a/crates/zk-prover/src/backend/download.rs b/crates/zk-prover/src/backend/download.rs index 1adff3f454..d1a9b34ca3 100644 --- a/crates/zk-prover/src/backend/download.rs +++ b/crates/zk-prover/src/backend/download.rs @@ -467,7 +467,7 @@ mod tests { include_manifest: bool, extra_entries: &[(&str, &[u8])], ) -> Vec { - let rel_path = "insecure-512/minimum/default/dkg/pk/pk.json"; + let rel_path = "insecure/minimum/default/dkg/pk/pk.json"; let encoder = GzEncoder::new(Vec::new(), Compression::default()); let mut builder = Builder::new(encoder); append_global_pax_header(&mut builder); @@ -532,11 +532,11 @@ mod tests { let installed_circuit = backend .circuits_dir - .join("insecure-512/minimum/default/dkg/pk/pk.json"); + .join("insecure/minimum/default/dkg/pk/pk.json"); write_file(&backend.circuits_dir, "installed.txt", b"installed"); write_file( &backend.circuits_dir, - "insecure-512/minimum/default/dkg/pk/pk.json", + "insecure/minimum/default/dkg/pk/pk.json", b"previous-circuit", ); @@ -581,14 +581,10 @@ mod tests { let temp = TempDir::new().unwrap(); let circuits_dir = temp.path(); let contents = b"flat"; - write_file( - circuits_dir, - "insecure-512/default/dkg/pk/pk.json", - contents, - ); + write_file(circuits_dir, "insecure/default/dkg/pk/pk.json", contents); let hash = sha256_hex(contents); - let data = read_manifest_file(circuits_dir, "insecure-512/default/dkg/pk/pk.json", &hash) + let data = read_manifest_file(circuits_dir, "insecure/default/dkg/pk/pk.json", &hash) .await .unwrap(); @@ -603,23 +599,15 @@ mod tests { let small = b"small"; write_file( circuits_dir, - "insecure-512/minimum/default/dkg/pk/pk.json", + "insecure/minimum/default/dkg/pk/pk.json", minimum, ); - write_file( - circuits_dir, - "insecure-512/small/default/dkg/pk/pk.json", - small, - ); + write_file(circuits_dir, "insecure/small/default/dkg/pk/pk.json", small); let small_hash = sha256_hex(small); - let data = read_manifest_file( - circuits_dir, - "insecure-512/default/dkg/pk/pk.json", - &small_hash, - ) - .await - .unwrap(); + let data = read_manifest_file(circuits_dir, "insecure/default/dkg/pk/pk.json", &small_hash) + .await + .unwrap(); assert_eq!(data, small); } @@ -631,14 +619,14 @@ mod tests { let contents = b"minimum"; write_file( circuits_dir, - "insecure-512/minimum/default/dkg/pk/pk.json", + "insecure/minimum/default/dkg/pk/pk.json", contents, ); let hash = sha256_hex(contents); let data = read_manifest_file( circuits_dir, - "insecure-512/minimum/default/dkg/pk/pk.json", + "insecure/minimum/default/dkg/pk/pk.json", &hash, ) .await diff --git a/crates/zk-prover/src/prover.rs b/crates/zk-prover/src/prover.rs index be6ee5d31c..4edf16b334 100644 --- a/crates/zk-prover/src/prover.rs +++ b/crates/zk-prover/src/prover.rs @@ -427,7 +427,7 @@ mod tests { let backend = ZkBackend::new(BBPath::Default(bb_binary), circuits_dir, work_dir); let prover = ZkProver::new(&backend); - let result = prover.generate_proof(CircuitName::PkBfv, b"witness", "e3-1", "insecure-512"); + let result = prover.generate_proof(CircuitName::PkBfv, b"witness", "e3-1", "insecure"); assert!(matches!(result, Err(ZkError::BbNotInstalled))); } } diff --git a/crates/zk-prover/tests/backend_tests.rs b/crates/zk-prover/tests/backend_tests.rs index ccfadd9800..a35b50c596 100644 --- a/crates/zk-prover/tests/backend_tests.rs +++ b/crates/zk-prover/tests/backend_tests.rs @@ -99,7 +99,7 @@ fn test_prover_requires_bb() { e3_events::CircuitName::PkBfv, b"witness", "e3-1", - "insecure-512", + "insecure", ); assert!(matches!(result, Err(e3_zk_prover::ZkError::BbNotInstalled))); } diff --git a/crates/zk-prover/tests/common/helpers.rs b/crates/zk-prover/tests/common/helpers.rs index e89572c024..0da14ff095 100644 --- a/crates/zk-prover/tests/common/helpers.rs +++ b/crates/zk-prover/tests/common/helpers.rs @@ -164,7 +164,7 @@ pub async fn setup_compiled_circuit_for_preset( /// /// `pnpm build:circuits` writes `{package}.vk_recursive` (+ `_hash`) under `circuits/bin/recursive_aggregation//target/`. /// [`CircuitName::DkgAggregator`] also gets `{package}.vk` / `.vk_hash` (`bb write_vk -t evm`); when present, they are -/// copied into `insecure-512/evm/...` for [`CircuitVariant::Evm`] proving. +/// copied into `insecure/evm/...` for [`CircuitVariant::Evm`] proving. pub async fn setup_recursive_aggregation_fold_circuit(backend: &ZkBackend, circuit: CircuitName) { setup_recursive_aggregation_fold_circuit_for_preset( backend, diff --git a/crates/zk-prover/tests/fold_accumulators_e2e_tests.rs b/crates/zk-prover/tests/fold_accumulators_e2e_tests.rs index bb1ca196ab..18a7e295c7 100644 --- a/crates/zk-prover/tests/fold_accumulators_e2e_tests.rs +++ b/crates/zk-prover/tests/fold_accumulators_e2e_tests.rs @@ -196,7 +196,7 @@ async fn recursive_aggregation_default_artifacts_staged() { let base = backend .circuits_dir - .join("insecure-512") + .join("insecure") .join("minimum") .join("default") .join(CircuitName::C3Fold.dir_path()); @@ -233,7 +233,7 @@ async fn recursive_aggregation_c6_fold_kernel_artifacts_staged() { let base = backend .circuits_dir - .join("insecure-512") + .join("insecure") .join("minimum") .join("default") .join(CircuitName::C6FoldKernel.dir_path()); @@ -274,7 +274,7 @@ async fn node_fold_pipeline_recursive_aggregation_artifacts_staged() { let preset_base = backend .circuits_dir - .join("insecure-512") + .join("insecure") .join("minimum") .join("default"); for &c in NODE_FOLD_PIPELINE { diff --git a/docs/pages/internals/dkg.mdx b/docs/pages/internals/dkg.mdx index 64bd99a164..1e87973e51 100644 --- a/docs/pages/internals/dkg.mdx +++ b/docs/pages/internals/dkg.mdx @@ -465,10 +465,10 @@ they must stay in lockstep with the circuits' recursive VKs — a verifier whose match the circuit will silently reject every proof. **Preset is pinned.** The committed `.sol` files correspond to exactly one BFV preset: -**`insecure-512`** (the dev / CI / benchmark default). The recursive VKs are preset-dependent — +**`insecure`** (the dev / CI / benchmark default). The recursive VKs are preset-dependent — different BFV parameter sets compile to different VKs and therefore different `.sol` bytes — so "the committed verifier" is only well-defined for one preset. `pnpm generate:verifiers` refuses to run -(in both `--check` and `--write` modes) unless `dist/circuits/insecure-512/.build-stamp.json` exists +(in both `--check` and `--write` modes) unless `dist/circuits/insecure/.build-stamp.json` exists and reports that preset. If `pnpm build:circuits --preset secure-8192` was the last build, the generator surfaces this loudly with a fix recipe instead of silently producing wrong VK bytes. Production deploys on a non-canonical preset must regenerate locally for that deploy. @@ -486,7 +486,7 @@ The repo enforces sync with two modes of `pnpm generate:verifiers`: The version pinning lives in `crates/zk-prover/versions.json` (consumed by `interfold noir setup` and by the integration test prebuild). If `--check` fails after a clean -`pnpm build:circuits --preset insecure-512`, your local toolchain is out of sync with that pin. See +`pnpm build:circuits --preset insecure`, your local toolchain is out of sync with that pin. See [`scripts/README.md`](https://github.com/theinterfold/interfold/blob/main/scripts/README.md#verifier-generator) for the full contract. diff --git a/docs/pages/noir-circuits.mdx b/docs/pages/noir-circuits.mdx index f90205cfa9..e9ccae705d 100644 --- a/docs/pages/noir-circuits.mdx +++ b/docs/pages/noir-circuits.mdx @@ -99,14 +99,14 @@ The CLI keeps this copy under `~/.interfold/noir` instead of on your `PATH`, so From the **repository root**: ```bash -pnpm build:circuits # default: --preset insecure-512 --committee minimum +pnpm build:circuits # default: --preset insecure --committee minimum pnpm build:circuits --preset secure-8192 --committee small pnpm check:committee # verify active.nr, utils.ts, parity files agree ./scripts/lint-circuits.sh # nargo fmt --check && nargo check (lib + bin areas) ./scripts/test-circuits.sh # nargo test on circuits/lib ``` -**Preset** (`insecure-512` | `secure-8192`) selects the BFV parameter set; **committee** (`minimum` +**Preset** (`insecure` | `secure-8192`) selects the BFV parameter set; **committee** (`minimum` | `micro` | `small`) selects `(N, T, H)` for secret sharing. Always switch committee via `pnpm build:circuits --committee ` — see [`scripts/README.md`](https://github.com/theinterfold/interfold/blob/main/scripts/README.md#circuit-builder) @@ -125,7 +125,7 @@ optional-Noir CI stays green. ## Solidity verifiers (example: CRISP) The `@interfold/sdk` `generateProof()` helper embeds user-data-encryption circuits built with -`--preset insecure-512 --committee minimum`. It is a convenience for that path only. For on-chain +`--preset insecure --committee minimum`. It is a convenience for that path only. For on-chain Honk verification, compile your own UDE, app, and fold circuits for the preset and committee your deployment uses — see [Proving: embedded circuits or your own](./sdk#proving-embedded-circuits-or-your-own). diff --git a/docs/pages/sdk.mdx b/docs/pages/sdk.mdx index 11913b4d58..93bef96e97 100644 --- a/docs/pages/sdk.mdx +++ b/docs/pages/sdk.mdx @@ -240,7 +240,7 @@ const ct = await encryptNumber(42n, pk, 'INSECURE_THRESHOLD_512') `generateProof()` — and the `*AndGenProof` helpers that call it — run the user-data-encryption (UDE) circuits that are embedded in the package. Those artifacts are compiled with -`--preset insecure-512 --committee minimum` (see +`--preset insecure --committee minimum` (see `packages/interfold-sdk/scripts/compile-circuits.sh`), so they only match `INSECURE_THRESHOLD_512` and a minimum-size committee. diff --git a/docs/pages/tutorials/deploy-to-testnet.mdx b/docs/pages/tutorials/deploy-to-testnet.mdx index 8f9b046d17..ad9b0eaa77 100644 --- a/docs/pages/tutorials/deploy-to-testnet.mdx +++ b/docs/pages/tutorials/deploy-to-testnet.mdx @@ -209,7 +209,7 @@ sdk.onInterfoldEvent(InterfoldEventType.PLAINTEXT_OUTPUT_PUBLISHED, (e) => | --------------------------- | ---------------------------------------- | ---------------------------------------------------------------------------- | | E3 request reverts | Insufficient fee token approval | Call `sdk.approveFeeToken()` first | | Committee never forms | Not enough active ciphernodes on Sepolia | Check the registry for active operators | -| Proof generation fails | Preset mismatch with the SDK's circuits | The embedded circuits are `insecure-512`; compile your own for other presets | +| Proof generation fails | Preset mismatch with the SDK's circuits | The embedded circuits are `insecure`; compile your own for other presets | | Decryption produces garbage | BFV preset mismatch | Verify both SDK and E3 request use `INSECURE_THRESHOLD_512` / `paramSet: 0` | --- diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index f00c25573f..0990683290 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -272,15 +272,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -363,7 +354,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -400,7 +391,7 @@ dependencies = [ "futures 0.3.31", "futures-util", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -442,7 +433,7 @@ dependencies = [ "alloy-rlp", "crc", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -466,7 +457,7 @@ dependencies = [ "alloy-rlp", "k256", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -488,7 +479,7 @@ dependencies = [ "serde", "serde_with", "sha2", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -541,7 +532,7 @@ dependencies = [ "http 1.4.1", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -568,7 +559,7 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -600,7 +591,7 @@ dependencies = [ "rand 0.8.6", "serde_json", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", "url", ] @@ -624,7 +615,7 @@ dependencies = [ "keccak-asm", "paste", "proptest", - "rand 0.9.2", + "rand 0.9.4", "ruint", "rustc-hash", "serde", @@ -672,7 +663,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tracing", "url", @@ -836,7 +827,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -850,7 +841,7 @@ dependencies = [ "alloy-serde", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -888,7 +879,7 @@ dependencies = [ "either", "elliptic-curve", "k256", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -904,7 +895,7 @@ dependencies = [ "async-trait", "k256", "rand 0.8.6", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -996,7 +987,7 @@ dependencies = [ "parking_lot 0.12.5", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tower", "tracing", @@ -1069,7 +1060,7 @@ dependencies = [ "nybbles", "serde", "smallvec", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -1234,7 +1225,7 @@ dependencies = [ "fnv", "hashbrown 0.15.5", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.6", "num-integer", "num-traits", "zeroize", @@ -1251,7 +1242,7 @@ dependencies = [ "ark-serialize 0.3.0", "ark-std 0.3.0", "derivative", - "num-bigint", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version 0.3.3", @@ -1271,7 +1262,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools 0.10.5", - "num-bigint", + "num-bigint 0.4.6", "num-traits", "paste", "rustc_version 0.4.1", @@ -1292,7 +1283,7 @@ dependencies = [ "digest 0.10.7", "educe", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.6", "num-traits", "paste", "zeroize", @@ -1334,7 +1325,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "quote 1.0.45", "syn 1.0.109", @@ -1346,7 +1337,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "proc-macro2 1.0.106", "quote 1.0.45", @@ -1359,7 +1350,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "proc-macro2 1.0.106", "quote 1.0.45", @@ -1413,7 +1404,7 @@ dependencies = [ "ark-serialize-derive 0.4.2", "ark-std 0.4.0", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.6", ] [[package]] @@ -1426,7 +1417,7 @@ dependencies = [ "ark-std 0.5.0", "arrayvec", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.6", ] [[package]] @@ -1601,7 +1592,7 @@ checksum = "9324c8014cd04590682b34f1e9448d38f0674d0f7b2dc553331016ef0e4e9ebc" dependencies = [ "autocfg", "libm", - "num-bigint", + "num-bigint 0.4.6", "num-integer", "num-traits", ] @@ -2129,9 +2120,9 @@ dependencies = [ "lean-imt", "light-poseidon 0.1.0", "log", - "num-bigint", + "num-bigint 0.5.1", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "reqwest", "serde", "serde_json", @@ -2148,7 +2139,7 @@ dependencies = [ "e3-bfv-client", "e3-sdk", "eyre", - "num-bigint", + "num-bigint 0.5.1", ] [[package]] @@ -2160,7 +2151,7 @@ dependencies = [ "getrandom 0.2.17", "getrandom 0.3.4", "js-sys", - "num-bigint", + "num-bigint 0.5.1", "serde_json", "wasm-bindgen", "wasm-bindgen-test", @@ -2455,7 +2446,7 @@ dependencies = [ "e3-zk-helpers", "fhe", "fhe-traits", - "rand 0.9.2", + "rand 0.9.4", "thiserror 1.0.69", ] @@ -2471,7 +2462,7 @@ dependencies = [ "hex", "lean-imt", "light-poseidon 0.2.0", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "sha2", @@ -2506,9 +2497,9 @@ dependencies = [ "anyhow", "clap", "fhe", - "num-bigint", + "num-bigint 0.5.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "thiserror 1.0.69", @@ -2535,7 +2526,7 @@ dependencies = [ name = "e3-parity-matrix" version = "0.14.0" dependencies = [ - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -2546,7 +2537,7 @@ name = "e3-polynomial" version = "0.14.0" dependencies = [ "fhe-math", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -2612,8 +2603,8 @@ dependencies = [ "fhe", "fhe-traits", "hex", - "num-bigint", - "rand 0.9.2", + "num-bigint 0.5.1", + "rand 0.9.4", "serde_json", "sha2", "sha3", @@ -2630,7 +2621,7 @@ dependencies = [ "derivative", "e3-utils-derive", "hex", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "regex", "serde", @@ -2666,10 +2657,10 @@ dependencies = [ "hex", "itertools 0.14.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-integer", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rayon", "serde", "serde_json", @@ -2791,26 +2782,6 @@ dependencies = [ "log", ] -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2 1.0.106", - "quote 1.0.45", - "syn 2.0.117", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -2892,73 +2863,71 @@ dependencies = [ [[package]] name = "fhe" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" dependencies = [ "bincode", "doc-comment", "fhe-math", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "prost", "prost-build", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_distr", "rayon", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", "zeroize_derive", ] [[package]] name = "fhe-math" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" dependencies = [ "ethnum", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-bigint-dig", "num-traits", "prost", "prost-build", "pulp", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "sha2", - "tfhe-ntt", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", ] [[package]] name = "fhe-traits" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", ] [[package]] name = "fhe-util" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" dependencies = [ "num-bigint-dig", "num-traits", "prime_factorization", - "rand 0.8.6", - "rand 0.9.2", + "rand 0.9.4", "rand_distr", "rayon", ] @@ -3783,6 +3752,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -3952,7 +3930,7 @@ checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", - "num-bigint", + "num-bigint 0.4.6", "thiserror 1.0.69", ] @@ -4137,7 +4115,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-complex", "num-integer", "num-iter", @@ -4153,7 +4131,18 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "rand 0.8.6", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" +dependencies = [ + "num-integer", + "num-traits", + "rand 0.9.4", + "rand_core 0.9.5", "serde", ] @@ -4168,7 +4157,7 @@ dependencies = [ "num-iter", "num-traits", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "serde", "smallvec", ] @@ -4215,7 +4204,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-integer", "num-traits", ] @@ -4685,7 +4674,7 @@ dependencies = [ "bit-vec", "bitflags 2.11.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -4696,9 +4685,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ "bytes", "prost-derive", @@ -4706,9 +4695,9 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", "itertools 0.14.0", @@ -4725,9 +4714,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", "itertools 0.14.0", @@ -4738,18 +4727,18 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" dependencies = [ "prost", ] [[package]] name = "pulp" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" dependencies = [ "bytemuck", "cfg-if 1.0.4", @@ -4764,9 +4753,9 @@ dependencies = [ [[package]] name = "pulp-wasm-simd-flag" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" [[package]] name = "quick-error" @@ -4788,7 +4777,7 @@ dependencies = [ "rustc-hash", "rustls", "socket2 0.6.4", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tracing", "web-time", @@ -4803,13 +4792,13 @@ dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", "rustc-hash", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.20", "tinyvec", "tracing", "web-time", @@ -4879,9 +4868,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -4951,7 +4940,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] @@ -5186,14 +5175,14 @@ dependencies = [ "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", - "num-bigint", + "num-bigint 0.4.6", "num-integer", "num-traits", "parity-scale-codec", "primitive-types", "proptest", "rand 0.8.6", - "rand 0.9.2", + "rand 0.9.4", "rlp", "ruint-macro", "serde_core", @@ -5795,6 +5784,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +dependencies = [ + "proc-macro2 1.0.106", + "quote 1.0.45", + "unicode-ident", +] + [[package]] name = "syn-solidity" version = "1.6.0" @@ -5857,7 +5857,7 @@ dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", "ark-std 0.5.0", - "num-bigint", + "num-bigint 0.4.6", "num-traits", ] @@ -5880,17 +5880,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "tfhe-ntt" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10650c743ade46b166c698c8349902ed5986784a7db418c51f810bea25f09e3d" -dependencies = [ - "aligned-vec", - "bytemuck", - "pulp", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -5902,11 +5891,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.20", ] [[package]] @@ -5922,13 +5911,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2 1.0.106", "quote 1.0.45", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -6271,11 +6260,11 @@ dependencies = [ "http 1.4.1", "httparse", "log", - "rand 0.9.2", + "rand 0.9.4", "rustls", "rustls-pki-types", "sha1 0.10.6", - "thiserror 2.0.18", + "thiserror 2.0.20", "utf-8", ] @@ -7014,7 +7003,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper", - "thiserror 2.0.18", + "thiserror 2.0.20", "wasm-bindgen", "wasm-bindgen-futures 0.4.72", "web-sys", @@ -7104,18 +7093,18 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2 1.0.106", "quote 1.0.45", @@ -7173,9 +7162,9 @@ dependencies = [ "fhe-traits", "hex", "itertools 0.14.0", - "num-bigint", + "num-bigint 0.5.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rayon", "serde", "serde_json", diff --git a/examples/CRISP/RELEASING.md b/examples/CRISP/RELEASING.md index 30a85d261c..0cea24e149 100644 --- a/examples/CRISP/RELEASING.md +++ b/examples/CRISP/RELEASING.md @@ -4,7 +4,7 @@ | channel | tag | preset | who it is for | | ---------- | --------- | -------------- | ---------------------------------- | -| testing | `testing` | `insecure-512` | testnets, demos, local development | +| testing | `testing` | `insecure` | testnets, demos, local development | | production | `latest` | both presets | deployed clients and real rounds | ## Why presets are separate entry points @@ -22,11 +22,11 @@ circuits into test builds. ```ts // on @crisp-e3/sdk@testing -import { loadCircuits } from '@crisp-e3/sdk/insecure-512' // resolves +import { loadCircuits } from '@crisp-e3/sdk/insecure' // resolves import { loadCircuits } from '@crisp-e3/sdk/secure-8192' // resolves, throws if called // on @crisp-e3/sdk@latest -import { loadCircuits as loadInsecure } from '@crisp-e3/sdk/insecure-512' +import { loadCircuits as loadInsecure } from '@crisp-e3/sdk/insecure' import { loadCircuits as loadSecure } from '@crisp-e3/sdk/secure-8192' ``` @@ -38,8 +38,8 @@ enough for secure mainnet rounds and insecure test deployments. Testing releases carry a prerelease identifier; production releases do not. ```text -0.18.0-insecure.0 tag: testing insecure-512 -0.20.0 tag: latest insecure-512 + secure-8192 +0.18.0-insecure.0 tag: testing insecure +0.20.0 tag: latest insecure + secure-8192 ``` The identifier is load-bearing. npm excludes prerelease versions from ordinary ranges, so a consumer @@ -84,13 +84,13 @@ The build refuses artifacts that are missing or older than the sources, using th that `stage-preset-artifacts.mjs` records at staging time. The default SDK build is intentionally the lightweight testing build. It builds and ships only the -real `insecure-512` bundle, plus resolver stubs for off-channel presets, so pull-request CI does not +real `insecure` bundle, plus resolver stubs for off-channel presets, so pull-request CI does not compile or bundle the large secure preset. Use the production channel, or `pnpm -C examples/CRISP/packages/crisp-sdk build:prod`, when the output must include real -`insecure-512` and `secure-8192` bundles. +`insecure` and `secure-8192` bundles. ```sh -# testing — insecure-512 under the `testing` tag, leaves the client alone +# testing — insecure under the `testing` tag, leaves the client alone pnpm -C examples/CRISP publish:packages --channel testing 0.19.0-insecure.0 # production — both presets under the `latest` tag, and moves the client @@ -121,7 +121,7 @@ concrete PK and decryption verifier for each supported pair. A router selects th from the proof's public-input length and VK hash anchors. The SDK must also match the round. A `latest` SDK can load either supported preset and should select -from the E3's on-chain `paramSet`. Pair a `testing` SDK only with `insecure-512` deployments. +from the E3's on-chain `paramSet`. Pair a `testing` SDK only with `insecure` deployments. For an existing paused mainnet bootstrap deployment, prepare the complete activation batch with: diff --git a/examples/CRISP/Readme.md b/examples/CRISP/Readme.md index 76b28b40a8..64aac08b8e 100644 --- a/examples/CRISP/Readme.md +++ b/examples/CRISP/Readme.md @@ -208,7 +208,7 @@ Edit **`crisp.dev.env`** (created from `crisp.dev.env.example` on first `pnpm de | Variable | Default | Effect | | ------------------------------ | -------------- | --------------------------------------------------------------------- | -| `CRISP_BFV_PRESET` | `insecure-512` | BFV preset for aggregation circuits and the server `E3_PARAM_SET` | +| `CRISP_BFV_PRESET` | `insecure` | BFV preset for aggregation circuits and the server `E3_PARAM_SET` | | `CRISP_SKIP_PROOF_AGGREGATION` | `true` | Ciphernode-only local-dev skip; also selects mock verifier deployment | `pnpm dev:setup` applies this profile and builds recursive circuits only when needed. `pnpm dev:up` diff --git a/examples/CRISP/circuits/bin/crisp/src/main.nr b/examples/CRISP/circuits/bin/crisp/src/main.nr index b12fd32a22..faedbc08ff 100644 --- a/examples/CRISP/circuits/bin/crisp/src/main.nr +++ b/examples/CRISP/circuits/bin/crisp/src/main.nr @@ -9,7 +9,7 @@ use crisp_lib::ecdsa::{address_to_field, derive_address, digest_from_halves, val use crisp_lib::merkle_tree::get_merkle_root; use crisp_lib::utils::{check_coefficient_values_with_balance, check_coefficient_zero}; use interfold_lib::configs::default::threshold::{ - L, N, Q_MOD_T_CENTERED, QIS, USER_DATA_ENCRYPTION_BIT_CT, USER_DATA_ENCRYPTION_BIT_K, + L, N, QIS, Q_MOD_T, USER_DATA_ENCRYPTION_BIT_CT, USER_DATA_ENCRYPTION_BIT_K, }; use interfold_lib::math::{ commitments::{ @@ -204,7 +204,7 @@ fn main( // tally // - No signature is required, which is what lets a third party mask a slot at all let valid_vote = - check_coefficient_values_with_balance(k1, Q_MOD_T_CENTERED, balance, num_options); + check_coefficient_values_with_balance(k1, Q_MOD_T, balance, num_options); // The digest is a public input, so the prover cannot select the message that the signature // covers. The contract computes the digest from the round, the slot, and this ballot, which diff --git a/examples/CRISP/circuits/bin/crisp_onchain/src/main.nr b/examples/CRISP/circuits/bin/crisp_onchain/src/main.nr index 8407921f3d..9847b80055 100644 --- a/examples/CRISP/circuits/bin/crisp_onchain/src/main.nr +++ b/examples/CRISP/circuits/bin/crisp_onchain/src/main.nr @@ -8,7 +8,7 @@ use crisp_lib::ciphertext_addition::{CiphertextAddition, select_addend}; use crisp_lib::ecdsa::{address_to_field, derive_address, digest_from_halves, validate_signature}; use crisp_lib::utils::{check_coefficient_values_with_balance, check_coefficient_zero}; use interfold_lib::configs::default::threshold::{ - L, N, Q_MOD_T_CENTERED, QIS, USER_DATA_ENCRYPTION_BIT_CT, USER_DATA_ENCRYPTION_BIT_K, + L, N, QIS, Q_MOD_T, USER_DATA_ENCRYPTION_BIT_CT, USER_DATA_ENCRYPTION_BIT_K, }; use interfold_lib::math::{ commitments::{ @@ -193,7 +193,7 @@ fn main( // tally // - No signature is required, which is what lets a third party mask a slot at all let valid_vote = - check_coefficient_values_with_balance(k1, Q_MOD_T_CENTERED, voting_power, num_options); + check_coefficient_values_with_balance(k1, Q_MOD_T, voting_power, num_options); // The digest is a public input, so the prover cannot select the message that the signature // covers. The contract computes the digest from the round, the slot, and this ballot, which diff --git a/examples/CRISP/circuits/bin/fold/src/main.nr b/examples/CRISP/circuits/bin/fold/src/main.nr index dd8c7559eb..1be81146e0 100644 --- a/examples/CRISP/circuits/bin/fold/src/main.nr +++ b/examples/CRISP/circuits/bin/fold/src/main.nr @@ -11,9 +11,9 @@ use interfold_lib::math::commitments::compute_vk_hash; /// `examples/CRISP` after changing ct0 / ct1 / user_data_encryption / crisp (or the lib preset). /// Insecure: `lib::configs::default` uses `insecure::*`; secure: uses `secure::*`. pub global CRISP_FOLD_EXPECTED_KEY_HASH_INSECURE: Field = - 0x0cfedc11fbb1437ca55ba6ae31fe3adb29eefba7a62ea8257d427ce1e1e32e6f; + 0x15bca6baa86d29c4896ea829df17344a23636f527b894b7af81cc43809453c48; pub global CRISP_FOLD_EXPECTED_KEY_HASH_SECURE: Field = - 0x133970fec6679c0be03d6bf71981d9bdb9135f919b1c8c3fcc24aee68acb12ad; + 0x117e18b4e2c0ca49dbfd5be5b283c6c8930fc3afe4d195c2b7156fd5edc6b01b; fn main( // User Data Encryption Section. diff --git a/examples/CRISP/circuits/bin/fold_onchain/src/main.nr b/examples/CRISP/circuits/bin/fold_onchain/src/main.nr index f908d258e8..a05e41a2f5 100644 --- a/examples/CRISP/circuits/bin/fold_onchain/src/main.nr +++ b/examples/CRISP/circuits/bin/fold_onchain/src/main.nr @@ -11,9 +11,9 @@ use interfold_lib::math::commitments::compute_vk_hash; /// `examples/CRISP` after changing ct0 / ct1 / user_data_encryption / crisp_onchain (or the lib /// preset). Insecure: `lib::configs::default` uses `insecure::*`; secure: uses `secure::*`. pub global CRISP_ONCHAIN_FOLD_EXPECTED_KEY_HASH_INSECURE: Field = - 0x06c830801c0712d55b8095ea55a13d5122694f33969a2dfd8694575d37a22b48; + 0x1104946a4a10c8ce3056ee846976bc01ba445ed8f4dabd4836195b407b0a23ab; pub global CRISP_ONCHAIN_FOLD_EXPECTED_KEY_HASH_SECURE: Field = - 0x16818150403cb64eb84e5dccc9d68d33c5a8c8e70fb40de649e6b758db10e7fa; + 0x01a66be40a3006e1d7e782d7a432ac5fdc64ce1394d2e0304f072b4a9d594987; fn main( // User Data Encryption Section. diff --git a/examples/CRISP/circuits/lib/src/utils.nr b/examples/CRISP/circuits/lib/src/utils.nr index cbd1636607..bdb18f6e04 100644 --- a/examples/CRISP/circuits/lib/src/utils.nr +++ b/examples/CRISP/circuits/lib/src/utils.nr @@ -84,12 +84,12 @@ fn check_prefix_zero(k1: Polynomial, base: u32) -> bool { /// /// # Arguments /// * `k1` - The plaintext polynomial encoding the vote -/// * `q_mod_t_centered` - The field representation of 1 in centered form +/// * `q_mod_t` - The field representation of 1 modulo t /// * `balance` - The voter's balance/voting power /// * `num_options` - Number of voting options pub fn check_coefficient_values_with_balance( k1: Polynomial, - q_mod_t_centered: Field, + q_mod_t: Field, balance: Field, num_options: u32, ) -> bool { @@ -117,7 +117,7 @@ pub fn check_coefficient_values_with_balance( let coeff = k1.coefficients[idx]; // Binary constraint: coeff must be 0 or q_mod_t - valid = valid & (0 == coeff * (q_mod_t_centered - coeff)); + valid = valid & (0 == coeff * (q_mod_t - coeff)); let bit: u64 = if coeff == 0 { 0 } else { 1 }; sum += bit * (1 << (bit_pos as u64)); @@ -187,7 +187,7 @@ pub fn check_coefficient_zero(k1: Polynomial, num_options: u32) - // degree equals `MAX_MSG_NON_ZERO_COEFFS`, which no preset uses, so testing at the message width // hid the layout the circuit actually receives. -/// The BFV degree of the `insecure-512` preset. Large enough that the padding between the top of +/// The BFV degree of the `insecure` preset. Large enough that the padding between the top of /// the message region and the degree is most of the polynomial, which is the region the old index /// arithmetic read from. global TEST_DEGREE: u32 = 512; diff --git a/examples/CRISP/client/src/utils/circuits.ts b/examples/CRISP/client/src/utils/circuits.ts index 0e667cddfc..786128c8d7 100644 --- a/examples/CRISP/client/src/utils/circuits.ts +++ b/examples/CRISP/client/src/utils/circuits.ts @@ -14,14 +14,14 @@ import type { CircuitBundle, CircuitPreset } from '@crisp-e3/sdk' // The production SDK carries both presets. The E3 stores the selected param set on chain, so the // client selects the matching circuits before proving instead of hardcoding one deployment mode. const LOADERS: Record Promise<{ loadCircuits: () => Promise }>> = { - 'insecure-512': () => import('@crisp-e3/sdk/insecure-512'), + insecure: () => import('@crisp-e3/sdk/insecure'), 'secure-8192': () => import('@crisp-e3/sdk/secure-8192'), } let pending: Partial>> = {} const presetForParamSet = (paramSet: number): CircuitPreset | null => { - if (paramSet === 0) return 'insecure-512' + if (paramSet === 0) return 'insecure' if (paramSet === 1) return 'secure-8192' return null } diff --git a/examples/CRISP/client/vite.config.ts b/examples/CRISP/client/vite.config.ts index f98138f965..292726b039 100644 --- a/examples/CRISP/client/vite.config.ts +++ b/examples/CRISP/client/vite.config.ts @@ -35,7 +35,7 @@ export default defineConfig({ '@aztec/bb.js', // Pre-bundling breaks worker URLs (thread.worker.js, main.worker.js) // The SDK worker URL must stay relative to the installed SDK package. '@crisp-e3/sdk', - '@crisp-e3/sdk/insecure-512', + '@crisp-e3/sdk/insecure', '@crisp-e3/sdk/secure-8192', ], }, diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index a6efcf546d..0139b247f9 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -90,7 +90,7 @@ impl ZKInputsGenerator { /// Creates a new generator from a JavaScript-facing preset name. pub fn from_preset_name(name: &str) -> Result { let preset = match name.trim() { - "insecure-512" => BfvPreset::InsecureThreshold512, + "insecure" => BfvPreset::InsecureThreshold512, "secure-8192" => BfvPreset::SecureThreshold8192, other => BfvPreset::from_name(other)?, }; @@ -343,7 +343,7 @@ mod tests { #[test] fn from_preset_name_selects_the_requested_threshold_preset() { - let insecure = ZKInputsGenerator::from_preset_name("insecure-512") + let insecure = ZKInputsGenerator::from_preset_name("insecure") .expect("insecure preset should parse"); let secure = ZKInputsGenerator::from_preset_name("secure-8192").expect("secure preset should parse"); diff --git a/examples/CRISP/crisp.dev.env.example b/examples/CRISP/crisp.dev.env.example index 177e8250a9..fc11a3a258 100644 --- a/examples/CRISP/crisp.dev.env.example +++ b/examples/CRISP/crisp.dev.env.example @@ -5,9 +5,9 @@ # BFV parameter preset for DKG / on-chain Honk verifiers. # dev:setup writes the matching E3_PARAM_SET into server/.env. -# insecure-512 -> E3_PARAM_SET=0 +# insecure -> E3_PARAM_SET=0 # secure-8192 -> E3_PARAM_SET=1 -CRISP_BFV_PRESET=insecure-512 +CRISP_BFV_PRESET=insecure # When false: # - dev:setup runs `pnpm build:circuits --preset ` diff --git a/examples/CRISP/docs/PROOF_AGGREGATION_AND_ZK.md b/examples/CRISP/docs/PROOF_AGGREGATION_AND_ZK.md index 4391709f26..4b793e4ef6 100644 --- a/examples/CRISP/docs/PROOF_AGGREGATION_AND_ZK.md +++ b/examples/CRISP/docs/PROOF_AGGREGATION_AND_ZK.md @@ -6,11 +6,11 @@ | Variable | Default | Effect | | ------------------------------ | -------------- | ----------------------------------------------------- | -| `CRISP_BFV_PRESET` | `insecure-512` | BFV preset for circuits and the server `E3_PARAM_SET` | +| `CRISP_BFV_PRESET` | `insecure` | BFV preset for circuits and the server `E3_PARAM_SET` | | `CRISP_SKIP_PROOF_AGGREGATION` | `true` | Enables the ciphernode-only local-dev/test skip flag | `pnpm dev:setup` copies the example if missing and builds recursive circuits only when the skip flag -is `false`. It also writes the matching `E3_PARAM_SET` into `server/.env`: `0` for `insecure-512` +is `false`. It also writes the matching `E3_PARAM_SET` into `server/.env`: `0` for `insecure` and `1` for `secure-8192`. `pnpm dev:up` → `crisp_deploy.sh` deploys real verifiers for full aggregation and mock verifiers for skipped local-dev runs. @@ -39,7 +39,7 @@ verifier checks. ```bash # crisp.dev.env -CRISP_BFV_PRESET=insecure-512 +CRISP_BFV_PRESET=insecure CRISP_SKIP_PROOF_AGGREGATION=true ``` @@ -77,12 +77,12 @@ Honk proof, and `BfvPkVerifier` checks at `publishCommittee`. ```bash # crisp.dev.env -CRISP_BFV_PRESET=insecure-512 +CRISP_BFV_PRESET=insecure CRISP_SKIP_PROOF_AGGREGATION=false ``` CRISP `requestE3` reads `E3_PARAM_SET` from `server/.env`. Keep it aligned with `CRISP_BFV_PRESET`: -`0` for `insecure-512`, `1` for `secure-8192`. +`0` for `insecure`, `1` for `secure-8192`. ### Steps diff --git a/examples/CRISP/packages/crisp-contracts/contracts/verifiers/CRISPOnchainVerifier.sol b/examples/CRISP/packages/crisp-contracts/contracts/verifiers/CRISPOnchainVerifier.sol index d1e699ac66..628f31394e 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/verifiers/CRISPOnchainVerifier.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/verifiers/CRISPOnchainVerifier.sol @@ -8,7 +8,7 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; uint256 constant NUMBER_OF_PUBLIC_INPUTS = 17; -uint256 constant VK_HASH = 0x0a12a4d2efe48fe7bee586e156eb7cb5d2d7dc71bccf0fa4b4a9b91c097b4c8c; +uint256 constant VK_HASH = 0x1ce67bfaec640da9b6f8fceb1e0677fc7b7a8fc3b070fd5ec19fb850d091de25; library HonkVerificationKey { function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { Honk.VerificationKey memory vk = Honk.VerificationKey({ @@ -20,8 +20,8 @@ library HonkVerificationKey { y: uint256(0x01137e39f6b1ec6101fad7a4472102bfe11e7534e55e58109734c4b927efe6a6) }), qr: Honk.G1Point({ - x: uint256(0x2ac08692659e39f2a9f8cff82c54221ef67e138279c03ffbe9cba0976cb5c5bb), - y: uint256(0x18d2a25f4040b02577dcec145c99e389c578119bc9652bd2e07cf1e6ac2edbd9) + x: uint256(0x1c00d80fd99de84c72c8f7a27fa09ab47d2275e89abeca51cd2c8bab262713f0), + y: uint256(0x1a6cc129119e18a513b919f96501144220ee7a15c5afb93cbdac1dc36ca69324) }), qo: Honk.G1Point({ x: uint256(0x18424976826978ddb710bfdc21c64a296884c27b0d8dadf6ac7681445dde8d8c), diff --git a/examples/CRISP/packages/crisp-contracts/contracts/verifiers/CRISPVerifier.sol b/examples/CRISP/packages/crisp-contracts/contracts/verifiers/CRISPVerifier.sol index 5b85606560..98e43b84b3 100644 --- a/examples/CRISP/packages/crisp-contracts/contracts/verifiers/CRISPVerifier.sol +++ b/examples/CRISP/packages/crisp-contracts/contracts/verifiers/CRISPVerifier.sol @@ -8,7 +8,7 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; uint256 constant NUMBER_OF_PUBLIC_INPUTS = 17; -uint256 constant VK_HASH = 0x00d736cd7cf93a94fe0fa02be1bd85f7ea05d3bfa1697f95456c05a7cce354ce; +uint256 constant VK_HASH = 0x2cb1e1f5bc7101acf99bcaae17dc8e4231c21bb1ca2a50ccf0f80903df242172; library HonkVerificationKey { function loadVerificationKey() internal pure returns (Honk.VerificationKey memory) { Honk.VerificationKey memory vk = Honk.VerificationKey({ @@ -20,8 +20,8 @@ library HonkVerificationKey { y: uint256(0x01137e39f6b1ec6101fad7a4472102bfe11e7534e55e58109734c4b927efe6a6) }), qr: Honk.G1Point({ - x: uint256(0x048bf2f40b9f0e61917b3bd9d156debaa531af8449eebbb46c6ba23cb0de4ae2), - y: uint256(0x25842efe61b33504731c38e50c899a32ec606172705f7a3c74ca1427d83d0fe4) + x: uint256(0x0c97bc4dbe856f2fb23ea490de6d76897bedcc911cbeea9c54f776356f988037), + y: uint256(0x0089c3751d44e3231a6ecd89089ff905ac2fea73e524a0b3d4fbce97492ffb32) }), qo: Honk.G1Point({ x: uint256(0x18424976826978ddb710bfdc21c64a296884c27b0d8dadf6ac7681445dde8d8c), diff --git a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts index e67b476d57..6a40ddc750 100644 --- a/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts +++ b/examples/CRISP/packages/crisp-contracts/tests/crisp.contracts.test.ts @@ -19,10 +19,10 @@ import { } from '@crisp-e3/sdk' import type { ProofData } from '@crisp-e3/sdk' import { setCircuits } from '@crisp-e3/sdk' -import { loadCircuits } from '@crisp-e3/sdk/insecure-512' +import { loadCircuits } from '@crisp-e3/sdk/insecure' // The BFV-shaped circuits ship as a separate entry point per preset, so proving needs one -// installed. These tests run against the insecure-512 parameters the contracts are deployed with. +// installed. These tests run against the insecure parameters the contracts are deployed with. before(async () => { setCircuits(await loadCircuits()) }) diff --git a/examples/CRISP/packages/crisp-contracts/tests/input-tree-e2e.test.ts b/examples/CRISP/packages/crisp-contracts/tests/input-tree-e2e.test.ts index a6f829c02c..a0cd5618bb 100644 --- a/examples/CRISP/packages/crisp-contracts/tests/input-tree-e2e.test.ts +++ b/examples/CRISP/packages/crisp-contracts/tests/input-tree-e2e.test.ts @@ -19,10 +19,10 @@ import { } from '@crisp-e3/sdk' import type { ProofData } from '@crisp-e3/sdk' import { setCircuits } from '@crisp-e3/sdk' -import { loadCircuits } from '@crisp-e3/sdk/insecure-512' +import { loadCircuits } from '@crisp-e3/sdk/insecure' // The BFV-shaped circuits ship as a separate entry point per preset, so proving needs one -// installed. These tests run against the insecure-512 parameters the contracts are deployed with. +// installed. These tests run against the insecure parameters the contracts are deployed with. before(async () => { setCircuits(await loadCircuits()) }) diff --git a/examples/CRISP/packages/crisp-contracts/tests/onchain-census.test.ts b/examples/CRISP/packages/crisp-contracts/tests/onchain-census.test.ts index 1129ecad3f..dd38279e94 100644 --- a/examples/CRISP/packages/crisp-contracts/tests/onchain-census.test.ts +++ b/examples/CRISP/packages/crisp-contracts/tests/onchain-census.test.ts @@ -7,10 +7,10 @@ import { generateBFVKeys, prepareBallot, finishBallotProof, encodeSolidityProof, destroyBBApi } from '@crisp-e3/sdk' import type { ProofData } from '@crisp-e3/sdk' import { setCircuits } from '@crisp-e3/sdk' -import { loadCircuits } from '@crisp-e3/sdk/insecure-512' +import { loadCircuits } from '@crisp-e3/sdk/insecure' // The BFV-shaped circuits ship as a separate entry point per preset, so proving needs one -// installed. These tests run against the insecure-512 parameters the contracts are deployed with. +// installed. These tests run against the insecure parameters the contracts are deployed with. before(async () => { setCircuits(await loadCircuits()) }) diff --git a/examples/CRISP/packages/crisp-sdk/README.md b/examples/CRISP/packages/crisp-sdk/README.md index 2efcac6eea..550042dcdc 100644 --- a/examples/CRISP/packages/crisp-sdk/README.md +++ b/examples/CRISP/packages/crisp-sdk/README.md @@ -21,12 +21,12 @@ npm install @crisp-e3/sdk ## Choosing a preset Proving needs the BFV-shaped circuits, and those exist once per parameter set. They are not part of -the main entry point: the `secure-8192` set is far larger than `insecure-512`. Each preset has its +the main entry point: the `secure-8192` set is far larger than `insecure`. Each preset has its own subpath, so your bundler can pull only the one the round needs. ```ts import { setCircuits } from '@crisp-e3/sdk' -import { loadCircuits } from '@crisp-e3/sdk/insecure-512' // or '@crisp-e3/sdk/secure-8192' +import { loadCircuits } from '@crisp-e3/sdk/insecure' // or '@crisp-e3/sdk/secure-8192' setCircuits(await loadCircuits()) ``` diff --git a/examples/CRISP/packages/crisp-sdk/package.json b/examples/CRISP/packages/crisp-sdk/package.json index 9cb2df9b8d..01412e0c67 100644 --- a/examples/CRISP/packages/crisp-sdk/package.json +++ b/examples/CRISP/packages/crisp-sdk/package.json @@ -16,10 +16,10 @@ "import": "./dist/index.js", "default": "./dist/index.js" }, - "./insecure-512": { - "types": "./dist/presets/insecure-512.d.ts", - "import": "./dist/presets/insecure-512.js", - "default": "./dist/presets/insecure-512.js" + "./insecure": { + "types": "./dist/presets/insecure.d.ts", + "import": "./dist/presets/insecure.js", + "default": "./dist/presets/insecure.js" }, "./secure-8192": { "types": "./dist/presets/secure-8192.d.ts", @@ -43,16 +43,16 @@ "compile:fold_onchain": "cd ../../circuits/bin/fold_onchain && nargo compile", "build:wasm": "pnpm -C ../crisp-zk-inputs build", "build": "pnpm build:testing", - "test": "pnpm stage:preset insecure-512 && vitest --run", - "test:core-and-ballot-proofs": "pnpm stage:preset insecure-512 && vitest --run -t \"^(?!.*generateMaskVoteProof)\"", - "test:mask-proofs": "pnpm stage:preset insecure-512 && vitest --run tests/vote.test.ts -t \"generateMaskVoteProof\"", + "test": "pnpm stage:preset insecure && vitest --run", + "test:core-and-ballot-proofs": "pnpm stage:preset insecure && vitest --run -t \"^(?!.*generateMaskVoteProof)\"", + "test:mask-proofs": "pnpm stage:preset insecure && vitest --run tests/vote.test.ts -t \"generateMaskVoteProof\"", "stage:preset": "node ../../scripts/stage-preset-artifacts.mjs", "build:presets": "node ../../scripts/build-presets.mjs", "build:presets:all": "node ../../scripts/build-presets.mjs --all", "check:presets": "node ../../scripts/check-presets.mjs", "prepublishOnly": "pnpm check:presets", - "build:testing": "pnpm build:wasm && pnpm build:presets && pnpm check:staged insecure-512 && CRISP_PRESET=insecure-512 tsup", - "build:prod": "pnpm build:wasm && pnpm build:presets:all && pnpm check:staged insecure-512 && pnpm check:staged secure-8192 && tsup", + "build:testing": "pnpm build:wasm && pnpm build:presets && pnpm check:staged insecure && CRISP_PRESET=insecure tsup", + "build:prod": "pnpm build:wasm && pnpm build:presets:all && pnpm check:staged insecure && pnpm check:staged secure-8192 && tsup", "check:staged": "node ../../scripts/check-staged-preset.mjs" }, "publishConfig": { diff --git a/examples/CRISP/packages/crisp-sdk/src/circuits.ts b/examples/CRISP/packages/crisp-sdk/src/circuits.ts index 5148ef18c4..253ca4b34a 100644 --- a/examples/CRISP/packages/crisp-sdk/src/circuits.ts +++ b/examples/CRISP/packages/crisp-sdk/src/circuits.ts @@ -7,7 +7,7 @@ import type { CompiledCircuit } from '@noir-lang/noir_js' /** BFV parameter sets the circuits can be compiled against. */ -export type CircuitPreset = 'insecure-512' | 'secure-8192' +export type CircuitPreset = 'insecure' | 'secure-8192' /** * The circuits whose ABI is shaped by the BFV degree, and which therefore exist once per preset. @@ -32,12 +32,12 @@ let registered: CircuitBundle | null = null * Install the preset-bound circuits used by `generateProof`. * * The bundle is not bundled into the main entry point, because the secure-8192 artifacts are more - * than an order of magnitude larger than the insecure-512 ones. Load the preset selected by the + * than an order of magnitude larger than the insecure ones. Load the preset selected by the * round from its subpath and register it before proving: * * ```ts * import { setCircuits } from '@crisp-e3/sdk' - * import { loadCircuits } from '@crisp-e3/sdk/insecure-512' + * import { loadCircuits } from '@crisp-e3/sdk/insecure' * * setCircuits(await loadCircuits()) * ``` @@ -62,7 +62,7 @@ export const registeredPreset = (): CircuitPreset | null => registered?.preset ? export const requireCircuits = (): CircuitBundle => { if (!registered) { throw new Error( - 'No circuit preset registered. Import `loadCircuits` from "@crisp-e3/sdk/insecure-512" or ' + + 'No circuit preset registered. Import `loadCircuits` from "@crisp-e3/sdk/insecure" or ' + '"@crisp-e3/sdk/secure-8192" and pass the result to `setCircuits()` before proving.', ) } diff --git a/examples/CRISP/packages/crisp-sdk/src/presets/insecure-512.ts b/examples/CRISP/packages/crisp-sdk/src/presets/insecure.ts similarity index 73% rename from examples/CRISP/packages/crisp-sdk/src/presets/insecure-512.ts rename to examples/CRISP/packages/crisp-sdk/src/presets/insecure.ts index 39fafaf729..6c24305d91 100644 --- a/examples/CRISP/packages/crisp-sdk/src/presets/insecure-512.ts +++ b/examples/CRISP/packages/crisp-sdk/src/presets/insecure.ts @@ -4,7 +4,7 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -// The insecure-512 (N=512, L=2) preset-bound circuits, published as a separate entry point. +// The insecure (N=512, L=2) preset-bound circuits, published as a separate entry point. // // Kept out of the main entry so a consumer's bundler pulls one preset rather than both. The // artifacts are staged by scripts/stage-preset-artifacts.mjs; see src/circuits.ts for why the @@ -13,15 +13,15 @@ import type { CircuitBundle, CircuitPreset } from '../circuits' import type { CompiledCircuit } from '@noir-lang/noir_js' -import crisp from '../../../../circuits/dist/insecure-512/crisp.json' -import crispOnchain from '../../../../circuits/dist/insecure-512/crisp_onchain.json' -import userDataEncryptionCt0 from '../../../../circuits/dist/insecure-512/user_data_encryption_ct0.json' -import userDataEncryptionCt1 from '../../../../circuits/dist/insecure-512/user_data_encryption_ct1.json' +import crisp from '../../../../circuits/dist/insecure/crisp.json' +import crispOnchain from '../../../../circuits/dist/insecure/crisp_onchain.json' +import userDataEncryptionCt0 from '../../../../circuits/dist/insecure/user_data_encryption_ct0.json' +import userDataEncryptionCt1 from '../../../../circuits/dist/insecure/user_data_encryption_ct1.json' -export const preset: CircuitPreset = 'insecure-512' +export const preset: CircuitPreset = 'insecure' /** - * The insecure-512 (N=512, L=2) circuits, ready for `setCircuits()`. + * The insecure (N=512, L=2) circuits, ready for `setCircuits()`. * * Asynchronous because the artifacts are inlined today but need not stay that way: the secure set * is large enough that a consumer may want it fetched on demand, and that change belongs inside diff --git a/examples/CRISP/packages/crisp-sdk/src/presets/insecure-512.unavailable.ts b/examples/CRISP/packages/crisp-sdk/src/presets/insecure.unavailable.ts similarity index 63% rename from examples/CRISP/packages/crisp-sdk/src/presets/insecure-512.unavailable.ts rename to examples/CRISP/packages/crisp-sdk/src/presets/insecure.unavailable.ts index bdacd90836..1307a544b2 100644 --- a/examples/CRISP/packages/crisp-sdk/src/presets/insecure-512.unavailable.ts +++ b/examples/CRISP/packages/crisp-sdk/src/presets/insecure.unavailable.ts @@ -6,11 +6,11 @@ import type { CircuitBundle, CircuitPreset } from '../circuits' -export const preset: CircuitPreset = 'insecure-512' +export const preset: CircuitPreset = 'insecure' export const loadCircuits = async (): Promise => { throw new Error( - 'The insecure-512 circuits are not included in this @crisp-e3/sdk build. ' + - 'Install an SDK release channel that carries insecure-512.', + 'The insecure circuits are not included in this @crisp-e3/sdk build. ' + + 'Install an SDK release channel that carries insecure.', ) } diff --git a/examples/CRISP/packages/crisp-sdk/tests/client-circuits.test.ts b/examples/CRISP/packages/crisp-sdk/tests/client-circuits.test.ts index eac31c696a..51380e74fd 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/client-circuits.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/client-circuits.test.ts @@ -18,10 +18,10 @@ vi.mock('@crisp-e3/sdk', () => ({ }, })) -vi.mock('@crisp-e3/sdk/insecure-512', () => ({ +vi.mock('@crisp-e3/sdk/insecure', () => ({ loadCircuits: async () => { - sdkState.loads.push('insecure-512') - return { preset: 'insecure-512' } + sdkState.loads.push('insecure') + return { preset: 'insecure' } }, })) @@ -45,7 +45,7 @@ describe('client ensureCircuits', () => { await ensureCircuits(1) await ensureCircuits(0) - expect(sdkState.current).toBe('insecure-512') - expect(sdkState.loads).toEqual(['insecure-512', 'secure-8192', 'insecure-512']) + expect(sdkState.current).toBe('insecure') + expect(sdkState.loads).toEqual(['insecure', 'secure-8192', 'insecure']) }) }) diff --git a/examples/CRISP/packages/crisp-sdk/tests/encoding.test.ts b/examples/CRISP/packages/crisp-sdk/tests/encoding.test.ts index 25d7ede75a..8cecc7ceac 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/encoding.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/encoding.test.ts @@ -8,7 +8,7 @@ import { afterEach, beforeAll, describe, expect, it } from 'vitest' import { setCircuits } from '../src/circuits' import { getZkInputsGenerator, setZkInputsGeneratorPreset } from '../src/encoding' -import { loadCircuits } from '../src/presets/insecure-512' +import { loadCircuits } from '../src/presets/insecure' beforeAll(async () => { setCircuits(await loadCircuits()) diff --git a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts index 5bce54899e..3a65606a4f 100644 --- a/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts +++ b/examples/CRISP/packages/crisp-sdk/tests/vote.test.ts @@ -13,7 +13,7 @@ import { Hex, concat, keccak256, numberToHex, recoverPublicKey } from 'viem' import { CRISP_SERVER_URL, ECDSA_PRIVATE_KEY, SLOT_ADDRESS } from './constants' import { CrispSDK } from '../src/sdk' import { setCircuits } from '../src/circuits' -import { loadCircuits } from '../src/presets/insecure-512' +import { loadCircuits } from '../src/presets/insecure' import { generateTestLeaves } from './helpers' // Proving needs a preset installed; the BFV-shaped circuits are no longer part of the main entry. diff --git a/examples/CRISP/packages/crisp-sdk/tsup.config.js b/examples/CRISP/packages/crisp-sdk/tsup.config.js index 33db649120..52c6e0f711 100644 --- a/examples/CRISP/packages/crisp-sdk/tsup.config.js +++ b/examples/CRISP/packages/crisp-sdk/tsup.config.js @@ -18,7 +18,7 @@ import { defineConfig } from 'tsup' // // With `CRISP_PRESET` unset the build takes whatever is staged, which is what local development // wants. -const PRESETS = ['insecure-512', 'secure-8192'] +const PRESETS = ['insecure', 'secure-8192'] const staged = (preset) => existsSync(`../../circuits/dist/${preset}/crisp.json`) diff --git a/examples/CRISP/program/tests/onchain_root_agreement.rs b/examples/CRISP/program/tests/onchain_root_agreement.rs index 516d2d3fc8..655e976f6e 100644 --- a/examples/CRISP/program/tests/onchain_root_agreement.rs +++ b/examples/CRISP/program/tests/onchain_root_agreement.rs @@ -66,7 +66,7 @@ fn rust_reproduces_the_root_the_contract_produced() { let entries = fixture["inputs"].as_array().expect("inputs"); let (ciphertexts, published) = load(entries); - // The SDK builds ballots under the insecure-512 threshold preset. + // The SDK builds ballots under the insecure threshold preset. let (params, _) = build_pair_for_preset(BfvPreset::InsecureThreshold512).unwrap(); let result = ComputeInput { fhe_inputs: FHEInputs { diff --git a/examples/CRISP/scripts/build-presets.mjs b/examples/CRISP/scripts/build-presets.mjs index de1e1825a1..e8233b075e 100755 --- a/examples/CRISP/scripts/build-presets.mjs +++ b/examples/CRISP/scripts/build-presets.mjs @@ -21,15 +21,15 @@ import { fileURLToPath } from 'node:url' const CRISP = resolve(dirname(fileURLToPath(import.meta.url)), '..') const REPO = resolve(CRISP, '..', '..') -const ALL_PRESETS = ['secure-8192', 'insecure-512'] +const ALL_PRESETS = ['secure-8192', 'insecure'] const usage = () => { - console.error('Usage: build-presets.mjs [--preset insecure-512|secure-8192] [--all]') - console.error('Defaults to --preset insecure-512 for pull-request CI and local development.') + console.error('Usage: build-presets.mjs [--preset insecure|secure-8192] [--all]') + console.error('Defaults to --preset insecure for pull-request CI and local development.') } const args = process.argv.slice(2) -let requested = 'insecure-512' +let requested = 'insecure' for (let i = 0; i < args.length; i++) { const arg = args[i] if (arg === '--all') { diff --git a/examples/CRISP/scripts/check-presets.mjs b/examples/CRISP/scripts/check-presets.mjs index ffd25af8e5..865f529669 100644 --- a/examples/CRISP/scripts/check-presets.mjs +++ b/examples/CRISP/scripts/check-presets.mjs @@ -7,7 +7,7 @@ // Refuse to publish a channel whose artifacts do not match the presets that channel stands for. // -// The testing channel carries only insecure-512 so testnet installs stay small. The production +// The testing channel carries only insecure so testnet installs stay small. The production // channel carries both presets so one client can select the preset from the E3's on-chain param set. // // The SDK and the contracts package are checked together because they are a matched pair. The SDK @@ -25,8 +25,8 @@ const CONTRACTS = join(CRISP, 'packages', 'crisp-contracts') /** Which presets each release channel carries. */ const CHANNEL_PRESETS = { - testing: ['insecure-512'], - latest: ['insecure-512', 'secure-8192'], + testing: ['insecure'], + latest: ['insecure', 'secure-8192'], } const ALL_PRESETS = [...new Set(Object.values(CHANNEL_PRESETS).flat())] @@ -35,7 +35,7 @@ const ALL_PRESETS = [...new Set(Object.values(CHANNEL_PRESETS).flat())] const VERIFIERS = ['CRISPVerifier.sol', 'CRISPOnchainVerifier.sol'] /** Polynomial degree each preset's circuits carry, used to prove the bundle is what it claims. */ -const EXPECTED_DEGREE = { 'insecure-512': 512, 'secure-8192': 8192 } +const EXPECTED_DEGREE = { insecure: 512, 'secure-8192': 8192 } /** Below this a "built" entry is a stub or a failed inline rather than a real circuit bundle. */ const MIN_BYTES = 100 * 1024 diff --git a/examples/CRISP/scripts/check-staged-preset.mjs b/examples/CRISP/scripts/check-staged-preset.mjs index 6195d77dae..eeb0c9160a 100755 --- a/examples/CRISP/scripts/check-staged-preset.mjs +++ b/examples/CRISP/scripts/check-staged-preset.mjs @@ -22,7 +22,7 @@ import { fileURLToPath } from 'node:url' import { circuitSourcesDigest } from './circuit-sources.mjs' const CRISP = resolve(dirname(fileURLToPath(import.meta.url)), '..') -const PRESETS = ['insecure-512', 'secure-8192'] +const PRESETS = ['insecure', 'secure-8192'] const RESTAGE = 'Run `pnpm build:presets` for one preset, or `pnpm build:presets:all` for both presets, from examples/CRISP.' diff --git a/examples/CRISP/scripts/circuit-sources.mjs b/examples/CRISP/scripts/circuit-sources.mjs index c700007259..d0fdf145ae 100644 --- a/examples/CRISP/scripts/circuit-sources.mjs +++ b/examples/CRISP/scripts/circuit-sources.mjs @@ -48,7 +48,7 @@ const SKIP_DIRS = new Set(['target', 'node_modules']) * The generated preset selector, which the digest must ignore. * * `build-circuits.ts` rewrites this file on every preset switch, and `build-presets.mjs` builds - * insecure-512 last so the working tree is left on the default preset. The tree therefore never + * insecure last so the working tree is left on the default preset. The tree therefore never * holds the selector the secure-8192 archive was staged under, and a digest that included it would * report a fresh secure archive as stale every time — which is exactly what it did. * diff --git a/examples/CRISP/scripts/lib/dev_config.sh b/examples/CRISP/scripts/lib/dev_config.sh index 245a93ca96..a2320bba5f 100644 --- a/examples/CRISP/scripts/lib/dev_config.sh +++ b/examples/CRISP/scripts/lib/dev_config.sh @@ -20,18 +20,18 @@ load_crisp_dev_config() { source "$cfg" set +a - CRISP_BFV_PRESET="${CRISP_BFV_PRESET:-insecure-512}" + CRISP_BFV_PRESET="${CRISP_BFV_PRESET:-insecure}" CRISP_SKIP_PROOF_AGGREGATION="${CRISP_SKIP_PROOF_AGGREGATION:-true}" case "$CRISP_BFV_PRESET" in - insecure-512) + insecure) CRISP_E3_PARAM_SET=0 ;; secure-8192) CRISP_E3_PARAM_SET=1 ;; *) - echo "Invalid CRISP_BFV_PRESET='${CRISP_BFV_PRESET}' (use insecure-512 or secure-8192)" >&2 + echo "Invalid CRISP_BFV_PRESET='${CRISP_BFV_PRESET}' (use insecure or secure-8192)" >&2 exit 1 ;; esac diff --git a/examples/CRISP/scripts/publish.ts b/examples/CRISP/scripts/publish.ts index 70a99c115b..1981343bda 100644 --- a/examples/CRISP/scripts/publish.ts +++ b/examples/CRISP/scripts/publish.ts @@ -41,11 +41,11 @@ const PACKAGE_DIRS = ['packages/crisp-sdk', 'packages/crisp-contracts', 'package * leaves the workspace and client on the same exact version, so local development uses the * workspace and standalone deploys use the matching npm package. */ -const PRESETS = ['insecure-512', 'secure-8192'] as const +const PRESETS = ['insecure', 'secure-8192'] as const type Preset = (typeof PRESETS)[number] const CHANNELS = { - testing: { tag: 'testing', presets: ['insecure-512'] as readonly Preset[], prerelease: true, tracksClient: false, bumpsRepo: false }, + testing: { tag: 'testing', presets: ['insecure'] as readonly Preset[], prerelease: true, tracksClient: false, bumpsRepo: false }, prod: { tag: 'latest', presets: PRESETS, prerelease: false, tracksClient: true, bumpsRepo: true }, } as const @@ -697,15 +697,15 @@ Arguments: version The new version (e.g., 1.0.0, 1.0.0-beta.1) Options: - --channel Release channel: 'testing' (insecure-512) or 'prod' (both presets). Required. + --channel Release channel: 'testing' (insecure) or 'prod' (both presets). Required. --tag npm dist-tag override (default: the channel's tag) --skip-git Skip all git operations (no commit) --dry-run Show what would be done without making changes --help, -h Show this help message Channels: - testing npm tag 'testing', insecure-512 circuits, prerelease versions only - prod npm tag 'latest', insecure-512 and secure-8192 circuits, plain release versions only + testing npm tag 'testing', insecure circuits, prerelease versions only + prod npm tag 'latest', insecure and secure-8192 circuits, plain release versions only Testing carries one preset to stay small. Production carries both presets so the client can select the required circuit bundle from the E3's on-chain param set. @@ -718,7 +718,7 @@ Channels: Prerequisite: The SDK build stages the circuit artifacts it needs under circuits/dist/, which git does not - track. The testing channel stages only insecure-512. The production channel stages both presets. + track. The testing channel stages only insecure. The production channel stages both presets. The build refuses stale or missing artifacts (pnpm -C packages/crisp-sdk check:staged ). Examples: diff --git a/examples/CRISP/scripts/stage-preset-artifacts.mjs b/examples/CRISP/scripts/stage-preset-artifacts.mjs index 59236100d9..6a7be15c04 100755 --- a/examples/CRISP/scripts/stage-preset-artifacts.mjs +++ b/examples/CRISP/scripts/stage-preset-artifacts.mjs @@ -24,7 +24,7 @@ const CRISP = resolve(dirname(fileURLToPath(import.meta.url)), '..') const REPO = resolve(CRISP, '..', '..') /** Degree the preset's polynomials carry, used to prove the artifact matches its directory. */ -const EXPECTED_DEGREE = { 'insecure-512': 512, 'secure-8192': 8192 } +const EXPECTED_DEGREE = { insecure: 512, 'secure-8192': 8192 } const ARTIFACTS = [ { name: 'crisp', from: join(CRISP, 'circuits/bin/crisp/target/crisp.json') }, diff --git a/examples/CRISP/server/src/config.rs b/examples/CRISP/server/src/config.rs index 4a2c9d24fa..e04137383a 100644 --- a/examples/CRISP/server/src/config.rs +++ b/examples/CRISP/server/src/config.rs @@ -107,7 +107,7 @@ impl Config { fn validate_e3_param_set(chain_id: u64, param_set: u8) -> Result<(), ConfigError> { if param_set > 1 { return Err(ConfigError::Message(format!( - "E3_PARAM_SET must be 0 (insecure-512) or 1 (secure-8192), got {param_set}" + "E3_PARAM_SET must be 0 (insecure) or 1 (secure-8192), got {param_set}" ))); } if chain_id == 1 && param_set != 1 { diff --git a/packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol b/packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol index 610c119822..821471fdbc 100644 --- a/packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol +++ b/packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol @@ -7,7 +7,7 @@ pragma solidity >=0.8.27; import { IInterfold } from "../interfaces/IInterfold.sol"; -// Auto-generated by scripts/build-circuits.ts. Active local selection: insecure-512/minimum. +// Auto-generated by scripts/build-circuits.ts. Active local selection: insecure/minimum. // Mainnet supports secure BFV with minimum, micro, and small committees. Sepolia and local chains // support insecure and secure BFV with every committee size. library ActiveCryptoConfig { @@ -21,10 +21,10 @@ library ActiveCryptoConfig { 0x18c6d8650486b997d48aa2d285fae878fb267b268332d056a3e8527d50e87b4f; bytes32 internal constant SECURE_CONFIG_ID = - 0xd9c86e581f8291ffb5b63595600e8d096ed30b16e2e0a6634a76c22b1f58fb4e; + 0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb; uint8 internal constant SECURE_PARAM_SET = 1; bytes32 internal constant SECURE_PARAM_SET_HASH = - 0xd7068fdcc1910f5e49c8b05530cf74f876cadee2a1caf797a40b1ae53ae143ec; + 0x80775a19b6126a12943f9c1c53f92299f0c92ece819b625026ab1406bbbe0721; uint8 internal constant MINIMUM_COMMITTEE_SIZE = 0; uint32 internal constant MINIMUM_T = 1; diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure-512/micro/DecryptionAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/micro/DecryptionAggregatorVerifier.sol similarity index 100% rename from packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure-512/micro/DecryptionAggregatorVerifier.sol rename to packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/micro/DecryptionAggregatorVerifier.sol diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure-512/micro/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/micro/DkgAggregatorVerifier.sol similarity index 100% rename from packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure-512/micro/DkgAggregatorVerifier.sol rename to packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/micro/DkgAggregatorVerifier.sol diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure-512/small/DecryptionAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DecryptionAggregatorVerifier.sol similarity index 100% rename from packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure-512/small/DecryptionAggregatorVerifier.sol rename to packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DecryptionAggregatorVerifier.sol diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure-512/small/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol similarity index 100% rename from packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure-512/small/DkgAggregatorVerifier.sol rename to packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol diff --git a/packages/interfold-contracts/scripts/benchmarkGasFromRaw.ts b/packages/interfold-contracts/scripts/benchmarkGasFromRaw.ts index 098eea7e17..a32c818972 100644 --- a/packages/interfold-contracts/scripts/benchmarkGasFromRaw.ts +++ b/packages/interfold-contracts/scripts/benchmarkGasFromRaw.ts @@ -24,7 +24,7 @@ import { readVkRecursiveHash, } from "./utils"; -const CANONICAL_BFV_PRESET = "insecure-512"; +const CANONICAL_BFV_PRESET = "insecure"; const COMMITTED_HONK_DIR = path.join( getRepoRoot(), "packages/interfold-contracts/contracts/verifiers/bfv/honk", @@ -79,7 +79,7 @@ function readBenchmarkPreset(foldedArtifact?: unknown): string { } /** - * Committed Honk `.sol` files embed the insecure-512 aggregator VK. Secure benchmark + * Committed Honk `.sol` files embed the insecure aggregator VK. Secure benchmark * proofs need verifiers generated from the active circuits/bin preset. */ function ensureHonkVerifierContractDir(preset: string): string { @@ -355,7 +355,7 @@ async function main() { const honkDir = ensureHonkVerifierContractDir(benchmarkPreset); if (benchmarkPreset !== CANONICAL_BFV_PRESET) { console.log( - `[benchmarkGasFromRaw] Using preset ${benchmarkPreset} Honk verifiers (not committed insecure-512 .sol).`, + `[benchmarkGasFromRaw] Using preset ${benchmarkPreset} Honk verifiers (not committed insecure .sol).`, ); } diff --git a/packages/interfold-contracts/scripts/protocol/constants.ts b/packages/interfold-contracts/scripts/protocol/constants.ts index 6b055b8722..96747cd071 100644 --- a/packages/interfold-contracts/scripts/protocol/constants.ts +++ b/packages/interfold-contracts/scripts/protocol/constants.ts @@ -21,7 +21,19 @@ export const BFV_PARAMS = { secure8192: { degree: 8192n, plaintextModulus: 1000000n, - moduli: [0x02000000015a0001n, 0x0200000001460001n, 0x0200000001210001n], - error1Variance: "18148392902450051384713312396360971277653333", + moduli: [0x0400000000c00001n, 0x0400000000a40001n, 0x0400000000990001n], + error1Variance: "17723039943798878305460955570711717478400", + }, + secure16384: { + degree: 16384n, + plaintextModulus: 1000n, + moduli: [ + 0x00040000009f0001n, + 0x00040000008a0001n, + 0x0004000000800001n, + 0x00040000007e0001n, + 0x0004000000750001n, + ], + error1Variance: "264093875047547791978479834453333", }, } as const; diff --git a/packages/interfold-contracts/scripts/protocol/deployContracts.ts b/packages/interfold-contracts/scripts/protocol/deployContracts.ts index d748fbf4e4..0c7f1af008 100644 --- a/packages/interfold-contracts/scripts/protocol/deployContracts.ts +++ b/packages/interfold-contracts/scripts/protocol/deployContracts.ts @@ -289,7 +289,7 @@ function bfvHonkSource( config: ActiveBfvConfig, contractName: "DkgAggregatorVerifier" | "DecryptionAggregatorVerifier", ): string { - if (config.preset === "insecure-512" && config.committee === "minimum") { + if (config.preset === "insecure" && config.committee === "minimum") { return `contracts/verifiers/bfv/honk/${contractName}.sol`; } return `contracts/verifiers/bfv/honk/${config.preset}/${config.committee}/${contractName}.sol`; diff --git a/packages/interfold-contracts/scripts/utils.ts b/packages/interfold-contracts/scripts/utils.ts index 119ca23c17..49a7287f5e 100644 --- a/packages/interfold-contracts/scripts/utils.ts +++ b/packages/interfold-contracts/scripts/utils.ts @@ -93,7 +93,7 @@ export function getRepoRoot(): string { /** * - * Active insecure-512 / minimum committee layout for BFV aggregator verifiers. + * Active insecure / minimum committee layout for BFV aggregator verifiers. * Must match `lib::configs::default::{H, T}` in compiled circuits. * Minimum committee: N=3, T=1, H=2. * @@ -104,7 +104,7 @@ export const ACTIVE_BFV_PARAM_SET = 0; export const ACTIVE_BFV_COMMITTEE_SIZE = 0; export const ACTIVE_BFV_COMMITTEE_N = 3; -export type BfvArtifactPreset = "insecure-512" | "secure-8192"; +export type BfvArtifactPreset = "insecure" | "secure-8192"; export type BfvCommittee = "minimum" | "micro" | "small"; export interface ActiveBfvConfig { @@ -124,9 +124,9 @@ const INSECURE_PARAM_SET_HASH = const INSECURE_CONFIG_ID = "0x04f3677e73b0f5066d6caf5cbd92e3fb2e38338edaf5cfc971ab28f7b684da78"; const SECURE_PARAM_SET_HASH = - "0xd7068fdcc1910f5e49c8b05530cf74f876cadee2a1caf797a40b1ae53ae143ec"; + "0x80775a19b6126a12943f9c1c53f92299f0c92ece819b625026ab1406bbbe0721"; const SECURE_CONFIG_ID = - "0xd9c86e581f8291ffb5b63595600e8d096ed30b16e2e0a6634a76c22b1f58fb4e"; + "0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb"; function bfvConfig( preset: BfvArtifactPreset, @@ -145,19 +145,19 @@ function bfvConfig( } export const INSECURE_MINIMUM_BFV_CONFIG: ActiveBfvConfig = bfvConfig( - "insecure-512", + "insecure", "minimum", { committeeSize: 0, h: 2, t: 1, n: 3 }, ); export const INSECURE_MICRO_BFV_CONFIG: ActiveBfvConfig = bfvConfig( - "insecure-512", + "insecure", "micro", { committeeSize: 1, h: 5, t: 4, n: 9 }, ); export const INSECURE_SMALL_BFV_CONFIG: ActiveBfvConfig = bfvConfig( - "insecure-512", + "insecure", "small", { committeeSize: 2, h: 10, t: 9, n: 19 }, ); diff --git a/packages/interfold-contracts/tasks/interfold.ts b/packages/interfold-contracts/tasks/interfold.ts index 9c9c8d560c..42169ac9ee 100644 --- a/packages/interfold-contracts/tasks/interfold.ts +++ b/packages/interfold-contracts/tasks/interfold.ts @@ -24,7 +24,7 @@ function cryptoConfigIdForParamSet(paramSet: number): string { return "0x04f3677e73b0f5066d6caf5cbd92e3fb2e38338edaf5cfc971ab28f7b684da78"; } if (paramSet === 1) { - return "0xd9c86e581f8291ffb5b63595600e8d096ed30b16e2e0a6634a76c22b1f58fb4e"; + return "0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb"; } throw new Error(`Unsupported BFV parameter set: ${paramSet}`); } diff --git a/packages/interfold-contracts/test/fixtures/constants.ts b/packages/interfold-contracts/test/fixtures/constants.ts index 3011f02656..2f491dc8d9 100644 --- a/packages/interfold-contracts/test/fixtures/constants.ts +++ b/packages/interfold-contracts/test/fixtures/constants.ts @@ -55,7 +55,7 @@ function encodeBfvParams(params: { ); } -/** The insecure-512 parameter set compiled into the active test circuits. */ +/** The insecure parameter set compiled into the active test circuits. */ export const BFV_PARAMS_DEFAULT = encodeBfvParams(BFV_PARAMS.insecure512); /** The secure-8192 parameter set that Sepolia/local deployments can also register. */ diff --git a/packages/interfold-sdk/README.md b/packages/interfold-sdk/README.md index c9f606774b..5dcc03da94 100644 --- a/packages/interfold-sdk/README.md +++ b/packages/interfold-sdk/README.md @@ -488,7 +488,7 @@ production, together with your own `secure-8192` circuit artifacts (see `generateProof()`, `encryptNumberAndGenProof()`, and `encryptVectorAndGenProof()` run the user-data-encryption (UDE) circuits bundled in this package. Those artifacts are compiled with -`--preset insecure-512 --committee minimum` (`scripts/compile-circuits.sh`), so they only match +`--preset insecure --committee minimum` (`scripts/compile-circuits.sh`), so they only match `'INSECURE_THRESHOLD_512'` and a minimum-size committee. With `'SECURE_THRESHOLD_8192'`, `encryptNumberAndGenInputs()` returns N=8192 circuit inputs that the bundled N=512 circuits cannot execute. diff --git a/packages/interfold-sdk/scripts/compile-circuits.sh b/packages/interfold-sdk/scripts/compile-circuits.sh index cf3bab1474..a1e91948c8 100755 --- a/packages/interfold-sdk/scripts/compile-circuits.sh +++ b/packages/interfold-sdk/scripts/compile-circuits.sh @@ -13,7 +13,7 @@ case "${COMMITTEE}" in ;; esac exec pnpm -C "${REPO_ROOT}" build:circuits \ - --preset insecure-512 \ + --preset insecure \ --committee "${COMMITTEE}" \ --group threshold \ --circuit user_data_encryption \ diff --git a/packages/interfold-sdk/src/crypto/types.ts b/packages/interfold-sdk/src/crypto/types.ts index 0a9fde6853..361fac4f2b 100644 --- a/packages/interfold-sdk/src/crypto/types.ts +++ b/packages/interfold-sdk/src/crypto/types.ts @@ -14,11 +14,12 @@ export interface BfvParams { error1Variance: string | undefined } -export type ThresholdBfvParamsPresetName = 'INSECURE_THRESHOLD_512' | 'SECURE_THRESHOLD_8192' +export type ThresholdBfvParamsPresetName = 'INSECURE_THRESHOLD_512' | 'SECURE_THRESHOLD_8192' | 'SECURE_THRESHOLD_16384' export const ThresholdBfvParamsPresetNames = [ 'INSECURE_THRESHOLD_512', 'SECURE_THRESHOLD_8192', + 'SECURE_THRESHOLD_16384', ] as const satisfies ReadonlyArray export interface VerifiableEncryptionResult { diff --git a/packages/interfold-sdk/src/utils.ts b/packages/interfold-sdk/src/utils.ts index f675838716..46cff1aa5f 100644 --- a/packages/interfold-sdk/src/utils.ts +++ b/packages/interfold-sdk/src/utils.ts @@ -88,7 +88,7 @@ export function cryptoConfigIdForParamSet(paramSet: number): Hash { return '0x04f3677e73b0f5066d6caf5cbd92e3fb2e38338edaf5cfc971ab28f7b684da78' } if (paramSet === 1) { - return '0xd9c86e581f8291ffb5b63595600e8d096ed30b16e2e0a6634a76c22b1f58fb4e' + return '0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb' } throw new SDKError(`Unsupported BFV parameter set: ${paramSet}`, 'UNSUPPORTED_CRYPTO_CONFIG') } diff --git a/packages/interfold-sdk/tests/sdk.test.ts b/packages/interfold-sdk/tests/sdk.test.ts index 66947c1987..e35fa8f045 100644 --- a/packages/interfold-sdk/tests/sdk.test.ts +++ b/packages/interfold-sdk/tests/sdk.test.ts @@ -30,7 +30,7 @@ describe('encryptNumber', () => { const publicKey = await sdk.generatePublicKey() const value = await sdk.encryptNumber(10n, publicKey) expect(value).to.be.an.instanceof(Uint8Array) - expect(value.length).to.equal(9_242) + expect(value.length).to.equal(9_238) // TODO: test the encryption is correct }) it('should encrypt a number and generate a proof without crashing in a node environent', async () => { @@ -47,7 +47,7 @@ describe('encryptNumber', () => { const publicKey = await sdk.generatePublicKey() const value = await sdk.encryptVector(new BigUint64Array([1n, 2n]), publicKey) expect(value).to.be.an.instanceof(Uint8Array) - expect(value.length).to.equal(9_242) + expect(value.length).to.equal(9_238) }) it('should validate a committee public key against its on-chain commitment', async () => { @@ -87,14 +87,14 @@ describe('encryptNumber', () => { const pk = await generatePublicKey('INSECURE_THRESHOLD_512') const ct = await standaloneEncryptNumber(10n, pk, 'INSECURE_THRESHOLD_512') expect(ct).to.be.an.instanceof(Uint8Array) - expect(ct.length).to.equal(9_242) + expect(ct.length).to.equal(9_238) }) it('should encrypt a vector using standalone functions', async () => { const pk = await generatePublicKey('INSECURE_THRESHOLD_512') const ct = await standaloneEncryptVector(new BigUint64Array([1n, 2n]), pk, 'INSECURE_THRESHOLD_512') expect(ct).to.be.an.instanceof(Uint8Array) - expect(ct.length).to.equal(9_242) + expect(ct.length).to.equal(9_238) }) }) }) diff --git a/scripts/README.md b/scripts/README.md index fe158aa256..0ad13d04e2 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -178,7 +178,7 @@ artifacts. ### Usage ```bash -# Build all circuits (defaults: --preset insecure-512 --committee minimum) +# Build all circuits (defaults: --preset insecure --committee minimum) pnpm build:circuits # Switch the active committee size (regenerates committee/active.nr, @@ -186,7 +186,7 @@ pnpm build:circuits pnpm build:circuits --committee micro # Combine preset + committee -pnpm build:circuits --preset insecure-512 --committee small +pnpm build:circuits --preset insecure --committee small # Build only specific group (dkg or threshold) pnpm build:circuits --group dkg @@ -201,7 +201,7 @@ pnpm build:circuits --dry-run pnpm build:circuits hash # Regenerate protocol hashes and config IDs without compiling circuits -pnpm build:circuits sync-config --preset insecure-512 --committee minimum +pnpm build:circuits sync-config --preset insecure --committee minimum ``` ### Committee sizes @@ -215,9 +215,9 @@ Three sizes are supported, mirroring `e3_zk_helpers::CiphernodesCommitteeSize`: | `small` | 19 | 9 | 10 | All `(preset, committee)` pairs work because the Reed-Solomon parity matrices in -`circuits/lib/src/configs/committee//parity_{insecure,secure}.nr` are auto-generated by the -`generate_parity_matrices` Rust binary, invoked from `build-circuits.ts` whenever the committee -changes. The matrix files on disk are derived artifacts. +`circuits/lib/src/configs/committee//parity_{insecure,secure_8192,secure_16384}.nr` are +auto-generated by the `generate_parity_matrices` Rust binary, invoked from `build-circuits.ts` +whenever the committee changes. The matrix files on disk are derived artifacts. The currently-active selection is written to `circuits/bin/.active-preset.json` and checked by `pnpm check:committee` (pre-push hook) against `active.nr`, `utils.ts`, and the parity files. @@ -236,7 +236,8 @@ the generator would produce. ### Options -- `--preset ` - Parameter preset: `insecure-512` (default), `secure-8192`, or `all` +- `--preset ` - Parameter preset: `insecure` (default), `secure-8192`, `secure-16384`, or + `all` - `--committee ` - Committee size: `minimum` (default), `micro`, `small` - `--skip-utils-patch` - Skip rewriting committee values and BFV configuration hashes in `packages/interfold-contracts/scripts/utils.ts` @@ -248,9 +249,9 @@ the generator would produce. - `--dry-run` - Show what would be built - `--no-clean` - Don't clean output directory -`sync-config` updates only `scripts/utils.ts` and `ActiveCryptoConfig.sol`. Use it when BFV -parameter constants change and the prebuilt circuit artifacts already exist. It does not compile -Noir circuits or regenerate verification keys. +`sync-config` regenerates the BFV config modules, then updates `scripts/utils.ts` and +`ActiveCryptoConfig.sol`. Use it when BFV parameter constants change and the prebuilt circuit +artifacts already exist. It does not compile Noir circuits or regenerate verification keys. ### Prerequisites @@ -269,9 +270,9 @@ checks this before it publishes binaries or `circuits-.tar.gz`. ```bash # Build or hydrate the required circuit pairs, then push them to the git branch -pnpm build:circuits --preset insecure-512 --committee minimum -pnpm build:circuits --preset insecure-512 --committee micro -pnpm build:circuits --preset insecure-512 --committee small +pnpm build:circuits --preset insecure --committee minimum +pnpm build:circuits --preset insecure --committee micro +pnpm build:circuits --preset insecure --committee small pnpm build:circuits --preset secure-8192 --committee minimum pnpm build:circuits --preset secure-8192 --committee micro pnpm build:circuits --preset secure-8192 --committee small @@ -296,9 +297,9 @@ Circuits are built locally and stored in a git branch: 1. **Local**: Build circuits and push to branch ```bash -pnpm build:circuits --preset insecure-512 --committee minimum -pnpm build:circuits --preset insecure-512 --committee micro -pnpm build:circuits --preset insecure-512 --committee small +pnpm build:circuits --preset insecure --committee minimum +pnpm build:circuits --preset insecure --committee micro +pnpm build:circuits --preset insecure --committee small pnpm build:circuits --preset secure-8192 --committee minimum pnpm build:circuits --preset secure-8192 --committee micro pnpm build:circuits --preset secure-8192 --committee small @@ -311,7 +312,7 @@ pnpm store:circuits push The release archive must include: -- `insecure-512/{minimum,micro,small}` for Sepolia and local rehearsals +- `insecure/{minimum,micro,small}` for Sepolia and local rehearsals - `secure-8192/{minimum,micro,small}` for Sepolia secure-parameter tests and mainnet committees Nodes download one archive and select the artifact directory from the E3's on-chain BFV parameter @@ -323,7 +324,7 @@ set and committee size. Noir circuits. The generated `.sol` files under `packages/interfold-contracts/contracts/verifiers/bfv/honk/` are -**committed to git**. The root files correspond to `(insecure-512, minimum)`, which is the +**committed to git**. The root files correspond to `(insecure, minimum)`, which is the development / CI / benchmark default. Non-canonical pairs are committed under `honk///`. The Honk verifiers bake in the recursive VKs of `dkg_aggregator` / `decryption_aggregator`, which are preset- and committee-dependent. Different BFV parameter sets or @@ -411,13 +412,13 @@ There are two distinct failure modes — the error output tells you which one: **1. Target preset and committee not built** — the generator refuses up front because `dist/circuits///.build-stamp.json` is missing or reports a different preset. The -committed verifier root is pinned to `insecure-512/minimum`; non-canonical pairs use their own +committed verifier root is pinned to `insecure/minimum`; non-canonical pairs use their own subdirectories under `honk///`. To fix: ```bash -pnpm build:circuits --preset insecure-512 --committee minimum +pnpm build:circuits --preset insecure --committee minimum # then retry the original command ``` @@ -431,8 +432,8 @@ the bytes don't match. Typical causes: To fix: 1. Verify your `nargo` / `bb` versions match `crates/zk-prover/versions.json`. -2. Run `pnpm build:circuits --preset insecure-512 --committee minimum`. -3. Run `pnpm generate:verifiers --preset insecure-512 --committee minimum --write`. +2. Run `pnpm build:circuits --preset insecure --committee minimum`. +3. Run `pnpm generate:verifiers --preset insecure --committee minimum --write`. 4. Run the same build and generate commands for each non-canonical pair. 5. Commit the resulting diff under `packages/interfold-contracts/contracts/verifiers/bfv/honk/`. diff --git a/scripts/build-circuits.ts b/scripts/build-circuits.ts index 7dee3d269a..d8a6bb9629 100644 --- a/scripts/build-circuits.ts +++ b/scripts/build-circuits.ts @@ -95,6 +95,7 @@ class NoirCircuitBuilder { private rootDir: string private circuitsDir: string private options: BuildOptions + private generatedConfigPresets = new Set() constructor(rootDir?: string, options: BuildOptions = {}) { this.rootDir = rootDir ?? resolve(__dirname, '..') @@ -214,11 +215,13 @@ class NoirCircuitBuilder { `pub global H: u32 = crate::configs::committee::${committee}::H;`, '', '/// Parity matrices for the secret-sharing scheme, sized for the active committee.', - '/// `configs::{insecure,secure}::dkg` re-exports the relevant one as `PARITY_MATRIX`.', + '/// `configs::{insecure,secure_8192,secure_16384}::dkg` re-exports the relevant one as `PARITY_MATRIX`.', `pub use crate::configs::committee::${committee}::parity_insecure::PARITY_MATRIX as PARITY_MATRIX_INSECURE;`, - `pub use crate::configs::committee::${committee}::parity_secure::PARITY_MATRIX as PARITY_MATRIX_SECURE;`, + `pub use crate::configs::committee::${committee}::parity_secure_8192::PARITY_MATRIX as PARITY_MATRIX_SECURE_8192;`, + `pub use crate::configs::committee::${committee}::parity_secure_16384::PARITY_MATRIX as PARITY_MATRIX_SECURE_16384;`, `pub use crate::configs::committee::${committee}::smudging::{`, - ' INSECURE_E_SM_BIT, INSECURE_E_SM_BOUND, SECURE_E_SM_BIT, SECURE_E_SM_BOUND,', + ' INSECURE_E_SM_BIT, INSECURE_E_SM_BOUND, SECURE_8192_E_SM_BIT, SECURE_8192_E_SM_BOUND,', + ' SECURE_16384_E_SM_BIT, SECURE_16384_E_SM_BOUND,', '};', '', ].join('\n') @@ -227,7 +230,7 @@ class NoirCircuitBuilder { } /** - * Regenerates `circuits/lib/src/configs/committee//parity_{insecure,secure}.nr` + * Regenerates `circuits/lib/src/configs/committee//parity_{insecure,secure_8192,secure_16384}.nr` * by invoking the Rust `generate_parity_matrices` binary. The Reed-Solomon parity matrix is * a deterministic function of `(N, T, QIS)` — committing the output keeps `nargo check` * working standalone, but the build script always overwrites it so a change in committee @@ -253,9 +256,9 @@ class NoirCircuitBuilder { private bfvConfig(preset: CircuitPreset, committee: CircuitCommittee) { const { h, t, n } = COMMITTEE_PARAMS[committee] - const paramSet = preset === CIRCUIT_PRESETS.INSECURE_512 ? 0 : 1 + const paramSet = preset === CIRCUIT_PRESETS.INSECURE_512 ? 0 : preset === CIRCUIT_PRESETS.SECURE_8192 ? 1 : 2 const committeeSize = ALL_COMMITTEES.indexOf(committee) - const params = paramSet === 0 ? BFV_PARAMS.insecure512 : BFV_PARAMS.secure8192 + const params = paramSet === 0 ? BFV_PARAMS.insecure512 : paramSet === 1 ? BFV_PARAMS.secure8192 : BFV_PARAMS.secure16384 const encodedParams = AbiCoder.defaultAbiCoder().encode( ['tuple(uint256 degree,uint256 plaintext_modulus,uint256[] moduli,string error1_variance)'], [[params.degree, params.plaintextModulus, [...params.moduli], params.error1Variance]], @@ -271,7 +274,7 @@ class NoirCircuitBuilder { * Patch the active BFV and committee constants used by deployment tooling. */ private patchUtilsTs(preset: CircuitPreset, committee: CircuitCommittee): void { - if (this.options.skipUtilsPatch) return + if (this.options.skipUtilsPatch || preset === CIRCUIT_PRESETS.SECURE_16384) return const { h, t, n, paramSet, committeeSize } = this.bfvConfig(preset, committee) const insecure = this.bfvConfig(CIRCUIT_PRESETS.INSECURE_512, CIRCUIT_COMMITTEES.MINIMUM) const secure = this.bfvConfig(CIRCUIT_PRESETS.SECURE_8192, CIRCUIT_COMMITTEES.SMALL) @@ -345,10 +348,30 @@ class NoirCircuitBuilder { /** Regenerates the protocol constants without compiling circuit artifacts. */ syncProtocolConfig(preset: CircuitPreset, committee: CircuitCommittee): void { + this.regenerateConfigModules(preset) this.patchUtilsTs(preset, committee) this.writeActiveCryptoConfig(preset, committee) } + private regenerateConfigModules(preset: CircuitPreset): void { + if (this.generatedConfigPresets.has(preset)) return + try { + execSync( + `cargo run --quiet --release --bin generate_config_modules -- --preset ${preset === CIRCUIT_PRESETS.INSECURE_512 ? 'INSECURE_THRESHOLD_512' : preset === CIRCUIT_PRESETS.SECURE_8192 ? 'SECURE_THRESHOLD_8192' : 'SECURE_THRESHOLD_16384'}`, + { + cwd: this.rootDir, + stdio: ['ignore', 'pipe', 'inherit'], + }, + ) + this.generatedConfigPresets.add(preset) + } catch (err: any) { + throw new Error( + `Failed to regenerate BFV config modules for preset=${preset}: ${err.message}\n` + + ` Try: cargo run --release --bin generate_config_modules -- --preset ${preset}`, + ) + } + } + /** Writes the circuit-bound constants consumed by Interfold. */ private writeActiveCryptoConfig(preset: CircuitPreset, committee: CircuitCommittee): void { const production = this.bfvConfig(CIRCUIT_PRESETS.SECURE_8192, CIRCUIT_COMMITTEES.SMALL) @@ -690,6 +713,7 @@ library ActiveCryptoConfig { return result } + this.regenerateConfigModules(preset) const sourceHash = this.computeSourceHash(preset, committee) result.sourceHash = sourceHash @@ -1281,7 +1305,7 @@ Commands: build (default), hash, sync-config Options: --group Circuit groups (comma-separated: dkg,threshold) --circuit Build specific circuit(s) - --preset Parameter preset: insecure-512 (default), secure-8192, or all + --preset Parameter preset: insecure (default), secure-8192, secure-16384, or all --committee Committee size: minimum (default), micro, small, or all --skip-utils-patch Don't rewrite BFV_DKG_H/T in packages/interfold-contracts/scripts/utils.ts --skip-vk Skip verification key generation diff --git a/scripts/check-committee.sh b/scripts/check-committee.sh index d2767aee7c..3c695f5132 100755 --- a/scripts/check-committee.sh +++ b/scripts/check-committee.sh @@ -10,7 +10,7 @@ # # 1. packages/interfold-contracts/scripts/protocol/constants.ts (deployment parameters) # 2. crates/fhe-params/src/constants.rs (ciphernode parameters) -# 3. circuits/lib/src/configs/{insecure,secure}/threshold.nr (circuit parameters) +# 3. circuits/lib/src/configs/{insecure,secure_8192,secure_16384}/threshold.nr (circuit parameters) # 4. circuits/lib/src/configs/committee/active.nr (Noir-side active committee) # 5. packages/interfold-contracts/scripts/utils.ts (deployment hashes and committee values) # 6. crates/zk-helpers/src/ciphernodes_committee.rs (committee enum values) @@ -58,7 +58,7 @@ for required_file in \ done for committee in minimum micro small; do - for artifact in parity_insecure.nr parity_secure.nr smudging.nr; do + for artifact in parity_insecure.nr parity_secure_8192.nr parity_secure_16384.nr smudging.nr; do [[ -f "circuits/lib/src/configs/committee/$committee/$artifact" ]] \ || fail "missing generated committee artifact: $committee/$artifact" done @@ -162,6 +162,7 @@ if (value < 2n) { current = next; next = (current + value / current) / 2n; } + if (current * current < value) current += 1n; process.stdout.write(current.toString()); } ' "$1" @@ -214,7 +215,7 @@ check_bfv_preset() { noir_degree=$(grep -E '^pub global N: u32 = [0-9]+;' "$noir_file" | sed -E 's/.*= ([0-9]+);/\1/') noir_plaintext=$(grep -E '^pub global PLAINTEXT_MODULUS: Field = [0-9]+;' "$noir_file" | sed -E 's/.*= ([0-9]+);/\1/') - noir_moduli=$(grep -E '^pub global QIS:' "$noir_file" | sed -E 's/.*= \[([^]]+)\];/\1/' | tr -d ' ') + noir_moduli=$(awk '/^pub global QIS:/,/];/ { gsub(/[^0-9,]/, ""); if ($0 != "") { printf "%s%s", sep, $0; sep = "," } }' "$noir_file") noir_error_bound=$(grep -E '^pub global PK_GENERATION_B_ENC: Field = [0-9]+;' "$noir_file" | sed -E 's/.*= ([0-9]+);/\1/') expected_error_bound=$(error_bound_for_variance "$ts_error") @@ -225,8 +226,9 @@ check_bfv_preset() { fi } -check_bfv_preset insecure-512 insecure512 insecure_512 insecure -check_bfv_preset secure-8192 secure8192 secure_8192 secure +check_bfv_preset insecure insecure512 insecure_512 insecure +check_bfv_preset secure-8192 secure8192 secure_8192 secure_8192 +check_bfv_preset secure-16384 secure16384 secure_16384 secure_16384 # 6. Every chain-supported route in utils.ts must match the Noir committee shape and the # parameter/configuration hashes compiled into ActiveCryptoConfig.sol. Keep this check @@ -305,9 +307,9 @@ check_utils_route() { fi } -check_utils_route INSECURE_MINIMUM insecure-512 minimum 0 -check_utils_route INSECURE_MICRO insecure-512 micro 1 -check_utils_route INSECURE_SMALL insecure-512 small 2 +check_utils_route INSECURE_MINIMUM insecure minimum 0 +check_utils_route INSECURE_MICRO insecure micro 1 +check_utils_route INSECURE_SMALL insecure small 2 check_utils_route SECURE_MINIMUM secure-8192 minimum 0 check_utils_route SECURE_MICRO secure-8192 micro 1 check_utils_route SECURE_SMALL secure-8192 small 2 @@ -400,7 +402,7 @@ format_parity_matrices_for_committee() { trap '_restore_swapped_parity_live' ERR - for variant in insecure secure; do + for variant in insecure secure_8192 secure_16384; do live="$NOIR_LIB/src/configs/committee/$committee/parity_${variant}.nr" fresh="$tmp/$committee/parity_${variant}.nr" [[ -f "$live" && -f "$fresh" ]] || continue @@ -433,7 +435,7 @@ format_parity_matrices_for_committee() { return 1 fi - for variant in insecure secure; do + for variant in insecure secure_8192 secure_16384; do live="$NOIR_LIB/src/configs/committee/$committee/parity_${variant}.nr" fresh="$tmp/$committee/parity_${variant}.nr" backup="$tmp/$committee/parity_${variant}.live.bak" @@ -473,7 +475,7 @@ if [[ -x "$GEN_BIN" ]]; then [[ -d "$TMP/$c" ]] || continue "$GEN_BIN" --committee "$c" --output-root "$TMP" >/dev/null format_parity_matrices_for_committee "$c" "$TMP" - for variant in insecure secure; do + for variant in insecure secure_8192 secure_16384; do live="circuits/lib/src/configs/committee/$c/parity_${variant}.nr" fresh="$TMP/$c/parity_${variant}.nr" if [[ -f "$live" && -f "$fresh" ]] && ! diff -q "$live" "$fresh" >/dev/null; then diff --git a/scripts/circuit-artifacts.test.ts b/scripts/circuit-artifacts.test.ts index 2b06eeb0c7..91646da89f 100644 --- a/scripts/circuit-artifacts.test.ts +++ b/scripts/circuit-artifacts.test.ts @@ -54,7 +54,7 @@ test('rejects a build stamp that declares a different pair', () => { try { writeFileSync( join(dir, 'secure-8192', 'small', '.build-stamp.json'), - JSON.stringify({ preset: 'insecure-512', committee: 'small', sourceHash: sourceHash('secure-8192', 'small') }), + JSON.stringify({ preset: 'insecure', committee: 'small', sourceHash: sourceHash('secure-8192', 'small') }), ) assert.throws(() => validateReleaseArtifacts(dir, sourceHash), /Invalid circuit build stamp/) } finally { diff --git a/scripts/circuit-constants.ts b/scripts/circuit-constants.ts index ddee8478d4..05bcef3ce6 100644 --- a/scripts/circuit-constants.ts +++ b/scripts/circuit-constants.ts @@ -41,20 +41,22 @@ export const ALL_VARIANTS: CircuitVariant[] = [CIRCUIT_VARIANTS.DEFAULT, CIRCUIT * the same compiled circuit artifacts. */ export const CIRCUIT_PRESETS = { - INSECURE_512: 'insecure-512', + INSECURE_512: 'insecure', SECURE_8192: 'secure-8192', + SECURE_16384: 'secure-16384', } as const export type CircuitPreset = (typeof CIRCUIT_PRESETS)[keyof typeof CIRCUIT_PRESETS] -export const ALL_PRESETS: CircuitPreset[] = [CIRCUIT_PRESETS.INSECURE_512, CIRCUIT_PRESETS.SECURE_8192] +export const ALL_PRESETS: CircuitPreset[] = [CIRCUIT_PRESETS.INSECURE_512, CIRCUIT_PRESETS.SECURE_8192, CIRCUIT_PRESETS.SECURE_16384] /** * Maps each preset to the Noir config module it re-exports from `circuits/lib/src/configs/default/mod.nr`. */ -export const PRESET_NOIR_CONFIG: Record = { +export const PRESET_NOIR_CONFIG: Record = { [CIRCUIT_PRESETS.INSECURE_512]: 'insecure', - [CIRCUIT_PRESETS.SECURE_8192]: 'secure', + [CIRCUIT_PRESETS.SECURE_8192]: 'secure_8192', + [CIRCUIT_PRESETS.SECURE_16384]: 'secure_16384', } /** diff --git a/scripts/generate-circuit-configs.sh b/scripts/generate-circuit-configs.sh index 991d86bd9b..745100ed9b 100755 --- a/scripts/generate-circuit-configs.sh +++ b/scripts/generate-circuit-configs.sh @@ -9,7 +9,7 @@ # # Produces per-circuit `configs.nr` + `Prover.toml` under: # dist/circuit-codegen//// -# for all three BFV presets (insecure-512, secure-8192, secure-16384) and all +# for all three BFV presets (insecure, secure-8192, secure-16384) and all # committees (minimum, micro, small). # # This is a convenience batch wrapper: it drives the same per-circuit `zk_cli codegen` @@ -21,7 +21,7 @@ # path; this script is the deterministic matrix sweep. # # Usage: -# ./scripts/generate-circuit-configs.sh [--preset insecure-512|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] +# ./scripts/generate-circuit-configs.sh [--preset insecure|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] set -euo pipefail @@ -32,7 +32,7 @@ cd "$REPO_ROOT" ZK_CLI_HELPERS="$(cd "$(dirname "${BASH_SOURCE[0]}")/../circuits/benchmarks/scripts" && pwd)/zk_cli_helpers.sh" source "$ZK_CLI_HELPERS" -ALL_PRESETS=("insecure-512" "secure-8192" "secure-16384") +ALL_PRESETS=("insecure" "secure-8192" "secure-16384") ALL_COMMITTEES=("minimum" "micro" "small") DEFAULT_OUTPUT="$REPO_ROOT/dist/circuit-codegen" @@ -80,7 +80,7 @@ while [[ $# -gt 0 ]]; do shift ;; -h|--help) - echo "Usage: $0 [--preset insecure-512|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] [--strict]" + echo "Usage: $0 [--preset insecure|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] [--strict]" exit 0 ;; *) @@ -98,7 +98,7 @@ done # map circuit path -> exact zk_cli preset name (BfvPreset::name, e.g. SECURE_THRESHOLD_16384) preset_to_zk_name() { case "$1" in - insecure-512) echo "INSECURE_THRESHOLD_512" ;; + insecure) echo "INSECURE_THRESHOLD_512" ;; secure-8192) echo "SECURE_THRESHOLD_8192" ;; secure-16384) echo "SECURE_THRESHOLD_16384" ;; *) echo "Error: unknown preset $1" >&2; return 1 ;; @@ -171,4 +171,4 @@ if [[ ${#FAILURES[@]} -gt 0 ]]; then else rm -f "$OUTPUT/failures.txt" fi -echo "✔ Wrote $(wc -l < "$OUTPUT/manifest.txt") entries + manifest to $OUTPUT" \ No newline at end of file +echo "✔ Wrote $(wc -l < "$OUTPUT/manifest.txt") entries + manifest to $OUTPUT" diff --git a/scripts/generate-verifiers.ts b/scripts/generate-verifiers.ts index e39789ba42..ca42b0cc06 100644 --- a/scripts/generate-verifiers.ts +++ b/scripts/generate-verifiers.ts @@ -64,7 +64,7 @@ const LICENSE_HEADER = `// SPDX-License-Identifier: LGPL-3.0-only * The on-chain `DkgAggregatorVerifier.sol` / `DecryptionAggregatorVerifier.sol` bake in the * recursive VKs of `dkg_aggregator` / `decryption_aggregator`, which are * **preset-dependent**: different BFV parameter sets compile to different VKs and therefore - * different `.sol` bytes. The root directory is pinned to `insecure-512/minimum` because that is + * different `.sol` bytes. The root directory is pinned to `insecure/minimum` because that is * the development/CI/benchmark default. * * Both `--check` and `--write` refuse to run unless @@ -77,7 +77,7 @@ const LICENSE_HEADER = `// SPDX-License-Identifier: LGPL-3.0-only * rebuild that preset and committee locally and run the generator there. Non-canonical outputs * land under `honk///`, not over the canonical files. */ -const CANONICAL_PRESET = 'insecure-512' +const CANONICAL_PRESET = 'insecure' /** * Canonical committee for the committed Honk Solidity verifiers under @@ -284,7 +284,7 @@ class VerifierGenerator { ` - A circuit / VK changed without regenerating the committed Solidity files.\n` + `\n To fix:\n` + ` 1. Verify your Noir/bb versions match (see crates/zk-prover/versions.json).\n` + - ` 2. Run 'pnpm build:circuits --preset insecure-512' (or the relevant preset).\n` + + ` 2. Run 'pnpm build:circuits --preset insecure' (or the relevant preset).\n` + ` 3. Run 'pnpm generate:verifiers --write' (or omit --check) to refresh the\n` + ` committed .sol files, then commit the diff.\n`, ) @@ -643,7 +643,7 @@ class VerifierGenerator { /** * Ensure `circuits/bin/` was last populated by `build:circuits` for the same preset. * Without this, a secure benchmark could leave secure VKs in bin while `--check` diffs - * against committed insecure-512 `.sol` files. + * against committed insecure `.sol` files. */ private assertCircuitsBinActivePreset(preset: string): void { const committee = this.targetCommittee() @@ -733,7 +733,7 @@ async function main() { } else if (arg === '--preset') { const value = args[++i] if (!value || value.startsWith('--')) { - console.error('Error: --preset requires a value (insecure-512 | secure-8192)') + console.error('Error: --preset requires a value (insecure | secure-8192 | secure-16384)') process.exit(1) } if (!ALL_PRESETS.includes(value as (typeof ALL_PRESETS)[number])) { @@ -794,8 +794,8 @@ current circuit VKs is surfaced as a failure rather than a silent rewrite. Options: --check Verify committed verifiers match current VKs (no writes). Exits non-zero on drift. Used by test/benchmark/CI flows. - --preset BFV preset for circuits/bin (insecure-512 | secure-8192). - Defaults to insecure-512. Check mode compares the committed verifier + --preset BFV preset for circuits/bin (insecure | secure-8192 | secure-16384). + Defaults to insecure. Check mode compares the committed verifier for the selected preset and committee. --committee Committee size (minimum | micro | small). When omitted, read from circuits/bin/.active-preset.json. Non-canonical pairs write to diff --git a/templates/default/scripts/lib/dev_config.sh b/templates/default/scripts/lib/dev_config.sh index f0bf9125f9..55fc5b2d1a 100644 --- a/templates/default/scripts/lib/dev_config.sh +++ b/templates/default/scripts/lib/dev_config.sh @@ -9,13 +9,13 @@ load_template_dev_config() { TEMPLATE_ROOT="$(_template_dev_config_root)" INTERFOLD_REPO_ROOT="$(cd "${TEMPLATE_ROOT}/../.." && pwd)" - BFV_PRESET="${BFV_PRESET:-insecure-512}" + BFV_PRESET="${BFV_PRESET:-insecure}" COMMITTEE="${COMMITTEE:-minimum}" case "$BFV_PRESET" in - insecure-512 | secure-8192) ;; + insecure | secure-8192 | secure-16384) ;; *) - echo "Invalid BFV_PRESET='${BFV_PRESET}' (use insecure-512 or secure-8192)" >&2 + echo "Invalid BFV_PRESET='${BFV_PRESET}' (use insecure, secure-8192, or secure-16384)" >&2 exit 1 ;; esac diff --git a/tests/integration/lib/prebuild.sh b/tests/integration/lib/prebuild.sh index b25baac870..b408b1e81f 100755 --- a/tests/integration/lib/prebuild.sh +++ b/tests/integration/lib/prebuild.sh @@ -26,7 +26,7 @@ rm -rf "${INTEGRATION_NOIR}/circuits" mkdir -p "${INTEGRATION_NOIR}/circuits" "${INTEGRATION_NOIR}/bin" if [[ "${FULL_PROOF_AGGREGATION:-false}" == "true" ]]; then - (cd "$ROOT_DIR" && pnpm build:circuits --preset insecure-512 -o "${INTEGRATION_NOIR}/circuits") + (cd "$ROOT_DIR" && pnpm build:circuits --preset insecure -o "${INTEGRATION_NOIR}/circuits") # `--check`: verify the committed Honk Solidity verifiers in # packages/interfold-contracts/contracts/verifiers/bfv/honk/ match the # freshly-built circuits' recursive VKs. Fails loudly on drift instead of @@ -36,7 +36,7 @@ if [[ "${FULL_PROOF_AGGREGATION:-false}" == "true" ]]; then else # C5/C7 final aggregation is skipped, but DKG and decryption leaf proofs # still execute. Build only those two source groups for the fast CI profile. - (cd "$ROOT_DIR" && pnpm build:circuits --preset insecure-512 --group dkg,threshold -o "${INTEGRATION_NOIR}/circuits") + (cd "$ROOT_DIR" && pnpm build:circuits --preset insecure --group dkg,threshold -o "${INTEGRATION_NOIR}/circuits") fi if ! command -v jq >/dev/null 2>&1; then @@ -58,7 +58,7 @@ jq -n \ cp "$(command -v bb)" "${INTEGRATION_NOIR}/bin/bb" chmod +x "${INTEGRATION_NOIR}/bin/bb" -echo "Staged circuits under ${INTEGRATION_NOIR}/circuits/insecure-512" +echo "Staged circuits under ${INTEGRATION_NOIR}/circuits/insecure" echo "Pinned noir version.json (bb=${REQUIRED_BB}, circuits=${REQUIRED_CIRCUITS})" echo "" echo "FINISHED BUILDING SOURCE-ALIGNED ZK CIRCUITS" From e559ca209d8ce27b7d97e6a6ce776562fb5294c5 Mon Sep 17 00:00:00 2001 From: 0xjei Date: Thu, 3 Sep 2026 16:30:38 +0200 Subject: [PATCH 6/9] fix: use fhe.rs dev branch --- Cargo.lock | 26 +++++++++++++------------- Cargo.toml | 8 ++++---- crates/support/Cargo.toml | 6 +++--- examples/CRISP/Cargo.lock | 26 +++++++++++++------------- examples/CRISP/Cargo.toml | 8 ++++---- templates/default/Cargo.toml | 4 ++-- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 60f61d7688..f14d1a2f13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -924,7 +924,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.13.0", + "itertools 0.14.0", "serde", "serde_json", "serde_with", @@ -4520,7 +4520,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4629,7 +4629,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.3.0" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "bincode", "doc-comment", @@ -4655,7 +4655,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.3.0" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "ethnum", "fhe-traits", @@ -4679,7 +4679,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.3.0" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "rand 0.9.4", ] @@ -4687,7 +4687,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.3.0" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "num-bigint-dig", "num-traits", @@ -5883,7 +5883,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7687,7 +7687,7 @@ checksum = "9cd31dcfdbbd7431a807ef4df6edd6473228e94d5c805e8cf671227a21bad068" dependencies = [ "anyhow", "clap", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", "rand 0.8.5", @@ -8088,7 +8088,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", - "itertools 0.13.0", + "itertools 0.14.0", "log", "multimap", "petgraph", @@ -8107,7 +8107,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.117", @@ -8120,7 +8120,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.14.0", "proc-macro2", "quote", "syn 2.0.117", @@ -8820,7 +8820,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -9760,7 +9760,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 62a3d362f7..fbc384ba87 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -152,10 +152,10 @@ dirs = "=5.0.1" dialoguer = "=0.11.0" duct = "=1.0.0" eyre = { version = "=0.6.12" } -fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv", features = ["experimental-mbfv"] } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } -fhe-math = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev", features = ["experimental-mbfv"] } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } +fhe-math = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } figment = { version = "=0.10.19", features = ["env", "yaml", "test"] } futures = "=0.3.31" futures-util = "=0.3.31" diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index 38b687a8ed..caf8cff1d3 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -69,9 +69,9 @@ sha2 = "=0.10.9" # soon as one contains this code, and record the tag here. `pnpm check:image-id` warns until then. # It is deliberately a `rev` and not a `tag`: a tag can be moved, and the pin decides which code # the guest runs, so it should be content-addressed even when it names a release. -fhe = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv", features = ["experimental-mbfv"] } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "dev", features = ["experimental-mbfv"] } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } e3-compute-provider = { git = "https://github.com/theinterfold/interfold", rev = "5b2ca6619a07aec6104f9b877bff948bd976b6cf" } tokio = { version = "=1.46.1", features = ["full"] } rand = { version = "=0.9.4" } diff --git a/examples/CRISP/Cargo.lock b/examples/CRISP/Cargo.lock index 0990683290..cd4a7c2b1d 100644 --- a/examples/CRISP/Cargo.lock +++ b/examples/CRISP/Cargo.lock @@ -823,7 +823,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_json", "serde_with", @@ -1151,7 +1151,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -1162,7 +1162,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -2795,7 +2795,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -2864,7 +2864,7 @@ dependencies = [ [[package]] name = "fhe" version = "0.3.0" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "bincode", "doc-comment", @@ -2890,7 +2890,7 @@ dependencies = [ [[package]] name = "fhe-math" version = "0.3.0" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "ethnum", "fhe-traits", @@ -2914,7 +2914,7 @@ dependencies = [ [[package]] name = "fhe-traits" version = "0.3.0" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "rand 0.9.4", ] @@ -2922,7 +2922,7 @@ dependencies = [ [[package]] name = "fhe-util" version = "0.3.0" -source = "git+https://github.com/gnosisguild/fhe.rs?branch=core%2Flbfv#45b09c40b5cf3121f48c7a2c441e2b295f68fcda" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "num-bigint-dig", "num-traits", @@ -4700,7 +4700,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", - "itertools 0.14.0", + "itertools 0.13.0", "log", "multimap", "petgraph", @@ -4719,7 +4719,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.13.0", "proc-macro2 1.0.106", "quote 1.0.45", "syn 2.0.117", @@ -5252,7 +5252,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -5704,7 +5704,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.60.2", ] [[package]] @@ -5877,7 +5877,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] diff --git a/examples/CRISP/Cargo.toml b/examples/CRISP/Cargo.toml index ebbeeca759..9b5fea14dc 100644 --- a/examples/CRISP/Cargo.toml +++ b/examples/CRISP/Cargo.toml @@ -47,10 +47,10 @@ log = { version = "=0.4.27" } reqwest = { version = "=0.12.22", features = ["json"] } serde = { version = "=1.0.228", features = ["derive", "std"] } serde_json = "=1.0.145" -fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv", features = ["experimental-mbfv"] } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } -fhe-math = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } -fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev", features = ["experimental-mbfv"] } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } +fhe-math = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } +fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } tokio = { version = "=1.46.1", features = ["full"] } rand = { version = "0.9" } tracing-subscriber = { version = "=0.3.20", features = ["env-filter"] } diff --git a/templates/default/Cargo.toml b/templates/default/Cargo.toml index 5f3cbe8c67..0d32f7f441 100644 --- a/templates/default/Cargo.toml +++ b/templates/default/Cargo.toml @@ -7,8 +7,8 @@ members = [ [workspace.dependencies] e3-user-program = { path = "./program" } -fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv", features = ["experimental-mbfv"] } -fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "core/lbfv" } +fhe = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev", features = ["experimental-mbfv"] } +fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } e3-program-server = { path = "../../crates/program-server" } e3-bfv-client = { path = "../../crates/bfv-client" } e3-fhe-params = { path = "../../crates/fhe-params" } From d1089942cacd7130c8b65faee284ebd6361a0b8a Mon Sep 17 00:00:00 2001 From: 0xjei Date: Fri, 4 Sep 2026 13:30:33 +0200 Subject: [PATCH 7/9] fix: align BFV parameter and verifier artifacts --- agent/flow-trace/07_UPGRADES.md | 6 + circuits/bin/config/src/main.nr | 7 +- circuits/lib/src/configs/insecure/dkg.nr | 2 +- circuits/lib/src/configs/secure_16384/dkg.nr | 2 +- circuits/lib/src/configs/secure_8192/dkg.nr | 2 +- circuits/lib/src/core/dkg/share_encryption.nr | 18 +- crates/bfv-client/src/client.rs | 5 +- crates/config/protocol-release.toml | 2 +- crates/events/src/interfold_event/proof.rs | 105 +- crates/fhe-params/src/constants.rs | 3 +- crates/fhe-params/src/presets.rs | 6 +- crates/net/src/network.rs | 4 +- crates/net/src/network_sync/wire.rs | 4 +- crates/support/Cargo.lock | 2355 ++++++++++------- crates/support/Cargo.toml | 10 +- crates/support/contracts/ImageID.sol | 2 +- crates/support/methods/guest/Cargo.lock | 827 +++--- crates/support/methods/guest/Cargo.toml | 2 +- .../dkg/share_encryption/computation.rs | 5 +- .../verifiers/bfv/BfvPkVerifierRouter.sol | 2 +- .../insecure/micro/DkgAggregatorVerifier.sol | 110 +- .../insecure/small/DkgAggregatorVerifier.sol | 110 +- .../micro/DkgAggregatorVerifier.sol | 110 +- .../minimum/DkgAggregatorVerifier.sol | 110 +- .../small/DkgAggregatorVerifier.sol | 110 +- .../scripts/protocol/deployContracts.ts | 6 + .../scripts/upgrade/validateSecureCrisp.ts | 2 +- packages/interfold-contracts/scripts/utils.ts | 77 +- .../test/BfvVerifierRouter.spec.ts | 8 +- .../test/BfvVkBindingIntegration.spec.ts | 29 +- .../bfv_vk_binding/folded_artifacts.json | 8 +- scripts/build-circuits.ts | 7 +- scripts/circuit-artifacts.ts | 4 +- scripts/circuit-constants.ts | 18 +- templates/default/Cargo.lock | 1373 ++++++---- 35 files changed, 3090 insertions(+), 2361 deletions(-) diff --git a/agent/flow-trace/07_UPGRADES.md b/agent/flow-trace/07_UPGRADES.md index e5ef701863..511e20b237 100644 --- a/agent/flow-trace/07_UPGRADES.md +++ b/agent/flow-trace/07_UPGRADES.md @@ -61,6 +61,12 @@ each other. The initial VRF upgrade follows this combined path because it introduces the controller and changes both `Interfold` and `BondingRegistry`. +The BFV preset and chunked DKG release uses `protocol_version = 3`, `GOSSIP_WIRE_MAJOR = 3`, and +`SYNC_WIRE_MAJOR = 3`. The release changes circuit identities and persisted proof payloads. Drain +all active E3s, stop old nodes, deploy the matching circuit archive, and start the new release +before resuming requests. Nodes with schema versions below the release schema must use the explicit +resync procedure; they must not replay the old event log with the new binary. + ## Secure CRISP activation on mainnet The bootstrap deployment does not become production-ready when CRISP contracts are deployed. With diff --git a/circuits/bin/config/src/main.nr b/circuits/bin/config/src/main.nr index 5921c6135c..912c0f2eb7 100644 --- a/circuits/bin/config/src/main.nr +++ b/circuits/bin/config/src/main.nr @@ -210,7 +210,7 @@ fn verify_dkg_bounds() { // msg_bound = t - 1 assert(SHARE_ENCRYPTION_MSG_BOUND as u128 == t - 1, "SHARE_ENCRYPTION_MSG_BOUND mismatch"); - // Plaintext coefficients are encoded in [0, t). + // The scaled plaintext uses a symmetric magnitude bound of t - 1. let ptxt_up_bound: u128 = t - 1; for i in 0..DKG_L { @@ -260,8 +260,9 @@ fn verify_dkg_bounds() { "SHARE_ENCRYPTION_R1_UP_BOUNDS mismatch", ); - // r1_low_bounds[i] uses the lower plaintext bound of zero. - let expected_r1_low: u128 = ((n * u_bound + 2) * qi_bound + e0_bound_i) / qi; + // r1_low_bounds[i] uses the magnitude of the negative plaintext bound. + let expected_r1_low: u128 = + (ptxt_up_bound * k0i + ((n * u_bound + 2) * qi_bound + e0_bound_i)) / qi; assert( SHARE_ENCRYPTION_R1_LOW_BOUNDS[i] as u128 == expected_r1_low, "SHARE_ENCRYPTION_R1_LOW_BOUNDS mismatch", diff --git a/circuits/lib/src/configs/insecure/dkg.nr b/circuits/lib/src/configs/insecure/dkg.nr index 47bfb61391..e493a7fda8 100644 --- a/circuits/lib/src/configs/insecure/dkg.nr +++ b/circuits/lib/src/configs/insecure/dkg.nr @@ -81,7 +81,7 @@ pub global SHARE_ENCRYPTION_PK_BOUNDS: [Field; L] = [1125899906777088]; pub global SHARE_ENCRYPTION_E0_BOUND: Field = 6; pub global SHARE_ENCRYPTION_E1_BOUND: Field = 6; pub global SHARE_ENCRYPTION_U_BOUND: Field = 1; -pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [256]; +pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [39210118110]; pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [39210118110]; pub global SHARE_ENCRYPTION_R2_BOUNDS: [Field; L] = [1125899906777088]; pub global SHARE_ENCRYPTION_P1_BOUNDS: [Field; L] = [256]; diff --git a/circuits/lib/src/configs/secure_16384/dkg.nr b/circuits/lib/src/configs/secure_16384/dkg.nr index 813f6bb83f..7306bb7124 100644 --- a/circuits/lib/src/configs/secure_16384/dkg.nr +++ b/circuits/lib/src/configs/secure_16384/dkg.nr @@ -81,7 +81,7 @@ pub global SHARE_ENCRYPTION_PK_BOUNDS: [Field; L] = [2251799813881856, 225179981 pub global SHARE_ENCRYPTION_E0_BOUND: Field = 20; pub global SHARE_ENCRYPTION_E1_BOUND: Field = 20; pub global SHARE_ENCRYPTION_U_BOUND: Field = 1; -pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [8192, 8192]; +pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [125873921148148, 898533630999902]; pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [125873921148148, 898533630999902]; pub global SHARE_ENCRYPTION_R2_BOUNDS: [Field; L] = [2251799813881856, 2251799814176768]; pub global SHARE_ENCRYPTION_P1_BOUNDS: [Field; L] = [8192, 8192]; diff --git a/circuits/lib/src/configs/secure_8192/dkg.nr b/circuits/lib/src/configs/secure_8192/dkg.nr index a492c0d3d4..17362913b9 100644 --- a/circuits/lib/src/configs/secure_8192/dkg.nr +++ b/circuits/lib/src/configs/secure_8192/dkg.nr @@ -81,7 +81,7 @@ pub global SHARE_ENCRYPTION_PK_BOUNDS: [Field; L] = [576460752303497216, 5764607 pub global SHARE_ENCRYPTION_E0_BOUND: Field = 20; pub global SHARE_ENCRYPTION_E1_BOUND: Field = 20; pub global SHARE_ENCRYPTION_U_BOUND: Field = 1; -pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [4096, 4096]; +pub global SHARE_ENCRYPTION_R1_LOW_BOUNDS: [Field; L] = [90521745189217441, 159972962955401129]; pub global SHARE_ENCRYPTION_R1_UP_BOUNDS: [Field; L] = [90521745189217441, 159972962955401129]; pub global SHARE_ENCRYPTION_R2_BOUNDS: [Field; L] = [576460752303497216, 576460752303595520]; pub global SHARE_ENCRYPTION_P1_BOUNDS: [Field; L] = [4096, 4096]; diff --git a/circuits/lib/src/core/dkg/share_encryption.nr b/circuits/lib/src/core/dkg/share_encryption.nr index c7df0d04c6..cec38c6de5 100644 --- a/circuits/lib/src/core/dkg/share_encryption.nr +++ b/circuits/lib/src/core/dkg/share_encryption.nr @@ -211,7 +211,7 @@ impl Polynomial { let t = self.configs.t; // t < 2^62 (plaintext modulus); q_mod_t, msg_i < t: all safe for ModU64. @@ -219,25 +219,11 @@ impl t/2 means negative in centered form) - let needs_centering = (q_times_m_mod_t as u64) > t_half; - - k1_coeffs[i] = if needs_centering { - // Value is in (t/2, t), negative in centered form - // Represent as P - magnitude (i.e., 0 - magnitude in Field) - let magnitude = t - q_times_m_mod_t; - 0 - magnitude - } else { - // Value is in [0, t/2], stays positive - q_times_m_mod_t - }; + k1_coeffs[i] = q_times_m_mod_t; } Polynomial { coefficients: k1_coeffs } diff --git a/crates/bfv-client/src/client.rs b/crates/bfv-client/src/client.rs index 7f26a20377..7a641b59ab 100644 --- a/crates/bfv-client/src/client.rs +++ b/crates/bfv-client/src/client.rs @@ -290,10 +290,7 @@ mod tests { let normalized_bytes = PublicKey::from_bytes(&expected_bytes, ¶ms) .unwrap() .to_bytes(); - assert_ne!( - normalized_bytes, expected_bytes, - "threshold aggregation must exercise fhe.rs variable-time normalization" - ); + assert_eq!(normalized_bytes, expected_bytes); let expected_commitment = compute_pk_commitment( expected_bytes.clone(), param_set.degree, diff --git a/crates/config/protocol-release.toml b/crates/config/protocol-release.toml index 0b4e2fab0e..319881cb73 100644 --- a/crates/config/protocol-release.toml +++ b/crates/config/protocol-release.toml @@ -2,5 +2,5 @@ # Increase protocol_version when contracts, events, cryptography, or protocol behavior become # incompatible. Increase node_generation for a mandatory node-only release. -protocol_version = 2 +protocol_version = 3 node_generation = 1 diff --git a/crates/events/src/interfold_event/proof.rs b/crates/events/src/interfold_event/proof.rs index 39226e0b98..035c059f3e 100644 --- a/crates/events/src/interfold_event/proof.rs +++ b/crates/events/src/interfold_event/proof.rs @@ -104,56 +104,66 @@ impl fmt::Display for CircuitVariant { } /// Circuit identifiers for ZK proofs. +/// +/// Bincode encodes this enum by variant order. Do not reorder variants. +/// Add new circuits at the end. Keep retired circuits for compatibility. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[repr(u32)] pub enum CircuitName { /// BFV public key proof (C0). - PkBfv, + PkBfv = 0, /// TrBFV public key share proof (C1). - PkGeneration, + PkGeneration = 1, /// Share encryption proof (C3). - ShareEncryption, + ShareEncryption = 2, /// DKG share decryption proof (C4). - DkgShareDecryption, + DkgShareDecryption = 3, /// Public key aggregation proof (C5). - PkAggregation, + PkAggregation = 4, /// Decryption share proof (C6). - ThresholdShareDecryption, + ThresholdShareDecryption = 5, /// Decrypted shares aggregation proof (C7). - DecryptedSharesAggregation, + DecryptedSharesAggregation = 6, /// Sequential C3 fold: inner ZK + optional prior `c3_fold` non-ZK proof. - C3Fold, + C3Fold = 7, /// Bootstrap circuit for [`CircuitName::C3Fold`] genesis accumulator proof (same ABI, no acc verify). - C3FoldKernel, + C3FoldKernel = 8, /// Sequential C6 fold: inner ZK + prior `c6_fold` non-ZK proof (phase-7 aggregator). - C6Fold, + C6Fold = 9, /// Bootstrap circuit for [`CircuitName::C6Fold`] genesis accumulator proof (same ABI, no acc verify). - C6FoldKernel, + C6FoldKernel = 10, /// Ad-hoc: final sk `c3_fold` + final e_sm `c3_fold`. - C3abFold, + C3abFold = 11, /// Ad-hoc: C4a + C4b. - C4abFold, + C4abFold = 12, /// Per-node DKG fold (C0..C4 links). - NodeFold, + NodeFold = 13, /// Sequential fold of `H` `node_fold` proofs (non-ZK) before `dkg_aggregator`. - NodesFold, + NodesFold = 14, /// Bootstrap circuit for [`CircuitName::NodesFold`] genesis accumulator proof (same ABI, no acc verify). - NodesFoldKernel, + NodesFoldKernel = 15, /// DKG aggregator (folded `node_fold` via `nodes_fold` + C5). - DkgAggregator, + DkgAggregator = 16, /// Phase-7 decryption aggregator (folded C6 via `c6_fold` + C7). - DecryptionAggregator, + DecryptionAggregator = 17, /// SK coefficient-range proof used by the root-committed chunk pipeline. - SkShareComputationChunk, + SkShareComputationChunk = 18, /// ESM coefficient-range proof used by the root-committed chunk pipeline. - ESmShareComputationChunk, + ESmShareComputationChunk = 19, /// Recursive batch of C2 chunk proofs. - C2ChunkBatch, + C2ChunkBatch = 20, /// Type-bound SK terminal projection from a complete C2 chunk accumulator. - SkC2ChunkFinalize, + SkC2ChunkFinalize = 21, /// Type-bound ESM terminal projection from a complete C2 chunk accumulator. - ESmC2ChunkFinalize, + ESmC2ChunkFinalize = 22, /// Combines type-bound terminal C2a and C2b chunk proofs. - C2abChunkFold, + C2abChunkFold = 23, + /// Legacy Sk share computation (C2a). Retain for bincode compatibility. Do not produce. + SkShareComputation = 24, + /// Legacy ESM share computation (C2b). Retain for bincode compatibility. Do not produce. + ESmShareComputation = 25, + /// Legacy ad-hoc aggregation C2a + C2b. Retain for bincode compatibility. Do not produce. + C2abFold = 26, } impl CircuitName { @@ -161,6 +171,8 @@ impl CircuitName { match self { CircuitName::PkBfv => "pk", CircuitName::PkGeneration => "pk_generation", + CircuitName::SkShareComputation => "sk_share_computation", + CircuitName::ESmShareComputation => "e_sm_share_computation", CircuitName::SkShareComputationChunk => "sk_share_computation_chunk", CircuitName::ESmShareComputationChunk => "esm_share_computation_chunk", CircuitName::C2ChunkBatch => "c2_chunk_batch", @@ -176,6 +188,7 @@ impl CircuitName { CircuitName::C2abChunkFold => "c2ab_chunk_fold", CircuitName::C6Fold => "c6_fold", CircuitName::C6FoldKernel => "c6_fold_kernel", + CircuitName::C2abFold => "c2ab_fold", CircuitName::C3abFold => "c3ab_fold", CircuitName::C4abFold => "c4ab_fold", CircuitName::NodeFold => "node_fold", @@ -189,10 +202,12 @@ impl CircuitName { pub fn group(&self) -> &'static str { match self { CircuitName::PkBfv => "dkg", - CircuitName::SkShareComputationChunk => "dkg", - CircuitName::ESmShareComputationChunk => "dkg", - CircuitName::ShareEncryption => "dkg", - CircuitName::DkgShareDecryption => "dkg", + CircuitName::SkShareComputation + | CircuitName::ESmShareComputation + | CircuitName::SkShareComputationChunk + | CircuitName::ESmShareComputationChunk + | CircuitName::ShareEncryption + | CircuitName::DkgShareDecryption => "dkg", CircuitName::PkGeneration => "threshold", CircuitName::ThresholdShareDecryption => "threshold", CircuitName::PkAggregation => "threshold", @@ -205,6 +220,7 @@ impl CircuitName { | CircuitName::C2abChunkFold | CircuitName::C6Fold | CircuitName::C6FoldKernel + | CircuitName::C2abFold | CircuitName::C3abFold | CircuitName::C4abFold | CircuitName::NodeFold @@ -230,9 +246,12 @@ impl CircuitName { CircuitName::PkGeneration => CircuitOutputLayout::Fixed { fields: PK_GENERATION_OUTPUTS, }, - CircuitName::SkShareComputationChunk | CircuitName::ESmShareComputationChunk => { - CircuitOutputLayout::None - } + // Legacy circuits no longer produce proofs. Map to None so old + // proofs fail closed on extraction but still decode. + CircuitName::SkShareComputation + | CircuitName::ESmShareComputation + | CircuitName::SkShareComputationChunk + | CircuitName::ESmShareComputationChunk => CircuitOutputLayout::None, CircuitName::DkgShareDecryption => CircuitOutputLayout::Fixed { fields: DKG_SHARE_DECRYPTION_OUTPUTS, }, @@ -254,6 +273,7 @@ impl CircuitName { | CircuitName::C2abChunkFold | CircuitName::C6Fold | CircuitName::C6FoldKernel + | CircuitName::C2abFold | CircuitName::C3abFold | CircuitName::C4abFold | CircuitName::NodeFold @@ -323,6 +343,9 @@ mod tests { (CircuitName::SkC2ChunkFinalize, 21), (CircuitName::ESmC2ChunkFinalize, 22), (CircuitName::C2abChunkFold, 23), + (CircuitName::SkShareComputation, 24), + (CircuitName::ESmShareComputation, 25), + (CircuitName::C2abFold, 26), ]; for (circuit, discriminant) in expected { @@ -330,6 +353,26 @@ mod tests { } } + #[test] + fn circuit_name_legacy_bincode_bytes_decode_to_the_same_variants() { + let expected = [ + ([2u8, 0, 0, 0], CircuitName::ShareEncryption), + ([13u8, 0, 0, 0], CircuitName::NodeFold), + ([16u8, 0, 0, 0], CircuitName::DkgAggregator), + ([17u8, 0, 0, 0], CircuitName::DecryptionAggregator), + ([24u8, 0, 0, 0], CircuitName::SkShareComputation), + ([25u8, 0, 0, 0], CircuitName::ESmShareComputation), + ([26u8, 0, 0, 0], CircuitName::C2abFold), + ]; + + for (bytes, circuit) in expected { + assert_eq!( + bincode::deserialize::(&bytes).unwrap(), + circuit + ); + } + } + #[test] fn extract_c1_pk_commitment() { // C1 has 3 outputs: sk_commitment, pk_commitment, e_sm_commitment diff --git a/crates/fhe-params/src/constants.rs b/crates/fhe-params/src/constants.rs index 382e921182..69953527ca 100644 --- a/crates/fhe-params/src/constants.rs +++ b/crates/fhe-params/src/constants.rs @@ -51,7 +51,8 @@ pub mod secure_8192 { } } -/// Secure preset constants (degree 16384) - PRODUCTION READY. The runtime +/// Secure preset constants (degree 16384), available for generation but not enabled in the +/// current deployment matrix. The runtime /// `SmudgingBoundCalculator` enforces `2*(B_C + n*B_sm) < Delta = floor(Q/t)`; /// these 16384 parameters were regenerated with the multiplicative-depth-aware /// search (Prop. 20 recursion) and support `mult_depth` 0-3 at runtime. diff --git a/crates/fhe-params/src/presets.rs b/crates/fhe-params/src/presets.rs index 3e2f9d1e69..fe81eb7ea2 100644 --- a/crates/fhe-params/src/presets.rs +++ b/crates/fhe-params/src/presets.rs @@ -70,14 +70,16 @@ pub enum BfvPreset { /// a standard BFV key-pair to encrypt secret shares. These are temporary keys used /// only during the key generation process. SecureDkg8192, - /// Secure threshold BFV parameters (degree 16384) - PRODUCTION READY + /// Secure threshold BFV parameters (degree 16384), available for generation but not enabled + /// in the current deployment matrix. /// /// Used for threshold encryption (GRECO) and threshold decryption operations with /// multiplicative depth up to 3 (l-BFV support; the regenerated constants satisfy /// the runtime `2*(B_C + n*B_sm) < Delta` correctness budget at depth 3). These /// parameters define the threshold public key that data providers use to encrypt inputs. SecureThreshold16384, - /// Secure DKG parameters (degree 16384) - PRODUCTION READY + /// Secure DKG parameters (degree 16384), available for generation but not enabled in the + /// current deployment matrix. /// /// Used during Phase 0-1 (BFV Key Setup and DKG) where each ciphernode generates /// a standard BFV key-pair to encrypt secret shares. These are temporary keys used diff --git a/crates/net/src/network.rs b/crates/net/src/network.rs index 28d794d9eb..c418bbff5a 100644 --- a/crates/net/src/network.rs +++ b/crates/net/src/network.rs @@ -12,8 +12,8 @@ use e3_events::{E3id, Event, EventContextAccessors, InterfoldEvent, SeqState}; use libp2p::{identify::Info, StreamProtocol}; use sha2::{Digest, Sha256}; -pub(crate) const GOSSIP_WIRE_MAJOR: u16 = 2; -pub(crate) const SYNC_WIRE_MAJOR: u16 = 2; +pub(crate) const GOSSIP_WIRE_MAJOR: u16 = 3; +pub(crate) const SYNC_WIRE_MAJOR: u16 = 3; const IDENTIFY_MAJOR: u16 = 1; const KADEMLIA_VERSION: &str = "1.0.0"; diff --git a/crates/net/src/network_sync/wire.rs b/crates/net/src/network_sync/wire.rs index f468a23c31..87446dd762 100644 --- a/crates/net/src/network_sync/wire.rs +++ b/crates/net/src/network_sync/wire.rs @@ -276,11 +276,11 @@ mod tests { } #[test] - fn sync_envelope_v2_fixture_is_stable() { + fn sync_envelope_v3_fixture_is_stable() { let bytes = encode_sync(SyncMessageKind::FetchEvents, &7u64).unwrap(); assert_eq!( hex::encode(bytes), - "49465332020000000000aae89fc0f03e2959ae4d701a80cc3915918c950b159f6abb6c92c1433b1a853408000000000000000700000000000000" + "49465332030000000000aae89fc0f03e2959ae4d701a80cc3915918c950b159f6abb6c92c1433b1a853408000000000000000700000000000000" ); } } diff --git a/crates/support/Cargo.lock b/crates/support/Cargo.lock index 6bade3789b..fd8f2df079 100644 --- a/crates/support/Cargo.lock +++ b/crates/support/Cargo.lock @@ -4,11 +4,11 @@ version = 4 [[package]] name = "actix-codec" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +checksum = "31404e1443b7b7bcaa311c1af456775cc3f668e34573f1503d7ce4844327629e" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "bytes", "futures-core", "futures-sink", @@ -21,23 +21,22 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.11.2" +version = "3.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" +checksum = "86d62d1a48894ec9450bcde7ef1e3681205771ff6ea9c61cc5ae031145192787" dependencies = [ "actix-codec", - "actix-rt", "actix-service", "actix-utils", "base64 0.22.1", - "bitflags 2.10.0", + "bitflags 2.13.1", "brotli", "bytes", "bytestring", "derive_more", "encoding_rs", "flate2", - "foldhash 0.1.5", + "foldhash 0.2.0", "futures-core", "h2 0.3.27", "http 0.2.12", @@ -49,8 +48,8 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.2", - "sha1", + "rand 0.10.2", + "sha1 0.11.0", "smallvec", "tokio", "tokio-util", @@ -70,9 +69,9 @@ dependencies = [ [[package]] name = "actix-router" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +checksum = "14f8c75c51892f18d9c46150c5ac7beb81c95f78c8b83a634d49f4ca32551fe7" dependencies = [ "bytestring", "cfg-if", @@ -85,9 +84,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.11.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" +checksum = "6a16bf2f19c2ad84842bdfe6f3665620e93197d5c607889bfa3aaac45e762fd1" dependencies = [ "futures-core", "tokio", @@ -95,9 +94,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +checksum = "cc8dcb6fa613d47c3b764a7dc672b4b31f25751dcbcf542f7b16f3e1f700044c" dependencies = [ "actix-rt", "actix-service", @@ -105,7 +104,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2 0.5.10", + "socket2 0.6.5", "tokio", "tracing", ] @@ -214,22 +213,13 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -238,9 +228,9 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" dependencies = [ "alloc-no-stdlib", ] @@ -253,9 +243,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae62e633fa48b4190af5e841eb05179841bb8b713945103291e2c0867037c0d1" +checksum = "50ab0cd8afe573d1f7dc2353698a51b1f93aec362c8211e28cfd3948c6adba39" dependencies = [ "alloy-consensus", "alloy-contract", @@ -276,9 +266,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.2.20" +version = "0.2.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bc32535569185cbcb6ad5fa64d989a47bccb9a08e27284b1f2a3ccf16e6d010" +checksum = "84e0378e959aa6a885897522080a990e80eb317f1e9a222a604492ea50e13096" dependencies = [ "alloy-primitives", "num_enum", @@ -288,9 +278,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b151e38e42f1586a01369ec52a6934702731d07e8509a7307331b09f6c46dc" +checksum = "7f16daaf7e1f95f62c6c3bf8a3fc3d78b08ae9777810c0bb5e94966c7cd57ef0" dependencies = [ "alloy-eips", "alloy-primitives", @@ -299,24 +289,25 @@ dependencies = [ "alloy-trie", "alloy-tx-macros", "auto_impl", + "borsh", "c-kzg", "derive_more", "either", "k256", "once_cell", - "rand 0.8.6", + "rand 0.8.8", "secp256k1", "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "alloy-consensus-any" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e2d5e8668ef6215efdb7dcca6f22277b4e483a5650e05f5de22b2350971f4b8" +checksum = "118998d9015332ab1b4720ae1f1e3009491966a0349938a1f43ff45a8a4c6299" dependencies = [ "alloy-consensus", "alloy-eips", @@ -328,9 +319,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630288cf4f3a34a8c6bc75c03dce1dbd47833138f65f37d53a1661eafc96b83f" +checksum = "7ac9e0c34dc6bce643b182049cdfcca1b8ce7d9c260cbdd561f511873b7e26cd" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -345,18 +336,20 @@ dependencies = [ "futures", "futures-util", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", + "tracing", ] [[package]] name = "alloy-core" -version = "1.3.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d47400608fc869727ad81dba058d55f97b29ad8b5c5256d9598523df8f356ab6" +checksum = "5ca96214615ec8cf3fa2a54b32f486eb49100ca7fe7eb0b8c1137cd316e7250a" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", "alloy-primitives", + "alloy-rlp", "alloy-sol-types", ] @@ -373,7 +366,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -386,59 +379,76 @@ dependencies = [ "alloy-rlp", "crc", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "alloy-eip2930" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" dependencies = [ "alloy-primitives", "alloy-rlp", + "borsh", "serde", ] [[package]] name = "alloy-eip7702" -version = "0.6.1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "borsh", + "serde", + "thiserror 2.0.20", +] + +[[package]] +name = "alloy-eip7928" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" +checksum = "6b827a6d7784fe3eb3489d40699407a4cdcce74271421a01bdffe60cf573bb16" dependencies = [ "alloy-primitives", "alloy-rlp", + "borsh", + "once_cell", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "alloy-eips" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5434834adaf64fa20a6fb90877bc1d33214c41b055cc49f82189c98614368cc" +checksum = "e6ef28c9fdad22d4eec52d894f5f2673a0895f1e5ef196734568e68c0f6caca8" dependencies = [ "alloy-eip2124", "alloy-eip2930", "alloy-eip7702", + "alloy-eip7928", "alloy-primitives", "alloy-rlp", "alloy-serde", "auto_impl", + "borsh", "c-kzg", "derive_more", "either", "serde", "serde_with", "sha2", - "thiserror 2.0.18", ] [[package]] name = "alloy-genesis" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919a8471cfbed7bcd8cf1197a57dda583ce0e10c6385f6ff4e8b41304b223392" +checksum = "bbf9480307b09d22876efb67d30cadd9013134c21f3a17ec9f93fd7536d38024" dependencies = [ "alloy-eips", "alloy-primitives", @@ -474,24 +484,24 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c69f6c9c68a1287c9d5ff903d0010726934de0dac10989be37b75a29190d55" +checksum = "422d110f1c40f1f8d0e5562b0b649c35f345fccb7093d9f02729943dcd1eef71" dependencies = [ "alloy-primitives", "alloy-sol-types", - "http 1.4.0", + "http 1.5.0", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] [[package]] name = "alloy-network" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf2ae05219e73e0979cb2cf55612aafbab191d130f203079805eaf881cca58" +checksum = "7197a66d94c4de1591cdc16a9bcea5f8cccd0da81b865b49aef97b1b4016e0fa" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -510,14 +520,14 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "alloy-network-primitives" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58f4f345cef483eab7374f2b6056973c7419ffe8ad35e994b7a7f5d8e0c7ba4" +checksum = "eb82711d59a43fdfd79727c99f270b974c784ec4eb5728a0d0d22f26716c87ef" dependencies = [ "alloy-consensus", "alloy-eips", @@ -528,9 +538,9 @@ dependencies = [ [[package]] name = "alloy-node-bindings" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61321a0dbc084c2c9f2b07aa34f10db7ac80065c01721e567e5426d882c73de6" +checksum = "a9b2fda91b56bb08907cd44c5068130360e027e46a8c17612d386869fa7940be" dependencies = [ "alloy-genesis", "alloy-hardforks", @@ -539,10 +549,11 @@ dependencies = [ "alloy-signer", "alloy-signer-local", "k256", - "rand 0.8.6", + "libc", + "rand 0.8.8", "serde_json", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", "url", ] @@ -560,13 +571,13 @@ dependencies = [ "derive_more", "foldhash 0.2.0", "hashbrown 0.16.1", - "indexmap 2.12.1", + "indexmap 2.14.1", "itoa", "k256", "keccak-asm", "paste", "proptest", - "rand 0.9.2", + "rand 0.9.4", "ruint", "rustc-hash", "serde", @@ -576,9 +587,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de2597751539b1cc8fe4204e5325f9a9ed83fcacfb212018dfcfa7877e76de21" +checksum = "bf6b18b929ef1d078b834c3631e9c925177f3b23ddc6fa08a722d13047205876" dependencies = [ "alloy-chains", "alloy-consensus", @@ -602,13 +613,13 @@ dependencies = [ "either", "futures", "futures-utils-wasm", - "lru 0.13.0", + "lru 0.16.4", "parking_lot", "pin-project", - "reqwest", + "reqwest 0.13.4", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tracing", "url", @@ -617,9 +628,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.12" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -628,9 +639,9 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.12" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" +checksum = "9d4311c03125e8a18296504560b9de3d75ecbd0dcda7f71e6cf2a196d57e6fba" dependencies = [ "proc-macro2", "quote", @@ -639,9 +650,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edf8eb8be597cfa8c312934d2566ec4516f066d69164f9212d7a148979fdcfd8" +checksum = "94fcc9604042ca80bd37aa5e232ea1cd851f337e31e2babbbb345bc0b1c30de3" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -649,7 +660,7 @@ dependencies = [ "alloy-transport-http", "futures", "pin-project", - "reqwest", + "reqwest 0.13.4", "serde", "serde_json", "tokio", @@ -662,9 +673,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "339af7336571dd39ae3a15bde08ae6a647e62f75350bd415832640268af92c06" +checksum = "4faad925d3a669ffc15f43b3deec7fbdf2adeb28a4d6f9cf4bc661698c0f8f4b" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -674,9 +685,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d98fb386a462e143f5efa64350860af39950c49e7c0cbdba419c16793116ef" +checksum = "47df51bedb3e6062cb9981187a51e86d0d64a4de66eb0855e9efe6574b044ddf" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -686,9 +697,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbde0801a32d21c5f111f037bee7e22874836fba7add34ed4a6919932dd7cf23" +checksum = "3823026d1ed239a40f12364fac50726c8daf1b6ab8077a97212c5123910429ed" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -697,9 +708,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "361cd87ead4ba7659bda8127902eda92d17fa7ceb18aba1676f7be10f7222487" +checksum = "59c095f92c4e1ff4981d89e9aa02d5f98c762a1980ab66bec49c44be11349da2" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -713,14 +724,14 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "alloy-serde" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64600fc6c312b7e0ba76f73a381059af044f4f21f43e07f51f1fa76c868fe302" +checksum = "11ece63b89294b8614ab3f483560c08d016930f842bf36da56bf0b764a15c11e" dependencies = [ "alloy-primitives", "serde", @@ -729,9 +740,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5772858492b26f780468ae693405f895d6a27dea6e3eab2c36b6217de47c2647" +checksum = "43f447aefab0f1c0649f71edc33f590992d4e122bc35fb9cdbbf67d4421ace85" dependencies = [ "alloy-primitives", "async-trait", @@ -739,14 +750,14 @@ dependencies = [ "either", "elliptic-curve 0.13.8", "k256", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "alloy-signer-local" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4195b803d0a992d8dbaab2ca1986fc86533d4bc80967c0cce7668b26ad99ef9" +checksum = "f721f4bf2e4812e5505aaf5de16ef3065a8e26b9139ac885862d00b5a55a659a" dependencies = [ "alloy-consensus", "alloy-network", @@ -754,8 +765,8 @@ dependencies = [ "alloy-signer", "async-trait", "k256", - "rand 0.8.6", - "thiserror 2.0.18", + "rand 0.8.8", + "thiserror 2.0.20", ] [[package]] @@ -782,7 +793,7 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.12.1", + "indexmap 2.14.1", "proc-macro-error2", "proc-macro2", "quote", @@ -816,7 +827,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" dependencies = [ "serde", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -833,12 +844,11 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "025a940182bddaeb594c26fe3728525ae262d0806fe6a4befdf5d7bc13d54bce" +checksum = "8098f965442a9feb620965ba4b4be5e2b320f4ec5a3fff6bfa9e1ff7ef42bed1" dependencies = [ "alloy-json-rpc", - "alloy-primitives", "auto_impl", "base64 0.22.1", "derive_more", @@ -847,7 +857,7 @@ dependencies = [ "parking_lot", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", "tokio", "tower", "tracing", @@ -857,13 +867,14 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.41" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5064d1e1e1aabc918b5954e7fb8154c39e77ec6903a581b973198b26628fa" +checksum = "e8597d36d546e1dab822345ad563243ec3920e199322cb554ce56c8ef1a1e2e7" dependencies = [ "alloy-json-rpc", "alloy-transport", - "reqwest", + "itertools 0.14.0", + "reqwest 0.13.4", "serde_json", "tower", "tracing", @@ -872,27 +883,27 @@ dependencies = [ [[package]] name = "alloy-trie" -version = "0.9.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3412d52bb97c6c6cc27ccc28d4e6e8cf605469101193b50b0bd5813b1f990b5" +checksum = "3f14b5d9b2c2173980202c6ff470d96e7c5e202c65a9f67884ad565226df7fbb" dependencies = [ "alloy-primitives", "alloy-rlp", - "arrayvec", "derive_more", "nybbles", "serde", "smallvec", + "thiserror 2.0.20", "tracing", ] [[package]] name = "alloy-tx-macros" -version = "1.0.42" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab54221eccefa254ce9f65b079c097b1796e48c21c7ce358230f8988d75392fb" +checksum = "d69722eddcdf1ce096c3ab66cf8116999363f734eb36fe94a148f4f71c85da84" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "proc-macro2", "quote", "syn 2.0.119", @@ -900,9 +911,9 @@ dependencies = [ [[package]] name = "android_system_properties" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" dependencies = [ "libc", ] @@ -939,9 +950,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" @@ -1075,7 +1086,7 @@ dependencies = [ "fnv", "hashbrown 0.15.5", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", "zeroize", @@ -1092,7 +1103,7 @@ dependencies = [ "ark-serialize 0.3.0", "ark-std 0.3.0", "derivative", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "rustc_version 0.3.3", @@ -1112,7 +1123,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools 0.10.5", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "rustc_version 0.4.1", @@ -1133,12 +1144,29 @@ dependencies = [ "digest 0.10.7", "educe", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint 0.4.8", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -1169,13 +1197,23 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.119", +] + [[package]] name = "ark-ff-macros" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-traits", "quote", "syn 1.0.109", @@ -1187,7 +1225,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-traits", "proc-macro2", "quote", @@ -1200,7 +1238,20 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint 0.4.8", "num-traits", "proc-macro2", "quote", @@ -1261,7 +1312,7 @@ dependencies = [ "ark-relations", "ark-std 0.5.0", "educe", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", "tracing", @@ -1298,7 +1349,7 @@ dependencies = [ "ark-serialize-derive 0.4.2", "ark-std 0.4.0", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.8", ] [[package]] @@ -1311,7 +1362,20 @@ dependencies = [ "ark-std 0.5.0", "arrayvec", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.8", +] + +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint 0.4.8", + "serde_with", ] [[package]] @@ -1336,6 +1400,17 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + [[package]] name = "ark-snark" version = "0.5.1" @@ -1355,7 +1430,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.8", ] [[package]] @@ -1365,7 +1440,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.8", ] [[package]] @@ -1375,7 +1450,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.8", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.8", ] [[package]] @@ -1386,12 +1471,9 @@ checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -dependencies = [ - "serde", -] +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "ascii-canvas" @@ -1447,9 +1529,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.3" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", @@ -1494,11 +1576,11 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.4.1" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.4.2", "event-listener-strategy", "pin-project-lite", ] @@ -1525,16 +1607,16 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.4.1", + "event-listener 5.4.2", "futures-lite", "rustix", ] [[package]] name = "async-signal" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" dependencies = [ "async-io", "async-lock", @@ -1606,13 +1688,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -1634,15 +1716,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-credential-types" -version = "1.2.10" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01c9521fa01558f750d183c8c68c81b0155b9d193a4ba7f84c36bd1b6d04a06" +checksum = "e26bbf46abc608f2dc61fd6cb3b7b0665497cc259a21520151ed98f8b37d2c79" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -1652,9 +1734,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.15.1" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b5ce75405893cd713f9ab8e297d8e438f624dde7d706108285f7e17a25a180f" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" dependencies = [ "aws-lc-sys", "zeroize", @@ -1662,35 +1744,39 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.34.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "179c3777a8b5e70e90ea426114ffc565b2c1a9f82f6c4a0c5a34aa6ef5e781b6" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" dependencies = [ "cc", "cmake", "dunce", "fs_extra", + "pkg-config", ] [[package]] name = "aws-runtime" -version = "1.5.16" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ce527fb7e53ba9626fc47824f25e256250556c40d8f81d27dd92aa38239d632" +checksum = "b0f92058d22a46adf53ec57a6a96f34447daf02bff52e8fb956c66bcd5c6ac12" dependencies = [ "aws-credential-types", "aws-sigv4", "aws-smithy-async", "aws-smithy-eventstream", - "aws-smithy-http", + "aws-smithy-http 0.63.4", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "aws-types", "bytes", + "bytes-utils", "fastrand", "http 0.2.12", + "http 1.5.0", "http-body 0.4.6", + "http-body 1.1.0", "percent-encoding", "pin-project-lite", "tracing", @@ -1699,9 +1785,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.109.0" +version = "1.119.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6d81b75f8ff78882e70c5909804b44553d56136899fb4015a0a68ecc870e0e" +checksum = "1d65fddc3844f902dfe1864acb8494db5f9342015ee3ab7890270d36fbd2e01c" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1709,7 +1795,7 @@ dependencies = [ "aws-smithy-async", "aws-smithy-checksums", "aws-smithy-eventstream", - "aws-smithy-http", + "aws-smithy-http 0.62.6", "aws-smithy-json", "aws-smithy-runtime", "aws-smithy-runtime-api", @@ -1721,7 +1807,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.4.0", + "http 1.5.0", "http-body 0.4.6", "lru 0.12.5", "percent-encoding", @@ -1733,13 +1819,13 @@ dependencies = [ [[package]] name = "aws-sigv4" -version = "1.3.6" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35452ec3f001e1f2f6db107b6373f1f48f05ec63ba2c5c9fa91f07dad32af11" +checksum = "68f6ae9b71597dc5fd115d52849d7a5556ad9265885ad3492ea8d73b93bbc46e" dependencies = [ "aws-credential-types", "aws-smithy-eventstream", - "aws-smithy-http", + "aws-smithy-http 0.63.4", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", @@ -1748,7 +1834,7 @@ dependencies = [ "hex", "hmac", "http 0.2.12", - "http 1.4.0", + "http 1.5.0", "p256", "percent-encoding", "ring", @@ -1761,9 +1847,9 @@ dependencies = [ [[package]] name = "aws-smithy-async" -version = "1.2.6" +version = "1.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" +checksum = "3cba48474f1d6807384d06fec085b909f5807e16653c5af5c45dfe89539f0b70" dependencies = [ "futures-util", "pin-project-lite", @@ -1772,11 +1858,11 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.11" +version = "0.63.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95bd108f7b3563598e4dc7b62e1388c9982324a2abd622442167012690184591" +checksum = "87294a084b43d649d967efe58aa1f9e0adc260e13a6938eb904c0ae9b45824ae" dependencies = [ - "aws-smithy-http", + "aws-smithy-http 0.62.6", "aws-smithy-types", "bytes", "crc-fast", @@ -1785,16 +1871,16 @@ dependencies = [ "http-body 0.4.6", "md-5", "pin-project-lite", - "sha1", + "sha1 0.10.7", "sha2", "tracing", ] [[package]] name = "aws-smithy-eventstream" -version = "0.60.13" +version = "0.60.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29a304f8319781a39808847efb39561351b1bb76e933da7aa90232673638658" +checksum = "1c0b3e587fbaa5d7f7e870544508af8ce82ea47cd30376e69e1e37c4ac746f79" dependencies = [ "aws-smithy-types", "bytes", @@ -1803,9 +1889,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.5" +version = "0.62.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445d5d720c99eed0b4aa674ed00d835d9b1427dd73e04adaf2f94c6b2d6f9fca" +checksum = "826141069295752372f8203c17f28e30c464d22899a43a0c9fd9c458d469c88b" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -1815,7 +1901,7 @@ dependencies = [ "futures-core", "futures-util", "http 0.2.12", - "http 1.4.0", + "http 1.5.0", "http-body 0.4.6", "percent-encoding", "pin-project-lite", @@ -1823,29 +1909,50 @@ dependencies = [ "tracing", ] +[[package]] +name = "aws-smithy-http" +version = "0.63.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4a8a5fe3e4ac7ee871237c340bbce13e982d37543b65700f4419e039f5d78e" +dependencies = [ + "aws-smithy-runtime-api", + "aws-smithy-types", + "bytes", + "bytes-utils", + "futures-core", + "futures-util", + "http 1.5.0", + "http-body 1.1.0", + "http-body-util", + "percent-encoding", + "pin-project-lite", + "pin-utils", + "tracing", +] + [[package]] name = "aws-smithy-http-client" -version = "1.1.4" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623254723e8dfd535f566ee7b2381645f8981da086b5c4aa26c0c41582bb1d2c" +checksum = "0709f0083aa19b704132684bc26d3c868e06bd428ccc4373b0b55c3e8748a58b" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", "h2 0.3.27", - "h2 0.4.12", + "h2 0.4.19", "http 0.2.12", - "http 1.4.0", + "http 1.5.0", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.8.1", + "hyper 1.11.1", "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", + "hyper-rustls 0.27.9", "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.35", - "rustls-native-certs 0.8.2", + "rustls 0.23.43", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", @@ -1855,30 +1962,30 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.61.7" +version = "0.61.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2db31f727935fc63c6eeae8b37b438847639ec330a9161ece694efba257e0c54" +checksum = "49fa1213db31ac95288d981476f78d05d9cbb0353d22cdf3472cc05bb02f6551" dependencies = [ "aws-smithy-types", ] [[package]] name = "aws-smithy-observability" -version = "0.1.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" +checksum = "4d3f39d5bb871aaf461d59144557f16d5927a5248a983a40654d9cf3b9ba183b" dependencies = [ "aws-smithy-runtime-api", ] [[package]] name = "aws-smithy-runtime" -version = "1.9.4" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbe9d018d646b96c7be063dd07987849862b0e6d07c778aad7d93d1be6c1ef0" +checksum = "8fd3dfc18c1ce097cf81fced7192731e63809829c6cbf933c1ec47452d08e1aa" dependencies = [ "aws-smithy-async", - "aws-smithy-http", + "aws-smithy-http 0.63.4", "aws-smithy-http-client", "aws-smithy-observability", "aws-smithy-runtime-api", @@ -1886,9 +1993,10 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "http 1.4.0", + "http 1.5.0", "http-body 0.4.6", - "http-body 1.0.1", + "http-body 1.1.0", + "http-body-util", "pin-project-lite", "pin-utils", "tokio", @@ -1897,15 +2005,15 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.9.2" +version = "1.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec7204f9fd94749a7c53b26da1b961b4ac36bf070ef1e0b94bb09f79d4f6c193" +checksum = "8c55e0837e9b8526f49e0b9bfa9ee18ddee70e853f5bc09c5d11ebceddcb0fec" dependencies = [ "aws-smithy-async", "aws-smithy-types", "bytes", "http 0.2.12", - "http 1.4.0", + "http 1.5.0", "pin-project-lite", "tokio", "tracing", @@ -1914,18 +2022,18 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.4" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f535879a207fce0db74b679cfc3e91a3159c8144d717d55f5832aea9eef46e" +checksum = "576b0d6991c9c32bc14fc340582ef148311f924d41815f641a308b5d11e8e7cd" dependencies = [ "base64-simd", "bytes", "bytes-utils", "futures-core", "http 0.2.12", - "http 1.4.0", + "http 1.5.0", "http-body 0.4.6", - "http-body 1.0.1", + "http-body 1.1.0", "http-body-util", "itoa", "num-integer", @@ -1940,18 +2048,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.12" +version = "0.60.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab77cdd036b11056d2a30a7af7b775789fb024bf216acc13884c6c97752ae56" +checksum = "0ce02add1aa3677d022f8adf81dcbe3046a95f17a1b1e8979c145cd21d3d22b3" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.10" +version = "1.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d79fb68e3d7fe5d4833ea34dc87d2e97d26d3086cb3da660bb6b1f76d98680b6" +checksum = "6c50f3cdf47caa8d01f2be4a6663ea02418e892f9bbfd82c7b9a3a37eaccdd3a" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -1970,7 +2078,7 @@ dependencies = [ "addr2line", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.8.9", "object", "rustc-demangle", "windows-link", @@ -2012,9 +2120,9 @@ dependencies = [ [[package]] name = "base64ct" -version = "1.8.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "basic-cookies" @@ -2066,20 +2174,40 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitcoin-consensus-encoding" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6712f9c6fd6785b3b270884e57c441c403dc5d7e19ca45368c97c7a1de3000ec" +dependencies = [ + "bitcoin-internals", + "hex-conservative 1.2.0", + "serde", +] + +[[package]] +name = "bitcoin-internals" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d573f4cf32996a8dce612e4348cece65a241f1882ed594047c9ba348e8869fa5" + [[package]] name = "bitcoin-io" -version = "0.1.3" +version = "0.1.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" +checksum = "bb5de036369d1ac59d3c1819ebc4d850f89466f5401c571a285b6ed564a4cb78" +dependencies = [ + "bitcoin-consensus-encoding", +] [[package]] name = "bitcoin_hashes" -version = "0.14.0" +version = "0.14.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +checksum = "bca4c7abb40c8817d77403c880988cfd484f23ab2365726afb2f798363e2c4a2" dependencies = [ "bitcoin-io", - "hex-conservative", + "hex-conservative 0.2.3", ] [[package]] @@ -2090,15 +2218,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -2130,11 +2258,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + [[package]] name = "blocking" -version = "1.6.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" dependencies = [ "async-channel 2.5.0", "async-task", @@ -2145,9 +2282,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" +checksum = "c20659f9bbee16cbbd2f7393e40ab6309f5a98f76a2eb57a995ec508b72387fe" dependencies = [ "cc", "glob", @@ -2157,38 +2294,39 @@ dependencies = [ [[package]] name = "bonsai-sdk" -version = "1.4.1" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21055e2f49cbbdbfe9f8f96d597c5527b0c6ab7933341fdc2f147180e48a988e" +checksum = "6fc4edab3bb401344292b3de527d15663b6bbcba76d98485d96b1bd3061c7987" dependencies = [ "duplicate", "maybe-async", - "reqwest", + "reqwest 0.12.22", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "borsh" -version = "1.5.7" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +checksum = "553c5d846a6ba5150c65e3b1b8ec073bcf1abc20f9b7220de384a4443ea4e20a" dependencies = [ "borsh-derive", + "bytes", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "1.5.7" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +checksum = "12cdfe656708a01f89b451a7d36466e6fe6c414de0aa18fc54f864f6f9ca9f56" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -2214,8 +2352,8 @@ dependencies = [ "futures-util", "hex", "httpmock", - "rand 0.9.2", - "reqwest", + "rand 0.9.4", + "reqwest 0.12.22", "risc0-aggregation", "risc0-ethereum-contracts 3.0.1", "risc0-zkvm", @@ -2225,7 +2363,7 @@ dependencies = [ "sha2", "siwe", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.20", "time", "tokio", "tokio-tungstenite", @@ -2237,9 +2375,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.2" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -2248,19 +2386,28 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.0" +version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bumpalo" -version = "3.19.0" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byte-slice-cast" @@ -2279,13 +2426,13 @@ dependencies = [ [[package]] name = "bytemuck_derive" -version = "1.10.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -2296,9 +2443,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] @@ -2315,18 +2462,18 @@ dependencies = [ [[package]] name = "bytestring" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" +checksum = "86566c496f2f47d9b8147a4c8b02ffdb69c919fe0c2b2e7195d22cbba0e635c9" dependencies = [ "bytes", ] [[package]] name = "c-kzg" -version = "2.1.5" +version = "2.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" +checksum = "38d04308254695569fdb9bfe3bacc1c91837a670d0806605eb82d63748fbd3a6" dependencies = [ "blst", "cc", @@ -2339,9 +2486,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.2.1" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +checksum = "bb1307f12aa967b5a58416e87b3653360e0fd614a016b6e970db08fecbb1b80d" dependencies = [ "serde_core", ] @@ -2363,17 +2510,17 @@ checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" dependencies = [ "camino", "cargo-platform", - "semver 1.0.27", + "semver 1.0.28", "serde", "serde_json", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "cc" -version = "1.2.47" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" dependencies = [ "find-msvc-tools", "jobserver", @@ -2389,15 +2536,26 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "chacha20" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", +] [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -2449,9 +2607,9 @@ checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cmake" -version = "0.1.54" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -2462,14 +2620,14 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "concurrent-queue" @@ -2482,12 +2640,12 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.17.0" +version = "1.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "proptest", "serde_core", ] @@ -2498,13 +2656,20 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -2518,6 +2683,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "cookie" version = "0.16.2" @@ -2575,20 +2749,29 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + [[package]] name = "crc" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" +checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc-fast" @@ -2598,25 +2781,25 @@ checksum = "6ddc2d09feefeee8bd78101665bd8645637828fa9317f9f292496dbbd8c65ff3" dependencies = [ "crc", "digest 0.10.7", - "rand 0.9.2", + "rand 0.9.4", "regex", "rustversion", ] [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -2624,18 +2807,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -2677,6 +2860,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + [[package]] name = "darling" version = "0.20.11" @@ -2689,12 +2881,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -2713,11 +2905,10 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", @@ -2739,20 +2930,20 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.21.3", + "darling_core 0.23.0", "quote", "syn 2.0.119", ] [[package]] name = "dashmap" -version = "6.1.0" +version = "6.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" dependencies = [ "cfg-if", "crossbeam-utils", @@ -2764,38 +2955,68 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.9.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" +checksum = "4583a4551df46e2792f82ceeac45e850d2e2d5debba0b91f102385cda5b11f06" [[package]] -name = "der" -version = "0.6.1" +name = "defmt" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" dependencies = [ - "const-oid", - "zeroize", + "bitflags 1.3.2", + "defmt-macros", ] [[package]] -name = "der" -version = "0.7.10" +name = "defmt-macros" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "deranged" -version = "0.5.5" +name = "defmt-parser" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", +] + +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid 0.9.6", + "zeroize", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid 0.9.6", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -2843,21 +3064,23 @@ dependencies = [ [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ + "convert_case", "proc-macro2", "quote", + "rustc_version 0.4.1", "syn 2.0.119", "unicode-xid", ] @@ -2877,12 +3100,23 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.6", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid 0.10.2", + "crypto-common 0.2.2", +] + [[package]] name = "dirs" version = "6.0.0" @@ -2927,13 +3161,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -2985,8 +3219,8 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "e3-bfv-client" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "anyhow", "e3-fhe-params", @@ -2994,14 +3228,14 @@ dependencies = [ "e3-zk-helpers", "fhe", "fhe-traits", - "rand 0.9.2", + "rand 0.9.4", "thiserror 1.0.69", ] [[package]] name = "e3-compute-provider" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -3011,7 +3245,7 @@ dependencies = [ "hex", "lean-imt", "light-poseidon", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "sha2", @@ -3022,17 +3256,17 @@ dependencies = [ [[package]] name = "e3-fhe-params" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "alloy-dyn-abi", "alloy-primitives", "anyhow", "clap", "fhe", - "num-bigint", + "num-bigint 0.5.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "thiserror 1.0.69", @@ -3040,10 +3274,10 @@ dependencies = [ [[package]] name = "e3-parity-matrix" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -3051,11 +3285,11 @@ dependencies = [ [[package]] name = "e3-polynomial" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "fhe-math", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -3063,8 +3297,8 @@ dependencies = [ [[package]] name = "e3-safe" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", @@ -3084,7 +3318,7 @@ dependencies = [ "e3-support-types", "env_logger", "hex", - "reqwest", + "reqwest 0.12.22", "serde", "serde_json", "tokio", @@ -3112,7 +3346,7 @@ dependencies = [ "hex", "log", "methods", - "rand 0.9.2", + "rand 0.9.4", "risc0-ethereum-contracts 3.0.0", "risc0-zkvm", "serde", @@ -3147,8 +3381,8 @@ dependencies = [ [[package]] name = "e3-zk-helpers" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "anyhow", "ark-bn254 0.5.0", @@ -3164,10 +3398,10 @@ dependencies = [ "hex", "itertools 0.14.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-integer", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rayon", "serde", "serde_json", @@ -3216,9 +3450,9 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" dependencies = [ "serde", ] @@ -3283,9 +3517,9 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] name = "ena" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +checksum = "eabffdaee24bd1bf95c5ef7cec31260444317e72ea56c4c91750e8b7ee58d5f1" dependencies = [ "log", ] @@ -3301,22 +3535,22 @@ dependencies = [ [[package]] name = "enum-ordinalize" -version = "4.3.2" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +checksum = "89dd01549b09589510cf0647475075d12071456586d70f5c75c98ae2a5537677" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.2" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +checksum = "a65863d15a4ce2888bd2f0f543cc963d3879c3a022c8ee43f6141d479a3ac815" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -3342,26 +3576,6 @@ dependencies = [ "log", ] -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -3380,9 +3594,9 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" [[package]] name = "event-listener" @@ -3392,11 +3606,10 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.4.1" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ - "concurrent-queue", "parking", "pin-project-lite", ] @@ -3407,15 +3620,15 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.4.2", "pin-project-lite", ] [[package]] name = "fastrand" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "fastrlp" @@ -3461,82 +3674,80 @@ dependencies = [ [[package]] name = "fhe" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "bincode", "doc-comment", "fhe-math", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "prost 0.14.4", "prost-build", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_distr", "rayon", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", "zeroize_derive", ] [[package]] name = "fhe-math" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "ethnum", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-bigint-dig 0.9.1", "num-traits", "prost 0.14.4", "prost-build", "pulp", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "sha2", - "tfhe-ntt", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", ] [[package]] name = "fhe-traits" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", ] [[package]] name = "fhe-util" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "num-bigint-dig 0.9.1", "num-traits", "prime_factorization", - "rand 0.8.6", - "rand 0.9.2", + "rand 0.9.4", "rand_distr", "rayon", ] [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "fixed-hash" @@ -3545,7 +3756,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.6", + "rand 0.8.8", "rustc-hex", "static_assertions", ] @@ -3564,12 +3775,13 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.5" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.9.1", + "zlib-rs", ] [[package]] @@ -3611,13 +3823,13 @@ dependencies = [ [[package]] name = "foreign-types-macros" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -3655,9 +3867,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" dependencies = [ "futures-channel", "futures-core", @@ -3670,9 +3882,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", "futures-sink", @@ -3680,15 +3892,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" dependencies = [ "futures-core", "futures-task", @@ -3697,9 +3909,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" [[package]] name = "futures-lite" @@ -3716,32 +3928,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-channel", "futures-core", @@ -3751,7 +3963,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -3774,9 +3985,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", @@ -3792,10 +4003,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", - "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", "wasm-bindgen", ] @@ -3807,9 +4030,9 @@ checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" [[package]] name = "gloo-timers" @@ -3857,7 +4080,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.12.1", + "indexmap 2.14.1", "slab", "tokio", "tokio-util", @@ -3866,17 +4089,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.4.0", - "indexmap 2.12.1", + "http 1.5.0", + "indexmap 2.14.1", "slab", "tokio", "tokio-util", @@ -3921,11 +4144,19 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ + "allocator-api2", + "equivalent", "foldhash 0.2.0", "serde", "serde_core", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "hashlink" version = "0.10.0" @@ -3943,9 +4174,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" [[package]] name = "hex" @@ -3955,9 +4186,18 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hex-conservative" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +checksum = "db3fef046dca3ca91ee1408a8c1b80ab777e80a4d308d1bf4e7adb3fcb047e08" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "hex-conservative" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35431185f361ccf3ffc58254628af5f1f5d5f28531da2e02e5d6c82bbc282a10" dependencies = [ "arrayvec", ] @@ -3990,9 +4230,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -4011,24 +4251,24 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.4.0", + "http 1.5.0", ] [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", - "http 1.4.0", - "http-body 1.0.1", + "http 1.5.0", + "http-body 1.1.0", "pin-project-lite", ] @@ -4072,6 +4312,15 @@ dependencies = [ "url", ] +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" version = "0.14.32" @@ -4098,21 +4347,20 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2 0.4.12", - "http 1.4.0", - "http-body 1.0.1", + "h2 0.4.19", + "http 1.5.0", + "http-body 1.1.0", "httparse", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -4129,23 +4377,21 @@ dependencies = [ "hyper 0.14.32", "log", "rustls 0.21.12", - "rustls-native-certs 0.6.3", "tokio", "tokio-rustls 0.24.1", ] [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.4.0", - "hyper 1.8.1", + "http 1.5.0", + "hyper 1.11.1", "hyper-util", - "rustls 0.23.35", - "rustls-native-certs 0.8.2", - "rustls-pki-types", + "rustls 0.23.43", + "rustls-native-certs", "tokio", "tokio-rustls 0.26.4", "tower-service", @@ -4160,7 +4406,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.8.1", + "hyper 1.11.1", "hyper-util", "native-tls", "tokio", @@ -4170,23 +4416,22 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.18" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", - "futures-core", "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "hyper 1.8.1", + "http 1.5.0", + "http-body 1.1.0", + "hyper 1.11.1", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.5", "system-configuration", "tokio", "tower-service", @@ -4196,9 +4441,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -4220,12 +4465,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -4233,9 +4479,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", @@ -4246,9 +4492,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -4260,16 +4506,17 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" [[package]] name = "icu_properties" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" dependencies = [ + "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", @@ -4280,15 +4527,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" dependencies = [ "displaydoc", "icu_locale_core", @@ -4318,9 +4565,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -4371,38 +4618,38 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.12.1" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "serde", "serde_core", ] [[package]] name = "io-uring" -version = "0.7.11" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd7bddefd0a8833b88a4b68f90dae22c7450d11b354198baee3874fd811b344" +checksum = "d64d8ca234d152948ceaede1f419b6a83983a5ecccaac05fb337a809c96d3aa6" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "cfg-if", "libc", ] [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" [[package]] name = "iri-string" -version = "0.7.9" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +checksum = "1663ee7d8cf2900cc1414b1e1eec9f348d6eaa3bcab07579f4726a4b8499f447" dependencies = [ "memchr", "serde", @@ -4450,53 +4697,92 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.16" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" dependencies = [ + "defmt", + "jiff-core", "jiff-static", + "jiff-tzdb-platform", "log", "portable-atomic", "portable-atomic-util", "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", ] [[package]] name = "jiff-static" -version = "0.2.16" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" dependencies = [ + "jiff-core", "proc-macro2", "quote", "syn 2.0.119", ] +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.82" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ - "once_cell", + "cfg-if", + "futures-util", "wasm-bindgen", ] @@ -4516,23 +4802,38 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] name = "keccak-asm" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" dependencies = [ "digest 0.10.7", "sha3-asm", ] +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "kv-log-macro" version = "1.0.7" @@ -4581,9 +4882,9 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy-regex" -version = "3.4.2" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "191898e17ddee19e60bccb3945aa02339e81edd4a8c50e21fd4d48cdecda7b29" +checksum = "4994ba703f78b083e2f7946dac9251abd83fd43a0365f030e99b69be5b4b9ef9" dependencies = [ "lazy-regex-proc_macros", "once_cell", @@ -4592,9 +4893,9 @@ dependencies = [ [[package]] name = "lazy-regex-proc_macros" -version = "3.4.2" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35dc8b0da83d1a9507e12122c80dea71a9c7c613014347392483a83ea593e04" +checksum = "fd97232314824e6dbef1918a871bb93f51070455e3715bf26e19a6d01aa977a0" dependencies = [ "proc-macro2", "quote", @@ -4628,23 +4929,22 @@ checksum = "db13adb97ab515a3691f56e4dbab09283d0b86cb45abd991d8634a9d6f501760" [[package]] name = "libc" -version = "0.2.177" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.10" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +checksum = "8d8f1ea3f21fd3405dcaf6c9b5c1630af9afc422d9073ea39c5f6d6c772e08ed" dependencies = [ - "bitflags 2.10.0", "libc", ] @@ -4656,21 +4956,21 @@ checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", - "num-bigint", + "num-bigint 0.4.8", "thiserror 1.0.69", ] [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "local-channel" @@ -4718,11 +5018,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.13.0" +version = "0.16.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "227748d55f2f0ab4735d87fd623798cb6b664512fe979705f829c9f81c934465" +checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", ] [[package]] @@ -4762,9 +5062,9 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +checksum = "3f607c237553f086e7043417a51df26b2eb899d3caff94e6a67592ff992fedc7" dependencies = [ "autocfg", "rawpointer", @@ -4772,9 +5072,9 @@ dependencies = [ [[package]] name = "maybe-async" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" +checksum = "746873a384ad60adc5db74471dfaba74bd278afbdcfd81db93fafcdfc8b5ca0c" dependencies = [ "proc-macro2", "quote", @@ -4793,9 +5093,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "merlin" @@ -4815,7 +5115,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -4858,6 +5158,15 @@ name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" dependencies = [ "adler2", "simd-adler32", @@ -4865,9 +5174,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.0" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -4883,9 +5192,9 @@ checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] name = "native-tls" -version = "0.2.14" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +checksum = "465500e14ea162429d264d44189adc38b199b62b1c21eea9f69e4b73cb03bbf2" dependencies = [ "libc", "log", @@ -4893,7 +5202,7 @@ dependencies = [ "openssl-probe", "openssl-sys", "schannel", - "security-framework 2.11.1", + "security-framework", "security-framework-sys", "tempfile", ] @@ -4941,7 +5250,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-complex", "num-integer", "num-iter", @@ -4951,13 +5260,24 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" dependencies = [ "num-integer", "num-traits", - "rand 0.8.6", + "rand 0.9.4", + "rand_core 0.9.5", "serde", ] @@ -4972,7 +5292,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.6", + "rand 0.8.8", "smallvec", "zeroize", ] @@ -4988,7 +5308,7 @@ dependencies = [ "num-iter", "num-traits", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "serde", "smallvec", ] @@ -5005,26 +5325,25 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" -version = "0.1.46" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" dependencies = [ "num-traits", ] [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -5035,7 +5354,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", ] @@ -5062,9 +5381,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", "rustversion", @@ -5072,9 +5391,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ "proc-macro2", "quote", @@ -5083,9 +5402,9 @@ dependencies = [ [[package]] name = "nybbles" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4b5ecbd0beec843101bffe848217f770e8b8da81d8355b7d6e226f2199b3dc" +checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" dependencies = [ "alloy-rlp", "cfg-if", @@ -5115,9 +5434,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -5127,15 +5446,14 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.75" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "cfg-if", "foreign-types 0.3.2", "libc", - "once_cell", "openssl-macros", "openssl-sys", ] @@ -5153,15 +5471,15 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -5272,9 +5590,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.4" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" dependencies = [ "memchr", "ucd-trie", @@ -5287,7 +5605,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.12.1", + "indexmap 2.14.1", ] [[package]] @@ -5298,7 +5616,7 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset 0.5.7", "hashbrown 0.15.5", - "indexmap 2.12.1", + "indexmap 2.14.1", ] [[package]] @@ -5318,18 +5636,18 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", @@ -5338,9 +5656,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -5350,9 +5668,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", "fastrand", @@ -5392,9 +5710,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "polling" @@ -5412,15 +5730,15 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.11.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] @@ -5439,9 +5757,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -5485,7 +5803,7 @@ checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" dependencies = [ "itertools 0.10.5", "num", - "rand 0.8.6", + "rand 0.8.8", ] [[package]] @@ -5501,11 +5819,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.7", + "toml_edit 0.25.13+spec-1.1.0", ] [[package]] @@ -5553,15 +5871,15 @@ dependencies = [ [[package]] name = "proptest" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", - "bitflags 2.10.0", + "bitflags 2.13.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -5646,9 +5964,9 @@ dependencies = [ [[package]] name = "pulp" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" dependencies = [ "bytemuck", "cfg-if", @@ -5663,9 +5981,9 @@ dependencies = [ [[package]] name = "pulp-wasm-simd-flag" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" [[package]] name = "quick-error" @@ -5675,9 +5993,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", @@ -5685,9 +6003,9 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.35", - "socket2 0.6.1", - "thiserror 2.0.18", + "rustls 0.23.43", + "socket2 0.6.5", + "thiserror 2.0.20", "tokio", "tracing", "web-time", @@ -5695,20 +6013,21 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "04759210543be93709136e28212294a659ef5001836ff4eab4d663e4529bba83" dependencies = [ "bytes", - "getrandom 0.3.4", + "getrandom 0.4.3", "lru-slab", - "rand 0.9.2", + "rand 0.10.2", + "rand_pcg", "ring", "rustc-hash", - "rustls 0.23.35", + "rustls 0.23.43", "rustls-pki-types", "slab", - "thiserror 2.0.18", + "thiserror 2.0.20", "tinyvec", "tracing", "web-time", @@ -5716,16 +6035,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.6.5", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -5741,7 +6060,13 @@ dependencies = [ name = "r-efi" version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "radium" @@ -5751,9 +6076,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -5763,15 +6088,26 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", "serde", ] +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -5789,7 +6125,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -5798,19 +6134,25 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", "serde", ] +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + [[package]] name = "rand_distr" version = "0.5.1" @@ -5818,7 +6160,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.2", + "rand 0.9.4", +] + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", ] [[package]] @@ -5827,7 +6178,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -5836,7 +6187,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", ] [[package]] @@ -5877,7 +6228,7 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", ] [[package]] @@ -5886,7 +6237,7 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", "thiserror 1.0.69", ] @@ -5897,36 +6248,36 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", "libredox", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] name = "ref-cast" -version = "1.0.25" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.25" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] name = "regex" -version = "1.12.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -5936,9 +6287,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -5947,15 +6298,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -5969,12 +6320,12 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.4.12", - "http 1.4.0", - "http-body 1.0.1", + "h2 0.4.19", + "http 1.5.0", + "http-body 1.1.0", "http-body-util", - "hyper 1.8.1", - "hyper-rustls 0.27.7", + "hyper 1.11.1", + "hyper-rustls 0.27.9", "hyper-tls", "hyper-util", "js-sys", @@ -5985,7 +6336,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.35", + "rustls 0.23.43", "rustls-pki-types", "serde", "serde_json", @@ -6006,6 +6357,37 @@ dependencies = [ "webpki-roots", ] +[[package]] +name = "reqwest" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "http 1.5.0", + "http-body 1.1.0", + "http-body-util", + "hyper 1.11.1", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "sync_wrapper", + "tokio", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "rfc6979" version = "0.3.1" @@ -6035,7 +6417,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "libc", "untrusted", "windows-sys 0.52.0", @@ -6055,7 +6437,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -6071,11 +6453,11 @@ dependencies = [ "elf", "lazy_static", "postcard", - "rand 0.9.2", + "rand 0.9.4", "risc0-zkp", "risc0-zkvm-platform", "ruint", - "semver 1.0.27", + "semver 1.0.28", "serde", "tracing", ] @@ -6097,7 +6479,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm-platform", "rzup", - "semver 1.0.27", + "semver 1.0.28", "serde", "serde_json", "stability", @@ -6164,12 +6546,12 @@ dependencies = [ [[package]] name = "risc0-core" -version = "3.0.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f2723fedace48c6c5a505bd8f97ac4e1712bc4cb769083e10536d862b66987" +checksum = "d6eb2d2b2c6cac0e43cbb2202daacee1a2f24d0dfa03fd08887a11dc6defdcc1" dependencies = [ "bytemuck", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -6182,7 +6564,7 @@ dependencies = [ "anyhow", "cfg-if", "risc0-zkvm", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -6201,7 +6583,7 @@ dependencies = [ "risc0-aggregation", "risc0-zkvm", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "tracing", ] @@ -6219,7 +6601,7 @@ dependencies = [ "ark-serialize 0.5.0", "bytemuck", "hex", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "risc0-binfmt", "risc0-zkp", @@ -6228,9 +6610,9 @@ dependencies = [ [[package]] name = "risc0-zkos-v1compat" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf1f35f2ef61d8d86fdd06288c11d2f3bbf08f1af66b24ca0a1976ecbf324a1" +checksum = "b8b0b598ba7946354b10ca5c56e382de801e6c7fce9fccad0396ec436bc5072b" dependencies = [ "include_bytes_aligned", "no_std_strings", @@ -6253,7 +6635,7 @@ dependencies = [ "hex-literal", "metal", "paste", - "rand_core 0.9.3", + "rand_core 0.9.5", "risc0-core", "risc0-zkvm-platform", "serde", @@ -6290,7 +6672,7 @@ dependencies = [ "risc0-zkvm-platform", "rrs-lib", "rzup", - "semver 1.0.27", + "semver 1.0.28", "serde", "sha2", "stability", @@ -6300,13 +6682,13 @@ dependencies = [ [[package]] name = "risc0-zkvm-platform" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfaa10feba15828c788837ddde84b994393936d8f5715228627cfe8625122a40" +checksum = "2eb37a97ff7e8e4ee1b2a1c43ec143b4887759883c343507af9e4787a57914cd" dependencies = [ "bytemuck", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "getrandom 0.3.4", "libm", "num_enum", @@ -6326,22 +6708,19 @@ dependencies = [ [[package]] name = "rmp" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +checksum = "4ba8be72d372b2c9b35542551678538b562e7cf86c3315773cae48dfbfe7790c" dependencies = [ - "byteorder", "num-traits", - "paste", ] [[package]] name = "rmp-serde" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +checksum = "72f81bee8c8ef9b577d1681a70ebbc962c232461e397b22c208c43c04b67a155" dependencies = [ - "byteorder", "rmp", "serde", ] @@ -6358,11 +6737,11 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.9" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ - "const-oid", + "const-oid 0.9.6", "digest 0.10.7", "num-bigint-dig 0.8.6", "num-integer", @@ -6378,26 +6757,27 @@ dependencies = [ [[package]] name = "ruint" -version = "1.17.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" +checksum = "f5e99bff0393163bb25029a6af25d3d8d202ba5b5438a74d1bd8789f5c822970" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "ark-ff 0.5.0", + "ark-ff 0.6.0", "borsh", "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.6", - "rand 0.9.2", + "rand 0.8.8", + "rand 0.9.4", "rlp", "ruint-macro", "serde_core", @@ -6413,15 +6793,15 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc-hex" @@ -6444,16 +6824,16 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.27", + "semver 1.0.28", ] [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys", @@ -6474,57 +6854,36 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.8", + "rustls-webpki 0.103.15", "subtle", "zeroize", ] [[package]] name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "schannel", - "security-framework 2.11.1", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.5.1", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", + "security-framework", ] [[package]] name = "rustls-pki-types" -version = "1.13.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "web-time", "zeroize", @@ -6542,9 +6901,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.8" +version = "0.103.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" dependencies = [ "aws-lc-rs", "ring", @@ -6554,9 +6913,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rusty-fork" @@ -6572,25 +6931,25 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "rzup" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d2aed296f203fa64bcb4b52069356dd86d6ec578593985b919b6995bee1f0ae" +checksum = "96909a7ea8fdf7e18da727d7facbc43eea8a4f77635e7ec75a69794dede16fb6" dependencies = [ "hex", "rsa", - "semver 1.0.27", + "semver 1.0.28", "serde", "serde_with", "sha2", "strum", "tempfile", - "thiserror 2.0.18", + "thiserror 2.0.20", "toml", "yaml-rust2", ] @@ -6606,9 +6965,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -6627,9 +6986,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.1.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9558e172d4e8533736ba97870c4b2cd63f84b382a3d6eb063da41b91cce17289" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" dependencies = [ "dyn-clone", "ref-cast", @@ -6689,7 +7048,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" dependencies = [ "bitcoin_hashes", - "rand 0.8.6", + "rand 0.8.8", "secp256k1-sys", "serde", ] @@ -6705,24 +7064,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.10.0", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.5.1" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -6731,9 +7077,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -6750,9 +7096,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", @@ -6812,9 +7158,9 @@ dependencies = [ [[package]] name = "serde_regex" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" +checksum = "bafc8d0c5330cecff10f16b459b479fd9acaa5b4acd7167301414e21b0057012" dependencies = [ "regex", "serde", @@ -6843,19 +7189,20 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.1" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" dependencies = [ "base64 0.22.1", + "bs58", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.12.1", + "indexmap 2.14.1", + "jiff", "schemars 0.9.0", - "schemars 1.1.0", - "serde", - "serde_derive", + "schemars 1.2.2", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -6863,11 +7210,11 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.1" +version = "3.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" +checksum = "8705578779c2b6bd90d84d66eb2e206b708b1a4d7b9f17641b293545bf1c7e46" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "proc-macro2", "quote", "syn 2.0.119", @@ -6885,15 +7232,26 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "a978451301f4db1d02937a4ab3ccce137717b81826e79b7d49ffe3244a13c3b8" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "digest 0.11.3", +] + [[package]] name = "sha2" version = "0.10.9" @@ -6901,7 +7259,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -6917,9 +7275,9 @@ dependencies = [ [[package]] name = "sha3-asm" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +checksum = "a6287fd675f713484342a89cbf0a386abef5f15919cfad607e5e1f19e1e15331" dependencies = [ "cc", "cfg-if", @@ -6936,16 +7294,17 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" -version = "1.4.7" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -6971,9 +7330,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.7" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "similar" @@ -6983,9 +7342,9 @@ checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "siwe" @@ -6994,10 +7353,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95bdefc0eedf06440b27092fbfe33f2cb493ad6a3423aa12cfe7f2aac44bd618" dependencies = [ "hex", - "http 1.4.0", + "http 1.5.0", "iri-string", "k256", - "rand 0.8.6", + "rand 0.8.8", "serde", "sha3", "thiserror 1.0.69", @@ -7006,15 +7365,15 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" dependencies = [ "serde", ] @@ -7031,19 +7390,19 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" [[package]] name = "spki" @@ -7154,11 +7513,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn-solidity" -version = "1.4.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" +checksum = "4c6415502cd1e9ed58b3ceb415164b812d5572757b1a6f0e280ae806723c1fab" dependencies = [ "paste", "proc-macro2", @@ -7188,11 +7558,11 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7216,7 +7586,7 @@ dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", "ark-std 0.5.0", - "num-bigint", + "num-bigint 0.4.8", "num-traits", ] @@ -7228,12 +7598,12 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", @@ -7250,17 +7620,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "tfhe-ntt" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10650c743ade46b166c698c8349902ed5986784a7db418c51f810bea25f09e3d" -dependencies = [ - "aligned-vec", - "bytemuck", - "pulp", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -7272,11 +7631,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.20", ] [[package]] @@ -7292,20 +7651,20 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] name = "thread_local" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070" dependencies = [ "cfg-if", ] @@ -7321,30 +7680,29 @@ dependencies = [ [[package]] name = "time" -version = "0.3.44" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", - "serde", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.24" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -7361,9 +7719,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", @@ -7371,9 +7729,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "0ba2077be5cd93c7408c849e45a4ab261b59f923f4bcdee2a724b8ed5a175a77" dependencies = [ "tinyvec_macros", ] @@ -7441,15 +7799,15 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.35", + "rustls 0.23.43", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "a3d06f0b082ba57c26b79407372e57cf2a1e28124f78e9479fe80322cf53420b" dependencies = [ "futures-core", "pin-project-lite", @@ -7473,9 +7831,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.17" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ "bytes", "futures-core", @@ -7507,9 +7865,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -7520,33 +7878,33 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.14.1", "serde", "serde_spanned", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.15", ] [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ - "indexmap 2.12.1", - "toml_datetime 0.7.3", + "indexmap 2.14.1", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.4", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow", + "winnow 1.0.4", ] [[package]] @@ -7557,9 +7915,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tower" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", @@ -7572,20 +7930,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.7" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "bytes", "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "iri-string", + "http 1.5.0", + "http-body 1.1.0", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -7602,9 +7960,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -7614,9 +7972,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -7625,9 +7983,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -7686,21 +8044,21 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http 1.4.0", + "http 1.5.0", "httparse", "log", "native-tls", - "rand 0.8.6", - "sha1", + "rand 0.8.8", + "sha1 0.10.7", "thiserror 1.0.69", "utf-8", ] [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -7728,15 +8086,21 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicase" -version = "2.8.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-xid" @@ -7759,6 +8123,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -7781,11 +8146,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "utoipa" -version = "5.4.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" +checksum = "8bde15df68e80b16c7d16b9616e80770ad158988daa56a27dccd1e55558b0160" dependencies = [ - "indexmap 2.12.1", + "indexmap 2.14.1", "serde", "serde_json", "utoipa-gen", @@ -7793,9 +8158,9 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "5.4.0" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d79d08d92ab8af4c5e8a6da20c47ae3f61a0f1dabc1997cdf2d082b757ca08b" +checksum = "6ba0b99ee52df3028635d93840c797102da61f8a7bb3cf751032455895b52ef8" dependencies = [ "proc-macro2", "quote", @@ -7804,9 +8169,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.18.1" +version = "1.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +checksum = "b5772d71c9be8a8a6ac2117d949c5b224c1b72241bb611d9a3012edcf8af7812" dependencies = [ "js-sys", "wasm-bindgen", @@ -7820,9 +8185,9 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "value-bag" -version = "1.12.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" +checksum = "2799ffb329a792ecfd902b71306c8a815a6ef1c0470fa9953a6aa4d4cecbe511" [[package]] name = "vcpkg" @@ -7878,18 +8243,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.1+wasi-0.2.4" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.105" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -7900,22 +8265,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.55" +version = "0.4.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" dependencies = [ - "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.105" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7923,9 +8285,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.105" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", @@ -7936,9 +8298,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.105" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] @@ -7972,9 +8334,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.82" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" dependencies = [ "js-sys", "wasm-bindgen", @@ -7992,9 +8354,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.4" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +checksum = "7dcd9d09a39985f5344844e66b0c530a33843579125f23e21e9f0f220850f22a" dependencies = [ "rustls-pki-types", ] @@ -8106,16 +8468,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", + "windows-targets", ] [[package]] @@ -8133,31 +8486,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -8166,84 +8502,42 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -8251,31 +8545,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" +name = "winnow" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] [[package]] name = "winnow" -version = "0.7.13" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.46.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "wyz" @@ -8305,9 +8602,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -8316,9 +8613,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -8328,18 +8625,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.30" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.30" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", @@ -8348,18 +8645,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -8369,18 +8666,18 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", @@ -8389,9 +8686,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -8400,9 +8697,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ "yoke", "zerofrom", @@ -8411,13 +8708,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -8430,6 +8727,12 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "zlib-rs" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + [[package]] name = "zstd" version = "0.13.3" diff --git a/crates/support/Cargo.toml b/crates/support/Cargo.toml index caf8cff1d3..e9b2758176 100644 --- a/crates/support/Cargo.toml +++ b/crates/support/Cargo.toml @@ -13,7 +13,7 @@ e3-support-app = { path = "./app" } e3-support-host = { path = "./host" } e3-user-program = { path = "./program" } e3-support-types = { path = "./types" } -e3-fhe-params = { git = "https://github.com/theinterfold/interfold", rev = "5b2ca6619a07aec6104f9b877bff948bd976b6cf" } +e3-fhe-params = { git = "https://github.com/theinterfold/interfold", rev = "e559ca209d8ce27b7d97e6a6ce776562fb5294c5" } methods = { path = "./methods" } alloy-primitives = { version = "1.3", default-features = false, features = [ @@ -51,10 +51,10 @@ sha2 = "=0.10.9" # refreshed ImageID.stamp.json. `pnpm check:image-id` asserts that every pin here names one # revision and warns when that revision is not an ancestor of HEAD. # -# Why this revision: 5b2ca661 is the tip of the branch that fixed compute-input binding, and the -# guest has to run that code for the fix to mean anything on chain. +# Why this revision: e559ca209 is the branch tip that contains the current compute-provider and FHE +# dependency sources, and the guest has to run those sources for the fixes to mean anything on chain. # -# It replaces c2097da6, the scope commit of the 2026-08-17 Zenith protocol audit. Sitting at the +# It replaces 5b2ca661, the previous compute-provider pin. Sitting at the # audited baseline read as the conservative choice and was not: the audit covered six Solidity # files and no Rust at all, so crates/compute-provider and the guest were outside its scope, and # outside the mitigation review at c64bcfb8 as well. See packages/interfold-contracts/audits/README.md. @@ -72,7 +72,7 @@ sha2 = "=0.10.9" fhe = { package = "fhe", git = "https://github.com/gnosisguild/fhe.rs", branch = "dev", features = ["experimental-mbfv"] } fhe-traits = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } fhe-util = { git = "https://github.com/gnosisguild/fhe.rs", branch = "dev" } -e3-compute-provider = { git = "https://github.com/theinterfold/interfold", rev = "5b2ca6619a07aec6104f9b877bff948bd976b6cf" } +e3-compute-provider = { git = "https://github.com/theinterfold/interfold", rev = "e559ca209d8ce27b7d97e6a6ce776562fb5294c5" } tokio = { version = "=1.46.1", features = ["full"] } rand = { version = "=0.9.4" } tracing-subscriber = { version = "=0.3.20", features = ["env-filter"] } diff --git a/crates/support/contracts/ImageID.sol b/crates/support/contracts/ImageID.sol index beb9e00702..1085738343 100644 --- a/crates/support/contracts/ImageID.sol +++ b/crates/support/contracts/ImageID.sol @@ -19,5 +19,5 @@ pragma solidity ^0.8.20; library ImageID { - bytes32 public constant PROGRAM_ID = bytes32(0x7ed0ddeb0cafa64228b51399dff5ea00696c2617f28636b05bd67e6c1506eac3); + bytes32 public constant PROGRAM_ID = bytes32(0x5f44d5c11e2baa770fcc097cf37a0425fe4a9817abc39318dfb71ad9808a898b); } diff --git a/crates/support/methods/guest/Cargo.lock b/crates/support/methods/guest/Cargo.lock index 42f60c737f..fc8e8f009d 100644 --- a/crates/support/methods/guest/Cargo.lock +++ b/crates/support/methods/guest/Cargo.lock @@ -16,22 +16,13 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "allocator-api2" version = "0.2.21" @@ -51,7 +42,7 @@ dependencies = [ "itoa", "serde", "serde_json", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -85,19 +76,19 @@ dependencies = [ "keccak-asm", "paste", "proptest", - "rand 0.9.2", + "rand 0.9.4", "ruint", "rustc-hash", "serde", - "sha3", + "sha3 0.10.8", "tiny-keccak", ] [[package]] name = "alloy-rlp" -version = "0.3.12" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f70d83b765fdc080dbcd4f4db70d8d23fe4761f2f02ebfa9146b833900634b4" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" dependencies = [ "arrayvec", "bytes", @@ -105,13 +96,13 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "1.4.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ce480400051b5217f19d6e9a82d9010cdde20f1ae9c00d53591e4a1afbb312" +checksum = "c64558980fb038cd34b4285ec2b36a2a8bd8d4ddd13b3f6e42d97cb5ee29938e" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", - "proc-macro-error2", + "proc-macro-error3", "proc-macro2", "quote", "syn 2.0.119", @@ -119,27 +110,27 @@ dependencies = [ [[package]] name = "alloy-sol-macro-expander" -version = "1.4.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d792e205ed3b72f795a8044c52877d2e6b6e9b1d13f431478121d8d4eaa9028" +checksum = "1ffb0e793abdbaea9d01259493c8272c3af295d03389e70a2acdf53b57ad1edf" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", "indexmap", - "proc-macro-error2", + "proc-macro-error3", "proc-macro2", "quote", + "sha3 0.11.0", "syn 2.0.119", "syn-solidity", - "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.4.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bd1247a8f90b465ef3f1207627547ec16940c35597875cdc09c49d58b19693c" +checksum = "32c2c0ec8425d9663dac939ba75750f17d2933d2f020814b4f8fde4a60da6d26" dependencies = [ "const-hex", "dunce", @@ -158,7 +149,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" dependencies = [ "serde", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -317,7 +308,7 @@ dependencies = [ "fnv", "hashbrown 0.15.5", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", "zeroize", @@ -334,7 +325,7 @@ dependencies = [ "ark-serialize 0.3.0", "ark-std 0.3.0", "derivative", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "rustc_version 0.3.3", @@ -354,7 +345,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools 0.10.5", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "rustc_version 0.4.1", @@ -375,7 +366,7 @@ dependencies = [ "digest 0.10.7", "educe", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "zeroize", @@ -417,7 +408,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-traits", "quote", "syn 1.0.109", @@ -429,7 +420,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-traits", "proc-macro2", "quote", @@ -442,7 +433,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-traits", "proc-macro2", "quote", @@ -503,7 +494,7 @@ dependencies = [ "ark-relations", "ark-std 0.5.0", "educe", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", "tracing", @@ -540,7 +531,7 @@ dependencies = [ "ark-serialize-derive 0.4.2", "ark-std 0.4.0", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.8", ] [[package]] @@ -553,7 +544,7 @@ dependencies = [ "ark-std 0.5.0", "arrayvec", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.8", ] [[package]] @@ -597,7 +588,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.8", ] [[package]] @@ -607,7 +598,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.8", ] [[package]] @@ -617,14 +608,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.8", ] [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "auto_impl" @@ -639,9 +630,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "base16ct" @@ -651,9 +642,9 @@ checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] name = "base64ct" -version = "1.8.0" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bincode" @@ -687,15 +678,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -727,11 +718,20 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + [[package]] name = "borsh" -version = "1.5.7" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +checksum = "553c5d846a6ba5150c65e3b1b8ec073bcf1abc20f9b7220de384a4443ea4e20a" dependencies = [ "borsh-derive", "cfg_aliases", @@ -739,15 +739,15 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.7" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +checksum = "12cdfe656708a01f89b451a7d36466e6fe6c414de0aa18fc54f864f6f9ca9f56" dependencies = [ "once_cell", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -758,22 +758,22 @@ checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.25.0" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +checksum = "fc0e56a716f1e132ff6bf4bdac1c944a3fcdc1cae65f70a4a2a1ac3b401d2d1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -784,18 +784,18 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] [[package]] name = "cc" -version = "1.2.47" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" dependencies = [ "find-msvc-tools", "shlex", @@ -809,9 +809,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" [[package]] name = "clap" @@ -859,7 +859,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.18", + "thiserror 2.0.20", ] [[package]] @@ -870,12 +870,12 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "const-hex" -version = "1.17.0" +version = "1.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +checksum = "33e2a781ebdf4467d1428dc4593067825fb646f6871475098d8577421af73558" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "proptest", "serde_core", ] @@ -888,11 +888,12 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -906,6 +907,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -942,11 +952,20 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -954,18 +973,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -995,6 +1014,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + [[package]] name = "der" version = "0.7.10" @@ -1018,21 +1046,23 @@ dependencies = [ [[package]] name = "derive_more" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" dependencies = [ "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ + "convert_case", "proc-macro2", "quote", + "rustc_version 0.4.1", "syn 2.0.119", "unicode-xid", ] @@ -1052,12 +1082,22 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", - "crypto-common", + "crypto-common 0.1.6", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "crypto-common 0.2.2", +] + [[package]] name = "doc-comment" version = "0.3.4" @@ -1078,8 +1118,8 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "e3-bfv-client" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "anyhow", "e3-fhe-params", @@ -1087,14 +1127,14 @@ dependencies = [ "e3-zk-helpers", "fhe", "fhe-traits", - "rand 0.9.2", + "rand 0.9.4", "thiserror 1.0.69", ] [[package]] name = "e3-compute-provider" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", @@ -1104,28 +1144,28 @@ dependencies = [ "hex", "lean-imt", "light-poseidon", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "sha2", - "sha3", + "sha3 0.10.8", "thiserror 1.0.69", "zk-kit-imt", ] [[package]] name = "e3-fhe-params" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "alloy-dyn-abi", "alloy-primitives", "anyhow", "clap", "fhe", - "num-bigint", + "num-bigint 0.5.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "thiserror 1.0.69", @@ -1133,10 +1173,10 @@ dependencies = [ [[package]] name = "e3-parity-matrix" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -1144,11 +1184,11 @@ dependencies = [ [[package]] name = "e3-polynomial" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "fhe-math", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -1156,13 +1196,13 @@ dependencies = [ [[package]] name = "e3-safe" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", "hex", - "sha3", + "sha3 0.10.8", "taceo-poseidon2", ] @@ -1192,8 +1232,8 @@ dependencies = [ [[package]] name = "e3-zk-helpers" -version = "0.7.0" -source = "git+https://github.com/theinterfold/interfold?rev=5b2ca6619a07aec6104f9b877bff948bd976b6cf#5b2ca6619a07aec6104f9b877bff948bd976b6cf" +version = "0.14.0" +source = "git+https://github.com/theinterfold/interfold?rev=e559ca209d8ce27b7d97e6a6ce776562fb5294c5#e559ca209d8ce27b7d97e6a6ce776562fb5294c5" dependencies = [ "anyhow", "ark-bn254 0.5.0", @@ -1209,10 +1249,10 @@ dependencies = [ "hex", "itertools 0.14.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-integer", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rayon", "serde", "serde_json", @@ -1248,9 +1288,9 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "elf" @@ -1309,26 +1349,6 @@ dependencies = [ "syn 2.0.119", ] -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.119", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -1347,15 +1367,15 @@ dependencies = [ [[package]] name = "ethnum" -version = "1.5.2" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca81e6b4777c89fd810c25a4be2b1bd93ea034fbe58e6a75216a34c6b82c539b" +checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" [[package]] name = "fastrand" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "fastrlp" @@ -1391,82 +1411,80 @@ dependencies = [ [[package]] name = "fhe" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "bincode", "doc-comment", "fhe-math", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "prost", "prost-build", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_distr", "rayon", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", "zeroize_derive", ] [[package]] name = "fhe-math" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "ethnum", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-bigint-dig", "num-traits", "prost", "prost-build", "pulp", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "sha2", - "tfhe-ntt", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", ] [[package]] name = "fhe-traits" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", ] [[package]] name = "fhe-util" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "num-bigint-dig", "num-traits", "prime_factorization", - "rand 0.8.5", - "rand 0.9.2", + "rand 0.9.4", "rand_distr", "rayon", ] [[package]] name = "find-msvc-tools" -version = "0.1.5" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "fixed-hash" @@ -1475,7 +1493,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand 0.8.8", "rustc-hex", "static_assertions", ] @@ -1516,13 +1534,13 @@ dependencies = [ [[package]] name = "foreign-types-macros" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -1550,9 +1568,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "libc", @@ -1567,10 +1585,21 @@ checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", ] +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", +] + [[package]] name = "group" version = "0.13.0" @@ -1625,6 +1654,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "heck" version = "0.5.0" @@ -1652,6 +1687,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "hybrid-array" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +dependencies = [ + "typenum", +] + [[package]] name = "impl-codec" version = "0.6.0" @@ -1680,12 +1724,12 @@ checksum = "4ee796ad498c8d9a1d68e477df8f754ed784ef875de1414ebdaf169f70a6a784" [[package]] name = "indexmap" -version = "2.12.1" +version = "2.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "serde", "serde_core", ] @@ -1723,11 +1767,20 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "k256" @@ -1744,23 +1797,48 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", +] + +[[package]] +name = "keccak" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8f198d1db720e4940b5a493201d199d9f24f568f8f746bd13706243a2f71598" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", ] [[package]] name = "keccak-asm" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" dependencies = [ "digest 0.10.7", "sha3-asm", ] +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "lazy_static" version = "1.5.0" @@ -1781,15 +1859,15 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.177" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "light-poseidon" @@ -1799,27 +1877,27 @@ checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", - "num-bigint", + "num-bigint 0.4.8", "thiserror 1.0.69", ] [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "log" -version = "0.4.28" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "macro-string" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +checksum = "59a9dbbfc75d2688ed057456ce8a3ee3f48d12eec09229f560f3643b9f275653" dependencies = [ "proc-macro2", "quote", @@ -1837,9 +1915,9 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +checksum = "3f607c237553f086e7043417a51df26b2eb899d3caff94e6a67592ff992fedc7" dependencies = [ "autocfg", "rawpointer", @@ -1847,9 +1925,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "merlin" @@ -1858,7 +1936,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", - "keccak", + "keccak 0.1.6", "rand_core 0.6.4", "zeroize", ] @@ -1869,7 +1947,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "block", "core-graphics-types", "foreign-types", @@ -1912,7 +1990,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-complex", "num-integer", "num-iter", @@ -1922,13 +2000,24 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" dependencies = [ "num-integer", "num-traits", - "rand 0.8.5", + "rand 0.9.4", + "rand_core 0.9.5", "serde", ] @@ -1943,7 +2032,7 @@ dependencies = [ "num-iter", "num-traits", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "serde", "smallvec", ] @@ -1960,20 +2049,19 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.46" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" dependencies = [ "num-traits", ] [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -1984,7 +2072,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", ] @@ -2001,9 +2089,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" dependencies = [ "num_enum_derive", "rustversion", @@ -2011,9 +2099,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" dependencies = [ "proc-macro2", "quote", @@ -2031,9 +2119,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -2077,9 +2165,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pest" -version = "2.8.4" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbcfd20a6d4eeba40179f05735784ad32bdaef05ce8e8af05f180d45bb3e7e22" +checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" dependencies = [ "memchr", "ucd-trie", @@ -2098,9 +2186,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkcs8" @@ -2114,9 +2202,9 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" @@ -2166,7 +2254,7 @@ checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" dependencies = [ "itertools 0.10.5", "num", - "rand 0.8.5", + "rand 0.8.8", ] [[package]] @@ -2182,30 +2270,30 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.7", + "toml_edit 0.25.13+spec-1.1.0", ] [[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" +name = "proc-macro-error-attr3" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +checksum = "82366fd7d8b7a440d66d13418820c69df9b3908bcb1a0476d7f5ce5d12f5a04d" dependencies = [ "proc-macro2", "quote", ] [[package]] -name = "proc-macro-error2" -version = "2.0.1" +name = "proc-macro-error3" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +checksum = "b511283ea8a74b4b39447b128c5d00f03a356b7424554b13e298a5550100d9ac" dependencies = [ - "proc-macro-error-attr2", + "proc-macro-error-attr3", "proc-macro2", "quote", "syn 2.0.119", @@ -2222,15 +2310,15 @@ dependencies = [ [[package]] name = "proptest" -version = "1.9.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee689443a2bd0a16ab0348b52ee43e3b2d1b1f931c8aa5c9f8de4c86fbe8c40" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.10.0", + "bitflags 2.13.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -2292,9 +2380,9 @@ dependencies = [ [[package]] name = "pulp" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" dependencies = [ "bytemuck", "cfg-if", @@ -2309,9 +2397,9 @@ dependencies = [ [[package]] name = "pulp-wasm-simd-flag" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" [[package]] name = "quick-error" @@ -2334,6 +2422,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "radium" version = "0.7.0" @@ -2342,9 +2436,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -2353,12 +2447,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.3", + "rand_core 0.9.5", "serde", ] @@ -2379,7 +2473,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -2388,14 +2482,14 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.2.17", ] [[package]] name = "rand_core" -version = "0.9.3" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", "serde", @@ -2408,7 +2502,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] @@ -2417,7 +2511,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] @@ -2426,7 +2520,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", ] [[package]] @@ -2463,9 +2557,9 @@ checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" [[package]] name = "regex" -version = "1.12.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -2475,9 +2569,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -2486,9 +2580,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "rfc6979" @@ -2502,9 +2596,9 @@ dependencies = [ [[package]] name = "risc0-binfmt" -version = "3.0.3" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dca096030bb4c52f99b12abcfe3531ea93b17b95a12a5aeb06fbf8ee588a275" +checksum = "d836c6ad82f4ced7c61d5feedf905a17780312e393aa681d29cc0bbc5131672b" dependencies = [ "anyhow", "borsh", @@ -2513,20 +2607,20 @@ dependencies = [ "elf", "lazy_static", "postcard", - "rand 0.9.2", + "rand 0.9.4", "risc0-zkp", "risc0-zkvm-platform", "ruint", - "semver 1.0.27", + "semver 1.0.28", "serde", "tracing", ] [[package]] name = "risc0-circuit-keccak" -version = "4.0.3" +version = "4.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1d23ef3648bb85b0bd37bc9f9f7d13f1a4388e5e779e18f7eea82b969e5dbc" +checksum = "7c731e12429eb4457e1ddc69c56ee7343a1e10b86e4aa55bc8f4d2b13734abb9" dependencies = [ "anyhow", "bytemuck", @@ -2540,9 +2634,9 @@ dependencies = [ [[package]] name = "risc0-circuit-recursion" -version = "4.0.3" +version = "4.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "028cd26e1b1f7bdd964d2f1eac8f812d1872b6b8fd24f10804f07d916b90000e" +checksum = "40dd640122abcc67d4d4e4f055c68cbc3ad2efb8589c65c2b23d354632971b60" dependencies = [ "anyhow", "bytemuck", @@ -2555,9 +2649,9 @@ dependencies = [ [[package]] name = "risc0-circuit-rv32im" -version = "4.0.3" +version = "4.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ecd73a71ddce62eab8a28552ee182dc2ea08cdce2a3474a616a80bf2d6e9be" +checksum = "cb11231aa4b74bcc0c8d16597893fbd7ea6f6a9ebbc35e16bfd06b467c7ee104" dependencies = [ "anyhow", "bit-vec", @@ -2573,19 +2667,19 @@ dependencies = [ [[package]] name = "risc0-core" -version = "3.0.0" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80f2723fedace48c6c5a505bd8f97ac4e1712bc4cb769083e10536d862b66987" +checksum = "d6eb2d2b2c6cac0e43cbb2202daacee1a2f24d0dfa03fd08887a11dc6defdcc1" dependencies = [ "bytemuck", - "rand_core 0.9.3", + "rand_core 0.9.5", ] [[package]] name = "risc0-groth16" -version = "3.0.3" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ff13f9b427254c5264e01aaa32e33f355525299b6829449295905778f3b1e8" +checksum = "b0ca702ea7d0162766defe7ed6a79bda4a747ad9e2684000a6edd14df0a6d1f3" dependencies = [ "anyhow", "ark-bn254 0.5.0", @@ -2595,7 +2689,7 @@ dependencies = [ "ark-serialize 0.5.0", "bytemuck", "hex", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "risc0-binfmt", "risc0-zkp", @@ -2604,9 +2698,9 @@ dependencies = [ [[package]] name = "risc0-zkos-v1compat" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf1f35f2ef61d8d86fdd06288c11d2f3bbf08f1af66b24ca0a1976ecbf324a1" +checksum = "b8b0b598ba7946354b10ca5c56e382de801e6c7fce9fccad0396ec436bc5072b" dependencies = [ "include_bytes_aligned", "no_std_strings", @@ -2615,9 +2709,9 @@ dependencies = [ [[package]] name = "risc0-zkp" -version = "3.0.3" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb493b3f007f04a11106a001c66bca77338d0fc375766189fd7ca3a1e8c3700" +checksum = "21c0c921e5e2d44197940d387a45e29c6165e318b5a168fdfdbd50f50ba03678" dependencies = [ "anyhow", "blake2", @@ -2629,7 +2723,7 @@ dependencies = [ "hex-literal", "metal", "paste", - "rand_core 0.9.3", + "rand_core 0.9.5", "risc0-core", "risc0-zkvm-platform", "serde", @@ -2659,7 +2753,7 @@ dependencies = [ "risc0-zkp", "risc0-zkvm-platform", "rrs-lib", - "semver 1.0.27", + "semver 1.0.28", "serde", "sha2", "stability", @@ -2668,13 +2762,13 @@ dependencies = [ [[package]] name = "risc0-zkvm-platform" -version = "2.2.1" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfaa10feba15828c788837ddde84b994393936d8f5715228627cfe8625122a40" +checksum = "2eb37a97ff7e8e4ee1b2a1c43ec143b4887759883c343507af9e4787a57914cd" dependencies = [ "bytemuck", "cfg-if", - "getrandom 0.2.16", + "getrandom 0.2.17", "getrandom 0.3.4", "libm", "num_enum", @@ -2704,9 +2798,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.17.0" +version = "1.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68df0380e5c9d20ce49534f292a36a7514ae21350726efe1865bdb1fa91d278" +checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", @@ -2716,14 +2810,14 @@ dependencies = [ "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.5", - "rand 0.9.2", + "rand 0.8.8", + "rand 0.9.4", "rlp", "ruint-macro", "serde_core", @@ -2739,9 +2833,9 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc-hex" @@ -2764,16 +2858,16 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.27", + "semver 1.0.28", ] [[package]] name = "rustix" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys", @@ -2782,9 +2876,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rusty-fork" @@ -2800,9 +2894,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.20" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "sec1" @@ -2829,9 +2923,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" dependencies = [ "serde", "serde_core", @@ -2905,7 +2999,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest 0.10.7", ] @@ -2916,14 +3010,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ "digest 0.10.7", - "keccak", + "keccak 0.1.6", +] + +[[package]] +name = "sha3" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1" +dependencies = [ + "digest 0.11.3", + "keccak 0.2.2", ] [[package]] name = "sha3-asm" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +checksum = "a6287fd675f713484342a89cbf0a386abef5f15919cfad607e5e1f19e1e15331" dependencies = [ "cc", "cfg-if", @@ -2931,9 +3035,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signature" @@ -2947,15 +3051,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "spin" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" [[package]] name = "spki" @@ -3017,11 +3121,22 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn-solidity" -version = "1.4.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" +checksum = "4c6415502cd1e9ed58b3ceb415164b812d5572757b1a6f0e280ae806723c1fab" dependencies = [ "paste", "proc-macro2", @@ -3038,7 +3153,7 @@ dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", "ark-std 0.5.0", - "num-bigint", + "num-bigint 0.4.8", "num-traits", ] @@ -3050,28 +3165,17 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.23.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.3.4", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys", ] -[[package]] -name = "tfhe-ntt" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10650c743ade46b166c698c8349902ed5986784a7db418c51f810bea25f09e3d" -dependencies = [ - "aligned-vec", - "bytemuck", - "pulp", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -3083,11 +3187,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.20", ] [[package]] @@ -3103,13 +3207,13 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.4", ] [[package]] @@ -3144,9 +3248,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.3" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -3162,28 +3266,28 @@ dependencies = [ "serde_spanned", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.15", ] [[package]] name = "toml_edit" -version = "0.23.7" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ "indexmap", - "toml_datetime 0.7.3", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.4", ] [[package]] name = "toml_parser" -version = "1.0.4" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow", + "winnow 1.0.4", ] [[package]] @@ -3194,9 +3298,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log", "pin-project-lite", @@ -3206,9 +3310,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -3217,9 +3321,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.34" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -3236,9 +3340,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -3266,9 +3370,15 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-xid" @@ -3335,9 +3445,18 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] @@ -3359,18 +3478,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.30" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea879c944afe8a2b25fef16bb4ba234f47c694565e97383b36f3a878219065c" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.30" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf955aa904d6040f70dc8e9384444cb1030aed272ba3cb09bbc4ab9e7c1f34f5" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", @@ -3379,18 +3498,18 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", diff --git a/crates/support/methods/guest/Cargo.toml b/crates/support/methods/guest/Cargo.toml index 4fd42d3f3b..d50cec9651 100644 --- a/crates/support/methods/guest/Cargo.toml +++ b/crates/support/methods/guest/Cargo.toml @@ -16,7 +16,7 @@ risc0-zkvm = { version = "=3.0.3", default-features = false, features = ['std'] # This revision decides which compute-provider code runs inside the zkVM, so it decides the image # ID. It must match the pin in crates/support/Cargo.toml. See that file for why the dependency is # pinned by revision instead of by path. -e3-compute-provider = { git = "https://github.com/theinterfold/interfold", rev = "5b2ca6619a07aec6104f9b877bff948bd976b6cf" } +e3-compute-provider = { git = "https://github.com/theinterfold/interfold", rev = "e559ca209d8ce27b7d97e6a6ce776562fb5294c5" } e3-support-types = { path = "../../types" } e3-user-program = { path = "../../program" } bincode = "=1.3.3" diff --git a/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs b/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs index 8fab25bf0d..3e151f499f 100644 --- a/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs +++ b/crates/zk-helpers/src/circuits/dkg/share_encryption/computation.rs @@ -263,8 +263,9 @@ impl Computation for Bounds { // Message bound: message is in [0, t), so bound is t - 1 let msg_bound = t.clone() - BigInt::from(1); - // Plaintext coefficients are encoded in [0, t), not centered around zero. - let ptxt_low_bound = BigInt::from(0); + // The scaled plaintext is uncentered on the core/lbfv path. Use a symmetric bound + // because the residue quotient can have either sign after modulus switching. + let ptxt_low_bound = -(&t - BigInt::from(1)); let ptxt_up_bound = t.clone() - BigInt::from(1); // Calculate bounds for each CRT basis diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/BfvPkVerifierRouter.sol b/packages/interfold-contracts/contracts/verifiers/bfv/BfvPkVerifierRouter.sol index 25c02d69aa..06400a62aa 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/BfvPkVerifierRouter.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/BfvPkVerifierRouter.sol @@ -46,7 +46,7 @@ contract BfvPkVerifierRouter is IPkVerifier { routes.push( Route({ verifier: route, - expectedPublicInputsLen: (3 * routeH) + 6, + expectedPublicInputsLen: (3 * routeH) + 24, expectedNodesFoldKeyHash: route.expectedNodesFoldKeyHash(), expectedC5KeyHash: route.expectedC5KeyHash() }) diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/micro/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/micro/DkgAggregatorVerifier.sol index d14d3a77a7..a947cc3f2d 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/micro/DkgAggregatorVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/micro/DkgAggregatorVerifier.sol @@ -7,8 +7,8 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 29; -uint256 constant VK_HASH = 0x0f7fb7ce2863f04ddd3b288a77e4c93af5426874730b038f24fad66f86e285fe; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 47; +uint256 constant VK_HASH = 0x04b300b9b5241a27fbb7959ae5719b4206c3de4abec9968113a370e10cc51df6; library HonkVerificationKey { function loadVerificationKey() internal @@ -18,77 +18,77 @@ library HonkVerificationKey { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(2097152), logCircuitSize: uint256(21), - publicInputsSize: uint256(29), + publicInputsSize: uint256(47), ql: Honk.G1Point({ x: uint256( - 0x094dba8f7bd8424c572c2edfe7e1ac22d0776f8ebecae16d4228b1410e85a08d + 0x286ebfee018b2d9c3cc5dfbb7274d7562c03cf2577dd764aed093a2ee1a59885 ), y: uint256( - 0x2041c9a4ce8c9db888c4fdbec897d8647a50271229be1eb0558d8212bb3c0762 + 0x0e97a81b252ecf12cd9912fabafbc950debc721ef164d14d8f38d24dfdb8ba45 ) }), qr: Honk.G1Point({ x: uint256( - 0x25a5298e12ccf770b316868379c1b49975d0f12d440380146bd9e18e6ea64b5c + 0x006105a42299183a77a5979b5c686c29bc3b09d1c76e6ee3a86e7d1b90b87ac0 ), y: uint256( - 0x2c5b222d5665e26c8fd4722dc0da31469367c6f5f13e0fdd9bf501e0c23eb3a3 + 0x18bde842172190465990f10ae6cf384094c8cbdb43eda08cdfe67f3e2d7a29d2 ) }), qo: Honk.G1Point({ x: uint256( - 0x11e968d208059f9ba6f70efde1b7dffb314b400422aa4f73ccf50edaf9cf10e7 + 0x29b0284a2c720a4d742d72e1d0827968d80d0d32b95cc4c27849ab71396919f2 ), y: uint256( - 0x2847b6f96a0882d7a7933230183726cb36b1a7ad18d51e5da20f124d24b212c6 + 0x093928a2c81a7d1394b0b3fa457a757daa26e623b876db3e0f05a71b79cb7786 ) }), q4: Honk.G1Point({ x: uint256( - 0x02843d6d0c0bc80d19e4331427f933c143f0015f29d2e8597e5ed8b24e190023 + 0x038cb0a07cab34df765094482465bfbc16a832d90870e60622033fb14f791e24 ), y: uint256( - 0x0266ef1681af3a4188c09d785d83d0af33defade47b76cc1717702d1a503a3ac + 0x1bf1413d3f0d89eb355fec31d76a97bee2ae9abc6207a25b22e6d2648e737635 ) }), qm: Honk.G1Point({ x: uint256( - 0x122ef4d0d6b6df108072e2dd3ff14df6dbfd658110f7bda24dc3ab255df78d0b + 0x08e1695d6646ba834233bd2e5481ce9222f61a10288cc86a1439dd65db69be61 ), y: uint256( - 0x2e24b26ddb3f6c6a095a57e817fc57d15b81d7ab2c7b9e97563693f1dbeb7ef7 + 0x282570191035324e5d3c3b36cb2f620ecf31bfac92deb402d0fa81dd54adbbfc ) }), qc: Honk.G1Point({ x: uint256( - 0x2babf941143f18563983f8bef8edbb02e72b38fb13e7520778305f4833ca7f3d + 0x0f7d64b127f6bb56754f71f66d1c149fd186cdaebe2e10f8fd147ff49d520806 ), y: uint256( - 0x07f8bf661cbcebbfa3fe2c8f6958a039b8b4abf39057cf7cdd6b9b068969eaaf + 0x0981a5be9f113402daa8b2a5771bc7b29b970a8612f9277891f8bba646183b62 ) }), qLookup: Honk.G1Point({ x: uint256( - 0x1581245ac4f5d3137ac000000a703f77a6e7b26ed932e6aaf665f8fd14aac306 + 0x2a7b97680492e5f2c9dd1eda828a34c461f066911d36caa089c34b6a790ded68 ), y: uint256( - 0x01425f3df213a44254bd96098948e2c09b21120d3b3de62d5c06dd62bacb7a74 + 0x1db6204474978a4f112d405eaa2169e2fa3986583448b4509a5d7a392354cb71 ) }), qArith: Honk.G1Point({ x: uint256( - 0x0baacd48d0a0707a9d6a2afd953084d331915ff001e5224ffae703057852ac54 + 0x17a0fe40e0f575545065cc4c0f0756ba7581398db556ef6ea58d9807ec530e12 ), y: uint256( - 0x134bc401470e46b7de037e81cec09043fcf2807f4498686c9ef51f18783795b9 + 0x11c67e34826d44ed5f4133ae9a55008087bbafd3705ecd625dcf502559233370 ) }), qDeltaRange: Honk.G1Point({ x: uint256( - 0x1de172f3562a12a69176665308edb7b6aa15ba7fc169b3ad230c7985e9500baf + 0x010e14d1140b8742e290d06c879646963797ee80a7a9edf77cd32ea4dc360d2a ), y: uint256( - 0x2ad87bcf46a34fdfb33901c1e88edf84d3842dcf66fd192d68f2cc6e96b89365 + 0x194064322d2e4127504203a7402a78ec21db66862024db29700a534f82a5c4ad ) }), qElliptic: Honk.G1Point({ @@ -101,130 +101,130 @@ library HonkVerificationKey { }), qMemory: Honk.G1Point({ x: uint256( - 0x00878c8d09f58d406b26e7daa0667ad87959895ad686167e8c64607fb73c5aab + 0x2444138186890a88ffdc1c8a61c9cbe405484158550753f45ed4cc0d7940758d ), y: uint256( - 0x007df727bcfa31bc8f6883b56caa87fb5a390046fd01bdbc1a56e09a7910655e + 0x06ff6822d857e538acfc1724880eff2f7c3d38ca3068946f867ff8230ab376cf ) }), qNnf: Honk.G1Point({ x: uint256( - 0x1b55948be74a62502dd20a90e37bcf327b95be2b67d3fddeee37b0d4088f824e + 0x2e057c7ffd5bef11dbfc3601103043012bbe1cb5d56270ad0ed8204f720a93e0 ), y: uint256( - 0x066e60c8f0447bdc8d048cb5a2347cad9377014ee075f6769b9f1328f668d493 + 0x2a63c981a13e22b98773effcd8ffa25365b028c4e1714297eda320a495402b0b ) }), qPoseidon2External: Honk.G1Point({ x: uint256( - 0x1c64ffb992d418d0176563882eb24fda528f886a8df0473b7cb0f4deb27aeb36 + 0x1df56e44472f1d205119b499eda0bad1ded2f4ae31872f0a8f5c3bb11f107404 ), y: uint256( - 0x1c11d8178932e3c221082a3d9f0a1df89054f9ce9d55f7b9d71067b4613077fa + 0x109863a6d4c778157a55cb8389848c37446e2dd8ad7af7d3d76934f13e0069bb ) }), qPoseidon2Internal: Honk.G1Point({ x: uint256( - 0x22fdab5b6c29086cdcb686cca763d04685bdc6818e26c7d42980c70b4f4f3ad5 + 0x0bd75c046e4176a55504a4b357532e4185e09790404e037b098a4cec328373f7 ), y: uint256( - 0x03d212a9171123059107efc7951a0de24cda79af7504f2541c89bd0420a5e002 + 0x0b1da00a189bef4c2351a4aa0bce90ae0890766444e5895d3a53f0c0780b9f7b ) }), s1: Honk.G1Point({ x: uint256( - 0x02978e4cd1bd7b905ab731cb4067b20f52140f28a3d78a010b93ef67a12b1ede + 0x10cbca3985dd7c1d03127d32ef2e0b158051761029dbf8998791944aff6cb765 ), y: uint256( - 0x167244c7414b0d1a8ec80f921457f06762c9129a683271a3bb7c860d62236751 + 0x266ea4d2c0a9e809deb5b928f72f9a2b8e1539ca35ea157ef6be573d333a71ad ) }), s2: Honk.G1Point({ x: uint256( - 0x210d06481cb158a673b816a8ded5b79ee526cf31327e1e81adaf7da154b85386 + 0x220e74b9b76ec95848f19a849e3ca0c45f4919f3f5e24ffcc400023c7593841f ), y: uint256( - 0x1ba6de9de8ea9dc779370850d56a32233f106f52be549a6d02c5a0a42ab3ba39 + 0x01944b87be1be18d93f440d06d813c1b10556f67d9c154c59fb514864cbf8547 ) }), s3: Honk.G1Point({ x: uint256( - 0x08b54977696c6669bf75a9c701781714135e5e90a4ec33b62a337c10084dc670 + 0x0bc3e32f3443e56ba6940940ba9e1bc8c9d17c7b07be3112d0d16e4278ae3874 ), y: uint256( - 0x22c7d28363fff44947027554b0d7cf143b2f6822bb107caa29fb0b6b282c029b + 0x113dfb3d442c8ab77c7723aaaf4374de6677eab4db8c92a47bdb9cf73407b359 ) }), s4: Honk.G1Point({ x: uint256( - 0x04009f30a6df0ddd93354c9748d64bc0f50d81a08c4b9c8fcf37dc93aaa97395 + 0x0ed30888dc971ee933de1dfa6c5a4f0c5d4396be55e04c1069ccfeea6040f202 ), y: uint256( - 0x2125eb21047b0528b5716d0d60ef2b3901dbbc67c4905c38880e39aa081c68e5 + 0x192ed4a09fe78e7fb4a60046201abaa566853cab848ca4d86579d6e90878ce62 ) }), t1: Honk.G1Point({ x: uint256( - 0x2a6f976d3acc2e513d29e59889294a22a04efe8d8c87ffacded81fab18bbc16a + 0x18460053c5eef9721d4f635a8c26aeb6c2d8bdbab3c1119c1996baf977cc9f89 ), y: uint256( - 0x2bab8bf9ca0d5fce353be3381c4a64c162135f3e55b6e121852d2182c1916d90 + 0x023a1e2557a1c8c98329ede54e6179817cea512122e470ecec666af2f235e6af ) }), t2: Honk.G1Point({ x: uint256( - 0x0761b6ca4c8bd68f6aab988e226c8c01cf3fb52edd2f20142a12f3d2cf30e7f6 + 0x201fad6914e3500182f55b66b53894d0da8c4c08d5009c8e4c1b9f4741e2ccf4 ), y: uint256( - 0x104056d182da0846ac2c2414153dc04d514be1a00f494de85c3edbb60f5b3c67 + 0x18a11e694ad1a780f6873f2a3d3f9c48dd56700f0c4ba5e2c4f4ec0d48c42286 ) }), t3: Honk.G1Point({ x: uint256( - 0x05ceb8076af98995233338e56d77355f36cea83674b1a17d44a0f51a8b83243f + 0x13eb292c9f0b41a76d89d75da2f3e30ee1386ae715ea8e7d46cfa2df7a4f5e71 ), y: uint256( - 0x2ec3d8fda265ab7c787ee300b03daa5742b11cb0cd7fff6d32d798c5a2729258 + 0x0569a64880cce0d195fe8209cee78a81768f3fff238ceaef468b6eac11d64c51 ) }), t4: Honk.G1Point({ x: uint256( - 0x0a4494b4e4a7d812ad6a7ba0d161ff2eac5e296073ebd4f6d65dfb0ef01f943e + 0x05112eb7ef16cec92f55367f157b6873c1bc9785e1e1bca0449ce836520b1328 ), y: uint256( - 0x06e61c38a4de2e71901cb0a4be6ee58ee0a8fdf4306ca15606f9387a59e28870 + 0x1c4c59b17d7c386e00e46f39f4beae14aa73bd54eb108a3257cf306e673c6499 ) }), id1: Honk.G1Point({ x: uint256( - 0x28ec2bc81eafe74fc65a4c49757b8adbfbe64538e1553838165bd0ae43f38c57 + 0x266b31c1b22bf77b457695640f27168b238d53da9fedff34c2173d23f0a56917 ), y: uint256( - 0x1b5df1c6ad959d5926e6d396bb2962173d1a1e2325baa6d4fd71ed12d2ee5f33 + 0x11e7d7daf36e6a7f267065174fa3e634881dafc218c00c475e15689a30aef3c0 ) }), id2: Honk.G1Point({ x: uint256( - 0x06ad234ac5d10b12ed968111ca0c7209d8dc7ff259332e1dbbb2d7bbdd3d27d6 + 0x2332b9bd84dc2fb7d85d0a40e861ce78a0db90c07221834d76f724c12ba8c0c7 ), y: uint256( - 0x24631c21a5b6433c72c98839f7e4605df9c0664248b188c3f4e07361eff43585 + 0x1d8feb6ea8d0eb2131f9ffb3dff3721e9e870c36c1811a18ca0d3ed62a209495 ) }), id3: Honk.G1Point({ x: uint256( - 0x19b691ada1a739bbcc45fcceace00b96382b4f0caf3e7eb20a0e209de15b1d92 + 0x1a1584fc8e6a2003682124a058e04d63fc8b875bfc35a4f500032eb78f698dd4 ), y: uint256( - 0x0254778b6feb297eb4cb2f2fc2265ba87e316df036211bfc38f717b644a479dd + 0x217b2a4aea16aa23f40638a8cb9410aeb045fa434e8d8d71b9c614352a73ffa1 ) }), id4: Honk.G1Point({ x: uint256( - 0x0609419a073e67f53cb1843d1945d4970d7450c2d4040bb1cf75afc63b9932b2 + 0x22c6be27f8f10fda3463300358ea04d34ef95418ceadad44f0d9a4eb9b178cf1 ), y: uint256( - 0x18800db42f08601177f55640e256a428b66929d5d5afc66d6fc978f37c52d017 + 0x24f242b6ee57c6588009ec98e2bc79f1cf1ad349ae9b1a5857779e885fa443d9 ) }), lagrangeFirst: Honk.G1Point({ @@ -237,10 +237,10 @@ library HonkVerificationKey { }), lagrangeLast: Honk.G1Point({ x: uint256( - 0x2bb3b81a49959c69c7f28553fc0664d0c9467f60da971d52b47a76d7f358e457 + 0x0f7e1d2774bf7ba591d4c1d8dd7538a1b4273fc811a5b83f6c816cdd5b7c80f0 ), y: uint256( - 0x1a73e08b84de7b08cbc91a2eef43569604981fa99e744b8b6a3846799708834e + 0x03825677e76d4f0e873f16bb643af8a8559822f0704c054f9dd73c7e38fe6bd0 ) }) }); diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol index d44e1acef3..05f02bbe69 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol @@ -7,8 +7,8 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 44; -uint256 constant VK_HASH = 0x24f3a73b83792b3d2f62f3da691909b538488b68021faa317cc0d9d551a26e66; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 62; +uint256 constant VK_HASH = 0x1c138082301307a10bb0f9527df0abc87a176abc8870cf23dede095034753661; library HonkVerificationKey { function loadVerificationKey() internal @@ -18,77 +18,77 @@ library HonkVerificationKey { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(2097152), logCircuitSize: uint256(21), - publicInputsSize: uint256(44), + publicInputsSize: uint256(62), ql: Honk.G1Point({ x: uint256( - 0x20dfc41cbcdf4341200fa8c77ae84c5e9fd307634773787451b467c2ff7f5177 + 0x0cabbcb909104c1f099e2119498a02b508fef3642d1bfafc2256cf43cb420e62 ), y: uint256( - 0x05cd724a1cc2e67c78ab0e9cf2f059a8e1a4e181be5137762f3ac71dc2158391 + 0x215725211a8a38715d50c3d93fb50ce67d76d23616e8d63bd9bed7d767bad279 ) }), qr: Honk.G1Point({ x: uint256( - 0x0e6e2b79712d950a9e7bd5a6470e0cbe778463bdaf3f79531dc7ad199eea6999 + 0x2b74006e54c317ddfcaa5d55a6f4b3bcfea8c5622e84772dd73516ae89487fe1 ), y: uint256( - 0x2eccbd58effd68e98f35967026ca61244107df680a4b40fbf2ba4f150ee2b5a9 + 0x29fc2af709c970f3dbf560392eaaf5f55fc2896c6c58b36a8fe8bf46126aeb39 ) }), qo: Honk.G1Point({ x: uint256( - 0x005dbbfc299a2f8474c7e63268fcaffd4d8d647f592e585dc068e4b29ab98b58 + 0x1a1cc12f25cc0c1ba58aa325c1870d837078737b5dc4ccc536b8e1c5c6d24ead ), y: uint256( - 0x00f01a63dc79a710123aee39cc36e635b606d43d8b67e7a02b5c8e5f86a2a985 + 0x0651cf1e2f369ad4c320c357d0b5486b1d6231679e700222b81ab9d6044933f4 ) }), q4: Honk.G1Point({ x: uint256( - 0x06922d9e4db9f1bfb6f66a8f19de8f884920b0b36d11fa5e8062b7ecf00859f8 + 0x145124c06d60af886a4a55f29fa474bdf16ccc757bba7094f0aaf5c60e858f1e ), y: uint256( - 0x2710f96ac73a95b642fb641ba40fd2f3e5de942e6297d975b8599a893e4ee7ea + 0x080d847775215f7c1934bda24fb9d8f9d03168398c331b99a58e7eefe426aaa6 ) }), qm: Honk.G1Point({ x: uint256( - 0x182960225518cf86acd9da45a4dd018f856d1d053bf781e215f7e7783239c9e9 + 0x03d68e8279c403342bc51e5bc9fc65805db2edb91e162148821bcf3eba610d8b ), y: uint256( - 0x133bf5e24189dbeb4efe8ba5f24d317ebcc3aba141eeef86b5b8b2972b9abe40 + 0x27e007f40a4a0ead13f3482628a16a4f99f18c52f024653c8383124ac75b3f08 ) }), qc: Honk.G1Point({ x: uint256( - 0x2c82f119214b050e37452fece0d519d5d311065263534e158ee8d8b5b2533a13 + 0x207dd9188c6090da150559c8f31399254e6aa92e17b6229da5e7f54b9504ab25 ), y: uint256( - 0x22342313ad4802950d7fa700926a54d2135aecf750822ecc2659389e9d8bf106 + 0x2d683b0a58ad1af0e215bf4e122ccc6d76604661ee512d090be569cb5adaa7b8 ) }), qLookup: Honk.G1Point({ x: uint256( - 0x2b332d7295465c986365baefb7e3f695d099355dba5a99b9796029f4291d33b5 + 0x07decae55629495330c3da15f6f2c0be18906fafea84c922e0de42dc3d4c4a87 ), y: uint256( - 0x247317a367a6359f9b617008e5cb54a601dc28eb9588ae4e84ba7a6aea8310a3 + 0x0f61a514cca0114b9b69ab615669e47d6825d12d94251dabda103c05bdec5709 ) }), qArith: Honk.G1Point({ x: uint256( - 0x2ef1e2c04dab3152d5b7c478c9eb320dd94d7af4b6d9dd2257b5f570f5c2d44c + 0x2e67109a1b71bbcf316a99a12ac7d099e945c4dc663fd0039bdebf72fb12cb1b ), y: uint256( - 0x12adf071773a2ef4bd515a21a5219e52445939aca4c7eedd8d286cd9b6b85d92 + 0x08fd81d94fe45e39c18e6e139caf1a475d34d58493f398af58421cb7743a9a48 ) }), qDeltaRange: Honk.G1Point({ x: uint256( - 0x1b2b53701a7191e7a246d6471239bd29c1316fe4751cb070bb4fc24a36042444 + 0x1720cd7258dfda3d3dfe40c0ce48a55c6d0f409a6979cbf297f590c0e6624cfe ), y: uint256( - 0x2ad98bf0e630bd4730b756b473f42f5722d06f4098c5cbbbbd2a524f9bf0a2ba + 0x20af57ffd52dc92d7f65e00f2cbe5d938c1ef803e135774aefcff8f87a9e9ff7 ) }), qElliptic: Honk.G1Point({ @@ -101,130 +101,130 @@ library HonkVerificationKey { }), qMemory: Honk.G1Point({ x: uint256( - 0x29022a54f5237837f4d8a702ffeb1e7255bcc6fe4140d2c844712cd1a610b885 + 0x28f836bd52a43e804f5f7899a380e64773641e942adeb6d38b4d890cc63ee901 ), y: uint256( - 0x2d6f158b7e95630fbf9284628de105d0dfe9453a53ff9d23a1b221d228c1ef6e + 0x17d791df885a4dd504e28fb85a3149edb84fcc6326ea6976b9e44edbd4492059 ) }), qNnf: Honk.G1Point({ x: uint256( - 0x07dc482f349323ff34429ba314e4ecb230f5baf8cc6df19a8b3c47cf4e653e03 + 0x057a9a024d8bc989d989df76efdb4b8440cfbf609b56838db316e3d56e366c60 ), y: uint256( - 0x25330b1cab57d67b25836c8ea1db3f4c95f616f47aca9d15d71afc2b6b1b1b4b + 0x0c496b73ad19efce7d07ffa786baceecc1223733a7ca7bec7db908b8cce8de41 ) }), qPoseidon2External: Honk.G1Point({ x: uint256( - 0x20bcb8ca7e051be0d5dd11d2776e0c7b13fd71d48d3b8f61ceeb515107df479d + 0x2dd3b9cc6b9c7b10020d0b2d4aba4baf2f4a5de3357228524d527b8700fc50fb ), y: uint256( - 0x21ecb8ef81c1757969847c665ed9b511b5cdada95e3230f4cd8e2e81ec75625e + 0x2b3841781e7e154909663efa72044c814024b59ef256a35db9898ccbcd6edf6e ) }), qPoseidon2Internal: Honk.G1Point({ x: uint256( - 0x251d42c4aa002ee7464e501f191630080086faa2eda66ba0db83907c146e63f8 + 0x05196a8974b461f416bf30cd66b893a128d40736e927d8c196f2d80959eb4393 ), y: uint256( - 0x12af59aeb901a72d79acf3f87feb439b0ad65256f42ea25259ba76278271a606 + 0x1a2b25516a8ff9c9e125e4b9778fdb725b71d38ffe31e326fe76ae5daee992dc ) }), s1: Honk.G1Point({ x: uint256( - 0x2513fedb8a9883256cdb6749179c322465bce35ea0cf81d563a884b0ac53713b + 0x1939cc081a9e0cdf2b0c4aba57152fc3d9f669b48204980d73a677721f2d6a60 ), y: uint256( - 0x0041315725eab18a3d2399bc4bd568c237a3d379a3b969f4d180b7d2403fe811 + 0x1a8389be922568fa8990cd478c72c51b77b12186016f1d43a8d76092e8312221 ) }), s2: Honk.G1Point({ x: uint256( - 0x2d6afb6d3370cdca612d071b0277af633d18c648a362af4514d6c1e7c6df0d1b + 0x1bd08cad9dea2f269827854a21ab78c0b7e8e00d87468e628c5444d9720d3fdc ), y: uint256( - 0x26c9e0c3bfd9f751297b0306c91b7ed294e1297c296cf968ae1d79d1084bbaf7 + 0x130807b571e4ebd8a83901dbc717e27cb673fdfa4af608bc260b3b588e6b9bf2 ) }), s3: Honk.G1Point({ x: uint256( - 0x0ce34b20f252cf29447eb1948b96d658e8e3e02c5af48008020851a71fce8de2 + 0x1abf713bd3a9ec236f5fb0290a7dc3b547e78342be24aefde0e670d1c61db04e ), y: uint256( - 0x058448fd023fb49f4f0b41f9057d5c6ac03e72780464be4df565d74633efc785 + 0x267b538afd20c2e54b10204f461047d5ba8f53e19271a920b52f3bdc3ff1d07e ) }), s4: Honk.G1Point({ x: uint256( - 0x2416a4199fefa38b5becf3cce35ed2fb8f2ee9908b7c6f115a56bdb82a2c8392 + 0x167f6117e78ac2e6c313aa4089d6869a1f5cf2b9dc4c3d34d81533ff57203bdf ), y: uint256( - 0x015ca88903e84a05413cae63fcce6a2d552959491e6bbd2f009d6cce5a4f38f7 + 0x186cc1d96852b026a5cc09e3df4f4b3b965317107ecf010744f0bca8ea3752c2 ) }), t1: Honk.G1Point({ x: uint256( - 0x0ef574fd529b37648cdb9647e1b67e579ecde121879ba9b7bb6d6590dd2761bd + 0x2dec1113879ec9e894d2e63cab4f6b70b4f0453de3f71c0b7cef5d07ccc5fb16 ), y: uint256( - 0x1fed764a20d9dd8159bb659274c3f93d4e182c6825ccb2db8f902e0022a26ca5 + 0x2e569bd7eb479c5d513edc4d10a5eb210ddde4e10a46291b659e3e904f7cb9ed ) }), t2: Honk.G1Point({ x: uint256( - 0x1b38893c0ec43597b087055890d310f5f5fddb5a4fe54a7865ee643db6fc283b + 0x14c5e72fb4850c73117d61faafb41666f499732f77b2acd2927985e0a44d7a0c ), y: uint256( - 0x1f25a682a2ef3d556dc2db54204735412fadc772789b4f944c970e752c058d0a + 0x263108f9225b99fb35c4239a8d0efeb35dbe9f791937033c621e397344de6522 ) }), t3: Honk.G1Point({ x: uint256( - 0x124f08a1d1137d599f40c34b7c907e758eee3eceb9e7d4dd8b2c54ed5e73df4a + 0x1046bbe830ffeb03264fa686a6507e553f840a287a840b12d9628c85306d271c ), y: uint256( - 0x0dc5a9b196bf2c10844778e9bfd0d553b1fabdb253380934a616e365650aa3be + 0x14da3e1300109c126d74a9b37a8d5cf302a31757293feb3bdf52acd9e99d7257 ) }), t4: Honk.G1Point({ x: uint256( - 0x2994d68ba1040ffe15813ba0f2ee34e5b66ab4a71f4f82b13eb7195b0a34586b + 0x122b57aac7c9e1cc87c8fa7a67aba40e3ee3e1540dc9f02eb58a8bcb86fe6eca ), y: uint256( - 0x14054ad735bc910ff07390c9f2ba0c0f681f80f64211e7b9e37f81e79674ecb4 + 0x2b4c091e41c1cbad2b4ead8946df008438021eb24532d23d03063af92151a5f7 ) }), id1: Honk.G1Point({ x: uint256( - 0x2e211bd638e41f9e20cafcee1501f703417a422f38f806ceb5ab0a2fa468304f + 0x29aae7f2b74b26c2e90d93eca8adcd437ebe935ec8e061064cd303a83dd3f12c ), y: uint256( - 0x201144a981437eb8d2a8bd55206da01ea715c5556a489d6e528a0bd94cccacc8 + 0x0311a69a03ef66c96e3014cde39183cc14719d847c1fd9485c186f27f3a5084f ) }), id2: Honk.G1Point({ x: uint256( - 0x02b2c827ee2c19c72e009a5b523b319a5bed37e337183a8d35b04ac437caaa77 + 0x2a104d387c543aa99d22b356788f3697562f0f8de346c9095b37de23d25e3160 ), y: uint256( - 0x0d5ee6bcf20a0861ba855ea3e71ecd0fab4a3d4e782a89f14b025c0b0a313617 + 0x054058a915eab1ebf59034288c0d4432dca4cfcc3e4ce1884b03996f7e3455b6 ) }), id3: Honk.G1Point({ x: uint256( - 0x26f60ed311d6712af161b058946f603d33b42784247764a0898a623e032e7e4c + 0x241f716c56728e74d5c0900026303c2eb8d41956b11ea2834c9cd05fba88cb88 ), y: uint256( - 0x2a1c9f8b642e32b1bf062e709f2fe5aaddd834b92fe8377d820180d371da5497 + 0x28c5deb96e671c2b1168813fa91025a8be5d03ffc9f47f4a9dfd256869cb3981 ) }), id4: Honk.G1Point({ x: uint256( - 0x0dc264c82e404df0eb5b6da7e20f87073c07cce713b95f545e3f91682b5f4691 + 0x2ad0bcad91b8638ab77aca5ac35da97a1c10c933347543257a7b2668eaeea205 ), y: uint256( - 0x04654d13700a8dc529fe860c1b37b49763418ce94e3e8de4328d26fa0e52e6fa + 0x0f8123c93641f5fecb2b4735533b5eba654de9e428cab42091f5116fb3fac9e6 ) }), lagrangeFirst: Honk.G1Point({ @@ -237,10 +237,10 @@ library HonkVerificationKey { }), lagrangeLast: Honk.G1Point({ x: uint256( - 0x081c0df28546cb7d87deda690414b397dae3d7b6efb4c94e11ed86bb1caeeb9c + 0x15a96432f17d1b135ae86046eabef7c772f465108ec6725f16e22f4470f58085 ), y: uint256( - 0x0cd4e853d2ea10d5fec6873a2d423f9d9cca683468955818da647f3dba20a6d8 + 0x054cd74be8c2189c0c3d1a2648aaf75e76ea3a974790d69a3dc865f105066cb9 ) }) }); diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/micro/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/micro/DkgAggregatorVerifier.sol index 45e2dcef18..88977b1115 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/micro/DkgAggregatorVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/micro/DkgAggregatorVerifier.sol @@ -7,8 +7,8 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 29; -uint256 constant VK_HASH = 0x1801761059b48405bec02960694d651bfeab4cba5545b71a965ddff15d53bbd7; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 47; +uint256 constant VK_HASH = 0x28f67b456d5b192e9ebe3d3ac1f74a67e0614f95e9920c0c2f67eb5a69b8a3f4; library HonkVerificationKey { function loadVerificationKey() internal @@ -18,77 +18,77 @@ library HonkVerificationKey { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(2097152), logCircuitSize: uint256(21), - publicInputsSize: uint256(29), + publicInputsSize: uint256(47), ql: Honk.G1Point({ x: uint256( - 0x1c45e1b88af93473b28db0992bc4ae3a7f6c06734e6eae460eb1c25cddb4be23 + 0x031bf7d15ddd88c312544f72c62ea551bccbf1c976460e110742fd8a13f806e7 ), y: uint256( - 0x2528798cd17ce513cfbce3c5696b22b93e135a159bf47fbc5389a62f589dca5f + 0x10d3d25f7b07448a7e1684259747f615b43e2640a8249007a64b9257e4e4f9c4 ) }), qr: Honk.G1Point({ x: uint256( - 0x120d031a495b9bb2e4a4e2d2c22b1449737f2142246b94b863de10d4afc35ed8 + 0x2d9cb56a5273286a3204ef10fd7bdfa13a5f5c0153cb196809c00fb379c3ca16 ), y: uint256( - 0x1a1bbe199e4ab1222a43771a5f45305c8335edfe123c4ba6f2231455ba204d6e + 0x048e2ff0fc6d0974b6f2bbad41e92b0dffd5d407e54f5859935403cfea966d47 ) }), qo: Honk.G1Point({ x: uint256( - 0x2c6349ea27277ae315e162a60e12114d61a2bbeb1ca3730d3e0d84a16c3610ce + 0x14d6bc7e6038899b131163ee314b78c61af69b1e489309f189bf024411246325 ), y: uint256( - 0x2fe7a865904155a6d53829ee30749400c41bc75795b0b440aea4725181eac22d + 0x1e912e1b3b0ae6cd23107e9b5496085bc82d9ba8a8ca95a8ed3866bb3afc7de4 ) }), q4: Honk.G1Point({ x: uint256( - 0x086e4920bb96b847d53d16babcfc5ecfb6158fb9dc011e7b16d6eaa2a19789c8 + 0x05968ebfb2d4de36c7fd696f9344ac3b844da4a573214499a0c16329e6e306fd ), y: uint256( - 0x01b2e686c6cd292bff5d3b26bbc5c1f30b7568f52769a97e57f0da653434ba31 + 0x1b44d46d8d6fdc4b49e70633c7ddefa148f50141a7c64918e370353166dd37bd ) }), qm: Honk.G1Point({ x: uint256( - 0x0d61f2c8f7151a06ddc89053f7f2a0f0c3912f98a2f889fcaff91606adaeb924 + 0x06f6d083995a01528d90c2578e9f9b475c8f091274325203d0c90f335bb208cf ), y: uint256( - 0x03f36f1ad6cd6545d56f41d25b0394f89c34cb8deb985667d00a8f0b6430a0e4 + 0x2f9732607a281317ddcdb8d305440eac1929aeef17de20188cba0fbaf2a12d38 ) }), qc: Honk.G1Point({ x: uint256( - 0x300c899adb7b654eeba00103d3ecf49047ba164860c9017a78e9d4993bc787e5 + 0x2a71927fad78383b4a64212669956bf2d9b2d1882953f10c3df49167dce14590 ), y: uint256( - 0x2ac66b9487c849844702ab02772c36e7bdc62950030986b19b805954d9f62a13 + 0x270daf3d4f4e9e32f462a2c2454268f2e4e562f9f79367bb34ca4a6186a5f6a6 ) }), qLookup: Honk.G1Point({ x: uint256( - 0x1581245ac4f5d3137ac000000a703f77a6e7b26ed932e6aaf665f8fd14aac306 + 0x2a7b97680492e5f2c9dd1eda828a34c461f066911d36caa089c34b6a790ded68 ), y: uint256( - 0x01425f3df213a44254bd96098948e2c09b21120d3b3de62d5c06dd62bacb7a74 + 0x1db6204474978a4f112d405eaa2169e2fa3986583448b4509a5d7a392354cb71 ) }), qArith: Honk.G1Point({ x: uint256( - 0x181f5dc3464c1832273ae6df41e6e426ae6db68eb8157a70a18c9d45a4476f2c + 0x205f0e591e34bcbf9e0d760ccf48233c457a3cfdb576ed8effb2d1f0c562348c ), y: uint256( - 0x007e1c66b959262dca45ace954db00e1784f7bbc5d30046544134a68b9984033 + 0x167fe54e5f47fc23ebffb21688953697324e2135b5e68959950c7d1e47c872b9 ) }), qDeltaRange: Honk.G1Point({ x: uint256( - 0x2da110a2a7f89b0e9c517ff976e85adf8c46360e41432aef82015ab232a6d4a0 + 0x13ac02bdfcb63f422e92365da671fdd3d3bf305f3c228e452f6a17f51a76ddad ), y: uint256( - 0x241b1349ffe5683a6875bae845b8d1ccec23f6ac89eb7a1772604a3af5c9d4e1 + 0x027bf51487b0d341e3aee6bb22f185bd23cf8630b8479bfba46adc7965469e00 ) }), qElliptic: Honk.G1Point({ @@ -101,130 +101,130 @@ library HonkVerificationKey { }), qMemory: Honk.G1Point({ x: uint256( - 0x1d06cf9e3f6467b703675cb1748057475a806f7d07d76e60d6e48e8327e605ff + 0x0448e5208395d3a021b899d2e3ddee82286f374974e6b30db026a6460f883bf0 ), y: uint256( - 0x1c2337b06842c483cf2b378654639850c3d9cb67356ffa2f555854443fae0f89 + 0x0dec6dcedcc052bb6aa06deec91d10e04c3c1604fb2f56955a82cff47f2591bd ) }), qNnf: Honk.G1Point({ x: uint256( - 0x17a6d6c38f0a96c27592ba9434b0e95ed51de77b1ca7f493dc509e518b369b89 + 0x29f3da448b3840d95feed7218b4cadbf312513cba081947fa23e964cd58ada1d ), y: uint256( - 0x2213f97a57b3271988bfd088bb4019b605b74170ecda54d16eca4db0dd9d41b2 + 0x007d03e7b0a78b5c2aac04009843efad55747accee9e7dad78933eb09346fc9f ) }), qPoseidon2External: Honk.G1Point({ x: uint256( - 0x0b40ef61008cc48092ce1388fe767d197052ce38396cff5ee096d4a69150543a + 0x23287a0a96da6845d621f69f7c7aef7d90094d73ac3abfcda911cdae794459b5 ), y: uint256( - 0x0f97032f06d1a6c22c70f31dd887dc47187dc1f535b5a3f3ee108ce123b3aa86 + 0x301112766b291e46c7b35f64d90b7b8377895c23245270dc547386b99d59c5c0 ) }), qPoseidon2Internal: Honk.G1Point({ x: uint256( - 0x10eb3daa89a3e1d0e61c5eb65beb8b4f8fccf3e8e3a9cd155df557058b3d5b35 + 0x23d1065e02ee7249a0d1e65745b00c8fc55967b86f0868da1be9995902777a1c ), y: uint256( - 0x0f06a376ee95d940cff814497a44ab0f6732ea57951296d17926cd1d9351236f + 0x2110c9733d8a1b6f8062b0e6e232a3c1008e19d087c6832e6186ad02333fc22d ) }), s1: Honk.G1Point({ x: uint256( - 0x05cc2413e31fba9ce218cff5930c071893d7d88fe68a4559e633be4fcf54d257 + 0x12283d7bfdc28b8c24476b7b40f190fd3d6cc43271835ee7df4a5256451a9370 ), y: uint256( - 0x0fd2d1a47aea5459b44aebf1171740f1c6962d77bf036654ead3b0545aa43bdc + 0x1e4fde7af26308ce3495bc18b851ed2d31680449dff0c6187364a532fadb1890 ) }), s2: Honk.G1Point({ x: uint256( - 0x0d985762d2097292a12c45b55524c304d0db01859f0178d2afaa71ccd9ae5d10 + 0x2df44bc41abe6ea890ef501fe15f2dd22e6cd345a4a62e0392c3207e782da7cb ), y: uint256( - 0x043a0b43809a8534870e47e8a29fa87ea1cf72369af019b1cf3425bf3a4f4cc1 + 0x08dd30aa1062fcec85c07a57fcbbdee10d5db682b4675ba47dd414c24310f646 ) }), s3: Honk.G1Point({ x: uint256( - 0x29eba5cc9761f8cdc65b707729d74e66dba1ea4b1fd1d98b6b77d81ff200f21f + 0x0047240cb448c629e7e964c888616828ff2a3a107bef32378e34bdf9d656b440 ), y: uint256( - 0x1599984de8ea8d9aa3b9e9e53072c9e800044a0fcb4649a554f287ae1be5a6ed + 0x2f87e94a96e87c06d222983273a2dc6e7e83bd00255662fdd278bd4cc331d852 ) }), s4: Honk.G1Point({ x: uint256( - 0x26ceead471aba9fecf9de973a02a4e634648e4ee746d140810a2ba2ed0996a39 + 0x202be17c8b26f334be1d588098183541495a70d7d37c2e0fce1df027712a8384 ), y: uint256( - 0x1e8859fa5fc6236e60b4721b4492ee600b162182d7f118b6fcde4585d04dad37 + 0x0f8b4419206f4ec045e9623dd029d396b9ebc8939861d708128768d7e80ff90b ) }), t1: Honk.G1Point({ x: uint256( - 0x2a6f976d3acc2e513d29e59889294a22a04efe8d8c87ffacded81fab18bbc16a + 0x18460053c5eef9721d4f635a8c26aeb6c2d8bdbab3c1119c1996baf977cc9f89 ), y: uint256( - 0x2bab8bf9ca0d5fce353be3381c4a64c162135f3e55b6e121852d2182c1916d90 + 0x023a1e2557a1c8c98329ede54e6179817cea512122e470ecec666af2f235e6af ) }), t2: Honk.G1Point({ x: uint256( - 0x0761b6ca4c8bd68f6aab988e226c8c01cf3fb52edd2f20142a12f3d2cf30e7f6 + 0x201fad6914e3500182f55b66b53894d0da8c4c08d5009c8e4c1b9f4741e2ccf4 ), y: uint256( - 0x104056d182da0846ac2c2414153dc04d514be1a00f494de85c3edbb60f5b3c67 + 0x18a11e694ad1a780f6873f2a3d3f9c48dd56700f0c4ba5e2c4f4ec0d48c42286 ) }), t3: Honk.G1Point({ x: uint256( - 0x05ceb8076af98995233338e56d77355f36cea83674b1a17d44a0f51a8b83243f + 0x13eb292c9f0b41a76d89d75da2f3e30ee1386ae715ea8e7d46cfa2df7a4f5e71 ), y: uint256( - 0x2ec3d8fda265ab7c787ee300b03daa5742b11cb0cd7fff6d32d798c5a2729258 + 0x0569a64880cce0d195fe8209cee78a81768f3fff238ceaef468b6eac11d64c51 ) }), t4: Honk.G1Point({ x: uint256( - 0x0a4494b4e4a7d812ad6a7ba0d161ff2eac5e296073ebd4f6d65dfb0ef01f943e + 0x05112eb7ef16cec92f55367f157b6873c1bc9785e1e1bca0449ce836520b1328 ), y: uint256( - 0x06e61c38a4de2e71901cb0a4be6ee58ee0a8fdf4306ca15606f9387a59e28870 + 0x1c4c59b17d7c386e00e46f39f4beae14aa73bd54eb108a3257cf306e673c6499 ) }), id1: Honk.G1Point({ x: uint256( - 0x23e230621a92a156c224d065490bac7a50967b25a9d1d8cc81c148b73691a532 + 0x1c79ed1a28370f0a2da1b29415d3f84f71250400ba3f48ce5d266bcea4cc4b9c ), y: uint256( - 0x0916c80c5122e9a6cbaf68ee870ef3148dbff7902b9a88849435a8cf7cdf8139 + 0x06c37f130fed9ec9b191295c61bad578cda0afdaca7075ca65b8ae6be7e21e7e ) }), id2: Honk.G1Point({ x: uint256( - 0x084104c8c4f284edff1290fe53a2a69f4e2d69d21101fd69569e575e77293019 + 0x083c2fcded8fb7860a2629a4763c5daf19619a13302870662ffd4cdae94c9aaa ), y: uint256( - 0x1faee6fed4b40702c61c067595537e4e764aa95f086aaa948415069e0750e2fd + 0x03b326a286e4d3c66576c7f9b92b68bf2c9a781baadf4c0a6d097bfb8d327796 ) }), id3: Honk.G1Point({ x: uint256( - 0x1ff319c8b1e77b18273edff6c206523d1bde139f527f05fcd33f8e555464f9e9 + 0x23ee1f6a0c69d4b3a22023b7427526562c7a701ddd3bffcd18fcf2d8467ef521 ), y: uint256( - 0x288b3cdd7b4099bc72837e7dba429f1a3c309d88a7a20bccbb4871d99c18da87 + 0x13696e9b74086ebb9db05ed8066616931434c32676fdc2c756df91f383140dc2 ) }), id4: Honk.G1Point({ x: uint256( - 0x0009ee87493b2929f3775309ee36f87c5d622009e6b580200e9105c5cab44a72 + 0x106dd7a72c2bcb9eb70e26fc0ce51ec85f35498963c8f438b3f34970b76cb672 ), y: uint256( - 0x25bcdf0952ae2f5badf272704212a6ff04c3baee0c91a3b1c98f75721724b518 + 0x0babfde000eb09f8bfddc1218b693e5501015ae884b73b67262d7d54c6417015 ) }), lagrangeFirst: Honk.G1Point({ @@ -237,10 +237,10 @@ library HonkVerificationKey { }), lagrangeLast: Honk.G1Point({ x: uint256( - 0x07e1ef8600cdd08bf97a1789c3fc8faa39477ab02b7f68856a5aac3b5e111759 + 0x0d7a91f12ec680f953371df4b090dec21541f3518cf302623d10457ac345d7e5 ), y: uint256( - 0x191a7ae1f849e52da4784e3576dcae800e507d66950c63de3d144d81e6fd5c68 + 0x00689df5dc40d945794749cd5accd49985dfb72a33bd1fb98f6aa7abe7bf9c48 ) }) }); diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/minimum/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/minimum/DkgAggregatorVerifier.sol index d387a5d123..9207df20bd 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/minimum/DkgAggregatorVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/minimum/DkgAggregatorVerifier.sol @@ -7,8 +7,8 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 20; -uint256 constant VK_HASH = 0x0d541078c0f96907528f8f016964eeca653ad1a1959dc659dde2c36bb074cbf3; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 38; +uint256 constant VK_HASH = 0x0748bef509c78a81167b2f7efffe3bc636c6900e0f8dd6c18e48e86dd6ff9a93; library HonkVerificationKey { function loadVerificationKey() internal @@ -18,77 +18,77 @@ library HonkVerificationKey { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(2097152), logCircuitSize: uint256(21), - publicInputsSize: uint256(20), + publicInputsSize: uint256(38), ql: Honk.G1Point({ x: uint256( - 0x304f317229648edba7420636e66cf4b9d117cd784d8092fab4dcd3acfac7a97b + 0x23bfa96abd5800cf9ef3afc790f878e6ada15ea81ce79f5e0e101b07d3569eb4 ), y: uint256( - 0x22f87e088ef3e0641d17f3d382886db76a8a2567b8b1c6de743bf1f65bc504f9 + 0x304c16e8de99e70c1e683c0283a1537d4ccf209c01479fd9a132382e0605e2cf ) }), qr: Honk.G1Point({ x: uint256( - 0x244cc773032310365e668ad6f2c36fcd4600014df29eccf55d043c2defaa81a1 + 0x2c5c5117667dd03ca78317968a331e19159b9b8684745837159a340be87776ed ), y: uint256( - 0x00a94ade16eddf327c0d724582f759d95133a9a050c2010d9b111170af0af11f + 0x0020d91a3198590a7cdc6c6e7b36a73313c0793b250686896c0719d413d9cc51 ) }), qo: Honk.G1Point({ x: uint256( - 0x085380faf8150d756d5a35ac708c2cea103a323c802e60649395b212ed2e5e83 + 0x028e74ed00c6c500a6049707ad34c468cea3a8574b5215744d19e5698c104292 ), y: uint256( - 0x0e5abc84dfb45cffeb74d3b40441d1fb9c8c50b19aa7939c39deb1c42b02150d + 0x025f1cc1447bdd9382ed70321dccdee4b2154f06ca0a900d8c60cf3a3274ac9e ) }), q4: Honk.G1Point({ x: uint256( - 0x1959b04cb36344efef2d1bcce2fc59b3c457610f79237f91f398520ab60e884a + 0x1871f6fb0cde1f1b7231d674727e97874a1de0c27e29a29584fe2baaa2c1ebfa ), y: uint256( - 0x090829e75a6b7d7e2298cafaf8617049e503cd5d62159550983aec15f4f204e4 + 0x1926d59251227847d8e1d23add0663cc7c4765a43995c3df02abe155147ed5f8 ) }), qm: Honk.G1Point({ x: uint256( - 0x303c99dfe7a3bc4018438d2a4639999ae7da7338195e48f52033e7036c793dd2 + 0x01afee7c2f432204e12938d26c2bba1689c81e44566fccbcdc742f501b7b6ade ), y: uint256( - 0x17580fe4f7783376ad9725e7b44262dac051993951f5f2b3a12e54f6aa6a201f + 0x0d0baf331edadcfe8115dab9df4f9da038730e7f02b707f2d824d934a89c9a34 ) }), qc: Honk.G1Point({ x: uint256( - 0x130fc095de12f4fcd842bd1a2bfbabb64743853964eeff3450d7a08f3c54b10c + 0x0520e0272eb5e61ee0be9bcb3ac94a253466dcfd14f580949e67c8c04c759605 ), y: uint256( - 0x00e80e39312a97b249e6dc8b96bf302376a3ba9a42f6930c6978c0002714856b + 0x12079af4810ad7bcee75bbfc4918b1b4da17f712659d407d1d81df2fb2791b4e ) }), qLookup: Honk.G1Point({ x: uint256( - 0x07bae8da7d5838ebf83a5ce0bd78ac81464174b8163d7eeaf9d0f3e7a0ea6f0d + 0x09ae66bef2d0ad77a28f9a475135d083aab02eefbc32edc5bb697cf92400c48c ), y: uint256( - 0x055094c0ec8060afb828a7c57aa0e83e6c69010c3a2961ef7fbc95da7d926687 + 0x2641833fdb404a23873dbd1dbeaa222b88e748c8c8ff780d945e7fd9a4870e48 ) }), qArith: Honk.G1Point({ x: uint256( - 0x257117f8f1b64c797d62679e6a8f8a51dcd653ee192b48269d3983e9a2a7f61a + 0x18e8165d2f455f83a6939aed1b6043da0e1197e2a11cd5587de12d67b2539589 ), y: uint256( - 0x0d8a08f812e78ddf53194e4115b9cba55690c33d2fa4ac4f674de553e4c1aa22 + 0x1d19253b0a7ae22f4ad4e009b60b9b9efced571ddb98b4c60359de69823b7a0a ) }), qDeltaRange: Honk.G1Point({ x: uint256( - 0x1a7639d47cd9ee1fb9fffcc33481c54fe8ce0c6e1a33f416ef5b3a5d0994a44c + 0x25953de718d3c14aa0f6b6f9ca8b45c4dcbd54de91ad23f87cb8db9e8bf9a9bd ), y: uint256( - 0x21741e3e5a7ac033895ce0fe4cb819948272eebb4145d54f479b7a65cf1bebad + 0x269347e18389996eff226260849e52e24e4b442453f74ebfa67991fbee7dcfe1 ) }), qElliptic: Honk.G1Point({ @@ -101,130 +101,130 @@ library HonkVerificationKey { }), qMemory: Honk.G1Point({ x: uint256( - 0x286de2a8364a2c9c50119c40b70744192ad00d0a49f1a975b833d41831262dd0 + 0x294f90eb40c69a0dbfca6489a4498bd6be415a95e6eaa14547bd5ded91c71036 ), y: uint256( - 0x16b72d46e83678b3a4e11be1a7e9a22b8ed331afba9f778c2e0b7277b4af07aa + 0x2a9fed7be268ad44e16930dfd5ff28a86b7ca52e2e737a0b6006ada229881a2c ) }), qNnf: Honk.G1Point({ x: uint256( - 0x1b94e1f90c8deaf221e3ecbaba341e64961297050cfedac3764f0caf45c8d209 + 0x19c72972c2908b8230c5fc8ee009dad6bbf6fdc4548e0ac3e75fde2d49e43799 ), y: uint256( - 0x1451196ec691ec07c3779405b98361d005a127a3415f676d56dda2250a25f2be + 0x1cac495ab31a8bbf7048f2a9c3de2a24584f74c7eebebf0dc5712e33e54829d8 ) }), qPoseidon2External: Honk.G1Point({ x: uint256( - 0x279b1c2165639e01bcdaae643dba6adf8b15b1a7f4857638d7e5f6ad6652da28 + 0x305a63a64c6df00093e2657a0cce94689c7182f5f98468549b3358586d968d67 ), y: uint256( - 0x23bd605a87ed38122041d0cc1009ccc32a92593be9d070551db7f279b33d4936 + 0x17baddfd284cfad5cd25410b5b8324732b2bb9b4726fb17ba63bd94280d9e6a5 ) }), qPoseidon2Internal: Honk.G1Point({ x: uint256( - 0x0ed92ec11318c6de9902b87e3bcef6e1ff89f2d71986328bd68b3f23a8b61221 + 0x0cced31d3eae22e0e0c6877bd534c9278041b284fac9f9214c70621f02472bb8 ), y: uint256( - 0x1dcf7cdd299382ba00e18738df33dd77b180d58add26d25409be74e9190250ae + 0x010bb37624c55dbb334fedf6bb9c939ba5726810e1cc49b6f21783140e54ac5c ) }), s1: Honk.G1Point({ x: uint256( - 0x02cb2981a57e2779b23f73bebc2dddab83aaa4998d2c2fcb19fa413a50c97241 + 0x2906652eef0b5cd32289af7eaaeac5244d0610d1078d0891b61166e6f79fe48c ), y: uint256( - 0x0da2d60ab999a047276592dcc95e2e15224eefb48a548231ea0fb82019d02adb + 0x117d2e64320fc110c057f76edc918f24efb462b09fd0e1e78d9508bd64e9709b ) }), s2: Honk.G1Point({ x: uint256( - 0x2aaedd3e750846f9876ac9dd0269e5ed9110327b712b5e8350d0fba252cdab93 + 0x2df53bc3cfe6a31c5bdee6e24c46013a9078d03cceb0f5e979964a80bb4d32b0 ), y: uint256( - 0x01ef3839159e2ffe9a8ba2f74bdef197bd16498c6640cf0a07b40dddf0071399 + 0x273ba3f418b6a06d27bb4188934a550f499f08992dc8b84d50e3d048bc6f16b1 ) }), s3: Honk.G1Point({ x: uint256( - 0x07e01a19407084669d25865923e5ecbaa127484cf8b2a03c3f4457e3eae6b381 + 0x1a18b569736827f677d023673871d477f2592075bfc4cb30931f95744cfcaf40 ), y: uint256( - 0x0198a60c4241f7135125754519002d5386bb26cf5dddcbb0f7e054eb70a5e03e + 0x2cb5a5d7784a216d8b9f0c8fefe846cb25ba0e68733e7a4d342ef5b2046e9d6e ) }), s4: Honk.G1Point({ x: uint256( - 0x1b4249a4142ba9fd82006e5cd0a75ff9ba03feb83204141bc82d1cd69920d662 + 0x1b2a513efacd8ff03f6e5e5e59ebac2a37094ea7bc55ac6ae6aa64c1ef44f446 ), y: uint256( - 0x081f0525ce6d6fb722156fb6a21ae8d7144d7dd36b2b9c66971fa3f3a841c420 + 0x237f0ca344422272ae876660b8e74665a7555feb4b726a3f216206cf2d4edf12 ) }), t1: Honk.G1Point({ x: uint256( - 0x1e97dc4796dae38598049f73a02e7c33d2c059852c1af19c9f0ee3312df4d41f + 0x23e3dc399cfb420ca1d4c5d1647660e33a85abed22b19a35a3e9bc1ac453671f ), y: uint256( - 0x1836391c7d6f155fa5590e68e400846add58e66d7a8221d801a8550b648f5aa5 + 0x182cc6d1ef5e4db7dd3d7ffacc94dda14e22cde6a65817d29bec9cd5477c3d05 ) }), t2: Honk.G1Point({ x: uint256( - 0x27d11740d6fa02881bde033f583973b6d612009b751197f76934d08a4737c442 + 0x1cf491137dd2886b0aa1f52e1c33b1a42e137942ec903272fee32835ec2af9b4 ), y: uint256( - 0x2ba0de31ae49034e4275f72290f88801444ae2d8375791da6e327c83e22d854d + 0x01aa859ed86b51dd160af31231f485de835f15c502df5e4b65af46eb034be89f ) }), t3: Honk.G1Point({ x: uint256( - 0x1c073330c1151fdb3ddfba1578362fcb65485225f8c219d459db039890724a8e + 0x22a78d6fd55592cbaad2152296b9cb77a6de8ab2c5ade4a32961129682f5f852 ), y: uint256( - 0x20362388f013a2def8eb9e2629526a010e67cf43ddcb0b2ef0cd3520e0ce06cb + 0x29d63f029f9f6d0a8ea7f2e01d4e90c63ae63d06d202538cab4ca55c695934a7 ) }), t4: Honk.G1Point({ x: uint256( - 0x008d92aef0b2d4a3e1f9346ab724d6e847b0a21e1e3b044702acb005115f81b5 + 0x1db64843e94d5b8f623d28b39f49c0226ce8d47ffecdd01377980b4ce7c52dba ), y: uint256( - 0x07520001001210440d025b116e975fd669f25df48d45f0340cf0590ff394e56b + 0x04a0bebb79e4324efa91aa9373f756a80b643beddd20ae24bdd74d2ce4c2336c ) }), id1: Honk.G1Point({ x: uint256( - 0x05348e59dd4f82c7f990d791771c7950c721486acdda0a518633634e4df52103 + 0x21778a23231a8009cbca5f8700dcc98f0d9403527b87be4f25fa495d47d9e609 ), y: uint256( - 0x0eff0ade8714fafc5e34ac2e2bc447c420d107609a9e962f2d9acb48fa7a389d + 0x164bbbf54a603da58c77bfab749076ed1946014cf14991d63b9ac3b525a46fb9 ) }), id2: Honk.G1Point({ x: uint256( - 0x2062e391f886d00a6263b28df737bcae9b81fe66bafe00ef2369b13ef5649e26 + 0x092513b2a96c7392fc096c0a7fc5dbf65c74df83042833602afd9aa7ff1955d2 ), y: uint256( - 0x02d0d8cbd5a54535ed107e8efd755e87bf9a18c96407b9034b441ce42427b296 + 0x24ce807886b2001eb739dd35d3a29a1cecf6e15a2a45c3284ab3cdede7765a66 ) }), id3: Honk.G1Point({ x: uint256( - 0x076fd28b31db196c88632dd8829feb6470617952e2fd3ea576d963c54982b8c0 + 0x033bd3f1cc32592fedab742979b1f2b8d218ac17fb3ea0d77f0d99422308ef77 ), y: uint256( - 0x22ddf018ec6bae5d0b436121f15fa98f4a59154a4d359f017b6c1629cdc118ad + 0x1eda4449ebf9a675b8cc6e6e0efb5e755f6a4ee58f28d1debaf5119a09c4584b ) }), id4: Honk.G1Point({ x: uint256( - 0x2f84e2938e075865a254449169e7754aa28e1b241da7fa84cbbc47d035f5b3bd + 0x1b68af50a04becb5197af58c8ac58d7a4bec50e5c34d7cb127d1949b434900d4 ), y: uint256( - 0x18e099056bcf7c71158ed094e9d68a7d12a9097c2e4ae6f7a3dbc394c4252559 + 0x2973fc3d6abf8c3bfc9c9cf6df6bf2c6b1a49e1afb7dfee269dfdc12d806ec99 ) }), lagrangeFirst: Honk.G1Point({ @@ -237,10 +237,10 @@ library HonkVerificationKey { }), lagrangeLast: Honk.G1Point({ x: uint256( - 0x02b5c202f3429553542d19e5b520e255ce10a07dbc62ad4110543c3ed7c1c98a + 0x26b232c42dd7897d63d1035f4d4f289e5fd1d91efc1256004067181f89ac9a4b ), y: uint256( - 0x2b30b29cc6eaa91529ae05b974f76f0c33bcbbb7fea2fe3463b1414ac3447a65 + 0x26f53a9044d5b4e46e48e97716f4b932a3ba69c74d8c0982584d91de35f3e897 ) }) }); diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/small/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/small/DkgAggregatorVerifier.sol index bc2904fb62..bf0a7aa8bd 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/small/DkgAggregatorVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-8192/small/DkgAggregatorVerifier.sol @@ -7,8 +7,8 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 44; -uint256 constant VK_HASH = 0x0a82134f83eb5f1b5960b05bc5960878ca0fc2188078e238d560f9cc9eb095a1; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 62; +uint256 constant VK_HASH = 0x2922a14c061a6a1bc81cf882de23f138842e10db7e1aac6910f31bd05d4dfa3a; library HonkVerificationKey { function loadVerificationKey() internal @@ -18,77 +18,77 @@ library HonkVerificationKey { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(2097152), logCircuitSize: uint256(21), - publicInputsSize: uint256(44), + publicInputsSize: uint256(62), ql: Honk.G1Point({ x: uint256( - 0x0cac95e647ff55814d50e5db13a72d87dd0e79af79336c90f3486d7b0c71f487 + 0x302235e58a3136bc1406e492c3fbe8c9cf0969cf0f6334c85f56d17591fe2af9 ), y: uint256( - 0x1413730f6ad6d43396960c42aed8e45f003a6422b033ca49cbdc3a9715e7ee13 + 0x1c22777668ea9e8b5d640d3eca782238e6bd4a10660e82dfd2da579e2616bc31 ) }), qr: Honk.G1Point({ x: uint256( - 0x0588f9301ac43ecf481e9444bdb646a508379bbe75dd9e64733e18d7c50e69f6 + 0x0a9b89519930b446170b7c1a111ed441ef30dd5b957743635b7917428935a7e4 ), y: uint256( - 0x1e1a0cdb954e2724277cd8972286618b91940d9d2c83cc958960b6143ebf2caa + 0x0e1119b48b51529b1ad32e623ee38abdb97d3af0c504e7caa1ccbd7bbde9317b ) }), qo: Honk.G1Point({ x: uint256( - 0x1d216cd114527fca8eda884fc50239dee0000ad61e22cefeec8988dd99fb3a0a + 0x00878df0b8f19d116666940b548a6826154c835c5f5afb48f8c6bd815804c9ae ), y: uint256( - 0x227e7c5ff806a469b2e2f34d6ce8b1e434e2d664a2266f8dbfde263f0b242695 + 0x2da209d81042e6589ada2c18d55b0e5918cbd5acfe28b96286f3a7eaaaa60844 ) }), q4: Honk.G1Point({ x: uint256( - 0x13b92626f1921021b80b1576877d3189d8a8ebdb37c068a9034860685567fe83 + 0x1dd1c64343ef1d8351316b8853ac6b2f87c8f06c01fac58eaa85b3faa29c9d19 ), y: uint256( - 0x0bbc31a5059cd525c6189f39ab772d96fcc5b0a5c0316d29ba2f14a63937f4df + 0x2b59632df201a608aef6bdfc1d5778ee3855acc8cd7cbfcef938fb6430395d00 ) }), qm: Honk.G1Point({ x: uint256( - 0x2ef616e6f5b888475871253e3247af5fe52a5400945cc369d3f5989854492b79 + 0x2603b25f08eaccd96ccbe7d22f084c4ede6fc3ca1bbbbe4a2e30adad05cc1ed6 ), y: uint256( - 0x023eb6d7c7205aea527a18751ae2fb1d3a4027cd07a1657d42ef4bb65d5a7f4d + 0x2d002a2a414a86f77c37bba96a106f9652150cc547087534b0e4e3512082ce65 ) }), qc: Honk.G1Point({ x: uint256( - 0x07d6fe03af868063d9ae29a692f2c692f2b896e38a5a7be65d5837af90a95535 + 0x0724c6870d4abc7232db59a66fbefd297cb819a05ad6e174bf4b7dcc54a6eed0 ), y: uint256( - 0x03cd803a932d06623bea4f171afb877f41fd9e84a6e5ddcc6e6fdfff09a65b4c + 0x2bfd3d06dc7685cbd98d0f2273d34958a1127ab51b9d6c2a7546157749f1892f ) }), qLookup: Honk.G1Point({ x: uint256( - 0x2b332d7295465c986365baefb7e3f695d099355dba5a99b9796029f4291d33b5 + 0x07decae55629495330c3da15f6f2c0be18906fafea84c922e0de42dc3d4c4a87 ), y: uint256( - 0x247317a367a6359f9b617008e5cb54a601dc28eb9588ae4e84ba7a6aea8310a3 + 0x0f61a514cca0114b9b69ab615669e47d6825d12d94251dabda103c05bdec5709 ) }), qArith: Honk.G1Point({ x: uint256( - 0x1cc12403049c902654e15171d62bddc50c8740136f73e1059d8e952484cb2d97 + 0x1631367f5549fdd833f47d1c35c05776aecacc374d0fb58c947b34766191c687 ), y: uint256( - 0x27680e2fc4bfc1650e7cdab57154ab5c112baf1b097b4d5d89016356dec1c260 + 0x0b6e72fc1ff848796de598b976d4e2d1d3b5ed40d451074c84268b78b0f67dd1 ) }), qDeltaRange: Honk.G1Point({ x: uint256( - 0x0aed08be485921b334eae2c91582936e5ecca7451463ae48098f77b224b2a2d2 + 0x0353e86bdff57fa8f93f56aa204786f341bd29dd8c902d235bc098e25037c21c ), y: uint256( - 0x100e38dd36459107d31330f5c50337be4bc13bad294c952b636e1eb5cf40c2d4 + 0x0fa833bf724867f5929696e77dd32cdaaab56b8e8a8e100fc846ae13218a6ef8 ) }), qElliptic: Honk.G1Point({ @@ -101,130 +101,130 @@ library HonkVerificationKey { }), qMemory: Honk.G1Point({ x: uint256( - 0x1986a38dbd98dbb43a709749def7205d6ca8c42566d23bd1715ad754253dc181 + 0x02f4f60ef5fd49f5e7b85078a621926408410a65a634c4fc77258d316030c507 ), y: uint256( - 0x1fa8da268c6a34704f816b98000c82082661217486010787d04fa5a8d7a7c2ac + 0x2f40786996c609f279924e151bab81a31278253d5ebc3299d17c1f73f66dbc83 ) }), qNnf: Honk.G1Point({ x: uint256( - 0x151333f1b4a0432e248aef0f70abcc5da8d15eee19c44a4599260c260fc65641 + 0x0be34aa4be26460e82e73a7575e3abe0b2f346f862bc3f1847840bb014cc2a05 ), y: uint256( - 0x2af494a83912cfc60944cf1c0f1977e139ef8f9edef553dd29171d8debe62208 + 0x249256ef0590216f1014bb67d07b9f4e5c325627c986f9b8c5b33d4ebdaa0aad ) }), qPoseidon2External: Honk.G1Point({ x: uint256( - 0x0c51875bc3563cf9d3d0e14c284f0a4a246123640055287034862fec76c72d7c + 0x2e491efee28006c74b45f5db9559c3ae385a469296d4b361d56d7d5b891a4b2b ), y: uint256( - 0x1fc569b221412f5addc1104620328687238fc7c174572cfe3f0979a65586da2a + 0x13b5066a0fbeeb6cd506b37a35eb2e054d3517fc7415a7e980d8d686419e86b7 ) }), qPoseidon2Internal: Honk.G1Point({ x: uint256( - 0x218254e23349e8d5b319282445aa3cd331239f758cfce1fd06c89b08acbfb4ef + 0x07358865dbaae0bdb0cb161d8a673fbf309d2b1e980335d0d279e0d162bea144 ), y: uint256( - 0x03ff9e75d97d5fa629bda5491c6dab9e02e1889441504f1b66f3d94deebfaf13 + 0x2d8eaf7895f693d55fede64d6a89350870bfb319cfe90b79a82c0d3b9a58c139 ) }), s1: Honk.G1Point({ x: uint256( - 0x1bab0f0a4279b7d08922457f0c6fe473040439bff0700f2639230b5c4c28d7ef + 0x0ec866bfaf2e750ef4fdfdf8d40566e04f0c8a0b6ac52f65301c0f43714a9d2d ), y: uint256( - 0x12d44ee469cbace34af644d07be464cd57701be643555ef19311667d551690ae + 0x1c2888cb407c86c2ade230af33756aa9a98aea8ca8888088cc0f7516e8bdc677 ) }), s2: Honk.G1Point({ x: uint256( - 0x2feedcceb59d962b52af162bd20af8c4e5555e4809edd509ae41def57eaba944 + 0x25cf172dace147581bf35067119b6832108a7f05a14557f2e2021f72f5f2a16c ), y: uint256( - 0x185fa0d104d46cee041d1cc5c9d0903839af0b24c4f3e8477914bd02b760e0c7 + 0x2b2b7e2f1e4c87d66aef13a8ea890b263dec9d88de834db2077a2ab94b997b67 ) }), s3: Honk.G1Point({ x: uint256( - 0x0c3733d525e9d982c3bcdc291fbfa79bafb260f004ebbbddd02389f3b6ed76c7 + 0x1f65ea2232425a316f4b62e70d1d988596440e99c783a6b1d6737c82da38a007 ), y: uint256( - 0x1a1df4fa4f7d6d2ebd34664077c0c50dc88c86cb298d78dbdea1b528e4d0eaa7 + 0x0a600835e7af9e0850fe3afa726acb7dc0a2067a30389f0d4e2619931d3d13ad ) }), s4: Honk.G1Point({ x: uint256( - 0x03099b0dd7c8b49b3ae19e77843e078a3121d657b9e6a3af6676a58b969d1ce6 + 0x1acb8878b482309941954d2868c489f9ae77a49994c0ef11bdb178951b08f4b3 ), y: uint256( - 0x1775116eed231d5dfab14df7b27670e070cd1238df9cff5c61b933c5d358c17d + 0x1f567014043b887bf81ac3214a6eda7d55b00b50354a32baa80ed4aef37f9202 ) }), t1: Honk.G1Point({ x: uint256( - 0x0ef574fd529b37648cdb9647e1b67e579ecde121879ba9b7bb6d6590dd2761bd + 0x2dec1113879ec9e894d2e63cab4f6b70b4f0453de3f71c0b7cef5d07ccc5fb16 ), y: uint256( - 0x1fed764a20d9dd8159bb659274c3f93d4e182c6825ccb2db8f902e0022a26ca5 + 0x2e569bd7eb479c5d513edc4d10a5eb210ddde4e10a46291b659e3e904f7cb9ed ) }), t2: Honk.G1Point({ x: uint256( - 0x1b38893c0ec43597b087055890d310f5f5fddb5a4fe54a7865ee643db6fc283b + 0x14c5e72fb4850c73117d61faafb41666f499732f77b2acd2927985e0a44d7a0c ), y: uint256( - 0x1f25a682a2ef3d556dc2db54204735412fadc772789b4f944c970e752c058d0a + 0x263108f9225b99fb35c4239a8d0efeb35dbe9f791937033c621e397344de6522 ) }), t3: Honk.G1Point({ x: uint256( - 0x124f08a1d1137d599f40c34b7c907e758eee3eceb9e7d4dd8b2c54ed5e73df4a + 0x1046bbe830ffeb03264fa686a6507e553f840a287a840b12d9628c85306d271c ), y: uint256( - 0x0dc5a9b196bf2c10844778e9bfd0d553b1fabdb253380934a616e365650aa3be + 0x14da3e1300109c126d74a9b37a8d5cf302a31757293feb3bdf52acd9e99d7257 ) }), t4: Honk.G1Point({ x: uint256( - 0x2994d68ba1040ffe15813ba0f2ee34e5b66ab4a71f4f82b13eb7195b0a34586b + 0x122b57aac7c9e1cc87c8fa7a67aba40e3ee3e1540dc9f02eb58a8bcb86fe6eca ), y: uint256( - 0x14054ad735bc910ff07390c9f2ba0c0f681f80f64211e7b9e37f81e79674ecb4 + 0x2b4c091e41c1cbad2b4ead8946df008438021eb24532d23d03063af92151a5f7 ) }), id1: Honk.G1Point({ x: uint256( - 0x249820aa7cd8dc86aec4a9087c5807ad979bd94b5a9a4f3a47f6bfdfd1d506ab + 0x0fe4a542a6e02089b5c1a7a1534883353674e5c7ca45f120f0762c260e9abc20 ), y: uint256( - 0x242ebf3c23d4351839f1bfaa0d166a9175d4817e33892add53b12485aeb4093f + 0x291237d0a5a8c03f166dcb431d87715d4a1ac02076dd1445ccacc8622c82c5cf ) }), id2: Honk.G1Point({ x: uint256( - 0x15774609504cc2fb4da60c68e6ca2ed079aaf4f3409aef5b2327622ce3255c76 + 0x27834093b57fb9b2c2947be5da5443c0a3f3584e367401a7cbbda4fcddefb359 ), y: uint256( - 0x042addc27b9997a4f07452214256613bd81e8a4edcd427cc00ed82246aa920b2 + 0x00dcb7595e073b9043a618e1c076ffe2340e9278aa035853b1a0afc9d8a8d64e ) }), id3: Honk.G1Point({ x: uint256( - 0x3057e5ef1d8ac6ac92da42ab91175c0ca5b82d3e48fb2a5a5bda3d090dc1aa57 + 0x27f5f215ec1b3bb4bc5f1f964f9d56e05996bff49e953e9542fd244df2d9fa0f ), y: uint256( - 0x0de5f0ec4690f8d102a96b0b07d159c5f032581de1ba32dd7a0a3bc48233841b + 0x0bba346cbe767d98d29e6fbdc30b990e8badf2754a26acf33cdcb83d2b45cddb ) }), id4: Honk.G1Point({ x: uint256( - 0x0b47ade061883791a28de847ce5fb518f872a5fff4253b398c4c63e6454534af + 0x0408154cbd984793c89d7a193ebca827f3e3b3c5ef20c261dc0081de4b211ffd ), y: uint256( - 0x115024caf2fd0f22a8a4a2317f6621e96750f611995f09e8b250bbd7d08cdc29 + 0x2aa57ee15b7776432eeae76830bbaf612bc017fdf5feab0f84d75caa8eb05b69 ) }), lagrangeFirst: Honk.G1Point({ @@ -237,10 +237,10 @@ library HonkVerificationKey { }), lagrangeLast: Honk.G1Point({ x: uint256( - 0x28b8ab75cb2e4283e972bc289e3d1202008e3778162ff0312e4620bc84389f45 + 0x15411e280f9e3908683e6f0ac01857629c7160bd94e3082d3a6dc9e2d3c755fd ), y: uint256( - 0x25da79b032826655725d588bbfe46b70e71cdd864c4939b6b9a8e7ccdde3c3e9 + 0x0ef54c57063f4cbc2202f29e37fe18806346c469fcbcea02f97fb835e697e976 ) }) }); diff --git a/packages/interfold-contracts/scripts/protocol/deployContracts.ts b/packages/interfold-contracts/scripts/protocol/deployContracts.ts index 0c7f1af008..da56851b72 100644 --- a/packages/interfold-contracts/scripts/protocol/deployContracts.ts +++ b/packages/interfold-contracts/scripts/protocol/deployContracts.ts @@ -6,6 +6,7 @@ import { bfvConfigsForChain, getBfvDecryptionSubCircuitVkHashPaths, getBfvPkSubCircuitVkHashPaths, + getBfvPkVkBindingHashPaths, readVkRecursiveHash, } from "../utils"; import { ADDRESS_ONE } from "./constants"; @@ -440,6 +441,11 @@ async function deployBfvVerifierRoute( dkgAggregatorVerifier, readVkRecursiveHash(pkPaths.nodesFold, config), readVkRecursiveHash(pkPaths.c5, config), + readVkRecursiveHash(pkPaths.skC2Chunk, config), + readVkRecursiveHash(pkPaths.esmC2Chunk, config), + getBfvPkVkBindingHashPaths(config).map((filePath) => + readVkRecursiveHash(filePath, config), + ), config.h, ); await pk.waitForDeployment(); diff --git a/packages/interfold-contracts/scripts/upgrade/validateSecureCrisp.ts b/packages/interfold-contracts/scripts/upgrade/validateSecureCrisp.ts index b8045adf05..161995092f 100644 --- a/packages/interfold-contracts/scripts/upgrade/validateSecureCrisp.ts +++ b/packages/interfold-contracts/scripts/upgrade/validateSecureCrisp.ts @@ -392,7 +392,7 @@ export async function validateSecureCrispUpgrade(): Promise { equalAddress(pkRoute[0], recorded.pkVerifier, `PK route ${index}`); equalValue( pkRoute[1], - 3 * expected.h + 6, + 3 * expected.h + 24, `PK route ${index} public input count`, ); equalAddress( diff --git a/packages/interfold-contracts/scripts/utils.ts b/packages/interfold-contracts/scripts/utils.ts index 49a7287f5e..562228a4ec 100644 --- a/packages/interfold-contracts/scripts/utils.ts +++ b/packages/interfold-contracts/scripts/utils.ts @@ -336,69 +336,106 @@ export function getBfvPkSubCircuitVkHashPaths(config?: ActiveBfvConfig) { } /** Recursive VK hashes used to build the DKG pipeline binding manifest. */ -export function getBfvPkVkBindingHashPaths() { - const root = getRepoRoot(); +export function getBfvPkVkBindingHashPaths(config?: ActiveBfvConfig) { + const root = config ? distCircuitRoot(config) : getRepoRoot(); + const recursive = config ? "recursive" : "target"; + const defaultVariant = config ? "default" : "target"; return [ path.join( root, - "circuits/bin/recursive_aggregation/node_fold/target/node_fold.vk_recursive_hash", + config + ? "default/recursive_aggregation/node_fold/node_fold.vk_hash" + : "circuits/bin/recursive_aggregation/node_fold/target/node_fold.vk_recursive_hash", ), - path.join(root, "circuits/bin/dkg/target/pk.vk_recursive_hash"), path.join( root, - "circuits/bin/threshold/target/pk_generation.vk_recursive_hash", + config + ? `${recursive}/dkg/pk/pk.vk_hash` + : "circuits/bin/dkg/target/pk.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/c2ab_chunk_fold/target/c2ab_chunk_fold.vk_recursive_hash", + config + ? `${recursive}/threshold/pk_generation/pk_generation.vk_hash` + : "circuits/bin/threshold/target/pk_generation.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/c3ab_fold/target/c3ab_fold.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/c2ab_chunk_fold/c2ab_chunk_fold.vk_hash` + : "circuits/bin/recursive_aggregation/c2ab_chunk_fold/target/c2ab_chunk_fold.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/c4ab_fold/target/c4ab_fold.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/c3ab_fold/c3ab_fold.vk_hash` + : "circuits/bin/recursive_aggregation/c3ab_fold/target/c3ab_fold.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/sk_c2_chunk_finalize/target/sk_c2_chunk_finalize.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/c4ab_fold/c4ab_fold.vk_hash` + : "circuits/bin/recursive_aggregation/c4ab_fold/target/c4ab_fold.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/esm_c2_chunk_finalize/target/esm_c2_chunk_finalize.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/sk_c2_chunk_finalize/sk_c2_chunk_finalize.vk_hash` + : "circuits/bin/recursive_aggregation/sk_c2_chunk_finalize/target/sk_c2_chunk_finalize.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/c2_chunk_batch/target/c2_chunk_batch.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/esm_c2_chunk_finalize/esm_c2_chunk_finalize.vk_hash` + : "circuits/bin/recursive_aggregation/esm_c2_chunk_finalize/target/esm_c2_chunk_finalize.vk_recursive_hash", ), path.join( root, - "circuits/bin/dkg/target/sk_share_computation_chunk.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/c2_chunk_batch/c2_chunk_batch.vk_hash` + : "circuits/bin/recursive_aggregation/c2_chunk_batch/target/c2_chunk_batch.vk_recursive_hash", ), path.join( root, - "circuits/bin/dkg/target/esm_share_computation_chunk.vk_recursive_hash", + config + ? `${recursive}/dkg/sk_share_computation_chunk/sk_share_computation_chunk.vk_hash` + : "circuits/bin/dkg/target/sk_share_computation_chunk.vk_recursive_hash", + ), + path.join( + root, + config + ? `${recursive}/dkg/esm_share_computation_chunk/esm_share_computation_chunk.vk_hash` + : "circuits/bin/dkg/target/esm_share_computation_chunk.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/c3_fold/target/c3_fold.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/c3_fold/c3_fold.vk_hash` + : "circuits/bin/recursive_aggregation/c3_fold/target/c3_fold.vk_recursive_hash", ), path.join( root, - "circuits/bin/dkg/target/share_encryption.vk_recursive_hash", + config + ? `${recursive}/dkg/share_encryption/share_encryption.vk_hash` + : "circuits/bin/dkg/target/share_encryption.vk_recursive_hash", ), path.join( root, - "circuits/bin/dkg/target/share_decryption.vk_recursive_hash", + config + ? `${recursive}/dkg/share_decryption/share_decryption.vk_hash` + : "circuits/bin/dkg/target/share_decryption.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/c3_fold_kernel/target/c3_fold_kernel.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/c3_fold_kernel/c3_fold_kernel.vk_hash` + : "circuits/bin/recursive_aggregation/c3_fold_kernel/target/c3_fold_kernel.vk_recursive_hash", ), path.join( root, - "circuits/bin/recursive_aggregation/nodes_fold_kernel/target/nodes_fold_kernel.vk_recursive_hash", + config + ? `${defaultVariant}/recursive_aggregation/nodes_fold_kernel/nodes_fold_kernel.vk_hash` + : "circuits/bin/recursive_aggregation/nodes_fold_kernel/target/nodes_fold_kernel.vk_recursive_hash", ), ] as const; } @@ -501,8 +538,8 @@ export async function assertBfvPkVerifierSubCircuitVkHashes( getBfvPkSubCircuitVkHashPaths(config).esmC2Chunk, config, ); - const expectedVkBinding = getBfvPkVkBindingHashPaths().map((filePath) => - readVkRecursiveHash(filePath), + const expectedVkBinding = getBfvPkVkBindingHashPaths(config).map((filePath) => + readVkRecursiveHash(filePath, config), ); const [onChainNodesFold, onChainC5, onChainSkC2Chunk, onChainESmC2Chunk] = await Promise.all([ diff --git a/packages/interfold-contracts/test/BfvVerifierRouter.spec.ts b/packages/interfold-contracts/test/BfvVerifierRouter.spec.ts index 0bcb71dc86..b46ca47a7f 100644 --- a/packages/interfold-contracts/test/BfvVerifierRouter.spec.ts +++ b/packages/interfold-contracts/test/BfvVerifierRouter.spec.ts @@ -52,7 +52,7 @@ describe("BFV verifier routers", function () { [], ethers.ZeroHash, ethers.ZeroHash, - proofWithAnchors(36, HASH_C, HASH_D), + proofWithAnchors(54, HASH_C, HASH_D), ), ).to.equal(true); expect( @@ -62,7 +62,7 @@ describe("BFV verifier routers", function () { [], ethers.ZeroHash, ethers.ZeroHash, - proofWithAnchors(12, HASH_A, HASH_B), + proofWithAnchors(30, HASH_A, HASH_B), ), ).to.equal(false); @@ -73,7 +73,7 @@ describe("BFV verifier routers", function () { [], ethers.ZeroHash, ethers.ZeroHash, - proofWithAnchors(36, HASH_C, HASH_A), + proofWithAnchors(54, HASH_C, HASH_A), ), ).to.be.revertedWithCustomError(router, "VkHashMismatch"); await expect( @@ -83,7 +83,7 @@ describe("BFV verifier routers", function () { [], ethers.ZeroHash, ethers.ZeroHash, - proofWithAnchors(13, HASH_A, HASH_B), + proofWithAnchors(31, HASH_A, HASH_B), ), ).to.be.revertedWithCustomError(router, "InvalidPublicInputsLength"); }); diff --git a/packages/interfold-contracts/test/BfvVkBindingIntegration.spec.ts b/packages/interfold-contracts/test/BfvVkBindingIntegration.spec.ts index b75fcf76a3..34877fa85d 100644 --- a/packages/interfold-contracts/test/BfvVkBindingIntegration.spec.ts +++ b/packages/interfold-contracts/test/BfvVkBindingIntegration.spec.ts @@ -119,6 +119,8 @@ const hasCompiledVkArtifacts = (): boolean => const describeDeployTimeVkChecks = hasCompiledVkArtifacts() ? describe : describe.skip; +const runFoldedProofIntegration = + loadFoldedArtifacts() !== null && hasCompiledVkArtifacts(); function hexToBytes32Array(hex: string): string[] { const clean = hex.startsWith("0x") ? hex.slice(2) : hex; @@ -318,9 +320,6 @@ describe("BfvVkBindingIntegration", function () { }); }); - const runFoldedProofIntegration = - loadFoldedArtifacts() !== null && hasCompiledVkArtifacts(); - (runFoldedProofIntegration ? it : it.skip)( "folded aggregator proofs: artifact VK hashes match publicInputs[0..1] and verify passes", async function () { @@ -328,7 +327,14 @@ describe("BfvVkBindingIntegration", function () { const folded = loadFoldedArtifacts(); if (folded === null) { - this.skip(); + throw new Error( + "Missing folded BFV artifacts. Run the insecure benchmark or set BFV_VK_BINDING_FOLDED_ARTIFACTS.", + ); + } + if (!hasCompiledVkArtifacts()) { + throw new Error( + "Missing compiled BFV VK artifacts. Run pnpm build:circuits --preset insecure --committee minimum.", + ); } const dkgPublicInputs = hexToBytes32Array( @@ -341,12 +347,9 @@ describe("BfvVkBindingIntegration", function () { dkgPublicInputs.length !== DKG_EXPECTED_PUBLIC_INPUT_LEN || decPublicInputs.length !== DEC_EXPECTED_PUBLIC_INPUT_LEN ) { - console.warn( - "Skipping folded proof verify: folded artifact public-input layout is stale. " + - "Re-run insecure benchmarks (syncs test/fixtures/bfv_vk_binding/folded_artifacts.json) " + - "or set BFV_VK_BINDING_FOLDED_ARTIFACTS.", + throw new Error( + "Folded artifact public-input layout is stale. Re-run insecure benchmarks or set BFV_VK_BINDING_FOLDED_ARTIFACTS.", ); - this.skip(); } const expectedNodesFoldKeyHash = readVkRecursiveHash( @@ -492,7 +495,9 @@ describe("BfvVkBindingIntegration", function () { const folded = loadFoldedArtifacts(); if (folded === null) { - this.skip(); + throw new Error( + "Missing folded BFV artifacts. Run the insecure benchmark or set BFV_VK_BINDING_FOLDED_ARTIFACTS.", + ); } const [testSigner] = await ethers.getSigners(); @@ -500,7 +505,9 @@ describe("BfvVkBindingIntegration", function () { folded.dkg_aggregator.public_inputs_hex, ); if (dkgPublicInputs.length !== bfvPkExpectedPublicInputsLen(BFV_DKG_H)) { - this.skip(); + throw new Error( + "Folded artifact public-input layout is stale. Re-run insecure benchmarks or set BFV_VK_BINDING_FOLDED_ARTIFACTS.", + ); } const expectedC5KeyHash = readVkRecursiveHash( getBfvPkSubCircuitVkHashPaths().c5, diff --git a/packages/interfold-contracts/test/fixtures/bfv_vk_binding/folded_artifacts.json b/packages/interfold-contracts/test/fixtures/bfv_vk_binding/folded_artifacts.json index d5991d8bee..fb831f64da 100644 --- a/packages/interfold-contracts/test/fixtures/bfv_vk_binding/folded_artifacts.json +++ b/packages/interfold-contracts/test/fixtures/bfv_vk_binding/folded_artifacts.json @@ -1,10 +1,10 @@ { "dkg_aggregator": { - "proof_hex": "0x000000000000000000000000000000c7e21cadacf99e128fdac681562d23eeec000000000000000000000000000000000005b7c7f0ab17dc3d7d6553cd4a59700000000000000000000000000000004677690fde300bfd640eb2fae133e5e107000000000000000000000000000000000022472163e8f1078c3e0bd9bec5ee120000000000000000000000000000003db48a2f272569f39b0626849cd6e74aa000000000000000000000000000000000002cdd4758421811d511e214e6d5ab3a000000000000000000000000000000938955c354aa5279326302eacdc33169c800000000000000000000000000000000000c17a0b0609c41f369b6442aa43ad602970a3cdda4fc65202ddb65501d03acc6531323e3a5290158e1d2fe8a433d4a1e57351993b3180b2e5c17111af80c4fa249829aea4e7bd62e30cff5c4c6603b2998aa38dd5211871963134a9d6f4b709a321cc3da002d8cecc30fd439576c7e1bccec3876555ed306a41bb088edca7d8f51ff6c6e725c53d76257d4393f197b1fc8e997419723d5a3afb20aa62dfcc52e91af3defc50581a9af349f4a93f5fc093ae81baff2271bd56a201ee1e6cf8c206dc59930b42b8e054d516079f1a566236576df5871c0253d37e3037ffe5e063f86896a506deda5047ab1205ab88af82d1546d46ebd140f3dcd0c8e09f6391ae9bfeade5d8765b238255eeca94345530667603293f986aa93209ff4df7e47a422849065cc83861e03637e3a856a96321d9ea0b2b8557a5fd17e701cba0c4cd10f50880decefe4674dfeac06d4d2aff70f45df20e6a40e63b763fb7b97bf37505f011f46b2d19d17629f59734f9a98a1232cbb2e76e18313d8e5d1255e6e1838c1945ed209c25cb487506a27a59232472f658ca935eb34e9718cd260edc25d3ab39e859d6b6a01f0202c221a9fd7930d1c45e3534f51c3fe9fcf34ae983ac95e1d297203410296addb8ae9e765c8a21e003d3b14b64aff7775a5f27dd9c92fe5f98fbb720251c5174317f5c608a22fe91951180c1a3a3dfc9952dd2001d980386c741f561fce0cfb7baedb43bd1132b208dac9729911c99486758d54bf8b84c10b88eb85c629f8c9f92cf72661b93e6e1cd8bf4358daf602b1bbceaa5c9c608541669ff8ba0000aeee678dc1abc21b0620ce7bbe7e09b3741f643451986ae7cd2f0554b902fa0184d8b057a02f13b905055ec37906ba5a148b4bdd9b06d8b20c35b695399de25c8ecf283378b6cb52611d097252b35df67995797442c6649f12eea11a3a1f2d198bee01131675a6ebe61388716e37eac0e0494a0d8a0568e525aac5b417b14fb7954d70aba3fe438617026634c15d09972254c6afecdc090204f2e02da9b7028efd2ec8cf8d980ebbd730065dd06d15fb42c3a7f5a692219216c9202fe31314820b0651e6e5dd32f8d3088d87f9721e09f7647ed16b8f2986f3a4a1578a6cd847b393cfef466fff3c462b499a110372a6e4a39ecc49039143d5c0a74df5d7f920b0dcae93e6c220873923cbd7ebb8834692b3a7b43f4ea8d93295c0626c7426a64a2234386a9e850a432615448c861345586ffa25a1ec1ed53bd0084ccc2bcc49061009da97ea4130940b0f53a95cc0986cb495f2c8448383b9414ddccfa9749b9cb63376476ef5fb2d2ffe45f196687f2201384b7ee57672b8a3df3a0e80b1cf4a9db6383d29df85af0b0b3fce1bfc9341e7bbed974ec70879f5e81f02ae9136809150d23e7b1e016708ca838d9bf5d886bd1d35541da0d6a94f12c2991ba6965d775aa7cba0e82b2a1c0768cdac1a8cd66c9b95d780fe83dd5a33359723fb09e1eb20d22c1c6e46b42675356c3e4e26b68ae39e3d6f482ca2a26f2d4b2976fb5b87ce0e8bac1dcdf80bbaca96a5dcf6383c010861359d9a6a75d2f74d53768edefc61d07713547db91cc74bd7fc81d8b249e94b42ed939374cd0ea97d8b8032fc529ace86a8994b04211b3e82e3feefe5b38bd07dd1110afd04444d90647036a30089ec957ed7fa290c1210b89f01e6dc998409f3cffd46c20027ecd6a07abf5331f84346b4ab0cac2d3abb5247422908271214fa131a5a8eb9457bff62f2717ae0a2290bbb5e13552a1dcc9ee306974094d04fb569aec00e5c71cbe6a26324856f781c4b57e91b91231cae50077c8a1560105b6614ab9c076241699a21fc7f8b6915a0f06371d87924bf03ffb57d3b4bd7a4037f25ed10d8e09259768a42cbbdabebae5da166ddc629d1d659ef54a9a7152a5023d0906eb3bd944bbee6ec6606791932b2371e5dba0307d247fde370b8cd07f7d486aabaa54c6da1013bb768c5aa37816af78478072a264eb0e33a77897e6251dc8b5e7a61413932df980ac731843f0b8da90d9540157d645991752fece23237b146036eedf8b42c233f7bc90f6105dced351bf7e704dc7118534405e15e3c892b090ea37dab902d6b74ea36d0e4af88d0dd6b22d7002d4fc87f36834540739118a37c1ccb276c7ef7516e9f2decae28d1f8c232830796d20fd2ba2e4666e90d980235517061cec43287bfdea80f250fd29138690c08ec88a216e9d6aae07cfb802ee3f044c9918777c39ff18d1d672a523defa16d0bad435cc2afa85c89ad39878cd4b88769dca41160f3f0c7ac27b90c48c1a7b705bac0e9990e0c1ebb66a6f9632249e2f00249b7656bc291b8eb63fdcc7d143718151fe24c0c7b87d1a6807dd2f1341a868b34998bdfe0f2914a1dc7f3e3c2630f2a74e853fb03185ba05d7e49e3babdb3aae97292b95fc0c0482f757cd74df12cc64d59a469707cf86f65fb385fa6976b265fd5dd2ccee7137a3b9e7f1b192b0130e384fdcc246745ba1891c45af6a9d8ef7d37571c739a3b83c368b14bbbb428a1f59c3b19f3768e45e88f1dac7a24da46054f6e44f7601c5d492ad1acecd41daf400ca450ba76fb1c430391056215bc167d458d74e898e8520b1245b1d2a702ce9c4fc91fbca27ef5362769d6c1aa92365b7a2f3440209790d2a277cbb05c17bc1c1aa93cbc70a09e7052415d622ceba78537a3f0c9032ffafb0c4d1861cd1b3a42dbfe340f5f688e88c273ae488d2f49000de1913ee9aa392d3db21fa2061d241df793f1ae0d5e9c925ab1edeae9e08731f69699403c0f9d6e6223afaa75231a8a70ff430ee4febf610c8d1b51ab165f4fa0caaa69e0f14bcee77902ea1009dc14301eb551717182bc21632cf8590eae8e2c65bc086f2c88a423c22bd091126b9a00c7c0a98f1976dfb3d093af290816ac73bbd460d6b96f83143f8a6e3511010617254092cf3e1621423ff98c61feeecd6328fb1dacedd499b3dc28408e04810ccd11184cfa5e974360adcf9f66c5aa6fa292a2f1e7591ee3fbe169ef4b1ced390f17e8b97aa6c9b91297d0a0617fd8064a14c809e7d102b0bc9af6d3d92a86e08228158591b8daab96cf7fd06afc9c69f881f584b3853cb76891d89e6a156dd85de86227941f6b7a295b244c4f44fdd36934358f59ca3d222318625768301101e7ddd46eea00bb31421c9f63c38fab38e7d8dd9fc139e7fcaba555bd85042fe070020480228f8101a2e72a6e3aa02af6e3b6f45084fc508029e18c44d0216c4fa5deaadbac8fb9afe0a3721fa86b4e85dae06b5f4d611376674da6eb77238338bff179c0674e7b71a592aeb2b59d0436e315499d2be7568e95e4e02c701caf75bad8587c3f73d9d6c18b107d3264c479ae8cfe485b9598aeafad8aec440d09addfc75eafc4ec85c4013b5a28bc4dd9501bf2c5ddd66680b8c7c6ee46e90da76e0ae45d7a7188333855e00ab2ee40bbd763adccc264d73ad6fced9ecf0d05ac5092990b2965d4c98802969eb429af81bb7ff8b33258ca0dcea500c53b7f140e8722173836b6823e685dfb6d8b4a84004e1631c6145adf4c0d8aa6f47dc30bcfb1d3eba216e47fc81f6b2328f0d5e284e210bb0a54e8c25c4cc504241f660675ca3eab13f647d615acbf7dfee7613f5fd3ffe227fd176df41f8a66daedfe06692de822332a5e59194e9aae52df33e8ac7384b13669acd669da1f5fcf47bb1f196e33c90a4a5538218389ece61ebee18e8c88ad5c1566bd01cf56bcd215672fef4fc21d85e1d0f7dd0935065d429aaf575e16ef20721b90e5eb35563809fe2eca8b1681b654dda9403b1663ca18f31f2211e85ad41364bb83651b6643aec02c264ba8d31828f36086aa514fed3171f0b29af6befbd434b16ec0e38471657d2f35260e292804311f86752e9083ed648de0d21f6e1c505b0781e3245f03da1906a0cdddeba2eefef78d2faa3b1b566d63dd4753ac9c4eaeff3bde1297833cc2292c3f7f6f8e628a127b323e08d7fa1b9b9f579075cd0cfb60c545b76745c5a50c1f494e55f80efebe006ab6f998e4432a481e6feda93714074c7c0d2168b414060fcca748de60afa27c1f31d1bf777bce8488dcc4a404b3f059b6a53e6767f61bf7b07a1d17e2a52e1738f0dfb228f45e2cc029f12c3453c97b73fb0131e6aa17c74210ceaed89bf1f1924f1876d123136a9c569dc47aa31c78f9ebba2681421d96b1b177257fee7dab714a3355740776f8447afff9edaf1531b2e9ad0a090513d90bf745275bcf52b8e061e3ea44e146d2ab6dfdeeb4f108986ef89c1106f822e1df2ce9e1c794fec7ad5c9a7c4eac18b07653d99c690c3a95c87c1b979cc226cecb6e4dec0580c592d9a426852e654c619945468b52e04a16821fece64d9f038caf2ab0d1fe295d8b8f4db0240f6c361b7de3d8fe8a600c848df21a0e6cc9209bf758021d1fed2b6a698938c7d5c02043c3ebca17c0498f438dc2cd806b1916a856ebf22a733cb8b6dda37851aaece668c045feb2f5aad82771614dbc56ff0bb31262e28cc7e8c0f287029e91e061091c63faefa743c402647095467d68a318bc9ea2856ff6a05c41ff2f4f7603b893b9abe093a6f530249ecda0189834950a7fe3bfea81f71a23f7514029b693f1af6fc04a9324d68fbe27de940194736a0bb8cf9d518f9310e51a8e94f022e2dbf336cc0aff9177547593b8eda6f7c8ca1541c050bd64edd05a77bf07f6586cda59f22d4ad38868506b619f264e79beaa0df026cf4b8106d250d3e16a9af6122590dd8615ed2279693095bae6b0d5b922008e98c77c0ced4845c4eaf3eb2b36c102f66df1af61e904949b6bc900bb00e30bc1e57f5dd13ee0c94ea495f8e9a1d3b85cd3992f9fc9fba83691c7258e758a24a6a8d7a16e512c13d05583b125b891e04609b573e8a9aab18c4d74c7d193542f30bc061a40e80ecf52deac0ae9ebdc4143cc44284ce4fbcf6dcf28622d0b131ef2ce5582046ec6566860e000b604ad9b3e5cd98c85efe699deeb6e3dc6bc420bf259a9b54c68572012fa2dbe2ea58ab48029a7fd21afa155bcfe45f7f6d66904c3758c3f0d86f2fd204970cc0356c9b7895ffb6e4cd0bfc647770176fdee5c0159f0f0b6462abe2c305cee964f1e0ae97d5874d92da2bcab5e05e2b87490470687ca9442013899ff3768231abb02fe7cbb129e4e304134e20b078d3600d8221f2a55e9b403bd785cc0fdc0677a3610a047b8d3098c516405e17907e7723a3f202b12a26b95e218d1a843b7b2f4e927891c20d3e6957b3cd8ac84489398984924690c6dae04bcc5549fa060ce0c5e32137892248e23ebe2caa9d1cd3da23d45119a8e27069907cbb0525a64ddd7dc9f51620346a866cfbef30216f6cdea2b3d221e4053611fe591b99cac44a0796d3e1cfd898a95215134c712f9a2490dc7632307ccc92defc1afe895e0fe89489e28a3d4d06f181c050b521c8be7ea1ed0641930c85efbeefd02e1d9b6392772c5b86abc24246715e0b0212dcfd30f82a90d0f3712b00557875d158791d95e7634b5d9a7199f556f08e95bd1d9d036ec517a18d6a5b83340e9199e20ec407e3452c0d067e77d4d4534690aba60f66fe6b9c71eb59530d30e23b2ad76192c87c6848563435bf4d94617291299810f597ff2952368531526e3591c319b67383705a32dbaf3a2a1e14cd790210c585383c9fc3c0b89bb945e3dc6398e544feef5ed4056329b25a7db398ed021beae18ef153e7821757ad712f958de21f9d27c0373f14049689b9550a652b78d7a83bd1bfbb8e906274e90d13450314587fdba64c59c8c7f7521f7eee0869427027dbf799511d516e8148eb9257b81f978f8fc60ffb4bbc724674d8457b1ed1bfce11b3f7579c41bf452bc9b15f0934632e35d915b7b7b4acfe69bdaef225a82859974952a65772bead534e813abba19e77731097dec4c59d297dbf5538dad317651d1d7aed7df301b6ce5ab7465757329bc114bc4715b50d021fc2c08b3a059e6cad4dc121bd912e52793f44f8598cb3f2a24595b8a8f830f009376ff3bab5ec59bbad35cef312c6582f78492515212926a286032fd76e8d5a65f6b455560f0bfa9d76214f23f1d05c318fead989555cec2b74d599051fb411d66937e59c458210d96ad5bc5ee2defdcc77bc56977c4b75590f1b700b4ff58b3ef3de8f36e2b1fc30bd4dfb47825e120950811465e255d3cff19b7e5578fabbf0e7014eae77e337769aee4b3c72737cf10204eef7ea99e3c951e11b705685404cef8c368a534729a766608100b0313f3812806a246ac9aed0a4b087a49eea0b40a9326764a7029f8b157a4a1af1d3058978801d1c79dbcb1c4bbb4da5d8915084683d6211c42e043b58ad56dd5282c3de3417f3fecac343a4dd1f8725e16534b3cd0c8b949fb13e681d7afc1dc2cb330d89982760c219a1a92c53f84bec4e4948ed50fd31b557c05a6496c352a239ab647d21db324d3984801042e9b1f9a36fd64ea0f2086913fb4977421e55b17d646032013f79474be4eaf4afa1467d42db001ce22596fc2a74b27ad02717d27d23acf6f47819aac4174272b97bc5565d7d722f3d63f3bebdebc7fbcaffac129505257b337776e659513d82638e734d13bab44fdb8ea496a80f9a15798aca4174782b8d225635a983b26e14f1793176d4df9a423e65d2fec757ff5304174eb1dbc44a8afbc51693da682a5bab1ce1f53d971f53518812026014b06a5efc79728be77850ce6f8d2921c0dc25246df4258cd1d77a0db72854dac53e4489a180404b1ded9f91902edfbc4510a7160128dd7f4abcdcd4d680f52a5923dec6ec0a22ec4dacce11f78a9d441d1dce0ed0bf5f30312f34aaadec689d17d9411ed1f402b3f87bdad4a8e6e4caeb3e2d0b3a375aa5bb429b215cd4225c0f38a5e06ea0a015e420b704536b77ff8331af5829b47562896f98c03d30808c1dd9fec90ece324ae4d9bf530ac63d7bc8168245e9e5b2c13a2baaa3d598def04b56623b1b77a1f76e6cd68eecc1c8f509d6d61f58dfa9380a8d1621bfbc5d7489baec4f42fa206a85b42b645b3435a8a8d712b1acce9b3009b5d47563baef92a0d80480cbf221e51bdc7c55a3b7b6e7f59b62ce90e6e7fa75281e8b46f7c0df74fd5ed2ae7ed15bfc0fbd54df39e8c1d192f1eb5de876ce3462b173cbe24763a80ae8bebc74526c7e1a0cd65c8cbfb441c7cc87699c2d780c6fd9fc229e0c774d994c2f78a1c2f0fa6b9201dba93250139f967ef5e866c870e92f9aafec18c428a3b4483f77726bab6a90d0ec84230bcc8fd638ec11cc098970bf5db432e4f0fd091135ee064106257086d3452659a338c2659f3b263692fd2eea141d09a188ca21bf3c2e2932fdbd548b494490ed4ecb2e2ec6bc378e45ed260403263c4fa08d622a20004ec09ab58232800ee87a02640c72d62b0a19249510292cb811734775669cd2fd74d0380192ed68ed9827b270a0b917588f0b72947e80433cfbd18a831682222dd262d0e76ce9658d52d1390943d154f0a8091f22c4e70fc75fe4961b44ea601774e021e9a6a870d72164909d935acccda00816ea0e0b8f804ae918181130373371c0f4e6137b65e51e1ece9198ed8e90aa8ba750ad68e2208b32df61b7ca8c39abb2968c25dc13d48e5531a39d521af6e408c50aab2b8dceceb62b0cc805bb7881325b16ff0d7dd97ecc7b5a7ac70115b2b6bc4975c7817886210d67d80e844562903f54c06d8f0db3481f1224bb7d589f3f9ab81a4cde69b7effd9701be2a7cd9d13233236add7ec778ed4a89705c8da37c7ba467a8e32a917238073053fdce5942567ffea1bd394f2235c261800d624c149e06215a7df1948e16fee0b02d6e77622962b48e0ea9b90075cdb843d60885d17044d35532ff5a88facbe02d40d9956094e1088d6aa7821d646e677bac87d095812af132463ca5dd3fa0523696b6e12296c1fd80dc10404eb27d0af378456ce9fe9d74c101c10273d7bdbe6ea3d425f11bcfb239f50c6679706b278fb71c85dcb5a532275f5e0883b7cac0e34d0aa3c1d2e696e61056bf8f590ceba85738d33e2416585291c0faad8a8a7b40585b0752553e94652ab95ba79ca4a7ba7852e19ab28f9251ec6fc80a25ccd31eb8b4ec72999f8e47efab1644da9f6aae08ecfa1c3d26e2ba4b01ffddc3863d84d3d741e153b239b28cecb897e1402a9220238c676820c907e77a472390326b04f12967b1d3b32cd0e6427c2b9d8e4a9c1ebd8dc5e04c6b675b57055d2d02068ed90a95a20eda961476f31516fe226e6dcfe9869dbc1ff36d4046008de000a757be7698b18400fc95936a88e89492738b701d2278848d4532d41982a59e43e53868d25902cf015bc47ad2e4ddc8a3d578ea221e87dfacff844f26375d95f942e66a7274a1cdf0bc79235009c5aec539c8bb71884c6201624163e57a591007aa88065a8c4134c69babc5db3ce2bdc912c681aa2495215d24b6f673820d7007c1fdee7c89f292ff2688234c1f53c59f942bdcea34706d2604118f31dc85cee60c1c020a89e1627f8a9ce748a0375c85f710cff548074136485fa1ee8000f805658ad2c81ad1b470cef0502433b88ab8805f3bb03c5366e92fc81ce6fb7a08e61e5920cfeb316757228a2551728ea9e73e435c4f1a6bbf055a9bf96a557c3a7a8cd3d77b5632e7629f8fa20685a231625fbadb9ec3df69edac639bbe4f42cf675bf28f79c52272d63d69e7a9f4e8832e0a66b9bc7a391840c8543ff77116648c83cba62b8f204e085bf121f1c6c6ce0963cfa2f9f603dcd2152dc75abd080bb2010419f8ef306dadd0ae52316c6a7e7ee4aac8d157d0fe2482337cacf0f3666bde40413676807cada09dec5e857a5821a51ae98301f69e38bb3c9589775a5fa0c0d8267a4061c65c60791a97d798cfca1067113afd4dc7d1da9703f13df8762d8094105b036125a42628958143286600e4047d80dcfba36e7f6ed6a788b5e660aa367c509dc1a8acb10b4de5fe2f5606bcc93b17b52c3a4f9d142169f5804feec5796eea1ea2814a2791a4d359edcc68da1620be38740f63f2ddba24e17f179d264e5b2d5a20e3c8f272fa9f2b8a768e40fae565bdd2920d0d790909615a9abbb27050f855c2fae8abc40f9c2d45f208b23f3e4a324535c6f30295dfa52410c31c029cb9f5022b58592086fc04ff515e4a9b729ec75ba11bfb240ee65ee445eb62ca94989af11683bfc1743649fed3b9fe02bf68436f6dc6f3e01a827cb09e9656da2bd0e2024672f38ce2af06ec471601b83f0ec3f615f611104edd54804500943070226a20055acc6e328c0eb3de87f9eb1a0c8b8fd08ec3e02bd43cbba32c2dd425f3a9023db420cc3dd56efdeac9b798c305230c58c887f1f272150f9970bc23706d17e01eec6b00a89e462c37038cd483c68d892fa7cdb05a2fbd5bd276e0577ccf85c1b732afdb60f8c115d174c6e5b42190d6379319764aaf5f3c83ba0a6b2a7c64422f4f64a1eecf31fb33786b05b432f8748579f3a108add8dbaf9d94f656496811f28876124c4171627be6d84ca70d45829db313ca26d666102777de51765bccf192f449ec00b4a9be635ec54d5bb5d1981c82a43a2aae79b6d4e93bcd0b6b0a11f6d26021f60be247a00b250e093e1f18f53ddba607ef768fb869d0baea2cf640e9e057c8cae8dea4fecde9557d6e1de609becdb811e068a828ae53a4ececc0c2fef6aafc9029577aac3db6f71e1f481ab29e3c2535908d53dbcb3ceb00e55660c5beef619abb2389e7ca2482e555822b430f839bf7966783fc03b4885d0fc84193370bac568317358bd69d9199b2e216d11882d0bff57ca549169c33c47faf90dc6a56e611fb160735d7ebf04b5ec41858e55915d0bdab70a210efcbd9bce4114b6426ac3b3f83f364aa8b4c392142bda4c7ef4a9fc95df6d7bdfb202e8c98710bc13fa403185eab5e327844903094a3e126e2d687659a06a641e8b5d7bc71f1d54bd96287a211b78e95b34e2f5cdc1d951844fbb5221f44953543d46ab628a2218d590f62b9ed7664bf5c9038d4d2d18aa86846454e5e2042efb24812047621bee46e647d6cffe201e2f2c89c8da5d4add39d3ffac622d9c6c60c1a26e772d08fcfe7e653fb0f76ab453bdc9b5daffb7366483be311d648fd5c24e8824ef111cff0eeaaed4dfcb455fbbf968b2a2f6e522c28ec2e2494696b3b09ac3fd1ed41c0ef1e752231a0b79936d814a376f8f70c1bbd336bb6f9c2473e349896e31772f254a8d30609a9c7acf225c6e5490e7770a14fc3eb03ba8c59422cc896bf1422be46b0d9db4796103ba5da0bb6b0695df313228244df1b242b80ee587a404e00bde64959b5ba78cda78a51b9ea638ce217ec0d3f4224db9c974ae36e62ec5fe06e8f85092cdcc3d5401db4431e77edafdeec83543e4cd53e6c4d4de86a1087c11eb89162df86e46d0898b409ef50361cb9747fa23ea2b1ec0a7d2a8425d72820df995b11d4670c2a9d989d84a04d26cfd1caaed91dfd0fa240ebfeac8b502d510a1c5892186e68680a2fa440e71e08aeebe2605f9392097337560a137a3779500000000000000000000000000000000000000000000000000000000000000000aefc7a3d97484e4951f9065cd3979a5366736f3544db663386dc21678997fed2b4470361d69f7458bbebaa975169251f9d824aeb903aba4c1c9c471c136cccf282d54a1cf97f2e07fe47099e042b4629966f87dc46c8b40aa546574db10f0c30d0f39ef49d5b5f155ec8cc1136073740ce330b072f441ce10cc339f646fc5041fb3ac9b3dc8a6780666f6d559da896954cfce3702b2d3fea699f51d6ab3831b08388013bda1a9a279b766d4e52cabb4d1d09fd8a4fdfc9f8b8d3f9e2d09c72c05de42525804700cb14619f4956c7b9125add695a6ff90910478e1792e752697068877c5285832425cbd0e8ead2e8c8a3df390aa0065c42c9ed13e0e978066a02b6b747bb02580e868fcfbe6b211a8ee485d87c464519ccebb831d4438f3785c0d0f2b21e81b14f12c20ca2dba7c0556583a0cc365cccda913dd341e1befc159255b820f41bb71b12659f5749a2b8462c3d8c1b3bc6c7543112feb2ff891bb842a8db3190bad4943f6b77fa0068af4adebb7044db137b81a095e45f9f67792a125b09c26ecddc11c23306f48b8e7ae76a1d090f46cd9a25ad1817ef0176f2a6810587a83b1c1ae6861b713d0ac3441eaf159b6a4ac7af2296b2534fded28e9d02ed9dcdc6ce08f9ed7f5c91183cd11014092449b2cdb28d8783f0f4b17889e9b04e4b4e0984c6638eab1e09919ac8cc259b74c8fbbf192d65cf3be6f46eb56a52d0bf53e71c00a9e5086234aca42cf290eccd0ea925cf809aa8b7c5a43987e100ca29f1a157873d433527bd50e82a9d3d309f7f1c195816b1cab36b1443184d30a3d7055df68d48d6b296e9980b929f4ce606ccd6bf1ab69d0042b3b5f8e58d92a8b2cfc95ca05fde9cabfacd78bc9bd818e2866e74ca07d9e5b22de6689c7fa1c57b65774ba0ed18ffb60952dd7a2b69fed0301d2f21c560b8758e4bebb2877125492dd9566a1c60562c4ae577b2378bc6388910be8180615f4b92c61cb2be42f0815740a484aef6186ab5cb33eb8fc447e400192beac72ab49a7b3e7ed46e011c9fcd64f56146241b3712e8d1d1b3680022dc20bb376e1cbfcd891af5c9f2910b9ca16308738a6aa8e1fa4117ab434e0660afe445ee87b951867417094a6e226e4a6b2f8fd3263c009fc08884a95c1f84d87b63198389d3039e96acea5e8492fc62463c8bb8e173f4caff713225a61d7d0a4ac6c6e982df2f4ac86051235770c7bd97ad1b20185d02973f0fe60b8a11768619265acbdb986ef1d2abdbaf851235b54cd98677ca549ee1770148bdbab52f6d29f7b9061c5a1c8c71ca33cb3dc15445d360ef097612b5642e44b5c91c92fa90152e9620601edbe07c84e0e0c600a50be355234459169289948952b16477fd1017cca32e5483d71b1b2220e41281d58015b20d91f8b0bb53093e04c8664375db0d3c5d35069dbf973c28baa3c840537f4ae965e26914f99954a0c2b21c5863b37beb9cf7d0a0040ac0c607d28181230ae81136e180f776055017fde29293cbb2980ed71ca349eff20e289df8a8323466c18e06288644b0ac6861e534cd7475389d4028cfa57f40f5c5619f9fe900b08bce1f8f5e3d4f1e45408c43e74ee7babd53d0c874d31ced9a5e8b373359a0f1d961b17d7173735999583d7d34b0a651262c7223a08e5932d7be9c9e377c8054613263482988891ca6faf248e8ae63cf852a8f84ed8a3a28612cb479d5550163b046d19ac01c19f06eedc4880db88f02a35786af3792fb275bc5aacf4ba5019618deff9e9a5425fc826aa9dedf534de76c746c03f0787f54c960d3c76a8b60d02005fbde0f60ab933f0f80a4227932ded948c47491a67f34d336924f47bc2039f20e19eb24eda4c3977d16184424a40cd481f12e0742c6b3964143d44b5bf04ff3f3c5b3b865dc41727dd8663bc896df998130a1e3e3fd6bbe6d28aefa50507c34e7fb41fdbc50796f6a98c99fdc08e00260aeac3650740bcbd235d59e59a117e580067a4acc8de263a84dc54d9ee885a100cca86a0f4525680deb2bf64d3242901963a5ace984ec46c10b663843c0b2c41fc83bd72df5922ae4f9914945d02af931f0f2f65c2dbe1fe34eee8b9e11be03be3b78879426e123f4e1c3303ca207b7162ebb44f28f0e28d6f09b15fabde92945be7303d76c0ecb644cd068eb824457c21b92f67675a36723f0598a84bedce9b7900b1457a41ecf5d9b44e00e90e41dc1f3379a77768f195bc89838362d3e80ab641d8bc0f052ec5b7577337472948cbb2986c9447f435c8d1dc4c3f99c82abe3b9bb1194f6e5838fae0d862892b55fecae981d291050164bf168caff49bbb549972121efb16e5383b18cd30880cf1a66503eeb8dc57af7ec3f3f20b60d5794da209cf1ccf47f2cbbcdb3dcde4129873afc5356d42598db5ba9c7e27c82dcd9c1db1b125fb2b34f37c37d803c122540a8318f9e51a7b67d47ca096d07735cbe30d79d135fc02efdefc2d0db42f0004babc194fd79f1bcad7f0df194007a8052332fdc8f6fe19bcd2364aafb1950f052a1c8d76d0b58b2e5c70255be17f7cef1a5a63afb02bdeb9d79d53e7e78c1d244008bcdd3e70ef41eab536c8345f83c402e289b53c284e447b35331c9b92225dfd14bf27a5b851b22e02d9558d28b32b86c93d7099ab515f4bb29423ac061ad12fe0eaab5d1fb0b76c0e92a5cfcafe441ffceb438f38f8a9e0d1ce6093bf019438fca968bebf562b941a451f8f795ff6d5e83cbd206b047410842bc9b8ec15da1bbbf9e27575792e1e878c8fffe0d9da3b9279cc2a0959d11b5b8de6bbc40c1c8bfe407aa72b8878e9a19e9f6c7e56a41568ad3a7575e32808d729f4bd110d2931088ca48e90885b6ef1f284419efd4c41cf63deffdee21b2cc20b0fd15c0eb9a0ac0fc645ba99ae977b91fddae312752d5a71a77b1986af2f62f82d6f60225bb5edcba898330e948e582b73344d2fc89e824bf4fcbafc39cd1d21f9f5fe0b4b802f84c23ad7b8251bd645d54e380741a7a92c528b10fdc905d6a47dfc4a1dd34c83b0a486b02ec267ae16ce1f0aacbf3004801d95da9fe9b3a78d5fe5ce0c6dc3d3ab0f39aa5efd5fbd9f4ca537260e0bbb5da9e8a96e9ca7747e2e164301771c3677542770deaae783aea62b7456b450b973e28bc9fac664c714af1379155f77cd70345316435f3f50857fbdc162aaeb6d9e6cd89f70bd91246682d5d925c8ad8430efa64b2a97042983cdc575dfab3785089811e6d29597f930ed1e4024655f92586a59b85c0cce6183f0b1e75dd5386b0e07aa8af2c8037bae8f7c400d020a98bc71b6b1c7d43ac04f06b89e2480bc4ddeee9cd3ceceda9cca95ae3d1385af25d7cada830ee53bb24132c291d708cdabcebae0a13f88c88f5533e6ed2f0d1914a131773c7c70c4ce8dafbd89e9b458af230b6ab5764487e34aefd9452ab2863002c037ffcfffb3b447819484c71ce06541a0d1166646768ac4156be80d0bde55a8536f1d34c3440c3f8eb60cdd3f7bd6ca179398580b25a394507b55167a9b3aad174c7e5e72cca7d899c56b20d6859fa062dfb3302f45ed73e3e1011f87110d6b9f295ad339c4451fd1050e21bb74d0d15c76989811644abc07d43b1e544aaeea14c64193afcfdd9818b0bb60a7306103ec8d345c0abe8e18d48abd0018cdaf28348214b3700f393c9ecc7f6d72e04850dda9b480aba27d418147662fa8fcc442fdf79de4c5db8a9e40849712e431e274b30285ab04a3b7002986892cceeece446f1db80eea2d4c4c4d2d47c0761234d3389453c39b15f905c96c222e05a3fc8e6bb3eb8c741ca3f6c38d1ba1747b9e218ecc806f825d1904cb833c0104a196db189546d45e4dd1443c865201e57d980a6e0f35669161fc554ea29b2e5d68f3f16e4e01ccdbdda45fe9dfe6d70c0c3ec61e0d9808f626a8b8b5bcf81bd0cae38b07cdd406cfa2c542c4648054d5853394bc6416e2d184ae7688b17c1e58ec3ecfa9a3dcf4ba5d5186c2f21c3124a40f0790e9584ba5867fab804a582fc7019be4c04ac02533bb11b664a98d0ffc8fd3178add5a1e4bcad0e07c49032920700cf2f87b66727010241b180849676d5ab2e5c8eff950296ed779d02b82", - "public_inputs_hex": "0x051a2017ad92c87921181c97a2e391d9553ce249ebcd9996de93884673f619322f2dd8535a4787ea8794523842a3a4f45cd84bc85749861fb660801b495b32700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000278db7a5ca9dd9834fe122dbab221ec90000000000000000000000000000000036e150312eb7d63c8176719bac04c7c01344a7b4768cb3057b291d131994eaa7652cdacbfa289cbbd0750825b96178100c0ec371320ab18bef9527e8f067d634c64b646c5ccdcc1b6ad7f65abe7b22530ff38a19aba07f89241aa0da8ac1dde25ee4b6872c022d21a6827b7cd359a62f09d7c9200baac6123789cfe51962e4cbe7f8c6bab3936ee3c6e1e50892bac30b154185d801f461f9568e2e620bd28f890c097a514cc7843c7e2b5d9a73919ca8231aa9903031b9af03c8e42941464755bb0f5e07ac55a7f50a03a614b4e0561e2d404da0422bf0b0d0e1cb1baedfbe40eb0274ed52ca42822f4267851541bd60255cdbf485b04b82215e305c3af08705360c2aefd9a1e5d539064b0439c6eee102d6b0493e96a6cf3b2ccf7f7b3f9d23ba486e8675fc6a98b9414938263b23b7151bbdcd1323d901dc5c874189cd37b54f77235c9d7908e5271fa34a4468541d1ac8c71d73acf4c43545fe38a5b8104b533db6a645ad505cc362a9b682e6fe4604db34abc0be00e1e5c2d601408e1c66016ffd9d84afa3ee3dd2a94878b05b311a0bd986a50c8fc4c4f5719bdd3e177dcf06c628a12cf957bc19dda77545900b17e9e3d6571969d9fbcf824cb303497cc73cdaf518009683e759f0117dcbd36c01f74c8d3bf4eb9bf0285f1c449d1c7ac89b47f18f341adf5aa2e3f4ee015bdf06971e2590aac0ca3a166047c528e88a47e336734f8385c19072947e28c97bb115c8fbaddfdf5188520725f8b86eebd64db5f4965bb394a5790d47a2435a153b151bbdcd1323d901dc5c874189cd37b54f77235c9d7908e5271fa34a4468541d1ac8c71d73acf4c43545fe38a5b8104b533db6a645ad505cc362a9b682e6fe462b942ad53baa7c6e1a7616e4f0aa2eedf7d67eacc63696345525988225847479273fc58215abae6a73503410e8209a542c92bbea2ba8e6fb129c971def4ca8452ddcd2c1e0b08c268d942b52a49e7597873ccad9df1b02ea1ab854e7111eb2dd188f793a89424a83a3e746a72d4cdfd5702a7944deb0fa2ee04f84489f4af3c22f5ffac9352fe35d950a4ce548798309f5d896dd11f304f93d83cdfe284b37a6" + "proof_hex": "0x000000000000000000000000000000a9ac4c094210481033ae37d3cbcbde4bca00000000000000000000000000000000002cab765441c5a713ec0c9abfbac70200000000000000000000000000000047819688a765895c2555a6c7fd5a1ccecb0000000000000000000000000000000000271b0d08d00867fc99f707fcf6f02a000000000000000000000000000000c6074bb19d291276f91806de6536a25f930000000000000000000000000000000000146b41f4d01cf7c9bbe67d9bb3a771000000000000000000000000000000986dd540fb01b4eeb4db2ad73e2afa3a8a0000000000000000000000000000000000129ea6c0f7783c5d6bbe71bd806e6120e240609e6a0f4fe5c1551cae46b2e0c263effee01161a2759452fed37046bd01dcd7d8825fe810241b175d01ab9da897f19799f88cfa144f44b022bbdad48d26ed7bec97858770cdad52387f90406f0a20622c9503b7b95720b693d72c7fac259cd9ea9993b1b04cc111150089a5a471cbe6ec8b74b98bcad9b34f23548e38177dfc877137f9826ae9ee50d8f0dcc47f26e6da582f79eb9c0ed676440125e11cafedb47ac248a24e71c97ab59a0ae8d3a86c202515ed956fa3631e2bda89402bb48957e674aa4f45ec700f0a739a37f6612dc6b3dee7c78701c2b04bc12c67184ba1748e5cd597c3d4f0b8e491ef1c78cf4da84944e44965d2c1f178dae2a10d92ecdd023935a51a60a91fe53dacab4b299c510dbcb8a2e3e12815ed362c1c23ae645ee8b1237417f6aed630f4fbc29569283921dfd8b1d7f1933d9d582b442d84b7eef3a00007bda7c503de9464d908069afc039b75562a97ab98d7d2c5e002ad3d64305a6f1e618c53a07e74ea8dad49ea3dfd65162273df826e141b3c170f117283653503c2b65abffe625f601b815b814480916a4cc443c85a1bc85dd02ece841053ccc4ce1c778464cafdd4a1f95fe23ca1e271759f414776230b4b852c1d1e83e4ae6633c1af9112ef02fa63e2f3ea7e38785fae4894a60855bfaaee107b0f8293b3987f1e685666894c6e9e66c8a23ff71229f33ccbfb2b37762c122545868f5754c7ff8dd815eb838ee03f1793a675c96edc5f180587ed4c70abd903b67022cfe731d329985ea937e8411eef76e20af2695a63c2f04c04cfb18e191411de9596ed4e2a533aea793bb05064cad9768dcdbcfdbb131409478b2245651e5307764c5b732c4d6442849744613cbfd998a4609d80584e48722b08f102f726aa6ff8fc7c5f0d0334fbbba897a3ea0190149e83ead390c5d39cbfa580eafc255e6ea72f732e5d8c1c3aad64a67fb530d29c4bddee6731de7d8a1018125abc0ef134eb6f5b626684830d5176d934542869587db362902f06e3520c9829798d1cb74a8cd1679d78f682fababa854a6f07a95d8374771b40c314b3cd6eeeab0417eab53c2b5687866b0bcb400ba1477f189ab8e8326cfd1a05907b3855556d5e0710ef5ca06d878f679880e31b484828aa3f250d99cbc2ac75395156134b5a231794fa461646cb33a4143f782a61eb32a1cec245efbd979109e1a559843632c71ba5db634be6754d4c805411369726151bffbe29a3330949190869c11e50cb032b07fcd8ceba1ca058c7bb2e3b981c3100d31d9c6eb16278fb110a2a4637245f2560cf5419f0739f991f9edbb092de4f87384aaab2888af1dc8f71480177c8271973130f271d9a67b0e7cadbfb2585af8f1b9565f0eaa3e5a6b612e3e81186351440126c5cf773a7eec6dbb9b4e93bb5c90a6e1e318dc575a173a565c60fe5480c0f423ea13eb5fc6ba51af78b5855a045dbc890076caefb8998aa6e7be6eae707925d581676b9104372b079428d4cfbd6b3f411308b2f6dbebffef1450a40282f1f21577b10b401849dfd11f08c709c979a570201a0ad4288499dc907517b5d24130d6dd1475f8293e32624a522c0fa2183a8dbd702cb36822a0d742ab4b4092f4a314e2ae47f88cb89d900bb5640d56c61236c4465e01cf9ff30b18a1390eb2c6e7a0ed3f9f59c6b4c8b1d0259b3f171ce6f0ead1bbf458d6fe4c875c392d11c7dd9af184a5e8067f7a3c07b2161a9a96f55b240739ea000cbd53ad1f328170ffc3915719c6476ce963bab1b94c5d7cf487fc83acf54cbae6ae2638b950c80208ae32cc9542ef19a724a99c16950a2abaf2b86ef08a385567fe9d761f0331c026743321b0f526fed5c38be7f492d46e389c0149a0f26fb6b05cb78749f0544249d3bf5eb9afee3bd38042ed6f6d67b978b10565f5b6805745d61943f0191cc2ddce6111721a2672e89c9a99946251c06e808f455b4d9764934b35ebd387c6f0fcfa6f333860e5b1a0e872bb73f21518b6f0fe3e558bf3401f7a364f5cc590c13ae2e4409d05e879529c086dc289ed825c7f28849c20085dec3f3eddc676fdf20acfcfbf2802b7bbb1bd1bd2c2a9698b1eb247af8fc538206c9854c14287c5901d60ba8cbf34bb1872fa97a00acc460a85ea339f436106c2fbaad39a499e83c00679ceae6a53104faf2af05827098139581867e20099495ea048b9b9a3658691a83f11c53e8e718b92d83d01f7491163c006255989544a51f89b83787def2df20ada2c8bcb41e28442e5ac1c43eb02f1cbc5018bf61e1abb88a1e00629803f20316b663261707a23088d326e3b61827b62b5eb95543835c2de0578418f3e297241aa491ba8c50f57b15d7920ced6d9e87c1d61028a2534beae02b3f14f5cc3603247904c7077b1b73c6f94e0b207991add22b21284d6d40b6caccf2dc7f440705275404e89523c3768524a274cadefec37546ec10ab4b39806f98649f818c7b028119372584addcb7b787712568b19e5d95b42bbddd67d47217b1b352e980e8051cddf3eab013ddad6ed1ca4335d72cf6a24b682b31fa678890878a6a1f921c14490cc60d96d856fa1a692500f3f62c310e614e6770e92d1d36206273f38bfb13f13c00783c75907f19ec62f1efeac02b50eb51c49c938c6f42a3e4ab8e12b12a7be80ff798b746d9121935abc54c7e63ff18ef12190662788fee98a045e3580eb3c7b7931ed41fa5dc3b45751925990779be922f61633f26004e53ad24c74e12ad4eeb42f1059f9ad9295329714cbdf98e56da612e0386400168bc95816f8220ebaff1c3c17f9b46d249f246abb670c35d40590251a5a0671ed309905380b60b01fbed7f7c9b87dd2fe53ba446283d41b3c57eb31239099844f5bcfbe5e61b0a120e3af667d3d49268d689fb6b075fae3c5501b297f16fc79e9c89796adec91c7d5756621ecc47949e85b66ce4e99b47bf07886c8e9cb42bc1713343bb252a28124dcbc33b2bc105f7e86c4713b87698366b2767753cb0df1cec6aa9df79e9153e8a7fa451a99fb0c888c5773f31e6b4e467ac7aba15dcfe7b1d05bc5404eb0d780d67a28caa8b8ec9c58e77cb4057d9041e531107088bc45f5acd3e25051b11429b8015b3150fad79f2a46c5ba47f54345a0a46e8a5684cfb0be371d2b55b293a9669d3b35d77e7cc9af95ab13981237930c898501189b488460e96c0bd4907b3c9fc968ec5ba9da450d27d4e983fd16d5659b745daa6bc478d40f8d39bf42bc82812738f8aca647f882c21aa74c9059af384b02c5addf14514af413194f92ed792655eac755f7fa6f71867b55ae4387efaaaf9c8dd79b0e4f7f1057d1a5f0f3556e04e824dd3f5cda149986d0645e9c79c4a06ff8dbd33a6439e44d15ec51e57d74cd46cbaa6b211c61dfe6bb204612e6090a481c8aae54d530e4e8571af2d7148fbb468ad7e3669e8e27083989b29369863a1e87364dd4d2e99f4178d0411fd2d0c4a94836f373d64f045465c22919dcbe6597a77006f530db68dbb1a2b177181ca42f71191b82a5bc09982571031942920a42e08abac9dcbc76462fd442f593a9c3057eef51c373cfa8f67f7b02eee9f356a2fd1e5d0952068174ad05227561a8c6aee26fde1edf435ef6e01b03ed38d4c6e7660d445750e237071f64f07c2d191b42fef4a541533d39ce66562776e3980400e4c70cc4c545a0328e6a12452354cc745ec5fb807e1bc696c9fd3476d94dc0ae439b90d1cba1e8b568ce31506bb46a6da6b8c247ca6a2f7edc5fb2f9a75538e0851a1eca9f37cdb70afa71eb1dd0b7d9384fcb735916e7037b4b178148a9e7846fdf82140eed4dd3bb4c82098a99da38caf6a823a99d08aeb9facdefbb4695813994b383f36d095f2a74210ecbcba8257b4fbae4a644f74a04c018e48ae545045f189bb56a7d90730fa6011bdd85389aa40597048312b433d3e271ee94f1289bd38f2918265737221b3c311908b209f97d48846f530faf153727162937e6f877c7efbbcb8ea832606d5da056cb42df09f6403ad10b4086747a33e3f172b643749487b51712e5e2c3fda411b33464bfb2c79edc0a611ad12d30bd9b62ecd0e718f3a150aee6d414e6b8aeb19ba21564b0998d368de7bc370274e5241263887449d77cf493b9083f4f4fe0d164b6a241e0a32eabb147218d39d39721b968988086efc511decc1d8a2a70a4b271803a4021c5c4bdf816669953a940edd972cde06fec2fef2022a3a1950d6371f80632de0c002df92faec6fc3ba64748f23318d418993d0a51514357721693229df9f7b556be71aca0a291c9df95e43cb2fd347b2db2b64444848cf918db7211f131841e05d893300af96702c561a6966eae00793abc61252e01d437e99cf7c29efafb95bd8603d889ff4fb5168c334defb3e0c92738e1c3a8fc5381516d90e1e8b375cb13dc6753e144f375867c04413948fd475f1ce8cb34a7554b7838d041f2f9b76aee32d82f536b0511e22a9f8dc4e29be4b49e8f630c29687e415d71b20b571f98263d88947b7b50a89e55ff6013da99625de20851b1db6c1759f79971de364ab1dffbfafded2a72cb148dc457f34a25bf39fbce7e66caffbd6051fde27d8f5a5c56a66544095cdff637580fa309d8eabf1d01d79501bbc3d694460bd27dc11b5ad4019703d02e84bfc352d0b2481365a3677a3dbbebecde29aa8dc120bac6228b835c9a1b5da6a0a4c8d4d5534dc22287b2659a5a29766d959697e65061600a092498d3b50edffd82e948e181f5ff03b95ad5e27713177720b503b9a2dc7f8327bde5a1e274cf47109bb0079b3fc3e71be03d2b48c69628278d9936528afc9a2baeed98f56c117cc727f49c7c7ee8a1fc57ec5a76037afb79fe0df0228b7171922a58b2fe98e950ae9e4c6a3a92dbeb32ee6a897f5313a69d257db912fd6b3e8754665a0a9bc7caa943104cc76afb61fcdf3ce04b47e641d4149faf70dec78a53e300ee1162bbee1ee8df4dd6341157b4f17430df7dd82c292e0633c0056e9871a0097ec325fc5487b7755c70b8c791c47fa9a2c559aac36612325070a4e64a5db8bd95835b1c27ec97be65af9f2c18052495646af26b77bbb526ac422cf349c06676d7b8a04862818dd37a9213c43a3c4fdeceeb315455d3cc299971f9f070c955b03781d42e6c302661eee3adcfac1ec7d3d7f4f24560d612e2a261e1f1c094525e08ebed859de2d52985602842bc80bb8ad90c2627674a34881b5251e2c49d8e96fa5243aa1ab3debfcb686050f39c67685c83d17d83740b4af0b1dd73df0809b57cf7128770fe5e14db873f71fe1f7bb7715a1627f99a9d0e323073863d0e86d77874948b9dac1d6a450bfc28d47ba1e93ae0b23d51cf53632a002600e17d2a4397ba3dc275a9846b638b43da6f8f23344d668ab635b0e2176b31488726abd578eaa3a14e064405a1d255a2f2cd36d2004ba6cc2e4a62048ddcb2aa428370517a8c2d1e1afaffcd0f988e0297342b2b94810220cbb9fa59c02e51dcab824172c430b422a0d87601f7bec2c2597430386efe5dd475298eb9c3d211e3ebc9364a898ffd5fd62b376cd798132d198a0203fa24a2ed8636d4d17338f2065c35e67d5e72aa55fa81529e99aca324ae15b8ef178b62d9b98198a88471f0c2d537537e3f72762ec160ded6f2c76e1c6a8baafab07dc76a19ee156e6629109d42076d51707a716687a60d5a315e1865b397b2bdbe552e0b4d8082018aaa31bf478885d36e2419f898215f2d62c0df866857948ca66e8c94189794149ea882302ddefc47b8cea20192fa83a15bf7f1e6a4f93572839e9ba9bc5adb07bdac210182f028d1ceba6c4cde801a33d7c0e35359ca2723a4d0c27dd2c5e495dd968170ac5e96cd7a34f9dfb11edc1e5193bf5878c63cc165023066bd00eb0c8c3a30d051bd914d3dd74b7be01361e03834b769656353ada57ba65ba7a6b94c5f5100c0013e986058c060577ab833da58821878e348bd224f21d88259059b294cf6a1d0a4b8030258b81518b8ec5b00203cdb58e495e36a58ba6d7fbbe68ece82ab60cf0a36abafca3f95816d8c2aebd713c888b06d744c4de3fdf982a46ae92755c268662e39dbaae22301a5448bbe565876ed120d4bdc3af6b2c6cd786dd4a20661db5b388fad395deb341972e280af9d3382473c8a877f10c64296600d1f28aa01574b640cb20bdab7822a5c93a876dd8ddd561b90bcd46822614da07a536dd001166dfc59c538ad53c5402e4042db6830251fb86da99ff15a8ec5e05ba111cec0a00aa6cde75dcbdc01d7f06c4885bdc7485799aa968f5f3f62d1943067edaa2013b5367e1644344e89d305ac896ad96ef9e9887facf7170c2ede030828d2e982d8f6e52972c03a701d48030c2a3c5aad80b11156a8516eecc752d14f5c6e2d602518a17f5c80cf57dd71a6f7113be3730ee3c3c6859845baf2169a8c55190582a7d2fd3e0bb3b39a2f606893194588748f9409da5455e5ad89f81f5e0b08dbb2c1d9a0e6d0ab005436143f35223b2da3733d771ff6639db2c24d5ec90550a0c0dd9d5cd930c171bae036e5f13e023aee7d9ead98caf16dd52b0868a6f29c91318690fdd23b8422632050cd255ee19e3c55017419eac65be342468ed12404023195bd03a145f9c63e6c8814ab9e7ce6e286a731b50ea94ee4173791a8ca30a0118e93be587514a9d1c175e5b264eec90ad83eddf3955b80103063a433177482e1a8861f221a74847885b008ec83162a68cc2b9dd58e9a32c8ca01228c2aab53315e9236c9e50b19565325130cd3f888e29cfc973d7f919ca7266f61d17a55ea620cebbf4911fbf6ba9b5dbd247b23cdfd70652f491906b5b2d7eaff687029a72018c7b99624ea8f77db874066cd30653bb2d60e8e86869b5edeea8e8ca456c48035dde55e9fea02a48ef43ba03f9d706f6d86c45fe0769c382f6509f40a9e08b07c6f729e3306c29ad3f3d09298923833d551d886016aa4e220692f4edaa56b11773be2678b4f112e501cedd2d2953ba13fdb58686cb0a466a063f12c289fcaa19309a1ae45a2eeeab5b0508e5bcb48bafd146591cb1312fd5b3f00791ad75f12fe7e8860fcc1d64a051eb030ae8dceed71a48a28cc48031f375c4edd9bdad471980675f55c9d0637d76f78b549b39dbb0158acad3612052fce345893b72defd1134b9dfb09b552331a2253aeb6a2bddc305114f72ff0a543a0aa3ead73d898012cc1389bb3054c7236733d111a05fc06efb4c138024c50747ca08ad4dda56db0d51ae356216f7ef4f5283a96527fca33700566095483e52d150dd0ba925aeec0c068a6ad50b338b4ff66a7e02af52dd5d52fa7c1a15cb685eafcb72952ac2c618f4692eafbd1c9dbb3fbc011364e896fb6a6e8056038af82e54ccabed9f352927e835518a747e5e22a4216a414147d0765e60d741ed0294003414cb48327b250560cea34ba04c3da01cda70f3083bcaf20e56f9c7ab855a5caa733a6a72259603fc0cfaf4d73ab2e8c2c34b6c86596f7540cd6195fc46a491fa061bd82e259b0388b59e3cf5e204541fc1e5a12af1b3319eb02617d9d720304b9ad20c95b61822c4f3ba4ae52d70cb39739dfc15a858811cfb63730768053c57e680be25191e0eaef3f05ebd6ab31340ed42cee90d6f5ae1948f725f8326ff9eed9606b3b3a71e051283851c09f4b3d73e56d2f6202a1924d34b6238c226f8790f43991efe670a71b4aa713bc40b553392fd0a7643d4928dff93a9f215912356c1f153b9339704fe3dbfc8dbf0199fb73893df25e423ed21a18de69ce0b880785c7752fa86402e480cc9dc971470d91d1a17a5fbe0ed09ae6ff0de1c1cfeaf4e5e686b03c64f286e5b627e361d679c99922dee10feb8ed5edf5c8e74384465e1fd3c04f9e8a5250a0baac7c0d0937caf8174874349c8196daab3dfc69b895f6901208e2c242e0f8eb5d40fe2e429fad5e3b5078cd4920a175f8ab5d36cb54374be567d2da7ac15f451c4f6e5454a926dc6f6560ab89c9111013ed4bb8da9c2f73561ce12e4d92724cef10053faba78292c8bda63b794502f2dcd9f9d717daf9d7508f8e1b40e24f5b156f12d7326e407ba17d1bc06626c7c5299d793729dfd12a8541f47e5f5109306e1b185f05c8ae81002b902bfb7fb729aed38d3343cb1c35a53bcff06be2f2d7b717583dc855af81be93a9fb795fd908570398a0f991e4c9d3daffd71ca0b72eb36053dae2148ce55593f63af9205a00a5c776cd553d76f4ae1412b5fdb26a984fcda270ace05b1955bc48eadfd372280747b4d00e5db6c6bb58d2676660cb79cf145aae1ba02871f12966a8fbedd9817a1af112b3240ec8baf72c07d3704ea4984a5089e152988638786ec3b5941029c15e6730cef0b8704dbc37543831a4fdac9c1211fb316429e40d865a5a53881983bebfdd2d4217231b19bf01ffc1aac696d64439fe346454dbab78ffc28ed69d882596dcb0774713d7ae08b38de2e8b0f85680e33ea8e6ec81264d264f6f373bd16486957ff03f96fd79f45b9c2151ab5ab9100324b81043d4c2ab01a1a486b53ca891557d0b9242f0231ba2c721ba90021d4ca2698551a97d32f94e887135bb93bf6a83dc25b154e4c945634bf1f360ff922bd333afa00da239e93ff28079f6055b6070e548fa01681bcc6910b0439781145a2adca213c14515b6c1bd92f41fb9162dc1cd7ade609f7dc45b3e3023da56c113cd602e8dc1d8c7316d53a8eb5317c00d06cf8bfef6839f271f06a2c986b8837f7382205b54b4915c53eaa36788497d3c0fa2937423573700ee2860431faf97bb1d503320bfc5eadd646b5eaeb4e1ced3cdb15ecec8b3cf6a174c00188a99b84482066200a3ab90f9d51c19edf158601f4405efba3344f76f8e3a827b02d9e50830f4bc77e985e48c68955247f407e6f4ea69b991ff5ffcc6925c31760713bee9f36a3ce39c1a3fbfcebd0cc882d2203dd734c11955a20b3a1bf8d092c517fac9903c7d10e5655e89f4af3de248cc155642ab35ed921f940c8e99617127edcb7615c03b94e5a8863a934325fa86682333456a68c5bfdbb3467b3b0154d1533a93755aaeb6b3a17e8e9bfd75f9a3a8001f5a018a521580a1d8ac84a2460d7ccf8fdda4811c2ca110ebc12a06e8d0d17c78dd6ade635f1395ebccfae2427dac0dd83c27297c4167596998025d8ee47196b72ee8a2f69f49f228e993f08d2a1e3555f94e16053eb5d088bb2623098404f6af0f5729739a8a8494cdeec1ef429b542fb22d3a52f40cfa82ced862de70603af90910cbe40e6d0c64df04324cdb5542a46948829645c081b59bd352b598e6787c58307aed19ca7405a93ef2142a0acb25dac50c11069771c83855e1e70a86c08f9bdaa247ee6064c626bd904f0d0a63786506b89a2337a20f8bce17d9840c2c6d2029820aa64721e0bc2cc21147a4dad34f4dd54a018b1bf394210cd100fb574a2c680c283529c8bd9dfeb27449812a687c80d33bb266f0ac8993216c12c3c2ab0eedce93a3c87bfff519d11b1367240e2e4a9150d4d4847c88d9b3cb23ac53d4efa4f43699dab6b6ee9be2789a4bc397641db340ad897bce7589d307497c57fba2e193406e4423e30a90e1ad69c611954251c443530047ab5e596e2a6c1264cdd890780bbe4569736fd671073feb2a05f5211c4a81a7aeb9605829cc00ba2476353ea404ac877a659261710c2be6370b2289c2d09fa8cd6db2064a899f683bdd32e340ace92ba157430b7085e8e47c3182f2d5e093c72b5330eb912a1e8b9cf0fa77b97a139e39fe802542b06613a8a041064c991b3c9620028996064302d1846040bb3fff19e55da793c11f3fc78b7cbcb9b797bc5afdf8b1779cae448b88497b745cac1f2582c73ff762695d79cab750dec9d404801b7767d04e1f7c11c204f569032e8406e966c79280343b2f77e97eb5a9aa4c9c6116d109438e9426ee93e246e5da8501c7f47c6e615f555a80356ee256717ff98df2b149686086526554835040d3708c342717b86168d261fbb0be0b1b8636bddc1f3ed1fbf02578522498169ab7c618c9d61c59b055cf698bf22d333c82b99a1116eb06d1cff4348d172f920a7dc5c4227db49e11c9e648dfe87fbea379f0330f83fb50710ba5402b905f14deec231a98137baeb1656acaeedd8a8680e4a540b36dba7d9b243785d0c01577e263fdf2a11b694b52adf15b07fb0167733ed2c68355813c7d7988c0b5dfb429a20ddf1c0b0770d770e73485a9b2c80b5cd73f666a54ef652be5b9a974f7e1c95fd2cf900c337d95e0e8c1f31b3a7871ffcacde36543333bbd431cc0c448b36d25efda8e1a12d878705def482dd3005eb23bf41ce2997b78c3fcc5d1b3cb6fcc017fbd9d69e0a781221c93f4d92a4f5d65ec8305f6b36ce326e4586fb671eb5bf010eb025f079cb550927cea88d78c137b247b82fcd52089eaccbab3f9b49292e390889c79e16b33307040027789a8d8eced4a86de9d0085741bd58281b6e93590043d459df2b4d94098db7257c6c661002a7bb0f1c75e8bf0347ab8a701456679c4ffb94dc682ea900000000000000000000000000000000000000000000000000000000000000000bc49e4e13875fdeaf77b839a9a2ed6fe298e7489bd9f3c7fa00bb20509674c2124f3b1dd5eb73f6876b769aaaec9b5489ce6ac0c433e78e1fe161bfb6ac80890e08584be15ddef1601343164b32f6e854df0e8af982383a368ad92e60859722034d5e28094bd7598b30d0f90adacbbeca20618ffce1a9c8d8da5acd03306893092a4a96fce6e49612b8fb5d8ab25a1b9e803970ec6b6cd19d4f8b82cab5fc5b1005925e16c3f8100867d221de29f0b634e1a7185b105e3919b0f947e78f123007446a61d675c64237d281e237626a229bec628e8bb63c6988748c2df0afe7d625e136f5fc521791c4003626697f1ba9ee3a14845020fc64e7a8410bc1d0793110e87a7a0ac9d10edcf679c1d60cf04923caa37583e794f8e33cbe193bf4d6171abf872f83f1e7b9dec8b21d85cfd1549b2e7d85af2ebeb765f737c7d95a3e8f11036b12d3df57d49423ed59404d1545e5521fb093dcc7e3fabfd276b3418cb0295a84951443e340ecb1f6fc6a4b99345bd352623776845a0b45c5f553bb2a970beacab1efb237ea87765c1b9fe09c87edf9e905024f308fd02224e937edf3f213c4ef4127f92211e6af461de9275127ddea59c62da4eb9a673b2f85c5780bd50d3028324201fd04a72d7098eeb6f7cc578c4e3c58d83e8d88c5d3bb607e76ad2b00094437ebdc1c23b78ba0716fe0020a31c19c7d39314badfae842b6f9bdba281763d0d9f7f72ba8ee9718e61c8a0282bc62c4ba2ecde016f349275cab5e860dfda30fad896e3436713bea8e2643fec297f5eb8b38cbd089330839e3fea3aa0f63a48b0b841024b046008ffd417b636a2db9162088c93e6441c0407deaa5b210e660fb7c174875ea2bcd07dae14acf991ca302e28cb3b28604654b5472e4c82d778a8b8f3b49835ee52ceb7f58f43601a60edc14db8fa33f2fb870fea85a531bfe8c00abe0b29e2f70375105fa3316bd4416ed2c270d2b80a974592acb19701fabaa53eac6fb21ea20f94e46958a9217676337b89fa79279217928b2ee6f9a28f2f161984e86c7c23b1314a0e67c98f2031f58735cc1c87cb11b334699fe9927faf228e0f0852d395a030043538ce31233f438b46d770c69694297382308fd02dae923fc175c0508a8cafd632d65af8849d9f7c53cb92033a5bec478d0e37d0e9e117d08e8f7da7c2a36c79a828ba07e95e0cf417d012050c535de7c898b0825621957049f03243adbf96cedd054062101cdd7392a784e6970980e002b10b72d216716b0dc6a76dcb4fa0c747086506a8c8d9096d5b78fd30ec97b844d8e6607e017c141b460a37bf5adbf51951c832eaba6e83f8cd7fb79be6473f4f24b0b1c6b7dd761231bcc905837a4fc3e72b76ace70ecd79bf066113826951525bbec1b72744367b8d209eb0af891fce06f1c866ba46311f643178f9dff131a6c74b52e8e5a4b49e115f493e12f1c6ef52129568e0154470505466c6e7702162b52490158041c3c3c996784e200b6c4db1b78d3c1f75ab16a9fd210f093014540ea5e10de6210f4054fc07c6dacc3f7c8dee279191a651f41a744839c42d80e86df7b0c1de81c32bb55369419de6453020524249759a4d92cfdb670e33bc386b697a22c840f72185e8dff2ad291d0681ae78ab808a43a6fd0de97b4bb9dabd2954d9a12fa999240a72e7d30dacc53a6e5cd7c3b1aaac2816c74e7ed4a22e113a7c7071720d75cb3641dd33a81fddcb7aa4b539a2d005a106403ec23fef5ec91ce292712c3c84f76e8a59e6e0879063e4241951c1559291895a28f313cf8cecd7569a3203c0b99794f4bc58fabdb8bd32336929c2996bd7803d91045d6d3c1a46ca20c2780fed8fe103d5c5b50d5d5dd00e69e13e5883c3685f1d427fd7b23b2f9695c0d91468dd353beee3b8817484298b808a228a890367519643bac6b046ee6df5601943edcc4ac578973219f378bb8022f3247ee4dc860a8cb46d203741a96871f179d4b5afbeaf4a53643b2a690ba0e48c731e6c5a4e691479f4c860f8a27309421ec5f4b8071f17f03fa6f3c3de5631a31e21c478558974dbfe5a32549ad5c49220d4dbd708f1cbef08b2db620d58e29d87d93d535e74baa84ba84b9904a0a7722dd4fd5d673b56449eb9b532ce41608dbf0b85d7bac36150b1944a1f6d1d9910083c7f8e4919fd4cbc556fb7b8646fa554cb5b4e9a812e431ac06b3804322170024676578a51f88e13fdca931e0d21bff631ba75b23248a55e3acdbed7e17cd0510e89c0300a1a3fbf09a72b482b37f6b64a83df5769b71f3d4cea37f8f7cba2d42b5f7899630639a850c8bf2d87d9167d8666edbd1afd7379a5a60e2ea26812378af99c60954acc6e20be049b7756ff7741bc1252ebfd6612c7df6a7ab3f831906a22b5345335e421989d1fd4d509e1b86af5a2cd1b20d7c68d7c7859d76d413fdb3e15c3f49a4fb4904e4721d800636584ba3ba7e0b23330348e05b87e0e30b9cdffab0d91f9405b7da7f64fcd2c652b3e83c5404663227bc61a04926236f2756ec38f48e011cfa9b40e73cfa3eb1a0582697fc75a4e09236f2391432b06d23ea98c85a24f50cc8f240a9aec8bdf85fe671552b1ab516f70eab58ef0d1aca30033c633db15130b44dc2461a14ad7aaea4b82e890745285aa82acf9433cb7c089d9993fa5c973a56c7d8553955ca3c5376fa414ed645e4cf2f1a3ebdfe2cfd03b2b49064bc5406fb864b4b0136ad8421cfb5a103827c67045f1c4cd5c87ec213d30f4765388aa400f6d2f3b507d1fa7f7c20547b7fb91d99ff7afe43598ef4274d7e5f19473515bbc7dbdc51b4e9820d4d63411ba63c8c607777c3a80542f419567327a206d749f86395a5720b4a50a5ea0bfdc8f3c38e5e80b1765376f0e722f69b00113a8bb9a3000c0ab5834df8bb07890e5257035e4fff462bd1c986bb20f781a31557a65ae0bbbe0bd4cdd033c98627372bfa855d32a5063d70a0aa390464f53afb71ebfecc08c86328703c4609e59bda8122f51b4da41652dc2b11cb10d7c7db27aa440d2ab088b66aef913e6dfccc260b78ddd0625ef4e293db5af81381da1cad675cb52da03188a8c5d56d3e0413e53a5a37aaa3f60a4f0e5b2251036dbd7c5e2224240d0c8407d2426ba288f9e78f052eeb6e088683f0855e664626f066ae0fc6035cb8ccf2b719711ae42f849757df1d353591df746ac1141941275cda93853a51b60bfe6369e3816316e56f1783ffbe7845192a00622e36408108b49f92e51d263e9dbcee5ddea2d3453db77f8f37289334974d5e82ede77f270ba8d9c6a1ff335e59fe6f36a0113b2f429c72d9836a1f7e7580df547c1864f7053aef055d73d6cb741e216ef0ec3aba3e710079dd8ab3912946ca5f39544ad50335f42720e7aff2fcc44f13ccdffb91b1b2ed582324d296305778ac40e1bc4a23b5502136661cc16eb5cc32187faea3907bec8d1a4f025d43feb87e0535243d2e21e40c82705cabafba7fc71b089735aa648edbfb5f7c3dc3336b47bb647cb61e7fc7676ae6a5a2b3d8b8487601042cbd83f97be2741e8ffaf58345fd2f140d262287dfd31d9d0820603c7422df30479b4b19e4839b0699129e29ef610ebf5714ce2761a58327212a0871ceb6df27ff62f21d9ccde2c7a103ed2ec2bf8be170006d184ad1e34570805416bbc26d49e602b4424ad60ae6898c1541cfccedfb6f0d09544603b1b696296a88ccbae7ba4fcedae7913a09436e5a87db8228c5e69f0ee8143a50d474fd451c8769ba109291954e276d77f77dd3060a79763f3cf6aa017566a335a0a65855cf9aef91e1e502c6e2a8876d2fabb143bad2aded1afff21486978f7c8ecc910a79e2193ff5feef8cf5e9873a22c3c6013fcce82ab2fc1702fa7a1381b89a237c66c3f1fc80f286ae2b48c663176438e959f3fdd8da1d4214bb766c339bd513776288ad4f75c2e9ab5af2cbb803f746e13137034b03efe313254dde4fc9fc834be136497f393978fc7fb8253f9decdd5fbdf45e6a8f9d3019c5aaa0da9225054f1420177d07ec3a6d3f74c057069901e4ed9976976384c00cccfc03370ad9303f8ef59b7d1b61964bcc2f29a95d68a43032ccc797b0cd76", + "public_inputs_hex": "0x051a2017ad92c87921181c97a2e391d9553ce249ebcd9996de93884673f619322f2dd8535a4787ea8794523842a3a4f45cd84bc85749861fb660801b495b32700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000b9a0f7d416662331f2947d5825d35866000000000000000000000000000000007c9d1c70e9f0b49ae4f1a9d855adc7521344a7b4768cb3057b291d131994eaa7652cdacbfa289cbbd0750825b96178100c0ec371320ab18bef9527e8f067d634c64b646c5ccdcc1b6ad7f65abe7b22530a7dd51f091c0edb32d08451689ffd4d3cece3ac46d017769c24fd9b7efe90a609d7c9200baac6123789cfe51962e4cbe7f8c6bab3936ee3c6e1e50892bac30b154185d801f461f9568e2e620bd28f890c097a514cc7843c7e2b5d9a73919ca8231aa9903031b9af03c8e42941464755bb0f5e07ac55a7f50a03a614b4e0561e2d404da0422bf0b0d0e1cb1baedfbe40eb0274ed52ca42822f4267851541bd60255cdbf485b04b82215e305c3af08705360c2aefd9a1e5d539064b0439c6eee102d6b0493e96a6cf3b2ccf7f7b3f9d23ba486e8675fc6a98b9414938263b23b7151bbdcd1323d901dc5c874189cd37b54f77235c9d7908e5271fa34a4468541d1498026901a55760325a45a9f2f3c1226941bdacc4e6c165f8808da0882a424a04db34abc0be00e1e5c2d601408e1c66016ffd9d84afa3ee3dd2a94878b05b3102803c7ac71ab405a22646a488ed462ed6e312aa2560c7b028a6dcbb7bc72b8717e9e3d6571969d9fbcf824cb303497cc73cdaf518009683e759f0117dcbd36c01f74c8d3bf4eb9bf0285f1c449d1c7ac89b47f18f341adf5aa2e3f4ee015bdf06971e2590aac0ca3a166047c528e88a47e336734f8385c19072947e28c97bb115c8fbaddfdf5188520725f8b86eebd64db5f4965bb394a5790d47a2435a153b151bbdcd1323d901dc5c874189cd37b54f77235c9d7908e5271fa34a4468541d1498026901a55760325a45a9f2f3c1226941bdacc4e6c165f8808da0882a424a0137b1fef8517c37c0e89b2b3138968e0ba91121f9769b6dfefff1b5a0eddae616bfde8f3fccf4becb7dd439489d940e934b326f0caff6d7379be84842bdb840182a7db0312b9e23148be04bf43dc56708b804619c8b6bef78155f17e9ec406505837314ee4787df26885077f956792991f7544550f55d823904d5b43870ae5e064bfb190bcdd46c54b627c173a2594e226e70ff36e37685a0482f6e6bb2c417" }, "decryption_aggregator": { - "proof_hex": "0x000000000000000000000000000000295301900dbacf4e2f773614599f5e4a1b0000000000000000000000000000000000281f87ec1c957f575d19793aa101f30000000000000000000000000000001dd3d9217a058622d27c87e15e0e20bc7c000000000000000000000000000000000025d41181e9f9c962074348a3e9828b000000000000000000000000000000965d1206d57c770f9aa8f7a8dd8b49f5d600000000000000000000000000000000000851b93ef7d090cd4a11aeab67071f000000000000000000000000000000e383ee3225b5289abc01556f134410c27300000000000000000000000000000000001d9ef02f5fb32e429750834a75b67d0fda5f54afc38d04d32f8f7d33650499792712c4a2c3fd39694928a4275585202f370dac823d9d9a2d064b7b7e0a31a804f7299ee202d0f098dde2d0379785370a6b71416b1eae2e2dea0ad0f4841eac926fe3053e11f19409b6e663ee176e6b1c902992ffde1f7fc62cfc7791f9cb52a5de2f17a869bf5de1230d3fbc86f57d0f4eb7c3505ba8abd459073464a6797dd705e6ad1321e226f589e469ddc20ca809178073049e1e3216724cbf1fbd17a82118a318759db01a8b2895fa62cdcf402a417d2539f6fe9ab0967eed033dab189bf97872d0d665d9aff14a37a44af5402cd9eafd620afdc1dc70fb1e4910e8b8f70cc26f78034c71a8711196ffbea6670ff01a217565923c997df4e16c1eec5fd616db99012c27266fd7d4af500504d31a7ffdf2f2c638710a5cee398da6e63eb334b70a8fc8a755e19c754644d38d6513a49eb7815f4f283519c46b2c255863c3f16f883d7efadc804a0e52488a6dff2ab9c39d957eb09383e87a32136492b7e65e562dab99b75269964468492733d60df2962bdc03aa39b1ba9d6490bda03aa80bd5e9d79ddf8775a2176be44f256c029b0c3932445e2972b8a5bdb40578655996ee2e9759562949010ded203569d7020d481fb9b80fd6500c828d22bda456860d7d6af20c287719626fe59fd5169e047e571d2f52e5794d17a299d2756b0075e9745ef510010d76d4f64e20d3dabd12e9fa2c0099a8cd3724a20f4d67a406a1f78f9b7962aa25b1a03cecbb876d082ea0db1d3946587b4740c450ea7474890e5c6047fd29bc1ab27bb7d4c26b692c13ac5e8f463794efbbaf1a6ef3537356c911b42135e77b96f326dd2e24f8ca240af845ee72dbb3ed0afd51ec529d40f1c3e8f9a6137d951d226cb4624758e697088d1ba50554e9aece63ac192732bf9681520024dd99fa0a9d3c5f1841ec9f7f2043f67c7b555c40a1bc076a1313ad51dbd731b921acca005203d03a2e63d8ec1f2c0d0fbfda2c45a687f158a8b1e11487808b2bf6c138fb662d4b0539b0b73d01ea379e9854882402374d5ea37d2c3b649b1de855f65ff8259dc5ea6f609002117d988b0e295212898c86b582e963df97a04fed585707d3b159f2fa95f3fa061feecb5c2515a278a56a5a5c7f2d169fc4976b3f8c2a6a48e558c7274e411b1514aebda385a81f99a4f6cae434b31e36ebfa0e0066963363475fdc6acac8a3dc21d1acc0e61c71867556ffc7e18aa1adac5bfa2d91eaad28f8603bd53aae4f9c14d93700e2454dddc00b57a13c44c3ab595fa7294e33b22b2150a8a5fdf2d51b00596fc9c5bc2a5fc770ae18c5128ba1a6f7fb82a144efbdfcd87f310a2310352e2fd0592750c85242657d6006132ba29a97f9fc83974bfd9219f2c4b84aed210d16bd63b83b390f009eb1a460bd268552cd6f4ebdb9f84c6ce0ea0ad3ef85f817d26d99f3965e368d95deae469f7b1e07c2479f764ef83c0d5d7e4e08e01990019e2523335522ae946febeee0e62922185b0102b3c1779ee9313fb845f9de3f21db8621a32135f3d8414980bdfa130101e00e190ad6c388f79535c09927f0351d92ebe4a406639495646254e46eedf882063b6e1cf93c747ba4e38587d220d6000f7b3440ea5bdb5eeb15ad909c712bc24f46875673e574840dd3ff4c36a294041a0b24925591d13feb4e4b4c454db0550890b7976cacfb8d3bfa90c71ca73901561aa1a3290cf9cb0a8cd53c83e31cae6ec0e86523f7f444716a411016b4a221ef2c5c7d57b90f36a5aa1786608ed64b955148a382b6ee4e798b367c08733b1e66d1dbc27bd9c4a34e3c42e873e18f36468f344af52c369991f351e2e0aecb27b87d4498897a8b199acac12f8178c3223cd5935bb91e5a2de21a1391f647200340282433d02d46cbd11e599aa7d5d356db0b9986f85de526c4ccbb9f6faee5088a78ad9f5c8f836b68421aac77ff9cc1e99c3768c5e6e55047cc54e056e4eb2933bd28557ed5a1ad713459339888ff9d90192156423ffc0fb3bd49f37e243709953143201ceec79c1778e3d903e51273ca58de80b15cc85582f5cbb9880621090f1038b686d39ee76f432c9846533add40d3ef4132bd288ce42bacdf44a03b277899689d9bc704bde303c2c28fb41db4f9a78258cca4f40f58f819345b18a10082112e5b83f24de26596c10c5a30a33dd153781253129920bff8f871ba5eed09519ca2f9de3793060543aa5a01782c2a5bbb16f0acae814fae667343e1c22f29e8bb57cbddabf661c626fe21e9987889eb0d44d1be4478095b42b082aa7b2f155c1e559661962e510f745dc5b6c42ca8dd056cd6d8a0a156ca60957de342001bcfb48800c3f5bfd52b49a00a3c6b708ac3ff3a370de4f3391def41e720473317436a194575213cddcc18abe0c3dcd075a9017b8888a14ef84b29e405cb0cff1e9b5d0cc826c27d80eb437c9a79ac2af32e09ee2e74feeec9b4e6df7b01a617229e2355b0706f793e3161749bebb7dd652c30c64a55c7418400b1b98f9ce703061d8381ab5ef2d2016fd209c7cfc5591aa7a966237b3bd435643528be09ef2a2526f56e13a51eb5664fdf0cdf7840fb996fd41bb1be1246efb44b97b76375ce007b92fb84631bb2c16be16f19d9119f26f5caf6b956d32d19d74f36123652750646af415e42a1ad97bf6d45916d0f28b1504ccb02201b6a2613ec8beeea6e162552642fa18f0783e3928465718adca1e32944d36e13e4cf7d3494adf40d2e35297edee096fc64f62249e225b208df36fd32ac3b6f73468e3a2245efd7d693ab2349539bb52997c995c6ec7d5c73804f596dfe4e973ba17e2f38eee67eadddef03dbd88fbeabb79160cd6b0be69d1cf011f0646a9b5e98396afd00d957f3a7250d3dc24fbd2a481bd594514c4129dd9ab6c983b17a44bd40e4034f11439dbc5c145e176cd00153dddfd06205b6ef1880c412e6049be5b44893c51035fbba18f62061e298be4c621bbef6a83526d6c6bb4d42c89debe1c193d05f419268f3c8c2288d94298e2b8e734c4cf446139b71a4b25c024e9b4bca34f06e9ae6120406f8063a56c3ae08bcccd7550021efd8a408196d67a597e83286f191216eab902a1d16c589b0b544c80adf9fb94c94009324946bdf67ba258c6ecaf147070ed28ab625481ba26c86c5f7dabfd8b9271174e980125145c65d91b316cd941b811d67c429af64ab4fd626fe9c6359ab89757343e7ceac0896801ebf51136d133c52b4e7021301ca13f1c73c54b719e534114c23dea66755a5316ea488d08d165e85ed8f13457671cfbe79a4a60245c45d8e8e64b7bb8f008c1fb7f534f652436fa74da1262ba69a4f83fafcc38d22835597696a44bae4da9653874d7fbb5fae1a78910f2ec00aa92fd3d040be1e08953d5c773ce6ef0439699cf8ad5d6a9261eade7cc71b31cf34e954837a20f72054b2b2e86a4c0e5248b0b7ce481056fb65601b935219a9c9bfb241987765d5adc892895eadaa7d59a4892a00ffa9ad8d28a1fae29e1278dea49e809e1ec9d3a686036f34239733b4d1435eb52774d34ff1123ae4e40758144e52d94f7340c80a13f0f578497ee69d14579c4e7a0d8d86c8cad3e8b425f23f72e816463fc497015f583633afc58348f526277325e26dccb341bb4b69033b03726e98ea12009a1703d8e80da3916753d543cddb65672cf153074941f9303863b26ad60afb235764bba79f3cdb54ef3439d0ab539b7579ffb9897c6a9503f708870d5e0cf480cebb29d6d9b43856bcc020332e30cc77ec91d8b15679991ab13c670052115366b489409e4dbff8242c63252f7a7c56e6ebcc17d09f9c8e247164ed4acb45ec0fa7f80583b169f723fa27c11e28bd36d5791e4e1aee1c340c21629af047328c1862ac5fe5f40cc3202e3145c9d7fe3c4cef005e77199793020be221aa6ef241a6b0185b471496400c48e46c8754a80779806b3391674abb073baa9798fde94db335c55116964dfdce1d230d9925aa38462933431197952508138f78130a21f386f9fc74c71f11f4ea2ad566ff94538a7b18b1f3f85a9d452e6a5fa52702a3944731f153de2eaf70f5585f920d1a918f64c479111bd194c4187ed1b972631aa08e9bdc1f4838047c970958c6e7719a3e31111bad5945cd1525546250ae89568a032323ad55275a0fd9d4b1bf23f7e3a0fab52b8082d04c71202c689a8861455f223a5425972ee18e49c6ae8875855a5bd6e951308ce3dce02faf558a705414c9b30b4d3910310c6fb1c30d74475bd9b6bda77aab7dc026e516ce6d8d98b94217879a5de10a629a42294e30fd8ef95ac6821c339777a05d0f0b3d196215bc8306fe2e723ad0984c597dccb5c816ac9442e57b712c913f1dec2d913e6a77eec56db38db4137e2951979ca639209c10e83dd8b6a49538689e8229d342c4b483d25450c8b281411babbae323046f95ec098577cbfb363fb35e2014cf742f99b7e0dd2015ea5fe150aacbd30945b17835f03fd4bc27263af55dac20500aa1074700d5c8834fea0a9085534276c135dcfbc4ed8d6805ee9e3257122e46ca34be58b292dbe5f52a07740c997ab822d157129fb4ff6a3a056dbdf884181ad6d7b025c22de4b5e12bf8d3ad74c8f8ecc68f6125c112f694a8b93e55f624de0f4fb200f49611e94dd68523e6006a16e98b944fcc7237d9df086c25ea3c2916b1d8ce9e02f792b71d2e7337462f2aee559afceecb1ec335c78e7f4496840c310384f37a273e22bcb5cd3948f4226d52f44c479b35b7e62a84612aa003700def1d1fda7388ff6ddff4ee045cfb869125ba23248f8eb948bff420a9ceaeff2f2b3a2b33a731da1c6e82d0dc7cf71eb74c822c0b7333466ea627d8ba6832b3150945caf0e0276b8ccfc2e67e579b8955eafbe1f9dff20567b94e16bd7e132e104ff494a8f26cfb9e9669dd70f42761ce0ebde104fadb0c2834b891454a957b1387d0d2bd311a6cb0cdc3b8f76eb0da4192eb718f2d0c4eb6214be4caea5089104d055b12bfb4c6fada537dc1d4348b45348f7c8e144c8a643cc5cb120d2f551aacb6dcc723daa61b4e590a3f0297866496d9ca26d872effd5b080adeb4364e291f6e63d1dcc634d3c20eb46383cd6bc014d787718585f843dfa7c4a64d9cc82835c477012192f133a551e9c396ec48d42188ab48c84e0b5592d471853ce3ff116a61c50c6a9a2986cd227a09115902f50d3684a9d5694884079441ae1231c408eb0674331904ba08a3d0efcee6986ed22546c2e5c08d398fc84e8052a8147a26753fbed70d89842cd4b185e16081f3f1c87ef2a5987a631065124f2218bb8f25351c02285a68c17f120f52d63e7bd6075ca5dfca58ef9c89ec72e38eb7a3021d68634f587133e9392228e1b0d0fd18639592f7d6a32c075279ff6abd1eba042d808391ed8b4429d936fe50dd80e5cb09274123792acd5d420cb9232bcb90fd0293d9594f95ac4619228586d183e50ee7b4f622c8cc7c6c6e66426e62d4501d08287982c208022b8bf18957984a2adfad87cfe3c4781bf11e4548b4e7148ad9301dcf5e088fbe21a931d1ca1c2380d3d06bfb370e2a7d5db7dda555777c054f12b2e4a5ec894db31fd6c96bf1a317a1e04b6ea96aacaeefd6a01feb575e9c662a7280a64ec7501ff5c60730ef62b4851a0d3ce6c3d380b044980c340912d61b2e491b631458137f52c1c92370661e8b5e12077155b5ef85c24951ab51a3ccd30a3911959e4ff0a0863fc4815901c720557b37424b7552d3d46c0b5ce4b37d0e0e8d1cfbe8068a7bba2f4769c838a6ea56e8507197ac0fdc9fb73ca0cb1f6e0a0d552437da907d7f2f497be884a922cca60a9b14f1af7e32ff135ea8d7a31e3f05ad4be935c7c7edd7ca801021d6bc643b8517cb197c9b8c567bcd9f65318d5216c5ec3f4bcf344de590e56ab346b080fd1324ee0c7eaf89e518642456cad25a0a14eb78f65d7440daf51ed0e8b3586195c25a38f9509a0f0c69d5974f831af92908f9efb44b0546878997c23fba2c87be71dad5dbdd713df79491b174b0345d2a74a3579271c41d66a2484ebd72a249f4aefbab79758743a608c709b4ec93bd02514281699c4e68319454a2d12cb63ea7c9c7144ae098dad55f92dd785929461a2425b2ea60a5e458779a4ce03bc20b103226c71ab853e3360a088ab7bf52e3177cd09cf21e9f67e92f2dacb6bd00f533bf0aec83cabfc275c0cc576865987014c63c7683d4eab0020660c1a5449419581990f081658bc3bdaa2e2e3cad91b8153cc1c57dbbcb00bc3b6d56edd17b2ec52da6542c3d935340324300253b3d16004efaab7235fb747f87d82ff5d34a102c22387426c6b57d43538a237ab8fd10015af469e34415dc10c414a89201a946c3dde5ab3fc40e0017082d42e1600eb112a2012ea9ee677607bc0ca550b0453c83b4e62b60ec12a815297b844bf6acb225716609b1619532f3dc7621c5496d6c45f3999bc3908bb57cf3d127e76426671ed7f85da83ed36b05fd08cc3cfcb662e88ac1953a667841e1538f82447ad3322ba08b3efec212bd55e8582595cdb94575123da7063ee522ddea474deb33edca023515076b4006e8f5ffceee68f8449153051529391545c5e4393823f74f3f9a2a56764996fdcdd1c327cee2553c61ad400f016b965dcc5fa4a66f3d2231c5ba0c19eff2a7ae4f4a2d91eb2b1d07e97274bde95d0a6d457eef493f80d636cc4818a211f2a3a09c73bb941494d620630ae3473874e18d79d41597d5b3fb43b09b0468703e15d5ec9a120d4ec8c2995732c14a53c14122e5d464b8d2b275d95bf92f0c40461b45ddd165ef5ea4e4a9c51fcc858f9052795cdb6b6d3955ac20249c1dbdf631541c5d1001c796fe1c3bc98d5a56cdbb9fef3e225646e7489391205a1b976d0fa87fdf02fb14fe58369c052b1259b8749199bcc2e6a54c329a468e2816d71d2a5705b68fe4bf158455ab411c77f83dc18743f0416efe1ef465b10bd82a7f1035c62af8468d7ec8b07ed7b962189edbbb4e16e197e84ab732c6cae69d27ff32c196f5a24d6b4c61858b190ecea3f4ab2b1fe349411e4d16f137fc68591627d01e24719743c3a783d2b720ada5b4fbf3acb2a4ee852f04bb6c22c4d06d2ec35aac6e4e83be140cee8f268afea4138cb9fdb635d5ab2a3bdc0a1df7f03c13528feb6f15460f6e9df91472366e6bf21bf9c5c2d644e643da256636bd43980fc68520f69a30d9ee0380dced0a9d83b72b24a6afe484a86e24b3f2985a6f5f2504abfd9d998f64572b59fda822669202b98196842ccbb501915fce5f9ca2722487c638c7978b3cbd792e417a16010ff50697a8117a256e85bfbbb2b31b46a60b1b61379dafc428f347cbc5fafeb995a95e0928fd5d393f2a21ab5881c936951bab6a372925de1292031f8409dfa25e3bfd860bc696702ccbe02552afbeb94a0adc4bb00a114a8abaa59784357e5b1f75b1bafd846f983dd1652ef06f9fc2f702061af6cde830f677f9dc87209ff539669ddfd8b2314dd3c511f0ebb44f732b0e1899e5f43a84f0bd1c3dc4a5920f614371d1d38ab3580e98a0c95134370b3225ddf9f2c34e8f31520a6a56d1238613ba6f8896c39e6bbd467d941c7ee515f1052de74791dd6da3ef3d538f973978b3073894fed9fa1623aa12daec4b35d793135a84c951c9d6d2651d1ed8baaecece420b033b74627d2fd8aa307f834566cf0046ec9777e5ba8495274dd8c6c8e02991bd1adced93aa547e0af1abf4e0b35f2a377390e5f3b560c18223803521e331a6f857080d169ad03aeddbd3cb5f30c72b2f1847723b5e9366903ea1972223a6ffaa6ebac79e83846048dca441742103248e8826d15784f30858fa94b0864a5d04e9d647084d5470370f77f78212edfa1be39505c6a7eda07837a5c804304db49b536e563fd3e40dcaddff1187a5be231294b8fb130a4038b144680a929484ecf0f3adec5f9f5538cf90306dff351d77186bfa5fce33a6a424f00b9257719c11c3e03b37576befdb3a44ed606a3ef9c50a7e8a7d6f4d08c9f1c01901abc62c231a234a204607234fd73e25ee3c9405082718f5c3342c1ecc0aad1bb13fc861d6f8ea25bf84e5dd439ea03d024b18bcb223626a29e7ae2baf2757cb5244d0826723aab6db0c48593acdb6d74a935329221739a7fe51212fd73ae1378a002db36bdfd2644aa9145c86eb561bcefc47bf42151274460dbcbf8577697d5af6fd8d0bdb68d1a288ae81c7db2aa4760aec660e0f9dd10f8603b5c6f4aad153c39e17880606dbfabb2179560ff022dbc3e304561906139adee415d4fc6164985f864a003d6431f0d8f733f19354b0111303f7c52a8d9b49be4080e74c627344a0d3404145a7c2345089699551b4e762912fe3ac0d20fbc15e2dcd7be0be941799e6ae95fa62f360d2685b0abb3a03822ea9e6dc00fb7eb258e3bba47303b23f78357813e62fd5eda117251fa34a4079875821dc18a51f0f05343de789f2c9435f235ef896c1fbddf96ecd751b8a3a4d65d240380ebb9f09c6e07a58bedf12d7eef1d74a8252d5e380ba710aef9f36801f056f230f1627dc4260741b2ad13688776f380a2f41eb1e6c2d4eeb08a27aed27f9134e12b30f16dea406453d2a093e857c21d48cc5ac5af1ca5b33d702ab63044a88571b3a612ba67f25a037b18dae78125323dbfb2a1d6bfd0b7d9a31dbefd738ec0b1a5d1487045e1b0d54c727ec07f49c3eb0867cc2107c35e8487046db765155352d51120b7a86f990dc6886a42dfdd1def8a1cca15bc7c97b4e485f8333ff002e2934f3eb4fe0e0e399cf848b2215540a903856d1c8f5e4bdb65c4b68d667af7f2797860f30abd23ca2b5a285360a65e8b4d331947cc25d04fe23ef6714a16a02192c7aaa75cd9243c53cd982639fcd00928ad0228058d7fa9735cd91e7198570155d78fd578115447904ca511f886f79547bbeb10b968198a09e3c3957800f4b143a8f904e7c2970a1ee3c484b409106f4d6d5ac7cb108695ca447708642e04f0edb7884101a047603b9a0efc05538fa270ab9942cb9b9676c0870c9a1af7bb2215c66736bd0dd46efe32cde3b7bf30802541df1a95f41300a6b39a1d9feed4305eb9743cb1c4d14cf2114d78eb90446ac368f2c06a429357d4176834fc1d416193486dbe58a422018f111b78aa9fbd52b135e84080d1da97dec440c4aa3d6f22c2b8609075bc9f1c7c06d1abbce8be01039f2d9d988f19531dd63a01820f4380a9597e6bef762bc5e68af3b785122ce7e59f0db03285d9170f92cdb039615650e6d52dff4f565ac3cce2c5d06b88fc1c2c2eb288bb6590ae4f19005fb0f5737182328f66d90d6755502630b6468225293a305d63d0c68e86e2743c2b0191df92d971574e72567309d8b914a367849c9a33040070b0d0712f28ac5d812d56d0804f71817426b9feb12c3d811c268115e48200f4766d994cbe781085d68f8e8ca0e2d5911b46482aa92846d566ebd6cef3758dbc27039baf36f983608372798d810cddad739c455fec203b0eb81ccd2bc08e78d4aacfbc96cd2c63fb4b78466cf1cb713ba4299d8a4414941f3011c00ec1a84fe4fe846e5caee453f68584b3b1e24144fc8e1a76aedaac54d38daa4af2c623b15f2f1f1b41719526802673605822ccee7711ac743f5ed78be456ebee9c9eb884ec7faf997200a99f500226e11ee2743f690bc0449d367886ff6731bdb6665f26a19f1461c1a7fcec75909404779255c8010184c7a602ba52806abd930143b4a442bfae95197c9d7b4c26410a32402bc1684c12caea21f602ae5c873900b80f1167123b48c5c99208f39f7c0344614ec8dae000e0a20461c20086642a702fef290ac9b507e4b7b5a0602ca4211ab0258f84f064a9adde1c2c6fc90bc70a78a14110a4fd0867065681906ac25d1b013b1f4c2b7a1a63d31a53e3899a54cb56cb34ac372e6307057e304950d3845712d1ab6b8e9740c01012e05e0e8adbd3a7155f864537344de4374341b6d534aae2ca5f1aaf3c385dfdec66816af84753b6a14ed17b511f49ddf4b4887657759b9077f581d98ce5c94fda5677d4778d53e069c58193489b729a6090222ba672b2b102a163598314f62d9be636de9219cc94ba9be67841158d15c76e22b6dc5bd842207d942e2534759919d89229870719307edc178a96dfa4f66faa35fefbd248a298201184a4813f77751612b9be5e472c88947391340c441a61f618f4fd1227501535e420836a31bbf7758486d877f42bc25260cce771aa798ae4d169ca4de3b27fe755837365b8591c20e8bc5065c3af36a92900baac5dc9ee3da17a91299cd1e358d948d70d3948e90242ef30d151a0952012efc3eb4ab0b24dc0906c9ec822938e4d7a0db8990e170cd2cfb465199453179cd8ee2912851089850694b928c2ac4ed4919c0ae8ca30f1fe0d3c033c004a775e83c35d790a5ee28fbe25cf3911e6d4418c528991924c292a1bd87230cf4a72311013425d94d87b1316f088e7b15f250a25d186f7c149b6ce846c233929e7cd85748b1737010dd28cb39b04d1300000000000000000000000000000000000000000000000000000000000000002aa2ac71ea2526c560d9e9a09fc8c5a0acae9f7a4a9f55f9c6885bd1cedfd4382dadd8ccbb39dcd9a3294bc0f71872b3e7d90b7ffa89ae7838bfde090d474b6003e1335f2be7dbb075693b5444104da43ec167e1de6597c6230fb757160da15d127b3f3fc36fd88946dab6e7d7df5d1facb859ddd43eb639e5a1e9c3efd94180117a7cb502d530f70d4672eeaca46c171c8602019ae001892e33b6b0c9ce3636016175bddbe9fa917bd9f8e0c393b358d28d769cfba335b1495b1f24a19381ae12ad5b21dde355f7d25bead0d1808e93b485afe478dc7c4a1cf0a96cc8446da8258889552bb2efb93b49a47a2577d6b9dd3eb5cdc7321009ec8f763bde5bdec625313073b9b386a4c5f44844883a80a7bc2b7856d144838ffca37c95b79ae37323a858823f74895995f2170e609ebaa6af54d415961ff61eaea502cfc8e5938600f37490fe87aa732d3fdfe0db082181ac93d29ee5920c8b8031a7ab6fd24dd501334c39513573c43ff029c27e28577c3393887cc1d3848a8add77e5219f560219f98e636bc4e01cf7bdf86c6fbb8a0c86bf1396c9855837a06162b4dd7577e6250ae6ad9eb7260f23a86f710f2e4d5442c7820d4e498654155148dbef88962d129efe51fe4f1b59dda8fb5b7775a4c144697160755aeaf0b63194b4fef3c6152fa7622844264a9d2f4fa7168db9ca83c31918d798b20bbf4cfdfcca1e9ed3a6007796e0b27ac2a0b71d3c45899aac605f414ff2d91b9ea69b40023c6cac42961c9ccc36b997f1dd4c090fd69c1ab1e8bec00ed129da7414277e5e544f27af71036badc986eadbde1ac0a8098d6c64dcb99c21d31dcf4df7d3b755802b22851b265db98ce502012a1ff59593ee250d7692facf537f6953e9f740e7dea8c996550efbc05c5547bc00f1a8762a53905024092b739ebb3d96093649cdc320e89cd62f9f50c029c6bca51c9d74c1d24978a10e043866a6fbf61eef163a8a26d050881a4fc493184947d86b1c3e94efddc0635bedeba047e6addcbedfd3e7911088002aa12dcf287f9197b3c3cb7d519f78ec30dbd1adadf8f71be74f8ae6ff4cbea02cdefdbac29e9f702be6f9a6c8f7db5d38e11a971fed0c1c02db486b83f69d232a96c727422f770dcbdfcb1a786d2b0e6720b3ac7a4b9eb7c647788e0efa0c2a253ec0c797d3ee3b0ec8aaab344dd17ad1510fd7626256bbdc881e4b77e43b6220583a7bbe8c46e2f8d8cb647ca3e014d07be4c0397ebfb38bff3c424a9a2ff8176a59e645eb7c44ad638cbaf8c2118fa2eb1e58b64beb481e020cfa6604a278206f791a28747491621471558d592d0b3dc4103321f744f969be61a674e00eb0227e7c79f82473f2fefc8a4c120f3c7f1101dfe8bde286285e197175ab315df717296689cda394f54e1ebf443e6238a4f51f5386c792c7ffa1464ca9db2345cd2d46324d911139195a9c3dd2b531b343e9bfd372064ef8045d8c0ec7a471d88017ae8993285151e30fdae415cc1584f350ff995aa300781184fe9ccc9e0555502e1a81679a53efc5508bdb70ec30d246966edce9429a39e9492a8e64f80d11420b58019b34ead540cfec97a6ddbc1f7dc067850024d2f068c22413bd0160279f2f1f5001cb050a1e4f5a8c46641c26c0d17944ad4e9f0f16c358b66a44128baf057bf79cefff4cd15e0fcfba8a618f9df523ee21289d3ba5a75c8635b7bdc135212ac3797bbe40175999904e33c791910720c7c9bde099d6a524a6db26e49c042a2c2ca660ae4bbe4a57ef3942a53f0568aeef540a70f7636e14deb2ac9b13501a48278acd7eff74886ba7d7b8fe1aca3074bf6d35106b7b1ae5326bd69dff8714f73049125c099abc248e16b090ffa4e0fcc186f31c6df411a0d017c9e92af000367ef078d851f0f30e8425495f6b20aaf28036194bc6e2c2e76c61b4c4b23d1f6ac5d19a569feae3b7704c8b8ea7a37ccc495d493bb0f8507ce26a232cb39411774c141b236090481293d0a547495dbd83e24bcc48505017d6901a04bea3081828d17a12d11fbd11e1c29d1e8aaa1d3ca81c7c95e97b6b76dd3c3a14157ad607725ee6af918154e6d2b454ffc2724ffc5dd423e91e3836bf17e984c0a37ab41da5a56593208ec4773304d286c1941e8d9a8dd6cb5b79836c1ea091f4ac8b171f29b5e3be3de5128a308c4c9b68459ca025a03b685ac04cf0d630f20308d32f26eea87c06748738ea8bacb809d3fab65b068772eae701036d9ab30a8e9beece291fd232be84b93e0a904d884d71b5ee8d3c0857fc069eefdc90cc01bb1e7f9407e48115688d2982c684709258128d59c159c3038758fe619d8b2c474edd9dc921cad2995ee4b3b3a2d5f24b1f7171016a955f5a016d574066348e28b48d63e9230af69ce269fe504503a33e9e6a64ee7bb9a648ef9b940a5b0b3608f9209dd72aed82378e5dd2a284a007d93598fd8476922d031e4f361dc67581a17f3025d217ccd6585638a541615f0cfcfca760419653a3dab62804748a67e26d68cfd31521ddbd2f40262a66ab01ba6e86cb371622f71bda06ba61cda47fded10265b8962c8b00abade0a87f20a5c52ad62caeb5204267df4196f68759087a178dd454b310b5d3f3dd5db8b2a0ed4ea6a9916ba67a04542b00decf113e9e9934905d7d9a055d82a1aef3140b58d9bb3699e8d64eb0e0524a855da60843f445fe026e676e2f7a8637ebec0707a669279f718118338162e516bbf18b0470a7c59209cb5fe32db482b532efb2a5a6ffcc1cea23e664ec59193067f7eb00c99cb132ede7d52d1ea4836f09b07486f9a024c648c4a3d73190f604bd6a39bb8ddce4c5ad23c9082ed94b817d70d8697f1326f2ca972f02aa558d5d5e1ac55715ab3f3d219d191f2b8162e0d8086b42a09d09c5a4419c0b14cc5bfdcd6ef605826a1a0dac681b9a1b5121823bd9150000b22fcd40ae4bdc069ea221e82f33abd2d9de1da3df67490c57eeb6af928dcd944ce99883fe2fbb2de67e3c4c38b26ef2134557ace3150f03c53bc706a59693eb8adb62fba2c9bb7dca2016ae6f2e8faaf42cc2330fe1bb13b602ca15887de94981ebf7120ae80c5274f333492c8a0b75afaf5dde777dbd29b10dfc5d439bd69a17e691f2dea40d8c627498a2788db9dab22f98aa71ff0e046a62250e48bf369d93926d2d2d24f335b2e54e15f94303cc503df568cba127022279c8aaa1dd4d4a8d61bada453d666d1927c29ca8138be25aa6e830a41bd51d7e3d2f717cab48453c35ede7c1407b7936fd45aa99fd117201f6d0cdc07afd2998ed6bf410abdf325aac59a32721aea6ad0d5cda1e8afeda22ce2af7f5f9d32c8704c252505c1d6fede944a15e83111b75c2634b971f0de14e9d92e14bac0a0bb5a02d6a7fe96b400c401bfcd498072a6a2d13e2b4ef73d924d431b2d7a81815b3516f24c348e022d1b40de0c5e2989cb845225d48e5ac11f5591052083e59042872124012b2e0d054cf9e87c7ce50fa653681d409bafbb7504629faac6da40007fd9b49091d3da3f56716190aacf81285960634e352c0abdc5be5da8d56350d5f5537d2d41277a4978ba39bbe86e51d4d579bf71a65f7b7c9384126af319b18f195b8bd201c8ebe7e5dd88f326a40aacbcebe0ef58ff56495f0c35bdbcbaf29379715083b7b2e19337f37b80ae299749217f672e6a6043e94a0508d47fa3503d44225a98ba1f3e161e1dc7a6ca14d2b53b1d655b8883dc45606d06b0ae05d2dc9aecc8e0b34661029088f5f557862fda7174837eb442dbb50a6535cb9811004d6f2861cb25ddc7f695e5ab7ca35cd17bd9660ef8c60b3e4ebba6fdaab1d5d21e8a816afdf52cec0df8849b56f882f3ee06bd0e0ef4265306d7baf061d504a280874f999b87f796301dcb3fdeb5a25265182f44f838298f090edd5451a456303aaa8e08364fe561744505d991a17bd205ab5d03cc449045ee83c37fc70e17b047f46de5fd1892a6a6524930ecffc339fd4236b69431833bd3318281090ee0c0ad5948ebe822d29abc5ea3de2dc5f66b0bbe4f8046a6355c81fe78fa87c5c720a3f6c77e41963d574cbc5678e9c2f6f911b27a80ab7e07880bdd3eea10e810e", - "public_inputs_hex": "0x0735d58c9896306041928fcb73cd2faeef2a225c22cdcac38d802de73fae0eff1739d924e1b79deab6c8ab6f90b56b0676891aedb26fd3fddd21e54c0ac32fc700000000000000000000000000000000278db7a5ca9dd9834fe122dbab221ec90000000000000000000000000000000036e150312eb7d63c8176719bac04c7c00000000000000000000000000000000052e4e954fc32a2607d007b39c1d5bcaf0000000000000000000000000000000011f0d0573e70f3fa4feb1c8c090a0d240aa663003d00d723cc525ff3898223617e4207294dc85f7bb7a04706ff7b85b105a2fab20a277a785453b5c51e89cf459b0b43fd7b33c55eafaaf91bb7dcd1db000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000022b942ad53baa7c6e1a7616e4f0aa2eedf7d67eacc63696345525988225847479273fc58215abae6a73503410e8209a542c92bbea2ba8e6fb129c971def4ca8452ddcd2c1e0b08c268d942b52a49e7597873ccad9df1b02ea1ab854e7111eb2dd188f793a89424a83a3e746a72d4cdfd5702a7944deb0fa2ee04f84489f4af3c2000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "proof_hex": "0x00000000000000000000000000000028de531a03ea8c716308723a49e98ad50800000000000000000000000000000000001863dd9e60343eb083fde5a13c5aaa0000000000000000000000000000002b97a95b3bd09f3e53c078d3960e0181b000000000000000000000000000000000000c5d8e55d439b0c6fe063a35ea61330000000000000000000000000000002c4beb8dea226b4ba02a9089b453167c7c0000000000000000000000000000000000049347842cb766b8339ced764b1c2200000000000000000000000000000093224864b1cc7eadbda7749a5abc926bba000000000000000000000000000000000004cc8037a6eb48da8552b5f2e81eed0efc39c2002017d17162e522c4271f9f7f051b275272f5243aea89b2ee04cc8c0af108f8a2b82a95a064c9012376cbff7fcbdcb0e1016050ec4b3dc465db110e18df93f88e7fdb5ea050387a27716032daf59cb41e54713571625a9687ca7abf1e95cbe43576e946dee8d416dcf707a253f216b268083728648dabfe228586ba1512fdbb8f9c758244094740fef94b3ccb99a0099a511ecad54992ebcd9cdc090515a6c6b2c04c8c36fe94844fddc5ab97533f1904dc3598cada88c34adfde030045e38482f35bb9aba4f79d20d6012917ae5970ed8b39bdcb4771bbc4da175412d3ec29c3640aa7c6ab0ea4312fc898d5747524d29bc660fdc7545297e383992ac4a6698c465dd01e98bc982dd1ebdb45f9d0aa568cae344ddf469ee38e812d0ded82634607a0ae31b5e9b4f822edd899f3e27fbf2f1157941c9875d38be8e905f4f932e7eb9e4e753103e4d27042bec7b49061a5d2637a0cdba865ff6615c00b2fdf03b928f3a4cd7ccc80922342913fa274890787f35037b7ca6eccf61624290e48254b5e4d642f1cb355f7cdd45509ab27c1f69659dd550e612e4c330a1b16255122c17c89fcfbf1523c52041188dc8753afc632aa4f6a26d85bd9803c610ddeb7c8f887d9e9ae5a4985fe19ca9dde3cbcc455907c98a0785d52841ce04c09294865b639adddbb3dcda53b33b07457d16211aa2168be2c2dd32bcd55eb1b246c7710ef4c62624dc01ea8b58603c6d80127e5f04a93415de68d495b10d0111b8e110566ea16c088d2d4a4a8714dc6aded5eb260082dcc9c629d08eeede08e1f6be84c851a9b40fe72369b0889dde264a8764c18dc3faceb037157f7714ef80235f5eec7c5261d7620c072ea79f38231e0a9adbd63baac8d0e22898f0e673a1a0f5bb42ad75e090f6383138b606822002a05f3c254a6a3da414e93c246ccc910b0f805aac3943f1f938f69dd76bd3360f83db6e5e3df283a4be5376831bbbd192f52681084654c7d2b396c685a5dedc76d87836ea1c60b1890fafa88fb96d2009ee269ee99c246d8a489738a025cedbffb86fcd3c62371670a3a4a6aaa5baa19d003c178ed0c2647bc3b5dbd7e3a258131c3b1246ed08c6fa9aa25b22e4b82174eab1f41acd83181cb47bb0b073ca2f4eb50e68ff8c5bc53b33e55e05d68e8230d853f30433d15254fe186e2a5a80d310caefe90f64b76f64a3a0059b35532195810f84bcbf29bffc4bb62c74d5b8d92bce2f61dad810e302b4ebf34de7e472844ad35122adc83c605676762cf93e9f761b1a3154634afc6881691b9cbe19e19bdbf6c9428648bddaa2495a26a9fad8cf4e19c341e51ba9626329b8e4f930d0f338c88717ef620ed664a51091ff59d4ad4fdf9ff114dae9c816e8e96c3a38a26d6d00e067c28e27159e53b0c38d3685bd5770d7e0f67a6c7eb86e25d06fbf60a9472c676e4b4a4d453f5b731e70fea152b0f495b167e56a51b980f0eb373f611fcfa2d1366e231f63fee26d52d45d5c432379a94a8d0a64322c688f27f6bf30ab35b0d8f9e65b71cbc6f46cc4a5725751cf068398324914c15eaf12052648a2c8fa58b21942b224c5a95a962292430d41acfd86d24c0c3a0515d5357e535b20f7a8f53d9c061d2ab3a8302e3c7f3f5a81cffb39d35cfc1b55c0af41225f59d08bb2c7cb2f660b64161389e69b21cd28df49d69205c9b7ce7dd0d915bc6a4762f945e88ad26d823672cdabf1d5013efd5fa384e82003e6108f38b9f5754b23902b8d24649ea08c74bc916f0fd2b1cab39beb804a7aec4659eee7f9636e98f751a9c7e94a83abbaeb2ae41a117553bf221a2dba89aa0c6da4ead0309292c6d6b1288af2634ef4463faadefaa4f1b12b9f7f4a2dab6885d612bc5544ad1dfb035219dff6343b499863e16ae22628e56345a2afbcf6876c096fc75654988aac4c61ee083578f7d96c4deba6e0c08d27ecb9441340d5141f825b2dd245d8d1839bb1a3017f5171f8ddc3d440ec15f5b1f6e13ff6c5d10f071bd1a4addc7d29e14e12f47565dcb2ea3afba3ae6703e887af4ad5ca0af1ab678798c51a7dfdfa0d40c0076e6ca1e186daa16239f05a04e2ee595bebda489f8293746817bf49ef0a49b2dbcf8b9721c7bbe45b6a1958cd9764bcb819c62bd43427addc24cb8cc603727270e7a114b910115c2fc304546e45c88ef75d3ea7af7f3a508339c1155b09e6e2c7bbad2aae8bf0ec5c859599014a54eae5d87597738d399344922f757ac4df511e6636e60a64dfcf487d44f97435e9ad6fd35681409550b560f26bb3d3a4c322a0ba5fbd3a87ffe83141e62732af5c54469b42697595ba601bd8797a022d4101b2254912af583a8c10dcfa865d5236d7eefde1fb8dbcc6637eca6da040c90d80d2d018bc5501a1ccb7f8bbc91221d77e1dac56aff470f118ed69d20c7c29c121c4475a462019122c26cd84dd9a086ba86dc21ec79509986124a1c583542345830034b48bdebe41bc665398380bb7e212cb1ec0864220541d426f62e884c542929c63a6cc8fa6ba2a1d12d009fa1b3f845dcf0a7953fdfd843fddb7df3fad59c0edee412656534b545135dffa740075f6a941e658269f1a2917e80ab4b442e0d141b530442f261a4fee06cccc20f4e55b5cdcb2a5518b872c680679d3c6532381ee20ad89bca55cd3c2e96ba393a7471312b85bb6a10dafcdb50863867313594179b06dd2a98f4cfdf66c579ba8c524e1861695a674418fe67ed67474c44abf92d5f082af7e3b68b9384b02b71c45ba1a4705fc184be4a2e0077f22f751dcea018d37e8c398d6aa15c109a2c73ba24f2cc6f4431b4d69e1cdef0726ec393e18401d8f56ff3d765e9bee006dd8971513b54e3296d9807b7019effd1a761df43072a95024b72f9d2d724f45e2ab22a2928d4433c2e7177408047c3dd7647489886109f6cb068854b50e8b559dde0635e74630baa7cc147619b23b8621d0e75d7532eff5e531d317cf2b693bae7e18b0484a705cdb8b16293736786f1404424a8f2107e31d82fd518a9a03108db7ae9c4517ac0d81ed615dba0a35952c5cbfd3e35212a1079354521e4bf814b6d43e8d8907fb3816117b697e7216cf75b01d3bf6027129de9217f35e81c2ec6f2209aab9fc67f7c8f205cfc1aeff473cdffc6e49b10191f828ae6e277c39581b10fe53a2c914c32d88a6f9eb46a6fd7394fd2ef4222d64369edc7bc681c6ad122348cde9c576c80881b36da2ab8ca8b9deacc9021270ca1b25b669b2ecb4de4aba132e55c07fef313f685b61a1481350822fe2c1901dc0faa48d2e20d57a3acfa470185e8715b678e3b098d5e6a098f69daa2c80d067bbfec7fe608aad66919c5e75180f468d10f15423c7154715af2e353020f7f13385cb520fae632367fd5583af3dad607b2d23a1e32f6880bc9ec7f73ea1f54271220f36a15966689c6314c147afb36dd2f33ccf91309e912a3056d9e0e9e530a2b80d178591cb05133d1351ca81cf6e35fb02770ca9268ccd46e4b6642b64201f14622c755c6930b817c5c6ce9c50fc5c8ee8548f8a18eb7d05e330386968d160fade7a81a066fd4b029184ccf8a3fe818c5bf65ed16b9d207c57f24dceca5208f4f73b31b03d05b16b66134513d503e6805927881bb4f27aed7827e4f434509050bbe3f11bcf026c7047a04d7435187c9d04be0005ee664f271487f823b83242fcf57481e09de144684b11f408aef3ca530d5803e14f7ecbc9f41352b0a9302331268be92d1dcd07f9b92792a1fd5b73b28e25e6dad49f7ab57b6c0f5ae05014b66c793cd430b7e22697036a27fd553bc3f4d97786665c82f1e56836f0314188bf21c9de5f52fc8f536094fd4b11022f9599d511ca32bf88f8abf67d90f2f0a6a24ade0178be3a94c5e1097866652ba3f8d43e3b2bc7419287d8e1883bd24082f10ad35c5035743ad7de53917c7a602f60a872680d765ac492fd7f00f03351f2ba690264ac51f7eb73536eca1f95ab50071395a3ab37bd879ab8cf8ee44622439f2afdb185d5f207d5065deced88ff158ccb442969e45a5af836299a5e176020ae6adf794b8a4c2453c3289fd757f288e6d06977f7e80fbb05b371c61650303ae5fb08abad1c7b5a54f1c6d4dcccb6e401ce9411f42f7f7fee77cc3b23ae805ae32824b83045bf64f64913c6b0a129717eb971bf8c6d87e451ab81e4cb8f502bb7acb1a467fdc799e8ca2dac011569c996a492df070f3ea7405d36ddf8975279636e9f105f4c3a2190fc89b0358300a0f1a9c5b1b53b0b2d008bbcdefa26603bfcca973871e324a33dec64a4ede6d2b11737a062789d43cce80410fcd910b0341d73a467af6230f9ad08b3b0cc88248822f44c1e378e7e997007f4131e5dd0fc4aed40cc33d3edeb5d4939bb86ea26f62140b48e524c0ce528bd166cf97b213eb9e016aca122cadbe92b23609e2e113cac10452e1f5ceb1ad8f36227a6b8616c05a0aaf7a7ac16ed9beade0119c1d72629a498787e4196d54438af113f45f18eded700ccfa0ff0a4440c0807bdb95c9060ec5d5b83bb8de620300cb6af89d1ef1819d2a70e372d50f24c86046efb6505a6fac7f6ac390bcf6f8ad53ec9be629005f28c731b4ab6e4350c63d068fe3d3c7d4c0d94acbdace8aa3c85572ac46109b47fd76df35020d108e6d711c621a40c0f8a0c3dadc7b7af201a23f15abd51bc5804e14d9697761de244fb2b40cefbc34269559fa829525ea629a7589f1772dd02794149ef00aa2ccf3b68a73cfdc36b369634776844efe54c75956b663d723d1b88a4ae9e80dcd1be960b305fdd9d9a98aa494d035532c287c42f155d4451f5caea2f874f6b0ea3bc780e7a731c41c1731c97296b25eaf509925b0996d562531699118ea6eb686a6c54e28c123de5e17ef893d17704c1e7c3d0c2f3357f11059e11955ded1b82236fdcc6b8c19c4870fee96e94dcd08dfa869ba0aad9c3417c6c739cd08d9fbd9901f5b0324d016e70db343648ed117e6264055d685ad7f0170c3608ca02a540ca3242199f8b2305d0da117cbb088b10c5392549b63218d1c550c08a0d605b1e6aaaa9b1fef8f5e0f7166e7747d9335c9a2a9db3bf022762cd364950683d5dacc648d1a2ebb8e3e2023f8d0b60e010ebd02c710f8c33d0415c0123df66c49448f36bf916c66819b1478de6fe2e49eff549fe8ea16f8562a072b89ce8902b414afd94a91a8c58fb51d4b6ac5c1134b06c1a17b17ce7d18d62e3443e89e7508200338b53178670baf3159d64b0c60c838c0e341ae72f4224902430153d7b46ea499e03b6b0bcfc1446efb9c43b1db3496fdb1a7a6a679f0c224dd5e0b917aa2180464164e7ac80c53633076f8b59401daae583b3bc8edfc2d0973605943e1633d0e3faf8a0b723920d40d750bc12c0e224d9fc97c9a2987381efae05ed23f52631e0cb412b84a50be0d18ecdfb7d790d74f1153d3a07fe19726c418c8d93d66ae42d028961c097d633b4da8838a8338a10ee331eb28dad3681187e62a20fd57afaf460061acca69d2c4f7058e9136a16f5b2ab8f50d67b639284debf313ab8db1f71669142a579b31c263300fc12ed6e45612e19bd5b7e2a12ba928dd4f564f35f5061ea81124fca15ffd4a403be6702ac3e94ffe26370bb21d0662fb37a7563a664e457a872008907c0531898f1af5a77e72a07d10e3ab940d463a8dc8778caced28796f337fe82dd1700ae12326450e7696060fb1856b5c170bbaa9b16286264e3940d3c706995dfff427d1c17609d2a72a0e5f14a53a180e39e866b5583d002060e93bd609d426ea08fb92bfb2974ca9edff7979e2d9672a475693b450fcf8f310e6c185a5f6f52ebb3d0b300ff387ffddaaa38e4d598b1089c3af1e2b2fc0c88d9a44fdb9806def2cdc2be7fedcac97d482c555d8280119c1ada72dca197e5f1642ae116af5775c043efc019ade10ec6b3a467618e211118bd4d2476075b385de17e84da68c90d2b155a12fddd5a66824b76f01fa032a08b0fa71d6b1b9cc47ed3e4650768277fa18b6b49a394878e1c83a54a7da58710df5f902a8f55d5235732003fbdeeaa2b3c49999a48e1a1abff5ac5e52c1038f24929ed4aedcdd405a10f50d84f3788edfdf52306f6b4acc0fd3ec0e6170e9a51907fd4c535c233d7bd5424416d9e9a3830c772e8e2b32f2ef351dec61aae12f109b62b0162fa2c184d184b6dd5c76af2db87d548308c6d2f6d8509dadbd61ae2b070b62ade83177d5a80acc0748306f08c5dbd082d69410f7d0814c1feebbfa29e576b946c6d04a08319da18fa85b5e0ab075608500a4e54819b8540d3387f515e7e165039f60766b81e17c87363f555bdb1631daa2ebdcd6cd984ecd94d9c403b100d4584885dc0b1dd14e112631fc914ab835ae68ef86dfa3ca9d0ae739911359f45e7c9d47e5edec9127a8871d5dbc1c41ddb744a488ba2f58e9e03b7af72bb8288ef600843589847c0790df06199c8822461debc0158c74f10826064c732d6103e02b2605c563f2067fd080489a1aa0e3fdb05e610e20aa15bd214341900dbad31637a3f057e07e900bfe0dc7e683c2cc1edf93e621ddd5593b242edc7913161b0df030235b199d495b970690979a90dd128f38654c6e8a25240bc098aa26beb862dc25099f163f11f776814b28c5a1f553f401c1eefa655515531537b804b47da9614df787df770df1ea9941bc354f3c831743b24dde69a17e88b698d41f84b810c1f2ed751df85e3181f8a91e95b1a0e135f0f93762c3601af2dde4a800e6448d2d582bcf8be6f69791648ad5a1dbaf95016bc2e35d31c29fe98b384b08661e069b56a326c65c9b5444b529afe8c8c008f978c4dae6a45a48e77e834c003d724ab7eb55873aac1577591e583041124f08bcf3c001adc9b1a8f82d1c6d0fdfc3413c76db3816a842f36724e9e654bc46bd3cf6c49080bc6714097217af0a6f696991a89aabab576ca0d813468dd1856d3c583a371ef99c8bb749e7dd0d0299a75f3c94e151224b5f9ae67708a43461a6d00aaeb3cc5d1a2a8d910f756a1e4ff4beccd0cf18ee7dc661564dcf4ca61f2d869a8dd9f91a59b1357bafca0a097dfa4fc540fc3caa70bfc9fb21eef0c03352ff172a3a055532710ac1009fb307d012dd6d16334e7432f057a812df300753e6b5069a5a43c9d30b8905a1882724c850d1cd8d8aeb75c387d935f90e3df0e4ea4d0980015b63dd58902e09c51402eac65eb13dbac6bf15917a288ed4f7eea855d3b8e5b977a4928e9aaf15ae832416ae641cbb1b53f522a488628d8715b9ea37585a04504e4e1474305d3b665c1f20d59071741839203a47c45565a618b7c757439aebadd1bfa9821a5cf19c860b917a99263f56f60ff9c069514a499786599ad271317aebced66cec3f57bb5816f3c3cfdfe98b9786b720f45ad55c60b544098fb499bb3a3924106b0dc10e012ef684fe128ff9e24b713a65ba0a34dd959e548ebf1ad4a3714adeebc474c0c0126de8b9cf8b1b35f69568f50deffc42ce2cba771819a3d0562f1c883176fb9222e413b3901c2e508aaae4f3c06e4d6aa8c3aa847df7379878bf3ed806527cd602b7436e4d93960b64d8f2786ceb29834aa7e9a0788e586b861cc279009b3a5c1a1361f32062becc9f5e54c345380e04c11e85643294929e66374bcfec7594a618f0e4aeb9a9a0b0bc268abb296ac7c67af9abb39f948a8224cb952e580619ed164f480cf7664f2b45d016a2c41d33740da84031b55dfd4f0a3f653b4485e4962bdb146367166aafecd6564cb1483a63084825ac8373eb158dc55b10f116ddf61999bbbed9cf5ff48949b79eec9e8c262581399adae6544e39fab84690e354341da32d2eaff2909c1f6ae3b02f308c895dc9c0459dbe7139ced096f707c6e96317d04f7ac4e62e372591a147fecd8747f455d881016c924bd241a88c56689c681bdb33a8172114aab2f9627c043800812ec22324b042900c5ea27b2b937150611e4069fcde02a6c91e1ce02ca39230eea8d454ce576d9918897861db127b4e2623c537eccbcb863230b6d3dea3aba5e97c9e6ae7415767d07e28a5d93fd011e12059a8ed7f06eb151c6c63429fa8350da471eed4942e592186a58372a4bd7f7d2e85638b3ddac859c5b3372ec9f4d6517b9f8fe5cbe9c67c92301cb1c496901e23db21fa0321f6c727287505f8c8041bca9153ca46675666eadf7e44c6cbd83017361205af383b318601a3bd9a9090ed391c80e02700f7a167131f11d634583f16e8547bc585da7dfbba53ae887e0f7f235a429ab46702b1326f9e3e9714e09f0b9c99770ff0b7e1dfb1f8c61de65331071adc2400e8c0b8ed1fa606d9b446022e7a1ce9abea80ca24ad8b8ee9f243418f26e823c8c2d97fc2206977cdbe09bf172c391e819676c60c2d34d323bfe56785cadd59ec2bbb1dbf3a0c893caebf0b1130be18f28917038078460893077e069ed034073c406e73d645f6947fceac1e198635551ff8a5dee719eddb10ebb32cf4fe01679ec496f04010cd59cf3c65bd25f3099e3b0fad7a10230277658db2f180b80887f719e0846644b05513072cc40825ec4bfc80886ad9609e217805cd7c48cd03fde07db6ccda98079c100f24310c5414a568b23dfa897dccb395a48c5059f54bb2adc96d272d12eabe34f7e2160308ff405bf8a43814c51025549fbc896302a608f57074ed1aaa9a5d5026e5f703a8cd8152ba0ee456e89f47be07387f8bf164e279337faf6054336a4cd4312b1af0a1c4144554c2be9854efaf2567058e15b5cec9ac7b5f7bb4f37d5fad15b62f3e2531d7d747ad7bdc7d2a2d3590973031fab67d0382c13126b7e7419c3ff2021b8b5b9808ae9d0584c684100d44a5b3d63928efdf3d794f5b415ff421ec581ccc3471cb6cab0d86a510249c9ca6f73401565f8ecb1cd63c785164748bd5362175ac9be80a8258a8c590f30b1d73d27b31dfa967719ca7b14a094941b1727726de1531c6b8953490383fae8c99175e0620b54480288d412c505935978d268521e1c06237694ac13de80adf46c6f5d944192d5e117a23eaf80f841a5c5d6f431d4a3207f7483ae082de96cb209780c858da9652cd5a7c758f1b4d13e229353e1afa3d6137e723870a36a32f02f87d3a75103fe5e7a3b0fd273895da24bb5d6b0d60c8354cd9b2c308dc92bba744216b4da2e99a83d81c7e42ae32d317a1200021353b5069ec481da2bd151c90f809272d16dda7dc36297c1ddd633e75de87fb2cbcdb062866a5bece4e4ef5f1fd80f5ad1633a5be2cee368b33a31034d186a7285a1eea50327e410dd7d6c66aeb7460a382ebbbbafd7eae1b1b2941cf3884b61f1f4cffb4e231383f248551a92f4b0a7b69a0fc4ae594efc3351fd8259a4b3b01b45560081967ce545aa76156559837edcd709fc58c287c079cf22e575039480afeea224293443caf9fb4f62bd174c8e25408c5454aad3f77be67d61cd47e5001a70a8a682deec54ff330b0236cf570e95302887104bc768c0a191fb3f35fd8034e33d18766bea1c6200dab52f86d3d86f884994518f905c09e033c12e69ec62e8552e9daa3132e6e05876a7364953bb88ee0cc791b29476cefaa7ce192e0880be736c96901be6214015845931f85641d497f5676ef597423fc689b4f18ba4b21c156ef1bd72e8a90d13eb4bf2113f2cc0677a7b8925273dea3f82cab5ee3c6065770cfaef1663af576a026bdb0276c94f702bf2cce7f18054ca7ea10cc1f620755336fe710957de6533ebd4cd44d2b027dab9530d1082d54e36517934a9aec03d2dbbe38731a995af851bb7db2a2fc01e2694f2a6519c40543ee6e756261a81077365b8e0d24fb6d056666754a4d6a49fdc6c6e8db0a24a5dc219cb681659a1150be484104badf70c99d5513c71bc5d8da7e7c282b81b212fc768c159b25ed0b077d676ecda4d6e7510719da82dc585f47157fc9491a325ab7d22bf054a94f300aac0805bfaa95401a0813e2234e1707a2c16d5063c8a180643cac34989c1a2944e12c35cfb8ad4bc87f01c8022e8ff471749022530c77a52f5b025383e3fc0ff253c3020545cbb4ec3c65c04d0e4f8f0611edac141eb0a8177be3a0f5d71a25f6c290dd23c391911d02955d426e83385c308521879f30c09b7d40df7fed752ee797608f9a6c83be75ff7aa04ce2d0421f3e90828bc639a4f85d1efd3096d31785e6a715721944a64c0790226b68cd0ab697c59027b2b73dd70ed11c4404551ae032a48a3dff4554e55056bd0dd27f0605a1bce931f78958b098780536c385156066c208801d583dd98bab0d9ecab6fe32d56b3c7ee877f6c83801df4f0fc90288039e37aa5121c14cb1bcfa951295489e8c27211a6dd3971fedbd41b3162307a2bba26e9f101d8bfc3b9850bb3a7592ad9c761ec4b0e13763e99fd568306802840b50a5d07f0cffeb255826938926fd7abd9f4a4d8d62701455617918e2291efe2237ea004ecfdde9f7ce679f25c4455bc1febe63dea12c12afccf40ec32222ad9964953c5de9b9fe04e443fb132d9747f372e315c55c743c461d1980c87000000000000000000000000000000000000000000000000000000000000000002b1e3db02bb002c602fd07ff9fa350f0c1a3821807aa6e4511cf5988c37fcf10113585e2bbf1137cc550e84b027daf3d2ae722f4a4e24e811ab177663faff22c163afde2c505dac34bda9140fae254f9d8409c8ced28162c7cc2f862d7e0fdc21179aaaee03dc6bd5fc1825136f6bcffd1c036782297fe3b8a1d95c2b2c1b4f01d82b7913b2828bc8c59a5a2e627de4aa26a36660667ab186a99cd0cd91a41dd28ac1946b34111124be084b72178af3c8a8fcbc17efce554638aae7babc532871f65925e7a0192877f870a670589e94a7252db72f093f7eae572c708ea92af920ab1914491b2012b9b43a9ee5c2df27f4a1a1ebbbdab58e987da6d11674d3f961e6b83552bb1f93bfb13c7bdc8c0226aa62645db83e38c9671a9b7ca34543c0b0e14177bbfd3b934ba9ebcec03c39247f13240b15d280b680fd8e4b7bf414f42037c03a3afca873caa0dd15d2ef46b28576143756b4f0cab30efb8787ed38633299c119384950ab58695c68e04d88e90b38f3fc47c0b59a601dd7f836bc6c1002d0a72c4eb5e325c4597b7ecd195e4c9c1acf60f16ced4806c19d1054ec9637d0c6b24f92191a2b088c97998847f5543dab8290d045dfb16fec4477bf79ef67922286bb02cff46e1f4b4221817458c0ef5c86ff27984ada49ed0f732a0ef5fa51bdb3c961ebc250127b1a11d872a12b78a5c5c00908f813cd3efcaee21fd0a5c07879e6e3cc748b82d70925253082b191254423cd92ae47de6d9997020ef390a1223e355cdd49df3116106bcaf8de5d0ff84dd5fedb09643183abc5087438e9c278b3694fb48d806991398853e324b2a07e6bd80d0587695ac574134994a27ac29285a71504b76cf3f855b41e8b22a4c33011d48bf48e4863e4e35ab08df2afd2a5a2fdd9a7b437ed4fac8b5bcc4638dca1c8ccc2eb450f0bd470f6a1e944f9817477dd6d148cd82647ca43817827486588723ed72a0ec3c7db59a7498d5cd132e22f7ae7bff01928abe7d1ca9debf771fff3fde9e88fa388498ecb12f482a8520483e8eba83a239312fdce3ebfc3189a2907f92d72adc7adaed82a10f69d3ca1dcc6ca3880689574fa3db6d5135a5c1827ff87a807d8a927afbba901580329424eac8dc495fb8873c8a686ed7f04c20490502b335d92e8968d360cd9e0e828e1985091003d73be587128e9405958c366f30b7674d08f544d79bb8c38d9c20b016b7667d1e0f09f09e7d9684d39f220829111e942714a1ced59802981682d5b70d3782a5cfe89392a9c6eac9210326235852bc7afca76650b444497aa3338ccd2062466c151177ef5196c5c96c07374ca2ab0ac57a85d71f40525af76c1f10be1589fa31919baaf7ded3b0870cc25e1a13631f750882b04380bbc6ba70683a481a9549f23e5464debcd6c5961bb7a8baca03bf54bdeaf15a7c8cb9509bcf1a8c1c70f15e4a1552d8e156ec8471914a87c04f489e49499c6cb3b74ea5a8cbe7b72b0c89e8cb557a47a4d9df5843bed6d64ab8aa4767c9b2a6efc680a01819793400afe5944943a5f6a4f1c17b73cb111095d5ae5933563c64a3a552d8e24d89fe17dfcdbf76eb03ffc46363227e313bb63a5a291ca24f17dff1500fccb0c5dd55003f20c8483acbd9f4c0475e177b890c6582d8a75b5e15c2cf569b420c41fbb417c16660fc7b6a7c6cf132fdc7b54bc15eec3185478076786c38f9a1cc37b3a813e414e42b104cce53868118b92daf49aa94bfe5ee110e16e944378d42b7acd41a5f43c82757c9fccc9ce19288c49e760e9ff822f52b43afd16537336c2d22842919ec2ba1e2b4dc426be440af18ee6cd3650c9938c10a8d055a22f9aa67e6d609e0dda4fde33f970d4263d2d7c5dc31b68d22b7dc031af39e3a755133c81ded236241166fcc374379559569a344b5604224377940d1e3d58a07101b667824590b4dbcbaf221773554b1aecc7a71b315f0a7e019c6032ab0dcc05a2631c2725615bd95f2a9d2d6370ee9b5adf9534c59ef3c9ca4ed33ee2fca4c7593ec1fc3cd253da21d11115262d0ed15c4323cfd37ee6396256d98343def3edb26e65db4f61941b11780f37a6cf2d7d684693573b301ce21a82bbd87b89ebacbc8e5b25d340cadf26a78b96f389fea83570ef80cfa8b33852fc2183ccdb043cedbf53ef72626396618ddcf2a2d93eb169d3ed0ff3bf51e5dbb86b67572ca196bacd7c31acd0867edb2e2fb37fe110d83666dc8ed7f040cb1cd33df1bded36915b4d02f4e0f223f4fdb75c46a751de5c7a5c4966818b89279f19c1b762cc86e886d012851fe270c79ff13ff925a8e29062a56084e5f5176bdfaab9ae26dbe544e8e736e53151fe337495a8a92c92d0f974cb043dbe1a980234978befe7ad9b25d68c46a389b048f95f499162df3ea35be7ff1b6909a42bc5adedb64e3da1c9a6809b5ba98c61375a49d9523c844ca4d4d75c25f89b682ec7b434fbb30abc9379dbdb9f43f7c20d6ed836b4fb1d1d41b8ec92ea6035b6e039e1291d2f5010d7db30684deaff20c23fae7cfca4f2d288a25e0bc5300e8b023a0a72baeb0f97b4fa6ebd515ea1c071e7d0295623a80703c88a378a77fdbfff87cedc1cc28241bf924a6e773ec240049f2209a980d395cc03809af97ce5b5fc39930ced19cf5e2fdcf7591f9551b1b35d6a0468b1b9f6ceaccb0a88b70d6123e5b4e31253dae4925b284e2db8127300dc0afeae6758d31449b37e605f5ee06415e4a19fadaad35dfd1acca0914d129eb1a26852dce4a726ba7952b645158cac78e8dcc28e3f931a5f92deaa06a21238943b90774df7de19ea5cafd0203b65a014bd73f371979c4230b6e34f46a3a01f468e3823fa4dffd3271a0a2cfe0b2bf97babc8aa094f645b6e7d4c5a5827a0426cff53020efae66bdc06262c146528b8e2c2d84a4ad133d853a25cbcbf1211cefde308b593444b69597b5e47392bc5d5aa97b9febc7acc0cda0163ae8a651227898e6b5423cb7d74c92bca6aff8cb0846c6bbc7bf0ddc8ce654a6051f01a310d42d5f95da81b572d2bdc55f844a2c04b8e7ef7cb0c180b0fc0a3a83da42c90b46ebf7af45a9663e5f97e23bb2843a822d2a2af8092b81d6a734a1fd0673151b3b119431d742f7f00ac664a2edba30dee43d9c003ad5267e76ae06fb395ffe2b069c7e84312a2a48bc11cd819b4f9ed19ebffa18287048fb8c6afedd14bda60fdcb5772c628c490b3333910b478d7d7d55971189299a0a10daa9c1fae486f606d1404b5044f715bd6b0e11da1db42b9f7eb7d53bde07120471d3ed49194f1813a5adaf6b49ace66700861c228c5d4958c803fee63ad7f35dd3963e7898c3f01269d37c434dc2f1a106a9f028ad4adec8389271d6d365970ac4a8ac93e1f7e41431c9ee51bbf1889c165014440518caea4f20b1c08681ab5a93d096cc8357db2fe66cb76db2e74f084098ab23ed2d648b502a0051b2255c4c5222437a0054531be345da0bc856454fa23e2fa009cb7c0926ddff03ba122baf9366d1a1f58cdd1c7f1c0e7930a2c0298f69628e08f3960cf8ad263c8dfaa0f7cdb0216c552ba41bd44ae3e28739f8dcd53384ddb5d3042a8c26d923d93cd46ba5cf9f5fa96b4408acb49a2202da95cdbe00f33b9fc4028002ccf8dfc6eedece0384b59459cfad069c2fe7225d12f34f170093e03593d6abac6d80a04c1a1a9fdfecd543238a21225eb814b4ef9d892955194d033d74d860bdc46c2385d5a55189c9268ed655b116952af3af37d96723eab636917d14fd163a2e05c256facad48a1420ec389daf00faac923abdf2f7bf000e49eac446204f0fe0098aaf546181a5c86c93da753c0c518a94bf350fd8cef70ada76f9023771f71f5636c7c8c593e55d21bad7238816990bdecc6e981bcdfdf08cfb5129ef41349c5ade6aa1946746fb7e66cc621002e4fc9ec9bd6303a868450904697dd0a705ea93b49b09483e2a065884cb7eb021e0fe83f3263944830827dddd0c5c00b6dff254477b18772a4f13c47d06b9aa2fe3aafc3bbc7f24295b9f989768e7e69f880f40c41e2fe297ef4b2a08b64af0246a7636746ed0f816e205e113a17251f5434891db7604cfb2d4c5854fb903bc", + "public_inputs_hex": "0x0735d58c9896306041928fcb73cd2faeef2a225c22cdcac38d802de73fae0eff1739d924e1b79deab6c8ab6f90b56b0676891aedb26fd3fddd21e54c0ac32fc700000000000000000000000000000000b9a0f7d416662331f2947d5825d35866000000000000000000000000000000007c9d1c70e9f0b49ae4f1a9d855adc75200000000000000000000000000000000d9d58d997277771ab4392a65f7d9f1120000000000000000000000000000000065df817adcd7229a5284261b621778d822df5857ee19d06aca29008f9201b0e5fdc01d8b2280cecd1317587c8045782405a2fab20a277a785453b5c51e89cf459b0b43fd7b33c55eafaaf91bb7dcd1db000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020137b1fef8517c37c0e89b2b3138968e0ba91121f9769b6dfefff1b5a0eddae616bfde8f3fccf4becb7dd439489d940e934b326f0caff6d7379be84842bdb840182a7db0312b9e23148be04bf43dc56708b804619c8b6bef78155f17e9ec406505837314ee4787df26885077f956792991f7544550f55d823904d5b43870ae5e0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } } diff --git a/scripts/build-circuits.ts b/scripts/build-circuits.ts index d8a6bb9629..29d7f098b9 100644 --- a/scripts/build-circuits.ts +++ b/scripts/build-circuits.ts @@ -714,12 +714,13 @@ library ActiveCryptoConfig { } this.regenerateConfigModules(preset) - const sourceHash = this.computeSourceHash(preset, committee) - result.sourceHash = sourceHash - if (modNrPath) { this.syncPresetAndCommittee(modNrPath, preset, committee) } + // Hash after syncing generated preset, committee, and parity inputs. Otherwise + // hydrate-only validation compares artifacts against a pre-sync source hash. + const sourceHash = this.computeSourceHash(preset, committee) + result.sourceHash = sourceHash if (this.options.hydrateBinOnly) { if (!this.isDistPresetUpToDate(preset, committee, sourceHash)) { diff --git a/scripts/circuit-artifacts.ts b/scripts/circuit-artifacts.ts index 1034619f30..03efa2f603 100644 --- a/scripts/circuit-artifacts.ts +++ b/scripts/circuit-artifacts.ts @@ -9,13 +9,13 @@ import { execFileSync, execSync } from 'child_process' import { createHash } from 'crypto' import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from 'fs' import { join, relative, resolve } from 'path' -import { SUPPORTED_PRESET_COMMITTEE_PAIRS } from './circuit-constants' +import { RELEASE_PRESET_COMMITTEE_PAIRS } from './circuit-constants' const BRANCH = 'circuit-artifacts' const ROOT = resolve(__dirname, '..') const DIST = join(ROOT, 'dist', 'circuits') const METADATA_FILES = new Set(['.git', 'SOURCE_HASH', 'SHA256SUMS', 'checksums.json']) -export const RELEASE_REQUIRED_PAIRS = SUPPORTED_PRESET_COMMITTEE_PAIRS.map(({ preset, committee }) => [preset, committee] as const) +export const RELEASE_REQUIRED_PAIRS = RELEASE_PRESET_COMMITTEE_PAIRS.map(({ preset, committee }) => [preset, committee] as const) const REQUIRED_BASE_CIRCUITS = [ 'dkg/esm_share_computation_chunk/esm_share_computation_chunk', diff --git a/scripts/circuit-constants.ts b/scripts/circuit-constants.ts index 05bcef3ce6..5ce5eb27c5 100644 --- a/scripts/circuit-constants.ts +++ b/scripts/circuit-constants.ts @@ -94,19 +94,25 @@ export const COMMITTEE_PARAMS: Record = { } /** - * Every `(preset, committee)` pair is supported because committee-dependent circuit artifacts are - * regenerated automatically from the BFV presets and the committee's `(N, T)` by the - * `generate_parity_matrices` Rust binary, invoked from `scripts/build-circuits.ts` whenever - * the committee is set. The parity matrices and smudging constants are derived artifacts. + * Every pair can be generated because committee-dependent circuit artifacts are regenerated from + * the BFV presets and the committee's `(N, T)` by `generate_parity_matrices`. * - * This constant is kept for future use (e.g. if a particular pair is ever known-broken at - * a higher level than the parity matrix) and currently returns the full Cartesian product. + * Secure-16384 is generation-only. It is not part of the deployed chain matrix until contracts, + * verifier routes, and an artifact release support it. */ export const SUPPORTED_PRESET_COMMITTEE_PAIRS: ReadonlyArray<{ preset: CircuitPreset committee: CircuitCommittee }> = ALL_PRESETS.flatMap((preset) => ALL_COMMITTEES.map((committee) => ({ preset, committee }))) +/** Pairs that a released circuit archive must contain for the current deployment matrix. */ +export const RELEASE_PRESET_COMMITTEE_PAIRS: ReadonlyArray<{ + preset: CircuitPreset + committee: CircuitCommittee +}> = [CIRCUIT_PRESETS.INSECURE_512, CIRCUIT_PRESETS.SECURE_8192].flatMap((preset) => + ALL_COMMITTEES.map((committee) => ({ preset, committee })), +) + export function isPresetCommitteeSupported(preset: CircuitPreset, committee: CircuitCommittee): boolean { return SUPPORTED_PRESET_COMMITTEE_PAIRS.some((p) => p.preset === preset && p.committee === committee) } diff --git a/templates/default/Cargo.lock b/templates/default/Cargo.lock index e9ad6fcf13..7b7d7ff36a 100644 --- a/templates/default/Cargo.lock +++ b/templates/default/Cargo.lock @@ -4,11 +4,11 @@ version = 4 [[package]] name = "actix-codec" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" +checksum = "31404e1443b7b7bcaa311c1af456775cc3f668e34573f1503d7ce4844327629e" dependencies = [ - "bitflags", + "bitflags 2.13.1", "bytes", "futures-core", "futures-sink", @@ -21,23 +21,22 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.12.1" +version = "3.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93acb4a42f64936f9b8cae4a433b237599dd6eb6ed06124eb67132ef8cc90662" +checksum = "86d62d1a48894ec9450bcde7ef1e3681205771ff6ea9c61cc5ae031145192787" dependencies = [ "actix-codec", - "actix-rt", "actix-service", "actix-utils", "base64", - "bitflags", + "bitflags 2.13.1", "brotli", "bytes", "bytestring", "derive_more", "encoding_rs", "flate2", - "foldhash 0.1.5", + "foldhash 0.2.0", "futures-core", "h2 0.3.27", "http 0.2.12", @@ -49,7 +48,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.10.1", + "rand 0.10.2", "sha1", "smallvec", "tokio", @@ -65,7 +64,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -85,9 +84,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.11.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" +checksum = "6a16bf2f19c2ad84842bdfe6f3665620e93197d5c607889bfa3aaac45e762fd1" dependencies = [ "futures-core", "tokio", @@ -95,9 +94,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.6.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65064ea4a457eaf07f2fba30b4c695bf43b721790e9530d26cb6f9019ff7502" +checksum = "cc8dcb6fa613d47c3b764a7dc672b4b31f25751dcbcf542f7b16f3e1f700044c" dependencies = [ "actix-rt", "actix-service", @@ -105,7 +104,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "socket2 0.5.10", + "socket2 0.6.5", "tokio", "tracing", ] @@ -182,7 +181,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -214,22 +213,13 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -238,9 +228,9 @@ checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" dependencies = [ "alloc-no-stdlib", ] @@ -292,13 +282,13 @@ dependencies = [ "derive_more", "foldhash 0.2.0", "hashbrown 0.16.1", - "indexmap", + "indexmap 2.14.1", "itoa", "k256", "keccak-asm", "paste", "proptest", - "rand 0.9.2", + "rand 0.9.4", "ruint", "rustc-hash", "serde", @@ -308,9 +298,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc90b1e703d3c03f4ff7f48e82dd0bc1c8211ab7d079cd836a06fcfeb06651cb" +checksum = "24671b1f62edcf0f9b62994c7bf72cd621a04a4b99f5020ece1a647b40e2f103" dependencies = [ "arrayvec", "bytes", @@ -318,41 +308,41 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "1.6.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "840128ed2b2971d6d4668a553fe403a82683d3acc646c73e75887e7157408033" +checksum = "c64558980fb038cd34b4285ec2b36a2a8bd8d4ddd13b3f6e42d97cb5ee29938e" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", - "proc-macro-error2", + "proc-macro-error3", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.6.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63ec265e5d65d725175f6ca7711c970824c90ef9c0d1f1973711d4150ee612dd" +checksum = "1ffb0e793abdbaea9d01259493c8272c3af295d03389e70a2acdf53b57ad1edf" dependencies = [ "alloy-sol-macro-input", "const-hex", "heck", - "indexmap", - "proc-macro-error2", + "indexmap 2.14.1", + "proc-macro-error3", "proc-macro2", "quote", "sha3 0.11.0", - "syn 2.0.117", + "syn 2.0.119", "syn-solidity", ] [[package]] name = "alloy-sol-macro-input" -version = "1.6.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89bf01077f18650876cfa682eb1f949967b5cde03f1a51c955c469d2c9b4aa67" +checksum = "32c2c0ec8425d9663dac939ba75750f17d2933d2f020814b4f8fde4a60da6d26" dependencies = [ "const-hex", "dunce", @@ -360,15 +350,15 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.5.4" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b91b13181d3bcd23680fd29d7bc861d1f33fbe90fdd0af67162434aeba902d" +checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" dependencies = [ "serde", "winnow 0.7.15", @@ -386,6 +376,15 @@ dependencies = [ "serde", ] +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "1.0.0" @@ -496,7 +495,7 @@ dependencies = [ "fnv", "hashbrown 0.15.5", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", "zeroize", @@ -513,7 +512,7 @@ dependencies = [ "ark-serialize 0.3.0", "ark-std 0.3.0", "derivative", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "rustc_version 0.3.3", @@ -533,7 +532,7 @@ dependencies = [ "derivative", "digest 0.10.7", "itertools 0.10.5", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "rustc_version 0.4.1", @@ -554,12 +553,29 @@ dependencies = [ "digest 0.10.7", "educe", "itertools 0.13.0", - "num-bigint", + "num-bigint 0.4.8", "num-traits", "paste", "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a806ac6c8307b929df4645776290a50ee2aac754ad09d8bdf73391309e43af" +dependencies = [ + "ark-ff-asm 0.6.0", + "ark-ff-macros 0.6.0", + "ark-serialize 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "educe", + "num-bigint 0.4.8", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -587,7 +603,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-asm" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1479009684adc073dff49a1025d3a7065b317a9ead25aaaca38cdc70058ba8a2" +dependencies = [ + "quote", + "syn 2.0.119", ] [[package]] @@ -596,7 +622,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-traits", "quote", "syn 1.0.109", @@ -608,7 +634,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-traits", "proc-macro2", "quote", @@ -621,11 +647,24 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "ark-ff-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a0691ed21ef00ef89c1e9bda832eba493dda3ec2f8d892fb25b705f73f06bb8" +dependencies = [ + "num-bigint 0.4.8", "num-traits", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -675,7 +714,7 @@ dependencies = [ "ark-serialize-derive 0.4.2", "ark-std 0.4.0", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.8", ] [[package]] @@ -688,7 +727,20 @@ dependencies = [ "ark-std 0.5.0", "arrayvec", "digest 0.10.7", - "num-bigint", + "num-bigint 0.4.8", +] + +[[package]] +name = "ark-serialize" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a74dd304fd536fb95d0a328e72be759209cc496a9da094c5bc56e5fea4f9e86b" +dependencies = [ + "ark-serialize-derive 0.6.0", + "ark-std 0.6.0", + "digest 0.10.7", + "num-bigint 0.4.8", + "serde_with", ] [[package]] @@ -710,7 +762,18 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f153690697a2b91e5e1251ff98411ee5371500a111a0fd317a70e588eb300f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -720,7 +783,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.8", ] [[package]] @@ -730,7 +793,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.8", ] [[package]] @@ -740,14 +803,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.6", + "rand 0.8.8", +] + +[[package]] +name = "ark-std" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "367c9c827ed431bff6868b7aa926e05b16eb46603cc8b6e768e4a5553fa1d155" +dependencies = [ + "num-traits", + "rand 0.8.8", ] [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "atomic-waker" @@ -763,7 +836,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -781,7 +854,7 @@ dependencies = [ "addr2line", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.8.9", "object", "rustc-demangle", "windows-link", @@ -831,15 +904,21 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" -version = "2.11.1" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da" [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -858,18 +937,18 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ "hybrid-array", ] [[package]] name = "brotli" -version = "8.0.3" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8119e4516436f5708bbc474a9d395bf12f1b5395e93a92a56e647ac3388c8610" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -878,14 +957,23 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "5.0.1" +version = "5.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5962523e1b92ce1b5e793d9169b9943eece10d39f62550bc04bb605d75b94924" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", ] +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bumpalo" version = "3.20.3" @@ -900,9 +988,9 @@ checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.25.0" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" [[package]] name = "byteorder" @@ -912,9 +1000,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" dependencies = [ "serde", ] @@ -930,9 +1018,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.63" +version = "1.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556e016178bb5662a08681bbe0f00f8e17631781a4dfc8c45e466e4b185ec27f" +checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" dependencies = [ "find-msvc-tools", "jobserver", @@ -948,15 +1036,27 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chacha20" -version = "0.10.0" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "rand_core 0.10.1", ] +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "num-traits", + "serde", + "windows-link", +] + [[package]] name = "clap" version = "4.6.0" @@ -988,7 +1088,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -1105,27 +1205,27 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "8498c871161e1742aaa9d52551b2d6ebdd4c3d45a3be423e3728f33b955be550" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-deque" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1133,18 +1233,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.21" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" [[package]] name = "crunchy" @@ -1183,6 +1283,37 @@ dependencies = [ "hybrid-array", ] +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.20", +] + [[package]] name = "der" version = "0.7.10" @@ -1199,7 +1330,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", + "serde_core", ] [[package]] @@ -1232,7 +1363,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.117", + "syn 2.0.119", "unicode-xid", ] @@ -1263,20 +1394,20 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "block-buffer 0.12.0", + "block-buffer 0.12.1", "const-oid 0.10.2", "crypto-common 0.2.2", ] [[package]] name = "displaydoc" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -1291,6 +1422,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "e3-bfv-client" version = "0.14.0" @@ -1301,7 +1438,7 @@ dependencies = [ "e3-zk-helpers", "fhe", "fhe-traits", - "rand 0.9.2", + "rand 0.9.4", "thiserror 1.0.69", ] @@ -1317,7 +1454,7 @@ dependencies = [ "hex", "lean-imt", "light-poseidon", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "sha2", @@ -1335,9 +1472,9 @@ dependencies = [ "anyhow", "clap", "fhe", - "num-bigint", + "num-bigint 0.5.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "thiserror 1.0.69", @@ -1347,7 +1484,7 @@ dependencies = [ name = "e3-parity-matrix" version = "0.14.0" dependencies = [ - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -1358,7 +1495,7 @@ name = "e3-polynomial" version = "0.14.0" dependencies = [ "fhe-math", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "serde", "thiserror 1.0.69", @@ -1413,7 +1550,7 @@ dependencies = [ "e3-fhe-params", "fhe", "fhe-traits", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] @@ -1434,10 +1571,10 @@ dependencies = [ "hex", "itertools 0.14.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-integer", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rayon", "serde", "serde_json", @@ -1468,14 +1605,14 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "either" -version = "1.16.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" [[package]] name = "elliptic-curve" @@ -1507,42 +1644,22 @@ dependencies = [ [[package]] name = "enum-ordinalize" -version = "4.3.2" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +checksum = "89dd01549b09589510cf0647475075d12071456586d70f5c75c98ae2a5537677" dependencies = [ "enum-ordinalize-derive", ] [[package]] name = "enum-ordinalize-derive" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "equator" -version = "0.4.2" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +checksum = "a65863d15a4ce2888bd2f0f543cc963d3879c3a022c8ee43f6141d479a3ac815" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -1569,9 +1686,9 @@ checksum = "40404c3f5f511ec4da6fe866ddf6a717c309fdbb69fbbad7b0f3edab8f2e835f" [[package]] name = "fastrand" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "fastrlp" @@ -1607,82 +1724,80 @@ dependencies = [ [[package]] name = "fhe" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "bincode", "doc-comment", "fhe-math", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-traits", "prost", "prost-build", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_distr", "rayon", "serde", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", "zeroize_derive", ] [[package]] name = "fhe-math" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "ethnum", "fhe-traits", "fhe-util", - "itertools 0.14.0", + "itertools 0.15.0", "ndarray", - "num-bigint", + "num-bigint 0.5.1", "num-bigint-dig", "num-traits", "prost", "prost-build", "pulp", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "serde", "sha2", - "tfhe-ntt", - "thiserror 2.0.18", + "thiserror 2.0.20", "zeroize", ] [[package]] name = "fhe-traits" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ - "rand 0.9.2", + "rand 0.9.4", ] [[package]] name = "fhe-util" -version = "0.2.1" -source = "git+https://github.com/gnosisguild/fhe.rs?tag=v0.2.2#f2c1d2258fbeef6dbdf5ade68438203fd80a648e" +version = "0.3.0" +source = "git+https://github.com/gnosisguild/fhe.rs?branch=dev#c2659bedacf1c8e91f1c5ebea8a020e6ce54ae72" dependencies = [ "num-bigint-dig", "num-traits", "prime_factorization", - "rand 0.8.6", - "rand 0.9.2", + "rand 0.9.4", "rand_distr", "rayon", ] [[package]] name = "find-msvc-tools" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" [[package]] name = "fixed-hash" @@ -1691,7 +1806,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.6", + "rand 0.8.8", "rustc-hex", "static_assertions", ] @@ -1704,12 +1819,13 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.9.1", + "zlib-rs", ] [[package]] @@ -1762,36 +1878,36 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures-channel" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" [[package]] name = "futures-sink" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" [[package]] name = "futures-task" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" [[package]] name = "futures-util" -version = "0.3.32" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" dependencies = [ "futures-core", "futures-task", @@ -1835,16 +1951,14 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "libc", "r-efi 6.0.0", "rand_core 0.10.1", - "wasip2", - "wasip3", ] [[package]] @@ -1876,7 +1990,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.14.1", "slab", "tokio", "tokio-util", @@ -1885,23 +1999,29 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.14" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.4.1", - "indexmap", + "http 1.5.0", + "indexmap 2.14.1", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.13.2" @@ -1973,9 +2093,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be7462df143984c4598a256ef469b251d7d7f9e271135073e78fc535414f3d0" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" dependencies = [ "bytes", "itoa", @@ -1983,23 +2103,23 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" dependencies = [ "bytes", - "http 1.4.1", + "http 1.5.0", ] [[package]] name = "http-body-util" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" dependencies = [ "bytes", "futures-core", - "http 1.4.1", + "http 1.5.0", "http-body", "pin-project-lite", ] @@ -2018,25 +2138,25 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" +checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" dependencies = [ "typenum", ] [[package]] name = "hyper" -version = "1.10.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" dependencies = [ "atomic-waker", "bytes", "futures-channel", "futures-core", - "h2 0.4.14", - "http 1.4.1", + "h2 0.4.19", + "http 1.5.0", "http-body", "httparse", "itoa", @@ -2052,7 +2172,7 @@ version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ - "http 1.4.1", + "http 1.5.0", "hyper", "hyper-util", "rustls", @@ -2087,14 +2207,14 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.4.1", + "http 1.5.0", "http-body", "hyper", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.4", + "socket2 0.6.5", "system-configuration", "tokio", "tower-service", @@ -2102,11 +2222,35 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" dependencies = [ "displaydoc", "potential_utf", @@ -2118,9 +2262,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", @@ -2131,9 +2275,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -2145,16 +2289,17 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" [[package]] name = "icu_properties" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" dependencies = [ + "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", @@ -2165,15 +2310,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" [[package]] name = "icu_provider" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" dependencies = [ "displaydoc", "icu_locale_core", @@ -2184,12 +2329,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "idna" version = "1.1.0" @@ -2234,14 +2373,25 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "indexmap" -version = "2.14.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -2251,20 +2401,20 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.12" +version = "0.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d09b98f7eace8982db770e4408e7470b028ce513ac28fecdc6bf4c30fe92b62" +checksum = "d64d8ca234d152948ceaede1f419b6a83983a5ecccaac05fb337a809c96d3aa6" dependencies = [ - "bitflags", + "bitflags 2.13.1", "cfg-if", "libc", ] [[package]] name = "ipnet" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" [[package]] name = "is_terminal_polyfill" @@ -2299,31 +2449,92 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "jiff" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668b7183bd07af9a4885f5c35b0cc5c83c4607a913c16b7e17291832910d2dcc" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7feca88439efe53da3754500c1851dedf3cb36c524dd5cf8225cc0794de95d09" +dependencies = [ + "defmt", +] + +[[package]] +name = "jiff-static" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a69dcb3a21cfb32ce1cd056169337ca284af0766dd766e7878819b251a49204" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.3", "libc", ] [[package]] name = "js-sys" -version = "0.3.99" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11" +checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" dependencies = [ "cfg-if", "futures-util", - "once_cell", "wasm-bindgen", ] @@ -2351,19 +2562,19 @@ dependencies = [ [[package]] name = "keccak" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" +checksum = "d8f198d1db720e4940b5a493201d199d9f24f568f8f746bd13706243a2f71598" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", ] [[package]] name = "keccak-asm" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1766b89733097006f3a1388a02849865d6bc98c89273cb622e29fdd209922183" +checksum = "dd5dc2c0d691cbf7595cde551ced329cca99c2387c2cbc97754c5d0cd045d3ee" dependencies = [ "digest 0.10.7", "sha3-asm", @@ -2399,17 +2610,11 @@ dependencies = [ "hashbrown 0.15.5", ] -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" -version = "0.2.186" +version = "0.2.189" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libm" @@ -2425,7 +2630,7 @@ checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ "ark-bn254 0.4.0", "ark-ff 0.4.2", - "num-bigint", + "num-bigint 0.4.8", "thiserror 1.0.69", ] @@ -2437,9 +2642,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" [[package]] name = "local-channel" @@ -2469,9 +2674,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.30" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" [[package]] name = "macro-string" @@ -2481,14 +2686,14 @@ checksum = "59a9dbbfc75d2688ed057456ce8a3ee3f48d12eec09229f560f3643b9f275653" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "matrixmultiply" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +checksum = "3f607c237553f086e7043417a51df26b2eb899d3caff94e6a67592ff992fedc7" dependencies = [ "autocfg", "rawpointer", @@ -2496,9 +2701,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" [[package]] name = "mime" @@ -2511,6 +2716,15 @@ name = "miniz_oxide" version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" dependencies = [ "adler2", "simd-adler32", @@ -2518,9 +2732,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.1" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -2573,7 +2787,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-complex", "num-integer", "num-iter", @@ -2583,13 +2797,24 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" dependencies = [ "num-integer", "num-traits", - "rand 0.8.6", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" +dependencies = [ + "num-integer", + "num-traits", + "rand 0.9.4", + "rand_core 0.9.5", "serde", ] @@ -2604,7 +2829,7 @@ dependencies = [ "num-iter", "num-traits", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "serde", "smallvec", ] @@ -2627,20 +2852,19 @@ checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" -version = "0.1.46" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" dependencies = [ "num-traits", ] [[package]] name = "num-iter" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -2651,7 +2875,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", ] @@ -2689,11 +2913,11 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.80" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a45fa2aa886c42762255da344f0a0d313e254066c46aad76f300c3d3da62d967" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags", + "bitflags 2.13.1", "cfg-if", "foreign-types", "libc", @@ -2709,7 +2933,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2720,9 +2944,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.116" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28a22dc7140cda5f096e5e7724a6962ca81a7f8bfd2979f9b18c11af56318c4" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -2755,7 +2979,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2795,9 +3019,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.6" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" dependencies = [ "memchr", "ucd-trie", @@ -2811,7 +3035,7 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", "hashbrown 0.15.5", - "indexmap", + "indexmap 2.14.1", ] [[package]] @@ -2832,15 +3056,15 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.33" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" [[package]] name = "portable-atomic" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" @@ -2853,9 +3077,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ "zerovec", ] @@ -2882,7 +3106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -2893,7 +3117,7 @@ checksum = "bb24cb4f70d64221509ab3dca82ad2ec24e1d7f3fa3e7cb9eed4ced578683287" dependencies = [ "itertools 0.10.5", "num", - "rand 0.8.6", + "rand 0.8.8", ] [[package]] @@ -2913,36 +3137,36 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.12+spec-1.1.0", + "toml_edit 0.25.13+spec-1.1.0", ] [[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" +name = "proc-macro-error-attr3" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +checksum = "82366fd7d8b7a440d66d13418820c69df9b3908bcb1a0476d7f5ce5d12f5a04d" dependencies = [ "proc-macro2", "quote", ] [[package]] -name = "proc-macro-error2" -version = "2.0.1" +name = "proc-macro-error3" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +checksum = "b511283ea8a74b4b39447b128c5d00f03a356b7424554b13e298a5550100d9ac" dependencies = [ - "proc-macro-error-attr2", + "proc-macro-error-attr3", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "proc-macro2" -version = "1.0.106" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" dependencies = [ "unicode-ident", ] @@ -2955,9 +3179,9 @@ checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set", "bit-vec", - "bitflags", + "bitflags 2.13.1", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -2968,9 +3192,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ "bytes", "prost-derive", @@ -2978,9 +3202,9 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", "itertools 0.14.0", @@ -2991,37 +3215,37 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.117", + "syn 2.0.119", "tempfile", ] [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "prost-types" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" dependencies = [ "prost", ] [[package]] name = "pulp" -version = "0.22.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e205bb30d5b916c55e584c22201771bcf2bad9aabd5d4127f38387140c38632" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" dependencies = [ "bytemuck", "cfg-if", @@ -3036,9 +3260,9 @@ dependencies = [ [[package]] name = "pulp-wasm-simd-flag" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40e24eee682d89fb193496edf918a7f407d30175b2e785fe057e4392dfd182e0" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" [[package]] name = "quick-error" @@ -3048,9 +3272,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.45" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" dependencies = [ "proc-macro2", ] @@ -3075,9 +3299,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -3086,9 +3310,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -3097,12 +3321,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" dependencies = [ "chacha20", - "getrandom 0.4.2", + "getrandom 0.4.3", "rand_core 0.10.1", ] @@ -3158,7 +3382,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] @@ -3176,7 +3400,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags", + "bitflags 2.13.1", ] [[package]] @@ -3217,14 +3441,34 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags", + "bitflags 2.13.1", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" dependencies = [ "aho-corasick", "memchr", @@ -3234,9 +3478,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.14" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" dependencies = [ "aho-corasick", "memchr", @@ -3251,9 +3495,9 @@ checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -3265,8 +3509,8 @@ dependencies = [ "bytes", "encoding_rs", "futures-core", - "h2 0.4.14", - "http 1.4.1", + "h2 0.4.19", + "http 1.5.0", "http-body", "http-body-util", "hyper", @@ -3331,25 +3575,26 @@ dependencies = [ [[package]] name = "ruint" -version = "1.18.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0298da754d1395046b0afdc2f20ee76d29a8ae310cd30ffa84ed42acba9cb12a" +checksum = "f5e99bff0393163bb25029a6af25d3d8d202ba5b5438a74d1bd8789f5c822970" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", "ark-ff 0.4.2", "ark-ff 0.5.0", + "ark-ff 0.6.0", "bytes", "fastrlp 0.3.1", "fastrlp 0.4.0", - "num-bigint", + "num-bigint 0.4.8", "num-integer", "num-traits", "parity-scale-codec", "primitive-types", "proptest", - "rand 0.8.6", - "rand 0.9.2", + "rand 0.8.8", + "rand 0.9.4", "rlp", "ruint-macro", "serde_core", @@ -3365,15 +3610,15 @@ checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" [[package]] name = "rustc-demangle" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" +checksum = "b74b56ffa8bb2830709a538c2cbcae9aa062db0d2a42563bfb09bdaae44020eb" [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc-hex" @@ -3405,7 +3650,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags", + "bitflags 2.13.1", "errno", "libc", "linux-raw-sys", @@ -3414,9 +3659,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.40" +version = "0.23.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" dependencies = [ "once_cell", "rustls-pki-types", @@ -3427,18 +3672,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" dependencies = [ "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.13" +version = "0.103.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" dependencies = [ "ring", "rustls-pki-types", @@ -3447,9 +3692,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "rusty-fork" @@ -3478,6 +3723,30 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -3504,7 +3773,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags", + "bitflags 2.13.1", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -3572,7 +3841,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3609,6 +3878,26 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee78f1fbe43ac4a0e47aadb3dbd357b69eb0d3793e948624cd03dd2750ab1c0a" +dependencies = [ + "base64", + "bs58", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.14.1", + "jiff", + "schemars 0.9.0", + "schemars 1.2.2", + "serde_core", + "serde_json", + "time", +] + [[package]] name = "sha1" version = "0.11.0" @@ -3616,7 +3905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.3.0", + "cpufeatures 0.3.1", "digest 0.11.3", ] @@ -3648,14 +3937,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be176f1a57ce4e3d31c1a166222d9768de5954f811601fb7ca06fc8203905ce1" dependencies = [ "digest 0.11.3", - "keccak 0.2.0", + "keccak 0.2.2", ] [[package]] name = "sha3-asm" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3f15d4e239ebe08413eed880e0f9b5af4b40ee0472543320efa91d488e96a7" +checksum = "a6287fd675f713484342a89cbf0a386abef5f15919cfad607e5e1f19e1e15331" dependencies = [ "cc", "cfg-if", @@ -3689,9 +3978,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" [[package]] name = "slab" @@ -3701,9 +3990,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "socket2" @@ -3717,9 +4006,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", "windows-sys 0.61.2", @@ -3772,9 +4061,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "2.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" dependencies = [ "proc-macro2", "quote", @@ -3783,14 +4083,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.6.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec005042c7d952febc1a3ef5b0f6674e9054aa836877a31c90b20e25b3d31744" +checksum = "4c6415502cd1e9ed58b3ceb415164b812d5572757b1a6f0e280ae806723c1fab" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3810,7 +4110,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -3819,7 +4119,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags", + "bitflags 2.13.1", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3843,7 +4143,7 @@ dependencies = [ "ark-bn254 0.5.0", "ark-ff 0.5.0", "ark-std 0.5.0", - "num-bigint", + "num-bigint 0.4.8", "num-traits", ] @@ -3860,23 +4160,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.4.3", "once_cell", "rustix", "windows-sys 0.61.2", ] -[[package]] -name = "tfhe-ntt" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10650c743ade46b166c698c8349902ed5986784a7db418c51f810bea25f09e3d" -dependencies = [ - "aligned-vec", - "bytemuck", - "pulp", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -3888,11 +4177,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" dependencies = [ - "thiserror-impl 2.0.18", + "thiserror-impl 2.0.20", ] [[package]] @@ -3903,28 +4192,27 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "thiserror-impl" -version = "2.0.18" +version = "2.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] name = "time" -version = "0.3.47" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde_core", @@ -3934,15 +4222,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85" dependencies = [ "num-conv", "time-core", @@ -3959,14 +4247,29 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cf0ded5c4e56918d8f8a339e1bb67d038d3bc6d144ac407904015ba2e4cde9b" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.46.1" @@ -3995,7 +4298,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4010,9 +4313,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.4" +version = "0.26.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" dependencies = [ "rustls", "tokio", @@ -4067,7 +4370,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap", + "indexmap 2.14.1", "serde", "serde_spanned", "toml_datetime 0.6.11", @@ -4077,23 +4380,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.12+spec-1.1.0" +version = "0.25.13+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" +checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b" dependencies = [ - "indexmap", + "indexmap 2.14.1", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] name = "toml_parser" -version = "1.1.2+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" dependencies = [ - "winnow 1.0.3", + "winnow 1.0.4", ] [[package]] @@ -4123,10 +4426,10 @@ version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags", + "bitflags 2.13.1", "bytes", "futures-util", - "http 1.4.1", + "http 1.5.0", "http-body", "pin-project-lite", "tower", @@ -4167,7 +4470,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4223,9 +4526,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-xid" @@ -4307,27 +4610,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" -dependencies = [ - "wit-bindgen 0.57.1", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.122" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409" +checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" dependencies = [ "cfg-if", "once_cell", @@ -4338,9 +4632,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.72" +version = "0.4.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f" +checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" dependencies = [ "js-sys", "wasm-bindgen", @@ -4348,9 +4642,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.122" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6" +checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4358,68 +4652,69 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.122" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e" +checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.122" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437" +checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" dependencies = [ "unicode-ident", ] [[package]] -name = "wasm-encoder" -version = "0.244.0" +name = "web-sys" +version = "0.3.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" dependencies = [ - "leb128fmt", - "wasmparser", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "wasm-metadata" -version = "0.244.0" +name = "windows-core" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "anyhow", - "indexmap", - "wasm-encoder", - "wasmparser", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] -name = "wasmparser" -version = "0.244.0" +name = "windows-implement" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap", - "semver 1.0.28", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] -name = "web-sys" -version = "0.3.99" +name = "windows-interface" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ - "js-sys", - "wasm-bindgen", + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -4550,112 +4845,24 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - [[package]] name = "wit-bindgen" version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck", - "indexmap", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] - -[[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags", - "indexmap", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" -dependencies = [ - "anyhow", - "id-arena", - "indexmap", - "log", - "semver 1.0.28", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", -] - [[package]] name = "writeable" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" [[package]] name = "wyz" @@ -4668,9 +4875,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -4685,28 +4892,28 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.50" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b065d4f0e55f82fae73202e189638116a87c55ab6b8e6c2721e13dd9d854ad1" +checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.50" +version = "0.8.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b631b19d36a892ab55420c92dbc83ccd79274f25be714855d3074aa71cab639" +checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] @@ -4726,35 +4933,35 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.119", ] [[package]] name = "zerotrie" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" dependencies = [ "displaydoc", "yoke", @@ -4763,9 +4970,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ "yoke", "zerofrom", @@ -4774,13 +4981,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.3" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.4", ] [[package]] @@ -4793,6 +5000,12 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "zlib-rs" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b31d188d9d685a4f9c7b46d6e36631b07058d2cfe190267adce54dc230bf12" + [[package]] name = "zstd" version = "0.13.3" From 6fb50c94a65af777cfdd1034f7a04ad45cc28fdb Mon Sep 17 00:00:00 2001 From: 0xjei Date: Fri, 4 Sep 2026 15:59:41 +0200 Subject: [PATCH 8/9] fix: use generic bignum for secure C7 --- .../src/core/threshold/decrypted_shares_aggregation.nr | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/circuits/lib/src/core/threshold/decrypted_shares_aggregation.nr b/circuits/lib/src/core/threshold/decrypted_shares_aggregation.nr index 5c420523b5..912c8b0755 100644 --- a/circuits/lib/src/core/threshold/decrypted_shares_aggregation.nr +++ b/circuits/lib/src/core/threshold/decrypted_shares_aggregation.nr @@ -9,7 +9,7 @@ use crate::math::modulo::U64::ModU64; use crate::math::polynomial::Polynomial; use ::bignum::BigNum; use ::bignum::bignum::to_field; -use ::bignum::SecureThreshold8192; +use ::bignum::U256; /// Parameters for decrypted shares aggregation (C7). pub struct Configs { @@ -120,14 +120,14 @@ impl Date: Fri, 4 Sep 2026 23:13:15 +0200 Subject: [PATCH 9/9] feat: support secure-16384 on testnet --- .github/workflows/ci.yml | 3 + agent/CONTEXT.md | 6 +- agent/INVARIANTS.md | 11 +- .../flow-trace/03_E3_REQUEST_AND_COMMITTEE.md | 2 +- crates/evm-helpers/src/contracts.rs | 1 + crates/evm/src/interfold/events.rs | 40 +- crates/fhe-params/src/presets.rs | 6 +- crates/fhe-params/src/search/bfv.rs | 4 +- examples/CRISP/RELEASING.md | 16 +- examples/CRISP/client/src/utils/circuits.ts | 6 +- examples/CRISP/client/vite.config.ts | 1 + examples/CRISP/crates/zk-inputs/src/lib.rs | 1 + .../CRISP/docs/PROOF_AGGREGATION_AND_ZK.md | 6 +- examples/CRISP/packages/crisp-sdk/README.md | 6 +- .../CRISP/packages/crisp-sdk/package.json | 7 +- .../CRISP/packages/crisp-sdk/src/circuits.ts | 11 +- .../crisp-sdk/src/presets/secure-16384.ts | 26 + .../src/presets/secure-16384.unavailable.ts | 16 + .../CRISP/packages/crisp-sdk/tsup.config.js | 2 +- examples/CRISP/scripts/build-presets.mjs | 4 +- examples/CRISP/scripts/check-presets.mjs | 7 +- .../CRISP/scripts/check-staged-preset.mjs | 4 +- examples/CRISP/scripts/compile_circuits.sh | 2 +- examples/CRISP/scripts/lib/dev_config.sh | 5 +- examples/CRISP/scripts/publish.ts | 14 +- .../CRISP/scripts/stage-preset-artifacts.mjs | 2 +- examples/CRISP/server/src/config.rs | 11 +- .../contracts/lib/ActiveCryptoConfig.sol | 19 +- .../small/DecryptionAggregatorVerifier.sol | 110 +- .../insecure/small/DkgAggregatorVerifier.sol | 110 +- .../micro/DecryptionAggregatorVerifier.sol | 3262 +++++++++++++++++ .../micro/DkgAggregatorVerifier.sol | 3262 +++++++++++++++++ .../minimum/DecryptionAggregatorVerifier.sol | 3262 +++++++++++++++++ .../minimum/DkgAggregatorVerifier.sol | 3262 +++++++++++++++++ .../small/DecryptionAggregatorVerifier.sol | 3262 +++++++++++++++++ .../small/DkgAggregatorVerifier.sol | 3262 +++++++++++++++++ .../scripts/protocol/tx/interfold.ts | 4 +- packages/interfold-contracts/scripts/utils.ts | 47 +- .../interfold-contracts/tasks/interfold.ts | 3 + .../test/Interfold.spec.ts | 8 +- .../test/fixtures/constants.ts | 3 + packages/interfold-sdk/src/utils.ts | 3 + scripts/build-circuits.ts | 120 +- scripts/check-committee.sh | 15 +- scripts/circuit-constants.ts | 7 +- scripts/generate-circuit-configs.sh | 72 +- 46 files changed, 20051 insertions(+), 262 deletions(-) create mode 100644 examples/CRISP/packages/crisp-sdk/src/presets/secure-16384.ts create mode 100644 examples/CRISP/packages/crisp-sdk/src/presets/secure-16384.unavailable.ts create mode 100644 packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/micro/DecryptionAggregatorVerifier.sol create mode 100644 packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/micro/DkgAggregatorVerifier.sol create mode 100644 packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/minimum/DecryptionAggregatorVerifier.sol create mode 100644 packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/minimum/DkgAggregatorVerifier.sol create mode 100644 packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/small/DecryptionAggregatorVerifier.sol create mode 100644 packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/small/DkgAggregatorVerifier.sol diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b003c21ec2..d1d5ee9f4f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1077,6 +1077,9 @@ jobs: secure-8192 minimum secure-8192 micro secure-8192 small + secure-16384 minimum + secure-16384 micro + secure-16384 small insecure minimum EOF diff --git a/agent/CONTEXT.md b/agent/CONTEXT.md index dc641776f6..25105977cb 100644 --- a/agent/CONTEXT.md +++ b/agent/CONTEXT.md @@ -76,10 +76,8 @@ The protocol release can carry more than one circuit artifact set. Current deplo matrix: - Ethereum mainnet supports `secure-8192/minimum`, `secure-8192/micro`, and `secure-8192/small`. -- Sepolia and local chains support `insecure` and `secure-8192` with `minimum`, `micro`, and - `small` committees. -- `secure-16384` is available for circuit generation but is not enabled in the current chain - deployment matrix. +- Sepolia and local chains support `insecure`, `secure-8192`, and `secure-16384` with `minimum`, + `micro`, and `small` committees. `ActiveCryptoConfig.sol` selects the parameter sets and committee shapes supported by `block.chainid`. Deployment tooling mirrors that matrix with `bfvConfigsForChain(chainId)` and reads diff --git a/agent/INVARIANTS.md b/agent/INVARIANTS.md index 526ef63835..13946bc566 100644 --- a/agent/INVARIANTS.md +++ b/agent/INVARIANTS.md @@ -192,7 +192,8 @@ design citation alone does not establish current runtime behavior. must preserve the complete `uint256`. — `Interfold.initialize`; `flow-trace/03` - A request can select only the parameter set and committee shape in `ActiveCryptoConfig.sol`. Mainnet supports `secure-8192` with `minimum`, `micro`, and `small` committees. Sepolia and local - chains support `insecure` and `secure-8192` with `minimum`, `micro`, and `small` committees. + chains support `insecure`, `secure-8192`, and `secure-16384` with `minimum`, `micro`, and `small` + committees. Governance cannot enable a different parameter hash, `[H, N]`, or verifier threshold without rebuilding the circuits and contracts for that pair. The request supplies the expected configuration ID, which binds the scheme, parameter hash, and circuit version; committee size is @@ -375,10 +376,10 @@ design citation alone does not establish current runtime behavior. release workflow rejects a different value because the ciphernode resolves both the GitHub release and `circuits-{version}.tar.gz` from this field. - A circuit release archive that supports current deployments must include every - `insecure/{minimum,micro,small}` and `secure-8192/{minimum,micro,small}` pair. Each pair has a - build stamp with the exact preset, committee, and source hash. `checksums.json` and `SHA256SUMS` - must cover the archive contents. Nodes select the artifact directory from the E3's on-chain - parameter set and committee size. + `insecure/{minimum,micro,small}`, `secure-8192/{minimum,micro,small}`, and + `secure-16384/{minimum,micro,small}` pair. Each pair has a build stamp with the exact preset, + committee, and source hash. `checksums.json` and `SHA256SUMS` must cover the archive contents. + Nodes select the artifact directory from the E3's on-chain parameter set and committee size. ### DKG / threshold structure diff --git a/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md b/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md index 9179544267..5e46a84ffe 100644 --- a/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md +++ b/agent/flow-trace/03_E3_REQUEST_AND_COMMITTEE.md @@ -75,7 +75,7 @@ Requester calls: Interfold.request({ │ ├─ Validate the requested crypto configuration against the chain matrix. │ │ The caller selects (paramSet, committeeSize); the target chain must support that pair. │ │ Mainnet supports secure-8192 with minimum, micro, and small committees. -│ │ Sepolia and local chains support insecure and secure-8192 with all committee sizes. +│ │ Sepolia and local chains support insecure, secure-8192, and secure-16384 with all committee sizes. │ │ A different parameter hash, committee shape, or verifier H/T is rejected. │ │ CI derives and compares the full BFV tuple across deployment code, Rust, and Noir. │ ├─ inputWindow[0] >= block.timestamp (start in future) diff --git a/crates/evm-helpers/src/contracts.rs b/crates/evm-helpers/src/contracts.rs index 0548ff32fd..618fe5b501 100644 --- a/crates/evm-helpers/src/contracts.rs +++ b/crates/evm-helpers/src/contracts.rs @@ -32,6 +32,7 @@ fn crypto_config_id_for_param_set(param_set: u8) -> Result { match param_set { 0 => Ok("0x04f3677e73b0f5066d6caf5cbd92e3fb2e38338edaf5cfc971ab28f7b684da78".parse()?), 1 => Ok("0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb".parse()?), + 2 => Ok("0x81f3edb4c49db1c2baf578d6ade4aea6839ee6a71d7458c1bfc79670d2ece7cd".parse()?), _ => Err(eyre::eyre!("unsupported BFV parameter set: {}", param_set)), } } diff --git a/crates/evm/src/interfold/events.rs b/crates/evm/src/interfold/events.rs index b80d283133..7d564a2c5c 100644 --- a/crates/evm/src/interfold/events.rs +++ b/crates/evm/src/interfold/events.rs @@ -20,7 +20,6 @@ use e3_fhe_params::{encode_bfv_params, BfvParamSet, BfvPreset}; use e3_trbfv::helpers::calculate_error_size; use e3_utils::ArcBytes; use e3_zk_helpers::CiphernodesCommitteeSize; -use num_bigint::BigUint; use tracing::{info, trace, warn}; struct E3RequestedWithChainId(pub IInterfold::E3Requested, pub u64); @@ -89,32 +88,25 @@ impl E3RequestedWithChainId { .map(|sd| sd.mult_depth) .ok_or_else(|| anyhow::anyhow!("Failed to get search defaults for preset"))?; - let error_size = match calculate_error_size( + let error_size = calculate_error_size( params_arc, threshold_n, threshold_m, mult_depth, lambda, - ) { - Ok(size) => { - let size_bytes = size.to_bytes_be(); - info!( - "Calculated error_size for E3 (threshold_n={}, threshold_m={}, lambda={}): {} bytes", - threshold_n, threshold_m, lambda_value, size_bytes.len() - ); - ArcBytes::from_bytes(&size_bytes) - } - Err(e) => { - warn!( - "Failed to calculate error_size, using fallback: {}. \ - This may cause decryption failures!", - e - ); - ArcBytes::from_bytes( - &BigUint::from(36128399948547143872891754381312u128).to_bytes_be(), - ) - } - }; + ) + .context("failed to calculate the E3 error size") + .map(|size| { + let size_bytes = size.to_bytes_be(); + info!( + "Calculated error_size for E3 (threshold_n={}, threshold_m={}, lambda={}): {} bytes", + threshold_n, + threshold_m, + lambda_value, + size_bytes.len() + ); + ArcBytes::from_bytes(&size_bytes) + })?; Ok(e3_events::E3Requested { params_preset, @@ -506,6 +498,10 @@ mod tests { 1, "0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb", ), + ( + 2, + "0x81f3edb4c49db1c2baf578d6ade4aea6839ee6a71d7458c1bfc79670d2ece7cd", + ), ]; for (param_set, expected_id) in expected { diff --git a/crates/fhe-params/src/presets.rs b/crates/fhe-params/src/presets.rs index fe81eb7ea2..998a96273f 100644 --- a/crates/fhe-params/src/presets.rs +++ b/crates/fhe-params/src/presets.rs @@ -70,16 +70,14 @@ pub enum BfvPreset { /// a standard BFV key-pair to encrypt secret shares. These are temporary keys used /// only during the key generation process. SecureDkg8192, - /// Secure threshold BFV parameters (degree 16384), available for generation but not enabled - /// in the current deployment matrix. + /// Secure threshold BFV parameters (degree 16384), enabled on Sepolia and local chains. /// /// Used for threshold encryption (GRECO) and threshold decryption operations with /// multiplicative depth up to 3 (l-BFV support; the regenerated constants satisfy /// the runtime `2*(B_C + n*B_sm) < Delta` correctness budget at depth 3). These /// parameters define the threshold public key that data providers use to encrypt inputs. SecureThreshold16384, - /// Secure DKG parameters (degree 16384), available for generation but not enabled in the - /// current deployment matrix. + /// Secure DKG parameters (degree 16384), enabled on Sepolia and local chains. /// /// Used during Phase 0-1 (BFV Key Setup and DKG) where each ciphernode generates /// a standard BFV key-pair to encrypt secret shares. These are temporary keys used diff --git a/crates/fhe-params/src/search/bfv.rs b/crates/fhe-params/src/search/bfv.rs index 2510a36537..5700d78705 100644 --- a/crates/fhe-params/src/search/bfv.rs +++ b/crates/fhe-params/src/search/bfv.rs @@ -581,7 +581,9 @@ pub fn finalize_second_param( let benc = BigUint::from(config.b); let term_d_bb_chi = BigUint::from(d) * BigUint::from(config.b) * BigUint::from(config.b_chi); let b_fresh = &benc + &term_d_bb_chi + &term_d_bb_chi; - let b_c = b_fresh.clone(); + // Include q mod t in the fresh-noise bound. The remainder is part of the + // centered-RNS scaling error and must not be discarded in the second set. + let b_c = &b_fresh + BigUint::from(rkq); // Correctness: 2·B_C < Δ. let lhs = &b_c << 1; diff --git a/examples/CRISP/RELEASING.md b/examples/CRISP/RELEASING.md index 0cea24e149..548cffd70d 100644 --- a/examples/CRISP/RELEASING.md +++ b/examples/CRISP/RELEASING.md @@ -5,7 +5,7 @@ | channel | tag | preset | who it is for | | ---------- | --------- | -------------- | ---------------------------------- | | testing | `testing` | `insecure` | testnets, demos, local development | -| production | `latest` | both presets | deployed clients and real rounds | +| production | `latest` | all supported presets | deployed clients and real rounds | ## Why presets are separate entry points @@ -14,7 +14,7 @@ from that same circuit's verification key. A verifier only accepts proofs from t generated for, so mixing presets across the two packages produces a round that rejects every ballot — and it fails at on-chain verification, not anywhere a test would catch it. -Each preset is a separate SDK subpath. The production package carries both subpaths so one client +Each preset is a separate SDK subpath. The production package carries all subpaths so one client can read the E3's on-chain `paramSet` and load the matching preset. The testing package carries only the real insecure preset so local and testnet installs stay small. It also ships tiny stubs for the other exported subpaths, so bundlers can resolve the client import graph without bundling secure @@ -24,10 +24,12 @@ circuits into test builds. // on @crisp-e3/sdk@testing import { loadCircuits } from '@crisp-e3/sdk/insecure' // resolves import { loadCircuits } from '@crisp-e3/sdk/secure-8192' // resolves, throws if called +import { loadCircuits } from '@crisp-e3/sdk/secure-16384' // resolves, throws if called // on @crisp-e3/sdk@latest import { loadCircuits as loadInsecure } from '@crisp-e3/sdk/insecure' import { loadCircuits as loadSecure } from '@crisp-e3/sdk/secure-8192' +import { loadCircuits as loadSecure16384 } from '@crisp-e3/sdk/secure-16384' ``` This keeps the secure circuits out of testing installs while making the production client flexible @@ -39,7 +41,7 @@ Testing releases carry a prerelease identifier; production releases do not. ```text 0.18.0-insecure.0 tag: testing insecure -0.20.0 tag: latest insecure + secure-8192 +0.20.0 tag: latest insecure + secure-8192 + secure-16384 ``` The identifier is load-bearing. npm excludes prerelease versions from ordinary ranges, so a consumer @@ -49,7 +51,7 @@ on `^0.18.0` can never drift onto a testing build through an update — reaching ## The client tracks production `client/` reads the E3 `paramSet` before proving and loads the matching preset. Because production -SDK releases carry both presets, a production publish moves `client/package.json` and +SDK releases carry all supported presets, a production publish moves `client/package.json` and `client/pnpm-lock.yaml` to the published version. A testing publish leaves the client alone. The pin cannot be a `workspace:` range, because the same `client/package.json` also serves the @@ -86,14 +88,14 @@ that `stage-preset-artifacts.mjs` records at staging time. The default SDK build is intentionally the lightweight testing build. It builds and ships only the real `insecure` bundle, plus resolver stubs for off-channel presets, so pull-request CI does not compile or bundle the large secure preset. Use the production channel, or -`pnpm -C examples/CRISP/packages/crisp-sdk build:prod`, when the output must include real -`insecure` and `secure-8192` bundles. + `pnpm -C examples/CRISP/packages/crisp-sdk build:prod`, when the output must include real + `insecure`, `secure-8192`, and `secure-16384` bundles. ```sh # testing — insecure under the `testing` tag, leaves the client alone pnpm -C examples/CRISP publish:packages --channel testing 0.19.0-insecure.0 -# production — both presets under the `latest` tag, and moves the client +# production — all supported presets under the `latest` tag, and moves the client pnpm -C examples/CRISP publish:packages --channel prod 0.20.0 ``` diff --git a/examples/CRISP/client/src/utils/circuits.ts b/examples/CRISP/client/src/utils/circuits.ts index 786128c8d7..c54b09ba49 100644 --- a/examples/CRISP/client/src/utils/circuits.ts +++ b/examples/CRISP/client/src/utils/circuits.ts @@ -11,11 +11,12 @@ import type { CircuitBundle, CircuitPreset } from '@crisp-e3/sdk' // through a dynamic import gives the bundler a split point, so the app boots on the ~350KB main // entry and only pays for the circuits when someone actually votes. // -// The production SDK carries both presets. The E3 stores the selected param set on chain, so the -// client selects the matching circuits before proving instead of hardcoding one deployment mode. +// The production SDK carries all supported presets. The E3 stores the selected param set on chain, +// so the client selects the matching circuits before proving instead of hardcoding one deployment mode. const LOADERS: Record Promise<{ loadCircuits: () => Promise }>> = { insecure: () => import('@crisp-e3/sdk/insecure'), 'secure-8192': () => import('@crisp-e3/sdk/secure-8192'), + 'secure-16384': () => import('@crisp-e3/sdk/secure-16384'), } let pending: Partial>> = {} @@ -23,6 +24,7 @@ let pending: Partial>> = {} const presetForParamSet = (paramSet: number): CircuitPreset | null => { if (paramSet === 0) return 'insecure' if (paramSet === 1) return 'secure-8192' + if (paramSet === 2) return 'secure-16384' return null } diff --git a/examples/CRISP/client/vite.config.ts b/examples/CRISP/client/vite.config.ts index 292726b039..bc36f5a173 100644 --- a/examples/CRISP/client/vite.config.ts +++ b/examples/CRISP/client/vite.config.ts @@ -37,6 +37,7 @@ export default defineConfig({ '@crisp-e3/sdk', '@crisp-e3/sdk/insecure', '@crisp-e3/sdk/secure-8192', + '@crisp-e3/sdk/secure-16384', ], }, resolve: { diff --git a/examples/CRISP/crates/zk-inputs/src/lib.rs b/examples/CRISP/crates/zk-inputs/src/lib.rs index 0139b247f9..93c3046932 100644 --- a/examples/CRISP/crates/zk-inputs/src/lib.rs +++ b/examples/CRISP/crates/zk-inputs/src/lib.rs @@ -92,6 +92,7 @@ impl ZKInputsGenerator { let preset = match name.trim() { "insecure" => BfvPreset::InsecureThreshold512, "secure-8192" => BfvPreset::SecureThreshold8192, + "secure-16384" => BfvPreset::SecureThreshold16384, other => BfvPreset::from_name(other)?, }; diff --git a/examples/CRISP/docs/PROOF_AGGREGATION_AND_ZK.md b/examples/CRISP/docs/PROOF_AGGREGATION_AND_ZK.md index 4b793e4ef6..50d799db5d 100644 --- a/examples/CRISP/docs/PROOF_AGGREGATION_AND_ZK.md +++ b/examples/CRISP/docs/PROOF_AGGREGATION_AND_ZK.md @@ -10,8 +10,8 @@ | `CRISP_SKIP_PROOF_AGGREGATION` | `true` | Enables the ciphernode-only local-dev/test skip flag | `pnpm dev:setup` copies the example if missing and builds recursive circuits only when the skip flag -is `false`. It also writes the matching `E3_PARAM_SET` into `server/.env`: `0` for `insecure` -and `1` for `secure-8192`. `pnpm dev:up` → `crisp_deploy.sh` deploys real verifiers for full +is `false`. It also writes the matching `E3_PARAM_SET` into `server/.env`: `0` for `insecure`, +`1` for `secure-8192`, and `2` for `secure-16384`. `pnpm dev:up` → `crisp_deploy.sh` deploys real verifiers for full aggregation and mock verifiers for skipped local-dev runs. After changing `crisp.dev.env`, re-run `pnpm dev:setup` and a fresh `pnpm dev:up` (wipe @@ -82,7 +82,7 @@ CRISP_SKIP_PROOF_AGGREGATION=false ``` CRISP `requestE3` reads `E3_PARAM_SET` from `server/.env`. Keep it aligned with `CRISP_BFV_PRESET`: -`0` for `insecure`, `1` for `secure-8192`. +`0` for `insecure`, `1` for `secure-8192`, and `2` for `secure-16384`. ### Steps diff --git a/examples/CRISP/packages/crisp-sdk/README.md b/examples/CRISP/packages/crisp-sdk/README.md index 550042dcdc..3aa443c596 100644 --- a/examples/CRISP/packages/crisp-sdk/README.md +++ b/examples/CRISP/packages/crisp-sdk/README.md @@ -21,12 +21,12 @@ npm install @crisp-e3/sdk ## Choosing a preset Proving needs the BFV-shaped circuits, and those exist once per parameter set. They are not part of -the main entry point: the `secure-8192` set is far larger than `insecure`. Each preset has its +the main entry point: the secure sets are far larger than `insecure`. Each preset has its own subpath, so your bundler can pull only the one the round needs. ```ts import { setCircuits } from '@crisp-e3/sdk' -import { loadCircuits } from '@crisp-e3/sdk/insecure' // or '@crisp-e3/sdk/secure-8192' +import { loadCircuits } from '@crisp-e3/sdk/insecure' // or '@crisp-e3/sdk/secure-8192' or '@crisp-e3/sdk/secure-16384' setCircuits(await loadCircuits()) ``` @@ -39,7 +39,7 @@ In a browser, load it through a dynamic `import()` so the circuits become their app boots without them: ```ts -const { loadCircuits } = await import('@crisp-e3/sdk/secure-8192') +const { loadCircuits } = await import('@crisp-e3/sdk/secure-16384') setCircuits(await loadCircuits()) ``` diff --git a/examples/CRISP/packages/crisp-sdk/package.json b/examples/CRISP/packages/crisp-sdk/package.json index 01412e0c67..16f2e5e1ba 100644 --- a/examples/CRISP/packages/crisp-sdk/package.json +++ b/examples/CRISP/packages/crisp-sdk/package.json @@ -26,6 +26,11 @@ "import": "./dist/presets/secure-8192.js", "default": "./dist/presets/secure-8192.js" }, + "./secure-16384": { + "types": "./dist/presets/secure-16384.d.ts", + "import": "./dist/presets/secure-16384.js", + "default": "./dist/presets/secure-16384.js" + }, "./workers/generateCircuitInputs.worker": "./dist/workers/generateCircuitInputs.worker.js" }, "main": "./dist/index.js", @@ -52,7 +57,7 @@ "check:presets": "node ../../scripts/check-presets.mjs", "prepublishOnly": "pnpm check:presets", "build:testing": "pnpm build:wasm && pnpm build:presets && pnpm check:staged insecure && CRISP_PRESET=insecure tsup", - "build:prod": "pnpm build:wasm && pnpm build:presets:all && pnpm check:staged insecure && pnpm check:staged secure-8192 && tsup", + "build:prod": "pnpm build:wasm && pnpm build:presets:all && pnpm check:staged insecure && pnpm check:staged secure-8192 && pnpm check:staged secure-16384 && tsup", "check:staged": "node ../../scripts/check-staged-preset.mjs" }, "publishConfig": { diff --git a/examples/CRISP/packages/crisp-sdk/src/circuits.ts b/examples/CRISP/packages/crisp-sdk/src/circuits.ts index 253ca4b34a..d8bf824801 100644 --- a/examples/CRISP/packages/crisp-sdk/src/circuits.ts +++ b/examples/CRISP/packages/crisp-sdk/src/circuits.ts @@ -7,14 +7,14 @@ import type { CompiledCircuit } from '@noir-lang/noir_js' /** BFV parameter sets the circuits can be compiled against. */ -export type CircuitPreset = 'insecure' | 'secure-8192' +export type CircuitPreset = 'insecure' | 'secure-8192' | 'secure-16384' /** * The circuits whose ABI is shaped by the BFV degree, and which therefore exist once per preset. * * The aggregation circuits — `crisp_fold`, `crisp_onchain_fold` and `user_data_encryption` — are * deliberately absent. Their parameters are proof and verification-key shaped (410/115 fields), not - * polynomial shaped, so one compiled artifact serves both presets; the fold circuits assert + * polynomial shaped, so one compiled artifact serves all presets; the fold circuits assert * `chain_key_hash` against the insecure *or* the secure constant for exactly that reason. They ship * in the main entry point, which is why `verifyProof` works without a preset loaded. */ @@ -31,7 +31,7 @@ let registered: CircuitBundle | null = null /** * Install the preset-bound circuits used by `generateProof`. * - * The bundle is not bundled into the main entry point, because the secure-8192 artifacts are more + * The bundle is not bundled into the main entry point, because the secure artifacts are more * than an order of magnitude larger than the insecure ones. Load the preset selected by the * round from its subpath and register it before proving: * @@ -62,8 +62,9 @@ export const registeredPreset = (): CircuitPreset | null => registered?.preset ? export const requireCircuits = (): CircuitBundle => { if (!registered) { throw new Error( - 'No circuit preset registered. Import `loadCircuits` from "@crisp-e3/sdk/insecure" or ' + - '"@crisp-e3/sdk/secure-8192" and pass the result to `setCircuits()` before proving.', + 'No circuit preset registered. Import `loadCircuits` from "@crisp-e3/sdk/insecure", ' + + '"@crisp-e3/sdk/secure-8192", or "@crisp-e3/sdk/secure-16384" and pass the result ' + + 'to `setCircuits()` before proving.', ) } diff --git a/examples/CRISP/packages/crisp-sdk/src/presets/secure-16384.ts b/examples/CRISP/packages/crisp-sdk/src/presets/secure-16384.ts new file mode 100644 index 0000000000..8767264c95 --- /dev/null +++ b/examples/CRISP/packages/crisp-sdk/src/presets/secure-16384.ts @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +// The secure-16384 preset-bound circuits, published as a separate entry point. + +import type { CircuitBundle, CircuitPreset } from '../circuits' +import type { CompiledCircuit } from '@noir-lang/noir_js' + +import crisp from '../../../../circuits/dist/secure-16384/crisp.json' +import crispOnchain from '../../../../circuits/dist/secure-16384/crisp_onchain.json' +import userDataEncryptionCt0 from '../../../../circuits/dist/secure-16384/user_data_encryption_ct0.json' +import userDataEncryptionCt1 from '../../../../circuits/dist/secure-16384/user_data_encryption_ct1.json' + +export const preset: CircuitPreset = 'secure-16384' + +/** The secure-16384 circuits, ready for `setCircuits()`. */ +export const loadCircuits = async (): Promise => ({ + preset, + crisp: crisp as CompiledCircuit, + crispOnchain: crispOnchain as CompiledCircuit, + userDataEncryptionCt0: userDataEncryptionCt0 as CompiledCircuit, + userDataEncryptionCt1: userDataEncryptionCt1 as CompiledCircuit, +}) diff --git a/examples/CRISP/packages/crisp-sdk/src/presets/secure-16384.unavailable.ts b/examples/CRISP/packages/crisp-sdk/src/presets/secure-16384.unavailable.ts new file mode 100644 index 0000000000..681d383efe --- /dev/null +++ b/examples/CRISP/packages/crisp-sdk/src/presets/secure-16384.unavailable.ts @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. + +import type { CircuitBundle, CircuitPreset } from '../circuits' + +export const preset: CircuitPreset = 'secure-16384' + +export const loadCircuits = async (): Promise => { + throw new Error( + 'The secure-16384 circuits are not included in this @crisp-e3/sdk build. ' + + 'Install the production @crisp-e3/sdk release from the latest npm tag.', + ) +} diff --git a/examples/CRISP/packages/crisp-sdk/tsup.config.js b/examples/CRISP/packages/crisp-sdk/tsup.config.js index 52c6e0f711..cb816fd2e1 100644 --- a/examples/CRISP/packages/crisp-sdk/tsup.config.js +++ b/examples/CRISP/packages/crisp-sdk/tsup.config.js @@ -18,7 +18,7 @@ import { defineConfig } from 'tsup' // // With `CRISP_PRESET` unset the build takes whatever is staged, which is what local development // wants. -const PRESETS = ['insecure', 'secure-8192'] +const PRESETS = ['insecure', 'secure-8192', 'secure-16384'] const staged = (preset) => existsSync(`../../circuits/dist/${preset}/crisp.json`) diff --git a/examples/CRISP/scripts/build-presets.mjs b/examples/CRISP/scripts/build-presets.mjs index e8233b075e..6ccff5cfba 100755 --- a/examples/CRISP/scripts/build-presets.mjs +++ b/examples/CRISP/scripts/build-presets.mjs @@ -21,10 +21,10 @@ import { fileURLToPath } from 'node:url' const CRISP = resolve(dirname(fileURLToPath(import.meta.url)), '..') const REPO = resolve(CRISP, '..', '..') -const ALL_PRESETS = ['secure-8192', 'insecure'] +const ALL_PRESETS = ['secure-8192', 'secure-16384', 'insecure'] const usage = () => { - console.error('Usage: build-presets.mjs [--preset insecure|secure-8192] [--all]') + console.error('Usage: build-presets.mjs [--preset insecure|secure-8192|secure-16384] [--all]') console.error('Defaults to --preset insecure for pull-request CI and local development.') } diff --git a/examples/CRISP/scripts/check-presets.mjs b/examples/CRISP/scripts/check-presets.mjs index 865f529669..4d059c99c0 100644 --- a/examples/CRISP/scripts/check-presets.mjs +++ b/examples/CRISP/scripts/check-presets.mjs @@ -8,7 +8,8 @@ // Refuse to publish a channel whose artifacts do not match the presets that channel stands for. // // The testing channel carries only insecure so testnet installs stay small. The production -// channel carries both presets so one client can select the preset from the E3's on-chain param set. +// channel carries every supported preset so one client can select the preset from the E3's +// on-chain param set. // // The SDK and the contracts package are checked together because they are a matched pair. The SDK // inlines the compiled circuit and the contracts package ships the verifier generated from that @@ -26,7 +27,7 @@ const CONTRACTS = join(CRISP, 'packages', 'crisp-contracts') /** Which presets each release channel carries. */ const CHANNEL_PRESETS = { testing: ['insecure'], - latest: ['insecure', 'secure-8192'], + latest: ['insecure', 'secure-8192', 'secure-16384'], } const ALL_PRESETS = [...new Set(Object.values(CHANNEL_PRESETS).flat())] @@ -35,7 +36,7 @@ const ALL_PRESETS = [...new Set(Object.values(CHANNEL_PRESETS).flat())] const VERIFIERS = ['CRISPVerifier.sol', 'CRISPOnchainVerifier.sol'] /** Polynomial degree each preset's circuits carry, used to prove the bundle is what it claims. */ -const EXPECTED_DEGREE = { insecure: 512, 'secure-8192': 8192 } +const EXPECTED_DEGREE = { insecure: 512, 'secure-8192': 8192, 'secure-16384': 16384 } /** Below this a "built" entry is a stub or a failed inline rather than a real circuit bundle. */ const MIN_BYTES = 100 * 1024 diff --git a/examples/CRISP/scripts/check-staged-preset.mjs b/examples/CRISP/scripts/check-staged-preset.mjs index eeb0c9160a..91e5d83665 100755 --- a/examples/CRISP/scripts/check-staged-preset.mjs +++ b/examples/CRISP/scripts/check-staged-preset.mjs @@ -22,9 +22,9 @@ import { fileURLToPath } from 'node:url' import { circuitSourcesDigest } from './circuit-sources.mjs' const CRISP = resolve(dirname(fileURLToPath(import.meta.url)), '..') -const PRESETS = ['insecure', 'secure-8192'] +const PRESETS = ['insecure', 'secure-8192', 'secure-16384'] -const RESTAGE = 'Run `pnpm build:presets` for one preset, or `pnpm build:presets:all` for both presets, from examples/CRISP.' +const RESTAGE = 'Run `pnpm build:presets` for one preset, or `pnpm build:presets:all` for all presets, from examples/CRISP.' const fail = (...lines) => { for (const line of lines) console.error(line) diff --git a/examples/CRISP/scripts/compile_circuits.sh b/examples/CRISP/scripts/compile_circuits.sh index 7abc6955a5..d3894d9ed2 100755 --- a/examples/CRISP/scripts/compile_circuits.sh +++ b/examples/CRISP/scripts/compile_circuits.sh @@ -8,7 +8,7 @@ CRISP_CIRCUITS="circuits" # The generated verifiers are NOT preset-specific. They are written from the fold circuit's # verification key, and the fold circuit takes the inner key as an input and checks its hash against -# either preset's constant, so its own structure carries no BFV degree. Compiling both presets +# either preset's constant, so its own structure carries no BFV degree. Compiling the supported presets # produces byte-identical verifiers; one directory is correct. VERIFIER_DIR="packages/crisp-contracts/contracts/verifiers" mkdir -p "$VERIFIER_DIR" diff --git a/examples/CRISP/scripts/lib/dev_config.sh b/examples/CRISP/scripts/lib/dev_config.sh index a2320bba5f..70ddf280bc 100644 --- a/examples/CRISP/scripts/lib/dev_config.sh +++ b/examples/CRISP/scripts/lib/dev_config.sh @@ -30,8 +30,11 @@ load_crisp_dev_config() { secure-8192) CRISP_E3_PARAM_SET=1 ;; + secure-16384) + CRISP_E3_PARAM_SET=2 + ;; *) - echo "Invalid CRISP_BFV_PRESET='${CRISP_BFV_PRESET}' (use insecure or secure-8192)" >&2 + echo "Invalid CRISP_BFV_PRESET='${CRISP_BFV_PRESET}' (use insecure, secure-8192, or secure-16384)" >&2 exit 1 ;; esac diff --git a/examples/CRISP/scripts/publish.ts b/examples/CRISP/scripts/publish.ts index 1981343bda..2b792c4c78 100644 --- a/examples/CRISP/scripts/publish.ts +++ b/examples/CRISP/scripts/publish.ts @@ -25,14 +25,14 @@ const PACKAGE_DIRS = ['packages/crisp-sdk', 'packages/crisp-contracts', 'package * Release channels, split by BFV preset. * * The SDK inlines compiled circuit artifacts. Testing releases carry only the insecure preset so - * they stay small; production releases carry both presets so one client can select the preset from + * they stay small; production releases carry all supported presets so one client can select the preset from * the E3's on-chain param set. * * Testing versions carry a prerelease identifier so npm keeps them out of ordinary ranges: a * consumer on `^0.18.0` can never drift onto a testing build through an update. * * `tracksClient` says whether a channel moves the client onto the version it publishes. The - * production channel moves it because the published package contains both presets. Testing releases + * production channel moves it because the published package contains all supported presets. Testing releases * leave it alone. * * `bumpsRepo` says whether a channel leaves its version behind in the working tree. It follows from @@ -41,7 +41,7 @@ const PACKAGE_DIRS = ['packages/crisp-sdk', 'packages/crisp-contracts', 'package * leaves the workspace and client on the same exact version, so local development uses the * workspace and standalone deploys use the matching npm package. */ -const PRESETS = ['insecure', 'secure-8192'] as const +const PRESETS = ['insecure', 'secure-8192', 'secure-16384'] as const type Preset = (typeof PRESETS)[number] const CHANNELS = { @@ -697,7 +697,7 @@ Arguments: version The new version (e.g., 1.0.0, 1.0.0-beta.1) Options: - --channel Release channel: 'testing' (insecure) or 'prod' (both presets). Required. + --channel Release channel: 'testing' (insecure) or 'prod' (all presets). Required. --tag npm dist-tag override (default: the channel's tag) --skip-git Skip all git operations (no commit) --dry-run Show what would be done without making changes @@ -705,9 +705,9 @@ Options: Channels: testing npm tag 'testing', insecure circuits, prerelease versions only - prod npm tag 'latest', insecure and secure-8192 circuits, plain release versions only + prod npm tag 'latest', all supported circuits, plain release versions only - Testing carries one preset to stay small. Production carries both presets so the client can select + Testing carries one preset to stay small. Production carries all supported presets so the client can select the required circuit bundle from the E3's on-chain param set. Testing versions must carry a prerelease identifier. npm keeps prereleases out of ordinary @@ -718,7 +718,7 @@ Channels: Prerequisite: The SDK build stages the circuit artifacts it needs under circuits/dist/, which git does not - track. The testing channel stages only insecure. The production channel stages both presets. + track. The testing channel stages only insecure. The production channel stages all supported presets. The build refuses stale or missing artifacts (pnpm -C packages/crisp-sdk check:staged ). Examples: diff --git a/examples/CRISP/scripts/stage-preset-artifacts.mjs b/examples/CRISP/scripts/stage-preset-artifacts.mjs index 6a7be15c04..6404f6d6a4 100755 --- a/examples/CRISP/scripts/stage-preset-artifacts.mjs +++ b/examples/CRISP/scripts/stage-preset-artifacts.mjs @@ -24,7 +24,7 @@ const CRISP = resolve(dirname(fileURLToPath(import.meta.url)), '..') const REPO = resolve(CRISP, '..', '..') /** Degree the preset's polynomials carry, used to prove the artifact matches its directory. */ -const EXPECTED_DEGREE = { insecure: 512, 'secure-8192': 8192 } +const EXPECTED_DEGREE = { insecure: 512, 'secure-8192': 8192, 'secure-16384': 16384 } const ARTIFACTS = [ { name: 'crisp', from: join(CRISP, 'circuits/bin/crisp/target/crisp.json') }, diff --git a/examples/CRISP/server/src/config.rs b/examples/CRISP/server/src/config.rs index e04137383a..802592819a 100644 --- a/examples/CRISP/server/src/config.rs +++ b/examples/CRISP/server/src/config.rs @@ -28,7 +28,7 @@ pub struct Config { pub chain_id: u64, pub cron_api_key: String, // E3 parameters - pub e3_param_set: u8, // 0=InsecureThreshold512, 1=SecureThreshold8192 + pub e3_param_set: u8, // 0=InsecureThreshold512, 1=SecureThreshold8192, 2=SecureThreshold16384 pub e3_committee_size: u8, // 0=Minimum, 1=Micro, 2=Small pub e3_duration: u64, pub e3_compute_provider_name: String, @@ -105,9 +105,9 @@ impl Config { } fn validate_e3_param_set(chain_id: u64, param_set: u8) -> Result<(), ConfigError> { - if param_set > 1 { + if param_set > 2 { return Err(ConfigError::Message(format!( - "E3_PARAM_SET must be 0 (insecure) or 1 (secure-8192), got {param_set}" + "E3_PARAM_SET must be 0 (insecure), 1 (secure-8192), or 2 (secure-16384), got {param_set}" ))); } if chain_id == 1 && param_set != 1 { @@ -127,9 +127,10 @@ mod tests { use super::Config; #[test] - fn accepts_both_testnet_parameter_sets() { + fn accepts_all_testnet_parameter_sets() { assert!(Config::validate_e3_param_set(11_155_111, 0).is_ok()); assert!(Config::validate_e3_param_set(11_155_111, 1).is_ok()); + assert!(Config::validate_e3_param_set(11_155_111, 2).is_ok()); } #[test] @@ -140,6 +141,6 @@ mod tests { #[test] fn rejects_unknown_parameter_sets() { - assert!(Config::validate_e3_param_set(31_337, 2).is_err()); + assert!(Config::validate_e3_param_set(31_337, 3).is_err()); } } diff --git a/packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol b/packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol index 821471fdbc..9ef38b259a 100644 --- a/packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol +++ b/packages/interfold-contracts/contracts/lib/ActiveCryptoConfig.sol @@ -8,8 +8,8 @@ pragma solidity >=0.8.27; import { IInterfold } from "../interfaces/IInterfold.sol"; // Auto-generated by scripts/build-circuits.ts. Active local selection: insecure/minimum. -// Mainnet supports secure BFV with minimum, micro, and small committees. Sepolia and local chains -// support insecure and secure BFV with every committee size. +// Mainnet supports secure-8192 BFV with minimum, micro, and small committees. Sepolia and local +// chains support insecure, secure-8192, and secure-16384 BFV with every committee size. library ActiveCryptoConfig { bytes32 internal constant ENCRYPTION_SCHEME_ID = keccak256("fhe.rs:BFV"); bytes32 internal constant CIRCUIT_VERSION = keccak256("interfold-bfv-v1"); @@ -26,6 +26,12 @@ library ActiveCryptoConfig { bytes32 internal constant SECURE_PARAM_SET_HASH = 0x80775a19b6126a12943f9c1c53f92299f0c92ece819b625026ab1406bbbe0721; + bytes32 internal constant SECURE_16384_CONFIG_ID = + 0x81f3edb4c49db1c2baf578d6ade4aea6839ee6a71d7458c1bfc79670d2ece7cd; + uint8 internal constant SECURE_16384_PARAM_SET = 2; + bytes32 internal constant SECURE_16384_PARAM_SET_HASH = + 0x8afd5dddf1bc0cfb00c70e9a7d0a0fb11bd0617df27574fa7d2ccf9ae3a6bdb8; + uint8 internal constant MINIMUM_COMMITTEE_SIZE = 0; uint32 internal constant MINIMUM_T = 1; uint32 internal constant MINIMUM_H = 2; @@ -69,6 +75,7 @@ library ActiveCryptoConfig { ) internal pure returns (bytes32) { if (paramSet == INSECURE_PARAM_SET) return INSECURE_CONFIG_ID; if (paramSet == SECURE_PARAM_SET) return SECURE_CONFIG_ID; + if (paramSet == SECURE_16384_PARAM_SET) return SECURE_16384_CONFIG_ID; revert IInterfold.UnsupportedCryptoConfig(); } @@ -83,7 +90,9 @@ library ActiveCryptoConfig { function isParamSetSupported(uint8 paramSet) internal view returns (bool) { if (isTestnetOrLocal()) { return - paramSet == INSECURE_PARAM_SET || paramSet == SECURE_PARAM_SET; + paramSet == INSECURE_PARAM_SET || + paramSet == SECURE_PARAM_SET || + paramSet == SECURE_16384_PARAM_SET; } return paramSet == SECURE_PARAM_SET; } @@ -136,7 +145,9 @@ library ActiveCryptoConfig { revert IInterfold.UnsupportedCryptoConfig(); bytes32 expectedHash = paramSet == INSECURE_PARAM_SET ? INSECURE_PARAM_SET_HASH - : SECURE_PARAM_SET_HASH; + : paramSet == SECURE_PARAM_SET + ? SECURE_PARAM_SET_HASH + : SECURE_16384_PARAM_SET_HASH; if (paramSetHash != expectedHash) revert IInterfold.UnsupportedCryptoConfig(); } diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DecryptionAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DecryptionAggregatorVerifier.sol index e0596f0806..27535b0b2d 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DecryptionAggregatorVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DecryptionAggregatorVerifier.sol @@ -7,8 +7,8 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 146; -uint256 constant VK_HASH = 0x0a5c59b6a1cc37abc167283aae4841b723d54ddf677c6598bd441d9a55cfcfee; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 122; +uint256 constant VK_HASH = 0x0e612a2506789cbb71d094dca31a48783f4355377a0ee86431dfccf726cf38b6; library HonkVerificationKey { function loadVerificationKey() internal @@ -18,77 +18,77 @@ library HonkVerificationKey { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(2097152), logCircuitSize: uint256(21), - publicInputsSize: uint256(146), + publicInputsSize: uint256(122), ql: Honk.G1Point({ x: uint256( - 0x0334d4c8c700a50ab239b8edaa6f3a8f36a4aee68543d9e2950c7a272a1a55c1 + 0x0f14d76500916d6574d3386450285eaa5764f183faf4a10a47ae1a1eb6e8ec06 ), y: uint256( - 0x0dcef0298d3440bcc1d04916347c2c3e475cf8728223a5315bca9424343e2e5a + 0x1593bc00c600aa5c83e5258a6603504a089d6b5612910e9612ed300fec57acf0 ) }), qr: Honk.G1Point({ x: uint256( - 0x219bc2e9a85e259223ab7be17321e83387ec421471a589b3e6d3aebb89a87349 + 0x2ae0abfb93365bdc9d3f15723d42a6cb613ac8b75a6865cd1c662db53d8eabc5 ), y: uint256( - 0x034201494811a0b2ff537679153fa58f305c49cf4ed97ee010fcac80e0a6298a + 0x0adda76e6aebfbf6c60d277445a8befc2e099a597a9ccb05b438aae1b7f68861 ) }), qo: Honk.G1Point({ x: uint256( - 0x03e84631c06d99fa57eb739c65d7b288882a7610fe41b400481ef39e5c482e46 + 0x017d3a0a0492e3217250bca58056672f504d6173e07a6ad8ee4b41e945728096 ), y: uint256( - 0x20bae97272f5c47da636d7699fc456d90e9d0402b84473a8339893427cecfa57 + 0x0bc9de59708fc7d0efb28ad42a2bc6b7973a14396bc83f094baf22f04a9918e0 ) }), q4: Honk.G1Point({ x: uint256( - 0x1fb16a1ea20b2ed9384214dd346225b3f5b0f57caf4d947be8af9ee225e7cc74 + 0x228320b4052943933c972dfa333a777c96d79ca36642b0c679733cacc4d74481 ), y: uint256( - 0x16e0bde6d07f916d7ef6e75cedece69cff6f31d4aeeeb3be851e000d31a4ff3f + 0x0dcd11af5be87f9ca6416c399ca3696b0a99dc038e1b2b7c49c24e7785dc7686 ) }), qm: Honk.G1Point({ x: uint256( - 0x0a28a15587492cac3700676650c7fc9d9797e19dbc9a6f550e65bbb3ca816ab4 + 0x1b102b6cb6a59be172fac3a8c619fd6ef1e46cb25c28435c04db03ae51dfc8c5 ), y: uint256( - 0x1a0c6f953210e582506088f55f56f385a733dcec4cfa5d9ee4678df213cf2618 + 0x2bdb472d1d75cc437ccb0ea47d5f190a381488001feb129659224ef2a91dff0e ) }), qc: Honk.G1Point({ x: uint256( - 0x0cb595d1b9cd8585d0d08a08fb36088f0e253423f482f61bfa15398e1f0be613 + 0x02b8cc2a6cf952c669105ca249267f13d1cf9d356ef1c025f53d70746d6a5914 ), y: uint256( - 0x0ab66fe4e3fd598bd32233fcf662a58fe2a40f79a5eccb5c849d76144206bad9 + 0x164f2e72ddcacf781e33102f8df6c7615fb83ec7ec196cfff3ee18110ae543be ) }), qLookup: Honk.G1Point({ x: uint256( - 0x03b565411ca8fb89c18ad07f732441cfec1772bc211b34748631f164495ed2de + 0x2cfb74054944b24f15a16c8658d46dd58b2f0946506d9981bd8c6d46fbd54544 ), y: uint256( - 0x03be36dda80bcec5f7c514012e166180a202e60490e801e0eba5990c84205da6 + 0x0ce08ac8e81a30575763f452e609db3f792036509860516e1651fc7d38af341e ) }), qArith: Honk.G1Point({ x: uint256( - 0x2a3a55d1b5498cb29297ea992612b74e9ab0e7db734740d34d64d9d81d298462 + 0x0499264c391b860cddafa65e064d15b8b51cfe83339c98a1e293e7c9fe5b241d ), y: uint256( - 0x18ecc8df17c7f667bf14f1546ed7baf9e9c63198d18dc03ea1107ab39ca8b0ce + 0x05daf1f9a755bde5d8f71bc9cb7d8f65e23f50e2e604c2b75062964e13d02f2f ) }), qDeltaRange: Honk.G1Point({ x: uint256( - 0x0a69785ce999f58841c1f6b95834572c19b4750baf7f3d0ddf222813c400a15e + 0x1e57fbb5e4015ceec0b02c8dc5b87bc05332ea515fa8eaf8b0629d32c53c16c4 ), y: uint256( - 0x241745b3407977c918d1244eefdc24a8b29c07acd6c4e81f563381a928fd3847 + 0x08299071d6702e39fb6bd8982e3013102cb321a9e4ff09e166bd4945ddf1743b ) }), qElliptic: Honk.G1Point({ @@ -101,130 +101,130 @@ library HonkVerificationKey { }), qMemory: Honk.G1Point({ x: uint256( - 0x0fa90043f3430c905094738a28e3784846b200228917ccc9e198d6fe0d8f5aa2 + 0x1b4dd8fa15f3d088502b4bf5028fdd766da6409e0d0db9868b6fffb84fb151a4 ), y: uint256( - 0x0ad0f7c9880e67a4c95ea5a82dd67eb669f42ed5b69d10e8033a43ea4b362235 + 0x022d20a1ead2857f05b1ecaa9ac07dd988b647445511bc9ec8ede85244696d1c ) }), qNnf: Honk.G1Point({ x: uint256( - 0x1e9dfdd314b79d0616cdacc8412371de5ef6eb899f2c9434b77e3881cdb8e4af + 0x2046c3062555af91cbf7045392f74823d684c1f9491f920ade2b29869a3adfa2 ), y: uint256( - 0x09cb0b6dadef210bb503679a95a6319b32cb66aeeb8df4f1e98602f64ffe6d80 + 0x2e06081446c4aeccbe4acec789be858abcfab7f71c1614956906454da56662fc ) }), qPoseidon2External: Honk.G1Point({ x: uint256( - 0x1344bd56ac9e15bf7d2fc6c86b3a91255ab25c9c9958494432ea00b702a97449 + 0x0e92f70c60102b044b86497f2875a7f308f228e973f5cad9aebe9d1f53ffcae5 ), y: uint256( - 0x11a91ae0e570ba1bf05c1dfab840212d91f3175de0cb480c118737b94bfab090 + 0x0d1daebe7502733fbff5bfd7ca004b302e2bb07b1c7bba40e56135d7947ec3b7 ) }), qPoseidon2Internal: Honk.G1Point({ x: uint256( - 0x13d7e728a936228c81bc3fbb92a8393766975cfddcc39acd9cc49444e6245c79 + 0x302e8f008048ff9569e41a115f168f26b595587d3d839c149a2b152e9e006040 ), y: uint256( - 0x0d5007f5835bf34e23ed643b81df0d706eb6fc0330a744f8ce2dc0f089479c9d + 0x0836e49dd417a066b9da23e749786783388caddcbf45fab196e7d825fc0bae11 ) }), s1: Honk.G1Point({ x: uint256( - 0x28e4481b0b7b53d13006a3e2e5ae7ac3a3ad1ab8b13cc6de4efdd4efa29c4232 + 0x2f7207564524d818fb7da554a8dc531da8d7edc00160771c9cbdc10949459703 ), y: uint256( - 0x2aa19420277b3742400250892ebefff2e5ad7ba6060a1fae6f18ed7079311dda + 0x2af437ab3662d5c9b0a33deb510a85469724f120cb27e4f57e1e4a5a512bd2f5 ) }), s2: Honk.G1Point({ x: uint256( - 0x2ce3402d82c23ed9091a2009a6505868327fe28daead033635006d93e1eb5225 + 0x1d949cec2986fefadcac3f9cc465d35b17fdf27e832b3483880a0541f1af988d ), y: uint256( - 0x26b11879d534681b824f5779ab5f30c8b9a69d862a4d2ad737cabcc2d0633d32 + 0x1fa5ae6be08f5638f0fa2daabf4a8d62e79f2a66a888b13e8287e963cd67678f ) }), s3: Honk.G1Point({ x: uint256( - 0x1208d46228db65d29d2eb8491e4e5c64536fdd355b4b6949c242029a7ae9ba82 + 0x2da63724dc90892845c530192143b149e1c6de23db0e0f2bbc60bf1a18891d8f ), y: uint256( - 0x02d4c3cedb2ee2404b68117899c08f3cd6e01b34217a882f8d3e13f9f29ff4a2 + 0x14e0c79904e39e6e8052ec3c5ef18973e7d97c30623bfaa3a7227e906897744e ) }), s4: Honk.G1Point({ x: uint256( - 0x2502d231b6b97003a2a10f3c295fdae7554228a68fdb484a7d5ce88be18f0782 + 0x048ca15d3cc8337ce3691928ac40b3e7374c0ab016ee43d0412491e914a5c1cc ), y: uint256( - 0x245eb807c3095d92846c5e739016be4145f9f2930ce55cc9349996e6af0dd9dd + 0x28c7fe2c468c79d27f84542444fc786cf314dad80f36f2408b38f09cbf390c1c ) }), t1: Honk.G1Point({ x: uint256( - 0x1d326235297276d1be9c9ab8c11122aa4d619aacd72f7f84b19cac6cd6d0dfe8 + 0x26b6c33761c47fbbc64bc99157eb6e591693840ffa6a2b579c5f98be40fe19ca ), y: uint256( - 0x1bf6c8288d78105a863bfae3477e47bb63d344459f3e4fbaedf389706a6f16e1 + 0x2d339a0497eb18a5decc3976cbc07f11035a28853a61f4f654516c0db64eaaa4 ) }), t2: Honk.G1Point({ x: uint256( - 0x243fc8135d9e28d436264a7a5d2aa7b57a2a692d130e009056638533c53f4aba + 0x27347b95cc29d0aee0f64b4cff3fc37f611ab498c2308d155f8d3c4239be0934 ), y: uint256( - 0x088c621ee437f2daac58d3ebbcf8ff2065993edafa4585354efc81a3c5602ee5 + 0x1424833141bf42787ef59306c06991a23bbefd0f08e966689af98160de7909d9 ) }), t3: Honk.G1Point({ x: uint256( - 0x1d8d3f60599d7c6687e85c6f35891076a1b18c4244597badd7607c44f1125ce2 + 0x269423bc6ab728e4b8a005193432727a84f3b588df5f9829f80786afbea2c2b8 ), y: uint256( - 0x1eae225e95b0155bcdb7048d467679cff828e0df2e12e9501f45d9f55a9b897f + 0x19bb3258ab971def1ff877bf4687753bc6dfe5f04d8704fa05ab46271f797fe8 ) }), t4: Honk.G1Point({ x: uint256( - 0x19e2aa7b7fd6fe9be3e40132586aee0d0eb86c68818e0c8331b88866df16ec68 + 0x0503876e97b8041bb0e013ae9de57f03f6767ea858397427cbe355373ad5ffb1 ), y: uint256( - 0x1c909084e30f0f60240bdba5146e5a66ef25fb41a53da2602e0303831dc060c1 + 0x1b99b07d8c48006d2512f97974f932a349e6fe9ecbf236d6785aa4f069df12c1 ) }), id1: Honk.G1Point({ x: uint256( - 0x10557b55bd61658ae58f3cd084286749bfff2b7436239e0697079e27b1a07e76 + 0x19906034db1e238cf96aa3c712036d179927198f2cef2d334c93759bd3475d8f ), y: uint256( - 0x1165d9c3ac734ee74856995ef364dab1e8795b9322e6ad314a0d2cd9edebc690 + 0x0e1b444fdb8caa9325aa02ea1cbcb86a72d8b9a64cc62996248c480a0ee00bed ) }), id2: Honk.G1Point({ x: uint256( - 0x12aabdbbf26a542346fe1aa62483ffebe37f1068fb5ee5b17b90256625eb0213 + 0x21d8916a32a04fc044b4d4786ff840ce9bfc3c29e50899a276dcd581193a83f2 ), y: uint256( - 0x2cda4dd328f5040725d433af440be5849923ed8afe4d6b028480c44dc899b984 + 0x0cfaa3067461b5ccf8c8c01249c146ddc0d120efa75994f295a0c3224e443eff ) }), id3: Honk.G1Point({ x: uint256( - 0x03a50782e72d3c751cac664660f59e50dbdb0cc190c49dbae53e3e97b18d248c + 0x2e313d44d38d1e9171bb32ee658ea2ec6560bf1822b3cd84ad3c73c2a858855e ), y: uint256( - 0x0c9eb37d304289edf3d9cc9c51ea81b2da00dbb39462d9aebb59c389d6766fe1 + 0x1945d840f43697d15ca4f1d8e7aaf0c91de37fba1531611e94d56340bd61f9b6 ) }), id4: Honk.G1Point({ x: uint256( - 0x2cfb02aa8f0f8f2211fea2c9b12bc8e136e05682579468ec6a9c6fa612118d68 + 0x0e315f31453bcdb5f6f81a7b3e12179a9d289b0988f3de3561974f9d32c201c9 ), y: uint256( - 0x1a739022c9d6341da7f2161b61fd2211450c017a8ba1938d6e18c95aba156c96 + 0x06dd1559d417006b3e8bf13d74845c17f3a0b63a5584950c3038039d418b208b ) }), lagrangeFirst: Honk.G1Point({ @@ -237,10 +237,10 @@ library HonkVerificationKey { }), lagrangeLast: Honk.G1Point({ x: uint256( - 0x153cdd496ac40045b30950e932319d75ff601ea33ae655c26e8d6ab351f96a88 + 0x0c3ae6fb701dc0b534390fba205cc44f9e2b1166c5fabf583e21ef28d8f92f48 ), y: uint256( - 0x2fd241180ac0a25d002e4c76825420cb7c85ae09ffb2df108bb66ba10f26d1df + 0x046859246518b60d025c10fe0dc2a254e0185c21a13d0ac016417c4c3d66e834 ) }) }); diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol index 05f02bbe69..0584f11447 100644 --- a/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/insecure/small/DkgAggregatorVerifier.sol @@ -7,8 +7,8 @@ pragma solidity >=0.8.21; uint256 constant N = 2097152; uint256 constant LOG_N = 21; -uint256 constant NUMBER_OF_PUBLIC_INPUTS = 62; -uint256 constant VK_HASH = 0x1c138082301307a10bb0f9527df0abc87a176abc8870cf23dede095034753661; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 38; +uint256 constant VK_HASH = 0x2d2b7a67b3be3a1684127ff35cb64495a97b386fe50160542ac214a0f249da0a; library HonkVerificationKey { function loadVerificationKey() internal @@ -18,77 +18,77 @@ library HonkVerificationKey { Honk.VerificationKey memory vk = Honk.VerificationKey({ circuitSize: uint256(2097152), logCircuitSize: uint256(21), - publicInputsSize: uint256(62), + publicInputsSize: uint256(38), ql: Honk.G1Point({ x: uint256( - 0x0cabbcb909104c1f099e2119498a02b508fef3642d1bfafc2256cf43cb420e62 + 0x289502c7491c555fe9eb5f5186a610987b27cbcafdc71c7f819a19a1c0a90c0d ), y: uint256( - 0x215725211a8a38715d50c3d93fb50ce67d76d23616e8d63bd9bed7d767bad279 + 0x0b85fc29192a8821da6a69744d32c33b7b7da68a7d0085e18d6d3a03b43d22b0 ) }), qr: Honk.G1Point({ x: uint256( - 0x2b74006e54c317ddfcaa5d55a6f4b3bcfea8c5622e84772dd73516ae89487fe1 + 0x17b56a141ce218bd8d6c0a6933147e460439f5ed65faf84651ec82533b09a7b9 ), y: uint256( - 0x29fc2af709c970f3dbf560392eaaf5f55fc2896c6c58b36a8fe8bf46126aeb39 + 0x2fc54db9775b5980eeb9c19cf6a67898290df6fed16fe0355e70a55bed8a6156 ) }), qo: Honk.G1Point({ x: uint256( - 0x1a1cc12f25cc0c1ba58aa325c1870d837078737b5dc4ccc536b8e1c5c6d24ead + 0x234afd34c4f18be170b275451a168b3c684bb3ac8df6140c786aba665bd18109 ), y: uint256( - 0x0651cf1e2f369ad4c320c357d0b5486b1d6231679e700222b81ab9d6044933f4 + 0x28f2169db063aa657b3cadfdca566f1d7fc4a11d8129b5747c2a877d05959a33 ) }), q4: Honk.G1Point({ x: uint256( - 0x145124c06d60af886a4a55f29fa474bdf16ccc757bba7094f0aaf5c60e858f1e + 0x1ef16ea660decdd4f31ed23d1982fb1e91ef31333628ed97ee688d677ece9911 ), y: uint256( - 0x080d847775215f7c1934bda24fb9d8f9d03168398c331b99a58e7eefe426aaa6 + 0x24d5d7ff7d67191664b9b2c7cc12a9a521ee02a9a6131f7e5448820b16981309 ) }), qm: Honk.G1Point({ x: uint256( - 0x03d68e8279c403342bc51e5bc9fc65805db2edb91e162148821bcf3eba610d8b + 0x2f163b097ded63a3ca50cbbf22b11b088251bee823ca65bfaa75a0ca812f584b ), y: uint256( - 0x27e007f40a4a0ead13f3482628a16a4f99f18c52f024653c8383124ac75b3f08 + 0x13eab09311e5648a2fc3ffc33995d48861b170afdb9f7b5dc8b9a438736163e1 ) }), qc: Honk.G1Point({ x: uint256( - 0x207dd9188c6090da150559c8f31399254e6aa92e17b6229da5e7f54b9504ab25 + 0x1ac85db32dabf142187223dfc80a07334f2e753f4c295f0d4a0f30d4be7e7040 ), y: uint256( - 0x2d683b0a58ad1af0e215bf4e122ccc6d76604661ee512d090be569cb5adaa7b8 + 0x17cfadf390a1f0f25f1588c8b9ea5d2680c1682675f19ea01d40483fedaac15d ) }), qLookup: Honk.G1Point({ x: uint256( - 0x07decae55629495330c3da15f6f2c0be18906fafea84c922e0de42dc3d4c4a87 + 0x09ae66bef2d0ad77a28f9a475135d083aab02eefbc32edc5bb697cf92400c48c ), y: uint256( - 0x0f61a514cca0114b9b69ab615669e47d6825d12d94251dabda103c05bdec5709 + 0x2641833fdb404a23873dbd1dbeaa222b88e748c8c8ff780d945e7fd9a4870e48 ) }), qArith: Honk.G1Point({ x: uint256( - 0x2e67109a1b71bbcf316a99a12ac7d099e945c4dc663fd0039bdebf72fb12cb1b + 0x0ad5a5404184ab5c23982322c7248564bf334243bd232904c12ac9d587d6bb9d ), y: uint256( - 0x08fd81d94fe45e39c18e6e139caf1a475d34d58493f398af58421cb7743a9a48 + 0x287d3e93a922ad414a7fbab272043c438b6d4cc3a90db825b6195ad38efa4024 ) }), qDeltaRange: Honk.G1Point({ x: uint256( - 0x1720cd7258dfda3d3dfe40c0ce48a55c6d0f409a6979cbf297f590c0e6624cfe + 0x0c8bdb723739d56aa773dc4cff9917e9846db953663334b54c3200f0aa3f78c8 ), y: uint256( - 0x20af57ffd52dc92d7f65e00f2cbe5d938c1ef803e135774aefcff8f87a9e9ff7 + 0x1b54d9b0f614bf2c0f9efc8905d6d0941de9e7d9428e1d9a61bd845ff7368170 ) }), qElliptic: Honk.G1Point({ @@ -101,130 +101,130 @@ library HonkVerificationKey { }), qMemory: Honk.G1Point({ x: uint256( - 0x28f836bd52a43e804f5f7899a380e64773641e942adeb6d38b4d890cc63ee901 + 0x0f2a53a3b3468b16b6b565b23d7af9ecf477dd211bb150d5187428a6ded1af19 ), y: uint256( - 0x17d791df885a4dd504e28fb85a3149edb84fcc6326ea6976b9e44edbd4492059 + 0x2aa7751917503f40fdd2ba7222405bcdc46568132cff31185dcd9bb6527b592e ) }), qNnf: Honk.G1Point({ x: uint256( - 0x057a9a024d8bc989d989df76efdb4b8440cfbf609b56838db316e3d56e366c60 + 0x292ec4c72dc9121c7cab55b63db73ad8457fdb32a9ee1ce87b51071af694bc41 ), y: uint256( - 0x0c496b73ad19efce7d07ffa786baceecc1223733a7ca7bec7db908b8cce8de41 + 0x2a3fc755073235e91da005cc09a1b898f8fb7260c446d50162d02b665b4c4bd7 ) }), qPoseidon2External: Honk.G1Point({ x: uint256( - 0x2dd3b9cc6b9c7b10020d0b2d4aba4baf2f4a5de3357228524d527b8700fc50fb + 0x1bb1cf93b27560bd3147bbb54724c08a1aeede6311c8e391f664861ad9322666 ), y: uint256( - 0x2b3841781e7e154909663efa72044c814024b59ef256a35db9898ccbcd6edf6e + 0x19439d6d87f40af6b24c3bc04cef40c2e602124521c1ecf50a77dbda6c3b7a37 ) }), qPoseidon2Internal: Honk.G1Point({ x: uint256( - 0x05196a8974b461f416bf30cd66b893a128d40736e927d8c196f2d80959eb4393 + 0x1652c9f80d7dd47803de9de4ae711b0f104065c614f55f944b55d8aa7ee36b7d ), y: uint256( - 0x1a2b25516a8ff9c9e125e4b9778fdb725b71d38ffe31e326fe76ae5daee992dc + 0x2ce580a48a76fa657e1f052a37863509cf669a9e3b20b48067cd9a777876325b ) }), s1: Honk.G1Point({ x: uint256( - 0x1939cc081a9e0cdf2b0c4aba57152fc3d9f669b48204980d73a677721f2d6a60 + 0x26115193d649d79027a1cbbb856174f8e868ad13fc7f7ec86f5b1366a01fb022 ), y: uint256( - 0x1a8389be922568fa8990cd478c72c51b77b12186016f1d43a8d76092e8312221 + 0x29696a447ccf2a8002115a388d39de35de226c26ecf88158d7fe1ecc3669866b ) }), s2: Honk.G1Point({ x: uint256( - 0x1bd08cad9dea2f269827854a21ab78c0b7e8e00d87468e628c5444d9720d3fdc + 0x0ba08167e24a6b68aa05b147c0759aeb06dd57d843f69479c5b2b21fab868e03 ), y: uint256( - 0x130807b571e4ebd8a83901dbc717e27cb673fdfa4af608bc260b3b588e6b9bf2 + 0x043685f425518969ab5939b2677f8df80762e2a8db70b31c1b3b85ac00b6b99d ) }), s3: Honk.G1Point({ x: uint256( - 0x1abf713bd3a9ec236f5fb0290a7dc3b547e78342be24aefde0e670d1c61db04e + 0x06b47b432b15c4fce781eb891641026600d2b9a1d8346f2264997d327d1b31e7 ), y: uint256( - 0x267b538afd20c2e54b10204f461047d5ba8f53e19271a920b52f3bdc3ff1d07e + 0x0f15337c1196d7f49641f2eda40cc51c69741457596b8e5d2483604b2dfcac00 ) }), s4: Honk.G1Point({ x: uint256( - 0x167f6117e78ac2e6c313aa4089d6869a1f5cf2b9dc4c3d34d81533ff57203bdf + 0x1385e074ef7df9d854a159371f628920f3d1771bf7f0fe799923b682df08429d ), y: uint256( - 0x186cc1d96852b026a5cc09e3df4f4b3b965317107ecf010744f0bca8ea3752c2 + 0x2e51fa14415fdb62dba01b6f88d6bd27f0199a604821e6e0542c926d7fb1b9c4 ) }), t1: Honk.G1Point({ x: uint256( - 0x2dec1113879ec9e894d2e63cab4f6b70b4f0453de3f71c0b7cef5d07ccc5fb16 + 0x23e3dc399cfb420ca1d4c5d1647660e33a85abed22b19a35a3e9bc1ac453671f ), y: uint256( - 0x2e569bd7eb479c5d513edc4d10a5eb210ddde4e10a46291b659e3e904f7cb9ed + 0x182cc6d1ef5e4db7dd3d7ffacc94dda14e22cde6a65817d29bec9cd5477c3d05 ) }), t2: Honk.G1Point({ x: uint256( - 0x14c5e72fb4850c73117d61faafb41666f499732f77b2acd2927985e0a44d7a0c + 0x1cf491137dd2886b0aa1f52e1c33b1a42e137942ec903272fee32835ec2af9b4 ), y: uint256( - 0x263108f9225b99fb35c4239a8d0efeb35dbe9f791937033c621e397344de6522 + 0x01aa859ed86b51dd160af31231f485de835f15c502df5e4b65af46eb034be89f ) }), t3: Honk.G1Point({ x: uint256( - 0x1046bbe830ffeb03264fa686a6507e553f840a287a840b12d9628c85306d271c + 0x22a78d6fd55592cbaad2152296b9cb77a6de8ab2c5ade4a32961129682f5f852 ), y: uint256( - 0x14da3e1300109c126d74a9b37a8d5cf302a31757293feb3bdf52acd9e99d7257 + 0x29d63f029f9f6d0a8ea7f2e01d4e90c63ae63d06d202538cab4ca55c695934a7 ) }), t4: Honk.G1Point({ x: uint256( - 0x122b57aac7c9e1cc87c8fa7a67aba40e3ee3e1540dc9f02eb58a8bcb86fe6eca + 0x1db64843e94d5b8f623d28b39f49c0226ce8d47ffecdd01377980b4ce7c52dba ), y: uint256( - 0x2b4c091e41c1cbad2b4ead8946df008438021eb24532d23d03063af92151a5f7 + 0x04a0bebb79e4324efa91aa9373f756a80b643beddd20ae24bdd74d2ce4c2336c ) }), id1: Honk.G1Point({ x: uint256( - 0x29aae7f2b74b26c2e90d93eca8adcd437ebe935ec8e061064cd303a83dd3f12c + 0x14492b310cf8109ca9c22596133868e549654a36638f96e6e03b2e687c1b16e3 ), y: uint256( - 0x0311a69a03ef66c96e3014cde39183cc14719d847c1fd9485c186f27f3a5084f + 0x002e1213e20217fe6d7c3264c85d5428ec70713ed6a9f5efea76f8db92e98c93 ) }), id2: Honk.G1Point({ x: uint256( - 0x2a104d387c543aa99d22b356788f3697562f0f8de346c9095b37de23d25e3160 + 0x2213e9d455b4f42b142e97d131eb8781c885ccb59b73313ede2436fd48496c36 ), y: uint256( - 0x054058a915eab1ebf59034288c0d4432dca4cfcc3e4ce1884b03996f7e3455b6 + 0x12e460d4e9d9e70913333252bf2bfebfe5f41d9504aefd74498100a76361460e ) }), id3: Honk.G1Point({ x: uint256( - 0x241f716c56728e74d5c0900026303c2eb8d41956b11ea2834c9cd05fba88cb88 + 0x04ad960ca85f72f493487e55986e781623e86fb237b3cb95aa64f58773bac338 ), y: uint256( - 0x28c5deb96e671c2b1168813fa91025a8be5d03ffc9f47f4a9dfd256869cb3981 + 0x011e01d560aeebe271651c2bfd6bc3f053b3a970d2e81a855599f2419788fd96 ) }), id4: Honk.G1Point({ x: uint256( - 0x2ad0bcad91b8638ab77aca5ac35da97a1c10c933347543257a7b2668eaeea205 + 0x108853c937c54cfc3112860b80346c8f0f6c17939d8c9e3a18868359c23108ae ), y: uint256( - 0x0f8123c93641f5fecb2b4735533b5eba654de9e428cab42091f5116fb3fac9e6 + 0x1d22b066661d2a588b8649aca923a5831e5ddca8c65542cb2ddb230528cc5938 ) }), lagrangeFirst: Honk.G1Point({ @@ -237,10 +237,10 @@ library HonkVerificationKey { }), lagrangeLast: Honk.G1Point({ x: uint256( - 0x15a96432f17d1b135ae86046eabef7c772f465108ec6725f16e22f4470f58085 + 0x16492a83885014ce7c93e8083eba49869724ef8b5a068b9fc6a7e61b79389495 ), y: uint256( - 0x054cd74be8c2189c0c3d1a2648aaf75e76ea3a974790d69a3dc865f105066cb9 + 0x2f58a57306d7e3d273c17d92b1a92343049de81cf1cc67eeb0ed51715b86e787 ) }) }); diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/micro/DecryptionAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/micro/DecryptionAggregatorVerifier.sol new file mode 100644 index 0000000000..94bd698c68 --- /dev/null +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/micro/DecryptionAggregatorVerifier.sol @@ -0,0 +1,3262 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +pragma solidity >=0.8.21; + +uint256 constant N = 2097152; +uint256 constant LOG_N = 21; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 131; +uint256 constant VK_HASH = 0x0c6fa9e9badc917f3eeeccff886019b6bedb4de6d8f0b2dc48229c8b904b1ced; +library HonkVerificationKey { + function loadVerificationKey() + internal + pure + returns (Honk.VerificationKey memory) + { + Honk.VerificationKey memory vk = Honk.VerificationKey({ + circuitSize: uint256(2097152), + logCircuitSize: uint256(21), + publicInputsSize: uint256(131), + ql: Honk.G1Point({ + x: uint256( + 0x060f65161dc32184544cf72daf225203a418fcd88feec7900682e76773ab472c + ), + y: uint256( + 0x295b894130bf534526838c6d40966d32a89d6c590cf8ede1739f8b244f880eca + ) + }), + qr: Honk.G1Point({ + x: uint256( + 0x23d3df81179958f0d059ad75d257c54e1b6df2c77f4486d4ed8522a6cfbb0a37 + ), + y: uint256( + 0x097fe6627e6100a1d0dba9977ad8203aa9a4ffe97fd3db4b0f43a705389f0f27 + ) + }), + qo: Honk.G1Point({ + x: uint256( + 0x1382d4332690574bfc34b83b8fd40328fefd49c98f54bd27e05189d37d3c874e + ), + y: uint256( + 0x25946b7c94c506bd5d4455aec44809db853fd2aba6566032574b5138915e13bc + ) + }), + q4: Honk.G1Point({ + x: uint256( + 0x1edda59a35cf826b891d6e82fe931c00315601669e207ab8d92846cb1e591648 + ), + y: uint256( + 0x1022517bcde13806584bc52fb0c25489e0d8b2b985dab8a552cb4a5ae1c64d0d + ) + }), + qm: Honk.G1Point({ + x: uint256( + 0x10045631c8aa4be3dc660484a3f5bb28c7848d04b2d2edd774e763b08bc4067c + ), + y: uint256( + 0x233098f9c1ef85964ea049c2b7c67eb1a55baa192175a3b4962172d2abe00bf3 + ) + }), + qc: Honk.G1Point({ + x: uint256( + 0x0aa1169200ace4d875c5a22092179cbf6eecfc7f5b3eb9b6f7b7d0f53970357a + ), + y: uint256( + 0x0411f353a1dd49b83e52ad2902b8d5aea29db2844c9ee008443b0e774185545c + ) + }), + qLookup: Honk.G1Point({ + x: uint256( + 0x0a4dcc5f5dd6d95ceefdecfd2342f549bfce44c2150d4ab3ae752865b3c5aca7 + ), + y: uint256( + 0x127e9c8c8cbe1f2caca79249f9f690572ecd11fcaaef6dbc445df7d26902c088 + ) + }), + qArith: Honk.G1Point({ + x: uint256( + 0x2fe1c708def53a7b0a31ac21efeb9ac25a369360a819959d71190784946d3c17 + ), + y: uint256( + 0x21b4d099ae8f92886d7a80fd8ea4c8715fe2cd0f4ae70a9d7c350d63fc13dc9f + ) + }), + qDeltaRange: Honk.G1Point({ + x: uint256( + 0x228d0761a301cf486e19a5443a87692737d676ef4e01565ded9a9482cec0c528 + ), + y: uint256( + 0x2e309eaedf0019ca88867054a3964acc87017831635df3e1141546a5610d70b6 + ) + }), + qElliptic: Honk.G1Point({ + x: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ), + y: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) + }), + qMemory: Honk.G1Point({ + x: uint256( + 0x21f25a0eeb638d8d57c1634fd66c94d67d7806eb95d65632a7461ff46b2380e8 + ), + y: uint256( + 0x01ce1c7b1233e22e500ee6b40fa3e6a199b62880b2db56af1310a919da93c5ea + ) + }), + qNnf: Honk.G1Point({ + x: uint256( + 0x2a369234a6f7e30da9da4ee9cd72356cace26043a1ffbe14a21429df95e5b869 + ), + y: uint256( + 0x10e14969255dd26e7af2bf8f5dc985d9c20320352d2562366619497d2050185e + ) + }), + qPoseidon2External: Honk.G1Point({ + x: uint256( + 0x128cb0db9cbbfc90dfa77bb2d6a333b2db49b5f5d4aebc69bec23edae0bf948d + ), + y: uint256( + 0x1538e0be8d7523aeb67c45611b2d3ae7d681ce2745a9a1c8a61dcf07d0e1c540 + ) + }), + qPoseidon2Internal: Honk.G1Point({ + x: uint256( + 0x2233c253efc21e3bde77f8ad2b1957c8e601a3720a15776757baa8a57ab7aa75 + ), + y: uint256( + 0x055d5329939a1312f0d720692ca089a58f21549215800a8cb3d46791367bd2c0 + ) + }), + s1: Honk.G1Point({ + x: uint256( + 0x0b424414f002e3ff02e4ec15f624d9eeb4011ec3b4c75bc5a1159ae9bcf3013b + ), + y: uint256( + 0x2225879f9d60177ad2bc070d25f7de80b4eb1b9f970c310908a0605751d3f72e + ) + }), + s2: Honk.G1Point({ + x: uint256( + 0x2f8d7f502c94590360c0b3902d34154cefe074d50104500738c775d921106152 + ), + y: uint256( + 0x280928efaee61c92f374722c3dc828f56baa1177535e35a0b642984f62d275e3 + ) + }), + s3: Honk.G1Point({ + x: uint256( + 0x1d84c181ca4b3d8964a7e1bdb06dbf910fa1cedc8deaf05f0addf8da65cdf6b8 + ), + y: uint256( + 0x2d5f01d378e23bf0dd3f4060b77ebe36c9ffe8be5d903bc480ddfb5a97fe88c6 + ) + }), + s4: Honk.G1Point({ + x: uint256( + 0x2b750f606acbe576e2220e335a290e1a00bedcd6ba24e1b9f0f28ad7ba796335 + ), + y: uint256( + 0x0ad9e98a20a59f44e095b50d225deaa90df4106a32be833a50be161c785c3002 + ) + }), + t1: Honk.G1Point({ + x: uint256( + 0x2f2ed24174c6aea29c5fa748a8aea9a66e01fe7d91b439d2793a48d2b58fa0ff + ), + y: uint256( + 0x07f3acea9370c81026ef20654b7706710f594ac363e414320e6981af8d7dfbd5 + ) + }), + t2: Honk.G1Point({ + x: uint256( + 0x19ad2cb51804df4b6511c20de5b6291b649290136111b48272c63306eb8477d9 + ), + y: uint256( + 0x19839933202884834bfee73b83120220abee69f39478fe7a15c3d1d268de93d0 + ) + }), + t3: Honk.G1Point({ + x: uint256( + 0x026e8383aa03293822eebc1045f0703ee42fea40cf2f12e5b4d44c7f97617676 + ), + y: uint256( + 0x016437872b228401eeccfc6f6703c450079b053c548c58f1b575eec1117f3cdd + ) + }), + t4: Honk.G1Point({ + x: uint256( + 0x274adcef5548881a689ea9288dd7abe608b5e462dc64f742c3fd2f0fb71a728f + ), + y: uint256( + 0x0b0a0b0f29c6f78b253db1ea379db71de031a24638b1add55f20179380a9d532 + ) + }), + id1: Honk.G1Point({ + x: uint256( + 0x03b60eee19d5f1ec9c697309da9ef18a457c1db1c7310b6177119949ac66a3d3 + ), + y: uint256( + 0x061d48477b5854f40ab981402bc0d0c112f7f948dffced5d12a9f8dc2e996693 + ) + }), + id2: Honk.G1Point({ + x: uint256( + 0x0541ca6f8b756e425c32e9c779b6612eeb3c6e0d32a97d0e9df64c8861d09489 + ), + y: uint256( + 0x067e3b8202a0b07b790a342ad089aac7f2213dac62c78c7a001fa73f2c38f2ca + ) + }), + id3: Honk.G1Point({ + x: uint256( + 0x18047fbf4d8c742c8a61dbc48c10d8f98f0c34f2b32381989a6c81e4db19ec44 + ), + y: uint256( + 0x1006d18e253ed12b0df1b8693a6ce34eda5de0f2ed989220adb6f7edb270e04a + ) + }), + id4: Honk.G1Point({ + x: uint256( + 0x2f7e33af05d9c92eb4f333893fca9f18794062568a843d33329f376a3de64f4b + ), + y: uint256( + 0x0fcc9422e8e1006ba51b7a51e9572ef56dab7261593f83d60ad6ce937e7b1adc + ) + }), + lagrangeFirst: Honk.G1Point({ + x: uint256( + 0x2a56ce41f6b0be13b9c26747621b821eee81b23a887f299049b14c11e98460d6 + ), + y: uint256( + 0x1aa98f2de3ddda547d8f6de4e725ded5827d6338c78656c0d12ca1aea6ef2c7c + ) + }), + lagrangeLast: Honk.G1Point({ + x: uint256( + 0x28960f3cf5c2ae9fd84615ba3e6afccfc84f578fd26eae962e548550df418977 + ), + y: uint256( + 0x0b4ead386674756a479b91cfd782c9f639af0d82f829ddb7913e3092ed0c5c84 + ) + }) + }); + return vk; + } +} + +pragma solidity ^0.8.27; + +interface IVerifier { + function verify( + bytes calldata _proof, + bytes32[] calldata _publicInputs + ) external view returns (bool); +} + +/** + * @notice Library of error codes + * @dev You can run `forge inspect Errors errors` to get the selectors for the optimised verifier + */ +library Errors { + error ValueGeLimbMax(); + error ValueGeGroupOrder(); + error ValueGeFieldOrder(); + + error InvertOfZero(); + error NotPowerOfTwo(); + error ModExpFailed(); + + error ProofLengthWrong(); + error ProofLengthWrongWithLogN( + uint256 logN, + uint256 actualLength, + uint256 expectedLength + ); + error PublicInputsLengthWrong(); + error SumcheckFailed(); + error ShpleminiFailed(); + + error PointAtInfinity(); + + error ConsistencyCheckFailed(); + error VerificationKeyConfigurationMismatch(); + error GeminiChallengeInSubgroup(); +} + +type Fr is uint256; + +using { add as + } for Fr global; +using { sub as - } for Fr global; +using { mul as * } for Fr global; + +using { notEqual as != } for Fr global; +using { equal as == } for Fr global; + +uint256 constant SUBGROUP_SIZE = 256; +uint256 constant MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Prime field order +uint256 constant P = MODULUS; +Fr constant SUBGROUP_GENERATOR = Fr.wrap( + 0x07b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76 +); +Fr constant SUBGROUP_GENERATOR_INVERSE = Fr.wrap( + 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 +); +Fr constant MINUS_ONE = Fr.wrap(MODULUS - 1); +Fr constant ONE = Fr.wrap(1); +Fr constant ZERO = Fr.wrap(0); + +// SmallSubgroupIPA opening-claim layout — mirrors SMALL_IPA_CLAIMS in +// barretenberg/cpp/src/barretenberg/commitment_schemes/small_subgroup_ipa/small_subgroup_ipa_utils.hpp. +uint256 constant NUM_SMALL_IPA_OPENING_CLAIMS = 5; +uint256 constant SMALL_IPA_BOUNDARY_OPENING_IDX = 3; +uint256 constant NUM_SMALL_IPA_TRANSCRIPT_EVALS = 4; +// Instantiation + +library FrLib { + bytes4 internal constant FRLIB_MODEXP_FAILED_SELECTOR = 0x1f7ec5f0; + + function invert(Fr value) internal view returns (Fr) { + uint256 v = Fr.unwrap(value); + require(v != 0, Errors.InvertOfZero()); + + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), v) + mstore(add(free, 0x80), sub(MODULUS, 2)) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function pow(Fr base, uint256 v) internal view returns (Fr) { + uint256 b = Fr.unwrap(base); + // Only works for power of 2 + require(v > 0 && (v & (v - 1)) == 0, Errors.NotPowerOfTwo()); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), b) + mstore(add(free, 0x80), v) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function div(Fr numerator, Fr denominator) internal view returns (Fr) { + unchecked { + return numerator * invert(denominator); + } + } + + function sqr(Fr value) internal pure returns (Fr) { + unchecked { + return value * value; + } + } + + function unwrap(Fr value) internal pure returns (uint256) { + unchecked { + return Fr.unwrap(value); + } + } + + function neg(Fr value) internal pure returns (Fr) { + unchecked { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } + } + + function from(uint256 value) internal pure returns (Fr) { + unchecked { + require(value < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(value); + } + } + + function fromBytes32(bytes32 value) internal pure returns (Fr) { + unchecked { + uint256 v = uint256(value); + require(v < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(v); + } + } + + function toBytes32(Fr value) internal pure returns (bytes32) { + unchecked { + return bytes32(Fr.unwrap(value)); + } + } +} + +// Free functions +function add(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function mul(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(mulmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function sub(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), MODULUS - Fr.unwrap(b), MODULUS)); + } +} + +function notEqual(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) != Fr.unwrap(b); + } +} + +function equal(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) == Fr.unwrap(b); + } +} + +uint256 constant CONST_PROOF_SIZE_LOG_N = 25; + +uint256 constant NUMBER_OF_SUBRELATIONS = 29; +uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; +uint256 constant ZK_BATCHED_RELATION_PARTIAL_LENGTH = 9; +uint256 constant NUMBER_OF_ENTITIES = 41; +// The number of entities added for ZK (gemini_masking_poly) +uint256 constant NUM_MASKING_POLYNOMIALS = 1; +uint256 constant NUMBER_OF_ENTITIES_ZK = NUMBER_OF_ENTITIES + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_UNSHIFTED = 36; +uint256 constant NUMBER_UNSHIFTED_ZK = NUMBER_UNSHIFTED + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; +uint256 constant PAIRING_POINTS_SIZE = 8; + +uint256 constant FIELD_ELEMENT_SIZE = 0x20; +uint256 constant GROUP_ELEMENT_SIZE = 0x40; + +// Powers of alpha used to batch subrelations (alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)) +uint256 constant NUMBER_OF_ALPHAS = NUMBER_OF_SUBRELATIONS - 1; + +// Must match UltraFlavor_Generated::EntityId order. +enum WIRE { + SIGMA_1, + SIGMA_2, + SIGMA_3, + SIGMA_4, + ID_1, + ID_2, + ID_3, + ID_4, + LAGRANGE_FIRST, + LAGRANGE_LAST, + Q_LOOKUP, + TABLE_1, + TABLE_2, + TABLE_3, + TABLE_4, + Q_M, + Q_R, + Q_O, + Q_C, + Q_L, + Q_4, + Q_ARITH, + Q_RANGE, + Q_ELLIPTIC, + Q_MEMORY, + Q_NNF, + Q_POSEIDON2_EXTERNAL, + Q_POSEIDON2_INTERNAL, + W_L, + W_R, + W_O, + W_4, + Z_PERM, + LOOKUP_INVERSES, + LOOKUP_READ_COUNTS, + LOOKUP_READ_TAGS, + W_L_SHIFT, + W_R_SHIFT, + W_O_SHIFT, + W_4_SHIFT, + Z_PERM_SHIFT +} + +library Honk { + struct G1Point { + uint256 x; + uint256 y; + } + + struct VerificationKey { + // Misc Params + uint256 circuitSize; + uint256 logCircuitSize; + uint256 publicInputsSize; + // Selectors + G1Point qm; + G1Point qc; + G1Point ql; + G1Point qr; + G1Point qo; + G1Point q4; + G1Point qLookup; // Lookup + G1Point qArith; // Arithmetic widget + G1Point qDeltaRange; // Delta Range sort + G1Point qMemory; // Memory + G1Point qNnf; // Non-native Field + G1Point qElliptic; // Auxillary + G1Point qPoseidon2External; + G1Point qPoseidon2Internal; + // Copy constraints + G1Point s1; + G1Point s2; + G1Point s3; + G1Point s4; + // Copy identity + G1Point id1; + G1Point id2; + G1Point id3; + G1Point id4; + // Precomputed lookup table + G1Point t1; + G1Point t2; + G1Point t3; + G1Point t4; + // Fixed first and last + G1Point lagrangeFirst; + G1Point lagrangeLast; + } + + struct RelationParameters { + // challenges + Fr eta; + Fr beta; + Fr gamma; + // derived + Fr publicInputsDelta; + } + + struct Proof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // Free wires + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Lookup helpers - Permutations + G1Point zPerm; + // Lookup helpers - logup + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Sumcheck + Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + G1Point shplonkQ; + G1Point kzgQuotient; + } + + /// forge-lint: disable-next-item(pascal-case-struct) + struct ZKProof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // ZK: Gemini masking polynomial commitment (sent first, right after public inputs) + G1Point geminiMaskingPoly; + // Commitments to wire polynomials + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Commitments to logup witness polynomials + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Commitment to grand permutation polynomial + G1Point zPerm; + G1Point[3] libraCommitments; + // Sumcheck + Fr libraSum; + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr libraEvaluation; + Fr[NUMBER_OF_ENTITIES_ZK] sumcheckEvaluations; // Includes gemini_masking_poly eval at index 0 (first position) + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Fr[4] libraPolyEvals; + G1Point shplonkQ; + G1Point kzgQuotient; + } +} + +// ZKTranscript library to generate fiat shamir challenges, the ZK transcript only differest +/// forge-lint: disable-next-item(pascal-case-struct) +struct ZKTranscript { + // Oink + Honk.RelationParameters relationParameters; + Fr[NUMBER_OF_ALPHAS] alphas; // Powers of alpha: [alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)] + Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; + // Sumcheck + Fr libraChallenge; + Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; + // Shplemini + Fr rho; + Fr geminiR; + Fr shplonkNu; + Fr shplonkZ; + // Derived + Fr publicInputsDelta; +} + +library ZKTranscriptLib { + function generateTranscript( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + uint256 logN + ) external pure returns (ZKTranscript memory t) { + Fr previousChallenge; + ( + t.relationParameters, + previousChallenge + ) = generateRelationParametersChallenges( + proof, + publicInputs, + vkHash, + publicInputsSize, + previousChallenge + ); + + (t.alphas, previousChallenge) = generateAlphaChallenges( + previousChallenge, + proof + ); + + (t.gateChallenges, previousChallenge) = generateGateChallenges( + previousChallenge, + logN + ); + (t.libraChallenge, previousChallenge) = generateLibraChallenge( + previousChallenge, + proof + ); + (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges( + proof, + previousChallenge, + logN + ); + + (t.rho, previousChallenge) = generateRhoChallenge( + proof, + previousChallenge + ); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge( + proof, + previousChallenge + ); + return t; + } + + function splitChallenge( + Fr challenge + ) internal pure returns (Fr first, Fr second) { + uint256 challengeU256 = uint256(Fr.unwrap(challenge)); + // Split into two equal 127-bit chunks (254/2) + uint256 lo = challengeU256 & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // 127 bits + uint256 hi = challengeU256 >> 127; + first = FrLib.from(lo); + second = FrLib.from(hi); + } + + function generateRelationParametersChallenges( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + Fr previousChallenge + ) + internal + pure + returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) + { + (rp.eta, previousChallenge) = generateEtaChallenge( + proof, + publicInputs, + vkHash, + publicInputsSize + ); + + ( + rp.beta, + rp.gamma, + nextPreviousChallenge + ) = generateBetaGammaChallenges(previousChallenge, proof); + } + + function generateEtaChallenge( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize + ) internal pure returns (Fr eta, Fr previousChallenge) { + // Size: 1 (vkHash) + publicInputsSize + 8 (geminiMask(2) + 3 wires(6)) + bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 8); + round0[0] = bytes32(vkHash); + + for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) { + require(uint256(publicInputs[i]) < P, Errors.ValueGeFieldOrder()); + round0[1 + i] = publicInputs[i]; + } + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib + .toBytes32(proof.pairingPointObject[i]); + } + + // For ZK flavors: hash the gemini masking poly commitment (sent right after public inputs) + round0[1 + publicInputsSize] = bytes32(proof.geminiMaskingPoly.x); + round0[1 + publicInputsSize + 1] = bytes32(proof.geminiMaskingPoly.y); + + // Create the first challenge + // Note: w4 is added to the challenge later on + round0[1 + publicInputsSize + 2] = bytes32(proof.w1.x); + round0[1 + publicInputsSize + 3] = bytes32(proof.w1.y); + round0[1 + publicInputsSize + 4] = bytes32(proof.w2.x); + round0[1 + publicInputsSize + 5] = bytes32(proof.w2.y); + round0[1 + publicInputsSize + 6] = bytes32(proof.w3.x); + round0[1 + publicInputsSize + 7] = bytes32(proof.w3.y); + + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round0))) % P + ); + (eta, ) = splitChallenge(previousChallenge); + } + + function generateBetaGammaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) { + bytes32[7] memory round1; + round1[0] = FrLib.toBytes32(previousChallenge); + round1[1] = bytes32(proof.lookupReadCounts.x); + round1[2] = bytes32(proof.lookupReadCounts.y); + round1[3] = bytes32(proof.lookupReadTags.x); + round1[4] = bytes32(proof.lookupReadTags.y); + round1[5] = bytes32(proof.w4.x); + round1[6] = bytes32(proof.w4.y); + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round1))) % P + ); + (beta, gamma) = splitChallenge(nextPreviousChallenge); + } + + // Alpha challenges non-linearise the gate contributions + function generateAlphaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) + internal + pure + returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) + { + // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup + uint256[5] memory alpha0; + alpha0[0] = Fr.unwrap(previousChallenge); + alpha0[1] = proof.lookupInverses.x; + alpha0[2] = proof.lookupInverses.y; + alpha0[3] = proof.zPerm.x; + alpha0[4] = proof.zPerm.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(alpha0))) % P + ); + Fr alpha; + (alpha, ) = splitChallenge(nextPreviousChallenge); + + // Compute powers of alpha for batching subrelations + alphas[0] = alpha; + for (uint256 i = 1; i < NUMBER_OF_ALPHAS; i++) { + alphas[i] = alphas[i - 1] * alpha; + } + } + + function generateGateChallenges( + Fr previousChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, + Fr nextPreviousChallenge + ) + { + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))) % + P + ); + (gateChallenges[0], ) = splitChallenge(previousChallenge); + for (uint256 i = 1; i < logN; i++) { + gateChallenges[i] = gateChallenges[i - 1] * gateChallenges[i - 1]; + } + nextPreviousChallenge = previousChallenge; + } + + function generateLibraChallenge( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr libraChallenge, Fr nextPreviousChallenge) { + // 2 comm, 1 sum, 1 challenge + uint256[4] memory challengeData; + challengeData[0] = Fr.unwrap(previousChallenge); + challengeData[1] = proof.libraCommitments[0].x; + challengeData[2] = proof.libraCommitments[0].y; + challengeData[3] = Fr.unwrap(proof.libraSum); + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(challengeData))) % P + ); + (libraChallenge, ) = splitChallenge(nextPreviousChallenge); + } + + function generateSumcheckChallenges( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, + Fr nextPreviousChallenge + ) + { + for (uint256 i = 0; i < logN; i++) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH + 1] memory univariateChal; + univariateChal[0] = prevChallenge; + + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + univariateChal[j + 1] = proof.sumcheckUnivariates[i][j]; + } + prevChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(univariateChal))) % P + ); + + (sumcheckChallenges[i], ) = splitChallenge(prevChallenge); + } + nextPreviousChallenge = prevChallenge; + } + + // We add Libra claimed eval + 2 libra commitments (grand_sum, quotient) + function generateRhoChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr rho, Fr nextPreviousChallenge) { + uint256[NUMBER_OF_ENTITIES_ZK + 6] memory rhoChallengeElements; + rhoChallengeElements[0] = Fr.unwrap(prevChallenge); + uint256 i; + for (i = 1; i <= NUMBER_OF_ENTITIES_ZK; i++) { + rhoChallengeElements[i] = Fr.unwrap( + proof.sumcheckEvaluations[i - 1] + ); + } + rhoChallengeElements[i] = Fr.unwrap(proof.libraEvaluation); + i += 1; + rhoChallengeElements[i] = proof.libraCommitments[1].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[1].y; + i += 2; + rhoChallengeElements[i] = proof.libraCommitments[2].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[2].y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(rhoChallengeElements))) % P + ); + (rho, ) = splitChallenge(nextPreviousChallenge); + } + + function generateGeminiRChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr geminiR, Fr nextPreviousChallenge) { + uint256[] memory gR = new uint256[]((logN - 1) * 2 + 1); + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < logN - 1; i++) { + gR[1 + i * 2] = proof.geminiFoldComms[i].x; + gR[2 + i * 2] = proof.geminiFoldComms[i].y; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(gR))) % P + ); + + (geminiR, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr shplonkNu, Fr nextPreviousChallenge) { + uint256[] memory shplonkNuChallengeElements = new uint256[]( + logN + 1 + 4 + ); + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 1; i <= logN; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.geminiAEvaluations[i - 1] + ); + } + + uint256 libraIdx = 0; + for (uint256 i = logN + 1; i <= logN + 4; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.libraPolyEvals[libraIdx] + ); + libraIdx++; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkNuChallengeElements))) % P + ); + (shplonkNu, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr shplonkZ, Fr nextPreviousChallenge) { + uint256[3] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x; + shplonkZChallengeElements[2] = proof.shplonkQ.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkZChallengeElements))) % P + ); + (shplonkZ, ) = splitChallenge(nextPreviousChallenge); + } + + function loadProof( + bytes calldata proof, + uint256 logN + ) internal pure returns (Honk.ZKProof memory p) { + uint256 boundary = 0x0; + + // Pairing point object + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + uint256 limb = uint256( + bytes32(proof[boundary:boundary + FIELD_ELEMENT_SIZE]) + ); + // lo limbs (even index) < 2^136, hi limbs (odd index) < 2^120 + require( + limb < 2 ** (i % 2 == 0 ? 136 : 120), + Errors.ValueGeLimbMax() + ); + p.pairingPointObject[i] = FrLib.from(limb); + boundary += FIELD_ELEMENT_SIZE; + } + + // Gemini masking polynomial commitment (sent first in ZK flavors, right after pairing points) + p.geminiMaskingPoly = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Commitments + p.w1 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w2 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w3 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + + // Lookup / Permutation Helper Commitments + p.lookupReadCounts = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.lookupReadTags = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.w4 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.lookupInverses = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.zPerm = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[0] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + p.libraSum = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + // Sumcheck univariates + for (uint256 i = 0; i < logN; i++) { + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + p.sumcheckUnivariates[i][j] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + } + + // Sumcheck evaluations (includes gemini_masking_poly eval at index 0 for ZK flavors) + for (uint256 i = 0; i < NUMBER_OF_ENTITIES_ZK; i++) { + p.sumcheckEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + p.libraEvaluation = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + + p.libraCommitments[1] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[2] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < logN - 1; i++) { + p.geminiFoldComms[i] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + } + + // Read gemini a evaluations + for (uint256 i = 0; i < logN; i++) { + p.geminiAEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + for (uint256 i = 0; i < 4; i++) { + p.libraPolyEvals[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + // Shplonk + p.shplonkQ = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + // KZG + p.kzgQuotient = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + } +} + +library RelationsLib { + struct EllipticParams { + // Points + Fr x_1; + Fr y_1; + Fr x_2; + Fr y_2; + Fr y_3; + Fr x_3; + // push accumulators into memory + Fr x_double_identity; + } + + // Parameters used within the Memory Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct MemParams { + Fr memory_record_check; + Fr partial_record_check; + Fr next_gate_access_type; + Fr record_delta; + Fr index_delta; + Fr adjacent_values_match_if_adjacent_indices_match; + Fr adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + Fr access_check; + Fr next_gate_access_type_is_boolean; + Fr ROM_consistency_check_identity; + Fr RAM_consistency_check_identity; + Fr timestamp_delta; + Fr RAM_timestamp_check_identity; + Fr memory_identity; + Fr index_is_monotonically_increasing; + } + + // Parameters used within the Non-Native Field Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct NnfParams { + Fr limb_subproduct; + Fr non_native_field_gate_1; + Fr non_native_field_gate_2; + Fr non_native_field_gate_3; + Fr limb_accumulator_1; + Fr limb_accumulator_2; + Fr nnf_identity; + } + + struct PoseidonExternalParams { + Fr s1; + Fr s2; + Fr s3; + Fr s4; + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr t0; + Fr t1; + Fr t2; + Fr t3; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr q_pos_by_scaling; + } + + struct PoseidonInternalParams { + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr u_sum; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr s1; + Fr q_pos_by_scaling; + } + + Fr internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = Fr.wrap(17); // -(-17) + uint256 internal constant NEG_HALF_MODULO_P = + 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + + // Constants for the Non-native Field relation + Fr internal constant LIMB_SIZE = Fr.wrap(uint256(1) << 68); + Fr internal constant SUBLIMB_SHIFT = Fr.wrap(uint256(1) << 14); + + function accumulateRelationEvaluations( + Fr[NUMBER_OF_ENTITIES] memory purportedEvaluations, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges, + Fr powPartialEval + ) external pure returns (Fr accumulator) { + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations; + + // Accumulate all relations in Ultra Honk - each with varying number of subrelations + accumulateArithmeticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePermutationRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateLogDerivativeLookupRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateDeltaRangeRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateEllipticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateMemoryRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateNnfRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonExternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonInternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + + // batch the subrelations with the precomputed alpha powers to obtain the full honk relation + accumulator = scaleAndBatchSubrelations( + evaluations, + subrelationChallenges + ); + } + + /** + * Aesthetic helper function that is used to index by enum into proof.sumcheckEvaluations, it avoids + * the relation checking code being cluttered with uint256 type casting, which is often a different colour in code + * editors, and thus is noisy. + */ + function wire( + Fr[NUMBER_OF_ENTITIES] memory p, + WIRE _wire + ) internal pure returns (Fr) { + return p[uint256(_wire)]; + } + + /** + * Ultra Arithmetic Relation + * + */ + function accumulateArithmeticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + // Relation 0 + Fr q_arith = wire(p, WIRE.Q_ARITH); + { + Fr neg_half = Fr.wrap(NEG_HALF_MODULO_P); + + Fr accum = (q_arith - Fr.wrap(3)) * + (wire(p, WIRE.Q_M) * wire(p, WIRE.W_R) * wire(p, WIRE.W_L)) * + neg_half; + accum = + accum + + (wire(p, WIRE.Q_L) * wire(p, WIRE.W_L)) + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_R)) + + (wire(p, WIRE.Q_O) * wire(p, WIRE.W_O)) + + (wire(p, WIRE.Q_4) * wire(p, WIRE.W_4)) + + wire(p, WIRE.Q_C); + accum = accum + (q_arith - ONE) * wire(p, WIRE.W_4_SHIFT); + accum = accum * q_arith; + accum = accum * domainSep; + evals[6] = accum; + } + + // Relation 1 + { + Fr accum = wire(p, WIRE.W_L) + + wire(p, WIRE.W_4) - + wire(p, WIRE.W_L_SHIFT) + + wire(p, WIRE.Q_M); + accum = accum * (q_arith - Fr.wrap(2)); + accum = accum * (q_arith - ONE); + accum = accum * q_arith; + accum = accum * domainSep; + evals[7] = accum; + } + } + + function accumulatePermutationRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr grand_product_numerator; + Fr grand_product_denominator; + + { + Fr num = wire(p, WIRE.W_L) + + wire(p, WIRE.ID_1) * + rp.beta + + rp.gamma; + num = + num * + (wire(p, WIRE.W_R) + wire(p, WIRE.ID_2) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_O) + wire(p, WIRE.ID_3) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_4) + wire(p, WIRE.ID_4) * rp.beta + rp.gamma); + + grand_product_numerator = num; + } + { + Fr den = wire(p, WIRE.W_L) + + wire(p, WIRE.SIGMA_1) * + rp.beta + + rp.gamma; + den = + den * + (wire(p, WIRE.W_R) + + wire(p, WIRE.SIGMA_2) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_O) + + wire(p, WIRE.SIGMA_3) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_4) + + wire(p, WIRE.SIGMA_4) * + rp.beta + + rp.gamma); + + grand_product_denominator = den; + } + + // Contribution 2 + { + Fr acc = (wire(p, WIRE.Z_PERM) + wire(p, WIRE.LAGRANGE_FIRST)) * + grand_product_numerator; + + acc = + acc - + ((wire(p, WIRE.Z_PERM_SHIFT) + + (wire(p, WIRE.LAGRANGE_LAST) * rp.publicInputsDelta)) * + grand_product_denominator); + acc = acc * domainSep; + evals[0] = acc; + } + + // Contribution 3 + { + Fr acc = (wire(p, WIRE.LAGRANGE_LAST) * + wire(p, WIRE.Z_PERM_SHIFT)) * domainSep; + evals[1] = acc; + } + + // Contribution 4: z_perm initialization check (lagrange_first * z_perm = 0) + { + Fr acc = (wire(p, WIRE.LAGRANGE_FIRST) * wire(p, WIRE.Z_PERM)) * + domainSep; + evals[2] = acc; + } + } + + function accumulateLogDerivativeLookupRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr table_term; + Fr lookup_term; + + // Calculate the write term (the table accumulation) + // table_term = table_1 + γ + table_2 * β + table_3 * β² + table_4 * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + table_term = + wire(p, WIRE.TABLE_1) + + rp.gamma + + (wire(p, WIRE.TABLE_2) * rp.beta) + + (wire(p, WIRE.TABLE_3) * beta_sqr) + + (wire(p, WIRE.TABLE_4) * beta_sqr * rp.beta); + } + + // Calculate the read term + // lookup_term = derived_entry_1 + γ + derived_entry_2 * β + derived_entry_3 * β² + q_index * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + Fr derived_entry_1 = wire(p, WIRE.W_L) + + rp.gamma + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_L_SHIFT)); + Fr derived_entry_2 = wire(p, WIRE.W_R) + + wire(p, WIRE.Q_M) * + wire(p, WIRE.W_R_SHIFT); + Fr derived_entry_3 = wire(p, WIRE.W_O) + + wire(p, WIRE.Q_C) * + wire(p, WIRE.W_O_SHIFT); + + lookup_term = + derived_entry_1 + + (derived_entry_2 * rp.beta) + + (derived_entry_3 * beta_sqr) + + (wire(p, WIRE.Q_O) * beta_sqr * rp.beta); + } + + Fr lookup_inverse = wire(p, WIRE.LOOKUP_INVERSES) * table_term; + Fr table_inverse = wire(p, WIRE.LOOKUP_INVERSES) * lookup_term; + + Fr inverse_exists_xor = wire(p, WIRE.LOOKUP_READ_TAGS) + + wire(p, WIRE.Q_LOOKUP) - + (wire(p, WIRE.LOOKUP_READ_TAGS) * wire(p, WIRE.Q_LOOKUP)); + + // Inverse calculated correctly relation + Fr accumulatorNone = lookup_term * + table_term * + wire(p, WIRE.LOOKUP_INVERSES) - + inverse_exists_xor; + accumulatorNone = accumulatorNone * domainSep; + + // Inverse + Fr accumulatorOne = wire(p, WIRE.Q_LOOKUP) * + lookup_inverse - + wire(p, WIRE.LOOKUP_READ_COUNTS) * + table_inverse; + + Fr read_tag = wire(p, WIRE.LOOKUP_READ_TAGS); + + Fr read_tag_boolean_relation = read_tag * read_tag - read_tag; + + evals[3] = accumulatorNone; + evals[4] = accumulatorOne; + evals[5] = read_tag_boolean_relation * domainSep; + } + + function accumulateDeltaRangeRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr minus_one = ZERO - ONE; + Fr minus_two = ZERO - Fr.wrap(2); + Fr minus_three = ZERO - Fr.wrap(3); + + // Compute wire differences + Fr delta_1 = wire(p, WIRE.W_R) - wire(p, WIRE.W_L); + Fr delta_2 = wire(p, WIRE.W_O) - wire(p, WIRE.W_R); + Fr delta_3 = wire(p, WIRE.W_4) - wire(p, WIRE.W_O); + Fr delta_4 = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_4); + + // Contribution 6 + { + Fr acc = delta_1; + acc = acc * (delta_1 + minus_one); + acc = acc * (delta_1 + minus_two); + acc = acc * (delta_1 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[8] = acc; + } + + // Contribution 7 + { + Fr acc = delta_2; + acc = acc * (delta_2 + minus_one); + acc = acc * (delta_2 + minus_two); + acc = acc * (delta_2 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[9] = acc; + } + + // Contribution 8 + { + Fr acc = delta_3; + acc = acc * (delta_3 + minus_one); + acc = acc * (delta_3 + minus_two); + acc = acc * (delta_3 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[10] = acc; + } + + // Contribution 9 + { + Fr acc = delta_4; + acc = acc * (delta_4 + minus_one); + acc = acc * (delta_4 + minus_two); + acc = acc * (delta_4 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[11] = acc; + } + } + + function accumulateEllipticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + EllipticParams memory ep; + ep.x_1 = wire(p, WIRE.W_R); + ep.y_1 = wire(p, WIRE.W_O); + + ep.x_2 = wire(p, WIRE.W_L_SHIFT); + ep.y_2 = wire(p, WIRE.W_4_SHIFT); + ep.y_3 = wire(p, WIRE.W_O_SHIFT); + ep.x_3 = wire(p, WIRE.W_R_SHIFT); + + Fr q_sign = wire(p, WIRE.Q_L); + Fr q_is_double = wire(p, WIRE.Q_M); + + // Contribution 10 point addition, x-coordinate check + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + Fr x_diff = (ep.x_2 - ep.x_1); + Fr y1_sqr = (ep.y_1 * ep.y_1); + { + // Move to top + Fr partialEval = domainSep; + + Fr y2_sqr = (ep.y_2 * ep.y_2); + Fr y1y2 = ep.y_1 * ep.y_2 * q_sign; + Fr x_add_identity = (ep.x_3 + ep.x_2 + ep.x_1); + x_add_identity = x_add_identity * x_diff * x_diff; + x_add_identity = x_add_identity - y2_sqr - y1_sqr + y1y2 + y1y2; + + evals[12] = + x_add_identity * + partialEval * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 11 point addition, x-coordinate check + // q_elliptic * (q_sign * y1 + y3)(x2 - x1) + (x3 - x1)(y2 - q_sign * y1) = 0 + { + Fr y1_plus_y3 = ep.y_1 + ep.y_3; + Fr y_diff = ep.y_2 * q_sign - ep.y_1; + Fr y_add_identity = y1_plus_y3 * + x_diff + + (ep.x_3 - ep.x_1) * + y_diff; + evals[13] = + y_add_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 10 point doubling, x-coordinate check + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + // N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 + { + Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; + Fr y1_sqr_mul_4 = y1_sqr + y1_sqr; + y1_sqr_mul_4 = y1_sqr_mul_4 + y1_sqr_mul_4; + Fr x1_pow_4_mul_9 = x_pow_4 * Fr.wrap(9); + + // NOTE: pushed into memory (stack >:'( ) + ep.x_double_identity = + (ep.x_3 + ep.x_1 + ep.x_1) * + y1_sqr_mul_4 - + x1_pow_4_mul_9; + + Fr acc = ep.x_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + evals[12] = evals[12] + acc; + } + + // Contribution 11 point doubling, y-coordinate check + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + { + Fr x1_sqr_mul_3 = (ep.x_1 + ep.x_1 + ep.x_1) * ep.x_1; + Fr y_double_identity = x1_sqr_mul_3 * + (ep.x_1 - ep.x_3) - + (ep.y_1 + ep.y_1) * + (ep.y_1 + ep.y_3); + evals[13] = + evals[13] + + y_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + } + } + + function accumulateMemoryRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + MemParams memory ap; + + // Compute eta powers locally + Fr eta_two = rp.eta * rp.eta; + Fr eta_three = eta_two * rp.eta; + + /** + * MEMORY + * + * A RAM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * t: `timestamp` of memory cell being accessed (used for RAM, set to 0 for ROM) + * * v: `value` of memory cell being accessed + * * a: `access` type of record. read: 0 = read, 1 = write + * * r: `record` of memory cell. record = access + index * eta + timestamp * eta_two + value * eta_three + * + * A ROM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * v: `value1` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * v2:`value2` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * r: `record` of memory cell. record = index * eta + value2 * eta_two + value1 * eta_three + * + * When performing a read/write access, the values of i, t, v, v2, a, r are stored in the following wires + + * selectors, depending on whether the gate is a RAM read/write or a ROM read + * + * | gate type | i | v2/t | v | a | r | + * | --------- | -- | ----- | -- | -- | -- | + * | ROM | w1 | w2 | w3 | -- | w4 | + * | RAM | w1 | w2 | w3 | qc | w4 | + * + * (for accesses where `index` is a circuit constant, it is assumed the circuit will apply a copy constraint on + * `w2` to fix its value) + * + * + */ + + /** + * Memory Record Check + * Partial degree: 1 + * Total degree: 4 + * + * A ROM/ROM access gate can be evaluated with the identity: + * + * qc + w1 \eta + w2 \eta_two + w3 \eta_three - w4 = 0 + * + * For ROM gates, qc = 0 + */ + ap.memory_record_check = wire(p, WIRE.W_O) * eta_three; + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_R) * eta_two); + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_L) * rp.eta); + ap.memory_record_check = ap.memory_record_check + wire(p, WIRE.Q_C); + ap.partial_record_check = ap.memory_record_check; // used in RAM consistency check; deg 1 or 4 + ap.memory_record_check = ap.memory_record_check - wire(p, WIRE.W_4); + + /** + * Contribution 13 & 14 + * ROM Consistency Check + * Partial degree: 1 + * Total degree: 4 + * + * For every ROM read, a set equivalence check is applied between the record witnesses, and a second set of + * records that are sorted. + * + * We apply the following checks for the sorted records: + * + * 1. w1, w2, w3 correctly map to 'index', 'v1, 'v2' for a given record value at w4 + * 2. index values for adjacent records are monotonically increasing + * 3. if, at gate i, index_i == index_{i + 1}, then value1_i == value1_{i + 1} and value2_i == value2_{i + 1} + * + */ + ap.index_delta = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_L); + ap.record_delta = wire(p, WIRE.W_4_SHIFT) - wire(p, WIRE.W_4); + + ap.index_is_monotonically_increasing = + ap.index_delta * + (ap.index_delta - Fr.wrap(1)); // deg 2 + + ap.adjacent_values_match_if_adjacent_indices_match = + (ap.index_delta * MINUS_ONE + ONE) * + ap.record_delta; // deg 2 + + evals[15] = + ap.adjacent_values_match_if_adjacent_indices_match * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + evals[16] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + + ap.ROM_consistency_check_identity = + ap.memory_record_check * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)); // deg 3 or 7 + + /** + * Contributions 15,16,17 + * RAM Consistency Check + * + * The 'access' type of the record is extracted with the expression `w_4 - ap.partial_record_check` + * (i.e. for an honest Prover `w1 * eta + w2 * eta^2 + w3 * eta^3 - w4 = access`. + * This is validated by requiring `access` to be boolean + * + * For two adjacent entries in the sorted list if _both_ + * A) index values match + * B) adjacent access value is 0 (i.e. next gate is a READ) + * then + * C) both values must match. + * The gate boolean check is + * (A && B) => C === !(A && B) || C === !A || !B || C + * + * N.B. it is the responsibility of the circuit writer to ensure that every RAM cell is initialized + * with a WRITE operation. + */ + Fr access_type = (wire(p, WIRE.W_4) - ap.partial_record_check); // will be 0 or 1 for honest Prover; deg 1 or 4 + ap.access_check = access_type * (access_type - Fr.wrap(1)); // check value is 0 or 1; deg 2 or 8 + + // reverse order we could re-use `ap.partial_record_check` 1 - ((w3' * eta + w2') * eta + w1') * eta + // deg 1 or 4 + ap.next_gate_access_type = wire(p, WIRE.W_O_SHIFT) * eta_three; + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_R_SHIFT) * eta_two); + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_L_SHIFT) * rp.eta); + ap.next_gate_access_type = + wire(p, WIRE.W_4_SHIFT) - + ap.next_gate_access_type; + + Fr value_delta = wire(p, WIRE.W_O_SHIFT) - wire(p, WIRE.W_O); + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = + (ap.index_delta * MINUS_ONE + ONE) * + value_delta * + (ap.next_gate_access_type * MINUS_ONE + ONE); // deg 3 or 6 + + // We can't apply the RAM consistency check identity on the final entry in the sorted list (the wires in the + // next gate would make the identity fail). We need to validate that its 'access type' bool is correct. Can't + // do with an arithmetic gate because of the `eta` factors. We need to check that the *next* gate's access + // type is correct, to cover this edge case + // deg 2 or 4 + ap.next_gate_access_type_is_boolean = + ap.next_gate_access_type * + ap.next_gate_access_type - + ap.next_gate_access_type; + + // Putting it all together... + evals[17] = + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 or 8 + evals[18] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 + evals[19] = + ap.next_gate_access_type_is_boolean * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 6 + + ap.RAM_consistency_check_identity = + ap.access_check * + (wire(p, WIRE.Q_O)); // deg 3 or 9 + + /** + * RAM Timestamp Consistency Check + * + * | w1 | w2 | w3 | w4 | + * | index | timestamp | timestamp_check | -- | + * + * Let delta_index = index_{i + 1} - index_{i} + * + * Iff delta_index == 0, timestamp_check = timestamp_{i + 1} - timestamp_i + * Else timestamp_check = 0 + */ + ap.timestamp_delta = wire(p, WIRE.W_R_SHIFT) - wire(p, WIRE.W_R); + ap.RAM_timestamp_check_identity = + (ap.index_delta * MINUS_ONE + ONE) * + ap.timestamp_delta - + wire(p, WIRE.W_O); // deg 3 + + /** + * Complete Contribution 12 + * The complete RAM/ROM memory identity + * Partial degree: + */ + ap.memory_identity = ap.ROM_consistency_check_identity; // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_timestamp_check_identity * + (wire(p, WIRE.Q_4) * wire(p, WIRE.Q_L)); // deg 4 + ap.memory_identity = + ap.memory_identity + + ap.memory_record_check * + (wire(p, WIRE.Q_M) * wire(p, WIRE.Q_L)); // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_consistency_check_identity; // deg 3 or 9 + + // (deg 3 or 9) + (deg 4) + (deg 3) + ap.memory_identity = + ap.memory_identity * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 10 + evals[14] = ap.memory_identity; + } + + function accumulateNnfRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + NnfParams memory ap; + + /** + * Contribution 12 + * Non native field arithmetic gate 2 + * deg 4 + * + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * + */ + ap.limb_subproduct = + wire(p, WIRE.W_L) * + wire(p, WIRE.W_R_SHIFT) + + wire(p, WIRE.W_L_SHIFT) * + wire(p, WIRE.W_R); + ap.non_native_field_gate_2 = (wire(p, WIRE.W_L) * + wire(p, WIRE.W_4) + + wire(p, WIRE.W_R) * + wire(p, WIRE.W_O) - + wire(p, WIRE.W_O_SHIFT)); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * LIMB_SIZE; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 - + wire(p, WIRE.W_4_SHIFT); + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 + + ap.limb_subproduct; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 * + wire(p, WIRE.Q_4); + + ap.limb_subproduct = ap.limb_subproduct * LIMB_SIZE; + ap.limb_subproduct = + ap.limb_subproduct + + (wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R_SHIFT)); + ap.non_native_field_gate_1 = ap.limb_subproduct; + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 - + (wire(p, WIRE.W_O) + wire(p, WIRE.W_4)); + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 * + wire(p, WIRE.Q_O); + + ap.non_native_field_gate_3 = ap.limb_subproduct; + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 + + wire(p, WIRE.W_4); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 - + (wire(p, WIRE.W_O_SHIFT) + wire(p, WIRE.W_4_SHIFT)); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 * + wire(p, WIRE.Q_M); + + Fr non_native_field_identity = ap.non_native_field_gate_1 + + ap.non_native_field_gate_2 + + ap.non_native_field_gate_3; + non_native_field_identity = + non_native_field_identity * + wire(p, WIRE.Q_R); + + // ((((w2' * 2^14 + w1') * 2^14 + w3) * 2^14 + w2) * 2^14 + w1 - w4) * qm + // deg 2 + ap.limb_accumulator_1 = wire(p, WIRE.W_R_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_O); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_R); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L); + ap.limb_accumulator_1 = ap.limb_accumulator_1 - wire(p, WIRE.W_4); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * wire(p, WIRE.Q_4); + + // ((((w3' * 2^14 + w2') * 2^14 + w1') * 2^14 + w4) * 2^14 + w3 - w4') * qm + // deg 2 + ap.limb_accumulator_2 = wire(p, WIRE.W_O_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_R_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_4); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_O); + ap.limb_accumulator_2 = ap.limb_accumulator_2 - wire(p, WIRE.W_4_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * wire(p, WIRE.Q_M); + + Fr limb_accumulator_identity = ap.limb_accumulator_1 + + ap.limb_accumulator_2; + limb_accumulator_identity = + limb_accumulator_identity * + wire(p, WIRE.Q_O); // deg 3 + + ap.nnf_identity = non_native_field_identity + limb_accumulator_identity; + ap.nnf_identity = ap.nnf_identity * (wire(p, WIRE.Q_NNF) * domainSep); + evals[20] = ap.nnf_identity; + } + + function accumulatePoseidonExternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonExternalParams memory ep; + + ep.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + ep.s2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_R); + ep.s3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_O); + ep.s4 = wire(p, WIRE.W_4) + wire(p, WIRE.Q_4); + + ep.u1 = ep.s1 * ep.s1 * ep.s1 * ep.s1 * ep.s1; + ep.u2 = ep.s2 * ep.s2 * ep.s2 * ep.s2 * ep.s2; + ep.u3 = ep.s3 * ep.s3 * ep.s3 * ep.s3 * ep.s3; + ep.u4 = ep.s4 * ep.s4 * ep.s4 * ep.s4 * ep.s4; + // matrix mul v = M_E * u with 14 additions + ep.t0 = ep.u1 + ep.u2; // u_1 + u_2 + ep.t1 = ep.u3 + ep.u4; // u_3 + u_4 + ep.t2 = ep.u2 + ep.u2 + ep.t1; // 2u_2 + // ep.t2 += ep.t1; // 2u_2 + u_3 + u_4 + ep.t3 = ep.u4 + ep.u4 + ep.t0; // 2u_4 + // ep.t3 += ep.t0; // u_1 + u_2 + 2u_4 + ep.v4 = ep.t1 + ep.t1; + ep.v4 = ep.v4 + ep.v4 + ep.t3; + // ep.v4 += ep.t3; // u_1 + u_2 + 4u_3 + 6u_4 + ep.v2 = ep.t0 + ep.t0; + ep.v2 = ep.v2 + ep.v2 + ep.t2; + // ep.v2 += ep.t2; // 4u_1 + 6u_2 + u_3 + u_4 + ep.v1 = ep.t3 + ep.v2; // 5u_1 + 7u_2 + u_3 + 3u_4 + ep.v3 = ep.t2 + ep.v4; // u_1 + 3u_2 + 5u_3 + 7u_4 + + ep.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_EXTERNAL) * domainSep; + evals[21] = + evals[21] + + ep.q_pos_by_scaling * + (ep.v1 - wire(p, WIRE.W_L_SHIFT)); + + evals[22] = + evals[22] + + ep.q_pos_by_scaling * + (ep.v2 - wire(p, WIRE.W_R_SHIFT)); + + evals[23] = + evals[23] + + ep.q_pos_by_scaling * + (ep.v3 - wire(p, WIRE.W_O_SHIFT)); + + evals[24] = + evals[24] + + ep.q_pos_by_scaling * + (ep.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + function accumulatePoseidonInternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonInternalParams memory ip; + + Fr[4] memory INTERNAL_MATRIX_DIAGONAL = [ + FrLib.from( + 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7 + ), + FrLib.from( + 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b + ), + FrLib.from( + 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15 + ), + FrLib.from( + 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b + ) + ]; + + // add round constants + ip.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + + // apply s-box round + ip.u1 = ip.s1 * ip.s1 * ip.s1 * ip.s1 * ip.s1; + ip.u2 = wire(p, WIRE.W_R); + ip.u3 = wire(p, WIRE.W_O); + ip.u4 = wire(p, WIRE.W_4); + + // matrix mul with v = M_I * u 4 muls and 7 additions + ip.u_sum = ip.u1 + ip.u2 + ip.u3 + ip.u4; + + ip.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_INTERNAL) * domainSep; + + ip.v1 = ip.u1 * INTERNAL_MATRIX_DIAGONAL[0] + ip.u_sum; + evals[25] = + evals[25] + + ip.q_pos_by_scaling * + (ip.v1 - wire(p, WIRE.W_L_SHIFT)); + + ip.v2 = ip.u2 * INTERNAL_MATRIX_DIAGONAL[1] + ip.u_sum; + evals[26] = + evals[26] + + ip.q_pos_by_scaling * + (ip.v2 - wire(p, WIRE.W_R_SHIFT)); + + ip.v3 = ip.u3 * INTERNAL_MATRIX_DIAGONAL[2] + ip.u_sum; + evals[27] = + evals[27] + + ip.q_pos_by_scaling * + (ip.v3 - wire(p, WIRE.W_O_SHIFT)); + + ip.v4 = ip.u4 * INTERNAL_MATRIX_DIAGONAL[3] + ip.u_sum; + evals[28] = + evals[28] + + ip.q_pos_by_scaling * + (ip.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + // Batch subrelation evaluations using precomputed powers of alpha + // First subrelation is implicitly scaled by 1, subsequent ones use powers from the subrelationChallenges array + function scaleAndBatchSubrelations( + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges + ) internal pure returns (Fr accumulator) { + accumulator = evaluations[0]; + + for (uint256 i = 1; i < NUMBER_OF_SUBRELATIONS; ++i) { + accumulator = + accumulator + + evaluations[i] * + subrelationChallenges[i - 1]; + } + } +} + +library CommitmentSchemeLib { + using FrLib for Fr; + + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + Fr unshiftedScalarNeg; + Fr shiftedScalarNeg; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Accumulator for powers of rho + Fr batchingChallenge; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchedEvaluation; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] denominators; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] batchingScalars; + // 1/(z - r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr posInvertedDenominator; + // 1/(z + r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr negInvertedDenominator; + // ν^{2i} * 1/(z - r^{2^i}) + Fr scalingFactorPos; + // ν^{2i+1} * 1/(z + r^{2^i}) + Fr scalingFactorNeg; + // Fold_i(r^{2^i}) reconstructed by Verifier + Fr[] foldPosEvaluations; + } + + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., m-1 + function computeFoldPosEvaluations( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckUChallenges, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[] memory geminiEvalChallengePowers, + uint256 logSize + ) internal view returns (Fr[] memory) { + Fr[] memory foldPosEvaluations = new Fr[](logSize); + for (uint256 i = logSize; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = sumcheckUChallenges[i - 1]; + + Fr batchedEvalRoundAcc = ((challengePower * + batchedEvalAccumulator * + Fr.wrap(2)) - + geminiEvaluations[i - 1] * + (challengePower * (ONE - u) - u)); + // Divide by the denominator + batchedEvalRoundAcc = + batchedEvalRoundAcc * + (challengePower * (ONE - u) + u).invert(); + + batchedEvalAccumulator = batchedEvalRoundAcc; + foldPosEvaluations[i - 1] = batchedEvalRoundAcc; + } + return foldPosEvaluations; + } + + function computeSquares( + Fr r, + uint256 logN + ) internal pure returns (Fr[] memory) { + Fr[] memory squares = new Fr[](logN); + squares[0] = r; + for (uint256 i = 1; i < logN; ++i) { + squares[i] = squares[i - 1].sqr(); + } + return squares; + } +} + +uint256 constant Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // EC group order. F_q + +// Fr utility + +function bytesToFr(bytes calldata proofSection) pure returns (Fr scalar) { + scalar = FrLib.fromBytes32(bytes32(proofSection)); +} + +// EC Point utilities +function bytesToG1Point( + bytes calldata proofSection +) pure returns (Honk.G1Point memory point) { + uint256 x = uint256(bytes32(proofSection[0x00:0x20])); + uint256 y = uint256(bytes32(proofSection[0x20:0x40])); + require(x < Q && y < Q, Errors.ValueGeGroupOrder()); + + // (0,0) is the canonical EIP-196 encoding of the identity. It is accepted here + // because polynomial commitments to identically-zero polynomials (e.g. unused + // selector or table polys) are legitimately the identity. On-curve validation + // (y² = x³ + 3) is handled by the ecAdd/ecMul precompiles per EIP-196. + point = Honk.G1Point({ x: x, y: y }); +} + +function negateInplace( + Honk.G1Point memory point +) pure returns (Honk.G1Point memory) { + // When y == 0 (order-2 point), negation is the same point. Q - 0 = Q which is >= Q. + if (point.y != 0) { + point.y = Q - point.y; + } + return point; +} + +/** + * Convert the pairing points to G1 points. + * + * The pairing points are serialised as an array of 2 limbs representing two points + * (P0 and P1, used for lhs and rhs of pairing operation). + * + * There are 2 limbs (lo, hi) for each coordinate, so 4 limbs per point, 8 total. + * Layout: [P0.x_lo, P0.x_hi, P0.y_lo, P0.y_hi, P1.x_lo, P1.x_hi, P1.y_lo, P1.y_hi] + * + * @param pairingPoints The pairing points to convert. + * @return lhs P0 point + * @return rhs P1 point + */ +function convertPairingPointsToG1( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (Honk.G1Point memory lhs, Honk.G1Point memory rhs) { + // P0 (lhs): x = lo | (hi << 136) + uint256 lhsX = Fr.unwrap(pairingPoints[0]); + lhsX |= Fr.unwrap(pairingPoints[1]) << 136; + + uint256 lhsY = Fr.unwrap(pairingPoints[2]); + lhsY |= Fr.unwrap(pairingPoints[3]) << 136; + + // P1 (rhs): x = lo | (hi << 136) + uint256 rhsX = Fr.unwrap(pairingPoints[4]); + rhsX |= Fr.unwrap(pairingPoints[5]) << 136; + + uint256 rhsY = Fr.unwrap(pairingPoints[6]); + rhsY |= Fr.unwrap(pairingPoints[7]) << 136; + + // Reconstructed coordinates must be < Q to prevent malleability. + // Without this, two different limb encodings could map to the same curve point + // (via mulmod reduction in on-curve checks) but produce different transcript hashes. + require( + lhsX < Q && lhsY < Q && rhsX < Q && rhsY < Q, + Errors.ValueGeGroupOrder() + ); + + lhs.x = lhsX; + lhs.y = lhsY; + rhs.x = rhsX; + rhs.y = rhsY; +} + +/** + * Hash the pairing inputs from the present verification context with those extracted from the public inputs. + * + * @param proofPairingPoints Pairing points from the proof - (public inputs). + * @param accLhs Accumulator point for the left side - result of shplemini. + * @param accRhs Accumulator point for the right side - result of shplemini. + * @return recursionSeparator The recursion separator - generated from hashing the above. + */ +function generateRecursionSeparator( + Fr[PAIRING_POINTS_SIZE] memory proofPairingPoints, + Honk.G1Point memory accLhs, + Honk.G1Point memory accRhs +) pure returns (Fr recursionSeparator) { + // hash the proof aggregated X + // hash the proof aggregated Y + // hash the accum X + // hash the accum Y + + ( + Honk.G1Point memory proofLhs, + Honk.G1Point memory proofRhs + ) = convertPairingPointsToG1(proofPairingPoints); + + uint256[8] memory recursionSeparatorElements; + + // Proof points + recursionSeparatorElements[0] = proofLhs.x; + recursionSeparatorElements[1] = proofLhs.y; + recursionSeparatorElements[2] = proofRhs.x; + recursionSeparatorElements[3] = proofRhs.y; + + // Accumulator points + recursionSeparatorElements[4] = accLhs.x; + recursionSeparatorElements[5] = accLhs.y; + recursionSeparatorElements[6] = accRhs.x; + recursionSeparatorElements[7] = accRhs.y; + + recursionSeparator = FrLib.from( + uint256(keccak256(abi.encodePacked(recursionSeparatorElements))) % P + ); +} + +/** + * G1 Mul with Separator + * Using the ecAdd and ecMul precompiles + * + * @param basePoint The point to multiply. + * @param other The other point to add. + * @param recursionSeperator The separator to use for the multiplication. + * @return `(recursionSeperator * basePoint) + other`. + */ +function mulWithSeperator( + Honk.G1Point memory basePoint, + Honk.G1Point memory other, + Fr recursionSeperator +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + result = ecMul(recursionSeperator, basePoint); + result = ecAdd(result, other); + + return result; +} + +/** + * G1 Mul + * Takes a Fr value and a G1 point and uses the ecMul precompile to return the result. + * + * @param value The value to multiply the point by. + * @param point The point to multiply. + * @return result The result of the multiplication. + */ +function ecMul( + Fr value, + Honk.G1Point memory point +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write the point into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | point.x + // free + 0x20| point.y + mstore(free, mload(point)) + mstore(add(free, 0x20), mload(add(point, 0x20))) + // Write the scalar into memory (one 32 byte word) + // Memory layout: + // Address | value + // free + 0x40| value + mstore(add(free, 0x40), value) + + // Call the ecMul precompile, it takes in the following + // [point.x, point.y, scalar], and returns the result back into the free memory location. + let success := staticcall(gas(), 0x07, free, 0x60, free, 0x40) + if iszero(success) { + revert(0, 0) + } + // Copy the result of the multiplication back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x60)) + } + + return result; +} + +/** + * G1 Add + * Takes two G1 points and uses the ecAdd precompile to return the result. + * + * @param lhs The left hand side of the addition. + * @param rhs The right hand side of the addition. + * @return result The result of the addition. + */ +function ecAdd( + Honk.G1Point memory lhs, + Honk.G1Point memory rhs +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write lhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | lhs.x + // free + 0x20| lhs.y + mstore(free, mload(lhs)) + mstore(add(free, 0x20), mload(add(lhs, 0x20))) + + // Write rhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free + 0x40| rhs.x + // free + 0x60| rhs.y + mstore(add(free, 0x40), mload(rhs)) + mstore(add(free, 0x60), mload(add(rhs, 0x20))) + + // Call the ecAdd precompile, it takes in the following + // [lhs.x, lhs.y, rhs.x, rhs.y], and returns their addition back into the free memory location. + let success := staticcall(gas(), 0x06, free, 0x80, free, 0x40) + if iszero(success) { + revert(0, 0) + } + + // Copy the result of the addition back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x80)) + } + + return result; +} + +function rejectPointAtInfinity(Honk.G1Point memory point) pure { + require((point.x | point.y) != 0, Errors.PointAtInfinity()); +} + +/** + * Check if pairing point limbs are all zero (default/infinity). + * Default pairing points indicate no recursive verification occurred. + */ +function arePairingPointsDefault( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (bool) { + uint256 acc = 0; + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + acc |= Fr.unwrap(pairingPoints[i]); + } + return acc == 0; +} + +function pairing( + Honk.G1Point memory rhs, + Honk.G1Point memory lhs +) view returns (bool decodedResult) { + bytes memory input = abi.encodePacked( + rhs.x, + rhs.y, + // Fixed G2 point + uint256( + 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2 + ), + uint256( + 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed + ), + uint256( + 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b + ), + uint256( + 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa + ), + lhs.x, + lhs.y, + // G2 point from VK + uint256( + 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1 + ), + uint256( + 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0 + ), + uint256( + 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4 + ), + uint256( + 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55 + ) + ); + + (bool success, bytes memory result) = address(0x08).staticcall(input); + decodedResult = success && abi.decode(result, (bool)); +} + +abstract contract BaseZKHonkVerifier is IVerifier { + using FrLib for Fr; + + struct PairingInputs { + Honk.G1Point P_0; + Honk.G1Point P_1; + } + + struct SmallSubgroupIpaIntermediates { + Fr[SUBGROUP_SIZE] challengePolyLagrange; + Fr challengePolyEval; + Fr lagrangeFirst; + Fr lagrangeLast; + Fr rootPower; + Fr[SUBGROUP_SIZE] denominators; // this has to disappear + Fr diff; + } + + // Constants for proof length calculation (matching UltraKeccakZKFlavor) + uint256 internal constant NUM_WITNESS_ENTITIES = + 8 + NUM_MASKING_POLYNOMIALS; + uint256 internal constant NUM_ELEMENTS_COMM = 2; // uint256 elements for curve points + uint256 internal constant NUM_ELEMENTS_FR = 1; // uint256 elements for field elements + uint256 internal constant NUM_LIBRA_EVALUATIONS = 4; // libra evaluations + + uint256 internal constant LIBRA_COMMITMENTS = 3; + uint256 internal constant LIBRA_EVALUATIONS = 4; + uint256 internal constant LIBRA_UNIVARIATES_LENGTH = 9; + + uint256 internal constant SHIFTED_COMMITMENTS_START = 30; + uint256 internal constant PERMUTATION_ARGUMENT_VALUE_SEPARATOR = 1 << 28; + + uint256 internal immutable $N; + uint256 internal immutable $LOG_N; + uint256 internal immutable $VK_HASH; + uint256 internal immutable $NUM_PUBLIC_INPUTS; + uint256 internal immutable $MSMSize; + + constructor( + uint256 _N, + uint256 _logN, + uint256 _vkHash, + uint256 _numPublicInputs + ) { + $N = _N; + $LOG_N = _logN; + $VK_HASH = _vkHash; + $NUM_PUBLIC_INPUTS = _numPublicInputs; + $MSMSize = NUMBER_UNSHIFTED_ZK + _logN + LIBRA_COMMITMENTS + 2; + } + + function validateVerificationKey( + Honk.VerificationKey memory vk + ) internal view { + require( + $N == vk.circuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $LOG_N == vk.logCircuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $NUM_PUBLIC_INPUTS == vk.publicInputsSize, + Errors.VerificationKeyConfigurationMismatch() + ); + } + + function verify( + bytes calldata proof, + bytes32[] calldata publicInputs + ) public view override returns (bool verified) { + // Calculate expected proof size based on $LOG_N + uint256 expectedProofSize = calculateProofSize($LOG_N); + + // Check the received proof is the expected size where each field element is 32 bytes + require( + proof.length == expectedProofSize, + Errors.ProofLengthWrongWithLogN( + $LOG_N, + proof.length, + expectedProofSize + ) + ); + + Honk.VerificationKey memory vk = loadVerificationKey(); + Honk.ZKProof memory p = ZKTranscriptLib.loadProof(proof, $LOG_N); + + require( + publicInputs.length == vk.publicInputsSize - PAIRING_POINTS_SIZE, + Errors.PublicInputsLengthWrong() + ); + + // Generate the fiat shamir challenges for the whole protocol + ZKTranscript memory t = ZKTranscriptLib.generateTranscript( + p, + publicInputs, + $VK_HASH, + $NUM_PUBLIC_INPUTS, + $LOG_N + ); + + // Derive public input delta + t.relationParameters.publicInputsDelta = computePublicInputDelta( + publicInputs, + p.pairingPointObject, + t.relationParameters.beta, + t.relationParameters.gamma, + 5 // pubInputsOffset = NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS = 4 + 1 + ); + + // Sumcheck + require(verifySumcheck(p, t), Errors.SumcheckFailed()); + require(verifyShplemini(p, vk, t), Errors.ShpleminiFailed()); + + verified = true; + } + + function computePublicInputDelta( + bytes32[] memory publicInputs, + Fr[PAIRING_POINTS_SIZE] memory pairingPointObject, + Fr beta, + Fr gamma, + uint256 offset + ) internal view returns (Fr publicInputDelta) { + Fr numerator = Fr.wrap(1); + Fr denominator = Fr.wrap(1); + + Fr numeratorAcc = gamma + + (beta * FrLib.from(PERMUTATION_ARGUMENT_VALUE_SEPARATOR + offset)); + Fr denominatorAcc = gamma - (beta * FrLib.from(offset + 1)); + + { + for ( + uint256 i = 0; + i < $NUM_PUBLIC_INPUTS - PAIRING_POINTS_SIZE; + i++ + ) { + Fr pubInput = FrLib.fromBytes32(publicInputs[i]); + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + Fr pubInput = pairingPointObject[i]; + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + } + + // Fr delta = numerator / denominator; // TOOO: batch invert later? + publicInputDelta = FrLib.div(numerator, denominator); + } + + function verifySumcheck( + Honk.ZKProof memory proof, + ZKTranscript memory tp + ) internal view returns (bool verified) { + Fr roundTargetSum = tp.libraChallenge * proof.libraSum; // default 0 + Fr powPartialEvaluation = Fr.wrap(1); + + // We perform sumcheck reductions over log n rounds ( the multivariate degree ) + for (uint256 round; round < $LOG_N; ++round) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory roundUnivariate = proof.sumcheckUnivariates[round]; + Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; + require(totalSum == roundTargetSum, Errors.SumcheckFailed()); + + Fr roundChallenge = tp.sumCheckUChallenges[round]; + + // Update the round target for the next rounf + roundTargetSum = computeNextTargetSum( + roundUnivariate, + roundChallenge + ); + powPartialEvaluation = + powPartialEvaluation * + (Fr.wrap(1) + + roundChallenge * + (tp.gateChallenges[round] - Fr.wrap(1))); + } + + // Last round + // For ZK flavors: sumcheckEvaluations has 42 elements + // Index 0 is gemini_masking_poly, indices 1-41 are the regular entities used in relations + Fr[NUMBER_OF_ENTITIES] memory relationsEvaluations; + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + relationsEvaluations[i] = proof.sumcheckEvaluations[ + i + NUM_MASKING_POLYNOMIALS + ]; // Skip gemini_masking_poly at index 0 + } + Fr grandHonkRelationSum = RelationsLib.accumulateRelationEvaluations( + relationsEvaluations, + tp.relationParameters, + tp.alphas, + powPartialEvaluation + ); + + // Row-disabling polynomial: 1 - ∏_{i≥2}(1 - u_i) + Fr evaluation = Fr.wrap(1); + for (uint256 i = 2; i < $LOG_N; i++) { + evaluation = evaluation * (Fr.wrap(1) - tp.sumCheckUChallenges[i]); + } + + grandHonkRelationSum = + grandHonkRelationSum * + (Fr.wrap(1) - evaluation) + + proof.libraEvaluation * + tp.libraChallenge; + verified = (grandHonkRelationSum == roundTargetSum); + } + + // Return the new target sum for the next sumcheck round + function computeNextTargetSum( + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariates, + Fr roundChallenge + ) internal view returns (Fr targetSum) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory BARYCENTRIC_LAGRANGE_DENOMINATORS = [ + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000000240 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ) + ]; + + // To compute the next target sum, we evaluate the given univariate at a point u (challenge). + + // Performing Barycentric evaluations + // Compute B(x) + Fr numeratorValue = Fr.wrap(1); + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + numeratorValue = numeratorValue * (roundChallenge - Fr.wrap(i)); + } + + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + denominatorInverses[i] = FrLib.invert( + BARYCENTRIC_LAGRANGE_DENOMINATORS[i] * + (roundChallenge - Fr.wrap(i)) + ); + } + + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + targetSum = + targetSum + + roundUnivariates[i] * + denominatorInverses[i]; + } + + // Scale the sum by the value of B(x) + targetSum = targetSum * numeratorValue; + } + + function verifyShplemini( + Honk.ZKProof memory proof, + Honk.VerificationKey memory vk, + ZKTranscript memory tp + ) internal view returns (bool verified) { + CommitmentSchemeLib.ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[] memory powers_of_evaluation_challenge = CommitmentSchemeLib + .computeSquares(tp.geminiR, $LOG_N); + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[] memory scalars = new Fr[]($MSMSize); + Honk.G1Point[] memory commitments = new Honk.G1Point[]($MSMSize); + + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[0]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[0]).invert(); + + mem.unshiftedScalar = + mem.posInvertedDenominator + + (tp.shplonkNu * mem.negInvertedDenominator); + mem.shiftedScalar = + tp.geminiR.invert() * + (mem.posInvertedDenominator - + (tp.shplonkNu * mem.negInvertedDenominator)); + + scalars[0] = Fr.wrap(1); + commitments[0] = proof.shplonkQ; + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + // For ZK flavors: evaluations array is [gemini_masking_poly, qm, qc, ql, qr, ...] + // Start batching challenge at 1, not rho, to match non-ZK pattern + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + mem.unshiftedScalarNeg = mem.unshiftedScalar.neg(); + mem.shiftedScalarNeg = mem.shiftedScalar.neg(); + + // Process all NUMBER_UNSHIFTED_ZK evaluations (includes gemini_masking_poly at index 0) + for (uint256 i = 1; i <= NUMBER_UNSHIFTED_ZK; ++i) { + scalars[i] = mem.unshiftedScalarNeg * mem.batchingChallenge; + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[i - NUM_MASKING_POLYNOMIALS] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + // For each of the to be shifted commitments perform the shift in place by + // adding to the unshifted value. + // We do so, as the values are to be used in batchMul later, and as + // `a * c + b * c = (a + b) * c` this will allow us to reduce memory and compute. + // Applied to w1, w2, w3, w4 and zPerm + for (uint256 i = 0; i < NUMBER_TO_BE_SHIFTED; ++i) { + uint256 scalarOff = i + SHIFTED_COMMITMENTS_START; + uint256 evaluationOff = i + NUMBER_UNSHIFTED_ZK; + + scalars[scalarOff] = + scalars[scalarOff] + + (mem.shiftedScalarNeg * mem.batchingChallenge); + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[evaluationOff] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + + commitments[1] = proof.geminiMaskingPoly; + + commitments[2] = vk.s1; + commitments[3] = vk.s2; + commitments[4] = vk.s3; + commitments[5] = vk.s4; + commitments[6] = vk.id1; + commitments[7] = vk.id2; + commitments[8] = vk.id3; + commitments[9] = vk.id4; + commitments[10] = vk.lagrangeFirst; + commitments[11] = vk.lagrangeLast; + commitments[12] = vk.qLookup; + commitments[13] = vk.t1; + commitments[14] = vk.t2; + commitments[15] = vk.t3; + commitments[16] = vk.t4; + commitments[17] = vk.qm; + commitments[18] = vk.qr; + commitments[19] = vk.qo; + commitments[20] = vk.qc; + commitments[21] = vk.ql; + commitments[22] = vk.q4; + commitments[23] = vk.qArith; + commitments[24] = vk.qDeltaRange; + commitments[25] = vk.qElliptic; + commitments[26] = vk.qMemory; + commitments[27] = vk.qNnf; + commitments[28] = vk.qPoseidon2External; + commitments[29] = vk.qPoseidon2Internal; + + // Accumulate proof points + commitments[30] = proof.w1; + commitments[31] = proof.w2; + commitments[32] = proof.w3; + commitments[33] = proof.w4; + commitments[34] = proof.zPerm; + commitments[35] = proof.lookupInverses; + commitments[36] = proof.lookupReadCounts; + commitments[37] = proof.lookupReadTags; + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., $LOG_N - 1 + Fr[] memory foldPosEvaluations = CommitmentSchemeLib + .computeFoldPosEvaluations( + tp.sumCheckUChallenges, + mem.batchedEvaluation, + proof.geminiAEvaluations, + powers_of_evaluation_challenge, + $LOG_N + ); + + mem.constantTermAccumulator = + foldPosEvaluations[0] * + mem.posInvertedDenominator; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + (proof.geminiAEvaluations[0] * + tp.shplonkNu * + mem.negInvertedDenominator); + + mem.batchingChallenge = tp.shplonkNu.sqr(); + uint256 boundary = NUMBER_UNSHIFTED_ZK + 1; + + // Compute Shplonk constant term contributions from Aₗ(± r^{2ˡ}) for l = 1, ..., m-1; + // Compute scalar multipliers for each fold commitment + for (uint256 i = 0; i < $LOG_N - 1; ++i) { + bool dummy_round = i >= ($LOG_N - 1); + + if (!dummy_round) { + // Update inverted denominators + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[i + 1]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[i + 1]).invert(); + + // Compute the scalar multipliers for Aₗ(± r^{2ˡ}) and [Aₗ] + mem.scalingFactorPos = + mem.batchingChallenge * + mem.posInvertedDenominator; + mem.scalingFactorNeg = + mem.batchingChallenge * + tp.shplonkNu * + mem.negInvertedDenominator; + scalars[boundary + i] = + mem.scalingFactorNeg.neg() + + mem.scalingFactorPos.neg(); + + // Accumulate the const term contribution given by + // v^{2l} * Aₗ(r^{2ˡ}) /(z-r^{2^l}) + v^{2l+1} * Aₗ(-r^{2ˡ}) /(z+ r^{2^l}) + Fr accumContribution = mem.scalingFactorNeg * + proof.geminiAEvaluations[i + 1]; + accumContribution = + accumContribution + + mem.scalingFactorPos * + foldPosEvaluations[i + 1]; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + accumContribution; + } + // Update the running power of v + mem.batchingChallenge = + mem.batchingChallenge * + tp.shplonkNu * + tp.shplonkNu; + + commitments[boundary + i] = proof.geminiFoldComms[i]; + } + + boundary += $LOG_N - 1; + + // Denominators 1/(z - point_i) for the five opening points {r, g*r, r, 1, r}. + mem.denominators[0] = ONE.div(tp.shplonkZ - tp.geminiR); + mem.denominators[1] = ONE.div( + tp.shplonkZ - SUBGROUP_GENERATOR * tp.geminiR + ); + mem.denominators[2] = mem.denominators[0]; + mem.denominators[SMALL_IPA_BOUNDARY_OPENING_IDX] = ONE.div( + tp.shplonkZ - ONE + ); + mem.denominators[NUM_SMALL_IPA_OPENING_CLAIMS - 1] = mem.denominators[ + 0 + ]; + + // Iterate the opening claims in three segments — the inner loops can't be merged without an extra induction + // variable, which pushes us into stack-too-deep. + for (uint256 i = 0; i < SMALL_IPA_BOUNDARY_OPENING_IDX; i++) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i]; + } + + // Boundary slot: claimed value is hardcoded 0, so no constantTermAccumulator contribution. + { + Fr scalingFactor = mem.denominators[ + SMALL_IPA_BOUNDARY_OPENING_IDX + ] * mem.batchingChallenge; + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX] = scalingFactor + .neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + } + + for ( + uint256 i = SMALL_IPA_BOUNDARY_OPENING_IDX + 1; + i < NUM_SMALL_IPA_OPENING_CLAIMS; + i++ + ) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i - 1]; + } + + // Group per-claim batching scalars by commitment: [G], [A] (three openings), [Q]. + scalars[boundary] = mem.batchingScalars[0]; + scalars[boundary + 1] = + mem.batchingScalars[1] + + mem.batchingScalars[2] + + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX]; + scalars[boundary + 2] = mem.batchingScalars[ + NUM_SMALL_IPA_OPENING_CLAIMS - 1 + ]; + + for (uint256 i = 0; i < LIBRA_COMMITMENTS; i++) { + commitments[boundary++] = proof.libraCommitments[i]; + } + + commitments[boundary] = Honk.G1Point({ x: 1, y: 2 }); + scalars[boundary++] = mem.constantTermAccumulator; + + require( + checkEvalsConsistency( + proof.libraPolyEvals, + tp.geminiR, + tp.sumCheckUChallenges, + proof.libraEvaluation + ), + Errors.ConsistencyCheckFailed() + ); + + Honk.G1Point memory quotient_commitment = proof.kzgQuotient; + + commitments[boundary] = quotient_commitment; + scalars[boundary] = tp.shplonkZ; // evaluation challenge + + PairingInputs memory pair; + pair.P_0 = batchMul(commitments, scalars); + pair.P_1 = negateInplace(quotient_commitment); + + // Aggregate pairing points (skip if default/infinity — no recursive verification occurred) + if (!arePairingPointsDefault(proof.pairingPointObject)) { + Fr recursionSeparator = generateRecursionSeparator( + proof.pairingPointObject, + pair.P_0, + pair.P_1 + ); + ( + Honk.G1Point memory P_0_other, + Honk.G1Point memory P_1_other + ) = convertPairingPointsToG1(proof.pairingPointObject); + + // Validate the points from the proof are on the curve + rejectPointAtInfinity(P_0_other); + rejectPointAtInfinity(P_1_other); + + // accumulate with aggregate points in proof + pair.P_0 = mulWithSeperator( + pair.P_0, + P_0_other, + recursionSeparator + ); + pair.P_1 = mulWithSeperator( + pair.P_1, + P_1_other, + recursionSeparator + ); + } + + return pairing(pair.P_0, pair.P_1); + } + + function checkEvalsConsistency( + Fr[LIBRA_EVALUATIONS] memory libraPolyEvals, + Fr geminiR, + Fr[CONST_PROOF_SIZE_LOG_N] memory uChallenges, + Fr libraEval + ) internal view returns (bool check) { + Fr one = Fr.wrap(1); + Fr vanishingPolyEval = geminiR.pow(SUBGROUP_SIZE) - one; + require( + vanishingPolyEval != Fr.wrap(0), + Errors.GeminiChallengeInSubgroup() + ); + + SmallSubgroupIpaIntermediates memory mem; + mem.challengePolyLagrange[0] = one; + for (uint256 round = 0; round < $LOG_N; round++) { + uint256 currIdx = 1 + LIBRA_UNIVARIATES_LENGTH * round; + mem.challengePolyLagrange[currIdx] = one; + for ( + uint256 idx = currIdx + 1; + idx < currIdx + LIBRA_UNIVARIATES_LENGTH; + idx++ + ) { + mem.challengePolyLagrange[idx] = + mem.challengePolyLagrange[idx - 1] * + uChallenges[round]; + } + } + + mem.rootPower = one; + mem.challengePolyEval = Fr.wrap(0); + for (uint256 idx = 0; idx < SUBGROUP_SIZE; idx++) { + mem.denominators[idx] = mem.rootPower * geminiR - one; + mem.denominators[idx] = mem.denominators[idx].invert(); + mem.challengePolyEval = + mem.challengePolyEval + + mem.challengePolyLagrange[idx] * + mem.denominators[idx]; + mem.rootPower = mem.rootPower * SUBGROUP_GENERATOR_INVERSE; + } + + Fr numerator = vanishingPolyEval * Fr.wrap(SUBGROUP_SIZE).invert(); + mem.challengePolyEval = mem.challengePolyEval * numerator; + mem.lagrangeFirst = mem.denominators[0] * numerator; + mem.lagrangeLast = mem.denominators[SUBGROUP_SIZE - 1] * numerator; + + mem.diff = mem.lagrangeFirst * libraPolyEvals[2]; + + mem.diff = + mem.diff + + (geminiR - SUBGROUP_GENERATOR_INVERSE) * + (libraPolyEvals[1] - + libraPolyEvals[2] - + libraPolyEvals[0] * + mem.challengePolyEval); + mem.diff = + mem.diff + + mem.lagrangeLast * + (libraPolyEvals[2] - libraEval) - + vanishingPolyEval * + libraPolyEvals[3]; + + check = mem.diff == Fr.wrap(0); + } + + // This implementation is the same as above with different constants + function batchMul( + Honk.G1Point[] memory base, + Fr[] memory scalars + ) internal view returns (Honk.G1Point memory result) { + uint256 limit = $MSMSize; + + // Identity bases are accepted: VK selector/table polys may be identically zero, + // and the ecAdd/ecMul precompiles treat (0,0) as the additive identity per EIP-196. + // Soundness against an attacker substituting (0,0) for a non-zero commitment is + // upheld by sumcheck/Shplemini, which would fail on inconsistent evaluations. + + bool success = true; + assembly { + let free := mload(0x40) + + let count := 0x01 + for {} lt(count, add(limit, 1)) { + count := add(count, 1) + } { + // Get loop offsets + let base_base := add(base, mul(count, 0x20)) + let scalar_base := add(scalars, mul(count, 0x20)) + + mstore(add(free, 0x40), mload(mload(base_base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalar_base)) + + success := and( + success, + staticcall( + gas(), + 7, + add(free, 0x40), + 0x60, + add(free, 0x40), + 0x40 + ) + ) + // accumulator = accumulator + accumulator_2 + success := and( + success, + staticcall(gas(), 6, free, 0x80, free, 0x40) + ) + } + + // Return the result + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + } + + require(success, Errors.ShpleminiFailed()); + } + + // Calculate proof size based on log_n (matching UltraKeccakZKFlavor formula) + function calculateProofSize(uint256 logN) internal pure returns (uint256) { + // Witness and Libra commitments + uint256 proofLength = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM; // witness commitments + proofLength += NUM_ELEMENTS_COMM * 3; // Libra concat, grand sum, quotient comms + Gemini masking + + // Sumcheck + proofLength += + logN * + ZK_BATCHED_RELATION_PARTIAL_LENGTH * + NUM_ELEMENTS_FR; // sumcheck univariates + proofLength += NUMBER_OF_ENTITIES_ZK * NUM_ELEMENTS_FR; // sumcheck evaluations + + // Libra and Gemini + proofLength += NUM_ELEMENTS_FR * 2; // Libra sum, claimed eval + proofLength += logN * NUM_ELEMENTS_FR; // Gemini a evaluations + proofLength += NUM_LIBRA_EVALUATIONS * NUM_ELEMENTS_FR; // libra evaluations + + // PCS commitments + proofLength += (logN - 1) * NUM_ELEMENTS_COMM; // Gemini Fold commitments + proofLength += NUM_ELEMENTS_COMM * 2; // Shplonk Q and KZG W commitments + + // Pairing points + proofLength += PAIRING_POINTS_SIZE; // pairing inputs carried on public inputs + + return proofLength * 32; + } + + function loadVerificationKey() + internal + pure + virtual + returns (Honk.VerificationKey memory); +} + +contract DecryptionAggregatorVerifier is + BaseZKHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) +{ + constructor() { + validateVerificationKey(HonkVerificationKey.loadVerificationKey()); + } + function loadVerificationKey() + internal + pure + override + returns (Honk.VerificationKey memory) + { + return HonkVerificationKey.loadVerificationKey(); + } +} diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/micro/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/micro/DkgAggregatorVerifier.sol new file mode 100644 index 0000000000..90b52fc27e --- /dev/null +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/micro/DkgAggregatorVerifier.sol @@ -0,0 +1,3262 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +pragma solidity >=0.8.21; + +uint256 constant N = 2097152; +uint256 constant LOG_N = 21; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 47; +uint256 constant VK_HASH = 0x1d1f9582c24423398a75e8b4a45319df6c7fbd570619f3ebe7ede955fb065378; +library HonkVerificationKey { + function loadVerificationKey() + internal + pure + returns (Honk.VerificationKey memory) + { + Honk.VerificationKey memory vk = Honk.VerificationKey({ + circuitSize: uint256(2097152), + logCircuitSize: uint256(21), + publicInputsSize: uint256(47), + ql: Honk.G1Point({ + x: uint256( + 0x09fb1617bf1a5db4b616a80a4aca1925248c38682829aa1f20f0d62e6a0c2e28 + ), + y: uint256( + 0x2294e9de4ee4fbb099d12f81b0f0677fc8d57e2245216a99680a9e4c550282e0 + ) + }), + qr: Honk.G1Point({ + x: uint256( + 0x120338a7707714b342e9fee403e323980582631aa2d6fcf50582e35e0408fe30 + ), + y: uint256( + 0x2364cbe27fa944c559efffff3945474b08441e2cea68971dc102fa1a5e0ecf86 + ) + }), + qo: Honk.G1Point({ + x: uint256( + 0x190c5d6835231ff2d8dc65f2204f2403a92d75538ea4317bf0b2d01791b1144e + ), + y: uint256( + 0x256a2144636543d137766573f64cb8b3ec7318680fefb72b80a777f729dfb440 + ) + }), + q4: Honk.G1Point({ + x: uint256( + 0x2a33e7db5fd9f8420dc9241c360671e13ff1a7d7af2061760c989520fc5ed99c + ), + y: uint256( + 0x2ead51f55833a28fe73e913c9169bc0c85cb6552d184f77642d8cc1fb281649a + ) + }), + qm: Honk.G1Point({ + x: uint256( + 0x1610dfb74bdc64e6b2462f933449ea56a63d56d7f6fa1fe46f749262e1369754 + ), + y: uint256( + 0x234e0ff927df32ffd47859242dcd334e075b34977c73ee0d1126711c604ca48d + ) + }), + qc: Honk.G1Point({ + x: uint256( + 0x2eb329a490aa0e743f645226026f44d1f6d0d8a1079dae431e2d61403b96bdef + ), + y: uint256( + 0x0709211661547ac0676dcc868634192e57d61d1cd63b737f34cfd0bbfe50caf1 + ) + }), + qLookup: Honk.G1Point({ + x: uint256( + 0x2a7b97680492e5f2c9dd1eda828a34c461f066911d36caa089c34b6a790ded68 + ), + y: uint256( + 0x1db6204474978a4f112d405eaa2169e2fa3986583448b4509a5d7a392354cb71 + ) + }), + qArith: Honk.G1Point({ + x: uint256( + 0x2a72f0d14f0dba35569206e088ef77e463e531674dd5ae0c608d63f0949cf105 + ), + y: uint256( + 0x265db5c7efb0bf55b75c52d282812dfcb9f3c6f07ed6e251dab0ac97a26db27c + ) + }), + qDeltaRange: Honk.G1Point({ + x: uint256( + 0x19733b5c1091e0eb43b5e695972e0fc7a413d25f828063fcb0144ae18f9ff525 + ), + y: uint256( + 0x06e732a15adeb9d6bfd6ff82c5ea4157570e7054b78fb82bbe9449214827e9e7 + ) + }), + qElliptic: Honk.G1Point({ + x: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ), + y: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) + }), + qMemory: Honk.G1Point({ + x: uint256( + 0x26e099ca15e970b30cf03b7a48759514cd68bf1a5a39fba6d4faa6ef9865064b + ), + y: uint256( + 0x02a87f5494d520d376c62db8bce3bd7c65e16303164b9209ec739c3f2249d49b + ) + }), + qNnf: Honk.G1Point({ + x: uint256( + 0x2f9507b3a2ed8e4172b65abecf5b84650c601989cef05d3d7bc3fd55b6a64b82 + ), + y: uint256( + 0x00abb7421f8bc1f466e9e3af7aecf08dd1bcb1e2c66b8d3d1aeaa7943b766a4b + ) + }), + qPoseidon2External: Honk.G1Point({ + x: uint256( + 0x1836f6cf05f296318d34b1dd1fabb5f2e916ff6653c64a9fc6bb745f88389fec + ), + y: uint256( + 0x0e639c4475b96bcb8e0535e5bfb3881655bf474d19e5f24a3eaeb702cbefba2d + ) + }), + qPoseidon2Internal: Honk.G1Point({ + x: uint256( + 0x0f22538af8ad2a07a7b37e13b75ba83427360b57484bad08e15bcb1cab168aeb + ), + y: uint256( + 0x23e3f26f05a14eaf9ece0179a1aa4abb161565ff385c254c178f55adbe8ef8e7 + ) + }), + s1: Honk.G1Point({ + x: uint256( + 0x0f62fb5a3d06447b3f339807e963528c6dc9c7275a97a7380efaba5283a27985 + ), + y: uint256( + 0x06ab75e8541c8d7dafdbcbe381360e0b04efb8dae4de776a2f371c88d2f6629b + ) + }), + s2: Honk.G1Point({ + x: uint256( + 0x18f7fbd7972b62809cf330fd7399e1898f08f1323abab9ad8c23ca97f3e3c8e6 + ), + y: uint256( + 0x135482bb44fbb3111de76156e3586300b1ef41cb3519a5b584243fdc79f5f72c + ) + }), + s3: Honk.G1Point({ + x: uint256( + 0x20fac6a63bdd83dfb4775e0cf52a007f7eefeb1c4a6924895a87d67717b6282d + ), + y: uint256( + 0x128cce6f61a9671f55b8022fe056ff843bcfae57855cd26bb98e90cdc1c9a3be + ) + }), + s4: Honk.G1Point({ + x: uint256( + 0x14a773aa179f78d9f1b1f77189cf0248a37834869eda1da762efecf447b1906f + ), + y: uint256( + 0x00a097a3ee8ea223c17079d28533a090c32b8c138504444507de66f51f12c988 + ) + }), + t1: Honk.G1Point({ + x: uint256( + 0x18460053c5eef9721d4f635a8c26aeb6c2d8bdbab3c1119c1996baf977cc9f89 + ), + y: uint256( + 0x023a1e2557a1c8c98329ede54e6179817cea512122e470ecec666af2f235e6af + ) + }), + t2: Honk.G1Point({ + x: uint256( + 0x201fad6914e3500182f55b66b53894d0da8c4c08d5009c8e4c1b9f4741e2ccf4 + ), + y: uint256( + 0x18a11e694ad1a780f6873f2a3d3f9c48dd56700f0c4ba5e2c4f4ec0d48c42286 + ) + }), + t3: Honk.G1Point({ + x: uint256( + 0x13eb292c9f0b41a76d89d75da2f3e30ee1386ae715ea8e7d46cfa2df7a4f5e71 + ), + y: uint256( + 0x0569a64880cce0d195fe8209cee78a81768f3fff238ceaef468b6eac11d64c51 + ) + }), + t4: Honk.G1Point({ + x: uint256( + 0x05112eb7ef16cec92f55367f157b6873c1bc9785e1e1bca0449ce836520b1328 + ), + y: uint256( + 0x1c4c59b17d7c386e00e46f39f4beae14aa73bd54eb108a3257cf306e673c6499 + ) + }), + id1: Honk.G1Point({ + x: uint256( + 0x16b62d4b5b93c5012fd02332e3e59e35f2db1d73eda991b6ac79e347a6e02a69 + ), + y: uint256( + 0x1bbca7cf4ee8e7d95aa3276e522e45876f574b4d9163a0daa523431e9d922b54 + ) + }), + id2: Honk.G1Point({ + x: uint256( + 0x2730e162c74aa8254604cf436918220bcc470c9525ab4c3d5cdf1ee1c87909e7 + ), + y: uint256( + 0x12a5ca6d57fcbfcde767807799a82a267af4a954c899f812ac0cd414ff7f916a + ) + }), + id3: Honk.G1Point({ + x: uint256( + 0x1d4d49a55815b6219e3d0c95f6ae1614a75d2399793ecc32ebd695878242ca85 + ), + y: uint256( + 0x19a8a416e1481446efeec820995a63c39a49904fb7727e421540e11ac578f429 + ) + }), + id4: Honk.G1Point({ + x: uint256( + 0x2455c27036fd141bd97e2a3ff222374c0ea76bdad5dadd403d2e8d6c15550795 + ), + y: uint256( + 0x04750c1b84407aae2132e930bac352ee5ac8880d6fe68f1aea8a51ee364d2a7a + ) + }), + lagrangeFirst: Honk.G1Point({ + x: uint256( + 0x2a56ce41f6b0be13b9c26747621b821eee81b23a887f299049b14c11e98460d6 + ), + y: uint256( + 0x1aa98f2de3ddda547d8f6de4e725ded5827d6338c78656c0d12ca1aea6ef2c7c + ) + }), + lagrangeLast: Honk.G1Point({ + x: uint256( + 0x0153d84a006db68082bac35286c82a337e168c23515897380ba943114620dca7 + ), + y: uint256( + 0x22c40e30cf7a7b338ede3119b48c1c238b197625ac72973dc106a0e32f32559b + ) + }) + }); + return vk; + } +} + +pragma solidity ^0.8.27; + +interface IVerifier { + function verify( + bytes calldata _proof, + bytes32[] calldata _publicInputs + ) external view returns (bool); +} + +/** + * @notice Library of error codes + * @dev You can run `forge inspect Errors errors` to get the selectors for the optimised verifier + */ +library Errors { + error ValueGeLimbMax(); + error ValueGeGroupOrder(); + error ValueGeFieldOrder(); + + error InvertOfZero(); + error NotPowerOfTwo(); + error ModExpFailed(); + + error ProofLengthWrong(); + error ProofLengthWrongWithLogN( + uint256 logN, + uint256 actualLength, + uint256 expectedLength + ); + error PublicInputsLengthWrong(); + error SumcheckFailed(); + error ShpleminiFailed(); + + error PointAtInfinity(); + + error ConsistencyCheckFailed(); + error VerificationKeyConfigurationMismatch(); + error GeminiChallengeInSubgroup(); +} + +type Fr is uint256; + +using { add as + } for Fr global; +using { sub as - } for Fr global; +using { mul as * } for Fr global; + +using { notEqual as != } for Fr global; +using { equal as == } for Fr global; + +uint256 constant SUBGROUP_SIZE = 256; +uint256 constant MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Prime field order +uint256 constant P = MODULUS; +Fr constant SUBGROUP_GENERATOR = Fr.wrap( + 0x07b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76 +); +Fr constant SUBGROUP_GENERATOR_INVERSE = Fr.wrap( + 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 +); +Fr constant MINUS_ONE = Fr.wrap(MODULUS - 1); +Fr constant ONE = Fr.wrap(1); +Fr constant ZERO = Fr.wrap(0); + +// SmallSubgroupIPA opening-claim layout — mirrors SMALL_IPA_CLAIMS in +// barretenberg/cpp/src/barretenberg/commitment_schemes/small_subgroup_ipa/small_subgroup_ipa_utils.hpp. +uint256 constant NUM_SMALL_IPA_OPENING_CLAIMS = 5; +uint256 constant SMALL_IPA_BOUNDARY_OPENING_IDX = 3; +uint256 constant NUM_SMALL_IPA_TRANSCRIPT_EVALS = 4; +// Instantiation + +library FrLib { + bytes4 internal constant FRLIB_MODEXP_FAILED_SELECTOR = 0x1f7ec5f0; + + function invert(Fr value) internal view returns (Fr) { + uint256 v = Fr.unwrap(value); + require(v != 0, Errors.InvertOfZero()); + + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), v) + mstore(add(free, 0x80), sub(MODULUS, 2)) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function pow(Fr base, uint256 v) internal view returns (Fr) { + uint256 b = Fr.unwrap(base); + // Only works for power of 2 + require(v > 0 && (v & (v - 1)) == 0, Errors.NotPowerOfTwo()); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), b) + mstore(add(free, 0x80), v) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function div(Fr numerator, Fr denominator) internal view returns (Fr) { + unchecked { + return numerator * invert(denominator); + } + } + + function sqr(Fr value) internal pure returns (Fr) { + unchecked { + return value * value; + } + } + + function unwrap(Fr value) internal pure returns (uint256) { + unchecked { + return Fr.unwrap(value); + } + } + + function neg(Fr value) internal pure returns (Fr) { + unchecked { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } + } + + function from(uint256 value) internal pure returns (Fr) { + unchecked { + require(value < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(value); + } + } + + function fromBytes32(bytes32 value) internal pure returns (Fr) { + unchecked { + uint256 v = uint256(value); + require(v < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(v); + } + } + + function toBytes32(Fr value) internal pure returns (bytes32) { + unchecked { + return bytes32(Fr.unwrap(value)); + } + } +} + +// Free functions +function add(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function mul(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(mulmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function sub(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), MODULUS - Fr.unwrap(b), MODULUS)); + } +} + +function notEqual(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) != Fr.unwrap(b); + } +} + +function equal(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) == Fr.unwrap(b); + } +} + +uint256 constant CONST_PROOF_SIZE_LOG_N = 25; + +uint256 constant NUMBER_OF_SUBRELATIONS = 29; +uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; +uint256 constant ZK_BATCHED_RELATION_PARTIAL_LENGTH = 9; +uint256 constant NUMBER_OF_ENTITIES = 41; +// The number of entities added for ZK (gemini_masking_poly) +uint256 constant NUM_MASKING_POLYNOMIALS = 1; +uint256 constant NUMBER_OF_ENTITIES_ZK = NUMBER_OF_ENTITIES + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_UNSHIFTED = 36; +uint256 constant NUMBER_UNSHIFTED_ZK = NUMBER_UNSHIFTED + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; +uint256 constant PAIRING_POINTS_SIZE = 8; + +uint256 constant FIELD_ELEMENT_SIZE = 0x20; +uint256 constant GROUP_ELEMENT_SIZE = 0x40; + +// Powers of alpha used to batch subrelations (alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)) +uint256 constant NUMBER_OF_ALPHAS = NUMBER_OF_SUBRELATIONS - 1; + +// Must match UltraFlavor_Generated::EntityId order. +enum WIRE { + SIGMA_1, + SIGMA_2, + SIGMA_3, + SIGMA_4, + ID_1, + ID_2, + ID_3, + ID_4, + LAGRANGE_FIRST, + LAGRANGE_LAST, + Q_LOOKUP, + TABLE_1, + TABLE_2, + TABLE_3, + TABLE_4, + Q_M, + Q_R, + Q_O, + Q_C, + Q_L, + Q_4, + Q_ARITH, + Q_RANGE, + Q_ELLIPTIC, + Q_MEMORY, + Q_NNF, + Q_POSEIDON2_EXTERNAL, + Q_POSEIDON2_INTERNAL, + W_L, + W_R, + W_O, + W_4, + Z_PERM, + LOOKUP_INVERSES, + LOOKUP_READ_COUNTS, + LOOKUP_READ_TAGS, + W_L_SHIFT, + W_R_SHIFT, + W_O_SHIFT, + W_4_SHIFT, + Z_PERM_SHIFT +} + +library Honk { + struct G1Point { + uint256 x; + uint256 y; + } + + struct VerificationKey { + // Misc Params + uint256 circuitSize; + uint256 logCircuitSize; + uint256 publicInputsSize; + // Selectors + G1Point qm; + G1Point qc; + G1Point ql; + G1Point qr; + G1Point qo; + G1Point q4; + G1Point qLookup; // Lookup + G1Point qArith; // Arithmetic widget + G1Point qDeltaRange; // Delta Range sort + G1Point qMemory; // Memory + G1Point qNnf; // Non-native Field + G1Point qElliptic; // Auxillary + G1Point qPoseidon2External; + G1Point qPoseidon2Internal; + // Copy constraints + G1Point s1; + G1Point s2; + G1Point s3; + G1Point s4; + // Copy identity + G1Point id1; + G1Point id2; + G1Point id3; + G1Point id4; + // Precomputed lookup table + G1Point t1; + G1Point t2; + G1Point t3; + G1Point t4; + // Fixed first and last + G1Point lagrangeFirst; + G1Point lagrangeLast; + } + + struct RelationParameters { + // challenges + Fr eta; + Fr beta; + Fr gamma; + // derived + Fr publicInputsDelta; + } + + struct Proof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // Free wires + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Lookup helpers - Permutations + G1Point zPerm; + // Lookup helpers - logup + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Sumcheck + Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + G1Point shplonkQ; + G1Point kzgQuotient; + } + + /// forge-lint: disable-next-item(pascal-case-struct) + struct ZKProof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // ZK: Gemini masking polynomial commitment (sent first, right after public inputs) + G1Point geminiMaskingPoly; + // Commitments to wire polynomials + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Commitments to logup witness polynomials + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Commitment to grand permutation polynomial + G1Point zPerm; + G1Point[3] libraCommitments; + // Sumcheck + Fr libraSum; + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr libraEvaluation; + Fr[NUMBER_OF_ENTITIES_ZK] sumcheckEvaluations; // Includes gemini_masking_poly eval at index 0 (first position) + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Fr[4] libraPolyEvals; + G1Point shplonkQ; + G1Point kzgQuotient; + } +} + +// ZKTranscript library to generate fiat shamir challenges, the ZK transcript only differest +/// forge-lint: disable-next-item(pascal-case-struct) +struct ZKTranscript { + // Oink + Honk.RelationParameters relationParameters; + Fr[NUMBER_OF_ALPHAS] alphas; // Powers of alpha: [alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)] + Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; + // Sumcheck + Fr libraChallenge; + Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; + // Shplemini + Fr rho; + Fr geminiR; + Fr shplonkNu; + Fr shplonkZ; + // Derived + Fr publicInputsDelta; +} + +library ZKTranscriptLib { + function generateTranscript( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + uint256 logN + ) external pure returns (ZKTranscript memory t) { + Fr previousChallenge; + ( + t.relationParameters, + previousChallenge + ) = generateRelationParametersChallenges( + proof, + publicInputs, + vkHash, + publicInputsSize, + previousChallenge + ); + + (t.alphas, previousChallenge) = generateAlphaChallenges( + previousChallenge, + proof + ); + + (t.gateChallenges, previousChallenge) = generateGateChallenges( + previousChallenge, + logN + ); + (t.libraChallenge, previousChallenge) = generateLibraChallenge( + previousChallenge, + proof + ); + (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges( + proof, + previousChallenge, + logN + ); + + (t.rho, previousChallenge) = generateRhoChallenge( + proof, + previousChallenge + ); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge( + proof, + previousChallenge + ); + return t; + } + + function splitChallenge( + Fr challenge + ) internal pure returns (Fr first, Fr second) { + uint256 challengeU256 = uint256(Fr.unwrap(challenge)); + // Split into two equal 127-bit chunks (254/2) + uint256 lo = challengeU256 & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // 127 bits + uint256 hi = challengeU256 >> 127; + first = FrLib.from(lo); + second = FrLib.from(hi); + } + + function generateRelationParametersChallenges( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + Fr previousChallenge + ) + internal + pure + returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) + { + (rp.eta, previousChallenge) = generateEtaChallenge( + proof, + publicInputs, + vkHash, + publicInputsSize + ); + + ( + rp.beta, + rp.gamma, + nextPreviousChallenge + ) = generateBetaGammaChallenges(previousChallenge, proof); + } + + function generateEtaChallenge( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize + ) internal pure returns (Fr eta, Fr previousChallenge) { + // Size: 1 (vkHash) + publicInputsSize + 8 (geminiMask(2) + 3 wires(6)) + bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 8); + round0[0] = bytes32(vkHash); + + for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) { + require(uint256(publicInputs[i]) < P, Errors.ValueGeFieldOrder()); + round0[1 + i] = publicInputs[i]; + } + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib + .toBytes32(proof.pairingPointObject[i]); + } + + // For ZK flavors: hash the gemini masking poly commitment (sent right after public inputs) + round0[1 + publicInputsSize] = bytes32(proof.geminiMaskingPoly.x); + round0[1 + publicInputsSize + 1] = bytes32(proof.geminiMaskingPoly.y); + + // Create the first challenge + // Note: w4 is added to the challenge later on + round0[1 + publicInputsSize + 2] = bytes32(proof.w1.x); + round0[1 + publicInputsSize + 3] = bytes32(proof.w1.y); + round0[1 + publicInputsSize + 4] = bytes32(proof.w2.x); + round0[1 + publicInputsSize + 5] = bytes32(proof.w2.y); + round0[1 + publicInputsSize + 6] = bytes32(proof.w3.x); + round0[1 + publicInputsSize + 7] = bytes32(proof.w3.y); + + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round0))) % P + ); + (eta, ) = splitChallenge(previousChallenge); + } + + function generateBetaGammaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) { + bytes32[7] memory round1; + round1[0] = FrLib.toBytes32(previousChallenge); + round1[1] = bytes32(proof.lookupReadCounts.x); + round1[2] = bytes32(proof.lookupReadCounts.y); + round1[3] = bytes32(proof.lookupReadTags.x); + round1[4] = bytes32(proof.lookupReadTags.y); + round1[5] = bytes32(proof.w4.x); + round1[6] = bytes32(proof.w4.y); + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round1))) % P + ); + (beta, gamma) = splitChallenge(nextPreviousChallenge); + } + + // Alpha challenges non-linearise the gate contributions + function generateAlphaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) + internal + pure + returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) + { + // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup + uint256[5] memory alpha0; + alpha0[0] = Fr.unwrap(previousChallenge); + alpha0[1] = proof.lookupInverses.x; + alpha0[2] = proof.lookupInverses.y; + alpha0[3] = proof.zPerm.x; + alpha0[4] = proof.zPerm.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(alpha0))) % P + ); + Fr alpha; + (alpha, ) = splitChallenge(nextPreviousChallenge); + + // Compute powers of alpha for batching subrelations + alphas[0] = alpha; + for (uint256 i = 1; i < NUMBER_OF_ALPHAS; i++) { + alphas[i] = alphas[i - 1] * alpha; + } + } + + function generateGateChallenges( + Fr previousChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, + Fr nextPreviousChallenge + ) + { + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))) % + P + ); + (gateChallenges[0], ) = splitChallenge(previousChallenge); + for (uint256 i = 1; i < logN; i++) { + gateChallenges[i] = gateChallenges[i - 1] * gateChallenges[i - 1]; + } + nextPreviousChallenge = previousChallenge; + } + + function generateLibraChallenge( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr libraChallenge, Fr nextPreviousChallenge) { + // 2 comm, 1 sum, 1 challenge + uint256[4] memory challengeData; + challengeData[0] = Fr.unwrap(previousChallenge); + challengeData[1] = proof.libraCommitments[0].x; + challengeData[2] = proof.libraCommitments[0].y; + challengeData[3] = Fr.unwrap(proof.libraSum); + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(challengeData))) % P + ); + (libraChallenge, ) = splitChallenge(nextPreviousChallenge); + } + + function generateSumcheckChallenges( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, + Fr nextPreviousChallenge + ) + { + for (uint256 i = 0; i < logN; i++) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH + 1] memory univariateChal; + univariateChal[0] = prevChallenge; + + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + univariateChal[j + 1] = proof.sumcheckUnivariates[i][j]; + } + prevChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(univariateChal))) % P + ); + + (sumcheckChallenges[i], ) = splitChallenge(prevChallenge); + } + nextPreviousChallenge = prevChallenge; + } + + // We add Libra claimed eval + 2 libra commitments (grand_sum, quotient) + function generateRhoChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr rho, Fr nextPreviousChallenge) { + uint256[NUMBER_OF_ENTITIES_ZK + 6] memory rhoChallengeElements; + rhoChallengeElements[0] = Fr.unwrap(prevChallenge); + uint256 i; + for (i = 1; i <= NUMBER_OF_ENTITIES_ZK; i++) { + rhoChallengeElements[i] = Fr.unwrap( + proof.sumcheckEvaluations[i - 1] + ); + } + rhoChallengeElements[i] = Fr.unwrap(proof.libraEvaluation); + i += 1; + rhoChallengeElements[i] = proof.libraCommitments[1].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[1].y; + i += 2; + rhoChallengeElements[i] = proof.libraCommitments[2].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[2].y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(rhoChallengeElements))) % P + ); + (rho, ) = splitChallenge(nextPreviousChallenge); + } + + function generateGeminiRChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr geminiR, Fr nextPreviousChallenge) { + uint256[] memory gR = new uint256[]((logN - 1) * 2 + 1); + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < logN - 1; i++) { + gR[1 + i * 2] = proof.geminiFoldComms[i].x; + gR[2 + i * 2] = proof.geminiFoldComms[i].y; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(gR))) % P + ); + + (geminiR, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr shplonkNu, Fr nextPreviousChallenge) { + uint256[] memory shplonkNuChallengeElements = new uint256[]( + logN + 1 + 4 + ); + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 1; i <= logN; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.geminiAEvaluations[i - 1] + ); + } + + uint256 libraIdx = 0; + for (uint256 i = logN + 1; i <= logN + 4; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.libraPolyEvals[libraIdx] + ); + libraIdx++; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkNuChallengeElements))) % P + ); + (shplonkNu, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr shplonkZ, Fr nextPreviousChallenge) { + uint256[3] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x; + shplonkZChallengeElements[2] = proof.shplonkQ.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkZChallengeElements))) % P + ); + (shplonkZ, ) = splitChallenge(nextPreviousChallenge); + } + + function loadProof( + bytes calldata proof, + uint256 logN + ) internal pure returns (Honk.ZKProof memory p) { + uint256 boundary = 0x0; + + // Pairing point object + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + uint256 limb = uint256( + bytes32(proof[boundary:boundary + FIELD_ELEMENT_SIZE]) + ); + // lo limbs (even index) < 2^136, hi limbs (odd index) < 2^120 + require( + limb < 2 ** (i % 2 == 0 ? 136 : 120), + Errors.ValueGeLimbMax() + ); + p.pairingPointObject[i] = FrLib.from(limb); + boundary += FIELD_ELEMENT_SIZE; + } + + // Gemini masking polynomial commitment (sent first in ZK flavors, right after pairing points) + p.geminiMaskingPoly = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Commitments + p.w1 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w2 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w3 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + + // Lookup / Permutation Helper Commitments + p.lookupReadCounts = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.lookupReadTags = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.w4 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.lookupInverses = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.zPerm = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[0] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + p.libraSum = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + // Sumcheck univariates + for (uint256 i = 0; i < logN; i++) { + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + p.sumcheckUnivariates[i][j] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + } + + // Sumcheck evaluations (includes gemini_masking_poly eval at index 0 for ZK flavors) + for (uint256 i = 0; i < NUMBER_OF_ENTITIES_ZK; i++) { + p.sumcheckEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + p.libraEvaluation = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + + p.libraCommitments[1] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[2] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < logN - 1; i++) { + p.geminiFoldComms[i] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + } + + // Read gemini a evaluations + for (uint256 i = 0; i < logN; i++) { + p.geminiAEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + for (uint256 i = 0; i < 4; i++) { + p.libraPolyEvals[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + // Shplonk + p.shplonkQ = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + // KZG + p.kzgQuotient = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + } +} + +library RelationsLib { + struct EllipticParams { + // Points + Fr x_1; + Fr y_1; + Fr x_2; + Fr y_2; + Fr y_3; + Fr x_3; + // push accumulators into memory + Fr x_double_identity; + } + + // Parameters used within the Memory Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct MemParams { + Fr memory_record_check; + Fr partial_record_check; + Fr next_gate_access_type; + Fr record_delta; + Fr index_delta; + Fr adjacent_values_match_if_adjacent_indices_match; + Fr adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + Fr access_check; + Fr next_gate_access_type_is_boolean; + Fr ROM_consistency_check_identity; + Fr RAM_consistency_check_identity; + Fr timestamp_delta; + Fr RAM_timestamp_check_identity; + Fr memory_identity; + Fr index_is_monotonically_increasing; + } + + // Parameters used within the Non-Native Field Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct NnfParams { + Fr limb_subproduct; + Fr non_native_field_gate_1; + Fr non_native_field_gate_2; + Fr non_native_field_gate_3; + Fr limb_accumulator_1; + Fr limb_accumulator_2; + Fr nnf_identity; + } + + struct PoseidonExternalParams { + Fr s1; + Fr s2; + Fr s3; + Fr s4; + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr t0; + Fr t1; + Fr t2; + Fr t3; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr q_pos_by_scaling; + } + + struct PoseidonInternalParams { + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr u_sum; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr s1; + Fr q_pos_by_scaling; + } + + Fr internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = Fr.wrap(17); // -(-17) + uint256 internal constant NEG_HALF_MODULO_P = + 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + + // Constants for the Non-native Field relation + Fr internal constant LIMB_SIZE = Fr.wrap(uint256(1) << 68); + Fr internal constant SUBLIMB_SHIFT = Fr.wrap(uint256(1) << 14); + + function accumulateRelationEvaluations( + Fr[NUMBER_OF_ENTITIES] memory purportedEvaluations, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges, + Fr powPartialEval + ) external pure returns (Fr accumulator) { + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations; + + // Accumulate all relations in Ultra Honk - each with varying number of subrelations + accumulateArithmeticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePermutationRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateLogDerivativeLookupRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateDeltaRangeRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateEllipticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateMemoryRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateNnfRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonExternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonInternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + + // batch the subrelations with the precomputed alpha powers to obtain the full honk relation + accumulator = scaleAndBatchSubrelations( + evaluations, + subrelationChallenges + ); + } + + /** + * Aesthetic helper function that is used to index by enum into proof.sumcheckEvaluations, it avoids + * the relation checking code being cluttered with uint256 type casting, which is often a different colour in code + * editors, and thus is noisy. + */ + function wire( + Fr[NUMBER_OF_ENTITIES] memory p, + WIRE _wire + ) internal pure returns (Fr) { + return p[uint256(_wire)]; + } + + /** + * Ultra Arithmetic Relation + * + */ + function accumulateArithmeticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + // Relation 0 + Fr q_arith = wire(p, WIRE.Q_ARITH); + { + Fr neg_half = Fr.wrap(NEG_HALF_MODULO_P); + + Fr accum = (q_arith - Fr.wrap(3)) * + (wire(p, WIRE.Q_M) * wire(p, WIRE.W_R) * wire(p, WIRE.W_L)) * + neg_half; + accum = + accum + + (wire(p, WIRE.Q_L) * wire(p, WIRE.W_L)) + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_R)) + + (wire(p, WIRE.Q_O) * wire(p, WIRE.W_O)) + + (wire(p, WIRE.Q_4) * wire(p, WIRE.W_4)) + + wire(p, WIRE.Q_C); + accum = accum + (q_arith - ONE) * wire(p, WIRE.W_4_SHIFT); + accum = accum * q_arith; + accum = accum * domainSep; + evals[6] = accum; + } + + // Relation 1 + { + Fr accum = wire(p, WIRE.W_L) + + wire(p, WIRE.W_4) - + wire(p, WIRE.W_L_SHIFT) + + wire(p, WIRE.Q_M); + accum = accum * (q_arith - Fr.wrap(2)); + accum = accum * (q_arith - ONE); + accum = accum * q_arith; + accum = accum * domainSep; + evals[7] = accum; + } + } + + function accumulatePermutationRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr grand_product_numerator; + Fr grand_product_denominator; + + { + Fr num = wire(p, WIRE.W_L) + + wire(p, WIRE.ID_1) * + rp.beta + + rp.gamma; + num = + num * + (wire(p, WIRE.W_R) + wire(p, WIRE.ID_2) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_O) + wire(p, WIRE.ID_3) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_4) + wire(p, WIRE.ID_4) * rp.beta + rp.gamma); + + grand_product_numerator = num; + } + { + Fr den = wire(p, WIRE.W_L) + + wire(p, WIRE.SIGMA_1) * + rp.beta + + rp.gamma; + den = + den * + (wire(p, WIRE.W_R) + + wire(p, WIRE.SIGMA_2) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_O) + + wire(p, WIRE.SIGMA_3) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_4) + + wire(p, WIRE.SIGMA_4) * + rp.beta + + rp.gamma); + + grand_product_denominator = den; + } + + // Contribution 2 + { + Fr acc = (wire(p, WIRE.Z_PERM) + wire(p, WIRE.LAGRANGE_FIRST)) * + grand_product_numerator; + + acc = + acc - + ((wire(p, WIRE.Z_PERM_SHIFT) + + (wire(p, WIRE.LAGRANGE_LAST) * rp.publicInputsDelta)) * + grand_product_denominator); + acc = acc * domainSep; + evals[0] = acc; + } + + // Contribution 3 + { + Fr acc = (wire(p, WIRE.LAGRANGE_LAST) * + wire(p, WIRE.Z_PERM_SHIFT)) * domainSep; + evals[1] = acc; + } + + // Contribution 4: z_perm initialization check (lagrange_first * z_perm = 0) + { + Fr acc = (wire(p, WIRE.LAGRANGE_FIRST) * wire(p, WIRE.Z_PERM)) * + domainSep; + evals[2] = acc; + } + } + + function accumulateLogDerivativeLookupRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr table_term; + Fr lookup_term; + + // Calculate the write term (the table accumulation) + // table_term = table_1 + γ + table_2 * β + table_3 * β² + table_4 * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + table_term = + wire(p, WIRE.TABLE_1) + + rp.gamma + + (wire(p, WIRE.TABLE_2) * rp.beta) + + (wire(p, WIRE.TABLE_3) * beta_sqr) + + (wire(p, WIRE.TABLE_4) * beta_sqr * rp.beta); + } + + // Calculate the read term + // lookup_term = derived_entry_1 + γ + derived_entry_2 * β + derived_entry_3 * β² + q_index * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + Fr derived_entry_1 = wire(p, WIRE.W_L) + + rp.gamma + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_L_SHIFT)); + Fr derived_entry_2 = wire(p, WIRE.W_R) + + wire(p, WIRE.Q_M) * + wire(p, WIRE.W_R_SHIFT); + Fr derived_entry_3 = wire(p, WIRE.W_O) + + wire(p, WIRE.Q_C) * + wire(p, WIRE.W_O_SHIFT); + + lookup_term = + derived_entry_1 + + (derived_entry_2 * rp.beta) + + (derived_entry_3 * beta_sqr) + + (wire(p, WIRE.Q_O) * beta_sqr * rp.beta); + } + + Fr lookup_inverse = wire(p, WIRE.LOOKUP_INVERSES) * table_term; + Fr table_inverse = wire(p, WIRE.LOOKUP_INVERSES) * lookup_term; + + Fr inverse_exists_xor = wire(p, WIRE.LOOKUP_READ_TAGS) + + wire(p, WIRE.Q_LOOKUP) - + (wire(p, WIRE.LOOKUP_READ_TAGS) * wire(p, WIRE.Q_LOOKUP)); + + // Inverse calculated correctly relation + Fr accumulatorNone = lookup_term * + table_term * + wire(p, WIRE.LOOKUP_INVERSES) - + inverse_exists_xor; + accumulatorNone = accumulatorNone * domainSep; + + // Inverse + Fr accumulatorOne = wire(p, WIRE.Q_LOOKUP) * + lookup_inverse - + wire(p, WIRE.LOOKUP_READ_COUNTS) * + table_inverse; + + Fr read_tag = wire(p, WIRE.LOOKUP_READ_TAGS); + + Fr read_tag_boolean_relation = read_tag * read_tag - read_tag; + + evals[3] = accumulatorNone; + evals[4] = accumulatorOne; + evals[5] = read_tag_boolean_relation * domainSep; + } + + function accumulateDeltaRangeRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr minus_one = ZERO - ONE; + Fr minus_two = ZERO - Fr.wrap(2); + Fr minus_three = ZERO - Fr.wrap(3); + + // Compute wire differences + Fr delta_1 = wire(p, WIRE.W_R) - wire(p, WIRE.W_L); + Fr delta_2 = wire(p, WIRE.W_O) - wire(p, WIRE.W_R); + Fr delta_3 = wire(p, WIRE.W_4) - wire(p, WIRE.W_O); + Fr delta_4 = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_4); + + // Contribution 6 + { + Fr acc = delta_1; + acc = acc * (delta_1 + minus_one); + acc = acc * (delta_1 + minus_two); + acc = acc * (delta_1 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[8] = acc; + } + + // Contribution 7 + { + Fr acc = delta_2; + acc = acc * (delta_2 + minus_one); + acc = acc * (delta_2 + minus_two); + acc = acc * (delta_2 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[9] = acc; + } + + // Contribution 8 + { + Fr acc = delta_3; + acc = acc * (delta_3 + minus_one); + acc = acc * (delta_3 + minus_two); + acc = acc * (delta_3 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[10] = acc; + } + + // Contribution 9 + { + Fr acc = delta_4; + acc = acc * (delta_4 + minus_one); + acc = acc * (delta_4 + minus_two); + acc = acc * (delta_4 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[11] = acc; + } + } + + function accumulateEllipticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + EllipticParams memory ep; + ep.x_1 = wire(p, WIRE.W_R); + ep.y_1 = wire(p, WIRE.W_O); + + ep.x_2 = wire(p, WIRE.W_L_SHIFT); + ep.y_2 = wire(p, WIRE.W_4_SHIFT); + ep.y_3 = wire(p, WIRE.W_O_SHIFT); + ep.x_3 = wire(p, WIRE.W_R_SHIFT); + + Fr q_sign = wire(p, WIRE.Q_L); + Fr q_is_double = wire(p, WIRE.Q_M); + + // Contribution 10 point addition, x-coordinate check + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + Fr x_diff = (ep.x_2 - ep.x_1); + Fr y1_sqr = (ep.y_1 * ep.y_1); + { + // Move to top + Fr partialEval = domainSep; + + Fr y2_sqr = (ep.y_2 * ep.y_2); + Fr y1y2 = ep.y_1 * ep.y_2 * q_sign; + Fr x_add_identity = (ep.x_3 + ep.x_2 + ep.x_1); + x_add_identity = x_add_identity * x_diff * x_diff; + x_add_identity = x_add_identity - y2_sqr - y1_sqr + y1y2 + y1y2; + + evals[12] = + x_add_identity * + partialEval * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 11 point addition, x-coordinate check + // q_elliptic * (q_sign * y1 + y3)(x2 - x1) + (x3 - x1)(y2 - q_sign * y1) = 0 + { + Fr y1_plus_y3 = ep.y_1 + ep.y_3; + Fr y_diff = ep.y_2 * q_sign - ep.y_1; + Fr y_add_identity = y1_plus_y3 * + x_diff + + (ep.x_3 - ep.x_1) * + y_diff; + evals[13] = + y_add_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 10 point doubling, x-coordinate check + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + // N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 + { + Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; + Fr y1_sqr_mul_4 = y1_sqr + y1_sqr; + y1_sqr_mul_4 = y1_sqr_mul_4 + y1_sqr_mul_4; + Fr x1_pow_4_mul_9 = x_pow_4 * Fr.wrap(9); + + // NOTE: pushed into memory (stack >:'( ) + ep.x_double_identity = + (ep.x_3 + ep.x_1 + ep.x_1) * + y1_sqr_mul_4 - + x1_pow_4_mul_9; + + Fr acc = ep.x_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + evals[12] = evals[12] + acc; + } + + // Contribution 11 point doubling, y-coordinate check + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + { + Fr x1_sqr_mul_3 = (ep.x_1 + ep.x_1 + ep.x_1) * ep.x_1; + Fr y_double_identity = x1_sqr_mul_3 * + (ep.x_1 - ep.x_3) - + (ep.y_1 + ep.y_1) * + (ep.y_1 + ep.y_3); + evals[13] = + evals[13] + + y_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + } + } + + function accumulateMemoryRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + MemParams memory ap; + + // Compute eta powers locally + Fr eta_two = rp.eta * rp.eta; + Fr eta_three = eta_two * rp.eta; + + /** + * MEMORY + * + * A RAM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * t: `timestamp` of memory cell being accessed (used for RAM, set to 0 for ROM) + * * v: `value` of memory cell being accessed + * * a: `access` type of record. read: 0 = read, 1 = write + * * r: `record` of memory cell. record = access + index * eta + timestamp * eta_two + value * eta_three + * + * A ROM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * v: `value1` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * v2:`value2` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * r: `record` of memory cell. record = index * eta + value2 * eta_two + value1 * eta_three + * + * When performing a read/write access, the values of i, t, v, v2, a, r are stored in the following wires + + * selectors, depending on whether the gate is a RAM read/write or a ROM read + * + * | gate type | i | v2/t | v | a | r | + * | --------- | -- | ----- | -- | -- | -- | + * | ROM | w1 | w2 | w3 | -- | w4 | + * | RAM | w1 | w2 | w3 | qc | w4 | + * + * (for accesses where `index` is a circuit constant, it is assumed the circuit will apply a copy constraint on + * `w2` to fix its value) + * + * + */ + + /** + * Memory Record Check + * Partial degree: 1 + * Total degree: 4 + * + * A ROM/ROM access gate can be evaluated with the identity: + * + * qc + w1 \eta + w2 \eta_two + w3 \eta_three - w4 = 0 + * + * For ROM gates, qc = 0 + */ + ap.memory_record_check = wire(p, WIRE.W_O) * eta_three; + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_R) * eta_two); + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_L) * rp.eta); + ap.memory_record_check = ap.memory_record_check + wire(p, WIRE.Q_C); + ap.partial_record_check = ap.memory_record_check; // used in RAM consistency check; deg 1 or 4 + ap.memory_record_check = ap.memory_record_check - wire(p, WIRE.W_4); + + /** + * Contribution 13 & 14 + * ROM Consistency Check + * Partial degree: 1 + * Total degree: 4 + * + * For every ROM read, a set equivalence check is applied between the record witnesses, and a second set of + * records that are sorted. + * + * We apply the following checks for the sorted records: + * + * 1. w1, w2, w3 correctly map to 'index', 'v1, 'v2' for a given record value at w4 + * 2. index values for adjacent records are monotonically increasing + * 3. if, at gate i, index_i == index_{i + 1}, then value1_i == value1_{i + 1} and value2_i == value2_{i + 1} + * + */ + ap.index_delta = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_L); + ap.record_delta = wire(p, WIRE.W_4_SHIFT) - wire(p, WIRE.W_4); + + ap.index_is_monotonically_increasing = + ap.index_delta * + (ap.index_delta - Fr.wrap(1)); // deg 2 + + ap.adjacent_values_match_if_adjacent_indices_match = + (ap.index_delta * MINUS_ONE + ONE) * + ap.record_delta; // deg 2 + + evals[15] = + ap.adjacent_values_match_if_adjacent_indices_match * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + evals[16] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + + ap.ROM_consistency_check_identity = + ap.memory_record_check * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)); // deg 3 or 7 + + /** + * Contributions 15,16,17 + * RAM Consistency Check + * + * The 'access' type of the record is extracted with the expression `w_4 - ap.partial_record_check` + * (i.e. for an honest Prover `w1 * eta + w2 * eta^2 + w3 * eta^3 - w4 = access`. + * This is validated by requiring `access` to be boolean + * + * For two adjacent entries in the sorted list if _both_ + * A) index values match + * B) adjacent access value is 0 (i.e. next gate is a READ) + * then + * C) both values must match. + * The gate boolean check is + * (A && B) => C === !(A && B) || C === !A || !B || C + * + * N.B. it is the responsibility of the circuit writer to ensure that every RAM cell is initialized + * with a WRITE operation. + */ + Fr access_type = (wire(p, WIRE.W_4) - ap.partial_record_check); // will be 0 or 1 for honest Prover; deg 1 or 4 + ap.access_check = access_type * (access_type - Fr.wrap(1)); // check value is 0 or 1; deg 2 or 8 + + // reverse order we could re-use `ap.partial_record_check` 1 - ((w3' * eta + w2') * eta + w1') * eta + // deg 1 or 4 + ap.next_gate_access_type = wire(p, WIRE.W_O_SHIFT) * eta_three; + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_R_SHIFT) * eta_two); + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_L_SHIFT) * rp.eta); + ap.next_gate_access_type = + wire(p, WIRE.W_4_SHIFT) - + ap.next_gate_access_type; + + Fr value_delta = wire(p, WIRE.W_O_SHIFT) - wire(p, WIRE.W_O); + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = + (ap.index_delta * MINUS_ONE + ONE) * + value_delta * + (ap.next_gate_access_type * MINUS_ONE + ONE); // deg 3 or 6 + + // We can't apply the RAM consistency check identity on the final entry in the sorted list (the wires in the + // next gate would make the identity fail). We need to validate that its 'access type' bool is correct. Can't + // do with an arithmetic gate because of the `eta` factors. We need to check that the *next* gate's access + // type is correct, to cover this edge case + // deg 2 or 4 + ap.next_gate_access_type_is_boolean = + ap.next_gate_access_type * + ap.next_gate_access_type - + ap.next_gate_access_type; + + // Putting it all together... + evals[17] = + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 or 8 + evals[18] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 + evals[19] = + ap.next_gate_access_type_is_boolean * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 6 + + ap.RAM_consistency_check_identity = + ap.access_check * + (wire(p, WIRE.Q_O)); // deg 3 or 9 + + /** + * RAM Timestamp Consistency Check + * + * | w1 | w2 | w3 | w4 | + * | index | timestamp | timestamp_check | -- | + * + * Let delta_index = index_{i + 1} - index_{i} + * + * Iff delta_index == 0, timestamp_check = timestamp_{i + 1} - timestamp_i + * Else timestamp_check = 0 + */ + ap.timestamp_delta = wire(p, WIRE.W_R_SHIFT) - wire(p, WIRE.W_R); + ap.RAM_timestamp_check_identity = + (ap.index_delta * MINUS_ONE + ONE) * + ap.timestamp_delta - + wire(p, WIRE.W_O); // deg 3 + + /** + * Complete Contribution 12 + * The complete RAM/ROM memory identity + * Partial degree: + */ + ap.memory_identity = ap.ROM_consistency_check_identity; // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_timestamp_check_identity * + (wire(p, WIRE.Q_4) * wire(p, WIRE.Q_L)); // deg 4 + ap.memory_identity = + ap.memory_identity + + ap.memory_record_check * + (wire(p, WIRE.Q_M) * wire(p, WIRE.Q_L)); // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_consistency_check_identity; // deg 3 or 9 + + // (deg 3 or 9) + (deg 4) + (deg 3) + ap.memory_identity = + ap.memory_identity * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 10 + evals[14] = ap.memory_identity; + } + + function accumulateNnfRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + NnfParams memory ap; + + /** + * Contribution 12 + * Non native field arithmetic gate 2 + * deg 4 + * + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * + */ + ap.limb_subproduct = + wire(p, WIRE.W_L) * + wire(p, WIRE.W_R_SHIFT) + + wire(p, WIRE.W_L_SHIFT) * + wire(p, WIRE.W_R); + ap.non_native_field_gate_2 = (wire(p, WIRE.W_L) * + wire(p, WIRE.W_4) + + wire(p, WIRE.W_R) * + wire(p, WIRE.W_O) - + wire(p, WIRE.W_O_SHIFT)); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * LIMB_SIZE; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 - + wire(p, WIRE.W_4_SHIFT); + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 + + ap.limb_subproduct; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 * + wire(p, WIRE.Q_4); + + ap.limb_subproduct = ap.limb_subproduct * LIMB_SIZE; + ap.limb_subproduct = + ap.limb_subproduct + + (wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R_SHIFT)); + ap.non_native_field_gate_1 = ap.limb_subproduct; + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 - + (wire(p, WIRE.W_O) + wire(p, WIRE.W_4)); + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 * + wire(p, WIRE.Q_O); + + ap.non_native_field_gate_3 = ap.limb_subproduct; + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 + + wire(p, WIRE.W_4); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 - + (wire(p, WIRE.W_O_SHIFT) + wire(p, WIRE.W_4_SHIFT)); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 * + wire(p, WIRE.Q_M); + + Fr non_native_field_identity = ap.non_native_field_gate_1 + + ap.non_native_field_gate_2 + + ap.non_native_field_gate_3; + non_native_field_identity = + non_native_field_identity * + wire(p, WIRE.Q_R); + + // ((((w2' * 2^14 + w1') * 2^14 + w3) * 2^14 + w2) * 2^14 + w1 - w4) * qm + // deg 2 + ap.limb_accumulator_1 = wire(p, WIRE.W_R_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_O); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_R); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L); + ap.limb_accumulator_1 = ap.limb_accumulator_1 - wire(p, WIRE.W_4); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * wire(p, WIRE.Q_4); + + // ((((w3' * 2^14 + w2') * 2^14 + w1') * 2^14 + w4) * 2^14 + w3 - w4') * qm + // deg 2 + ap.limb_accumulator_2 = wire(p, WIRE.W_O_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_R_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_4); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_O); + ap.limb_accumulator_2 = ap.limb_accumulator_2 - wire(p, WIRE.W_4_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * wire(p, WIRE.Q_M); + + Fr limb_accumulator_identity = ap.limb_accumulator_1 + + ap.limb_accumulator_2; + limb_accumulator_identity = + limb_accumulator_identity * + wire(p, WIRE.Q_O); // deg 3 + + ap.nnf_identity = non_native_field_identity + limb_accumulator_identity; + ap.nnf_identity = ap.nnf_identity * (wire(p, WIRE.Q_NNF) * domainSep); + evals[20] = ap.nnf_identity; + } + + function accumulatePoseidonExternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonExternalParams memory ep; + + ep.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + ep.s2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_R); + ep.s3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_O); + ep.s4 = wire(p, WIRE.W_4) + wire(p, WIRE.Q_4); + + ep.u1 = ep.s1 * ep.s1 * ep.s1 * ep.s1 * ep.s1; + ep.u2 = ep.s2 * ep.s2 * ep.s2 * ep.s2 * ep.s2; + ep.u3 = ep.s3 * ep.s3 * ep.s3 * ep.s3 * ep.s3; + ep.u4 = ep.s4 * ep.s4 * ep.s4 * ep.s4 * ep.s4; + // matrix mul v = M_E * u with 14 additions + ep.t0 = ep.u1 + ep.u2; // u_1 + u_2 + ep.t1 = ep.u3 + ep.u4; // u_3 + u_4 + ep.t2 = ep.u2 + ep.u2 + ep.t1; // 2u_2 + // ep.t2 += ep.t1; // 2u_2 + u_3 + u_4 + ep.t3 = ep.u4 + ep.u4 + ep.t0; // 2u_4 + // ep.t3 += ep.t0; // u_1 + u_2 + 2u_4 + ep.v4 = ep.t1 + ep.t1; + ep.v4 = ep.v4 + ep.v4 + ep.t3; + // ep.v4 += ep.t3; // u_1 + u_2 + 4u_3 + 6u_4 + ep.v2 = ep.t0 + ep.t0; + ep.v2 = ep.v2 + ep.v2 + ep.t2; + // ep.v2 += ep.t2; // 4u_1 + 6u_2 + u_3 + u_4 + ep.v1 = ep.t3 + ep.v2; // 5u_1 + 7u_2 + u_3 + 3u_4 + ep.v3 = ep.t2 + ep.v4; // u_1 + 3u_2 + 5u_3 + 7u_4 + + ep.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_EXTERNAL) * domainSep; + evals[21] = + evals[21] + + ep.q_pos_by_scaling * + (ep.v1 - wire(p, WIRE.W_L_SHIFT)); + + evals[22] = + evals[22] + + ep.q_pos_by_scaling * + (ep.v2 - wire(p, WIRE.W_R_SHIFT)); + + evals[23] = + evals[23] + + ep.q_pos_by_scaling * + (ep.v3 - wire(p, WIRE.W_O_SHIFT)); + + evals[24] = + evals[24] + + ep.q_pos_by_scaling * + (ep.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + function accumulatePoseidonInternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonInternalParams memory ip; + + Fr[4] memory INTERNAL_MATRIX_DIAGONAL = [ + FrLib.from( + 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7 + ), + FrLib.from( + 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b + ), + FrLib.from( + 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15 + ), + FrLib.from( + 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b + ) + ]; + + // add round constants + ip.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + + // apply s-box round + ip.u1 = ip.s1 * ip.s1 * ip.s1 * ip.s1 * ip.s1; + ip.u2 = wire(p, WIRE.W_R); + ip.u3 = wire(p, WIRE.W_O); + ip.u4 = wire(p, WIRE.W_4); + + // matrix mul with v = M_I * u 4 muls and 7 additions + ip.u_sum = ip.u1 + ip.u2 + ip.u3 + ip.u4; + + ip.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_INTERNAL) * domainSep; + + ip.v1 = ip.u1 * INTERNAL_MATRIX_DIAGONAL[0] + ip.u_sum; + evals[25] = + evals[25] + + ip.q_pos_by_scaling * + (ip.v1 - wire(p, WIRE.W_L_SHIFT)); + + ip.v2 = ip.u2 * INTERNAL_MATRIX_DIAGONAL[1] + ip.u_sum; + evals[26] = + evals[26] + + ip.q_pos_by_scaling * + (ip.v2 - wire(p, WIRE.W_R_SHIFT)); + + ip.v3 = ip.u3 * INTERNAL_MATRIX_DIAGONAL[2] + ip.u_sum; + evals[27] = + evals[27] + + ip.q_pos_by_scaling * + (ip.v3 - wire(p, WIRE.W_O_SHIFT)); + + ip.v4 = ip.u4 * INTERNAL_MATRIX_DIAGONAL[3] + ip.u_sum; + evals[28] = + evals[28] + + ip.q_pos_by_scaling * + (ip.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + // Batch subrelation evaluations using precomputed powers of alpha + // First subrelation is implicitly scaled by 1, subsequent ones use powers from the subrelationChallenges array + function scaleAndBatchSubrelations( + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges + ) internal pure returns (Fr accumulator) { + accumulator = evaluations[0]; + + for (uint256 i = 1; i < NUMBER_OF_SUBRELATIONS; ++i) { + accumulator = + accumulator + + evaluations[i] * + subrelationChallenges[i - 1]; + } + } +} + +library CommitmentSchemeLib { + using FrLib for Fr; + + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + Fr unshiftedScalarNeg; + Fr shiftedScalarNeg; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Accumulator for powers of rho + Fr batchingChallenge; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchedEvaluation; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] denominators; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] batchingScalars; + // 1/(z - r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr posInvertedDenominator; + // 1/(z + r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr negInvertedDenominator; + // ν^{2i} * 1/(z - r^{2^i}) + Fr scalingFactorPos; + // ν^{2i+1} * 1/(z + r^{2^i}) + Fr scalingFactorNeg; + // Fold_i(r^{2^i}) reconstructed by Verifier + Fr[] foldPosEvaluations; + } + + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., m-1 + function computeFoldPosEvaluations( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckUChallenges, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[] memory geminiEvalChallengePowers, + uint256 logSize + ) internal view returns (Fr[] memory) { + Fr[] memory foldPosEvaluations = new Fr[](logSize); + for (uint256 i = logSize; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = sumcheckUChallenges[i - 1]; + + Fr batchedEvalRoundAcc = ((challengePower * + batchedEvalAccumulator * + Fr.wrap(2)) - + geminiEvaluations[i - 1] * + (challengePower * (ONE - u) - u)); + // Divide by the denominator + batchedEvalRoundAcc = + batchedEvalRoundAcc * + (challengePower * (ONE - u) + u).invert(); + + batchedEvalAccumulator = batchedEvalRoundAcc; + foldPosEvaluations[i - 1] = batchedEvalRoundAcc; + } + return foldPosEvaluations; + } + + function computeSquares( + Fr r, + uint256 logN + ) internal pure returns (Fr[] memory) { + Fr[] memory squares = new Fr[](logN); + squares[0] = r; + for (uint256 i = 1; i < logN; ++i) { + squares[i] = squares[i - 1].sqr(); + } + return squares; + } +} + +uint256 constant Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // EC group order. F_q + +// Fr utility + +function bytesToFr(bytes calldata proofSection) pure returns (Fr scalar) { + scalar = FrLib.fromBytes32(bytes32(proofSection)); +} + +// EC Point utilities +function bytesToG1Point( + bytes calldata proofSection +) pure returns (Honk.G1Point memory point) { + uint256 x = uint256(bytes32(proofSection[0x00:0x20])); + uint256 y = uint256(bytes32(proofSection[0x20:0x40])); + require(x < Q && y < Q, Errors.ValueGeGroupOrder()); + + // (0,0) is the canonical EIP-196 encoding of the identity. It is accepted here + // because polynomial commitments to identically-zero polynomials (e.g. unused + // selector or table polys) are legitimately the identity. On-curve validation + // (y² = x³ + 3) is handled by the ecAdd/ecMul precompiles per EIP-196. + point = Honk.G1Point({ x: x, y: y }); +} + +function negateInplace( + Honk.G1Point memory point +) pure returns (Honk.G1Point memory) { + // When y == 0 (order-2 point), negation is the same point. Q - 0 = Q which is >= Q. + if (point.y != 0) { + point.y = Q - point.y; + } + return point; +} + +/** + * Convert the pairing points to G1 points. + * + * The pairing points are serialised as an array of 2 limbs representing two points + * (P0 and P1, used for lhs and rhs of pairing operation). + * + * There are 2 limbs (lo, hi) for each coordinate, so 4 limbs per point, 8 total. + * Layout: [P0.x_lo, P0.x_hi, P0.y_lo, P0.y_hi, P1.x_lo, P1.x_hi, P1.y_lo, P1.y_hi] + * + * @param pairingPoints The pairing points to convert. + * @return lhs P0 point + * @return rhs P1 point + */ +function convertPairingPointsToG1( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (Honk.G1Point memory lhs, Honk.G1Point memory rhs) { + // P0 (lhs): x = lo | (hi << 136) + uint256 lhsX = Fr.unwrap(pairingPoints[0]); + lhsX |= Fr.unwrap(pairingPoints[1]) << 136; + + uint256 lhsY = Fr.unwrap(pairingPoints[2]); + lhsY |= Fr.unwrap(pairingPoints[3]) << 136; + + // P1 (rhs): x = lo | (hi << 136) + uint256 rhsX = Fr.unwrap(pairingPoints[4]); + rhsX |= Fr.unwrap(pairingPoints[5]) << 136; + + uint256 rhsY = Fr.unwrap(pairingPoints[6]); + rhsY |= Fr.unwrap(pairingPoints[7]) << 136; + + // Reconstructed coordinates must be < Q to prevent malleability. + // Without this, two different limb encodings could map to the same curve point + // (via mulmod reduction in on-curve checks) but produce different transcript hashes. + require( + lhsX < Q && lhsY < Q && rhsX < Q && rhsY < Q, + Errors.ValueGeGroupOrder() + ); + + lhs.x = lhsX; + lhs.y = lhsY; + rhs.x = rhsX; + rhs.y = rhsY; +} + +/** + * Hash the pairing inputs from the present verification context with those extracted from the public inputs. + * + * @param proofPairingPoints Pairing points from the proof - (public inputs). + * @param accLhs Accumulator point for the left side - result of shplemini. + * @param accRhs Accumulator point for the right side - result of shplemini. + * @return recursionSeparator The recursion separator - generated from hashing the above. + */ +function generateRecursionSeparator( + Fr[PAIRING_POINTS_SIZE] memory proofPairingPoints, + Honk.G1Point memory accLhs, + Honk.G1Point memory accRhs +) pure returns (Fr recursionSeparator) { + // hash the proof aggregated X + // hash the proof aggregated Y + // hash the accum X + // hash the accum Y + + ( + Honk.G1Point memory proofLhs, + Honk.G1Point memory proofRhs + ) = convertPairingPointsToG1(proofPairingPoints); + + uint256[8] memory recursionSeparatorElements; + + // Proof points + recursionSeparatorElements[0] = proofLhs.x; + recursionSeparatorElements[1] = proofLhs.y; + recursionSeparatorElements[2] = proofRhs.x; + recursionSeparatorElements[3] = proofRhs.y; + + // Accumulator points + recursionSeparatorElements[4] = accLhs.x; + recursionSeparatorElements[5] = accLhs.y; + recursionSeparatorElements[6] = accRhs.x; + recursionSeparatorElements[7] = accRhs.y; + + recursionSeparator = FrLib.from( + uint256(keccak256(abi.encodePacked(recursionSeparatorElements))) % P + ); +} + +/** + * G1 Mul with Separator + * Using the ecAdd and ecMul precompiles + * + * @param basePoint The point to multiply. + * @param other The other point to add. + * @param recursionSeperator The separator to use for the multiplication. + * @return `(recursionSeperator * basePoint) + other`. + */ +function mulWithSeperator( + Honk.G1Point memory basePoint, + Honk.G1Point memory other, + Fr recursionSeperator +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + result = ecMul(recursionSeperator, basePoint); + result = ecAdd(result, other); + + return result; +} + +/** + * G1 Mul + * Takes a Fr value and a G1 point and uses the ecMul precompile to return the result. + * + * @param value The value to multiply the point by. + * @param point The point to multiply. + * @return result The result of the multiplication. + */ +function ecMul( + Fr value, + Honk.G1Point memory point +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write the point into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | point.x + // free + 0x20| point.y + mstore(free, mload(point)) + mstore(add(free, 0x20), mload(add(point, 0x20))) + // Write the scalar into memory (one 32 byte word) + // Memory layout: + // Address | value + // free + 0x40| value + mstore(add(free, 0x40), value) + + // Call the ecMul precompile, it takes in the following + // [point.x, point.y, scalar], and returns the result back into the free memory location. + let success := staticcall(gas(), 0x07, free, 0x60, free, 0x40) + if iszero(success) { + revert(0, 0) + } + // Copy the result of the multiplication back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x60)) + } + + return result; +} + +/** + * G1 Add + * Takes two G1 points and uses the ecAdd precompile to return the result. + * + * @param lhs The left hand side of the addition. + * @param rhs The right hand side of the addition. + * @return result The result of the addition. + */ +function ecAdd( + Honk.G1Point memory lhs, + Honk.G1Point memory rhs +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write lhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | lhs.x + // free + 0x20| lhs.y + mstore(free, mload(lhs)) + mstore(add(free, 0x20), mload(add(lhs, 0x20))) + + // Write rhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free + 0x40| rhs.x + // free + 0x60| rhs.y + mstore(add(free, 0x40), mload(rhs)) + mstore(add(free, 0x60), mload(add(rhs, 0x20))) + + // Call the ecAdd precompile, it takes in the following + // [lhs.x, lhs.y, rhs.x, rhs.y], and returns their addition back into the free memory location. + let success := staticcall(gas(), 0x06, free, 0x80, free, 0x40) + if iszero(success) { + revert(0, 0) + } + + // Copy the result of the addition back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x80)) + } + + return result; +} + +function rejectPointAtInfinity(Honk.G1Point memory point) pure { + require((point.x | point.y) != 0, Errors.PointAtInfinity()); +} + +/** + * Check if pairing point limbs are all zero (default/infinity). + * Default pairing points indicate no recursive verification occurred. + */ +function arePairingPointsDefault( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (bool) { + uint256 acc = 0; + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + acc |= Fr.unwrap(pairingPoints[i]); + } + return acc == 0; +} + +function pairing( + Honk.G1Point memory rhs, + Honk.G1Point memory lhs +) view returns (bool decodedResult) { + bytes memory input = abi.encodePacked( + rhs.x, + rhs.y, + // Fixed G2 point + uint256( + 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2 + ), + uint256( + 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed + ), + uint256( + 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b + ), + uint256( + 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa + ), + lhs.x, + lhs.y, + // G2 point from VK + uint256( + 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1 + ), + uint256( + 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0 + ), + uint256( + 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4 + ), + uint256( + 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55 + ) + ); + + (bool success, bytes memory result) = address(0x08).staticcall(input); + decodedResult = success && abi.decode(result, (bool)); +} + +abstract contract BaseZKHonkVerifier is IVerifier { + using FrLib for Fr; + + struct PairingInputs { + Honk.G1Point P_0; + Honk.G1Point P_1; + } + + struct SmallSubgroupIpaIntermediates { + Fr[SUBGROUP_SIZE] challengePolyLagrange; + Fr challengePolyEval; + Fr lagrangeFirst; + Fr lagrangeLast; + Fr rootPower; + Fr[SUBGROUP_SIZE] denominators; // this has to disappear + Fr diff; + } + + // Constants for proof length calculation (matching UltraKeccakZKFlavor) + uint256 internal constant NUM_WITNESS_ENTITIES = + 8 + NUM_MASKING_POLYNOMIALS; + uint256 internal constant NUM_ELEMENTS_COMM = 2; // uint256 elements for curve points + uint256 internal constant NUM_ELEMENTS_FR = 1; // uint256 elements for field elements + uint256 internal constant NUM_LIBRA_EVALUATIONS = 4; // libra evaluations + + uint256 internal constant LIBRA_COMMITMENTS = 3; + uint256 internal constant LIBRA_EVALUATIONS = 4; + uint256 internal constant LIBRA_UNIVARIATES_LENGTH = 9; + + uint256 internal constant SHIFTED_COMMITMENTS_START = 30; + uint256 internal constant PERMUTATION_ARGUMENT_VALUE_SEPARATOR = 1 << 28; + + uint256 internal immutable $N; + uint256 internal immutable $LOG_N; + uint256 internal immutable $VK_HASH; + uint256 internal immutable $NUM_PUBLIC_INPUTS; + uint256 internal immutable $MSMSize; + + constructor( + uint256 _N, + uint256 _logN, + uint256 _vkHash, + uint256 _numPublicInputs + ) { + $N = _N; + $LOG_N = _logN; + $VK_HASH = _vkHash; + $NUM_PUBLIC_INPUTS = _numPublicInputs; + $MSMSize = NUMBER_UNSHIFTED_ZK + _logN + LIBRA_COMMITMENTS + 2; + } + + function validateVerificationKey( + Honk.VerificationKey memory vk + ) internal view { + require( + $N == vk.circuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $LOG_N == vk.logCircuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $NUM_PUBLIC_INPUTS == vk.publicInputsSize, + Errors.VerificationKeyConfigurationMismatch() + ); + } + + function verify( + bytes calldata proof, + bytes32[] calldata publicInputs + ) public view override returns (bool verified) { + // Calculate expected proof size based on $LOG_N + uint256 expectedProofSize = calculateProofSize($LOG_N); + + // Check the received proof is the expected size where each field element is 32 bytes + require( + proof.length == expectedProofSize, + Errors.ProofLengthWrongWithLogN( + $LOG_N, + proof.length, + expectedProofSize + ) + ); + + Honk.VerificationKey memory vk = loadVerificationKey(); + Honk.ZKProof memory p = ZKTranscriptLib.loadProof(proof, $LOG_N); + + require( + publicInputs.length == vk.publicInputsSize - PAIRING_POINTS_SIZE, + Errors.PublicInputsLengthWrong() + ); + + // Generate the fiat shamir challenges for the whole protocol + ZKTranscript memory t = ZKTranscriptLib.generateTranscript( + p, + publicInputs, + $VK_HASH, + $NUM_PUBLIC_INPUTS, + $LOG_N + ); + + // Derive public input delta + t.relationParameters.publicInputsDelta = computePublicInputDelta( + publicInputs, + p.pairingPointObject, + t.relationParameters.beta, + t.relationParameters.gamma, + 5 // pubInputsOffset = NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS = 4 + 1 + ); + + // Sumcheck + require(verifySumcheck(p, t), Errors.SumcheckFailed()); + require(verifyShplemini(p, vk, t), Errors.ShpleminiFailed()); + + verified = true; + } + + function computePublicInputDelta( + bytes32[] memory publicInputs, + Fr[PAIRING_POINTS_SIZE] memory pairingPointObject, + Fr beta, + Fr gamma, + uint256 offset + ) internal view returns (Fr publicInputDelta) { + Fr numerator = Fr.wrap(1); + Fr denominator = Fr.wrap(1); + + Fr numeratorAcc = gamma + + (beta * FrLib.from(PERMUTATION_ARGUMENT_VALUE_SEPARATOR + offset)); + Fr denominatorAcc = gamma - (beta * FrLib.from(offset + 1)); + + { + for ( + uint256 i = 0; + i < $NUM_PUBLIC_INPUTS - PAIRING_POINTS_SIZE; + i++ + ) { + Fr pubInput = FrLib.fromBytes32(publicInputs[i]); + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + Fr pubInput = pairingPointObject[i]; + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + } + + // Fr delta = numerator / denominator; // TOOO: batch invert later? + publicInputDelta = FrLib.div(numerator, denominator); + } + + function verifySumcheck( + Honk.ZKProof memory proof, + ZKTranscript memory tp + ) internal view returns (bool verified) { + Fr roundTargetSum = tp.libraChallenge * proof.libraSum; // default 0 + Fr powPartialEvaluation = Fr.wrap(1); + + // We perform sumcheck reductions over log n rounds ( the multivariate degree ) + for (uint256 round; round < $LOG_N; ++round) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory roundUnivariate = proof.sumcheckUnivariates[round]; + Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; + require(totalSum == roundTargetSum, Errors.SumcheckFailed()); + + Fr roundChallenge = tp.sumCheckUChallenges[round]; + + // Update the round target for the next rounf + roundTargetSum = computeNextTargetSum( + roundUnivariate, + roundChallenge + ); + powPartialEvaluation = + powPartialEvaluation * + (Fr.wrap(1) + + roundChallenge * + (tp.gateChallenges[round] - Fr.wrap(1))); + } + + // Last round + // For ZK flavors: sumcheckEvaluations has 42 elements + // Index 0 is gemini_masking_poly, indices 1-41 are the regular entities used in relations + Fr[NUMBER_OF_ENTITIES] memory relationsEvaluations; + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + relationsEvaluations[i] = proof.sumcheckEvaluations[ + i + NUM_MASKING_POLYNOMIALS + ]; // Skip gemini_masking_poly at index 0 + } + Fr grandHonkRelationSum = RelationsLib.accumulateRelationEvaluations( + relationsEvaluations, + tp.relationParameters, + tp.alphas, + powPartialEvaluation + ); + + // Row-disabling polynomial: 1 - ∏_{i≥2}(1 - u_i) + Fr evaluation = Fr.wrap(1); + for (uint256 i = 2; i < $LOG_N; i++) { + evaluation = evaluation * (Fr.wrap(1) - tp.sumCheckUChallenges[i]); + } + + grandHonkRelationSum = + grandHonkRelationSum * + (Fr.wrap(1) - evaluation) + + proof.libraEvaluation * + tp.libraChallenge; + verified = (grandHonkRelationSum == roundTargetSum); + } + + // Return the new target sum for the next sumcheck round + function computeNextTargetSum( + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariates, + Fr roundChallenge + ) internal view returns (Fr targetSum) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory BARYCENTRIC_LAGRANGE_DENOMINATORS = [ + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000000240 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ) + ]; + + // To compute the next target sum, we evaluate the given univariate at a point u (challenge). + + // Performing Barycentric evaluations + // Compute B(x) + Fr numeratorValue = Fr.wrap(1); + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + numeratorValue = numeratorValue * (roundChallenge - Fr.wrap(i)); + } + + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + denominatorInverses[i] = FrLib.invert( + BARYCENTRIC_LAGRANGE_DENOMINATORS[i] * + (roundChallenge - Fr.wrap(i)) + ); + } + + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + targetSum = + targetSum + + roundUnivariates[i] * + denominatorInverses[i]; + } + + // Scale the sum by the value of B(x) + targetSum = targetSum * numeratorValue; + } + + function verifyShplemini( + Honk.ZKProof memory proof, + Honk.VerificationKey memory vk, + ZKTranscript memory tp + ) internal view returns (bool verified) { + CommitmentSchemeLib.ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[] memory powers_of_evaluation_challenge = CommitmentSchemeLib + .computeSquares(tp.geminiR, $LOG_N); + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[] memory scalars = new Fr[]($MSMSize); + Honk.G1Point[] memory commitments = new Honk.G1Point[]($MSMSize); + + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[0]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[0]).invert(); + + mem.unshiftedScalar = + mem.posInvertedDenominator + + (tp.shplonkNu * mem.negInvertedDenominator); + mem.shiftedScalar = + tp.geminiR.invert() * + (mem.posInvertedDenominator - + (tp.shplonkNu * mem.negInvertedDenominator)); + + scalars[0] = Fr.wrap(1); + commitments[0] = proof.shplonkQ; + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + // For ZK flavors: evaluations array is [gemini_masking_poly, qm, qc, ql, qr, ...] + // Start batching challenge at 1, not rho, to match non-ZK pattern + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + mem.unshiftedScalarNeg = mem.unshiftedScalar.neg(); + mem.shiftedScalarNeg = mem.shiftedScalar.neg(); + + // Process all NUMBER_UNSHIFTED_ZK evaluations (includes gemini_masking_poly at index 0) + for (uint256 i = 1; i <= NUMBER_UNSHIFTED_ZK; ++i) { + scalars[i] = mem.unshiftedScalarNeg * mem.batchingChallenge; + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[i - NUM_MASKING_POLYNOMIALS] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + // For each of the to be shifted commitments perform the shift in place by + // adding to the unshifted value. + // We do so, as the values are to be used in batchMul later, and as + // `a * c + b * c = (a + b) * c` this will allow us to reduce memory and compute. + // Applied to w1, w2, w3, w4 and zPerm + for (uint256 i = 0; i < NUMBER_TO_BE_SHIFTED; ++i) { + uint256 scalarOff = i + SHIFTED_COMMITMENTS_START; + uint256 evaluationOff = i + NUMBER_UNSHIFTED_ZK; + + scalars[scalarOff] = + scalars[scalarOff] + + (mem.shiftedScalarNeg * mem.batchingChallenge); + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[evaluationOff] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + + commitments[1] = proof.geminiMaskingPoly; + + commitments[2] = vk.s1; + commitments[3] = vk.s2; + commitments[4] = vk.s3; + commitments[5] = vk.s4; + commitments[6] = vk.id1; + commitments[7] = vk.id2; + commitments[8] = vk.id3; + commitments[9] = vk.id4; + commitments[10] = vk.lagrangeFirst; + commitments[11] = vk.lagrangeLast; + commitments[12] = vk.qLookup; + commitments[13] = vk.t1; + commitments[14] = vk.t2; + commitments[15] = vk.t3; + commitments[16] = vk.t4; + commitments[17] = vk.qm; + commitments[18] = vk.qr; + commitments[19] = vk.qo; + commitments[20] = vk.qc; + commitments[21] = vk.ql; + commitments[22] = vk.q4; + commitments[23] = vk.qArith; + commitments[24] = vk.qDeltaRange; + commitments[25] = vk.qElliptic; + commitments[26] = vk.qMemory; + commitments[27] = vk.qNnf; + commitments[28] = vk.qPoseidon2External; + commitments[29] = vk.qPoseidon2Internal; + + // Accumulate proof points + commitments[30] = proof.w1; + commitments[31] = proof.w2; + commitments[32] = proof.w3; + commitments[33] = proof.w4; + commitments[34] = proof.zPerm; + commitments[35] = proof.lookupInverses; + commitments[36] = proof.lookupReadCounts; + commitments[37] = proof.lookupReadTags; + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., $LOG_N - 1 + Fr[] memory foldPosEvaluations = CommitmentSchemeLib + .computeFoldPosEvaluations( + tp.sumCheckUChallenges, + mem.batchedEvaluation, + proof.geminiAEvaluations, + powers_of_evaluation_challenge, + $LOG_N + ); + + mem.constantTermAccumulator = + foldPosEvaluations[0] * + mem.posInvertedDenominator; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + (proof.geminiAEvaluations[0] * + tp.shplonkNu * + mem.negInvertedDenominator); + + mem.batchingChallenge = tp.shplonkNu.sqr(); + uint256 boundary = NUMBER_UNSHIFTED_ZK + 1; + + // Compute Shplonk constant term contributions from Aₗ(± r^{2ˡ}) for l = 1, ..., m-1; + // Compute scalar multipliers for each fold commitment + for (uint256 i = 0; i < $LOG_N - 1; ++i) { + bool dummy_round = i >= ($LOG_N - 1); + + if (!dummy_round) { + // Update inverted denominators + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[i + 1]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[i + 1]).invert(); + + // Compute the scalar multipliers for Aₗ(± r^{2ˡ}) and [Aₗ] + mem.scalingFactorPos = + mem.batchingChallenge * + mem.posInvertedDenominator; + mem.scalingFactorNeg = + mem.batchingChallenge * + tp.shplonkNu * + mem.negInvertedDenominator; + scalars[boundary + i] = + mem.scalingFactorNeg.neg() + + mem.scalingFactorPos.neg(); + + // Accumulate the const term contribution given by + // v^{2l} * Aₗ(r^{2ˡ}) /(z-r^{2^l}) + v^{2l+1} * Aₗ(-r^{2ˡ}) /(z+ r^{2^l}) + Fr accumContribution = mem.scalingFactorNeg * + proof.geminiAEvaluations[i + 1]; + accumContribution = + accumContribution + + mem.scalingFactorPos * + foldPosEvaluations[i + 1]; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + accumContribution; + } + // Update the running power of v + mem.batchingChallenge = + mem.batchingChallenge * + tp.shplonkNu * + tp.shplonkNu; + + commitments[boundary + i] = proof.geminiFoldComms[i]; + } + + boundary += $LOG_N - 1; + + // Denominators 1/(z - point_i) for the five opening points {r, g*r, r, 1, r}. + mem.denominators[0] = ONE.div(tp.shplonkZ - tp.geminiR); + mem.denominators[1] = ONE.div( + tp.shplonkZ - SUBGROUP_GENERATOR * tp.geminiR + ); + mem.denominators[2] = mem.denominators[0]; + mem.denominators[SMALL_IPA_BOUNDARY_OPENING_IDX] = ONE.div( + tp.shplonkZ - ONE + ); + mem.denominators[NUM_SMALL_IPA_OPENING_CLAIMS - 1] = mem.denominators[ + 0 + ]; + + // Iterate the opening claims in three segments — the inner loops can't be merged without an extra induction + // variable, which pushes us into stack-too-deep. + for (uint256 i = 0; i < SMALL_IPA_BOUNDARY_OPENING_IDX; i++) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i]; + } + + // Boundary slot: claimed value is hardcoded 0, so no constantTermAccumulator contribution. + { + Fr scalingFactor = mem.denominators[ + SMALL_IPA_BOUNDARY_OPENING_IDX + ] * mem.batchingChallenge; + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX] = scalingFactor + .neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + } + + for ( + uint256 i = SMALL_IPA_BOUNDARY_OPENING_IDX + 1; + i < NUM_SMALL_IPA_OPENING_CLAIMS; + i++ + ) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i - 1]; + } + + // Group per-claim batching scalars by commitment: [G], [A] (three openings), [Q]. + scalars[boundary] = mem.batchingScalars[0]; + scalars[boundary + 1] = + mem.batchingScalars[1] + + mem.batchingScalars[2] + + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX]; + scalars[boundary + 2] = mem.batchingScalars[ + NUM_SMALL_IPA_OPENING_CLAIMS - 1 + ]; + + for (uint256 i = 0; i < LIBRA_COMMITMENTS; i++) { + commitments[boundary++] = proof.libraCommitments[i]; + } + + commitments[boundary] = Honk.G1Point({ x: 1, y: 2 }); + scalars[boundary++] = mem.constantTermAccumulator; + + require( + checkEvalsConsistency( + proof.libraPolyEvals, + tp.geminiR, + tp.sumCheckUChallenges, + proof.libraEvaluation + ), + Errors.ConsistencyCheckFailed() + ); + + Honk.G1Point memory quotient_commitment = proof.kzgQuotient; + + commitments[boundary] = quotient_commitment; + scalars[boundary] = tp.shplonkZ; // evaluation challenge + + PairingInputs memory pair; + pair.P_0 = batchMul(commitments, scalars); + pair.P_1 = negateInplace(quotient_commitment); + + // Aggregate pairing points (skip if default/infinity — no recursive verification occurred) + if (!arePairingPointsDefault(proof.pairingPointObject)) { + Fr recursionSeparator = generateRecursionSeparator( + proof.pairingPointObject, + pair.P_0, + pair.P_1 + ); + ( + Honk.G1Point memory P_0_other, + Honk.G1Point memory P_1_other + ) = convertPairingPointsToG1(proof.pairingPointObject); + + // Validate the points from the proof are on the curve + rejectPointAtInfinity(P_0_other); + rejectPointAtInfinity(P_1_other); + + // accumulate with aggregate points in proof + pair.P_0 = mulWithSeperator( + pair.P_0, + P_0_other, + recursionSeparator + ); + pair.P_1 = mulWithSeperator( + pair.P_1, + P_1_other, + recursionSeparator + ); + } + + return pairing(pair.P_0, pair.P_1); + } + + function checkEvalsConsistency( + Fr[LIBRA_EVALUATIONS] memory libraPolyEvals, + Fr geminiR, + Fr[CONST_PROOF_SIZE_LOG_N] memory uChallenges, + Fr libraEval + ) internal view returns (bool check) { + Fr one = Fr.wrap(1); + Fr vanishingPolyEval = geminiR.pow(SUBGROUP_SIZE) - one; + require( + vanishingPolyEval != Fr.wrap(0), + Errors.GeminiChallengeInSubgroup() + ); + + SmallSubgroupIpaIntermediates memory mem; + mem.challengePolyLagrange[0] = one; + for (uint256 round = 0; round < $LOG_N; round++) { + uint256 currIdx = 1 + LIBRA_UNIVARIATES_LENGTH * round; + mem.challengePolyLagrange[currIdx] = one; + for ( + uint256 idx = currIdx + 1; + idx < currIdx + LIBRA_UNIVARIATES_LENGTH; + idx++ + ) { + mem.challengePolyLagrange[idx] = + mem.challengePolyLagrange[idx - 1] * + uChallenges[round]; + } + } + + mem.rootPower = one; + mem.challengePolyEval = Fr.wrap(0); + for (uint256 idx = 0; idx < SUBGROUP_SIZE; idx++) { + mem.denominators[idx] = mem.rootPower * geminiR - one; + mem.denominators[idx] = mem.denominators[idx].invert(); + mem.challengePolyEval = + mem.challengePolyEval + + mem.challengePolyLagrange[idx] * + mem.denominators[idx]; + mem.rootPower = mem.rootPower * SUBGROUP_GENERATOR_INVERSE; + } + + Fr numerator = vanishingPolyEval * Fr.wrap(SUBGROUP_SIZE).invert(); + mem.challengePolyEval = mem.challengePolyEval * numerator; + mem.lagrangeFirst = mem.denominators[0] * numerator; + mem.lagrangeLast = mem.denominators[SUBGROUP_SIZE - 1] * numerator; + + mem.diff = mem.lagrangeFirst * libraPolyEvals[2]; + + mem.diff = + mem.diff + + (geminiR - SUBGROUP_GENERATOR_INVERSE) * + (libraPolyEvals[1] - + libraPolyEvals[2] - + libraPolyEvals[0] * + mem.challengePolyEval); + mem.diff = + mem.diff + + mem.lagrangeLast * + (libraPolyEvals[2] - libraEval) - + vanishingPolyEval * + libraPolyEvals[3]; + + check = mem.diff == Fr.wrap(0); + } + + // This implementation is the same as above with different constants + function batchMul( + Honk.G1Point[] memory base, + Fr[] memory scalars + ) internal view returns (Honk.G1Point memory result) { + uint256 limit = $MSMSize; + + // Identity bases are accepted: VK selector/table polys may be identically zero, + // and the ecAdd/ecMul precompiles treat (0,0) as the additive identity per EIP-196. + // Soundness against an attacker substituting (0,0) for a non-zero commitment is + // upheld by sumcheck/Shplemini, which would fail on inconsistent evaluations. + + bool success = true; + assembly { + let free := mload(0x40) + + let count := 0x01 + for {} lt(count, add(limit, 1)) { + count := add(count, 1) + } { + // Get loop offsets + let base_base := add(base, mul(count, 0x20)) + let scalar_base := add(scalars, mul(count, 0x20)) + + mstore(add(free, 0x40), mload(mload(base_base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalar_base)) + + success := and( + success, + staticcall( + gas(), + 7, + add(free, 0x40), + 0x60, + add(free, 0x40), + 0x40 + ) + ) + // accumulator = accumulator + accumulator_2 + success := and( + success, + staticcall(gas(), 6, free, 0x80, free, 0x40) + ) + } + + // Return the result + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + } + + require(success, Errors.ShpleminiFailed()); + } + + // Calculate proof size based on log_n (matching UltraKeccakZKFlavor formula) + function calculateProofSize(uint256 logN) internal pure returns (uint256) { + // Witness and Libra commitments + uint256 proofLength = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM; // witness commitments + proofLength += NUM_ELEMENTS_COMM * 3; // Libra concat, grand sum, quotient comms + Gemini masking + + // Sumcheck + proofLength += + logN * + ZK_BATCHED_RELATION_PARTIAL_LENGTH * + NUM_ELEMENTS_FR; // sumcheck univariates + proofLength += NUMBER_OF_ENTITIES_ZK * NUM_ELEMENTS_FR; // sumcheck evaluations + + // Libra and Gemini + proofLength += NUM_ELEMENTS_FR * 2; // Libra sum, claimed eval + proofLength += logN * NUM_ELEMENTS_FR; // Gemini a evaluations + proofLength += NUM_LIBRA_EVALUATIONS * NUM_ELEMENTS_FR; // libra evaluations + + // PCS commitments + proofLength += (logN - 1) * NUM_ELEMENTS_COMM; // Gemini Fold commitments + proofLength += NUM_ELEMENTS_COMM * 2; // Shplonk Q and KZG W commitments + + // Pairing points + proofLength += PAIRING_POINTS_SIZE; // pairing inputs carried on public inputs + + return proofLength * 32; + } + + function loadVerificationKey() + internal + pure + virtual + returns (Honk.VerificationKey memory); +} + +contract DkgAggregatorVerifier is + BaseZKHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) +{ + constructor() { + validateVerificationKey(HonkVerificationKey.loadVerificationKey()); + } + function loadVerificationKey() + internal + pure + override + returns (Honk.VerificationKey memory) + { + return HonkVerificationKey.loadVerificationKey(); + } +} diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/minimum/DecryptionAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/minimum/DecryptionAggregatorVerifier.sol new file mode 100644 index 0000000000..27535b0b2d --- /dev/null +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/minimum/DecryptionAggregatorVerifier.sol @@ -0,0 +1,3262 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +pragma solidity >=0.8.21; + +uint256 constant N = 2097152; +uint256 constant LOG_N = 21; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 122; +uint256 constant VK_HASH = 0x0e612a2506789cbb71d094dca31a48783f4355377a0ee86431dfccf726cf38b6; +library HonkVerificationKey { + function loadVerificationKey() + internal + pure + returns (Honk.VerificationKey memory) + { + Honk.VerificationKey memory vk = Honk.VerificationKey({ + circuitSize: uint256(2097152), + logCircuitSize: uint256(21), + publicInputsSize: uint256(122), + ql: Honk.G1Point({ + x: uint256( + 0x0f14d76500916d6574d3386450285eaa5764f183faf4a10a47ae1a1eb6e8ec06 + ), + y: uint256( + 0x1593bc00c600aa5c83e5258a6603504a089d6b5612910e9612ed300fec57acf0 + ) + }), + qr: Honk.G1Point({ + x: uint256( + 0x2ae0abfb93365bdc9d3f15723d42a6cb613ac8b75a6865cd1c662db53d8eabc5 + ), + y: uint256( + 0x0adda76e6aebfbf6c60d277445a8befc2e099a597a9ccb05b438aae1b7f68861 + ) + }), + qo: Honk.G1Point({ + x: uint256( + 0x017d3a0a0492e3217250bca58056672f504d6173e07a6ad8ee4b41e945728096 + ), + y: uint256( + 0x0bc9de59708fc7d0efb28ad42a2bc6b7973a14396bc83f094baf22f04a9918e0 + ) + }), + q4: Honk.G1Point({ + x: uint256( + 0x228320b4052943933c972dfa333a777c96d79ca36642b0c679733cacc4d74481 + ), + y: uint256( + 0x0dcd11af5be87f9ca6416c399ca3696b0a99dc038e1b2b7c49c24e7785dc7686 + ) + }), + qm: Honk.G1Point({ + x: uint256( + 0x1b102b6cb6a59be172fac3a8c619fd6ef1e46cb25c28435c04db03ae51dfc8c5 + ), + y: uint256( + 0x2bdb472d1d75cc437ccb0ea47d5f190a381488001feb129659224ef2a91dff0e + ) + }), + qc: Honk.G1Point({ + x: uint256( + 0x02b8cc2a6cf952c669105ca249267f13d1cf9d356ef1c025f53d70746d6a5914 + ), + y: uint256( + 0x164f2e72ddcacf781e33102f8df6c7615fb83ec7ec196cfff3ee18110ae543be + ) + }), + qLookup: Honk.G1Point({ + x: uint256( + 0x2cfb74054944b24f15a16c8658d46dd58b2f0946506d9981bd8c6d46fbd54544 + ), + y: uint256( + 0x0ce08ac8e81a30575763f452e609db3f792036509860516e1651fc7d38af341e + ) + }), + qArith: Honk.G1Point({ + x: uint256( + 0x0499264c391b860cddafa65e064d15b8b51cfe83339c98a1e293e7c9fe5b241d + ), + y: uint256( + 0x05daf1f9a755bde5d8f71bc9cb7d8f65e23f50e2e604c2b75062964e13d02f2f + ) + }), + qDeltaRange: Honk.G1Point({ + x: uint256( + 0x1e57fbb5e4015ceec0b02c8dc5b87bc05332ea515fa8eaf8b0629d32c53c16c4 + ), + y: uint256( + 0x08299071d6702e39fb6bd8982e3013102cb321a9e4ff09e166bd4945ddf1743b + ) + }), + qElliptic: Honk.G1Point({ + x: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ), + y: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) + }), + qMemory: Honk.G1Point({ + x: uint256( + 0x1b4dd8fa15f3d088502b4bf5028fdd766da6409e0d0db9868b6fffb84fb151a4 + ), + y: uint256( + 0x022d20a1ead2857f05b1ecaa9ac07dd988b647445511bc9ec8ede85244696d1c + ) + }), + qNnf: Honk.G1Point({ + x: uint256( + 0x2046c3062555af91cbf7045392f74823d684c1f9491f920ade2b29869a3adfa2 + ), + y: uint256( + 0x2e06081446c4aeccbe4acec789be858abcfab7f71c1614956906454da56662fc + ) + }), + qPoseidon2External: Honk.G1Point({ + x: uint256( + 0x0e92f70c60102b044b86497f2875a7f308f228e973f5cad9aebe9d1f53ffcae5 + ), + y: uint256( + 0x0d1daebe7502733fbff5bfd7ca004b302e2bb07b1c7bba40e56135d7947ec3b7 + ) + }), + qPoseidon2Internal: Honk.G1Point({ + x: uint256( + 0x302e8f008048ff9569e41a115f168f26b595587d3d839c149a2b152e9e006040 + ), + y: uint256( + 0x0836e49dd417a066b9da23e749786783388caddcbf45fab196e7d825fc0bae11 + ) + }), + s1: Honk.G1Point({ + x: uint256( + 0x2f7207564524d818fb7da554a8dc531da8d7edc00160771c9cbdc10949459703 + ), + y: uint256( + 0x2af437ab3662d5c9b0a33deb510a85469724f120cb27e4f57e1e4a5a512bd2f5 + ) + }), + s2: Honk.G1Point({ + x: uint256( + 0x1d949cec2986fefadcac3f9cc465d35b17fdf27e832b3483880a0541f1af988d + ), + y: uint256( + 0x1fa5ae6be08f5638f0fa2daabf4a8d62e79f2a66a888b13e8287e963cd67678f + ) + }), + s3: Honk.G1Point({ + x: uint256( + 0x2da63724dc90892845c530192143b149e1c6de23db0e0f2bbc60bf1a18891d8f + ), + y: uint256( + 0x14e0c79904e39e6e8052ec3c5ef18973e7d97c30623bfaa3a7227e906897744e + ) + }), + s4: Honk.G1Point({ + x: uint256( + 0x048ca15d3cc8337ce3691928ac40b3e7374c0ab016ee43d0412491e914a5c1cc + ), + y: uint256( + 0x28c7fe2c468c79d27f84542444fc786cf314dad80f36f2408b38f09cbf390c1c + ) + }), + t1: Honk.G1Point({ + x: uint256( + 0x26b6c33761c47fbbc64bc99157eb6e591693840ffa6a2b579c5f98be40fe19ca + ), + y: uint256( + 0x2d339a0497eb18a5decc3976cbc07f11035a28853a61f4f654516c0db64eaaa4 + ) + }), + t2: Honk.G1Point({ + x: uint256( + 0x27347b95cc29d0aee0f64b4cff3fc37f611ab498c2308d155f8d3c4239be0934 + ), + y: uint256( + 0x1424833141bf42787ef59306c06991a23bbefd0f08e966689af98160de7909d9 + ) + }), + t3: Honk.G1Point({ + x: uint256( + 0x269423bc6ab728e4b8a005193432727a84f3b588df5f9829f80786afbea2c2b8 + ), + y: uint256( + 0x19bb3258ab971def1ff877bf4687753bc6dfe5f04d8704fa05ab46271f797fe8 + ) + }), + t4: Honk.G1Point({ + x: uint256( + 0x0503876e97b8041bb0e013ae9de57f03f6767ea858397427cbe355373ad5ffb1 + ), + y: uint256( + 0x1b99b07d8c48006d2512f97974f932a349e6fe9ecbf236d6785aa4f069df12c1 + ) + }), + id1: Honk.G1Point({ + x: uint256( + 0x19906034db1e238cf96aa3c712036d179927198f2cef2d334c93759bd3475d8f + ), + y: uint256( + 0x0e1b444fdb8caa9325aa02ea1cbcb86a72d8b9a64cc62996248c480a0ee00bed + ) + }), + id2: Honk.G1Point({ + x: uint256( + 0x21d8916a32a04fc044b4d4786ff840ce9bfc3c29e50899a276dcd581193a83f2 + ), + y: uint256( + 0x0cfaa3067461b5ccf8c8c01249c146ddc0d120efa75994f295a0c3224e443eff + ) + }), + id3: Honk.G1Point({ + x: uint256( + 0x2e313d44d38d1e9171bb32ee658ea2ec6560bf1822b3cd84ad3c73c2a858855e + ), + y: uint256( + 0x1945d840f43697d15ca4f1d8e7aaf0c91de37fba1531611e94d56340bd61f9b6 + ) + }), + id4: Honk.G1Point({ + x: uint256( + 0x0e315f31453bcdb5f6f81a7b3e12179a9d289b0988f3de3561974f9d32c201c9 + ), + y: uint256( + 0x06dd1559d417006b3e8bf13d74845c17f3a0b63a5584950c3038039d418b208b + ) + }), + lagrangeFirst: Honk.G1Point({ + x: uint256( + 0x2a56ce41f6b0be13b9c26747621b821eee81b23a887f299049b14c11e98460d6 + ), + y: uint256( + 0x1aa98f2de3ddda547d8f6de4e725ded5827d6338c78656c0d12ca1aea6ef2c7c + ) + }), + lagrangeLast: Honk.G1Point({ + x: uint256( + 0x0c3ae6fb701dc0b534390fba205cc44f9e2b1166c5fabf583e21ef28d8f92f48 + ), + y: uint256( + 0x046859246518b60d025c10fe0dc2a254e0185c21a13d0ac016417c4c3d66e834 + ) + }) + }); + return vk; + } +} + +pragma solidity ^0.8.27; + +interface IVerifier { + function verify( + bytes calldata _proof, + bytes32[] calldata _publicInputs + ) external view returns (bool); +} + +/** + * @notice Library of error codes + * @dev You can run `forge inspect Errors errors` to get the selectors for the optimised verifier + */ +library Errors { + error ValueGeLimbMax(); + error ValueGeGroupOrder(); + error ValueGeFieldOrder(); + + error InvertOfZero(); + error NotPowerOfTwo(); + error ModExpFailed(); + + error ProofLengthWrong(); + error ProofLengthWrongWithLogN( + uint256 logN, + uint256 actualLength, + uint256 expectedLength + ); + error PublicInputsLengthWrong(); + error SumcheckFailed(); + error ShpleminiFailed(); + + error PointAtInfinity(); + + error ConsistencyCheckFailed(); + error VerificationKeyConfigurationMismatch(); + error GeminiChallengeInSubgroup(); +} + +type Fr is uint256; + +using { add as + } for Fr global; +using { sub as - } for Fr global; +using { mul as * } for Fr global; + +using { notEqual as != } for Fr global; +using { equal as == } for Fr global; + +uint256 constant SUBGROUP_SIZE = 256; +uint256 constant MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Prime field order +uint256 constant P = MODULUS; +Fr constant SUBGROUP_GENERATOR = Fr.wrap( + 0x07b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76 +); +Fr constant SUBGROUP_GENERATOR_INVERSE = Fr.wrap( + 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 +); +Fr constant MINUS_ONE = Fr.wrap(MODULUS - 1); +Fr constant ONE = Fr.wrap(1); +Fr constant ZERO = Fr.wrap(0); + +// SmallSubgroupIPA opening-claim layout — mirrors SMALL_IPA_CLAIMS in +// barretenberg/cpp/src/barretenberg/commitment_schemes/small_subgroup_ipa/small_subgroup_ipa_utils.hpp. +uint256 constant NUM_SMALL_IPA_OPENING_CLAIMS = 5; +uint256 constant SMALL_IPA_BOUNDARY_OPENING_IDX = 3; +uint256 constant NUM_SMALL_IPA_TRANSCRIPT_EVALS = 4; +// Instantiation + +library FrLib { + bytes4 internal constant FRLIB_MODEXP_FAILED_SELECTOR = 0x1f7ec5f0; + + function invert(Fr value) internal view returns (Fr) { + uint256 v = Fr.unwrap(value); + require(v != 0, Errors.InvertOfZero()); + + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), v) + mstore(add(free, 0x80), sub(MODULUS, 2)) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function pow(Fr base, uint256 v) internal view returns (Fr) { + uint256 b = Fr.unwrap(base); + // Only works for power of 2 + require(v > 0 && (v & (v - 1)) == 0, Errors.NotPowerOfTwo()); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), b) + mstore(add(free, 0x80), v) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function div(Fr numerator, Fr denominator) internal view returns (Fr) { + unchecked { + return numerator * invert(denominator); + } + } + + function sqr(Fr value) internal pure returns (Fr) { + unchecked { + return value * value; + } + } + + function unwrap(Fr value) internal pure returns (uint256) { + unchecked { + return Fr.unwrap(value); + } + } + + function neg(Fr value) internal pure returns (Fr) { + unchecked { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } + } + + function from(uint256 value) internal pure returns (Fr) { + unchecked { + require(value < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(value); + } + } + + function fromBytes32(bytes32 value) internal pure returns (Fr) { + unchecked { + uint256 v = uint256(value); + require(v < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(v); + } + } + + function toBytes32(Fr value) internal pure returns (bytes32) { + unchecked { + return bytes32(Fr.unwrap(value)); + } + } +} + +// Free functions +function add(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function mul(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(mulmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function sub(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), MODULUS - Fr.unwrap(b), MODULUS)); + } +} + +function notEqual(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) != Fr.unwrap(b); + } +} + +function equal(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) == Fr.unwrap(b); + } +} + +uint256 constant CONST_PROOF_SIZE_LOG_N = 25; + +uint256 constant NUMBER_OF_SUBRELATIONS = 29; +uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; +uint256 constant ZK_BATCHED_RELATION_PARTIAL_LENGTH = 9; +uint256 constant NUMBER_OF_ENTITIES = 41; +// The number of entities added for ZK (gemini_masking_poly) +uint256 constant NUM_MASKING_POLYNOMIALS = 1; +uint256 constant NUMBER_OF_ENTITIES_ZK = NUMBER_OF_ENTITIES + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_UNSHIFTED = 36; +uint256 constant NUMBER_UNSHIFTED_ZK = NUMBER_UNSHIFTED + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; +uint256 constant PAIRING_POINTS_SIZE = 8; + +uint256 constant FIELD_ELEMENT_SIZE = 0x20; +uint256 constant GROUP_ELEMENT_SIZE = 0x40; + +// Powers of alpha used to batch subrelations (alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)) +uint256 constant NUMBER_OF_ALPHAS = NUMBER_OF_SUBRELATIONS - 1; + +// Must match UltraFlavor_Generated::EntityId order. +enum WIRE { + SIGMA_1, + SIGMA_2, + SIGMA_3, + SIGMA_4, + ID_1, + ID_2, + ID_3, + ID_4, + LAGRANGE_FIRST, + LAGRANGE_LAST, + Q_LOOKUP, + TABLE_1, + TABLE_2, + TABLE_3, + TABLE_4, + Q_M, + Q_R, + Q_O, + Q_C, + Q_L, + Q_4, + Q_ARITH, + Q_RANGE, + Q_ELLIPTIC, + Q_MEMORY, + Q_NNF, + Q_POSEIDON2_EXTERNAL, + Q_POSEIDON2_INTERNAL, + W_L, + W_R, + W_O, + W_4, + Z_PERM, + LOOKUP_INVERSES, + LOOKUP_READ_COUNTS, + LOOKUP_READ_TAGS, + W_L_SHIFT, + W_R_SHIFT, + W_O_SHIFT, + W_4_SHIFT, + Z_PERM_SHIFT +} + +library Honk { + struct G1Point { + uint256 x; + uint256 y; + } + + struct VerificationKey { + // Misc Params + uint256 circuitSize; + uint256 logCircuitSize; + uint256 publicInputsSize; + // Selectors + G1Point qm; + G1Point qc; + G1Point ql; + G1Point qr; + G1Point qo; + G1Point q4; + G1Point qLookup; // Lookup + G1Point qArith; // Arithmetic widget + G1Point qDeltaRange; // Delta Range sort + G1Point qMemory; // Memory + G1Point qNnf; // Non-native Field + G1Point qElliptic; // Auxillary + G1Point qPoseidon2External; + G1Point qPoseidon2Internal; + // Copy constraints + G1Point s1; + G1Point s2; + G1Point s3; + G1Point s4; + // Copy identity + G1Point id1; + G1Point id2; + G1Point id3; + G1Point id4; + // Precomputed lookup table + G1Point t1; + G1Point t2; + G1Point t3; + G1Point t4; + // Fixed first and last + G1Point lagrangeFirst; + G1Point lagrangeLast; + } + + struct RelationParameters { + // challenges + Fr eta; + Fr beta; + Fr gamma; + // derived + Fr publicInputsDelta; + } + + struct Proof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // Free wires + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Lookup helpers - Permutations + G1Point zPerm; + // Lookup helpers - logup + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Sumcheck + Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + G1Point shplonkQ; + G1Point kzgQuotient; + } + + /// forge-lint: disable-next-item(pascal-case-struct) + struct ZKProof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // ZK: Gemini masking polynomial commitment (sent first, right after public inputs) + G1Point geminiMaskingPoly; + // Commitments to wire polynomials + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Commitments to logup witness polynomials + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Commitment to grand permutation polynomial + G1Point zPerm; + G1Point[3] libraCommitments; + // Sumcheck + Fr libraSum; + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr libraEvaluation; + Fr[NUMBER_OF_ENTITIES_ZK] sumcheckEvaluations; // Includes gemini_masking_poly eval at index 0 (first position) + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Fr[4] libraPolyEvals; + G1Point shplonkQ; + G1Point kzgQuotient; + } +} + +// ZKTranscript library to generate fiat shamir challenges, the ZK transcript only differest +/// forge-lint: disable-next-item(pascal-case-struct) +struct ZKTranscript { + // Oink + Honk.RelationParameters relationParameters; + Fr[NUMBER_OF_ALPHAS] alphas; // Powers of alpha: [alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)] + Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; + // Sumcheck + Fr libraChallenge; + Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; + // Shplemini + Fr rho; + Fr geminiR; + Fr shplonkNu; + Fr shplonkZ; + // Derived + Fr publicInputsDelta; +} + +library ZKTranscriptLib { + function generateTranscript( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + uint256 logN + ) external pure returns (ZKTranscript memory t) { + Fr previousChallenge; + ( + t.relationParameters, + previousChallenge + ) = generateRelationParametersChallenges( + proof, + publicInputs, + vkHash, + publicInputsSize, + previousChallenge + ); + + (t.alphas, previousChallenge) = generateAlphaChallenges( + previousChallenge, + proof + ); + + (t.gateChallenges, previousChallenge) = generateGateChallenges( + previousChallenge, + logN + ); + (t.libraChallenge, previousChallenge) = generateLibraChallenge( + previousChallenge, + proof + ); + (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges( + proof, + previousChallenge, + logN + ); + + (t.rho, previousChallenge) = generateRhoChallenge( + proof, + previousChallenge + ); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge( + proof, + previousChallenge + ); + return t; + } + + function splitChallenge( + Fr challenge + ) internal pure returns (Fr first, Fr second) { + uint256 challengeU256 = uint256(Fr.unwrap(challenge)); + // Split into two equal 127-bit chunks (254/2) + uint256 lo = challengeU256 & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // 127 bits + uint256 hi = challengeU256 >> 127; + first = FrLib.from(lo); + second = FrLib.from(hi); + } + + function generateRelationParametersChallenges( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + Fr previousChallenge + ) + internal + pure + returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) + { + (rp.eta, previousChallenge) = generateEtaChallenge( + proof, + publicInputs, + vkHash, + publicInputsSize + ); + + ( + rp.beta, + rp.gamma, + nextPreviousChallenge + ) = generateBetaGammaChallenges(previousChallenge, proof); + } + + function generateEtaChallenge( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize + ) internal pure returns (Fr eta, Fr previousChallenge) { + // Size: 1 (vkHash) + publicInputsSize + 8 (geminiMask(2) + 3 wires(6)) + bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 8); + round0[0] = bytes32(vkHash); + + for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) { + require(uint256(publicInputs[i]) < P, Errors.ValueGeFieldOrder()); + round0[1 + i] = publicInputs[i]; + } + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib + .toBytes32(proof.pairingPointObject[i]); + } + + // For ZK flavors: hash the gemini masking poly commitment (sent right after public inputs) + round0[1 + publicInputsSize] = bytes32(proof.geminiMaskingPoly.x); + round0[1 + publicInputsSize + 1] = bytes32(proof.geminiMaskingPoly.y); + + // Create the first challenge + // Note: w4 is added to the challenge later on + round0[1 + publicInputsSize + 2] = bytes32(proof.w1.x); + round0[1 + publicInputsSize + 3] = bytes32(proof.w1.y); + round0[1 + publicInputsSize + 4] = bytes32(proof.w2.x); + round0[1 + publicInputsSize + 5] = bytes32(proof.w2.y); + round0[1 + publicInputsSize + 6] = bytes32(proof.w3.x); + round0[1 + publicInputsSize + 7] = bytes32(proof.w3.y); + + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round0))) % P + ); + (eta, ) = splitChallenge(previousChallenge); + } + + function generateBetaGammaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) { + bytes32[7] memory round1; + round1[0] = FrLib.toBytes32(previousChallenge); + round1[1] = bytes32(proof.lookupReadCounts.x); + round1[2] = bytes32(proof.lookupReadCounts.y); + round1[3] = bytes32(proof.lookupReadTags.x); + round1[4] = bytes32(proof.lookupReadTags.y); + round1[5] = bytes32(proof.w4.x); + round1[6] = bytes32(proof.w4.y); + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round1))) % P + ); + (beta, gamma) = splitChallenge(nextPreviousChallenge); + } + + // Alpha challenges non-linearise the gate contributions + function generateAlphaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) + internal + pure + returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) + { + // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup + uint256[5] memory alpha0; + alpha0[0] = Fr.unwrap(previousChallenge); + alpha0[1] = proof.lookupInverses.x; + alpha0[2] = proof.lookupInverses.y; + alpha0[3] = proof.zPerm.x; + alpha0[4] = proof.zPerm.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(alpha0))) % P + ); + Fr alpha; + (alpha, ) = splitChallenge(nextPreviousChallenge); + + // Compute powers of alpha for batching subrelations + alphas[0] = alpha; + for (uint256 i = 1; i < NUMBER_OF_ALPHAS; i++) { + alphas[i] = alphas[i - 1] * alpha; + } + } + + function generateGateChallenges( + Fr previousChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, + Fr nextPreviousChallenge + ) + { + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))) % + P + ); + (gateChallenges[0], ) = splitChallenge(previousChallenge); + for (uint256 i = 1; i < logN; i++) { + gateChallenges[i] = gateChallenges[i - 1] * gateChallenges[i - 1]; + } + nextPreviousChallenge = previousChallenge; + } + + function generateLibraChallenge( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr libraChallenge, Fr nextPreviousChallenge) { + // 2 comm, 1 sum, 1 challenge + uint256[4] memory challengeData; + challengeData[0] = Fr.unwrap(previousChallenge); + challengeData[1] = proof.libraCommitments[0].x; + challengeData[2] = proof.libraCommitments[0].y; + challengeData[3] = Fr.unwrap(proof.libraSum); + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(challengeData))) % P + ); + (libraChallenge, ) = splitChallenge(nextPreviousChallenge); + } + + function generateSumcheckChallenges( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, + Fr nextPreviousChallenge + ) + { + for (uint256 i = 0; i < logN; i++) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH + 1] memory univariateChal; + univariateChal[0] = prevChallenge; + + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + univariateChal[j + 1] = proof.sumcheckUnivariates[i][j]; + } + prevChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(univariateChal))) % P + ); + + (sumcheckChallenges[i], ) = splitChallenge(prevChallenge); + } + nextPreviousChallenge = prevChallenge; + } + + // We add Libra claimed eval + 2 libra commitments (grand_sum, quotient) + function generateRhoChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr rho, Fr nextPreviousChallenge) { + uint256[NUMBER_OF_ENTITIES_ZK + 6] memory rhoChallengeElements; + rhoChallengeElements[0] = Fr.unwrap(prevChallenge); + uint256 i; + for (i = 1; i <= NUMBER_OF_ENTITIES_ZK; i++) { + rhoChallengeElements[i] = Fr.unwrap( + proof.sumcheckEvaluations[i - 1] + ); + } + rhoChallengeElements[i] = Fr.unwrap(proof.libraEvaluation); + i += 1; + rhoChallengeElements[i] = proof.libraCommitments[1].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[1].y; + i += 2; + rhoChallengeElements[i] = proof.libraCommitments[2].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[2].y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(rhoChallengeElements))) % P + ); + (rho, ) = splitChallenge(nextPreviousChallenge); + } + + function generateGeminiRChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr geminiR, Fr nextPreviousChallenge) { + uint256[] memory gR = new uint256[]((logN - 1) * 2 + 1); + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < logN - 1; i++) { + gR[1 + i * 2] = proof.geminiFoldComms[i].x; + gR[2 + i * 2] = proof.geminiFoldComms[i].y; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(gR))) % P + ); + + (geminiR, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr shplonkNu, Fr nextPreviousChallenge) { + uint256[] memory shplonkNuChallengeElements = new uint256[]( + logN + 1 + 4 + ); + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 1; i <= logN; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.geminiAEvaluations[i - 1] + ); + } + + uint256 libraIdx = 0; + for (uint256 i = logN + 1; i <= logN + 4; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.libraPolyEvals[libraIdx] + ); + libraIdx++; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkNuChallengeElements))) % P + ); + (shplonkNu, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr shplonkZ, Fr nextPreviousChallenge) { + uint256[3] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x; + shplonkZChallengeElements[2] = proof.shplonkQ.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkZChallengeElements))) % P + ); + (shplonkZ, ) = splitChallenge(nextPreviousChallenge); + } + + function loadProof( + bytes calldata proof, + uint256 logN + ) internal pure returns (Honk.ZKProof memory p) { + uint256 boundary = 0x0; + + // Pairing point object + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + uint256 limb = uint256( + bytes32(proof[boundary:boundary + FIELD_ELEMENT_SIZE]) + ); + // lo limbs (even index) < 2^136, hi limbs (odd index) < 2^120 + require( + limb < 2 ** (i % 2 == 0 ? 136 : 120), + Errors.ValueGeLimbMax() + ); + p.pairingPointObject[i] = FrLib.from(limb); + boundary += FIELD_ELEMENT_SIZE; + } + + // Gemini masking polynomial commitment (sent first in ZK flavors, right after pairing points) + p.geminiMaskingPoly = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Commitments + p.w1 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w2 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w3 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + + // Lookup / Permutation Helper Commitments + p.lookupReadCounts = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.lookupReadTags = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.w4 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.lookupInverses = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.zPerm = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[0] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + p.libraSum = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + // Sumcheck univariates + for (uint256 i = 0; i < logN; i++) { + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + p.sumcheckUnivariates[i][j] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + } + + // Sumcheck evaluations (includes gemini_masking_poly eval at index 0 for ZK flavors) + for (uint256 i = 0; i < NUMBER_OF_ENTITIES_ZK; i++) { + p.sumcheckEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + p.libraEvaluation = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + + p.libraCommitments[1] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[2] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < logN - 1; i++) { + p.geminiFoldComms[i] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + } + + // Read gemini a evaluations + for (uint256 i = 0; i < logN; i++) { + p.geminiAEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + for (uint256 i = 0; i < 4; i++) { + p.libraPolyEvals[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + // Shplonk + p.shplonkQ = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + // KZG + p.kzgQuotient = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + } +} + +library RelationsLib { + struct EllipticParams { + // Points + Fr x_1; + Fr y_1; + Fr x_2; + Fr y_2; + Fr y_3; + Fr x_3; + // push accumulators into memory + Fr x_double_identity; + } + + // Parameters used within the Memory Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct MemParams { + Fr memory_record_check; + Fr partial_record_check; + Fr next_gate_access_type; + Fr record_delta; + Fr index_delta; + Fr adjacent_values_match_if_adjacent_indices_match; + Fr adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + Fr access_check; + Fr next_gate_access_type_is_boolean; + Fr ROM_consistency_check_identity; + Fr RAM_consistency_check_identity; + Fr timestamp_delta; + Fr RAM_timestamp_check_identity; + Fr memory_identity; + Fr index_is_monotonically_increasing; + } + + // Parameters used within the Non-Native Field Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct NnfParams { + Fr limb_subproduct; + Fr non_native_field_gate_1; + Fr non_native_field_gate_2; + Fr non_native_field_gate_3; + Fr limb_accumulator_1; + Fr limb_accumulator_2; + Fr nnf_identity; + } + + struct PoseidonExternalParams { + Fr s1; + Fr s2; + Fr s3; + Fr s4; + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr t0; + Fr t1; + Fr t2; + Fr t3; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr q_pos_by_scaling; + } + + struct PoseidonInternalParams { + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr u_sum; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr s1; + Fr q_pos_by_scaling; + } + + Fr internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = Fr.wrap(17); // -(-17) + uint256 internal constant NEG_HALF_MODULO_P = + 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + + // Constants for the Non-native Field relation + Fr internal constant LIMB_SIZE = Fr.wrap(uint256(1) << 68); + Fr internal constant SUBLIMB_SHIFT = Fr.wrap(uint256(1) << 14); + + function accumulateRelationEvaluations( + Fr[NUMBER_OF_ENTITIES] memory purportedEvaluations, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges, + Fr powPartialEval + ) external pure returns (Fr accumulator) { + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations; + + // Accumulate all relations in Ultra Honk - each with varying number of subrelations + accumulateArithmeticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePermutationRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateLogDerivativeLookupRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateDeltaRangeRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateEllipticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateMemoryRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateNnfRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonExternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonInternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + + // batch the subrelations with the precomputed alpha powers to obtain the full honk relation + accumulator = scaleAndBatchSubrelations( + evaluations, + subrelationChallenges + ); + } + + /** + * Aesthetic helper function that is used to index by enum into proof.sumcheckEvaluations, it avoids + * the relation checking code being cluttered with uint256 type casting, which is often a different colour in code + * editors, and thus is noisy. + */ + function wire( + Fr[NUMBER_OF_ENTITIES] memory p, + WIRE _wire + ) internal pure returns (Fr) { + return p[uint256(_wire)]; + } + + /** + * Ultra Arithmetic Relation + * + */ + function accumulateArithmeticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + // Relation 0 + Fr q_arith = wire(p, WIRE.Q_ARITH); + { + Fr neg_half = Fr.wrap(NEG_HALF_MODULO_P); + + Fr accum = (q_arith - Fr.wrap(3)) * + (wire(p, WIRE.Q_M) * wire(p, WIRE.W_R) * wire(p, WIRE.W_L)) * + neg_half; + accum = + accum + + (wire(p, WIRE.Q_L) * wire(p, WIRE.W_L)) + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_R)) + + (wire(p, WIRE.Q_O) * wire(p, WIRE.W_O)) + + (wire(p, WIRE.Q_4) * wire(p, WIRE.W_4)) + + wire(p, WIRE.Q_C); + accum = accum + (q_arith - ONE) * wire(p, WIRE.W_4_SHIFT); + accum = accum * q_arith; + accum = accum * domainSep; + evals[6] = accum; + } + + // Relation 1 + { + Fr accum = wire(p, WIRE.W_L) + + wire(p, WIRE.W_4) - + wire(p, WIRE.W_L_SHIFT) + + wire(p, WIRE.Q_M); + accum = accum * (q_arith - Fr.wrap(2)); + accum = accum * (q_arith - ONE); + accum = accum * q_arith; + accum = accum * domainSep; + evals[7] = accum; + } + } + + function accumulatePermutationRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr grand_product_numerator; + Fr grand_product_denominator; + + { + Fr num = wire(p, WIRE.W_L) + + wire(p, WIRE.ID_1) * + rp.beta + + rp.gamma; + num = + num * + (wire(p, WIRE.W_R) + wire(p, WIRE.ID_2) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_O) + wire(p, WIRE.ID_3) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_4) + wire(p, WIRE.ID_4) * rp.beta + rp.gamma); + + grand_product_numerator = num; + } + { + Fr den = wire(p, WIRE.W_L) + + wire(p, WIRE.SIGMA_1) * + rp.beta + + rp.gamma; + den = + den * + (wire(p, WIRE.W_R) + + wire(p, WIRE.SIGMA_2) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_O) + + wire(p, WIRE.SIGMA_3) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_4) + + wire(p, WIRE.SIGMA_4) * + rp.beta + + rp.gamma); + + grand_product_denominator = den; + } + + // Contribution 2 + { + Fr acc = (wire(p, WIRE.Z_PERM) + wire(p, WIRE.LAGRANGE_FIRST)) * + grand_product_numerator; + + acc = + acc - + ((wire(p, WIRE.Z_PERM_SHIFT) + + (wire(p, WIRE.LAGRANGE_LAST) * rp.publicInputsDelta)) * + grand_product_denominator); + acc = acc * domainSep; + evals[0] = acc; + } + + // Contribution 3 + { + Fr acc = (wire(p, WIRE.LAGRANGE_LAST) * + wire(p, WIRE.Z_PERM_SHIFT)) * domainSep; + evals[1] = acc; + } + + // Contribution 4: z_perm initialization check (lagrange_first * z_perm = 0) + { + Fr acc = (wire(p, WIRE.LAGRANGE_FIRST) * wire(p, WIRE.Z_PERM)) * + domainSep; + evals[2] = acc; + } + } + + function accumulateLogDerivativeLookupRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr table_term; + Fr lookup_term; + + // Calculate the write term (the table accumulation) + // table_term = table_1 + γ + table_2 * β + table_3 * β² + table_4 * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + table_term = + wire(p, WIRE.TABLE_1) + + rp.gamma + + (wire(p, WIRE.TABLE_2) * rp.beta) + + (wire(p, WIRE.TABLE_3) * beta_sqr) + + (wire(p, WIRE.TABLE_4) * beta_sqr * rp.beta); + } + + // Calculate the read term + // lookup_term = derived_entry_1 + γ + derived_entry_2 * β + derived_entry_3 * β² + q_index * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + Fr derived_entry_1 = wire(p, WIRE.W_L) + + rp.gamma + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_L_SHIFT)); + Fr derived_entry_2 = wire(p, WIRE.W_R) + + wire(p, WIRE.Q_M) * + wire(p, WIRE.W_R_SHIFT); + Fr derived_entry_3 = wire(p, WIRE.W_O) + + wire(p, WIRE.Q_C) * + wire(p, WIRE.W_O_SHIFT); + + lookup_term = + derived_entry_1 + + (derived_entry_2 * rp.beta) + + (derived_entry_3 * beta_sqr) + + (wire(p, WIRE.Q_O) * beta_sqr * rp.beta); + } + + Fr lookup_inverse = wire(p, WIRE.LOOKUP_INVERSES) * table_term; + Fr table_inverse = wire(p, WIRE.LOOKUP_INVERSES) * lookup_term; + + Fr inverse_exists_xor = wire(p, WIRE.LOOKUP_READ_TAGS) + + wire(p, WIRE.Q_LOOKUP) - + (wire(p, WIRE.LOOKUP_READ_TAGS) * wire(p, WIRE.Q_LOOKUP)); + + // Inverse calculated correctly relation + Fr accumulatorNone = lookup_term * + table_term * + wire(p, WIRE.LOOKUP_INVERSES) - + inverse_exists_xor; + accumulatorNone = accumulatorNone * domainSep; + + // Inverse + Fr accumulatorOne = wire(p, WIRE.Q_LOOKUP) * + lookup_inverse - + wire(p, WIRE.LOOKUP_READ_COUNTS) * + table_inverse; + + Fr read_tag = wire(p, WIRE.LOOKUP_READ_TAGS); + + Fr read_tag_boolean_relation = read_tag * read_tag - read_tag; + + evals[3] = accumulatorNone; + evals[4] = accumulatorOne; + evals[5] = read_tag_boolean_relation * domainSep; + } + + function accumulateDeltaRangeRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr minus_one = ZERO - ONE; + Fr minus_two = ZERO - Fr.wrap(2); + Fr minus_three = ZERO - Fr.wrap(3); + + // Compute wire differences + Fr delta_1 = wire(p, WIRE.W_R) - wire(p, WIRE.W_L); + Fr delta_2 = wire(p, WIRE.W_O) - wire(p, WIRE.W_R); + Fr delta_3 = wire(p, WIRE.W_4) - wire(p, WIRE.W_O); + Fr delta_4 = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_4); + + // Contribution 6 + { + Fr acc = delta_1; + acc = acc * (delta_1 + minus_one); + acc = acc * (delta_1 + minus_two); + acc = acc * (delta_1 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[8] = acc; + } + + // Contribution 7 + { + Fr acc = delta_2; + acc = acc * (delta_2 + minus_one); + acc = acc * (delta_2 + minus_two); + acc = acc * (delta_2 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[9] = acc; + } + + // Contribution 8 + { + Fr acc = delta_3; + acc = acc * (delta_3 + minus_one); + acc = acc * (delta_3 + minus_two); + acc = acc * (delta_3 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[10] = acc; + } + + // Contribution 9 + { + Fr acc = delta_4; + acc = acc * (delta_4 + minus_one); + acc = acc * (delta_4 + minus_two); + acc = acc * (delta_4 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[11] = acc; + } + } + + function accumulateEllipticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + EllipticParams memory ep; + ep.x_1 = wire(p, WIRE.W_R); + ep.y_1 = wire(p, WIRE.W_O); + + ep.x_2 = wire(p, WIRE.W_L_SHIFT); + ep.y_2 = wire(p, WIRE.W_4_SHIFT); + ep.y_3 = wire(p, WIRE.W_O_SHIFT); + ep.x_3 = wire(p, WIRE.W_R_SHIFT); + + Fr q_sign = wire(p, WIRE.Q_L); + Fr q_is_double = wire(p, WIRE.Q_M); + + // Contribution 10 point addition, x-coordinate check + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + Fr x_diff = (ep.x_2 - ep.x_1); + Fr y1_sqr = (ep.y_1 * ep.y_1); + { + // Move to top + Fr partialEval = domainSep; + + Fr y2_sqr = (ep.y_2 * ep.y_2); + Fr y1y2 = ep.y_1 * ep.y_2 * q_sign; + Fr x_add_identity = (ep.x_3 + ep.x_2 + ep.x_1); + x_add_identity = x_add_identity * x_diff * x_diff; + x_add_identity = x_add_identity - y2_sqr - y1_sqr + y1y2 + y1y2; + + evals[12] = + x_add_identity * + partialEval * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 11 point addition, x-coordinate check + // q_elliptic * (q_sign * y1 + y3)(x2 - x1) + (x3 - x1)(y2 - q_sign * y1) = 0 + { + Fr y1_plus_y3 = ep.y_1 + ep.y_3; + Fr y_diff = ep.y_2 * q_sign - ep.y_1; + Fr y_add_identity = y1_plus_y3 * + x_diff + + (ep.x_3 - ep.x_1) * + y_diff; + evals[13] = + y_add_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 10 point doubling, x-coordinate check + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + // N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 + { + Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; + Fr y1_sqr_mul_4 = y1_sqr + y1_sqr; + y1_sqr_mul_4 = y1_sqr_mul_4 + y1_sqr_mul_4; + Fr x1_pow_4_mul_9 = x_pow_4 * Fr.wrap(9); + + // NOTE: pushed into memory (stack >:'( ) + ep.x_double_identity = + (ep.x_3 + ep.x_1 + ep.x_1) * + y1_sqr_mul_4 - + x1_pow_4_mul_9; + + Fr acc = ep.x_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + evals[12] = evals[12] + acc; + } + + // Contribution 11 point doubling, y-coordinate check + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + { + Fr x1_sqr_mul_3 = (ep.x_1 + ep.x_1 + ep.x_1) * ep.x_1; + Fr y_double_identity = x1_sqr_mul_3 * + (ep.x_1 - ep.x_3) - + (ep.y_1 + ep.y_1) * + (ep.y_1 + ep.y_3); + evals[13] = + evals[13] + + y_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + } + } + + function accumulateMemoryRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + MemParams memory ap; + + // Compute eta powers locally + Fr eta_two = rp.eta * rp.eta; + Fr eta_three = eta_two * rp.eta; + + /** + * MEMORY + * + * A RAM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * t: `timestamp` of memory cell being accessed (used for RAM, set to 0 for ROM) + * * v: `value` of memory cell being accessed + * * a: `access` type of record. read: 0 = read, 1 = write + * * r: `record` of memory cell. record = access + index * eta + timestamp * eta_two + value * eta_three + * + * A ROM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * v: `value1` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * v2:`value2` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * r: `record` of memory cell. record = index * eta + value2 * eta_two + value1 * eta_three + * + * When performing a read/write access, the values of i, t, v, v2, a, r are stored in the following wires + + * selectors, depending on whether the gate is a RAM read/write or a ROM read + * + * | gate type | i | v2/t | v | a | r | + * | --------- | -- | ----- | -- | -- | -- | + * | ROM | w1 | w2 | w3 | -- | w4 | + * | RAM | w1 | w2 | w3 | qc | w4 | + * + * (for accesses where `index` is a circuit constant, it is assumed the circuit will apply a copy constraint on + * `w2` to fix its value) + * + * + */ + + /** + * Memory Record Check + * Partial degree: 1 + * Total degree: 4 + * + * A ROM/ROM access gate can be evaluated with the identity: + * + * qc + w1 \eta + w2 \eta_two + w3 \eta_three - w4 = 0 + * + * For ROM gates, qc = 0 + */ + ap.memory_record_check = wire(p, WIRE.W_O) * eta_three; + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_R) * eta_two); + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_L) * rp.eta); + ap.memory_record_check = ap.memory_record_check + wire(p, WIRE.Q_C); + ap.partial_record_check = ap.memory_record_check; // used in RAM consistency check; deg 1 or 4 + ap.memory_record_check = ap.memory_record_check - wire(p, WIRE.W_4); + + /** + * Contribution 13 & 14 + * ROM Consistency Check + * Partial degree: 1 + * Total degree: 4 + * + * For every ROM read, a set equivalence check is applied between the record witnesses, and a second set of + * records that are sorted. + * + * We apply the following checks for the sorted records: + * + * 1. w1, w2, w3 correctly map to 'index', 'v1, 'v2' for a given record value at w4 + * 2. index values for adjacent records are monotonically increasing + * 3. if, at gate i, index_i == index_{i + 1}, then value1_i == value1_{i + 1} and value2_i == value2_{i + 1} + * + */ + ap.index_delta = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_L); + ap.record_delta = wire(p, WIRE.W_4_SHIFT) - wire(p, WIRE.W_4); + + ap.index_is_monotonically_increasing = + ap.index_delta * + (ap.index_delta - Fr.wrap(1)); // deg 2 + + ap.adjacent_values_match_if_adjacent_indices_match = + (ap.index_delta * MINUS_ONE + ONE) * + ap.record_delta; // deg 2 + + evals[15] = + ap.adjacent_values_match_if_adjacent_indices_match * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + evals[16] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + + ap.ROM_consistency_check_identity = + ap.memory_record_check * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)); // deg 3 or 7 + + /** + * Contributions 15,16,17 + * RAM Consistency Check + * + * The 'access' type of the record is extracted with the expression `w_4 - ap.partial_record_check` + * (i.e. for an honest Prover `w1 * eta + w2 * eta^2 + w3 * eta^3 - w4 = access`. + * This is validated by requiring `access` to be boolean + * + * For two adjacent entries in the sorted list if _both_ + * A) index values match + * B) adjacent access value is 0 (i.e. next gate is a READ) + * then + * C) both values must match. + * The gate boolean check is + * (A && B) => C === !(A && B) || C === !A || !B || C + * + * N.B. it is the responsibility of the circuit writer to ensure that every RAM cell is initialized + * with a WRITE operation. + */ + Fr access_type = (wire(p, WIRE.W_4) - ap.partial_record_check); // will be 0 or 1 for honest Prover; deg 1 or 4 + ap.access_check = access_type * (access_type - Fr.wrap(1)); // check value is 0 or 1; deg 2 or 8 + + // reverse order we could re-use `ap.partial_record_check` 1 - ((w3' * eta + w2') * eta + w1') * eta + // deg 1 or 4 + ap.next_gate_access_type = wire(p, WIRE.W_O_SHIFT) * eta_three; + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_R_SHIFT) * eta_two); + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_L_SHIFT) * rp.eta); + ap.next_gate_access_type = + wire(p, WIRE.W_4_SHIFT) - + ap.next_gate_access_type; + + Fr value_delta = wire(p, WIRE.W_O_SHIFT) - wire(p, WIRE.W_O); + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = + (ap.index_delta * MINUS_ONE + ONE) * + value_delta * + (ap.next_gate_access_type * MINUS_ONE + ONE); // deg 3 or 6 + + // We can't apply the RAM consistency check identity on the final entry in the sorted list (the wires in the + // next gate would make the identity fail). We need to validate that its 'access type' bool is correct. Can't + // do with an arithmetic gate because of the `eta` factors. We need to check that the *next* gate's access + // type is correct, to cover this edge case + // deg 2 or 4 + ap.next_gate_access_type_is_boolean = + ap.next_gate_access_type * + ap.next_gate_access_type - + ap.next_gate_access_type; + + // Putting it all together... + evals[17] = + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 or 8 + evals[18] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 + evals[19] = + ap.next_gate_access_type_is_boolean * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 6 + + ap.RAM_consistency_check_identity = + ap.access_check * + (wire(p, WIRE.Q_O)); // deg 3 or 9 + + /** + * RAM Timestamp Consistency Check + * + * | w1 | w2 | w3 | w4 | + * | index | timestamp | timestamp_check | -- | + * + * Let delta_index = index_{i + 1} - index_{i} + * + * Iff delta_index == 0, timestamp_check = timestamp_{i + 1} - timestamp_i + * Else timestamp_check = 0 + */ + ap.timestamp_delta = wire(p, WIRE.W_R_SHIFT) - wire(p, WIRE.W_R); + ap.RAM_timestamp_check_identity = + (ap.index_delta * MINUS_ONE + ONE) * + ap.timestamp_delta - + wire(p, WIRE.W_O); // deg 3 + + /** + * Complete Contribution 12 + * The complete RAM/ROM memory identity + * Partial degree: + */ + ap.memory_identity = ap.ROM_consistency_check_identity; // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_timestamp_check_identity * + (wire(p, WIRE.Q_4) * wire(p, WIRE.Q_L)); // deg 4 + ap.memory_identity = + ap.memory_identity + + ap.memory_record_check * + (wire(p, WIRE.Q_M) * wire(p, WIRE.Q_L)); // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_consistency_check_identity; // deg 3 or 9 + + // (deg 3 or 9) + (deg 4) + (deg 3) + ap.memory_identity = + ap.memory_identity * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 10 + evals[14] = ap.memory_identity; + } + + function accumulateNnfRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + NnfParams memory ap; + + /** + * Contribution 12 + * Non native field arithmetic gate 2 + * deg 4 + * + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * + */ + ap.limb_subproduct = + wire(p, WIRE.W_L) * + wire(p, WIRE.W_R_SHIFT) + + wire(p, WIRE.W_L_SHIFT) * + wire(p, WIRE.W_R); + ap.non_native_field_gate_2 = (wire(p, WIRE.W_L) * + wire(p, WIRE.W_4) + + wire(p, WIRE.W_R) * + wire(p, WIRE.W_O) - + wire(p, WIRE.W_O_SHIFT)); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * LIMB_SIZE; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 - + wire(p, WIRE.W_4_SHIFT); + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 + + ap.limb_subproduct; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 * + wire(p, WIRE.Q_4); + + ap.limb_subproduct = ap.limb_subproduct * LIMB_SIZE; + ap.limb_subproduct = + ap.limb_subproduct + + (wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R_SHIFT)); + ap.non_native_field_gate_1 = ap.limb_subproduct; + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 - + (wire(p, WIRE.W_O) + wire(p, WIRE.W_4)); + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 * + wire(p, WIRE.Q_O); + + ap.non_native_field_gate_3 = ap.limb_subproduct; + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 + + wire(p, WIRE.W_4); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 - + (wire(p, WIRE.W_O_SHIFT) + wire(p, WIRE.W_4_SHIFT)); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 * + wire(p, WIRE.Q_M); + + Fr non_native_field_identity = ap.non_native_field_gate_1 + + ap.non_native_field_gate_2 + + ap.non_native_field_gate_3; + non_native_field_identity = + non_native_field_identity * + wire(p, WIRE.Q_R); + + // ((((w2' * 2^14 + w1') * 2^14 + w3) * 2^14 + w2) * 2^14 + w1 - w4) * qm + // deg 2 + ap.limb_accumulator_1 = wire(p, WIRE.W_R_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_O); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_R); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L); + ap.limb_accumulator_1 = ap.limb_accumulator_1 - wire(p, WIRE.W_4); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * wire(p, WIRE.Q_4); + + // ((((w3' * 2^14 + w2') * 2^14 + w1') * 2^14 + w4) * 2^14 + w3 - w4') * qm + // deg 2 + ap.limb_accumulator_2 = wire(p, WIRE.W_O_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_R_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_4); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_O); + ap.limb_accumulator_2 = ap.limb_accumulator_2 - wire(p, WIRE.W_4_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * wire(p, WIRE.Q_M); + + Fr limb_accumulator_identity = ap.limb_accumulator_1 + + ap.limb_accumulator_2; + limb_accumulator_identity = + limb_accumulator_identity * + wire(p, WIRE.Q_O); // deg 3 + + ap.nnf_identity = non_native_field_identity + limb_accumulator_identity; + ap.nnf_identity = ap.nnf_identity * (wire(p, WIRE.Q_NNF) * domainSep); + evals[20] = ap.nnf_identity; + } + + function accumulatePoseidonExternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonExternalParams memory ep; + + ep.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + ep.s2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_R); + ep.s3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_O); + ep.s4 = wire(p, WIRE.W_4) + wire(p, WIRE.Q_4); + + ep.u1 = ep.s1 * ep.s1 * ep.s1 * ep.s1 * ep.s1; + ep.u2 = ep.s2 * ep.s2 * ep.s2 * ep.s2 * ep.s2; + ep.u3 = ep.s3 * ep.s3 * ep.s3 * ep.s3 * ep.s3; + ep.u4 = ep.s4 * ep.s4 * ep.s4 * ep.s4 * ep.s4; + // matrix mul v = M_E * u with 14 additions + ep.t0 = ep.u1 + ep.u2; // u_1 + u_2 + ep.t1 = ep.u3 + ep.u4; // u_3 + u_4 + ep.t2 = ep.u2 + ep.u2 + ep.t1; // 2u_2 + // ep.t2 += ep.t1; // 2u_2 + u_3 + u_4 + ep.t3 = ep.u4 + ep.u4 + ep.t0; // 2u_4 + // ep.t3 += ep.t0; // u_1 + u_2 + 2u_4 + ep.v4 = ep.t1 + ep.t1; + ep.v4 = ep.v4 + ep.v4 + ep.t3; + // ep.v4 += ep.t3; // u_1 + u_2 + 4u_3 + 6u_4 + ep.v2 = ep.t0 + ep.t0; + ep.v2 = ep.v2 + ep.v2 + ep.t2; + // ep.v2 += ep.t2; // 4u_1 + 6u_2 + u_3 + u_4 + ep.v1 = ep.t3 + ep.v2; // 5u_1 + 7u_2 + u_3 + 3u_4 + ep.v3 = ep.t2 + ep.v4; // u_1 + 3u_2 + 5u_3 + 7u_4 + + ep.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_EXTERNAL) * domainSep; + evals[21] = + evals[21] + + ep.q_pos_by_scaling * + (ep.v1 - wire(p, WIRE.W_L_SHIFT)); + + evals[22] = + evals[22] + + ep.q_pos_by_scaling * + (ep.v2 - wire(p, WIRE.W_R_SHIFT)); + + evals[23] = + evals[23] + + ep.q_pos_by_scaling * + (ep.v3 - wire(p, WIRE.W_O_SHIFT)); + + evals[24] = + evals[24] + + ep.q_pos_by_scaling * + (ep.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + function accumulatePoseidonInternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonInternalParams memory ip; + + Fr[4] memory INTERNAL_MATRIX_DIAGONAL = [ + FrLib.from( + 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7 + ), + FrLib.from( + 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b + ), + FrLib.from( + 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15 + ), + FrLib.from( + 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b + ) + ]; + + // add round constants + ip.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + + // apply s-box round + ip.u1 = ip.s1 * ip.s1 * ip.s1 * ip.s1 * ip.s1; + ip.u2 = wire(p, WIRE.W_R); + ip.u3 = wire(p, WIRE.W_O); + ip.u4 = wire(p, WIRE.W_4); + + // matrix mul with v = M_I * u 4 muls and 7 additions + ip.u_sum = ip.u1 + ip.u2 + ip.u3 + ip.u4; + + ip.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_INTERNAL) * domainSep; + + ip.v1 = ip.u1 * INTERNAL_MATRIX_DIAGONAL[0] + ip.u_sum; + evals[25] = + evals[25] + + ip.q_pos_by_scaling * + (ip.v1 - wire(p, WIRE.W_L_SHIFT)); + + ip.v2 = ip.u2 * INTERNAL_MATRIX_DIAGONAL[1] + ip.u_sum; + evals[26] = + evals[26] + + ip.q_pos_by_scaling * + (ip.v2 - wire(p, WIRE.W_R_SHIFT)); + + ip.v3 = ip.u3 * INTERNAL_MATRIX_DIAGONAL[2] + ip.u_sum; + evals[27] = + evals[27] + + ip.q_pos_by_scaling * + (ip.v3 - wire(p, WIRE.W_O_SHIFT)); + + ip.v4 = ip.u4 * INTERNAL_MATRIX_DIAGONAL[3] + ip.u_sum; + evals[28] = + evals[28] + + ip.q_pos_by_scaling * + (ip.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + // Batch subrelation evaluations using precomputed powers of alpha + // First subrelation is implicitly scaled by 1, subsequent ones use powers from the subrelationChallenges array + function scaleAndBatchSubrelations( + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges + ) internal pure returns (Fr accumulator) { + accumulator = evaluations[0]; + + for (uint256 i = 1; i < NUMBER_OF_SUBRELATIONS; ++i) { + accumulator = + accumulator + + evaluations[i] * + subrelationChallenges[i - 1]; + } + } +} + +library CommitmentSchemeLib { + using FrLib for Fr; + + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + Fr unshiftedScalarNeg; + Fr shiftedScalarNeg; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Accumulator for powers of rho + Fr batchingChallenge; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchedEvaluation; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] denominators; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] batchingScalars; + // 1/(z - r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr posInvertedDenominator; + // 1/(z + r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr negInvertedDenominator; + // ν^{2i} * 1/(z - r^{2^i}) + Fr scalingFactorPos; + // ν^{2i+1} * 1/(z + r^{2^i}) + Fr scalingFactorNeg; + // Fold_i(r^{2^i}) reconstructed by Verifier + Fr[] foldPosEvaluations; + } + + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., m-1 + function computeFoldPosEvaluations( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckUChallenges, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[] memory geminiEvalChallengePowers, + uint256 logSize + ) internal view returns (Fr[] memory) { + Fr[] memory foldPosEvaluations = new Fr[](logSize); + for (uint256 i = logSize; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = sumcheckUChallenges[i - 1]; + + Fr batchedEvalRoundAcc = ((challengePower * + batchedEvalAccumulator * + Fr.wrap(2)) - + geminiEvaluations[i - 1] * + (challengePower * (ONE - u) - u)); + // Divide by the denominator + batchedEvalRoundAcc = + batchedEvalRoundAcc * + (challengePower * (ONE - u) + u).invert(); + + batchedEvalAccumulator = batchedEvalRoundAcc; + foldPosEvaluations[i - 1] = batchedEvalRoundAcc; + } + return foldPosEvaluations; + } + + function computeSquares( + Fr r, + uint256 logN + ) internal pure returns (Fr[] memory) { + Fr[] memory squares = new Fr[](logN); + squares[0] = r; + for (uint256 i = 1; i < logN; ++i) { + squares[i] = squares[i - 1].sqr(); + } + return squares; + } +} + +uint256 constant Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // EC group order. F_q + +// Fr utility + +function bytesToFr(bytes calldata proofSection) pure returns (Fr scalar) { + scalar = FrLib.fromBytes32(bytes32(proofSection)); +} + +// EC Point utilities +function bytesToG1Point( + bytes calldata proofSection +) pure returns (Honk.G1Point memory point) { + uint256 x = uint256(bytes32(proofSection[0x00:0x20])); + uint256 y = uint256(bytes32(proofSection[0x20:0x40])); + require(x < Q && y < Q, Errors.ValueGeGroupOrder()); + + // (0,0) is the canonical EIP-196 encoding of the identity. It is accepted here + // because polynomial commitments to identically-zero polynomials (e.g. unused + // selector or table polys) are legitimately the identity. On-curve validation + // (y² = x³ + 3) is handled by the ecAdd/ecMul precompiles per EIP-196. + point = Honk.G1Point({ x: x, y: y }); +} + +function negateInplace( + Honk.G1Point memory point +) pure returns (Honk.G1Point memory) { + // When y == 0 (order-2 point), negation is the same point. Q - 0 = Q which is >= Q. + if (point.y != 0) { + point.y = Q - point.y; + } + return point; +} + +/** + * Convert the pairing points to G1 points. + * + * The pairing points are serialised as an array of 2 limbs representing two points + * (P0 and P1, used for lhs and rhs of pairing operation). + * + * There are 2 limbs (lo, hi) for each coordinate, so 4 limbs per point, 8 total. + * Layout: [P0.x_lo, P0.x_hi, P0.y_lo, P0.y_hi, P1.x_lo, P1.x_hi, P1.y_lo, P1.y_hi] + * + * @param pairingPoints The pairing points to convert. + * @return lhs P0 point + * @return rhs P1 point + */ +function convertPairingPointsToG1( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (Honk.G1Point memory lhs, Honk.G1Point memory rhs) { + // P0 (lhs): x = lo | (hi << 136) + uint256 lhsX = Fr.unwrap(pairingPoints[0]); + lhsX |= Fr.unwrap(pairingPoints[1]) << 136; + + uint256 lhsY = Fr.unwrap(pairingPoints[2]); + lhsY |= Fr.unwrap(pairingPoints[3]) << 136; + + // P1 (rhs): x = lo | (hi << 136) + uint256 rhsX = Fr.unwrap(pairingPoints[4]); + rhsX |= Fr.unwrap(pairingPoints[5]) << 136; + + uint256 rhsY = Fr.unwrap(pairingPoints[6]); + rhsY |= Fr.unwrap(pairingPoints[7]) << 136; + + // Reconstructed coordinates must be < Q to prevent malleability. + // Without this, two different limb encodings could map to the same curve point + // (via mulmod reduction in on-curve checks) but produce different transcript hashes. + require( + lhsX < Q && lhsY < Q && rhsX < Q && rhsY < Q, + Errors.ValueGeGroupOrder() + ); + + lhs.x = lhsX; + lhs.y = lhsY; + rhs.x = rhsX; + rhs.y = rhsY; +} + +/** + * Hash the pairing inputs from the present verification context with those extracted from the public inputs. + * + * @param proofPairingPoints Pairing points from the proof - (public inputs). + * @param accLhs Accumulator point for the left side - result of shplemini. + * @param accRhs Accumulator point for the right side - result of shplemini. + * @return recursionSeparator The recursion separator - generated from hashing the above. + */ +function generateRecursionSeparator( + Fr[PAIRING_POINTS_SIZE] memory proofPairingPoints, + Honk.G1Point memory accLhs, + Honk.G1Point memory accRhs +) pure returns (Fr recursionSeparator) { + // hash the proof aggregated X + // hash the proof aggregated Y + // hash the accum X + // hash the accum Y + + ( + Honk.G1Point memory proofLhs, + Honk.G1Point memory proofRhs + ) = convertPairingPointsToG1(proofPairingPoints); + + uint256[8] memory recursionSeparatorElements; + + // Proof points + recursionSeparatorElements[0] = proofLhs.x; + recursionSeparatorElements[1] = proofLhs.y; + recursionSeparatorElements[2] = proofRhs.x; + recursionSeparatorElements[3] = proofRhs.y; + + // Accumulator points + recursionSeparatorElements[4] = accLhs.x; + recursionSeparatorElements[5] = accLhs.y; + recursionSeparatorElements[6] = accRhs.x; + recursionSeparatorElements[7] = accRhs.y; + + recursionSeparator = FrLib.from( + uint256(keccak256(abi.encodePacked(recursionSeparatorElements))) % P + ); +} + +/** + * G1 Mul with Separator + * Using the ecAdd and ecMul precompiles + * + * @param basePoint The point to multiply. + * @param other The other point to add. + * @param recursionSeperator The separator to use for the multiplication. + * @return `(recursionSeperator * basePoint) + other`. + */ +function mulWithSeperator( + Honk.G1Point memory basePoint, + Honk.G1Point memory other, + Fr recursionSeperator +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + result = ecMul(recursionSeperator, basePoint); + result = ecAdd(result, other); + + return result; +} + +/** + * G1 Mul + * Takes a Fr value and a G1 point and uses the ecMul precompile to return the result. + * + * @param value The value to multiply the point by. + * @param point The point to multiply. + * @return result The result of the multiplication. + */ +function ecMul( + Fr value, + Honk.G1Point memory point +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write the point into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | point.x + // free + 0x20| point.y + mstore(free, mload(point)) + mstore(add(free, 0x20), mload(add(point, 0x20))) + // Write the scalar into memory (one 32 byte word) + // Memory layout: + // Address | value + // free + 0x40| value + mstore(add(free, 0x40), value) + + // Call the ecMul precompile, it takes in the following + // [point.x, point.y, scalar], and returns the result back into the free memory location. + let success := staticcall(gas(), 0x07, free, 0x60, free, 0x40) + if iszero(success) { + revert(0, 0) + } + // Copy the result of the multiplication back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x60)) + } + + return result; +} + +/** + * G1 Add + * Takes two G1 points and uses the ecAdd precompile to return the result. + * + * @param lhs The left hand side of the addition. + * @param rhs The right hand side of the addition. + * @return result The result of the addition. + */ +function ecAdd( + Honk.G1Point memory lhs, + Honk.G1Point memory rhs +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write lhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | lhs.x + // free + 0x20| lhs.y + mstore(free, mload(lhs)) + mstore(add(free, 0x20), mload(add(lhs, 0x20))) + + // Write rhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free + 0x40| rhs.x + // free + 0x60| rhs.y + mstore(add(free, 0x40), mload(rhs)) + mstore(add(free, 0x60), mload(add(rhs, 0x20))) + + // Call the ecAdd precompile, it takes in the following + // [lhs.x, lhs.y, rhs.x, rhs.y], and returns their addition back into the free memory location. + let success := staticcall(gas(), 0x06, free, 0x80, free, 0x40) + if iszero(success) { + revert(0, 0) + } + + // Copy the result of the addition back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x80)) + } + + return result; +} + +function rejectPointAtInfinity(Honk.G1Point memory point) pure { + require((point.x | point.y) != 0, Errors.PointAtInfinity()); +} + +/** + * Check if pairing point limbs are all zero (default/infinity). + * Default pairing points indicate no recursive verification occurred. + */ +function arePairingPointsDefault( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (bool) { + uint256 acc = 0; + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + acc |= Fr.unwrap(pairingPoints[i]); + } + return acc == 0; +} + +function pairing( + Honk.G1Point memory rhs, + Honk.G1Point memory lhs +) view returns (bool decodedResult) { + bytes memory input = abi.encodePacked( + rhs.x, + rhs.y, + // Fixed G2 point + uint256( + 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2 + ), + uint256( + 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed + ), + uint256( + 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b + ), + uint256( + 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa + ), + lhs.x, + lhs.y, + // G2 point from VK + uint256( + 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1 + ), + uint256( + 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0 + ), + uint256( + 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4 + ), + uint256( + 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55 + ) + ); + + (bool success, bytes memory result) = address(0x08).staticcall(input); + decodedResult = success && abi.decode(result, (bool)); +} + +abstract contract BaseZKHonkVerifier is IVerifier { + using FrLib for Fr; + + struct PairingInputs { + Honk.G1Point P_0; + Honk.G1Point P_1; + } + + struct SmallSubgroupIpaIntermediates { + Fr[SUBGROUP_SIZE] challengePolyLagrange; + Fr challengePolyEval; + Fr lagrangeFirst; + Fr lagrangeLast; + Fr rootPower; + Fr[SUBGROUP_SIZE] denominators; // this has to disappear + Fr diff; + } + + // Constants for proof length calculation (matching UltraKeccakZKFlavor) + uint256 internal constant NUM_WITNESS_ENTITIES = + 8 + NUM_MASKING_POLYNOMIALS; + uint256 internal constant NUM_ELEMENTS_COMM = 2; // uint256 elements for curve points + uint256 internal constant NUM_ELEMENTS_FR = 1; // uint256 elements for field elements + uint256 internal constant NUM_LIBRA_EVALUATIONS = 4; // libra evaluations + + uint256 internal constant LIBRA_COMMITMENTS = 3; + uint256 internal constant LIBRA_EVALUATIONS = 4; + uint256 internal constant LIBRA_UNIVARIATES_LENGTH = 9; + + uint256 internal constant SHIFTED_COMMITMENTS_START = 30; + uint256 internal constant PERMUTATION_ARGUMENT_VALUE_SEPARATOR = 1 << 28; + + uint256 internal immutable $N; + uint256 internal immutable $LOG_N; + uint256 internal immutable $VK_HASH; + uint256 internal immutable $NUM_PUBLIC_INPUTS; + uint256 internal immutable $MSMSize; + + constructor( + uint256 _N, + uint256 _logN, + uint256 _vkHash, + uint256 _numPublicInputs + ) { + $N = _N; + $LOG_N = _logN; + $VK_HASH = _vkHash; + $NUM_PUBLIC_INPUTS = _numPublicInputs; + $MSMSize = NUMBER_UNSHIFTED_ZK + _logN + LIBRA_COMMITMENTS + 2; + } + + function validateVerificationKey( + Honk.VerificationKey memory vk + ) internal view { + require( + $N == vk.circuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $LOG_N == vk.logCircuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $NUM_PUBLIC_INPUTS == vk.publicInputsSize, + Errors.VerificationKeyConfigurationMismatch() + ); + } + + function verify( + bytes calldata proof, + bytes32[] calldata publicInputs + ) public view override returns (bool verified) { + // Calculate expected proof size based on $LOG_N + uint256 expectedProofSize = calculateProofSize($LOG_N); + + // Check the received proof is the expected size where each field element is 32 bytes + require( + proof.length == expectedProofSize, + Errors.ProofLengthWrongWithLogN( + $LOG_N, + proof.length, + expectedProofSize + ) + ); + + Honk.VerificationKey memory vk = loadVerificationKey(); + Honk.ZKProof memory p = ZKTranscriptLib.loadProof(proof, $LOG_N); + + require( + publicInputs.length == vk.publicInputsSize - PAIRING_POINTS_SIZE, + Errors.PublicInputsLengthWrong() + ); + + // Generate the fiat shamir challenges for the whole protocol + ZKTranscript memory t = ZKTranscriptLib.generateTranscript( + p, + publicInputs, + $VK_HASH, + $NUM_PUBLIC_INPUTS, + $LOG_N + ); + + // Derive public input delta + t.relationParameters.publicInputsDelta = computePublicInputDelta( + publicInputs, + p.pairingPointObject, + t.relationParameters.beta, + t.relationParameters.gamma, + 5 // pubInputsOffset = NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS = 4 + 1 + ); + + // Sumcheck + require(verifySumcheck(p, t), Errors.SumcheckFailed()); + require(verifyShplemini(p, vk, t), Errors.ShpleminiFailed()); + + verified = true; + } + + function computePublicInputDelta( + bytes32[] memory publicInputs, + Fr[PAIRING_POINTS_SIZE] memory pairingPointObject, + Fr beta, + Fr gamma, + uint256 offset + ) internal view returns (Fr publicInputDelta) { + Fr numerator = Fr.wrap(1); + Fr denominator = Fr.wrap(1); + + Fr numeratorAcc = gamma + + (beta * FrLib.from(PERMUTATION_ARGUMENT_VALUE_SEPARATOR + offset)); + Fr denominatorAcc = gamma - (beta * FrLib.from(offset + 1)); + + { + for ( + uint256 i = 0; + i < $NUM_PUBLIC_INPUTS - PAIRING_POINTS_SIZE; + i++ + ) { + Fr pubInput = FrLib.fromBytes32(publicInputs[i]); + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + Fr pubInput = pairingPointObject[i]; + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + } + + // Fr delta = numerator / denominator; // TOOO: batch invert later? + publicInputDelta = FrLib.div(numerator, denominator); + } + + function verifySumcheck( + Honk.ZKProof memory proof, + ZKTranscript memory tp + ) internal view returns (bool verified) { + Fr roundTargetSum = tp.libraChallenge * proof.libraSum; // default 0 + Fr powPartialEvaluation = Fr.wrap(1); + + // We perform sumcheck reductions over log n rounds ( the multivariate degree ) + for (uint256 round; round < $LOG_N; ++round) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory roundUnivariate = proof.sumcheckUnivariates[round]; + Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; + require(totalSum == roundTargetSum, Errors.SumcheckFailed()); + + Fr roundChallenge = tp.sumCheckUChallenges[round]; + + // Update the round target for the next rounf + roundTargetSum = computeNextTargetSum( + roundUnivariate, + roundChallenge + ); + powPartialEvaluation = + powPartialEvaluation * + (Fr.wrap(1) + + roundChallenge * + (tp.gateChallenges[round] - Fr.wrap(1))); + } + + // Last round + // For ZK flavors: sumcheckEvaluations has 42 elements + // Index 0 is gemini_masking_poly, indices 1-41 are the regular entities used in relations + Fr[NUMBER_OF_ENTITIES] memory relationsEvaluations; + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + relationsEvaluations[i] = proof.sumcheckEvaluations[ + i + NUM_MASKING_POLYNOMIALS + ]; // Skip gemini_masking_poly at index 0 + } + Fr grandHonkRelationSum = RelationsLib.accumulateRelationEvaluations( + relationsEvaluations, + tp.relationParameters, + tp.alphas, + powPartialEvaluation + ); + + // Row-disabling polynomial: 1 - ∏_{i≥2}(1 - u_i) + Fr evaluation = Fr.wrap(1); + for (uint256 i = 2; i < $LOG_N; i++) { + evaluation = evaluation * (Fr.wrap(1) - tp.sumCheckUChallenges[i]); + } + + grandHonkRelationSum = + grandHonkRelationSum * + (Fr.wrap(1) - evaluation) + + proof.libraEvaluation * + tp.libraChallenge; + verified = (grandHonkRelationSum == roundTargetSum); + } + + // Return the new target sum for the next sumcheck round + function computeNextTargetSum( + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariates, + Fr roundChallenge + ) internal view returns (Fr targetSum) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory BARYCENTRIC_LAGRANGE_DENOMINATORS = [ + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000000240 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ) + ]; + + // To compute the next target sum, we evaluate the given univariate at a point u (challenge). + + // Performing Barycentric evaluations + // Compute B(x) + Fr numeratorValue = Fr.wrap(1); + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + numeratorValue = numeratorValue * (roundChallenge - Fr.wrap(i)); + } + + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + denominatorInverses[i] = FrLib.invert( + BARYCENTRIC_LAGRANGE_DENOMINATORS[i] * + (roundChallenge - Fr.wrap(i)) + ); + } + + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + targetSum = + targetSum + + roundUnivariates[i] * + denominatorInverses[i]; + } + + // Scale the sum by the value of B(x) + targetSum = targetSum * numeratorValue; + } + + function verifyShplemini( + Honk.ZKProof memory proof, + Honk.VerificationKey memory vk, + ZKTranscript memory tp + ) internal view returns (bool verified) { + CommitmentSchemeLib.ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[] memory powers_of_evaluation_challenge = CommitmentSchemeLib + .computeSquares(tp.geminiR, $LOG_N); + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[] memory scalars = new Fr[]($MSMSize); + Honk.G1Point[] memory commitments = new Honk.G1Point[]($MSMSize); + + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[0]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[0]).invert(); + + mem.unshiftedScalar = + mem.posInvertedDenominator + + (tp.shplonkNu * mem.negInvertedDenominator); + mem.shiftedScalar = + tp.geminiR.invert() * + (mem.posInvertedDenominator - + (tp.shplonkNu * mem.negInvertedDenominator)); + + scalars[0] = Fr.wrap(1); + commitments[0] = proof.shplonkQ; + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + // For ZK flavors: evaluations array is [gemini_masking_poly, qm, qc, ql, qr, ...] + // Start batching challenge at 1, not rho, to match non-ZK pattern + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + mem.unshiftedScalarNeg = mem.unshiftedScalar.neg(); + mem.shiftedScalarNeg = mem.shiftedScalar.neg(); + + // Process all NUMBER_UNSHIFTED_ZK evaluations (includes gemini_masking_poly at index 0) + for (uint256 i = 1; i <= NUMBER_UNSHIFTED_ZK; ++i) { + scalars[i] = mem.unshiftedScalarNeg * mem.batchingChallenge; + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[i - NUM_MASKING_POLYNOMIALS] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + // For each of the to be shifted commitments perform the shift in place by + // adding to the unshifted value. + // We do so, as the values are to be used in batchMul later, and as + // `a * c + b * c = (a + b) * c` this will allow us to reduce memory and compute. + // Applied to w1, w2, w3, w4 and zPerm + for (uint256 i = 0; i < NUMBER_TO_BE_SHIFTED; ++i) { + uint256 scalarOff = i + SHIFTED_COMMITMENTS_START; + uint256 evaluationOff = i + NUMBER_UNSHIFTED_ZK; + + scalars[scalarOff] = + scalars[scalarOff] + + (mem.shiftedScalarNeg * mem.batchingChallenge); + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[evaluationOff] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + + commitments[1] = proof.geminiMaskingPoly; + + commitments[2] = vk.s1; + commitments[3] = vk.s2; + commitments[4] = vk.s3; + commitments[5] = vk.s4; + commitments[6] = vk.id1; + commitments[7] = vk.id2; + commitments[8] = vk.id3; + commitments[9] = vk.id4; + commitments[10] = vk.lagrangeFirst; + commitments[11] = vk.lagrangeLast; + commitments[12] = vk.qLookup; + commitments[13] = vk.t1; + commitments[14] = vk.t2; + commitments[15] = vk.t3; + commitments[16] = vk.t4; + commitments[17] = vk.qm; + commitments[18] = vk.qr; + commitments[19] = vk.qo; + commitments[20] = vk.qc; + commitments[21] = vk.ql; + commitments[22] = vk.q4; + commitments[23] = vk.qArith; + commitments[24] = vk.qDeltaRange; + commitments[25] = vk.qElliptic; + commitments[26] = vk.qMemory; + commitments[27] = vk.qNnf; + commitments[28] = vk.qPoseidon2External; + commitments[29] = vk.qPoseidon2Internal; + + // Accumulate proof points + commitments[30] = proof.w1; + commitments[31] = proof.w2; + commitments[32] = proof.w3; + commitments[33] = proof.w4; + commitments[34] = proof.zPerm; + commitments[35] = proof.lookupInverses; + commitments[36] = proof.lookupReadCounts; + commitments[37] = proof.lookupReadTags; + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., $LOG_N - 1 + Fr[] memory foldPosEvaluations = CommitmentSchemeLib + .computeFoldPosEvaluations( + tp.sumCheckUChallenges, + mem.batchedEvaluation, + proof.geminiAEvaluations, + powers_of_evaluation_challenge, + $LOG_N + ); + + mem.constantTermAccumulator = + foldPosEvaluations[0] * + mem.posInvertedDenominator; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + (proof.geminiAEvaluations[0] * + tp.shplonkNu * + mem.negInvertedDenominator); + + mem.batchingChallenge = tp.shplonkNu.sqr(); + uint256 boundary = NUMBER_UNSHIFTED_ZK + 1; + + // Compute Shplonk constant term contributions from Aₗ(± r^{2ˡ}) for l = 1, ..., m-1; + // Compute scalar multipliers for each fold commitment + for (uint256 i = 0; i < $LOG_N - 1; ++i) { + bool dummy_round = i >= ($LOG_N - 1); + + if (!dummy_round) { + // Update inverted denominators + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[i + 1]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[i + 1]).invert(); + + // Compute the scalar multipliers for Aₗ(± r^{2ˡ}) and [Aₗ] + mem.scalingFactorPos = + mem.batchingChallenge * + mem.posInvertedDenominator; + mem.scalingFactorNeg = + mem.batchingChallenge * + tp.shplonkNu * + mem.negInvertedDenominator; + scalars[boundary + i] = + mem.scalingFactorNeg.neg() + + mem.scalingFactorPos.neg(); + + // Accumulate the const term contribution given by + // v^{2l} * Aₗ(r^{2ˡ}) /(z-r^{2^l}) + v^{2l+1} * Aₗ(-r^{2ˡ}) /(z+ r^{2^l}) + Fr accumContribution = mem.scalingFactorNeg * + proof.geminiAEvaluations[i + 1]; + accumContribution = + accumContribution + + mem.scalingFactorPos * + foldPosEvaluations[i + 1]; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + accumContribution; + } + // Update the running power of v + mem.batchingChallenge = + mem.batchingChallenge * + tp.shplonkNu * + tp.shplonkNu; + + commitments[boundary + i] = proof.geminiFoldComms[i]; + } + + boundary += $LOG_N - 1; + + // Denominators 1/(z - point_i) for the five opening points {r, g*r, r, 1, r}. + mem.denominators[0] = ONE.div(tp.shplonkZ - tp.geminiR); + mem.denominators[1] = ONE.div( + tp.shplonkZ - SUBGROUP_GENERATOR * tp.geminiR + ); + mem.denominators[2] = mem.denominators[0]; + mem.denominators[SMALL_IPA_BOUNDARY_OPENING_IDX] = ONE.div( + tp.shplonkZ - ONE + ); + mem.denominators[NUM_SMALL_IPA_OPENING_CLAIMS - 1] = mem.denominators[ + 0 + ]; + + // Iterate the opening claims in three segments — the inner loops can't be merged without an extra induction + // variable, which pushes us into stack-too-deep. + for (uint256 i = 0; i < SMALL_IPA_BOUNDARY_OPENING_IDX; i++) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i]; + } + + // Boundary slot: claimed value is hardcoded 0, so no constantTermAccumulator contribution. + { + Fr scalingFactor = mem.denominators[ + SMALL_IPA_BOUNDARY_OPENING_IDX + ] * mem.batchingChallenge; + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX] = scalingFactor + .neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + } + + for ( + uint256 i = SMALL_IPA_BOUNDARY_OPENING_IDX + 1; + i < NUM_SMALL_IPA_OPENING_CLAIMS; + i++ + ) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i - 1]; + } + + // Group per-claim batching scalars by commitment: [G], [A] (three openings), [Q]. + scalars[boundary] = mem.batchingScalars[0]; + scalars[boundary + 1] = + mem.batchingScalars[1] + + mem.batchingScalars[2] + + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX]; + scalars[boundary + 2] = mem.batchingScalars[ + NUM_SMALL_IPA_OPENING_CLAIMS - 1 + ]; + + for (uint256 i = 0; i < LIBRA_COMMITMENTS; i++) { + commitments[boundary++] = proof.libraCommitments[i]; + } + + commitments[boundary] = Honk.G1Point({ x: 1, y: 2 }); + scalars[boundary++] = mem.constantTermAccumulator; + + require( + checkEvalsConsistency( + proof.libraPolyEvals, + tp.geminiR, + tp.sumCheckUChallenges, + proof.libraEvaluation + ), + Errors.ConsistencyCheckFailed() + ); + + Honk.G1Point memory quotient_commitment = proof.kzgQuotient; + + commitments[boundary] = quotient_commitment; + scalars[boundary] = tp.shplonkZ; // evaluation challenge + + PairingInputs memory pair; + pair.P_0 = batchMul(commitments, scalars); + pair.P_1 = negateInplace(quotient_commitment); + + // Aggregate pairing points (skip if default/infinity — no recursive verification occurred) + if (!arePairingPointsDefault(proof.pairingPointObject)) { + Fr recursionSeparator = generateRecursionSeparator( + proof.pairingPointObject, + pair.P_0, + pair.P_1 + ); + ( + Honk.G1Point memory P_0_other, + Honk.G1Point memory P_1_other + ) = convertPairingPointsToG1(proof.pairingPointObject); + + // Validate the points from the proof are on the curve + rejectPointAtInfinity(P_0_other); + rejectPointAtInfinity(P_1_other); + + // accumulate with aggregate points in proof + pair.P_0 = mulWithSeperator( + pair.P_0, + P_0_other, + recursionSeparator + ); + pair.P_1 = mulWithSeperator( + pair.P_1, + P_1_other, + recursionSeparator + ); + } + + return pairing(pair.P_0, pair.P_1); + } + + function checkEvalsConsistency( + Fr[LIBRA_EVALUATIONS] memory libraPolyEvals, + Fr geminiR, + Fr[CONST_PROOF_SIZE_LOG_N] memory uChallenges, + Fr libraEval + ) internal view returns (bool check) { + Fr one = Fr.wrap(1); + Fr vanishingPolyEval = geminiR.pow(SUBGROUP_SIZE) - one; + require( + vanishingPolyEval != Fr.wrap(0), + Errors.GeminiChallengeInSubgroup() + ); + + SmallSubgroupIpaIntermediates memory mem; + mem.challengePolyLagrange[0] = one; + for (uint256 round = 0; round < $LOG_N; round++) { + uint256 currIdx = 1 + LIBRA_UNIVARIATES_LENGTH * round; + mem.challengePolyLagrange[currIdx] = one; + for ( + uint256 idx = currIdx + 1; + idx < currIdx + LIBRA_UNIVARIATES_LENGTH; + idx++ + ) { + mem.challengePolyLagrange[idx] = + mem.challengePolyLagrange[idx - 1] * + uChallenges[round]; + } + } + + mem.rootPower = one; + mem.challengePolyEval = Fr.wrap(0); + for (uint256 idx = 0; idx < SUBGROUP_SIZE; idx++) { + mem.denominators[idx] = mem.rootPower * geminiR - one; + mem.denominators[idx] = mem.denominators[idx].invert(); + mem.challengePolyEval = + mem.challengePolyEval + + mem.challengePolyLagrange[idx] * + mem.denominators[idx]; + mem.rootPower = mem.rootPower * SUBGROUP_GENERATOR_INVERSE; + } + + Fr numerator = vanishingPolyEval * Fr.wrap(SUBGROUP_SIZE).invert(); + mem.challengePolyEval = mem.challengePolyEval * numerator; + mem.lagrangeFirst = mem.denominators[0] * numerator; + mem.lagrangeLast = mem.denominators[SUBGROUP_SIZE - 1] * numerator; + + mem.diff = mem.lagrangeFirst * libraPolyEvals[2]; + + mem.diff = + mem.diff + + (geminiR - SUBGROUP_GENERATOR_INVERSE) * + (libraPolyEvals[1] - + libraPolyEvals[2] - + libraPolyEvals[0] * + mem.challengePolyEval); + mem.diff = + mem.diff + + mem.lagrangeLast * + (libraPolyEvals[2] - libraEval) - + vanishingPolyEval * + libraPolyEvals[3]; + + check = mem.diff == Fr.wrap(0); + } + + // This implementation is the same as above with different constants + function batchMul( + Honk.G1Point[] memory base, + Fr[] memory scalars + ) internal view returns (Honk.G1Point memory result) { + uint256 limit = $MSMSize; + + // Identity bases are accepted: VK selector/table polys may be identically zero, + // and the ecAdd/ecMul precompiles treat (0,0) as the additive identity per EIP-196. + // Soundness against an attacker substituting (0,0) for a non-zero commitment is + // upheld by sumcheck/Shplemini, which would fail on inconsistent evaluations. + + bool success = true; + assembly { + let free := mload(0x40) + + let count := 0x01 + for {} lt(count, add(limit, 1)) { + count := add(count, 1) + } { + // Get loop offsets + let base_base := add(base, mul(count, 0x20)) + let scalar_base := add(scalars, mul(count, 0x20)) + + mstore(add(free, 0x40), mload(mload(base_base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalar_base)) + + success := and( + success, + staticcall( + gas(), + 7, + add(free, 0x40), + 0x60, + add(free, 0x40), + 0x40 + ) + ) + // accumulator = accumulator + accumulator_2 + success := and( + success, + staticcall(gas(), 6, free, 0x80, free, 0x40) + ) + } + + // Return the result + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + } + + require(success, Errors.ShpleminiFailed()); + } + + // Calculate proof size based on log_n (matching UltraKeccakZKFlavor formula) + function calculateProofSize(uint256 logN) internal pure returns (uint256) { + // Witness and Libra commitments + uint256 proofLength = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM; // witness commitments + proofLength += NUM_ELEMENTS_COMM * 3; // Libra concat, grand sum, quotient comms + Gemini masking + + // Sumcheck + proofLength += + logN * + ZK_BATCHED_RELATION_PARTIAL_LENGTH * + NUM_ELEMENTS_FR; // sumcheck univariates + proofLength += NUMBER_OF_ENTITIES_ZK * NUM_ELEMENTS_FR; // sumcheck evaluations + + // Libra and Gemini + proofLength += NUM_ELEMENTS_FR * 2; // Libra sum, claimed eval + proofLength += logN * NUM_ELEMENTS_FR; // Gemini a evaluations + proofLength += NUM_LIBRA_EVALUATIONS * NUM_ELEMENTS_FR; // libra evaluations + + // PCS commitments + proofLength += (logN - 1) * NUM_ELEMENTS_COMM; // Gemini Fold commitments + proofLength += NUM_ELEMENTS_COMM * 2; // Shplonk Q and KZG W commitments + + // Pairing points + proofLength += PAIRING_POINTS_SIZE; // pairing inputs carried on public inputs + + return proofLength * 32; + } + + function loadVerificationKey() + internal + pure + virtual + returns (Honk.VerificationKey memory); +} + +contract DecryptionAggregatorVerifier is + BaseZKHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) +{ + constructor() { + validateVerificationKey(HonkVerificationKey.loadVerificationKey()); + } + function loadVerificationKey() + internal + pure + override + returns (Honk.VerificationKey memory) + { + return HonkVerificationKey.loadVerificationKey(); + } +} diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/minimum/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/minimum/DkgAggregatorVerifier.sol new file mode 100644 index 0000000000..73d2cf1b34 --- /dev/null +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/minimum/DkgAggregatorVerifier.sol @@ -0,0 +1,3262 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +pragma solidity >=0.8.21; + +uint256 constant N = 2097152; +uint256 constant LOG_N = 21; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 38; +uint256 constant VK_HASH = 0x218b03a1e24a5ecf4a2994e3f0193fb4f24dba5073f181d2ab04f0f0d3c730ba; +library HonkVerificationKey { + function loadVerificationKey() + internal + pure + returns (Honk.VerificationKey memory) + { + Honk.VerificationKey memory vk = Honk.VerificationKey({ + circuitSize: uint256(2097152), + logCircuitSize: uint256(21), + publicInputsSize: uint256(38), + ql: Honk.G1Point({ + x: uint256( + 0x0191ec9b94d9c1942f668d1c4cc2670568a291fbb97e1634a0c74c5b1146bc57 + ), + y: uint256( + 0x0364b32f6f5dd075c78836409d5afbe90b9632fc6efcc1be55044dff56262c4c + ) + }), + qr: Honk.G1Point({ + x: uint256( + 0x29ed5b50aea16b766e2eded015620822cdd0975ff88e3f3e0253ceca2327e747 + ), + y: uint256( + 0x28912a73da53ab2b796450d80fc431a282fcf48930cebafe8b571fbc597ee291 + ) + }), + qo: Honk.G1Point({ + x: uint256( + 0x1751e435a926b09c06a9a3a894da34eb0c5f9aefc58db1d3e61f33644e6fd80b + ), + y: uint256( + 0x031b23a4d31961a0e17f8d82902d1cc1cf03e701e8dcc1a951fe1b91c02c660b + ) + }), + q4: Honk.G1Point({ + x: uint256( + 0x28ce98f1291ccbdfb4fe05b779a3fb5447a4361bb190d33aec7a7eaab70da067 + ), + y: uint256( + 0x1ef966afce5490b6f49e78f92dc530f06343f3f31f49c4bcbb437e638464eb20 + ) + }), + qm: Honk.G1Point({ + x: uint256( + 0x088dc7075914f86ff4655ef207610ebbd5d7d954d6a8755b015bd506e9420864 + ), + y: uint256( + 0x283e7f21b9228b2b6abfb4dba0c4c0c77d00973765fc9a88e4da9eb2e1e9b7f8 + ) + }), + qc: Honk.G1Point({ + x: uint256( + 0x18024f56ca5b54b48a3d9505c7206c5e902a878ddc35409aaef5d81720c97f99 + ), + y: uint256( + 0x0682a9a351af65640f6d2e5fffb38a9f7e5b56fd16fb12ef6c50a1fb89fd598b + ) + }), + qLookup: Honk.G1Point({ + x: uint256( + 0x09ae66bef2d0ad77a28f9a475135d083aab02eefbc32edc5bb697cf92400c48c + ), + y: uint256( + 0x2641833fdb404a23873dbd1dbeaa222b88e748c8c8ff780d945e7fd9a4870e48 + ) + }), + qArith: Honk.G1Point({ + x: uint256( + 0x1f80e224f3e4c51dd3ab4476fba6ec547d5d119eac4b5508855610dfaeb00741 + ), + y: uint256( + 0x04b0cc29f26004c48db2e2ee4005c973a5d5214cacbf0036560f901b04c20ce3 + ) + }), + qDeltaRange: Honk.G1Point({ + x: uint256( + 0x22202db8416789ffc3c03f0c539adb215e46772bc46ba784ff0f8c32e36a4172 + ), + y: uint256( + 0x07fda9fc19ad906043342ddd56cf95b843f9334602d0a15abfdf22beff670d30 + ) + }), + qElliptic: Honk.G1Point({ + x: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ), + y: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) + }), + qMemory: Honk.G1Point({ + x: uint256( + 0x0fa7a7a3bbcec4d8d59285c4fd3ef0e61e78390d793c7cc1033c6d34452afbbe + ), + y: uint256( + 0x27595ea0d3004f8e97afa4b248bba44f84c27cd3405bc600aaf71cbd03a98023 + ) + }), + qNnf: Honk.G1Point({ + x: uint256( + 0x1e9e0d90c2b014e9915223c0a6081710a213e3baa0eacfcbb042a2c1a045d59d + ), + y: uint256( + 0x0ef98a9dfad1e7e80005212d2111bc069e588abd2254f3f38cdf8d434b355feb + ) + }), + qPoseidon2External: Honk.G1Point({ + x: uint256( + 0x0e921cf041e36c7582794fbf8a3c4313363895152b6487ca1e5c85f542d43675 + ), + y: uint256( + 0x12abdc2e4a6fd9c4fa79390a77600e0e492847ee65f7fadaabf5fa0b9148fc01 + ) + }), + qPoseidon2Internal: Honk.G1Point({ + x: uint256( + 0x22d17dc625a4b59d617c40a14c131221e20517de27940f6f10483df0fa79c860 + ), + y: uint256( + 0x25b8060f0143f87812a776ac7085c49aa0f80dd9476308f58acb8d26ee21f21e + ) + }), + s1: Honk.G1Point({ + x: uint256( + 0x10aa806a84c0925cab20b036d15a9837b125674ecbe9e6a072d9a10c68094f10 + ), + y: uint256( + 0x25274a99715ae3aec18bbb79543c18797deb286edd310dfcf03a60e40b4f0c0c + ) + }), + s2: Honk.G1Point({ + x: uint256( + 0x16a8c5dde599114d1377e4fb51a4c69fb01d118e754e526e4583bc739ba7a0ab + ), + y: uint256( + 0x04dba007cc79cde8fb741a1a9a15c6714f4ca3a32775f09b87d73fff36b3c680 + ) + }), + s3: Honk.G1Point({ + x: uint256( + 0x14c555103953d86e4b1649c77e47c21a0b907ee3dacb83fd6d373ec9936bc035 + ), + y: uint256( + 0x0632a9030c60f09928546c24f1f7bd3e855e8b72435f0e004dc9df72e889566a + ) + }), + s4: Honk.G1Point({ + x: uint256( + 0x195349c47fdb1c89b1c2e3aa55bede0054787761f65f3fb1fb617cf080cdd967 + ), + y: uint256( + 0x09fe17ded324085a058ae2df4ba439f144cb24c9a7e77d02ec04d1a13e29b783 + ) + }), + t1: Honk.G1Point({ + x: uint256( + 0x23e3dc399cfb420ca1d4c5d1647660e33a85abed22b19a35a3e9bc1ac453671f + ), + y: uint256( + 0x182cc6d1ef5e4db7dd3d7ffacc94dda14e22cde6a65817d29bec9cd5477c3d05 + ) + }), + t2: Honk.G1Point({ + x: uint256( + 0x1cf491137dd2886b0aa1f52e1c33b1a42e137942ec903272fee32835ec2af9b4 + ), + y: uint256( + 0x01aa859ed86b51dd160af31231f485de835f15c502df5e4b65af46eb034be89f + ) + }), + t3: Honk.G1Point({ + x: uint256( + 0x22a78d6fd55592cbaad2152296b9cb77a6de8ab2c5ade4a32961129682f5f852 + ), + y: uint256( + 0x29d63f029f9f6d0a8ea7f2e01d4e90c63ae63d06d202538cab4ca55c695934a7 + ) + }), + t4: Honk.G1Point({ + x: uint256( + 0x1db64843e94d5b8f623d28b39f49c0226ce8d47ffecdd01377980b4ce7c52dba + ), + y: uint256( + 0x04a0bebb79e4324efa91aa9373f756a80b643beddd20ae24bdd74d2ce4c2336c + ) + }), + id1: Honk.G1Point({ + x: uint256( + 0x030cbb4ff633a668e459a9fb742b06234e25c1a43824ee0fdc5b0de45dcd72aa + ), + y: uint256( + 0x1c7bd164ddb7babb73c5fd1a299b29f72bb288fea4db3b8e78cf9ddfe08517be + ) + }), + id2: Honk.G1Point({ + x: uint256( + 0x1e03d42b7dfd79112b8be99eafd9c08b4990ea14d21715d698f8673f01d76030 + ), + y: uint256( + 0x0d5e27a821c4a4986aeea8538a465d12612ae1e5e4551599a55afcf807a4b290 + ) + }), + id3: Honk.G1Point({ + x: uint256( + 0x11a07511934e6ceb1aaf0e62adc2ed279fdf8aba69b7f3453b07d4f27f0f079f + ), + y: uint256( + 0x1c07b952145c7143cc881eea09e6572e9838f1427ed04c2bf78c3f4279058734 + ) + }), + id4: Honk.G1Point({ + x: uint256( + 0x13cac9227ff597154b52d41bf5bdff47834f88d0361d2c3fbbbccb59d824b817 + ), + y: uint256( + 0x2006e2d6f3a2c4dcbb2f52bd9935c0ed71036b77653b5602f6c50ba2089ac792 + ) + }), + lagrangeFirst: Honk.G1Point({ + x: uint256( + 0x2a56ce41f6b0be13b9c26747621b821eee81b23a887f299049b14c11e98460d6 + ), + y: uint256( + 0x1aa98f2de3ddda547d8f6de4e725ded5827d6338c78656c0d12ca1aea6ef2c7c + ) + }), + lagrangeLast: Honk.G1Point({ + x: uint256( + 0x172c2093bcb89f71d4537312c4fdf76f6d0e84318c165241c6f1446799e7fe40 + ), + y: uint256( + 0x021f186ee8b298569473f428da5049b770925a9a55a183f46408836ad98c6472 + ) + }) + }); + return vk; + } +} + +pragma solidity ^0.8.27; + +interface IVerifier { + function verify( + bytes calldata _proof, + bytes32[] calldata _publicInputs + ) external view returns (bool); +} + +/** + * @notice Library of error codes + * @dev You can run `forge inspect Errors errors` to get the selectors for the optimised verifier + */ +library Errors { + error ValueGeLimbMax(); + error ValueGeGroupOrder(); + error ValueGeFieldOrder(); + + error InvertOfZero(); + error NotPowerOfTwo(); + error ModExpFailed(); + + error ProofLengthWrong(); + error ProofLengthWrongWithLogN( + uint256 logN, + uint256 actualLength, + uint256 expectedLength + ); + error PublicInputsLengthWrong(); + error SumcheckFailed(); + error ShpleminiFailed(); + + error PointAtInfinity(); + + error ConsistencyCheckFailed(); + error VerificationKeyConfigurationMismatch(); + error GeminiChallengeInSubgroup(); +} + +type Fr is uint256; + +using { add as + } for Fr global; +using { sub as - } for Fr global; +using { mul as * } for Fr global; + +using { notEqual as != } for Fr global; +using { equal as == } for Fr global; + +uint256 constant SUBGROUP_SIZE = 256; +uint256 constant MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Prime field order +uint256 constant P = MODULUS; +Fr constant SUBGROUP_GENERATOR = Fr.wrap( + 0x07b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76 +); +Fr constant SUBGROUP_GENERATOR_INVERSE = Fr.wrap( + 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 +); +Fr constant MINUS_ONE = Fr.wrap(MODULUS - 1); +Fr constant ONE = Fr.wrap(1); +Fr constant ZERO = Fr.wrap(0); + +// SmallSubgroupIPA opening-claim layout — mirrors SMALL_IPA_CLAIMS in +// barretenberg/cpp/src/barretenberg/commitment_schemes/small_subgroup_ipa/small_subgroup_ipa_utils.hpp. +uint256 constant NUM_SMALL_IPA_OPENING_CLAIMS = 5; +uint256 constant SMALL_IPA_BOUNDARY_OPENING_IDX = 3; +uint256 constant NUM_SMALL_IPA_TRANSCRIPT_EVALS = 4; +// Instantiation + +library FrLib { + bytes4 internal constant FRLIB_MODEXP_FAILED_SELECTOR = 0x1f7ec5f0; + + function invert(Fr value) internal view returns (Fr) { + uint256 v = Fr.unwrap(value); + require(v != 0, Errors.InvertOfZero()); + + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), v) + mstore(add(free, 0x80), sub(MODULUS, 2)) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function pow(Fr base, uint256 v) internal view returns (Fr) { + uint256 b = Fr.unwrap(base); + // Only works for power of 2 + require(v > 0 && (v & (v - 1)) == 0, Errors.NotPowerOfTwo()); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), b) + mstore(add(free, 0x80), v) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function div(Fr numerator, Fr denominator) internal view returns (Fr) { + unchecked { + return numerator * invert(denominator); + } + } + + function sqr(Fr value) internal pure returns (Fr) { + unchecked { + return value * value; + } + } + + function unwrap(Fr value) internal pure returns (uint256) { + unchecked { + return Fr.unwrap(value); + } + } + + function neg(Fr value) internal pure returns (Fr) { + unchecked { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } + } + + function from(uint256 value) internal pure returns (Fr) { + unchecked { + require(value < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(value); + } + } + + function fromBytes32(bytes32 value) internal pure returns (Fr) { + unchecked { + uint256 v = uint256(value); + require(v < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(v); + } + } + + function toBytes32(Fr value) internal pure returns (bytes32) { + unchecked { + return bytes32(Fr.unwrap(value)); + } + } +} + +// Free functions +function add(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function mul(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(mulmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function sub(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), MODULUS - Fr.unwrap(b), MODULUS)); + } +} + +function notEqual(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) != Fr.unwrap(b); + } +} + +function equal(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) == Fr.unwrap(b); + } +} + +uint256 constant CONST_PROOF_SIZE_LOG_N = 25; + +uint256 constant NUMBER_OF_SUBRELATIONS = 29; +uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; +uint256 constant ZK_BATCHED_RELATION_PARTIAL_LENGTH = 9; +uint256 constant NUMBER_OF_ENTITIES = 41; +// The number of entities added for ZK (gemini_masking_poly) +uint256 constant NUM_MASKING_POLYNOMIALS = 1; +uint256 constant NUMBER_OF_ENTITIES_ZK = NUMBER_OF_ENTITIES + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_UNSHIFTED = 36; +uint256 constant NUMBER_UNSHIFTED_ZK = NUMBER_UNSHIFTED + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; +uint256 constant PAIRING_POINTS_SIZE = 8; + +uint256 constant FIELD_ELEMENT_SIZE = 0x20; +uint256 constant GROUP_ELEMENT_SIZE = 0x40; + +// Powers of alpha used to batch subrelations (alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)) +uint256 constant NUMBER_OF_ALPHAS = NUMBER_OF_SUBRELATIONS - 1; + +// Must match UltraFlavor_Generated::EntityId order. +enum WIRE { + SIGMA_1, + SIGMA_2, + SIGMA_3, + SIGMA_4, + ID_1, + ID_2, + ID_3, + ID_4, + LAGRANGE_FIRST, + LAGRANGE_LAST, + Q_LOOKUP, + TABLE_1, + TABLE_2, + TABLE_3, + TABLE_4, + Q_M, + Q_R, + Q_O, + Q_C, + Q_L, + Q_4, + Q_ARITH, + Q_RANGE, + Q_ELLIPTIC, + Q_MEMORY, + Q_NNF, + Q_POSEIDON2_EXTERNAL, + Q_POSEIDON2_INTERNAL, + W_L, + W_R, + W_O, + W_4, + Z_PERM, + LOOKUP_INVERSES, + LOOKUP_READ_COUNTS, + LOOKUP_READ_TAGS, + W_L_SHIFT, + W_R_SHIFT, + W_O_SHIFT, + W_4_SHIFT, + Z_PERM_SHIFT +} + +library Honk { + struct G1Point { + uint256 x; + uint256 y; + } + + struct VerificationKey { + // Misc Params + uint256 circuitSize; + uint256 logCircuitSize; + uint256 publicInputsSize; + // Selectors + G1Point qm; + G1Point qc; + G1Point ql; + G1Point qr; + G1Point qo; + G1Point q4; + G1Point qLookup; // Lookup + G1Point qArith; // Arithmetic widget + G1Point qDeltaRange; // Delta Range sort + G1Point qMemory; // Memory + G1Point qNnf; // Non-native Field + G1Point qElliptic; // Auxillary + G1Point qPoseidon2External; + G1Point qPoseidon2Internal; + // Copy constraints + G1Point s1; + G1Point s2; + G1Point s3; + G1Point s4; + // Copy identity + G1Point id1; + G1Point id2; + G1Point id3; + G1Point id4; + // Precomputed lookup table + G1Point t1; + G1Point t2; + G1Point t3; + G1Point t4; + // Fixed first and last + G1Point lagrangeFirst; + G1Point lagrangeLast; + } + + struct RelationParameters { + // challenges + Fr eta; + Fr beta; + Fr gamma; + // derived + Fr publicInputsDelta; + } + + struct Proof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // Free wires + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Lookup helpers - Permutations + G1Point zPerm; + // Lookup helpers - logup + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Sumcheck + Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + G1Point shplonkQ; + G1Point kzgQuotient; + } + + /// forge-lint: disable-next-item(pascal-case-struct) + struct ZKProof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // ZK: Gemini masking polynomial commitment (sent first, right after public inputs) + G1Point geminiMaskingPoly; + // Commitments to wire polynomials + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Commitments to logup witness polynomials + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Commitment to grand permutation polynomial + G1Point zPerm; + G1Point[3] libraCommitments; + // Sumcheck + Fr libraSum; + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr libraEvaluation; + Fr[NUMBER_OF_ENTITIES_ZK] sumcheckEvaluations; // Includes gemini_masking_poly eval at index 0 (first position) + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Fr[4] libraPolyEvals; + G1Point shplonkQ; + G1Point kzgQuotient; + } +} + +// ZKTranscript library to generate fiat shamir challenges, the ZK transcript only differest +/// forge-lint: disable-next-item(pascal-case-struct) +struct ZKTranscript { + // Oink + Honk.RelationParameters relationParameters; + Fr[NUMBER_OF_ALPHAS] alphas; // Powers of alpha: [alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)] + Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; + // Sumcheck + Fr libraChallenge; + Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; + // Shplemini + Fr rho; + Fr geminiR; + Fr shplonkNu; + Fr shplonkZ; + // Derived + Fr publicInputsDelta; +} + +library ZKTranscriptLib { + function generateTranscript( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + uint256 logN + ) external pure returns (ZKTranscript memory t) { + Fr previousChallenge; + ( + t.relationParameters, + previousChallenge + ) = generateRelationParametersChallenges( + proof, + publicInputs, + vkHash, + publicInputsSize, + previousChallenge + ); + + (t.alphas, previousChallenge) = generateAlphaChallenges( + previousChallenge, + proof + ); + + (t.gateChallenges, previousChallenge) = generateGateChallenges( + previousChallenge, + logN + ); + (t.libraChallenge, previousChallenge) = generateLibraChallenge( + previousChallenge, + proof + ); + (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges( + proof, + previousChallenge, + logN + ); + + (t.rho, previousChallenge) = generateRhoChallenge( + proof, + previousChallenge + ); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge( + proof, + previousChallenge + ); + return t; + } + + function splitChallenge( + Fr challenge + ) internal pure returns (Fr first, Fr second) { + uint256 challengeU256 = uint256(Fr.unwrap(challenge)); + // Split into two equal 127-bit chunks (254/2) + uint256 lo = challengeU256 & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // 127 bits + uint256 hi = challengeU256 >> 127; + first = FrLib.from(lo); + second = FrLib.from(hi); + } + + function generateRelationParametersChallenges( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + Fr previousChallenge + ) + internal + pure + returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) + { + (rp.eta, previousChallenge) = generateEtaChallenge( + proof, + publicInputs, + vkHash, + publicInputsSize + ); + + ( + rp.beta, + rp.gamma, + nextPreviousChallenge + ) = generateBetaGammaChallenges(previousChallenge, proof); + } + + function generateEtaChallenge( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize + ) internal pure returns (Fr eta, Fr previousChallenge) { + // Size: 1 (vkHash) + publicInputsSize + 8 (geminiMask(2) + 3 wires(6)) + bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 8); + round0[0] = bytes32(vkHash); + + for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) { + require(uint256(publicInputs[i]) < P, Errors.ValueGeFieldOrder()); + round0[1 + i] = publicInputs[i]; + } + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib + .toBytes32(proof.pairingPointObject[i]); + } + + // For ZK flavors: hash the gemini masking poly commitment (sent right after public inputs) + round0[1 + publicInputsSize] = bytes32(proof.geminiMaskingPoly.x); + round0[1 + publicInputsSize + 1] = bytes32(proof.geminiMaskingPoly.y); + + // Create the first challenge + // Note: w4 is added to the challenge later on + round0[1 + publicInputsSize + 2] = bytes32(proof.w1.x); + round0[1 + publicInputsSize + 3] = bytes32(proof.w1.y); + round0[1 + publicInputsSize + 4] = bytes32(proof.w2.x); + round0[1 + publicInputsSize + 5] = bytes32(proof.w2.y); + round0[1 + publicInputsSize + 6] = bytes32(proof.w3.x); + round0[1 + publicInputsSize + 7] = bytes32(proof.w3.y); + + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round0))) % P + ); + (eta, ) = splitChallenge(previousChallenge); + } + + function generateBetaGammaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) { + bytes32[7] memory round1; + round1[0] = FrLib.toBytes32(previousChallenge); + round1[1] = bytes32(proof.lookupReadCounts.x); + round1[2] = bytes32(proof.lookupReadCounts.y); + round1[3] = bytes32(proof.lookupReadTags.x); + round1[4] = bytes32(proof.lookupReadTags.y); + round1[5] = bytes32(proof.w4.x); + round1[6] = bytes32(proof.w4.y); + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round1))) % P + ); + (beta, gamma) = splitChallenge(nextPreviousChallenge); + } + + // Alpha challenges non-linearise the gate contributions + function generateAlphaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) + internal + pure + returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) + { + // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup + uint256[5] memory alpha0; + alpha0[0] = Fr.unwrap(previousChallenge); + alpha0[1] = proof.lookupInverses.x; + alpha0[2] = proof.lookupInverses.y; + alpha0[3] = proof.zPerm.x; + alpha0[4] = proof.zPerm.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(alpha0))) % P + ); + Fr alpha; + (alpha, ) = splitChallenge(nextPreviousChallenge); + + // Compute powers of alpha for batching subrelations + alphas[0] = alpha; + for (uint256 i = 1; i < NUMBER_OF_ALPHAS; i++) { + alphas[i] = alphas[i - 1] * alpha; + } + } + + function generateGateChallenges( + Fr previousChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, + Fr nextPreviousChallenge + ) + { + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))) % + P + ); + (gateChallenges[0], ) = splitChallenge(previousChallenge); + for (uint256 i = 1; i < logN; i++) { + gateChallenges[i] = gateChallenges[i - 1] * gateChallenges[i - 1]; + } + nextPreviousChallenge = previousChallenge; + } + + function generateLibraChallenge( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr libraChallenge, Fr nextPreviousChallenge) { + // 2 comm, 1 sum, 1 challenge + uint256[4] memory challengeData; + challengeData[0] = Fr.unwrap(previousChallenge); + challengeData[1] = proof.libraCommitments[0].x; + challengeData[2] = proof.libraCommitments[0].y; + challengeData[3] = Fr.unwrap(proof.libraSum); + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(challengeData))) % P + ); + (libraChallenge, ) = splitChallenge(nextPreviousChallenge); + } + + function generateSumcheckChallenges( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, + Fr nextPreviousChallenge + ) + { + for (uint256 i = 0; i < logN; i++) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH + 1] memory univariateChal; + univariateChal[0] = prevChallenge; + + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + univariateChal[j + 1] = proof.sumcheckUnivariates[i][j]; + } + prevChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(univariateChal))) % P + ); + + (sumcheckChallenges[i], ) = splitChallenge(prevChallenge); + } + nextPreviousChallenge = prevChallenge; + } + + // We add Libra claimed eval + 2 libra commitments (grand_sum, quotient) + function generateRhoChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr rho, Fr nextPreviousChallenge) { + uint256[NUMBER_OF_ENTITIES_ZK + 6] memory rhoChallengeElements; + rhoChallengeElements[0] = Fr.unwrap(prevChallenge); + uint256 i; + for (i = 1; i <= NUMBER_OF_ENTITIES_ZK; i++) { + rhoChallengeElements[i] = Fr.unwrap( + proof.sumcheckEvaluations[i - 1] + ); + } + rhoChallengeElements[i] = Fr.unwrap(proof.libraEvaluation); + i += 1; + rhoChallengeElements[i] = proof.libraCommitments[1].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[1].y; + i += 2; + rhoChallengeElements[i] = proof.libraCommitments[2].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[2].y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(rhoChallengeElements))) % P + ); + (rho, ) = splitChallenge(nextPreviousChallenge); + } + + function generateGeminiRChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr geminiR, Fr nextPreviousChallenge) { + uint256[] memory gR = new uint256[]((logN - 1) * 2 + 1); + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < logN - 1; i++) { + gR[1 + i * 2] = proof.geminiFoldComms[i].x; + gR[2 + i * 2] = proof.geminiFoldComms[i].y; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(gR))) % P + ); + + (geminiR, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr shplonkNu, Fr nextPreviousChallenge) { + uint256[] memory shplonkNuChallengeElements = new uint256[]( + logN + 1 + 4 + ); + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 1; i <= logN; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.geminiAEvaluations[i - 1] + ); + } + + uint256 libraIdx = 0; + for (uint256 i = logN + 1; i <= logN + 4; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.libraPolyEvals[libraIdx] + ); + libraIdx++; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkNuChallengeElements))) % P + ); + (shplonkNu, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr shplonkZ, Fr nextPreviousChallenge) { + uint256[3] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x; + shplonkZChallengeElements[2] = proof.shplonkQ.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkZChallengeElements))) % P + ); + (shplonkZ, ) = splitChallenge(nextPreviousChallenge); + } + + function loadProof( + bytes calldata proof, + uint256 logN + ) internal pure returns (Honk.ZKProof memory p) { + uint256 boundary = 0x0; + + // Pairing point object + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + uint256 limb = uint256( + bytes32(proof[boundary:boundary + FIELD_ELEMENT_SIZE]) + ); + // lo limbs (even index) < 2^136, hi limbs (odd index) < 2^120 + require( + limb < 2 ** (i % 2 == 0 ? 136 : 120), + Errors.ValueGeLimbMax() + ); + p.pairingPointObject[i] = FrLib.from(limb); + boundary += FIELD_ELEMENT_SIZE; + } + + // Gemini masking polynomial commitment (sent first in ZK flavors, right after pairing points) + p.geminiMaskingPoly = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Commitments + p.w1 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w2 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w3 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + + // Lookup / Permutation Helper Commitments + p.lookupReadCounts = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.lookupReadTags = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.w4 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.lookupInverses = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.zPerm = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[0] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + p.libraSum = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + // Sumcheck univariates + for (uint256 i = 0; i < logN; i++) { + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + p.sumcheckUnivariates[i][j] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + } + + // Sumcheck evaluations (includes gemini_masking_poly eval at index 0 for ZK flavors) + for (uint256 i = 0; i < NUMBER_OF_ENTITIES_ZK; i++) { + p.sumcheckEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + p.libraEvaluation = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + + p.libraCommitments[1] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[2] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < logN - 1; i++) { + p.geminiFoldComms[i] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + } + + // Read gemini a evaluations + for (uint256 i = 0; i < logN; i++) { + p.geminiAEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + for (uint256 i = 0; i < 4; i++) { + p.libraPolyEvals[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + // Shplonk + p.shplonkQ = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + // KZG + p.kzgQuotient = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + } +} + +library RelationsLib { + struct EllipticParams { + // Points + Fr x_1; + Fr y_1; + Fr x_2; + Fr y_2; + Fr y_3; + Fr x_3; + // push accumulators into memory + Fr x_double_identity; + } + + // Parameters used within the Memory Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct MemParams { + Fr memory_record_check; + Fr partial_record_check; + Fr next_gate_access_type; + Fr record_delta; + Fr index_delta; + Fr adjacent_values_match_if_adjacent_indices_match; + Fr adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + Fr access_check; + Fr next_gate_access_type_is_boolean; + Fr ROM_consistency_check_identity; + Fr RAM_consistency_check_identity; + Fr timestamp_delta; + Fr RAM_timestamp_check_identity; + Fr memory_identity; + Fr index_is_monotonically_increasing; + } + + // Parameters used within the Non-Native Field Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct NnfParams { + Fr limb_subproduct; + Fr non_native_field_gate_1; + Fr non_native_field_gate_2; + Fr non_native_field_gate_3; + Fr limb_accumulator_1; + Fr limb_accumulator_2; + Fr nnf_identity; + } + + struct PoseidonExternalParams { + Fr s1; + Fr s2; + Fr s3; + Fr s4; + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr t0; + Fr t1; + Fr t2; + Fr t3; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr q_pos_by_scaling; + } + + struct PoseidonInternalParams { + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr u_sum; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr s1; + Fr q_pos_by_scaling; + } + + Fr internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = Fr.wrap(17); // -(-17) + uint256 internal constant NEG_HALF_MODULO_P = + 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + + // Constants for the Non-native Field relation + Fr internal constant LIMB_SIZE = Fr.wrap(uint256(1) << 68); + Fr internal constant SUBLIMB_SHIFT = Fr.wrap(uint256(1) << 14); + + function accumulateRelationEvaluations( + Fr[NUMBER_OF_ENTITIES] memory purportedEvaluations, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges, + Fr powPartialEval + ) external pure returns (Fr accumulator) { + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations; + + // Accumulate all relations in Ultra Honk - each with varying number of subrelations + accumulateArithmeticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePermutationRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateLogDerivativeLookupRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateDeltaRangeRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateEllipticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateMemoryRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateNnfRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonExternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonInternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + + // batch the subrelations with the precomputed alpha powers to obtain the full honk relation + accumulator = scaleAndBatchSubrelations( + evaluations, + subrelationChallenges + ); + } + + /** + * Aesthetic helper function that is used to index by enum into proof.sumcheckEvaluations, it avoids + * the relation checking code being cluttered with uint256 type casting, which is often a different colour in code + * editors, and thus is noisy. + */ + function wire( + Fr[NUMBER_OF_ENTITIES] memory p, + WIRE _wire + ) internal pure returns (Fr) { + return p[uint256(_wire)]; + } + + /** + * Ultra Arithmetic Relation + * + */ + function accumulateArithmeticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + // Relation 0 + Fr q_arith = wire(p, WIRE.Q_ARITH); + { + Fr neg_half = Fr.wrap(NEG_HALF_MODULO_P); + + Fr accum = (q_arith - Fr.wrap(3)) * + (wire(p, WIRE.Q_M) * wire(p, WIRE.W_R) * wire(p, WIRE.W_L)) * + neg_half; + accum = + accum + + (wire(p, WIRE.Q_L) * wire(p, WIRE.W_L)) + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_R)) + + (wire(p, WIRE.Q_O) * wire(p, WIRE.W_O)) + + (wire(p, WIRE.Q_4) * wire(p, WIRE.W_4)) + + wire(p, WIRE.Q_C); + accum = accum + (q_arith - ONE) * wire(p, WIRE.W_4_SHIFT); + accum = accum * q_arith; + accum = accum * domainSep; + evals[6] = accum; + } + + // Relation 1 + { + Fr accum = wire(p, WIRE.W_L) + + wire(p, WIRE.W_4) - + wire(p, WIRE.W_L_SHIFT) + + wire(p, WIRE.Q_M); + accum = accum * (q_arith - Fr.wrap(2)); + accum = accum * (q_arith - ONE); + accum = accum * q_arith; + accum = accum * domainSep; + evals[7] = accum; + } + } + + function accumulatePermutationRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr grand_product_numerator; + Fr grand_product_denominator; + + { + Fr num = wire(p, WIRE.W_L) + + wire(p, WIRE.ID_1) * + rp.beta + + rp.gamma; + num = + num * + (wire(p, WIRE.W_R) + wire(p, WIRE.ID_2) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_O) + wire(p, WIRE.ID_3) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_4) + wire(p, WIRE.ID_4) * rp.beta + rp.gamma); + + grand_product_numerator = num; + } + { + Fr den = wire(p, WIRE.W_L) + + wire(p, WIRE.SIGMA_1) * + rp.beta + + rp.gamma; + den = + den * + (wire(p, WIRE.W_R) + + wire(p, WIRE.SIGMA_2) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_O) + + wire(p, WIRE.SIGMA_3) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_4) + + wire(p, WIRE.SIGMA_4) * + rp.beta + + rp.gamma); + + grand_product_denominator = den; + } + + // Contribution 2 + { + Fr acc = (wire(p, WIRE.Z_PERM) + wire(p, WIRE.LAGRANGE_FIRST)) * + grand_product_numerator; + + acc = + acc - + ((wire(p, WIRE.Z_PERM_SHIFT) + + (wire(p, WIRE.LAGRANGE_LAST) * rp.publicInputsDelta)) * + grand_product_denominator); + acc = acc * domainSep; + evals[0] = acc; + } + + // Contribution 3 + { + Fr acc = (wire(p, WIRE.LAGRANGE_LAST) * + wire(p, WIRE.Z_PERM_SHIFT)) * domainSep; + evals[1] = acc; + } + + // Contribution 4: z_perm initialization check (lagrange_first * z_perm = 0) + { + Fr acc = (wire(p, WIRE.LAGRANGE_FIRST) * wire(p, WIRE.Z_PERM)) * + domainSep; + evals[2] = acc; + } + } + + function accumulateLogDerivativeLookupRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr table_term; + Fr lookup_term; + + // Calculate the write term (the table accumulation) + // table_term = table_1 + γ + table_2 * β + table_3 * β² + table_4 * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + table_term = + wire(p, WIRE.TABLE_1) + + rp.gamma + + (wire(p, WIRE.TABLE_2) * rp.beta) + + (wire(p, WIRE.TABLE_3) * beta_sqr) + + (wire(p, WIRE.TABLE_4) * beta_sqr * rp.beta); + } + + // Calculate the read term + // lookup_term = derived_entry_1 + γ + derived_entry_2 * β + derived_entry_3 * β² + q_index * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + Fr derived_entry_1 = wire(p, WIRE.W_L) + + rp.gamma + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_L_SHIFT)); + Fr derived_entry_2 = wire(p, WIRE.W_R) + + wire(p, WIRE.Q_M) * + wire(p, WIRE.W_R_SHIFT); + Fr derived_entry_3 = wire(p, WIRE.W_O) + + wire(p, WIRE.Q_C) * + wire(p, WIRE.W_O_SHIFT); + + lookup_term = + derived_entry_1 + + (derived_entry_2 * rp.beta) + + (derived_entry_3 * beta_sqr) + + (wire(p, WIRE.Q_O) * beta_sqr * rp.beta); + } + + Fr lookup_inverse = wire(p, WIRE.LOOKUP_INVERSES) * table_term; + Fr table_inverse = wire(p, WIRE.LOOKUP_INVERSES) * lookup_term; + + Fr inverse_exists_xor = wire(p, WIRE.LOOKUP_READ_TAGS) + + wire(p, WIRE.Q_LOOKUP) - + (wire(p, WIRE.LOOKUP_READ_TAGS) * wire(p, WIRE.Q_LOOKUP)); + + // Inverse calculated correctly relation + Fr accumulatorNone = lookup_term * + table_term * + wire(p, WIRE.LOOKUP_INVERSES) - + inverse_exists_xor; + accumulatorNone = accumulatorNone * domainSep; + + // Inverse + Fr accumulatorOne = wire(p, WIRE.Q_LOOKUP) * + lookup_inverse - + wire(p, WIRE.LOOKUP_READ_COUNTS) * + table_inverse; + + Fr read_tag = wire(p, WIRE.LOOKUP_READ_TAGS); + + Fr read_tag_boolean_relation = read_tag * read_tag - read_tag; + + evals[3] = accumulatorNone; + evals[4] = accumulatorOne; + evals[5] = read_tag_boolean_relation * domainSep; + } + + function accumulateDeltaRangeRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr minus_one = ZERO - ONE; + Fr minus_two = ZERO - Fr.wrap(2); + Fr minus_three = ZERO - Fr.wrap(3); + + // Compute wire differences + Fr delta_1 = wire(p, WIRE.W_R) - wire(p, WIRE.W_L); + Fr delta_2 = wire(p, WIRE.W_O) - wire(p, WIRE.W_R); + Fr delta_3 = wire(p, WIRE.W_4) - wire(p, WIRE.W_O); + Fr delta_4 = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_4); + + // Contribution 6 + { + Fr acc = delta_1; + acc = acc * (delta_1 + minus_one); + acc = acc * (delta_1 + minus_two); + acc = acc * (delta_1 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[8] = acc; + } + + // Contribution 7 + { + Fr acc = delta_2; + acc = acc * (delta_2 + minus_one); + acc = acc * (delta_2 + minus_two); + acc = acc * (delta_2 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[9] = acc; + } + + // Contribution 8 + { + Fr acc = delta_3; + acc = acc * (delta_3 + minus_one); + acc = acc * (delta_3 + minus_two); + acc = acc * (delta_3 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[10] = acc; + } + + // Contribution 9 + { + Fr acc = delta_4; + acc = acc * (delta_4 + minus_one); + acc = acc * (delta_4 + minus_two); + acc = acc * (delta_4 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[11] = acc; + } + } + + function accumulateEllipticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + EllipticParams memory ep; + ep.x_1 = wire(p, WIRE.W_R); + ep.y_1 = wire(p, WIRE.W_O); + + ep.x_2 = wire(p, WIRE.W_L_SHIFT); + ep.y_2 = wire(p, WIRE.W_4_SHIFT); + ep.y_3 = wire(p, WIRE.W_O_SHIFT); + ep.x_3 = wire(p, WIRE.W_R_SHIFT); + + Fr q_sign = wire(p, WIRE.Q_L); + Fr q_is_double = wire(p, WIRE.Q_M); + + // Contribution 10 point addition, x-coordinate check + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + Fr x_diff = (ep.x_2 - ep.x_1); + Fr y1_sqr = (ep.y_1 * ep.y_1); + { + // Move to top + Fr partialEval = domainSep; + + Fr y2_sqr = (ep.y_2 * ep.y_2); + Fr y1y2 = ep.y_1 * ep.y_2 * q_sign; + Fr x_add_identity = (ep.x_3 + ep.x_2 + ep.x_1); + x_add_identity = x_add_identity * x_diff * x_diff; + x_add_identity = x_add_identity - y2_sqr - y1_sqr + y1y2 + y1y2; + + evals[12] = + x_add_identity * + partialEval * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 11 point addition, x-coordinate check + // q_elliptic * (q_sign * y1 + y3)(x2 - x1) + (x3 - x1)(y2 - q_sign * y1) = 0 + { + Fr y1_plus_y3 = ep.y_1 + ep.y_3; + Fr y_diff = ep.y_2 * q_sign - ep.y_1; + Fr y_add_identity = y1_plus_y3 * + x_diff + + (ep.x_3 - ep.x_1) * + y_diff; + evals[13] = + y_add_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 10 point doubling, x-coordinate check + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + // N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 + { + Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; + Fr y1_sqr_mul_4 = y1_sqr + y1_sqr; + y1_sqr_mul_4 = y1_sqr_mul_4 + y1_sqr_mul_4; + Fr x1_pow_4_mul_9 = x_pow_4 * Fr.wrap(9); + + // NOTE: pushed into memory (stack >:'( ) + ep.x_double_identity = + (ep.x_3 + ep.x_1 + ep.x_1) * + y1_sqr_mul_4 - + x1_pow_4_mul_9; + + Fr acc = ep.x_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + evals[12] = evals[12] + acc; + } + + // Contribution 11 point doubling, y-coordinate check + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + { + Fr x1_sqr_mul_3 = (ep.x_1 + ep.x_1 + ep.x_1) * ep.x_1; + Fr y_double_identity = x1_sqr_mul_3 * + (ep.x_1 - ep.x_3) - + (ep.y_1 + ep.y_1) * + (ep.y_1 + ep.y_3); + evals[13] = + evals[13] + + y_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + } + } + + function accumulateMemoryRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + MemParams memory ap; + + // Compute eta powers locally + Fr eta_two = rp.eta * rp.eta; + Fr eta_three = eta_two * rp.eta; + + /** + * MEMORY + * + * A RAM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * t: `timestamp` of memory cell being accessed (used for RAM, set to 0 for ROM) + * * v: `value` of memory cell being accessed + * * a: `access` type of record. read: 0 = read, 1 = write + * * r: `record` of memory cell. record = access + index * eta + timestamp * eta_two + value * eta_three + * + * A ROM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * v: `value1` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * v2:`value2` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * r: `record` of memory cell. record = index * eta + value2 * eta_two + value1 * eta_three + * + * When performing a read/write access, the values of i, t, v, v2, a, r are stored in the following wires + + * selectors, depending on whether the gate is a RAM read/write or a ROM read + * + * | gate type | i | v2/t | v | a | r | + * | --------- | -- | ----- | -- | -- | -- | + * | ROM | w1 | w2 | w3 | -- | w4 | + * | RAM | w1 | w2 | w3 | qc | w4 | + * + * (for accesses where `index` is a circuit constant, it is assumed the circuit will apply a copy constraint on + * `w2` to fix its value) + * + * + */ + + /** + * Memory Record Check + * Partial degree: 1 + * Total degree: 4 + * + * A ROM/ROM access gate can be evaluated with the identity: + * + * qc + w1 \eta + w2 \eta_two + w3 \eta_three - w4 = 0 + * + * For ROM gates, qc = 0 + */ + ap.memory_record_check = wire(p, WIRE.W_O) * eta_three; + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_R) * eta_two); + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_L) * rp.eta); + ap.memory_record_check = ap.memory_record_check + wire(p, WIRE.Q_C); + ap.partial_record_check = ap.memory_record_check; // used in RAM consistency check; deg 1 or 4 + ap.memory_record_check = ap.memory_record_check - wire(p, WIRE.W_4); + + /** + * Contribution 13 & 14 + * ROM Consistency Check + * Partial degree: 1 + * Total degree: 4 + * + * For every ROM read, a set equivalence check is applied between the record witnesses, and a second set of + * records that are sorted. + * + * We apply the following checks for the sorted records: + * + * 1. w1, w2, w3 correctly map to 'index', 'v1, 'v2' for a given record value at w4 + * 2. index values for adjacent records are monotonically increasing + * 3. if, at gate i, index_i == index_{i + 1}, then value1_i == value1_{i + 1} and value2_i == value2_{i + 1} + * + */ + ap.index_delta = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_L); + ap.record_delta = wire(p, WIRE.W_4_SHIFT) - wire(p, WIRE.W_4); + + ap.index_is_monotonically_increasing = + ap.index_delta * + (ap.index_delta - Fr.wrap(1)); // deg 2 + + ap.adjacent_values_match_if_adjacent_indices_match = + (ap.index_delta * MINUS_ONE + ONE) * + ap.record_delta; // deg 2 + + evals[15] = + ap.adjacent_values_match_if_adjacent_indices_match * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + evals[16] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + + ap.ROM_consistency_check_identity = + ap.memory_record_check * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)); // deg 3 or 7 + + /** + * Contributions 15,16,17 + * RAM Consistency Check + * + * The 'access' type of the record is extracted with the expression `w_4 - ap.partial_record_check` + * (i.e. for an honest Prover `w1 * eta + w2 * eta^2 + w3 * eta^3 - w4 = access`. + * This is validated by requiring `access` to be boolean + * + * For two adjacent entries in the sorted list if _both_ + * A) index values match + * B) adjacent access value is 0 (i.e. next gate is a READ) + * then + * C) both values must match. + * The gate boolean check is + * (A && B) => C === !(A && B) || C === !A || !B || C + * + * N.B. it is the responsibility of the circuit writer to ensure that every RAM cell is initialized + * with a WRITE operation. + */ + Fr access_type = (wire(p, WIRE.W_4) - ap.partial_record_check); // will be 0 or 1 for honest Prover; deg 1 or 4 + ap.access_check = access_type * (access_type - Fr.wrap(1)); // check value is 0 or 1; deg 2 or 8 + + // reverse order we could re-use `ap.partial_record_check` 1 - ((w3' * eta + w2') * eta + w1') * eta + // deg 1 or 4 + ap.next_gate_access_type = wire(p, WIRE.W_O_SHIFT) * eta_three; + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_R_SHIFT) * eta_two); + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_L_SHIFT) * rp.eta); + ap.next_gate_access_type = + wire(p, WIRE.W_4_SHIFT) - + ap.next_gate_access_type; + + Fr value_delta = wire(p, WIRE.W_O_SHIFT) - wire(p, WIRE.W_O); + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = + (ap.index_delta * MINUS_ONE + ONE) * + value_delta * + (ap.next_gate_access_type * MINUS_ONE + ONE); // deg 3 or 6 + + // We can't apply the RAM consistency check identity on the final entry in the sorted list (the wires in the + // next gate would make the identity fail). We need to validate that its 'access type' bool is correct. Can't + // do with an arithmetic gate because of the `eta` factors. We need to check that the *next* gate's access + // type is correct, to cover this edge case + // deg 2 or 4 + ap.next_gate_access_type_is_boolean = + ap.next_gate_access_type * + ap.next_gate_access_type - + ap.next_gate_access_type; + + // Putting it all together... + evals[17] = + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 or 8 + evals[18] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 + evals[19] = + ap.next_gate_access_type_is_boolean * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 6 + + ap.RAM_consistency_check_identity = + ap.access_check * + (wire(p, WIRE.Q_O)); // deg 3 or 9 + + /** + * RAM Timestamp Consistency Check + * + * | w1 | w2 | w3 | w4 | + * | index | timestamp | timestamp_check | -- | + * + * Let delta_index = index_{i + 1} - index_{i} + * + * Iff delta_index == 0, timestamp_check = timestamp_{i + 1} - timestamp_i + * Else timestamp_check = 0 + */ + ap.timestamp_delta = wire(p, WIRE.W_R_SHIFT) - wire(p, WIRE.W_R); + ap.RAM_timestamp_check_identity = + (ap.index_delta * MINUS_ONE + ONE) * + ap.timestamp_delta - + wire(p, WIRE.W_O); // deg 3 + + /** + * Complete Contribution 12 + * The complete RAM/ROM memory identity + * Partial degree: + */ + ap.memory_identity = ap.ROM_consistency_check_identity; // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_timestamp_check_identity * + (wire(p, WIRE.Q_4) * wire(p, WIRE.Q_L)); // deg 4 + ap.memory_identity = + ap.memory_identity + + ap.memory_record_check * + (wire(p, WIRE.Q_M) * wire(p, WIRE.Q_L)); // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_consistency_check_identity; // deg 3 or 9 + + // (deg 3 or 9) + (deg 4) + (deg 3) + ap.memory_identity = + ap.memory_identity * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 10 + evals[14] = ap.memory_identity; + } + + function accumulateNnfRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + NnfParams memory ap; + + /** + * Contribution 12 + * Non native field arithmetic gate 2 + * deg 4 + * + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * + */ + ap.limb_subproduct = + wire(p, WIRE.W_L) * + wire(p, WIRE.W_R_SHIFT) + + wire(p, WIRE.W_L_SHIFT) * + wire(p, WIRE.W_R); + ap.non_native_field_gate_2 = (wire(p, WIRE.W_L) * + wire(p, WIRE.W_4) + + wire(p, WIRE.W_R) * + wire(p, WIRE.W_O) - + wire(p, WIRE.W_O_SHIFT)); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * LIMB_SIZE; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 - + wire(p, WIRE.W_4_SHIFT); + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 + + ap.limb_subproduct; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 * + wire(p, WIRE.Q_4); + + ap.limb_subproduct = ap.limb_subproduct * LIMB_SIZE; + ap.limb_subproduct = + ap.limb_subproduct + + (wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R_SHIFT)); + ap.non_native_field_gate_1 = ap.limb_subproduct; + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 - + (wire(p, WIRE.W_O) + wire(p, WIRE.W_4)); + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 * + wire(p, WIRE.Q_O); + + ap.non_native_field_gate_3 = ap.limb_subproduct; + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 + + wire(p, WIRE.W_4); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 - + (wire(p, WIRE.W_O_SHIFT) + wire(p, WIRE.W_4_SHIFT)); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 * + wire(p, WIRE.Q_M); + + Fr non_native_field_identity = ap.non_native_field_gate_1 + + ap.non_native_field_gate_2 + + ap.non_native_field_gate_3; + non_native_field_identity = + non_native_field_identity * + wire(p, WIRE.Q_R); + + // ((((w2' * 2^14 + w1') * 2^14 + w3) * 2^14 + w2) * 2^14 + w1 - w4) * qm + // deg 2 + ap.limb_accumulator_1 = wire(p, WIRE.W_R_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_O); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_R); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L); + ap.limb_accumulator_1 = ap.limb_accumulator_1 - wire(p, WIRE.W_4); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * wire(p, WIRE.Q_4); + + // ((((w3' * 2^14 + w2') * 2^14 + w1') * 2^14 + w4) * 2^14 + w3 - w4') * qm + // deg 2 + ap.limb_accumulator_2 = wire(p, WIRE.W_O_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_R_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_4); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_O); + ap.limb_accumulator_2 = ap.limb_accumulator_2 - wire(p, WIRE.W_4_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * wire(p, WIRE.Q_M); + + Fr limb_accumulator_identity = ap.limb_accumulator_1 + + ap.limb_accumulator_2; + limb_accumulator_identity = + limb_accumulator_identity * + wire(p, WIRE.Q_O); // deg 3 + + ap.nnf_identity = non_native_field_identity + limb_accumulator_identity; + ap.nnf_identity = ap.nnf_identity * (wire(p, WIRE.Q_NNF) * domainSep); + evals[20] = ap.nnf_identity; + } + + function accumulatePoseidonExternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonExternalParams memory ep; + + ep.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + ep.s2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_R); + ep.s3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_O); + ep.s4 = wire(p, WIRE.W_4) + wire(p, WIRE.Q_4); + + ep.u1 = ep.s1 * ep.s1 * ep.s1 * ep.s1 * ep.s1; + ep.u2 = ep.s2 * ep.s2 * ep.s2 * ep.s2 * ep.s2; + ep.u3 = ep.s3 * ep.s3 * ep.s3 * ep.s3 * ep.s3; + ep.u4 = ep.s4 * ep.s4 * ep.s4 * ep.s4 * ep.s4; + // matrix mul v = M_E * u with 14 additions + ep.t0 = ep.u1 + ep.u2; // u_1 + u_2 + ep.t1 = ep.u3 + ep.u4; // u_3 + u_4 + ep.t2 = ep.u2 + ep.u2 + ep.t1; // 2u_2 + // ep.t2 += ep.t1; // 2u_2 + u_3 + u_4 + ep.t3 = ep.u4 + ep.u4 + ep.t0; // 2u_4 + // ep.t3 += ep.t0; // u_1 + u_2 + 2u_4 + ep.v4 = ep.t1 + ep.t1; + ep.v4 = ep.v4 + ep.v4 + ep.t3; + // ep.v4 += ep.t3; // u_1 + u_2 + 4u_3 + 6u_4 + ep.v2 = ep.t0 + ep.t0; + ep.v2 = ep.v2 + ep.v2 + ep.t2; + // ep.v2 += ep.t2; // 4u_1 + 6u_2 + u_3 + u_4 + ep.v1 = ep.t3 + ep.v2; // 5u_1 + 7u_2 + u_3 + 3u_4 + ep.v3 = ep.t2 + ep.v4; // u_1 + 3u_2 + 5u_3 + 7u_4 + + ep.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_EXTERNAL) * domainSep; + evals[21] = + evals[21] + + ep.q_pos_by_scaling * + (ep.v1 - wire(p, WIRE.W_L_SHIFT)); + + evals[22] = + evals[22] + + ep.q_pos_by_scaling * + (ep.v2 - wire(p, WIRE.W_R_SHIFT)); + + evals[23] = + evals[23] + + ep.q_pos_by_scaling * + (ep.v3 - wire(p, WIRE.W_O_SHIFT)); + + evals[24] = + evals[24] + + ep.q_pos_by_scaling * + (ep.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + function accumulatePoseidonInternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonInternalParams memory ip; + + Fr[4] memory INTERNAL_MATRIX_DIAGONAL = [ + FrLib.from( + 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7 + ), + FrLib.from( + 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b + ), + FrLib.from( + 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15 + ), + FrLib.from( + 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b + ) + ]; + + // add round constants + ip.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + + // apply s-box round + ip.u1 = ip.s1 * ip.s1 * ip.s1 * ip.s1 * ip.s1; + ip.u2 = wire(p, WIRE.W_R); + ip.u3 = wire(p, WIRE.W_O); + ip.u4 = wire(p, WIRE.W_4); + + // matrix mul with v = M_I * u 4 muls and 7 additions + ip.u_sum = ip.u1 + ip.u2 + ip.u3 + ip.u4; + + ip.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_INTERNAL) * domainSep; + + ip.v1 = ip.u1 * INTERNAL_MATRIX_DIAGONAL[0] + ip.u_sum; + evals[25] = + evals[25] + + ip.q_pos_by_scaling * + (ip.v1 - wire(p, WIRE.W_L_SHIFT)); + + ip.v2 = ip.u2 * INTERNAL_MATRIX_DIAGONAL[1] + ip.u_sum; + evals[26] = + evals[26] + + ip.q_pos_by_scaling * + (ip.v2 - wire(p, WIRE.W_R_SHIFT)); + + ip.v3 = ip.u3 * INTERNAL_MATRIX_DIAGONAL[2] + ip.u_sum; + evals[27] = + evals[27] + + ip.q_pos_by_scaling * + (ip.v3 - wire(p, WIRE.W_O_SHIFT)); + + ip.v4 = ip.u4 * INTERNAL_MATRIX_DIAGONAL[3] + ip.u_sum; + evals[28] = + evals[28] + + ip.q_pos_by_scaling * + (ip.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + // Batch subrelation evaluations using precomputed powers of alpha + // First subrelation is implicitly scaled by 1, subsequent ones use powers from the subrelationChallenges array + function scaleAndBatchSubrelations( + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges + ) internal pure returns (Fr accumulator) { + accumulator = evaluations[0]; + + for (uint256 i = 1; i < NUMBER_OF_SUBRELATIONS; ++i) { + accumulator = + accumulator + + evaluations[i] * + subrelationChallenges[i - 1]; + } + } +} + +library CommitmentSchemeLib { + using FrLib for Fr; + + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + Fr unshiftedScalarNeg; + Fr shiftedScalarNeg; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Accumulator for powers of rho + Fr batchingChallenge; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchedEvaluation; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] denominators; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] batchingScalars; + // 1/(z - r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr posInvertedDenominator; + // 1/(z + r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr negInvertedDenominator; + // ν^{2i} * 1/(z - r^{2^i}) + Fr scalingFactorPos; + // ν^{2i+1} * 1/(z + r^{2^i}) + Fr scalingFactorNeg; + // Fold_i(r^{2^i}) reconstructed by Verifier + Fr[] foldPosEvaluations; + } + + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., m-1 + function computeFoldPosEvaluations( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckUChallenges, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[] memory geminiEvalChallengePowers, + uint256 logSize + ) internal view returns (Fr[] memory) { + Fr[] memory foldPosEvaluations = new Fr[](logSize); + for (uint256 i = logSize; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = sumcheckUChallenges[i - 1]; + + Fr batchedEvalRoundAcc = ((challengePower * + batchedEvalAccumulator * + Fr.wrap(2)) - + geminiEvaluations[i - 1] * + (challengePower * (ONE - u) - u)); + // Divide by the denominator + batchedEvalRoundAcc = + batchedEvalRoundAcc * + (challengePower * (ONE - u) + u).invert(); + + batchedEvalAccumulator = batchedEvalRoundAcc; + foldPosEvaluations[i - 1] = batchedEvalRoundAcc; + } + return foldPosEvaluations; + } + + function computeSquares( + Fr r, + uint256 logN + ) internal pure returns (Fr[] memory) { + Fr[] memory squares = new Fr[](logN); + squares[0] = r; + for (uint256 i = 1; i < logN; ++i) { + squares[i] = squares[i - 1].sqr(); + } + return squares; + } +} + +uint256 constant Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // EC group order. F_q + +// Fr utility + +function bytesToFr(bytes calldata proofSection) pure returns (Fr scalar) { + scalar = FrLib.fromBytes32(bytes32(proofSection)); +} + +// EC Point utilities +function bytesToG1Point( + bytes calldata proofSection +) pure returns (Honk.G1Point memory point) { + uint256 x = uint256(bytes32(proofSection[0x00:0x20])); + uint256 y = uint256(bytes32(proofSection[0x20:0x40])); + require(x < Q && y < Q, Errors.ValueGeGroupOrder()); + + // (0,0) is the canonical EIP-196 encoding of the identity. It is accepted here + // because polynomial commitments to identically-zero polynomials (e.g. unused + // selector or table polys) are legitimately the identity. On-curve validation + // (y² = x³ + 3) is handled by the ecAdd/ecMul precompiles per EIP-196. + point = Honk.G1Point({ x: x, y: y }); +} + +function negateInplace( + Honk.G1Point memory point +) pure returns (Honk.G1Point memory) { + // When y == 0 (order-2 point), negation is the same point. Q - 0 = Q which is >= Q. + if (point.y != 0) { + point.y = Q - point.y; + } + return point; +} + +/** + * Convert the pairing points to G1 points. + * + * The pairing points are serialised as an array of 2 limbs representing two points + * (P0 and P1, used for lhs and rhs of pairing operation). + * + * There are 2 limbs (lo, hi) for each coordinate, so 4 limbs per point, 8 total. + * Layout: [P0.x_lo, P0.x_hi, P0.y_lo, P0.y_hi, P1.x_lo, P1.x_hi, P1.y_lo, P1.y_hi] + * + * @param pairingPoints The pairing points to convert. + * @return lhs P0 point + * @return rhs P1 point + */ +function convertPairingPointsToG1( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (Honk.G1Point memory lhs, Honk.G1Point memory rhs) { + // P0 (lhs): x = lo | (hi << 136) + uint256 lhsX = Fr.unwrap(pairingPoints[0]); + lhsX |= Fr.unwrap(pairingPoints[1]) << 136; + + uint256 lhsY = Fr.unwrap(pairingPoints[2]); + lhsY |= Fr.unwrap(pairingPoints[3]) << 136; + + // P1 (rhs): x = lo | (hi << 136) + uint256 rhsX = Fr.unwrap(pairingPoints[4]); + rhsX |= Fr.unwrap(pairingPoints[5]) << 136; + + uint256 rhsY = Fr.unwrap(pairingPoints[6]); + rhsY |= Fr.unwrap(pairingPoints[7]) << 136; + + // Reconstructed coordinates must be < Q to prevent malleability. + // Without this, two different limb encodings could map to the same curve point + // (via mulmod reduction in on-curve checks) but produce different transcript hashes. + require( + lhsX < Q && lhsY < Q && rhsX < Q && rhsY < Q, + Errors.ValueGeGroupOrder() + ); + + lhs.x = lhsX; + lhs.y = lhsY; + rhs.x = rhsX; + rhs.y = rhsY; +} + +/** + * Hash the pairing inputs from the present verification context with those extracted from the public inputs. + * + * @param proofPairingPoints Pairing points from the proof - (public inputs). + * @param accLhs Accumulator point for the left side - result of shplemini. + * @param accRhs Accumulator point for the right side - result of shplemini. + * @return recursionSeparator The recursion separator - generated from hashing the above. + */ +function generateRecursionSeparator( + Fr[PAIRING_POINTS_SIZE] memory proofPairingPoints, + Honk.G1Point memory accLhs, + Honk.G1Point memory accRhs +) pure returns (Fr recursionSeparator) { + // hash the proof aggregated X + // hash the proof aggregated Y + // hash the accum X + // hash the accum Y + + ( + Honk.G1Point memory proofLhs, + Honk.G1Point memory proofRhs + ) = convertPairingPointsToG1(proofPairingPoints); + + uint256[8] memory recursionSeparatorElements; + + // Proof points + recursionSeparatorElements[0] = proofLhs.x; + recursionSeparatorElements[1] = proofLhs.y; + recursionSeparatorElements[2] = proofRhs.x; + recursionSeparatorElements[3] = proofRhs.y; + + // Accumulator points + recursionSeparatorElements[4] = accLhs.x; + recursionSeparatorElements[5] = accLhs.y; + recursionSeparatorElements[6] = accRhs.x; + recursionSeparatorElements[7] = accRhs.y; + + recursionSeparator = FrLib.from( + uint256(keccak256(abi.encodePacked(recursionSeparatorElements))) % P + ); +} + +/** + * G1 Mul with Separator + * Using the ecAdd and ecMul precompiles + * + * @param basePoint The point to multiply. + * @param other The other point to add. + * @param recursionSeperator The separator to use for the multiplication. + * @return `(recursionSeperator * basePoint) + other`. + */ +function mulWithSeperator( + Honk.G1Point memory basePoint, + Honk.G1Point memory other, + Fr recursionSeperator +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + result = ecMul(recursionSeperator, basePoint); + result = ecAdd(result, other); + + return result; +} + +/** + * G1 Mul + * Takes a Fr value and a G1 point and uses the ecMul precompile to return the result. + * + * @param value The value to multiply the point by. + * @param point The point to multiply. + * @return result The result of the multiplication. + */ +function ecMul( + Fr value, + Honk.G1Point memory point +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write the point into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | point.x + // free + 0x20| point.y + mstore(free, mload(point)) + mstore(add(free, 0x20), mload(add(point, 0x20))) + // Write the scalar into memory (one 32 byte word) + // Memory layout: + // Address | value + // free + 0x40| value + mstore(add(free, 0x40), value) + + // Call the ecMul precompile, it takes in the following + // [point.x, point.y, scalar], and returns the result back into the free memory location. + let success := staticcall(gas(), 0x07, free, 0x60, free, 0x40) + if iszero(success) { + revert(0, 0) + } + // Copy the result of the multiplication back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x60)) + } + + return result; +} + +/** + * G1 Add + * Takes two G1 points and uses the ecAdd precompile to return the result. + * + * @param lhs The left hand side of the addition. + * @param rhs The right hand side of the addition. + * @return result The result of the addition. + */ +function ecAdd( + Honk.G1Point memory lhs, + Honk.G1Point memory rhs +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write lhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | lhs.x + // free + 0x20| lhs.y + mstore(free, mload(lhs)) + mstore(add(free, 0x20), mload(add(lhs, 0x20))) + + // Write rhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free + 0x40| rhs.x + // free + 0x60| rhs.y + mstore(add(free, 0x40), mload(rhs)) + mstore(add(free, 0x60), mload(add(rhs, 0x20))) + + // Call the ecAdd precompile, it takes in the following + // [lhs.x, lhs.y, rhs.x, rhs.y], and returns their addition back into the free memory location. + let success := staticcall(gas(), 0x06, free, 0x80, free, 0x40) + if iszero(success) { + revert(0, 0) + } + + // Copy the result of the addition back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x80)) + } + + return result; +} + +function rejectPointAtInfinity(Honk.G1Point memory point) pure { + require((point.x | point.y) != 0, Errors.PointAtInfinity()); +} + +/** + * Check if pairing point limbs are all zero (default/infinity). + * Default pairing points indicate no recursive verification occurred. + */ +function arePairingPointsDefault( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (bool) { + uint256 acc = 0; + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + acc |= Fr.unwrap(pairingPoints[i]); + } + return acc == 0; +} + +function pairing( + Honk.G1Point memory rhs, + Honk.G1Point memory lhs +) view returns (bool decodedResult) { + bytes memory input = abi.encodePacked( + rhs.x, + rhs.y, + // Fixed G2 point + uint256( + 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2 + ), + uint256( + 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed + ), + uint256( + 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b + ), + uint256( + 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa + ), + lhs.x, + lhs.y, + // G2 point from VK + uint256( + 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1 + ), + uint256( + 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0 + ), + uint256( + 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4 + ), + uint256( + 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55 + ) + ); + + (bool success, bytes memory result) = address(0x08).staticcall(input); + decodedResult = success && abi.decode(result, (bool)); +} + +abstract contract BaseZKHonkVerifier is IVerifier { + using FrLib for Fr; + + struct PairingInputs { + Honk.G1Point P_0; + Honk.G1Point P_1; + } + + struct SmallSubgroupIpaIntermediates { + Fr[SUBGROUP_SIZE] challengePolyLagrange; + Fr challengePolyEval; + Fr lagrangeFirst; + Fr lagrangeLast; + Fr rootPower; + Fr[SUBGROUP_SIZE] denominators; // this has to disappear + Fr diff; + } + + // Constants for proof length calculation (matching UltraKeccakZKFlavor) + uint256 internal constant NUM_WITNESS_ENTITIES = + 8 + NUM_MASKING_POLYNOMIALS; + uint256 internal constant NUM_ELEMENTS_COMM = 2; // uint256 elements for curve points + uint256 internal constant NUM_ELEMENTS_FR = 1; // uint256 elements for field elements + uint256 internal constant NUM_LIBRA_EVALUATIONS = 4; // libra evaluations + + uint256 internal constant LIBRA_COMMITMENTS = 3; + uint256 internal constant LIBRA_EVALUATIONS = 4; + uint256 internal constant LIBRA_UNIVARIATES_LENGTH = 9; + + uint256 internal constant SHIFTED_COMMITMENTS_START = 30; + uint256 internal constant PERMUTATION_ARGUMENT_VALUE_SEPARATOR = 1 << 28; + + uint256 internal immutable $N; + uint256 internal immutable $LOG_N; + uint256 internal immutable $VK_HASH; + uint256 internal immutable $NUM_PUBLIC_INPUTS; + uint256 internal immutable $MSMSize; + + constructor( + uint256 _N, + uint256 _logN, + uint256 _vkHash, + uint256 _numPublicInputs + ) { + $N = _N; + $LOG_N = _logN; + $VK_HASH = _vkHash; + $NUM_PUBLIC_INPUTS = _numPublicInputs; + $MSMSize = NUMBER_UNSHIFTED_ZK + _logN + LIBRA_COMMITMENTS + 2; + } + + function validateVerificationKey( + Honk.VerificationKey memory vk + ) internal view { + require( + $N == vk.circuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $LOG_N == vk.logCircuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $NUM_PUBLIC_INPUTS == vk.publicInputsSize, + Errors.VerificationKeyConfigurationMismatch() + ); + } + + function verify( + bytes calldata proof, + bytes32[] calldata publicInputs + ) public view override returns (bool verified) { + // Calculate expected proof size based on $LOG_N + uint256 expectedProofSize = calculateProofSize($LOG_N); + + // Check the received proof is the expected size where each field element is 32 bytes + require( + proof.length == expectedProofSize, + Errors.ProofLengthWrongWithLogN( + $LOG_N, + proof.length, + expectedProofSize + ) + ); + + Honk.VerificationKey memory vk = loadVerificationKey(); + Honk.ZKProof memory p = ZKTranscriptLib.loadProof(proof, $LOG_N); + + require( + publicInputs.length == vk.publicInputsSize - PAIRING_POINTS_SIZE, + Errors.PublicInputsLengthWrong() + ); + + // Generate the fiat shamir challenges for the whole protocol + ZKTranscript memory t = ZKTranscriptLib.generateTranscript( + p, + publicInputs, + $VK_HASH, + $NUM_PUBLIC_INPUTS, + $LOG_N + ); + + // Derive public input delta + t.relationParameters.publicInputsDelta = computePublicInputDelta( + publicInputs, + p.pairingPointObject, + t.relationParameters.beta, + t.relationParameters.gamma, + 5 // pubInputsOffset = NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS = 4 + 1 + ); + + // Sumcheck + require(verifySumcheck(p, t), Errors.SumcheckFailed()); + require(verifyShplemini(p, vk, t), Errors.ShpleminiFailed()); + + verified = true; + } + + function computePublicInputDelta( + bytes32[] memory publicInputs, + Fr[PAIRING_POINTS_SIZE] memory pairingPointObject, + Fr beta, + Fr gamma, + uint256 offset + ) internal view returns (Fr publicInputDelta) { + Fr numerator = Fr.wrap(1); + Fr denominator = Fr.wrap(1); + + Fr numeratorAcc = gamma + + (beta * FrLib.from(PERMUTATION_ARGUMENT_VALUE_SEPARATOR + offset)); + Fr denominatorAcc = gamma - (beta * FrLib.from(offset + 1)); + + { + for ( + uint256 i = 0; + i < $NUM_PUBLIC_INPUTS - PAIRING_POINTS_SIZE; + i++ + ) { + Fr pubInput = FrLib.fromBytes32(publicInputs[i]); + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + Fr pubInput = pairingPointObject[i]; + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + } + + // Fr delta = numerator / denominator; // TOOO: batch invert later? + publicInputDelta = FrLib.div(numerator, denominator); + } + + function verifySumcheck( + Honk.ZKProof memory proof, + ZKTranscript memory tp + ) internal view returns (bool verified) { + Fr roundTargetSum = tp.libraChallenge * proof.libraSum; // default 0 + Fr powPartialEvaluation = Fr.wrap(1); + + // We perform sumcheck reductions over log n rounds ( the multivariate degree ) + for (uint256 round; round < $LOG_N; ++round) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory roundUnivariate = proof.sumcheckUnivariates[round]; + Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; + require(totalSum == roundTargetSum, Errors.SumcheckFailed()); + + Fr roundChallenge = tp.sumCheckUChallenges[round]; + + // Update the round target for the next rounf + roundTargetSum = computeNextTargetSum( + roundUnivariate, + roundChallenge + ); + powPartialEvaluation = + powPartialEvaluation * + (Fr.wrap(1) + + roundChallenge * + (tp.gateChallenges[round] - Fr.wrap(1))); + } + + // Last round + // For ZK flavors: sumcheckEvaluations has 42 elements + // Index 0 is gemini_masking_poly, indices 1-41 are the regular entities used in relations + Fr[NUMBER_OF_ENTITIES] memory relationsEvaluations; + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + relationsEvaluations[i] = proof.sumcheckEvaluations[ + i + NUM_MASKING_POLYNOMIALS + ]; // Skip gemini_masking_poly at index 0 + } + Fr grandHonkRelationSum = RelationsLib.accumulateRelationEvaluations( + relationsEvaluations, + tp.relationParameters, + tp.alphas, + powPartialEvaluation + ); + + // Row-disabling polynomial: 1 - ∏_{i≥2}(1 - u_i) + Fr evaluation = Fr.wrap(1); + for (uint256 i = 2; i < $LOG_N; i++) { + evaluation = evaluation * (Fr.wrap(1) - tp.sumCheckUChallenges[i]); + } + + grandHonkRelationSum = + grandHonkRelationSum * + (Fr.wrap(1) - evaluation) + + proof.libraEvaluation * + tp.libraChallenge; + verified = (grandHonkRelationSum == roundTargetSum); + } + + // Return the new target sum for the next sumcheck round + function computeNextTargetSum( + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariates, + Fr roundChallenge + ) internal view returns (Fr targetSum) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory BARYCENTRIC_LAGRANGE_DENOMINATORS = [ + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000000240 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ) + ]; + + // To compute the next target sum, we evaluate the given univariate at a point u (challenge). + + // Performing Barycentric evaluations + // Compute B(x) + Fr numeratorValue = Fr.wrap(1); + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + numeratorValue = numeratorValue * (roundChallenge - Fr.wrap(i)); + } + + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + denominatorInverses[i] = FrLib.invert( + BARYCENTRIC_LAGRANGE_DENOMINATORS[i] * + (roundChallenge - Fr.wrap(i)) + ); + } + + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + targetSum = + targetSum + + roundUnivariates[i] * + denominatorInverses[i]; + } + + // Scale the sum by the value of B(x) + targetSum = targetSum * numeratorValue; + } + + function verifyShplemini( + Honk.ZKProof memory proof, + Honk.VerificationKey memory vk, + ZKTranscript memory tp + ) internal view returns (bool verified) { + CommitmentSchemeLib.ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[] memory powers_of_evaluation_challenge = CommitmentSchemeLib + .computeSquares(tp.geminiR, $LOG_N); + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[] memory scalars = new Fr[]($MSMSize); + Honk.G1Point[] memory commitments = new Honk.G1Point[]($MSMSize); + + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[0]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[0]).invert(); + + mem.unshiftedScalar = + mem.posInvertedDenominator + + (tp.shplonkNu * mem.negInvertedDenominator); + mem.shiftedScalar = + tp.geminiR.invert() * + (mem.posInvertedDenominator - + (tp.shplonkNu * mem.negInvertedDenominator)); + + scalars[0] = Fr.wrap(1); + commitments[0] = proof.shplonkQ; + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + // For ZK flavors: evaluations array is [gemini_masking_poly, qm, qc, ql, qr, ...] + // Start batching challenge at 1, not rho, to match non-ZK pattern + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + mem.unshiftedScalarNeg = mem.unshiftedScalar.neg(); + mem.shiftedScalarNeg = mem.shiftedScalar.neg(); + + // Process all NUMBER_UNSHIFTED_ZK evaluations (includes gemini_masking_poly at index 0) + for (uint256 i = 1; i <= NUMBER_UNSHIFTED_ZK; ++i) { + scalars[i] = mem.unshiftedScalarNeg * mem.batchingChallenge; + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[i - NUM_MASKING_POLYNOMIALS] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + // For each of the to be shifted commitments perform the shift in place by + // adding to the unshifted value. + // We do so, as the values are to be used in batchMul later, and as + // `a * c + b * c = (a + b) * c` this will allow us to reduce memory and compute. + // Applied to w1, w2, w3, w4 and zPerm + for (uint256 i = 0; i < NUMBER_TO_BE_SHIFTED; ++i) { + uint256 scalarOff = i + SHIFTED_COMMITMENTS_START; + uint256 evaluationOff = i + NUMBER_UNSHIFTED_ZK; + + scalars[scalarOff] = + scalars[scalarOff] + + (mem.shiftedScalarNeg * mem.batchingChallenge); + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[evaluationOff] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + + commitments[1] = proof.geminiMaskingPoly; + + commitments[2] = vk.s1; + commitments[3] = vk.s2; + commitments[4] = vk.s3; + commitments[5] = vk.s4; + commitments[6] = vk.id1; + commitments[7] = vk.id2; + commitments[8] = vk.id3; + commitments[9] = vk.id4; + commitments[10] = vk.lagrangeFirst; + commitments[11] = vk.lagrangeLast; + commitments[12] = vk.qLookup; + commitments[13] = vk.t1; + commitments[14] = vk.t2; + commitments[15] = vk.t3; + commitments[16] = vk.t4; + commitments[17] = vk.qm; + commitments[18] = vk.qr; + commitments[19] = vk.qo; + commitments[20] = vk.qc; + commitments[21] = vk.ql; + commitments[22] = vk.q4; + commitments[23] = vk.qArith; + commitments[24] = vk.qDeltaRange; + commitments[25] = vk.qElliptic; + commitments[26] = vk.qMemory; + commitments[27] = vk.qNnf; + commitments[28] = vk.qPoseidon2External; + commitments[29] = vk.qPoseidon2Internal; + + // Accumulate proof points + commitments[30] = proof.w1; + commitments[31] = proof.w2; + commitments[32] = proof.w3; + commitments[33] = proof.w4; + commitments[34] = proof.zPerm; + commitments[35] = proof.lookupInverses; + commitments[36] = proof.lookupReadCounts; + commitments[37] = proof.lookupReadTags; + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., $LOG_N - 1 + Fr[] memory foldPosEvaluations = CommitmentSchemeLib + .computeFoldPosEvaluations( + tp.sumCheckUChallenges, + mem.batchedEvaluation, + proof.geminiAEvaluations, + powers_of_evaluation_challenge, + $LOG_N + ); + + mem.constantTermAccumulator = + foldPosEvaluations[0] * + mem.posInvertedDenominator; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + (proof.geminiAEvaluations[0] * + tp.shplonkNu * + mem.negInvertedDenominator); + + mem.batchingChallenge = tp.shplonkNu.sqr(); + uint256 boundary = NUMBER_UNSHIFTED_ZK + 1; + + // Compute Shplonk constant term contributions from Aₗ(± r^{2ˡ}) for l = 1, ..., m-1; + // Compute scalar multipliers for each fold commitment + for (uint256 i = 0; i < $LOG_N - 1; ++i) { + bool dummy_round = i >= ($LOG_N - 1); + + if (!dummy_round) { + // Update inverted denominators + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[i + 1]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[i + 1]).invert(); + + // Compute the scalar multipliers for Aₗ(± r^{2ˡ}) and [Aₗ] + mem.scalingFactorPos = + mem.batchingChallenge * + mem.posInvertedDenominator; + mem.scalingFactorNeg = + mem.batchingChallenge * + tp.shplonkNu * + mem.negInvertedDenominator; + scalars[boundary + i] = + mem.scalingFactorNeg.neg() + + mem.scalingFactorPos.neg(); + + // Accumulate the const term contribution given by + // v^{2l} * Aₗ(r^{2ˡ}) /(z-r^{2^l}) + v^{2l+1} * Aₗ(-r^{2ˡ}) /(z+ r^{2^l}) + Fr accumContribution = mem.scalingFactorNeg * + proof.geminiAEvaluations[i + 1]; + accumContribution = + accumContribution + + mem.scalingFactorPos * + foldPosEvaluations[i + 1]; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + accumContribution; + } + // Update the running power of v + mem.batchingChallenge = + mem.batchingChallenge * + tp.shplonkNu * + tp.shplonkNu; + + commitments[boundary + i] = proof.geminiFoldComms[i]; + } + + boundary += $LOG_N - 1; + + // Denominators 1/(z - point_i) for the five opening points {r, g*r, r, 1, r}. + mem.denominators[0] = ONE.div(tp.shplonkZ - tp.geminiR); + mem.denominators[1] = ONE.div( + tp.shplonkZ - SUBGROUP_GENERATOR * tp.geminiR + ); + mem.denominators[2] = mem.denominators[0]; + mem.denominators[SMALL_IPA_BOUNDARY_OPENING_IDX] = ONE.div( + tp.shplonkZ - ONE + ); + mem.denominators[NUM_SMALL_IPA_OPENING_CLAIMS - 1] = mem.denominators[ + 0 + ]; + + // Iterate the opening claims in three segments — the inner loops can't be merged without an extra induction + // variable, which pushes us into stack-too-deep. + for (uint256 i = 0; i < SMALL_IPA_BOUNDARY_OPENING_IDX; i++) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i]; + } + + // Boundary slot: claimed value is hardcoded 0, so no constantTermAccumulator contribution. + { + Fr scalingFactor = mem.denominators[ + SMALL_IPA_BOUNDARY_OPENING_IDX + ] * mem.batchingChallenge; + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX] = scalingFactor + .neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + } + + for ( + uint256 i = SMALL_IPA_BOUNDARY_OPENING_IDX + 1; + i < NUM_SMALL_IPA_OPENING_CLAIMS; + i++ + ) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i - 1]; + } + + // Group per-claim batching scalars by commitment: [G], [A] (three openings), [Q]. + scalars[boundary] = mem.batchingScalars[0]; + scalars[boundary + 1] = + mem.batchingScalars[1] + + mem.batchingScalars[2] + + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX]; + scalars[boundary + 2] = mem.batchingScalars[ + NUM_SMALL_IPA_OPENING_CLAIMS - 1 + ]; + + for (uint256 i = 0; i < LIBRA_COMMITMENTS; i++) { + commitments[boundary++] = proof.libraCommitments[i]; + } + + commitments[boundary] = Honk.G1Point({ x: 1, y: 2 }); + scalars[boundary++] = mem.constantTermAccumulator; + + require( + checkEvalsConsistency( + proof.libraPolyEvals, + tp.geminiR, + tp.sumCheckUChallenges, + proof.libraEvaluation + ), + Errors.ConsistencyCheckFailed() + ); + + Honk.G1Point memory quotient_commitment = proof.kzgQuotient; + + commitments[boundary] = quotient_commitment; + scalars[boundary] = tp.shplonkZ; // evaluation challenge + + PairingInputs memory pair; + pair.P_0 = batchMul(commitments, scalars); + pair.P_1 = negateInplace(quotient_commitment); + + // Aggregate pairing points (skip if default/infinity — no recursive verification occurred) + if (!arePairingPointsDefault(proof.pairingPointObject)) { + Fr recursionSeparator = generateRecursionSeparator( + proof.pairingPointObject, + pair.P_0, + pair.P_1 + ); + ( + Honk.G1Point memory P_0_other, + Honk.G1Point memory P_1_other + ) = convertPairingPointsToG1(proof.pairingPointObject); + + // Validate the points from the proof are on the curve + rejectPointAtInfinity(P_0_other); + rejectPointAtInfinity(P_1_other); + + // accumulate with aggregate points in proof + pair.P_0 = mulWithSeperator( + pair.P_0, + P_0_other, + recursionSeparator + ); + pair.P_1 = mulWithSeperator( + pair.P_1, + P_1_other, + recursionSeparator + ); + } + + return pairing(pair.P_0, pair.P_1); + } + + function checkEvalsConsistency( + Fr[LIBRA_EVALUATIONS] memory libraPolyEvals, + Fr geminiR, + Fr[CONST_PROOF_SIZE_LOG_N] memory uChallenges, + Fr libraEval + ) internal view returns (bool check) { + Fr one = Fr.wrap(1); + Fr vanishingPolyEval = geminiR.pow(SUBGROUP_SIZE) - one; + require( + vanishingPolyEval != Fr.wrap(0), + Errors.GeminiChallengeInSubgroup() + ); + + SmallSubgroupIpaIntermediates memory mem; + mem.challengePolyLagrange[0] = one; + for (uint256 round = 0; round < $LOG_N; round++) { + uint256 currIdx = 1 + LIBRA_UNIVARIATES_LENGTH * round; + mem.challengePolyLagrange[currIdx] = one; + for ( + uint256 idx = currIdx + 1; + idx < currIdx + LIBRA_UNIVARIATES_LENGTH; + idx++ + ) { + mem.challengePolyLagrange[idx] = + mem.challengePolyLagrange[idx - 1] * + uChallenges[round]; + } + } + + mem.rootPower = one; + mem.challengePolyEval = Fr.wrap(0); + for (uint256 idx = 0; idx < SUBGROUP_SIZE; idx++) { + mem.denominators[idx] = mem.rootPower * geminiR - one; + mem.denominators[idx] = mem.denominators[idx].invert(); + mem.challengePolyEval = + mem.challengePolyEval + + mem.challengePolyLagrange[idx] * + mem.denominators[idx]; + mem.rootPower = mem.rootPower * SUBGROUP_GENERATOR_INVERSE; + } + + Fr numerator = vanishingPolyEval * Fr.wrap(SUBGROUP_SIZE).invert(); + mem.challengePolyEval = mem.challengePolyEval * numerator; + mem.lagrangeFirst = mem.denominators[0] * numerator; + mem.lagrangeLast = mem.denominators[SUBGROUP_SIZE - 1] * numerator; + + mem.diff = mem.lagrangeFirst * libraPolyEvals[2]; + + mem.diff = + mem.diff + + (geminiR - SUBGROUP_GENERATOR_INVERSE) * + (libraPolyEvals[1] - + libraPolyEvals[2] - + libraPolyEvals[0] * + mem.challengePolyEval); + mem.diff = + mem.diff + + mem.lagrangeLast * + (libraPolyEvals[2] - libraEval) - + vanishingPolyEval * + libraPolyEvals[3]; + + check = mem.diff == Fr.wrap(0); + } + + // This implementation is the same as above with different constants + function batchMul( + Honk.G1Point[] memory base, + Fr[] memory scalars + ) internal view returns (Honk.G1Point memory result) { + uint256 limit = $MSMSize; + + // Identity bases are accepted: VK selector/table polys may be identically zero, + // and the ecAdd/ecMul precompiles treat (0,0) as the additive identity per EIP-196. + // Soundness against an attacker substituting (0,0) for a non-zero commitment is + // upheld by sumcheck/Shplemini, which would fail on inconsistent evaluations. + + bool success = true; + assembly { + let free := mload(0x40) + + let count := 0x01 + for {} lt(count, add(limit, 1)) { + count := add(count, 1) + } { + // Get loop offsets + let base_base := add(base, mul(count, 0x20)) + let scalar_base := add(scalars, mul(count, 0x20)) + + mstore(add(free, 0x40), mload(mload(base_base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalar_base)) + + success := and( + success, + staticcall( + gas(), + 7, + add(free, 0x40), + 0x60, + add(free, 0x40), + 0x40 + ) + ) + // accumulator = accumulator + accumulator_2 + success := and( + success, + staticcall(gas(), 6, free, 0x80, free, 0x40) + ) + } + + // Return the result + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + } + + require(success, Errors.ShpleminiFailed()); + } + + // Calculate proof size based on log_n (matching UltraKeccakZKFlavor formula) + function calculateProofSize(uint256 logN) internal pure returns (uint256) { + // Witness and Libra commitments + uint256 proofLength = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM; // witness commitments + proofLength += NUM_ELEMENTS_COMM * 3; // Libra concat, grand sum, quotient comms + Gemini masking + + // Sumcheck + proofLength += + logN * + ZK_BATCHED_RELATION_PARTIAL_LENGTH * + NUM_ELEMENTS_FR; // sumcheck univariates + proofLength += NUMBER_OF_ENTITIES_ZK * NUM_ELEMENTS_FR; // sumcheck evaluations + + // Libra and Gemini + proofLength += NUM_ELEMENTS_FR * 2; // Libra sum, claimed eval + proofLength += logN * NUM_ELEMENTS_FR; // Gemini a evaluations + proofLength += NUM_LIBRA_EVALUATIONS * NUM_ELEMENTS_FR; // libra evaluations + + // PCS commitments + proofLength += (logN - 1) * NUM_ELEMENTS_COMM; // Gemini Fold commitments + proofLength += NUM_ELEMENTS_COMM * 2; // Shplonk Q and KZG W commitments + + // Pairing points + proofLength += PAIRING_POINTS_SIZE; // pairing inputs carried on public inputs + + return proofLength * 32; + } + + function loadVerificationKey() + internal + pure + virtual + returns (Honk.VerificationKey memory); +} + +contract DkgAggregatorVerifier is + BaseZKHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) +{ + constructor() { + validateVerificationKey(HonkVerificationKey.loadVerificationKey()); + } + function loadVerificationKey() + internal + pure + override + returns (Honk.VerificationKey memory) + { + return HonkVerificationKey.loadVerificationKey(); + } +} diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/small/DecryptionAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/small/DecryptionAggregatorVerifier.sol new file mode 100644 index 0000000000..e0596f0806 --- /dev/null +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/small/DecryptionAggregatorVerifier.sol @@ -0,0 +1,3262 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +pragma solidity >=0.8.21; + +uint256 constant N = 2097152; +uint256 constant LOG_N = 21; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 146; +uint256 constant VK_HASH = 0x0a5c59b6a1cc37abc167283aae4841b723d54ddf677c6598bd441d9a55cfcfee; +library HonkVerificationKey { + function loadVerificationKey() + internal + pure + returns (Honk.VerificationKey memory) + { + Honk.VerificationKey memory vk = Honk.VerificationKey({ + circuitSize: uint256(2097152), + logCircuitSize: uint256(21), + publicInputsSize: uint256(146), + ql: Honk.G1Point({ + x: uint256( + 0x0334d4c8c700a50ab239b8edaa6f3a8f36a4aee68543d9e2950c7a272a1a55c1 + ), + y: uint256( + 0x0dcef0298d3440bcc1d04916347c2c3e475cf8728223a5315bca9424343e2e5a + ) + }), + qr: Honk.G1Point({ + x: uint256( + 0x219bc2e9a85e259223ab7be17321e83387ec421471a589b3e6d3aebb89a87349 + ), + y: uint256( + 0x034201494811a0b2ff537679153fa58f305c49cf4ed97ee010fcac80e0a6298a + ) + }), + qo: Honk.G1Point({ + x: uint256( + 0x03e84631c06d99fa57eb739c65d7b288882a7610fe41b400481ef39e5c482e46 + ), + y: uint256( + 0x20bae97272f5c47da636d7699fc456d90e9d0402b84473a8339893427cecfa57 + ) + }), + q4: Honk.G1Point({ + x: uint256( + 0x1fb16a1ea20b2ed9384214dd346225b3f5b0f57caf4d947be8af9ee225e7cc74 + ), + y: uint256( + 0x16e0bde6d07f916d7ef6e75cedece69cff6f31d4aeeeb3be851e000d31a4ff3f + ) + }), + qm: Honk.G1Point({ + x: uint256( + 0x0a28a15587492cac3700676650c7fc9d9797e19dbc9a6f550e65bbb3ca816ab4 + ), + y: uint256( + 0x1a0c6f953210e582506088f55f56f385a733dcec4cfa5d9ee4678df213cf2618 + ) + }), + qc: Honk.G1Point({ + x: uint256( + 0x0cb595d1b9cd8585d0d08a08fb36088f0e253423f482f61bfa15398e1f0be613 + ), + y: uint256( + 0x0ab66fe4e3fd598bd32233fcf662a58fe2a40f79a5eccb5c849d76144206bad9 + ) + }), + qLookup: Honk.G1Point({ + x: uint256( + 0x03b565411ca8fb89c18ad07f732441cfec1772bc211b34748631f164495ed2de + ), + y: uint256( + 0x03be36dda80bcec5f7c514012e166180a202e60490e801e0eba5990c84205da6 + ) + }), + qArith: Honk.G1Point({ + x: uint256( + 0x2a3a55d1b5498cb29297ea992612b74e9ab0e7db734740d34d64d9d81d298462 + ), + y: uint256( + 0x18ecc8df17c7f667bf14f1546ed7baf9e9c63198d18dc03ea1107ab39ca8b0ce + ) + }), + qDeltaRange: Honk.G1Point({ + x: uint256( + 0x0a69785ce999f58841c1f6b95834572c19b4750baf7f3d0ddf222813c400a15e + ), + y: uint256( + 0x241745b3407977c918d1244eefdc24a8b29c07acd6c4e81f563381a928fd3847 + ) + }), + qElliptic: Honk.G1Point({ + x: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ), + y: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) + }), + qMemory: Honk.G1Point({ + x: uint256( + 0x0fa90043f3430c905094738a28e3784846b200228917ccc9e198d6fe0d8f5aa2 + ), + y: uint256( + 0x0ad0f7c9880e67a4c95ea5a82dd67eb669f42ed5b69d10e8033a43ea4b362235 + ) + }), + qNnf: Honk.G1Point({ + x: uint256( + 0x1e9dfdd314b79d0616cdacc8412371de5ef6eb899f2c9434b77e3881cdb8e4af + ), + y: uint256( + 0x09cb0b6dadef210bb503679a95a6319b32cb66aeeb8df4f1e98602f64ffe6d80 + ) + }), + qPoseidon2External: Honk.G1Point({ + x: uint256( + 0x1344bd56ac9e15bf7d2fc6c86b3a91255ab25c9c9958494432ea00b702a97449 + ), + y: uint256( + 0x11a91ae0e570ba1bf05c1dfab840212d91f3175de0cb480c118737b94bfab090 + ) + }), + qPoseidon2Internal: Honk.G1Point({ + x: uint256( + 0x13d7e728a936228c81bc3fbb92a8393766975cfddcc39acd9cc49444e6245c79 + ), + y: uint256( + 0x0d5007f5835bf34e23ed643b81df0d706eb6fc0330a744f8ce2dc0f089479c9d + ) + }), + s1: Honk.G1Point({ + x: uint256( + 0x28e4481b0b7b53d13006a3e2e5ae7ac3a3ad1ab8b13cc6de4efdd4efa29c4232 + ), + y: uint256( + 0x2aa19420277b3742400250892ebefff2e5ad7ba6060a1fae6f18ed7079311dda + ) + }), + s2: Honk.G1Point({ + x: uint256( + 0x2ce3402d82c23ed9091a2009a6505868327fe28daead033635006d93e1eb5225 + ), + y: uint256( + 0x26b11879d534681b824f5779ab5f30c8b9a69d862a4d2ad737cabcc2d0633d32 + ) + }), + s3: Honk.G1Point({ + x: uint256( + 0x1208d46228db65d29d2eb8491e4e5c64536fdd355b4b6949c242029a7ae9ba82 + ), + y: uint256( + 0x02d4c3cedb2ee2404b68117899c08f3cd6e01b34217a882f8d3e13f9f29ff4a2 + ) + }), + s4: Honk.G1Point({ + x: uint256( + 0x2502d231b6b97003a2a10f3c295fdae7554228a68fdb484a7d5ce88be18f0782 + ), + y: uint256( + 0x245eb807c3095d92846c5e739016be4145f9f2930ce55cc9349996e6af0dd9dd + ) + }), + t1: Honk.G1Point({ + x: uint256( + 0x1d326235297276d1be9c9ab8c11122aa4d619aacd72f7f84b19cac6cd6d0dfe8 + ), + y: uint256( + 0x1bf6c8288d78105a863bfae3477e47bb63d344459f3e4fbaedf389706a6f16e1 + ) + }), + t2: Honk.G1Point({ + x: uint256( + 0x243fc8135d9e28d436264a7a5d2aa7b57a2a692d130e009056638533c53f4aba + ), + y: uint256( + 0x088c621ee437f2daac58d3ebbcf8ff2065993edafa4585354efc81a3c5602ee5 + ) + }), + t3: Honk.G1Point({ + x: uint256( + 0x1d8d3f60599d7c6687e85c6f35891076a1b18c4244597badd7607c44f1125ce2 + ), + y: uint256( + 0x1eae225e95b0155bcdb7048d467679cff828e0df2e12e9501f45d9f55a9b897f + ) + }), + t4: Honk.G1Point({ + x: uint256( + 0x19e2aa7b7fd6fe9be3e40132586aee0d0eb86c68818e0c8331b88866df16ec68 + ), + y: uint256( + 0x1c909084e30f0f60240bdba5146e5a66ef25fb41a53da2602e0303831dc060c1 + ) + }), + id1: Honk.G1Point({ + x: uint256( + 0x10557b55bd61658ae58f3cd084286749bfff2b7436239e0697079e27b1a07e76 + ), + y: uint256( + 0x1165d9c3ac734ee74856995ef364dab1e8795b9322e6ad314a0d2cd9edebc690 + ) + }), + id2: Honk.G1Point({ + x: uint256( + 0x12aabdbbf26a542346fe1aa62483ffebe37f1068fb5ee5b17b90256625eb0213 + ), + y: uint256( + 0x2cda4dd328f5040725d433af440be5849923ed8afe4d6b028480c44dc899b984 + ) + }), + id3: Honk.G1Point({ + x: uint256( + 0x03a50782e72d3c751cac664660f59e50dbdb0cc190c49dbae53e3e97b18d248c + ), + y: uint256( + 0x0c9eb37d304289edf3d9cc9c51ea81b2da00dbb39462d9aebb59c389d6766fe1 + ) + }), + id4: Honk.G1Point({ + x: uint256( + 0x2cfb02aa8f0f8f2211fea2c9b12bc8e136e05682579468ec6a9c6fa612118d68 + ), + y: uint256( + 0x1a739022c9d6341da7f2161b61fd2211450c017a8ba1938d6e18c95aba156c96 + ) + }), + lagrangeFirst: Honk.G1Point({ + x: uint256( + 0x2a56ce41f6b0be13b9c26747621b821eee81b23a887f299049b14c11e98460d6 + ), + y: uint256( + 0x1aa98f2de3ddda547d8f6de4e725ded5827d6338c78656c0d12ca1aea6ef2c7c + ) + }), + lagrangeLast: Honk.G1Point({ + x: uint256( + 0x153cdd496ac40045b30950e932319d75ff601ea33ae655c26e8d6ab351f96a88 + ), + y: uint256( + 0x2fd241180ac0a25d002e4c76825420cb7c85ae09ffb2df108bb66ba10f26d1df + ) + }) + }); + return vk; + } +} + +pragma solidity ^0.8.27; + +interface IVerifier { + function verify( + bytes calldata _proof, + bytes32[] calldata _publicInputs + ) external view returns (bool); +} + +/** + * @notice Library of error codes + * @dev You can run `forge inspect Errors errors` to get the selectors for the optimised verifier + */ +library Errors { + error ValueGeLimbMax(); + error ValueGeGroupOrder(); + error ValueGeFieldOrder(); + + error InvertOfZero(); + error NotPowerOfTwo(); + error ModExpFailed(); + + error ProofLengthWrong(); + error ProofLengthWrongWithLogN( + uint256 logN, + uint256 actualLength, + uint256 expectedLength + ); + error PublicInputsLengthWrong(); + error SumcheckFailed(); + error ShpleminiFailed(); + + error PointAtInfinity(); + + error ConsistencyCheckFailed(); + error VerificationKeyConfigurationMismatch(); + error GeminiChallengeInSubgroup(); +} + +type Fr is uint256; + +using { add as + } for Fr global; +using { sub as - } for Fr global; +using { mul as * } for Fr global; + +using { notEqual as != } for Fr global; +using { equal as == } for Fr global; + +uint256 constant SUBGROUP_SIZE = 256; +uint256 constant MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Prime field order +uint256 constant P = MODULUS; +Fr constant SUBGROUP_GENERATOR = Fr.wrap( + 0x07b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76 +); +Fr constant SUBGROUP_GENERATOR_INVERSE = Fr.wrap( + 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 +); +Fr constant MINUS_ONE = Fr.wrap(MODULUS - 1); +Fr constant ONE = Fr.wrap(1); +Fr constant ZERO = Fr.wrap(0); + +// SmallSubgroupIPA opening-claim layout — mirrors SMALL_IPA_CLAIMS in +// barretenberg/cpp/src/barretenberg/commitment_schemes/small_subgroup_ipa/small_subgroup_ipa_utils.hpp. +uint256 constant NUM_SMALL_IPA_OPENING_CLAIMS = 5; +uint256 constant SMALL_IPA_BOUNDARY_OPENING_IDX = 3; +uint256 constant NUM_SMALL_IPA_TRANSCRIPT_EVALS = 4; +// Instantiation + +library FrLib { + bytes4 internal constant FRLIB_MODEXP_FAILED_SELECTOR = 0x1f7ec5f0; + + function invert(Fr value) internal view returns (Fr) { + uint256 v = Fr.unwrap(value); + require(v != 0, Errors.InvertOfZero()); + + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), v) + mstore(add(free, 0x80), sub(MODULUS, 2)) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function pow(Fr base, uint256 v) internal view returns (Fr) { + uint256 b = Fr.unwrap(base); + // Only works for power of 2 + require(v > 0 && (v & (v - 1)) == 0, Errors.NotPowerOfTwo()); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), b) + mstore(add(free, 0x80), v) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function div(Fr numerator, Fr denominator) internal view returns (Fr) { + unchecked { + return numerator * invert(denominator); + } + } + + function sqr(Fr value) internal pure returns (Fr) { + unchecked { + return value * value; + } + } + + function unwrap(Fr value) internal pure returns (uint256) { + unchecked { + return Fr.unwrap(value); + } + } + + function neg(Fr value) internal pure returns (Fr) { + unchecked { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } + } + + function from(uint256 value) internal pure returns (Fr) { + unchecked { + require(value < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(value); + } + } + + function fromBytes32(bytes32 value) internal pure returns (Fr) { + unchecked { + uint256 v = uint256(value); + require(v < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(v); + } + } + + function toBytes32(Fr value) internal pure returns (bytes32) { + unchecked { + return bytes32(Fr.unwrap(value)); + } + } +} + +// Free functions +function add(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function mul(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(mulmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function sub(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), MODULUS - Fr.unwrap(b), MODULUS)); + } +} + +function notEqual(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) != Fr.unwrap(b); + } +} + +function equal(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) == Fr.unwrap(b); + } +} + +uint256 constant CONST_PROOF_SIZE_LOG_N = 25; + +uint256 constant NUMBER_OF_SUBRELATIONS = 29; +uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; +uint256 constant ZK_BATCHED_RELATION_PARTIAL_LENGTH = 9; +uint256 constant NUMBER_OF_ENTITIES = 41; +// The number of entities added for ZK (gemini_masking_poly) +uint256 constant NUM_MASKING_POLYNOMIALS = 1; +uint256 constant NUMBER_OF_ENTITIES_ZK = NUMBER_OF_ENTITIES + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_UNSHIFTED = 36; +uint256 constant NUMBER_UNSHIFTED_ZK = NUMBER_UNSHIFTED + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; +uint256 constant PAIRING_POINTS_SIZE = 8; + +uint256 constant FIELD_ELEMENT_SIZE = 0x20; +uint256 constant GROUP_ELEMENT_SIZE = 0x40; + +// Powers of alpha used to batch subrelations (alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)) +uint256 constant NUMBER_OF_ALPHAS = NUMBER_OF_SUBRELATIONS - 1; + +// Must match UltraFlavor_Generated::EntityId order. +enum WIRE { + SIGMA_1, + SIGMA_2, + SIGMA_3, + SIGMA_4, + ID_1, + ID_2, + ID_3, + ID_4, + LAGRANGE_FIRST, + LAGRANGE_LAST, + Q_LOOKUP, + TABLE_1, + TABLE_2, + TABLE_3, + TABLE_4, + Q_M, + Q_R, + Q_O, + Q_C, + Q_L, + Q_4, + Q_ARITH, + Q_RANGE, + Q_ELLIPTIC, + Q_MEMORY, + Q_NNF, + Q_POSEIDON2_EXTERNAL, + Q_POSEIDON2_INTERNAL, + W_L, + W_R, + W_O, + W_4, + Z_PERM, + LOOKUP_INVERSES, + LOOKUP_READ_COUNTS, + LOOKUP_READ_TAGS, + W_L_SHIFT, + W_R_SHIFT, + W_O_SHIFT, + W_4_SHIFT, + Z_PERM_SHIFT +} + +library Honk { + struct G1Point { + uint256 x; + uint256 y; + } + + struct VerificationKey { + // Misc Params + uint256 circuitSize; + uint256 logCircuitSize; + uint256 publicInputsSize; + // Selectors + G1Point qm; + G1Point qc; + G1Point ql; + G1Point qr; + G1Point qo; + G1Point q4; + G1Point qLookup; // Lookup + G1Point qArith; // Arithmetic widget + G1Point qDeltaRange; // Delta Range sort + G1Point qMemory; // Memory + G1Point qNnf; // Non-native Field + G1Point qElliptic; // Auxillary + G1Point qPoseidon2External; + G1Point qPoseidon2Internal; + // Copy constraints + G1Point s1; + G1Point s2; + G1Point s3; + G1Point s4; + // Copy identity + G1Point id1; + G1Point id2; + G1Point id3; + G1Point id4; + // Precomputed lookup table + G1Point t1; + G1Point t2; + G1Point t3; + G1Point t4; + // Fixed first and last + G1Point lagrangeFirst; + G1Point lagrangeLast; + } + + struct RelationParameters { + // challenges + Fr eta; + Fr beta; + Fr gamma; + // derived + Fr publicInputsDelta; + } + + struct Proof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // Free wires + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Lookup helpers - Permutations + G1Point zPerm; + // Lookup helpers - logup + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Sumcheck + Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + G1Point shplonkQ; + G1Point kzgQuotient; + } + + /// forge-lint: disable-next-item(pascal-case-struct) + struct ZKProof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // ZK: Gemini masking polynomial commitment (sent first, right after public inputs) + G1Point geminiMaskingPoly; + // Commitments to wire polynomials + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Commitments to logup witness polynomials + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Commitment to grand permutation polynomial + G1Point zPerm; + G1Point[3] libraCommitments; + // Sumcheck + Fr libraSum; + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr libraEvaluation; + Fr[NUMBER_OF_ENTITIES_ZK] sumcheckEvaluations; // Includes gemini_masking_poly eval at index 0 (first position) + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Fr[4] libraPolyEvals; + G1Point shplonkQ; + G1Point kzgQuotient; + } +} + +// ZKTranscript library to generate fiat shamir challenges, the ZK transcript only differest +/// forge-lint: disable-next-item(pascal-case-struct) +struct ZKTranscript { + // Oink + Honk.RelationParameters relationParameters; + Fr[NUMBER_OF_ALPHAS] alphas; // Powers of alpha: [alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)] + Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; + // Sumcheck + Fr libraChallenge; + Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; + // Shplemini + Fr rho; + Fr geminiR; + Fr shplonkNu; + Fr shplonkZ; + // Derived + Fr publicInputsDelta; +} + +library ZKTranscriptLib { + function generateTranscript( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + uint256 logN + ) external pure returns (ZKTranscript memory t) { + Fr previousChallenge; + ( + t.relationParameters, + previousChallenge + ) = generateRelationParametersChallenges( + proof, + publicInputs, + vkHash, + publicInputsSize, + previousChallenge + ); + + (t.alphas, previousChallenge) = generateAlphaChallenges( + previousChallenge, + proof + ); + + (t.gateChallenges, previousChallenge) = generateGateChallenges( + previousChallenge, + logN + ); + (t.libraChallenge, previousChallenge) = generateLibraChallenge( + previousChallenge, + proof + ); + (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges( + proof, + previousChallenge, + logN + ); + + (t.rho, previousChallenge) = generateRhoChallenge( + proof, + previousChallenge + ); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge( + proof, + previousChallenge + ); + return t; + } + + function splitChallenge( + Fr challenge + ) internal pure returns (Fr first, Fr second) { + uint256 challengeU256 = uint256(Fr.unwrap(challenge)); + // Split into two equal 127-bit chunks (254/2) + uint256 lo = challengeU256 & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // 127 bits + uint256 hi = challengeU256 >> 127; + first = FrLib.from(lo); + second = FrLib.from(hi); + } + + function generateRelationParametersChallenges( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + Fr previousChallenge + ) + internal + pure + returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) + { + (rp.eta, previousChallenge) = generateEtaChallenge( + proof, + publicInputs, + vkHash, + publicInputsSize + ); + + ( + rp.beta, + rp.gamma, + nextPreviousChallenge + ) = generateBetaGammaChallenges(previousChallenge, proof); + } + + function generateEtaChallenge( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize + ) internal pure returns (Fr eta, Fr previousChallenge) { + // Size: 1 (vkHash) + publicInputsSize + 8 (geminiMask(2) + 3 wires(6)) + bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 8); + round0[0] = bytes32(vkHash); + + for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) { + require(uint256(publicInputs[i]) < P, Errors.ValueGeFieldOrder()); + round0[1 + i] = publicInputs[i]; + } + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib + .toBytes32(proof.pairingPointObject[i]); + } + + // For ZK flavors: hash the gemini masking poly commitment (sent right after public inputs) + round0[1 + publicInputsSize] = bytes32(proof.geminiMaskingPoly.x); + round0[1 + publicInputsSize + 1] = bytes32(proof.geminiMaskingPoly.y); + + // Create the first challenge + // Note: w4 is added to the challenge later on + round0[1 + publicInputsSize + 2] = bytes32(proof.w1.x); + round0[1 + publicInputsSize + 3] = bytes32(proof.w1.y); + round0[1 + publicInputsSize + 4] = bytes32(proof.w2.x); + round0[1 + publicInputsSize + 5] = bytes32(proof.w2.y); + round0[1 + publicInputsSize + 6] = bytes32(proof.w3.x); + round0[1 + publicInputsSize + 7] = bytes32(proof.w3.y); + + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round0))) % P + ); + (eta, ) = splitChallenge(previousChallenge); + } + + function generateBetaGammaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) { + bytes32[7] memory round1; + round1[0] = FrLib.toBytes32(previousChallenge); + round1[1] = bytes32(proof.lookupReadCounts.x); + round1[2] = bytes32(proof.lookupReadCounts.y); + round1[3] = bytes32(proof.lookupReadTags.x); + round1[4] = bytes32(proof.lookupReadTags.y); + round1[5] = bytes32(proof.w4.x); + round1[6] = bytes32(proof.w4.y); + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round1))) % P + ); + (beta, gamma) = splitChallenge(nextPreviousChallenge); + } + + // Alpha challenges non-linearise the gate contributions + function generateAlphaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) + internal + pure + returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) + { + // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup + uint256[5] memory alpha0; + alpha0[0] = Fr.unwrap(previousChallenge); + alpha0[1] = proof.lookupInverses.x; + alpha0[2] = proof.lookupInverses.y; + alpha0[3] = proof.zPerm.x; + alpha0[4] = proof.zPerm.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(alpha0))) % P + ); + Fr alpha; + (alpha, ) = splitChallenge(nextPreviousChallenge); + + // Compute powers of alpha for batching subrelations + alphas[0] = alpha; + for (uint256 i = 1; i < NUMBER_OF_ALPHAS; i++) { + alphas[i] = alphas[i - 1] * alpha; + } + } + + function generateGateChallenges( + Fr previousChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, + Fr nextPreviousChallenge + ) + { + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))) % + P + ); + (gateChallenges[0], ) = splitChallenge(previousChallenge); + for (uint256 i = 1; i < logN; i++) { + gateChallenges[i] = gateChallenges[i - 1] * gateChallenges[i - 1]; + } + nextPreviousChallenge = previousChallenge; + } + + function generateLibraChallenge( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr libraChallenge, Fr nextPreviousChallenge) { + // 2 comm, 1 sum, 1 challenge + uint256[4] memory challengeData; + challengeData[0] = Fr.unwrap(previousChallenge); + challengeData[1] = proof.libraCommitments[0].x; + challengeData[2] = proof.libraCommitments[0].y; + challengeData[3] = Fr.unwrap(proof.libraSum); + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(challengeData))) % P + ); + (libraChallenge, ) = splitChallenge(nextPreviousChallenge); + } + + function generateSumcheckChallenges( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, + Fr nextPreviousChallenge + ) + { + for (uint256 i = 0; i < logN; i++) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH + 1] memory univariateChal; + univariateChal[0] = prevChallenge; + + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + univariateChal[j + 1] = proof.sumcheckUnivariates[i][j]; + } + prevChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(univariateChal))) % P + ); + + (sumcheckChallenges[i], ) = splitChallenge(prevChallenge); + } + nextPreviousChallenge = prevChallenge; + } + + // We add Libra claimed eval + 2 libra commitments (grand_sum, quotient) + function generateRhoChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr rho, Fr nextPreviousChallenge) { + uint256[NUMBER_OF_ENTITIES_ZK + 6] memory rhoChallengeElements; + rhoChallengeElements[0] = Fr.unwrap(prevChallenge); + uint256 i; + for (i = 1; i <= NUMBER_OF_ENTITIES_ZK; i++) { + rhoChallengeElements[i] = Fr.unwrap( + proof.sumcheckEvaluations[i - 1] + ); + } + rhoChallengeElements[i] = Fr.unwrap(proof.libraEvaluation); + i += 1; + rhoChallengeElements[i] = proof.libraCommitments[1].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[1].y; + i += 2; + rhoChallengeElements[i] = proof.libraCommitments[2].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[2].y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(rhoChallengeElements))) % P + ); + (rho, ) = splitChallenge(nextPreviousChallenge); + } + + function generateGeminiRChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr geminiR, Fr nextPreviousChallenge) { + uint256[] memory gR = new uint256[]((logN - 1) * 2 + 1); + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < logN - 1; i++) { + gR[1 + i * 2] = proof.geminiFoldComms[i].x; + gR[2 + i * 2] = proof.geminiFoldComms[i].y; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(gR))) % P + ); + + (geminiR, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr shplonkNu, Fr nextPreviousChallenge) { + uint256[] memory shplonkNuChallengeElements = new uint256[]( + logN + 1 + 4 + ); + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 1; i <= logN; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.geminiAEvaluations[i - 1] + ); + } + + uint256 libraIdx = 0; + for (uint256 i = logN + 1; i <= logN + 4; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.libraPolyEvals[libraIdx] + ); + libraIdx++; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkNuChallengeElements))) % P + ); + (shplonkNu, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr shplonkZ, Fr nextPreviousChallenge) { + uint256[3] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x; + shplonkZChallengeElements[2] = proof.shplonkQ.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkZChallengeElements))) % P + ); + (shplonkZ, ) = splitChallenge(nextPreviousChallenge); + } + + function loadProof( + bytes calldata proof, + uint256 logN + ) internal pure returns (Honk.ZKProof memory p) { + uint256 boundary = 0x0; + + // Pairing point object + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + uint256 limb = uint256( + bytes32(proof[boundary:boundary + FIELD_ELEMENT_SIZE]) + ); + // lo limbs (even index) < 2^136, hi limbs (odd index) < 2^120 + require( + limb < 2 ** (i % 2 == 0 ? 136 : 120), + Errors.ValueGeLimbMax() + ); + p.pairingPointObject[i] = FrLib.from(limb); + boundary += FIELD_ELEMENT_SIZE; + } + + // Gemini masking polynomial commitment (sent first in ZK flavors, right after pairing points) + p.geminiMaskingPoly = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Commitments + p.w1 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w2 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w3 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + + // Lookup / Permutation Helper Commitments + p.lookupReadCounts = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.lookupReadTags = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.w4 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.lookupInverses = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.zPerm = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[0] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + p.libraSum = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + // Sumcheck univariates + for (uint256 i = 0; i < logN; i++) { + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + p.sumcheckUnivariates[i][j] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + } + + // Sumcheck evaluations (includes gemini_masking_poly eval at index 0 for ZK flavors) + for (uint256 i = 0; i < NUMBER_OF_ENTITIES_ZK; i++) { + p.sumcheckEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + p.libraEvaluation = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + + p.libraCommitments[1] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[2] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < logN - 1; i++) { + p.geminiFoldComms[i] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + } + + // Read gemini a evaluations + for (uint256 i = 0; i < logN; i++) { + p.geminiAEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + for (uint256 i = 0; i < 4; i++) { + p.libraPolyEvals[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + // Shplonk + p.shplonkQ = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + // KZG + p.kzgQuotient = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + } +} + +library RelationsLib { + struct EllipticParams { + // Points + Fr x_1; + Fr y_1; + Fr x_2; + Fr y_2; + Fr y_3; + Fr x_3; + // push accumulators into memory + Fr x_double_identity; + } + + // Parameters used within the Memory Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct MemParams { + Fr memory_record_check; + Fr partial_record_check; + Fr next_gate_access_type; + Fr record_delta; + Fr index_delta; + Fr adjacent_values_match_if_adjacent_indices_match; + Fr adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + Fr access_check; + Fr next_gate_access_type_is_boolean; + Fr ROM_consistency_check_identity; + Fr RAM_consistency_check_identity; + Fr timestamp_delta; + Fr RAM_timestamp_check_identity; + Fr memory_identity; + Fr index_is_monotonically_increasing; + } + + // Parameters used within the Non-Native Field Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct NnfParams { + Fr limb_subproduct; + Fr non_native_field_gate_1; + Fr non_native_field_gate_2; + Fr non_native_field_gate_3; + Fr limb_accumulator_1; + Fr limb_accumulator_2; + Fr nnf_identity; + } + + struct PoseidonExternalParams { + Fr s1; + Fr s2; + Fr s3; + Fr s4; + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr t0; + Fr t1; + Fr t2; + Fr t3; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr q_pos_by_scaling; + } + + struct PoseidonInternalParams { + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr u_sum; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr s1; + Fr q_pos_by_scaling; + } + + Fr internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = Fr.wrap(17); // -(-17) + uint256 internal constant NEG_HALF_MODULO_P = + 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + + // Constants for the Non-native Field relation + Fr internal constant LIMB_SIZE = Fr.wrap(uint256(1) << 68); + Fr internal constant SUBLIMB_SHIFT = Fr.wrap(uint256(1) << 14); + + function accumulateRelationEvaluations( + Fr[NUMBER_OF_ENTITIES] memory purportedEvaluations, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges, + Fr powPartialEval + ) external pure returns (Fr accumulator) { + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations; + + // Accumulate all relations in Ultra Honk - each with varying number of subrelations + accumulateArithmeticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePermutationRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateLogDerivativeLookupRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateDeltaRangeRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateEllipticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateMemoryRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateNnfRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonExternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonInternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + + // batch the subrelations with the precomputed alpha powers to obtain the full honk relation + accumulator = scaleAndBatchSubrelations( + evaluations, + subrelationChallenges + ); + } + + /** + * Aesthetic helper function that is used to index by enum into proof.sumcheckEvaluations, it avoids + * the relation checking code being cluttered with uint256 type casting, which is often a different colour in code + * editors, and thus is noisy. + */ + function wire( + Fr[NUMBER_OF_ENTITIES] memory p, + WIRE _wire + ) internal pure returns (Fr) { + return p[uint256(_wire)]; + } + + /** + * Ultra Arithmetic Relation + * + */ + function accumulateArithmeticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + // Relation 0 + Fr q_arith = wire(p, WIRE.Q_ARITH); + { + Fr neg_half = Fr.wrap(NEG_HALF_MODULO_P); + + Fr accum = (q_arith - Fr.wrap(3)) * + (wire(p, WIRE.Q_M) * wire(p, WIRE.W_R) * wire(p, WIRE.W_L)) * + neg_half; + accum = + accum + + (wire(p, WIRE.Q_L) * wire(p, WIRE.W_L)) + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_R)) + + (wire(p, WIRE.Q_O) * wire(p, WIRE.W_O)) + + (wire(p, WIRE.Q_4) * wire(p, WIRE.W_4)) + + wire(p, WIRE.Q_C); + accum = accum + (q_arith - ONE) * wire(p, WIRE.W_4_SHIFT); + accum = accum * q_arith; + accum = accum * domainSep; + evals[6] = accum; + } + + // Relation 1 + { + Fr accum = wire(p, WIRE.W_L) + + wire(p, WIRE.W_4) - + wire(p, WIRE.W_L_SHIFT) + + wire(p, WIRE.Q_M); + accum = accum * (q_arith - Fr.wrap(2)); + accum = accum * (q_arith - ONE); + accum = accum * q_arith; + accum = accum * domainSep; + evals[7] = accum; + } + } + + function accumulatePermutationRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr grand_product_numerator; + Fr grand_product_denominator; + + { + Fr num = wire(p, WIRE.W_L) + + wire(p, WIRE.ID_1) * + rp.beta + + rp.gamma; + num = + num * + (wire(p, WIRE.W_R) + wire(p, WIRE.ID_2) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_O) + wire(p, WIRE.ID_3) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_4) + wire(p, WIRE.ID_4) * rp.beta + rp.gamma); + + grand_product_numerator = num; + } + { + Fr den = wire(p, WIRE.W_L) + + wire(p, WIRE.SIGMA_1) * + rp.beta + + rp.gamma; + den = + den * + (wire(p, WIRE.W_R) + + wire(p, WIRE.SIGMA_2) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_O) + + wire(p, WIRE.SIGMA_3) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_4) + + wire(p, WIRE.SIGMA_4) * + rp.beta + + rp.gamma); + + grand_product_denominator = den; + } + + // Contribution 2 + { + Fr acc = (wire(p, WIRE.Z_PERM) + wire(p, WIRE.LAGRANGE_FIRST)) * + grand_product_numerator; + + acc = + acc - + ((wire(p, WIRE.Z_PERM_SHIFT) + + (wire(p, WIRE.LAGRANGE_LAST) * rp.publicInputsDelta)) * + grand_product_denominator); + acc = acc * domainSep; + evals[0] = acc; + } + + // Contribution 3 + { + Fr acc = (wire(p, WIRE.LAGRANGE_LAST) * + wire(p, WIRE.Z_PERM_SHIFT)) * domainSep; + evals[1] = acc; + } + + // Contribution 4: z_perm initialization check (lagrange_first * z_perm = 0) + { + Fr acc = (wire(p, WIRE.LAGRANGE_FIRST) * wire(p, WIRE.Z_PERM)) * + domainSep; + evals[2] = acc; + } + } + + function accumulateLogDerivativeLookupRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr table_term; + Fr lookup_term; + + // Calculate the write term (the table accumulation) + // table_term = table_1 + γ + table_2 * β + table_3 * β² + table_4 * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + table_term = + wire(p, WIRE.TABLE_1) + + rp.gamma + + (wire(p, WIRE.TABLE_2) * rp.beta) + + (wire(p, WIRE.TABLE_3) * beta_sqr) + + (wire(p, WIRE.TABLE_4) * beta_sqr * rp.beta); + } + + // Calculate the read term + // lookup_term = derived_entry_1 + γ + derived_entry_2 * β + derived_entry_3 * β² + q_index * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + Fr derived_entry_1 = wire(p, WIRE.W_L) + + rp.gamma + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_L_SHIFT)); + Fr derived_entry_2 = wire(p, WIRE.W_R) + + wire(p, WIRE.Q_M) * + wire(p, WIRE.W_R_SHIFT); + Fr derived_entry_3 = wire(p, WIRE.W_O) + + wire(p, WIRE.Q_C) * + wire(p, WIRE.W_O_SHIFT); + + lookup_term = + derived_entry_1 + + (derived_entry_2 * rp.beta) + + (derived_entry_3 * beta_sqr) + + (wire(p, WIRE.Q_O) * beta_sqr * rp.beta); + } + + Fr lookup_inverse = wire(p, WIRE.LOOKUP_INVERSES) * table_term; + Fr table_inverse = wire(p, WIRE.LOOKUP_INVERSES) * lookup_term; + + Fr inverse_exists_xor = wire(p, WIRE.LOOKUP_READ_TAGS) + + wire(p, WIRE.Q_LOOKUP) - + (wire(p, WIRE.LOOKUP_READ_TAGS) * wire(p, WIRE.Q_LOOKUP)); + + // Inverse calculated correctly relation + Fr accumulatorNone = lookup_term * + table_term * + wire(p, WIRE.LOOKUP_INVERSES) - + inverse_exists_xor; + accumulatorNone = accumulatorNone * domainSep; + + // Inverse + Fr accumulatorOne = wire(p, WIRE.Q_LOOKUP) * + lookup_inverse - + wire(p, WIRE.LOOKUP_READ_COUNTS) * + table_inverse; + + Fr read_tag = wire(p, WIRE.LOOKUP_READ_TAGS); + + Fr read_tag_boolean_relation = read_tag * read_tag - read_tag; + + evals[3] = accumulatorNone; + evals[4] = accumulatorOne; + evals[5] = read_tag_boolean_relation * domainSep; + } + + function accumulateDeltaRangeRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr minus_one = ZERO - ONE; + Fr minus_two = ZERO - Fr.wrap(2); + Fr minus_three = ZERO - Fr.wrap(3); + + // Compute wire differences + Fr delta_1 = wire(p, WIRE.W_R) - wire(p, WIRE.W_L); + Fr delta_2 = wire(p, WIRE.W_O) - wire(p, WIRE.W_R); + Fr delta_3 = wire(p, WIRE.W_4) - wire(p, WIRE.W_O); + Fr delta_4 = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_4); + + // Contribution 6 + { + Fr acc = delta_1; + acc = acc * (delta_1 + minus_one); + acc = acc * (delta_1 + minus_two); + acc = acc * (delta_1 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[8] = acc; + } + + // Contribution 7 + { + Fr acc = delta_2; + acc = acc * (delta_2 + minus_one); + acc = acc * (delta_2 + minus_two); + acc = acc * (delta_2 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[9] = acc; + } + + // Contribution 8 + { + Fr acc = delta_3; + acc = acc * (delta_3 + minus_one); + acc = acc * (delta_3 + minus_two); + acc = acc * (delta_3 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[10] = acc; + } + + // Contribution 9 + { + Fr acc = delta_4; + acc = acc * (delta_4 + minus_one); + acc = acc * (delta_4 + minus_two); + acc = acc * (delta_4 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[11] = acc; + } + } + + function accumulateEllipticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + EllipticParams memory ep; + ep.x_1 = wire(p, WIRE.W_R); + ep.y_1 = wire(p, WIRE.W_O); + + ep.x_2 = wire(p, WIRE.W_L_SHIFT); + ep.y_2 = wire(p, WIRE.W_4_SHIFT); + ep.y_3 = wire(p, WIRE.W_O_SHIFT); + ep.x_3 = wire(p, WIRE.W_R_SHIFT); + + Fr q_sign = wire(p, WIRE.Q_L); + Fr q_is_double = wire(p, WIRE.Q_M); + + // Contribution 10 point addition, x-coordinate check + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + Fr x_diff = (ep.x_2 - ep.x_1); + Fr y1_sqr = (ep.y_1 * ep.y_1); + { + // Move to top + Fr partialEval = domainSep; + + Fr y2_sqr = (ep.y_2 * ep.y_2); + Fr y1y2 = ep.y_1 * ep.y_2 * q_sign; + Fr x_add_identity = (ep.x_3 + ep.x_2 + ep.x_1); + x_add_identity = x_add_identity * x_diff * x_diff; + x_add_identity = x_add_identity - y2_sqr - y1_sqr + y1y2 + y1y2; + + evals[12] = + x_add_identity * + partialEval * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 11 point addition, x-coordinate check + // q_elliptic * (q_sign * y1 + y3)(x2 - x1) + (x3 - x1)(y2 - q_sign * y1) = 0 + { + Fr y1_plus_y3 = ep.y_1 + ep.y_3; + Fr y_diff = ep.y_2 * q_sign - ep.y_1; + Fr y_add_identity = y1_plus_y3 * + x_diff + + (ep.x_3 - ep.x_1) * + y_diff; + evals[13] = + y_add_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 10 point doubling, x-coordinate check + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + // N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 + { + Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; + Fr y1_sqr_mul_4 = y1_sqr + y1_sqr; + y1_sqr_mul_4 = y1_sqr_mul_4 + y1_sqr_mul_4; + Fr x1_pow_4_mul_9 = x_pow_4 * Fr.wrap(9); + + // NOTE: pushed into memory (stack >:'( ) + ep.x_double_identity = + (ep.x_3 + ep.x_1 + ep.x_1) * + y1_sqr_mul_4 - + x1_pow_4_mul_9; + + Fr acc = ep.x_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + evals[12] = evals[12] + acc; + } + + // Contribution 11 point doubling, y-coordinate check + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + { + Fr x1_sqr_mul_3 = (ep.x_1 + ep.x_1 + ep.x_1) * ep.x_1; + Fr y_double_identity = x1_sqr_mul_3 * + (ep.x_1 - ep.x_3) - + (ep.y_1 + ep.y_1) * + (ep.y_1 + ep.y_3); + evals[13] = + evals[13] + + y_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + } + } + + function accumulateMemoryRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + MemParams memory ap; + + // Compute eta powers locally + Fr eta_two = rp.eta * rp.eta; + Fr eta_three = eta_two * rp.eta; + + /** + * MEMORY + * + * A RAM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * t: `timestamp` of memory cell being accessed (used for RAM, set to 0 for ROM) + * * v: `value` of memory cell being accessed + * * a: `access` type of record. read: 0 = read, 1 = write + * * r: `record` of memory cell. record = access + index * eta + timestamp * eta_two + value * eta_three + * + * A ROM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * v: `value1` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * v2:`value2` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * r: `record` of memory cell. record = index * eta + value2 * eta_two + value1 * eta_three + * + * When performing a read/write access, the values of i, t, v, v2, a, r are stored in the following wires + + * selectors, depending on whether the gate is a RAM read/write or a ROM read + * + * | gate type | i | v2/t | v | a | r | + * | --------- | -- | ----- | -- | -- | -- | + * | ROM | w1 | w2 | w3 | -- | w4 | + * | RAM | w1 | w2 | w3 | qc | w4 | + * + * (for accesses where `index` is a circuit constant, it is assumed the circuit will apply a copy constraint on + * `w2` to fix its value) + * + * + */ + + /** + * Memory Record Check + * Partial degree: 1 + * Total degree: 4 + * + * A ROM/ROM access gate can be evaluated with the identity: + * + * qc + w1 \eta + w2 \eta_two + w3 \eta_three - w4 = 0 + * + * For ROM gates, qc = 0 + */ + ap.memory_record_check = wire(p, WIRE.W_O) * eta_three; + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_R) * eta_two); + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_L) * rp.eta); + ap.memory_record_check = ap.memory_record_check + wire(p, WIRE.Q_C); + ap.partial_record_check = ap.memory_record_check; // used in RAM consistency check; deg 1 or 4 + ap.memory_record_check = ap.memory_record_check - wire(p, WIRE.W_4); + + /** + * Contribution 13 & 14 + * ROM Consistency Check + * Partial degree: 1 + * Total degree: 4 + * + * For every ROM read, a set equivalence check is applied between the record witnesses, and a second set of + * records that are sorted. + * + * We apply the following checks for the sorted records: + * + * 1. w1, w2, w3 correctly map to 'index', 'v1, 'v2' for a given record value at w4 + * 2. index values for adjacent records are monotonically increasing + * 3. if, at gate i, index_i == index_{i + 1}, then value1_i == value1_{i + 1} and value2_i == value2_{i + 1} + * + */ + ap.index_delta = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_L); + ap.record_delta = wire(p, WIRE.W_4_SHIFT) - wire(p, WIRE.W_4); + + ap.index_is_monotonically_increasing = + ap.index_delta * + (ap.index_delta - Fr.wrap(1)); // deg 2 + + ap.adjacent_values_match_if_adjacent_indices_match = + (ap.index_delta * MINUS_ONE + ONE) * + ap.record_delta; // deg 2 + + evals[15] = + ap.adjacent_values_match_if_adjacent_indices_match * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + evals[16] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + + ap.ROM_consistency_check_identity = + ap.memory_record_check * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)); // deg 3 or 7 + + /** + * Contributions 15,16,17 + * RAM Consistency Check + * + * The 'access' type of the record is extracted with the expression `w_4 - ap.partial_record_check` + * (i.e. for an honest Prover `w1 * eta + w2 * eta^2 + w3 * eta^3 - w4 = access`. + * This is validated by requiring `access` to be boolean + * + * For two adjacent entries in the sorted list if _both_ + * A) index values match + * B) adjacent access value is 0 (i.e. next gate is a READ) + * then + * C) both values must match. + * The gate boolean check is + * (A && B) => C === !(A && B) || C === !A || !B || C + * + * N.B. it is the responsibility of the circuit writer to ensure that every RAM cell is initialized + * with a WRITE operation. + */ + Fr access_type = (wire(p, WIRE.W_4) - ap.partial_record_check); // will be 0 or 1 for honest Prover; deg 1 or 4 + ap.access_check = access_type * (access_type - Fr.wrap(1)); // check value is 0 or 1; deg 2 or 8 + + // reverse order we could re-use `ap.partial_record_check` 1 - ((w3' * eta + w2') * eta + w1') * eta + // deg 1 or 4 + ap.next_gate_access_type = wire(p, WIRE.W_O_SHIFT) * eta_three; + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_R_SHIFT) * eta_two); + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_L_SHIFT) * rp.eta); + ap.next_gate_access_type = + wire(p, WIRE.W_4_SHIFT) - + ap.next_gate_access_type; + + Fr value_delta = wire(p, WIRE.W_O_SHIFT) - wire(p, WIRE.W_O); + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = + (ap.index_delta * MINUS_ONE + ONE) * + value_delta * + (ap.next_gate_access_type * MINUS_ONE + ONE); // deg 3 or 6 + + // We can't apply the RAM consistency check identity on the final entry in the sorted list (the wires in the + // next gate would make the identity fail). We need to validate that its 'access type' bool is correct. Can't + // do with an arithmetic gate because of the `eta` factors. We need to check that the *next* gate's access + // type is correct, to cover this edge case + // deg 2 or 4 + ap.next_gate_access_type_is_boolean = + ap.next_gate_access_type * + ap.next_gate_access_type - + ap.next_gate_access_type; + + // Putting it all together... + evals[17] = + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 or 8 + evals[18] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 + evals[19] = + ap.next_gate_access_type_is_boolean * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 6 + + ap.RAM_consistency_check_identity = + ap.access_check * + (wire(p, WIRE.Q_O)); // deg 3 or 9 + + /** + * RAM Timestamp Consistency Check + * + * | w1 | w2 | w3 | w4 | + * | index | timestamp | timestamp_check | -- | + * + * Let delta_index = index_{i + 1} - index_{i} + * + * Iff delta_index == 0, timestamp_check = timestamp_{i + 1} - timestamp_i + * Else timestamp_check = 0 + */ + ap.timestamp_delta = wire(p, WIRE.W_R_SHIFT) - wire(p, WIRE.W_R); + ap.RAM_timestamp_check_identity = + (ap.index_delta * MINUS_ONE + ONE) * + ap.timestamp_delta - + wire(p, WIRE.W_O); // deg 3 + + /** + * Complete Contribution 12 + * The complete RAM/ROM memory identity + * Partial degree: + */ + ap.memory_identity = ap.ROM_consistency_check_identity; // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_timestamp_check_identity * + (wire(p, WIRE.Q_4) * wire(p, WIRE.Q_L)); // deg 4 + ap.memory_identity = + ap.memory_identity + + ap.memory_record_check * + (wire(p, WIRE.Q_M) * wire(p, WIRE.Q_L)); // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_consistency_check_identity; // deg 3 or 9 + + // (deg 3 or 9) + (deg 4) + (deg 3) + ap.memory_identity = + ap.memory_identity * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 10 + evals[14] = ap.memory_identity; + } + + function accumulateNnfRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + NnfParams memory ap; + + /** + * Contribution 12 + * Non native field arithmetic gate 2 + * deg 4 + * + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * + */ + ap.limb_subproduct = + wire(p, WIRE.W_L) * + wire(p, WIRE.W_R_SHIFT) + + wire(p, WIRE.W_L_SHIFT) * + wire(p, WIRE.W_R); + ap.non_native_field_gate_2 = (wire(p, WIRE.W_L) * + wire(p, WIRE.W_4) + + wire(p, WIRE.W_R) * + wire(p, WIRE.W_O) - + wire(p, WIRE.W_O_SHIFT)); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * LIMB_SIZE; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 - + wire(p, WIRE.W_4_SHIFT); + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 + + ap.limb_subproduct; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 * + wire(p, WIRE.Q_4); + + ap.limb_subproduct = ap.limb_subproduct * LIMB_SIZE; + ap.limb_subproduct = + ap.limb_subproduct + + (wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R_SHIFT)); + ap.non_native_field_gate_1 = ap.limb_subproduct; + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 - + (wire(p, WIRE.W_O) + wire(p, WIRE.W_4)); + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 * + wire(p, WIRE.Q_O); + + ap.non_native_field_gate_3 = ap.limb_subproduct; + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 + + wire(p, WIRE.W_4); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 - + (wire(p, WIRE.W_O_SHIFT) + wire(p, WIRE.W_4_SHIFT)); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 * + wire(p, WIRE.Q_M); + + Fr non_native_field_identity = ap.non_native_field_gate_1 + + ap.non_native_field_gate_2 + + ap.non_native_field_gate_3; + non_native_field_identity = + non_native_field_identity * + wire(p, WIRE.Q_R); + + // ((((w2' * 2^14 + w1') * 2^14 + w3) * 2^14 + w2) * 2^14 + w1 - w4) * qm + // deg 2 + ap.limb_accumulator_1 = wire(p, WIRE.W_R_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_O); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_R); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L); + ap.limb_accumulator_1 = ap.limb_accumulator_1 - wire(p, WIRE.W_4); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * wire(p, WIRE.Q_4); + + // ((((w3' * 2^14 + w2') * 2^14 + w1') * 2^14 + w4) * 2^14 + w3 - w4') * qm + // deg 2 + ap.limb_accumulator_2 = wire(p, WIRE.W_O_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_R_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_4); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_O); + ap.limb_accumulator_2 = ap.limb_accumulator_2 - wire(p, WIRE.W_4_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * wire(p, WIRE.Q_M); + + Fr limb_accumulator_identity = ap.limb_accumulator_1 + + ap.limb_accumulator_2; + limb_accumulator_identity = + limb_accumulator_identity * + wire(p, WIRE.Q_O); // deg 3 + + ap.nnf_identity = non_native_field_identity + limb_accumulator_identity; + ap.nnf_identity = ap.nnf_identity * (wire(p, WIRE.Q_NNF) * domainSep); + evals[20] = ap.nnf_identity; + } + + function accumulatePoseidonExternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonExternalParams memory ep; + + ep.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + ep.s2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_R); + ep.s3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_O); + ep.s4 = wire(p, WIRE.W_4) + wire(p, WIRE.Q_4); + + ep.u1 = ep.s1 * ep.s1 * ep.s1 * ep.s1 * ep.s1; + ep.u2 = ep.s2 * ep.s2 * ep.s2 * ep.s2 * ep.s2; + ep.u3 = ep.s3 * ep.s3 * ep.s3 * ep.s3 * ep.s3; + ep.u4 = ep.s4 * ep.s4 * ep.s4 * ep.s4 * ep.s4; + // matrix mul v = M_E * u with 14 additions + ep.t0 = ep.u1 + ep.u2; // u_1 + u_2 + ep.t1 = ep.u3 + ep.u4; // u_3 + u_4 + ep.t2 = ep.u2 + ep.u2 + ep.t1; // 2u_2 + // ep.t2 += ep.t1; // 2u_2 + u_3 + u_4 + ep.t3 = ep.u4 + ep.u4 + ep.t0; // 2u_4 + // ep.t3 += ep.t0; // u_1 + u_2 + 2u_4 + ep.v4 = ep.t1 + ep.t1; + ep.v4 = ep.v4 + ep.v4 + ep.t3; + // ep.v4 += ep.t3; // u_1 + u_2 + 4u_3 + 6u_4 + ep.v2 = ep.t0 + ep.t0; + ep.v2 = ep.v2 + ep.v2 + ep.t2; + // ep.v2 += ep.t2; // 4u_1 + 6u_2 + u_3 + u_4 + ep.v1 = ep.t3 + ep.v2; // 5u_1 + 7u_2 + u_3 + 3u_4 + ep.v3 = ep.t2 + ep.v4; // u_1 + 3u_2 + 5u_3 + 7u_4 + + ep.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_EXTERNAL) * domainSep; + evals[21] = + evals[21] + + ep.q_pos_by_scaling * + (ep.v1 - wire(p, WIRE.W_L_SHIFT)); + + evals[22] = + evals[22] + + ep.q_pos_by_scaling * + (ep.v2 - wire(p, WIRE.W_R_SHIFT)); + + evals[23] = + evals[23] + + ep.q_pos_by_scaling * + (ep.v3 - wire(p, WIRE.W_O_SHIFT)); + + evals[24] = + evals[24] + + ep.q_pos_by_scaling * + (ep.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + function accumulatePoseidonInternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonInternalParams memory ip; + + Fr[4] memory INTERNAL_MATRIX_DIAGONAL = [ + FrLib.from( + 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7 + ), + FrLib.from( + 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b + ), + FrLib.from( + 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15 + ), + FrLib.from( + 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b + ) + ]; + + // add round constants + ip.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + + // apply s-box round + ip.u1 = ip.s1 * ip.s1 * ip.s1 * ip.s1 * ip.s1; + ip.u2 = wire(p, WIRE.W_R); + ip.u3 = wire(p, WIRE.W_O); + ip.u4 = wire(p, WIRE.W_4); + + // matrix mul with v = M_I * u 4 muls and 7 additions + ip.u_sum = ip.u1 + ip.u2 + ip.u3 + ip.u4; + + ip.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_INTERNAL) * domainSep; + + ip.v1 = ip.u1 * INTERNAL_MATRIX_DIAGONAL[0] + ip.u_sum; + evals[25] = + evals[25] + + ip.q_pos_by_scaling * + (ip.v1 - wire(p, WIRE.W_L_SHIFT)); + + ip.v2 = ip.u2 * INTERNAL_MATRIX_DIAGONAL[1] + ip.u_sum; + evals[26] = + evals[26] + + ip.q_pos_by_scaling * + (ip.v2 - wire(p, WIRE.W_R_SHIFT)); + + ip.v3 = ip.u3 * INTERNAL_MATRIX_DIAGONAL[2] + ip.u_sum; + evals[27] = + evals[27] + + ip.q_pos_by_scaling * + (ip.v3 - wire(p, WIRE.W_O_SHIFT)); + + ip.v4 = ip.u4 * INTERNAL_MATRIX_DIAGONAL[3] + ip.u_sum; + evals[28] = + evals[28] + + ip.q_pos_by_scaling * + (ip.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + // Batch subrelation evaluations using precomputed powers of alpha + // First subrelation is implicitly scaled by 1, subsequent ones use powers from the subrelationChallenges array + function scaleAndBatchSubrelations( + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges + ) internal pure returns (Fr accumulator) { + accumulator = evaluations[0]; + + for (uint256 i = 1; i < NUMBER_OF_SUBRELATIONS; ++i) { + accumulator = + accumulator + + evaluations[i] * + subrelationChallenges[i - 1]; + } + } +} + +library CommitmentSchemeLib { + using FrLib for Fr; + + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + Fr unshiftedScalarNeg; + Fr shiftedScalarNeg; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Accumulator for powers of rho + Fr batchingChallenge; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchedEvaluation; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] denominators; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] batchingScalars; + // 1/(z - r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr posInvertedDenominator; + // 1/(z + r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr negInvertedDenominator; + // ν^{2i} * 1/(z - r^{2^i}) + Fr scalingFactorPos; + // ν^{2i+1} * 1/(z + r^{2^i}) + Fr scalingFactorNeg; + // Fold_i(r^{2^i}) reconstructed by Verifier + Fr[] foldPosEvaluations; + } + + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., m-1 + function computeFoldPosEvaluations( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckUChallenges, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[] memory geminiEvalChallengePowers, + uint256 logSize + ) internal view returns (Fr[] memory) { + Fr[] memory foldPosEvaluations = new Fr[](logSize); + for (uint256 i = logSize; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = sumcheckUChallenges[i - 1]; + + Fr batchedEvalRoundAcc = ((challengePower * + batchedEvalAccumulator * + Fr.wrap(2)) - + geminiEvaluations[i - 1] * + (challengePower * (ONE - u) - u)); + // Divide by the denominator + batchedEvalRoundAcc = + batchedEvalRoundAcc * + (challengePower * (ONE - u) + u).invert(); + + batchedEvalAccumulator = batchedEvalRoundAcc; + foldPosEvaluations[i - 1] = batchedEvalRoundAcc; + } + return foldPosEvaluations; + } + + function computeSquares( + Fr r, + uint256 logN + ) internal pure returns (Fr[] memory) { + Fr[] memory squares = new Fr[](logN); + squares[0] = r; + for (uint256 i = 1; i < logN; ++i) { + squares[i] = squares[i - 1].sqr(); + } + return squares; + } +} + +uint256 constant Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // EC group order. F_q + +// Fr utility + +function bytesToFr(bytes calldata proofSection) pure returns (Fr scalar) { + scalar = FrLib.fromBytes32(bytes32(proofSection)); +} + +// EC Point utilities +function bytesToG1Point( + bytes calldata proofSection +) pure returns (Honk.G1Point memory point) { + uint256 x = uint256(bytes32(proofSection[0x00:0x20])); + uint256 y = uint256(bytes32(proofSection[0x20:0x40])); + require(x < Q && y < Q, Errors.ValueGeGroupOrder()); + + // (0,0) is the canonical EIP-196 encoding of the identity. It is accepted here + // because polynomial commitments to identically-zero polynomials (e.g. unused + // selector or table polys) are legitimately the identity. On-curve validation + // (y² = x³ + 3) is handled by the ecAdd/ecMul precompiles per EIP-196. + point = Honk.G1Point({ x: x, y: y }); +} + +function negateInplace( + Honk.G1Point memory point +) pure returns (Honk.G1Point memory) { + // When y == 0 (order-2 point), negation is the same point. Q - 0 = Q which is >= Q. + if (point.y != 0) { + point.y = Q - point.y; + } + return point; +} + +/** + * Convert the pairing points to G1 points. + * + * The pairing points are serialised as an array of 2 limbs representing two points + * (P0 and P1, used for lhs and rhs of pairing operation). + * + * There are 2 limbs (lo, hi) for each coordinate, so 4 limbs per point, 8 total. + * Layout: [P0.x_lo, P0.x_hi, P0.y_lo, P0.y_hi, P1.x_lo, P1.x_hi, P1.y_lo, P1.y_hi] + * + * @param pairingPoints The pairing points to convert. + * @return lhs P0 point + * @return rhs P1 point + */ +function convertPairingPointsToG1( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (Honk.G1Point memory lhs, Honk.G1Point memory rhs) { + // P0 (lhs): x = lo | (hi << 136) + uint256 lhsX = Fr.unwrap(pairingPoints[0]); + lhsX |= Fr.unwrap(pairingPoints[1]) << 136; + + uint256 lhsY = Fr.unwrap(pairingPoints[2]); + lhsY |= Fr.unwrap(pairingPoints[3]) << 136; + + // P1 (rhs): x = lo | (hi << 136) + uint256 rhsX = Fr.unwrap(pairingPoints[4]); + rhsX |= Fr.unwrap(pairingPoints[5]) << 136; + + uint256 rhsY = Fr.unwrap(pairingPoints[6]); + rhsY |= Fr.unwrap(pairingPoints[7]) << 136; + + // Reconstructed coordinates must be < Q to prevent malleability. + // Without this, two different limb encodings could map to the same curve point + // (via mulmod reduction in on-curve checks) but produce different transcript hashes. + require( + lhsX < Q && lhsY < Q && rhsX < Q && rhsY < Q, + Errors.ValueGeGroupOrder() + ); + + lhs.x = lhsX; + lhs.y = lhsY; + rhs.x = rhsX; + rhs.y = rhsY; +} + +/** + * Hash the pairing inputs from the present verification context with those extracted from the public inputs. + * + * @param proofPairingPoints Pairing points from the proof - (public inputs). + * @param accLhs Accumulator point for the left side - result of shplemini. + * @param accRhs Accumulator point for the right side - result of shplemini. + * @return recursionSeparator The recursion separator - generated from hashing the above. + */ +function generateRecursionSeparator( + Fr[PAIRING_POINTS_SIZE] memory proofPairingPoints, + Honk.G1Point memory accLhs, + Honk.G1Point memory accRhs +) pure returns (Fr recursionSeparator) { + // hash the proof aggregated X + // hash the proof aggregated Y + // hash the accum X + // hash the accum Y + + ( + Honk.G1Point memory proofLhs, + Honk.G1Point memory proofRhs + ) = convertPairingPointsToG1(proofPairingPoints); + + uint256[8] memory recursionSeparatorElements; + + // Proof points + recursionSeparatorElements[0] = proofLhs.x; + recursionSeparatorElements[1] = proofLhs.y; + recursionSeparatorElements[2] = proofRhs.x; + recursionSeparatorElements[3] = proofRhs.y; + + // Accumulator points + recursionSeparatorElements[4] = accLhs.x; + recursionSeparatorElements[5] = accLhs.y; + recursionSeparatorElements[6] = accRhs.x; + recursionSeparatorElements[7] = accRhs.y; + + recursionSeparator = FrLib.from( + uint256(keccak256(abi.encodePacked(recursionSeparatorElements))) % P + ); +} + +/** + * G1 Mul with Separator + * Using the ecAdd and ecMul precompiles + * + * @param basePoint The point to multiply. + * @param other The other point to add. + * @param recursionSeperator The separator to use for the multiplication. + * @return `(recursionSeperator * basePoint) + other`. + */ +function mulWithSeperator( + Honk.G1Point memory basePoint, + Honk.G1Point memory other, + Fr recursionSeperator +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + result = ecMul(recursionSeperator, basePoint); + result = ecAdd(result, other); + + return result; +} + +/** + * G1 Mul + * Takes a Fr value and a G1 point and uses the ecMul precompile to return the result. + * + * @param value The value to multiply the point by. + * @param point The point to multiply. + * @return result The result of the multiplication. + */ +function ecMul( + Fr value, + Honk.G1Point memory point +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write the point into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | point.x + // free + 0x20| point.y + mstore(free, mload(point)) + mstore(add(free, 0x20), mload(add(point, 0x20))) + // Write the scalar into memory (one 32 byte word) + // Memory layout: + // Address | value + // free + 0x40| value + mstore(add(free, 0x40), value) + + // Call the ecMul precompile, it takes in the following + // [point.x, point.y, scalar], and returns the result back into the free memory location. + let success := staticcall(gas(), 0x07, free, 0x60, free, 0x40) + if iszero(success) { + revert(0, 0) + } + // Copy the result of the multiplication back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x60)) + } + + return result; +} + +/** + * G1 Add + * Takes two G1 points and uses the ecAdd precompile to return the result. + * + * @param lhs The left hand side of the addition. + * @param rhs The right hand side of the addition. + * @return result The result of the addition. + */ +function ecAdd( + Honk.G1Point memory lhs, + Honk.G1Point memory rhs +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write lhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | lhs.x + // free + 0x20| lhs.y + mstore(free, mload(lhs)) + mstore(add(free, 0x20), mload(add(lhs, 0x20))) + + // Write rhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free + 0x40| rhs.x + // free + 0x60| rhs.y + mstore(add(free, 0x40), mload(rhs)) + mstore(add(free, 0x60), mload(add(rhs, 0x20))) + + // Call the ecAdd precompile, it takes in the following + // [lhs.x, lhs.y, rhs.x, rhs.y], and returns their addition back into the free memory location. + let success := staticcall(gas(), 0x06, free, 0x80, free, 0x40) + if iszero(success) { + revert(0, 0) + } + + // Copy the result of the addition back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x80)) + } + + return result; +} + +function rejectPointAtInfinity(Honk.G1Point memory point) pure { + require((point.x | point.y) != 0, Errors.PointAtInfinity()); +} + +/** + * Check if pairing point limbs are all zero (default/infinity). + * Default pairing points indicate no recursive verification occurred. + */ +function arePairingPointsDefault( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (bool) { + uint256 acc = 0; + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + acc |= Fr.unwrap(pairingPoints[i]); + } + return acc == 0; +} + +function pairing( + Honk.G1Point memory rhs, + Honk.G1Point memory lhs +) view returns (bool decodedResult) { + bytes memory input = abi.encodePacked( + rhs.x, + rhs.y, + // Fixed G2 point + uint256( + 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2 + ), + uint256( + 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed + ), + uint256( + 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b + ), + uint256( + 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa + ), + lhs.x, + lhs.y, + // G2 point from VK + uint256( + 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1 + ), + uint256( + 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0 + ), + uint256( + 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4 + ), + uint256( + 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55 + ) + ); + + (bool success, bytes memory result) = address(0x08).staticcall(input); + decodedResult = success && abi.decode(result, (bool)); +} + +abstract contract BaseZKHonkVerifier is IVerifier { + using FrLib for Fr; + + struct PairingInputs { + Honk.G1Point P_0; + Honk.G1Point P_1; + } + + struct SmallSubgroupIpaIntermediates { + Fr[SUBGROUP_SIZE] challengePolyLagrange; + Fr challengePolyEval; + Fr lagrangeFirst; + Fr lagrangeLast; + Fr rootPower; + Fr[SUBGROUP_SIZE] denominators; // this has to disappear + Fr diff; + } + + // Constants for proof length calculation (matching UltraKeccakZKFlavor) + uint256 internal constant NUM_WITNESS_ENTITIES = + 8 + NUM_MASKING_POLYNOMIALS; + uint256 internal constant NUM_ELEMENTS_COMM = 2; // uint256 elements for curve points + uint256 internal constant NUM_ELEMENTS_FR = 1; // uint256 elements for field elements + uint256 internal constant NUM_LIBRA_EVALUATIONS = 4; // libra evaluations + + uint256 internal constant LIBRA_COMMITMENTS = 3; + uint256 internal constant LIBRA_EVALUATIONS = 4; + uint256 internal constant LIBRA_UNIVARIATES_LENGTH = 9; + + uint256 internal constant SHIFTED_COMMITMENTS_START = 30; + uint256 internal constant PERMUTATION_ARGUMENT_VALUE_SEPARATOR = 1 << 28; + + uint256 internal immutable $N; + uint256 internal immutable $LOG_N; + uint256 internal immutable $VK_HASH; + uint256 internal immutable $NUM_PUBLIC_INPUTS; + uint256 internal immutable $MSMSize; + + constructor( + uint256 _N, + uint256 _logN, + uint256 _vkHash, + uint256 _numPublicInputs + ) { + $N = _N; + $LOG_N = _logN; + $VK_HASH = _vkHash; + $NUM_PUBLIC_INPUTS = _numPublicInputs; + $MSMSize = NUMBER_UNSHIFTED_ZK + _logN + LIBRA_COMMITMENTS + 2; + } + + function validateVerificationKey( + Honk.VerificationKey memory vk + ) internal view { + require( + $N == vk.circuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $LOG_N == vk.logCircuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $NUM_PUBLIC_INPUTS == vk.publicInputsSize, + Errors.VerificationKeyConfigurationMismatch() + ); + } + + function verify( + bytes calldata proof, + bytes32[] calldata publicInputs + ) public view override returns (bool verified) { + // Calculate expected proof size based on $LOG_N + uint256 expectedProofSize = calculateProofSize($LOG_N); + + // Check the received proof is the expected size where each field element is 32 bytes + require( + proof.length == expectedProofSize, + Errors.ProofLengthWrongWithLogN( + $LOG_N, + proof.length, + expectedProofSize + ) + ); + + Honk.VerificationKey memory vk = loadVerificationKey(); + Honk.ZKProof memory p = ZKTranscriptLib.loadProof(proof, $LOG_N); + + require( + publicInputs.length == vk.publicInputsSize - PAIRING_POINTS_SIZE, + Errors.PublicInputsLengthWrong() + ); + + // Generate the fiat shamir challenges for the whole protocol + ZKTranscript memory t = ZKTranscriptLib.generateTranscript( + p, + publicInputs, + $VK_HASH, + $NUM_PUBLIC_INPUTS, + $LOG_N + ); + + // Derive public input delta + t.relationParameters.publicInputsDelta = computePublicInputDelta( + publicInputs, + p.pairingPointObject, + t.relationParameters.beta, + t.relationParameters.gamma, + 5 // pubInputsOffset = NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS = 4 + 1 + ); + + // Sumcheck + require(verifySumcheck(p, t), Errors.SumcheckFailed()); + require(verifyShplemini(p, vk, t), Errors.ShpleminiFailed()); + + verified = true; + } + + function computePublicInputDelta( + bytes32[] memory publicInputs, + Fr[PAIRING_POINTS_SIZE] memory pairingPointObject, + Fr beta, + Fr gamma, + uint256 offset + ) internal view returns (Fr publicInputDelta) { + Fr numerator = Fr.wrap(1); + Fr denominator = Fr.wrap(1); + + Fr numeratorAcc = gamma + + (beta * FrLib.from(PERMUTATION_ARGUMENT_VALUE_SEPARATOR + offset)); + Fr denominatorAcc = gamma - (beta * FrLib.from(offset + 1)); + + { + for ( + uint256 i = 0; + i < $NUM_PUBLIC_INPUTS - PAIRING_POINTS_SIZE; + i++ + ) { + Fr pubInput = FrLib.fromBytes32(publicInputs[i]); + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + Fr pubInput = pairingPointObject[i]; + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + } + + // Fr delta = numerator / denominator; // TOOO: batch invert later? + publicInputDelta = FrLib.div(numerator, denominator); + } + + function verifySumcheck( + Honk.ZKProof memory proof, + ZKTranscript memory tp + ) internal view returns (bool verified) { + Fr roundTargetSum = tp.libraChallenge * proof.libraSum; // default 0 + Fr powPartialEvaluation = Fr.wrap(1); + + // We perform sumcheck reductions over log n rounds ( the multivariate degree ) + for (uint256 round; round < $LOG_N; ++round) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory roundUnivariate = proof.sumcheckUnivariates[round]; + Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; + require(totalSum == roundTargetSum, Errors.SumcheckFailed()); + + Fr roundChallenge = tp.sumCheckUChallenges[round]; + + // Update the round target for the next rounf + roundTargetSum = computeNextTargetSum( + roundUnivariate, + roundChallenge + ); + powPartialEvaluation = + powPartialEvaluation * + (Fr.wrap(1) + + roundChallenge * + (tp.gateChallenges[round] - Fr.wrap(1))); + } + + // Last round + // For ZK flavors: sumcheckEvaluations has 42 elements + // Index 0 is gemini_masking_poly, indices 1-41 are the regular entities used in relations + Fr[NUMBER_OF_ENTITIES] memory relationsEvaluations; + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + relationsEvaluations[i] = proof.sumcheckEvaluations[ + i + NUM_MASKING_POLYNOMIALS + ]; // Skip gemini_masking_poly at index 0 + } + Fr grandHonkRelationSum = RelationsLib.accumulateRelationEvaluations( + relationsEvaluations, + tp.relationParameters, + tp.alphas, + powPartialEvaluation + ); + + // Row-disabling polynomial: 1 - ∏_{i≥2}(1 - u_i) + Fr evaluation = Fr.wrap(1); + for (uint256 i = 2; i < $LOG_N; i++) { + evaluation = evaluation * (Fr.wrap(1) - tp.sumCheckUChallenges[i]); + } + + grandHonkRelationSum = + grandHonkRelationSum * + (Fr.wrap(1) - evaluation) + + proof.libraEvaluation * + tp.libraChallenge; + verified = (grandHonkRelationSum == roundTargetSum); + } + + // Return the new target sum for the next sumcheck round + function computeNextTargetSum( + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariates, + Fr roundChallenge + ) internal view returns (Fr targetSum) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory BARYCENTRIC_LAGRANGE_DENOMINATORS = [ + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000000240 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ) + ]; + + // To compute the next target sum, we evaluate the given univariate at a point u (challenge). + + // Performing Barycentric evaluations + // Compute B(x) + Fr numeratorValue = Fr.wrap(1); + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + numeratorValue = numeratorValue * (roundChallenge - Fr.wrap(i)); + } + + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + denominatorInverses[i] = FrLib.invert( + BARYCENTRIC_LAGRANGE_DENOMINATORS[i] * + (roundChallenge - Fr.wrap(i)) + ); + } + + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + targetSum = + targetSum + + roundUnivariates[i] * + denominatorInverses[i]; + } + + // Scale the sum by the value of B(x) + targetSum = targetSum * numeratorValue; + } + + function verifyShplemini( + Honk.ZKProof memory proof, + Honk.VerificationKey memory vk, + ZKTranscript memory tp + ) internal view returns (bool verified) { + CommitmentSchemeLib.ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[] memory powers_of_evaluation_challenge = CommitmentSchemeLib + .computeSquares(tp.geminiR, $LOG_N); + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[] memory scalars = new Fr[]($MSMSize); + Honk.G1Point[] memory commitments = new Honk.G1Point[]($MSMSize); + + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[0]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[0]).invert(); + + mem.unshiftedScalar = + mem.posInvertedDenominator + + (tp.shplonkNu * mem.negInvertedDenominator); + mem.shiftedScalar = + tp.geminiR.invert() * + (mem.posInvertedDenominator - + (tp.shplonkNu * mem.negInvertedDenominator)); + + scalars[0] = Fr.wrap(1); + commitments[0] = proof.shplonkQ; + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + // For ZK flavors: evaluations array is [gemini_masking_poly, qm, qc, ql, qr, ...] + // Start batching challenge at 1, not rho, to match non-ZK pattern + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + mem.unshiftedScalarNeg = mem.unshiftedScalar.neg(); + mem.shiftedScalarNeg = mem.shiftedScalar.neg(); + + // Process all NUMBER_UNSHIFTED_ZK evaluations (includes gemini_masking_poly at index 0) + for (uint256 i = 1; i <= NUMBER_UNSHIFTED_ZK; ++i) { + scalars[i] = mem.unshiftedScalarNeg * mem.batchingChallenge; + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[i - NUM_MASKING_POLYNOMIALS] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + // For each of the to be shifted commitments perform the shift in place by + // adding to the unshifted value. + // We do so, as the values are to be used in batchMul later, and as + // `a * c + b * c = (a + b) * c` this will allow us to reduce memory and compute. + // Applied to w1, w2, w3, w4 and zPerm + for (uint256 i = 0; i < NUMBER_TO_BE_SHIFTED; ++i) { + uint256 scalarOff = i + SHIFTED_COMMITMENTS_START; + uint256 evaluationOff = i + NUMBER_UNSHIFTED_ZK; + + scalars[scalarOff] = + scalars[scalarOff] + + (mem.shiftedScalarNeg * mem.batchingChallenge); + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[evaluationOff] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + + commitments[1] = proof.geminiMaskingPoly; + + commitments[2] = vk.s1; + commitments[3] = vk.s2; + commitments[4] = vk.s3; + commitments[5] = vk.s4; + commitments[6] = vk.id1; + commitments[7] = vk.id2; + commitments[8] = vk.id3; + commitments[9] = vk.id4; + commitments[10] = vk.lagrangeFirst; + commitments[11] = vk.lagrangeLast; + commitments[12] = vk.qLookup; + commitments[13] = vk.t1; + commitments[14] = vk.t2; + commitments[15] = vk.t3; + commitments[16] = vk.t4; + commitments[17] = vk.qm; + commitments[18] = vk.qr; + commitments[19] = vk.qo; + commitments[20] = vk.qc; + commitments[21] = vk.ql; + commitments[22] = vk.q4; + commitments[23] = vk.qArith; + commitments[24] = vk.qDeltaRange; + commitments[25] = vk.qElliptic; + commitments[26] = vk.qMemory; + commitments[27] = vk.qNnf; + commitments[28] = vk.qPoseidon2External; + commitments[29] = vk.qPoseidon2Internal; + + // Accumulate proof points + commitments[30] = proof.w1; + commitments[31] = proof.w2; + commitments[32] = proof.w3; + commitments[33] = proof.w4; + commitments[34] = proof.zPerm; + commitments[35] = proof.lookupInverses; + commitments[36] = proof.lookupReadCounts; + commitments[37] = proof.lookupReadTags; + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., $LOG_N - 1 + Fr[] memory foldPosEvaluations = CommitmentSchemeLib + .computeFoldPosEvaluations( + tp.sumCheckUChallenges, + mem.batchedEvaluation, + proof.geminiAEvaluations, + powers_of_evaluation_challenge, + $LOG_N + ); + + mem.constantTermAccumulator = + foldPosEvaluations[0] * + mem.posInvertedDenominator; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + (proof.geminiAEvaluations[0] * + tp.shplonkNu * + mem.negInvertedDenominator); + + mem.batchingChallenge = tp.shplonkNu.sqr(); + uint256 boundary = NUMBER_UNSHIFTED_ZK + 1; + + // Compute Shplonk constant term contributions from Aₗ(± r^{2ˡ}) for l = 1, ..., m-1; + // Compute scalar multipliers for each fold commitment + for (uint256 i = 0; i < $LOG_N - 1; ++i) { + bool dummy_round = i >= ($LOG_N - 1); + + if (!dummy_round) { + // Update inverted denominators + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[i + 1]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[i + 1]).invert(); + + // Compute the scalar multipliers for Aₗ(± r^{2ˡ}) and [Aₗ] + mem.scalingFactorPos = + mem.batchingChallenge * + mem.posInvertedDenominator; + mem.scalingFactorNeg = + mem.batchingChallenge * + tp.shplonkNu * + mem.negInvertedDenominator; + scalars[boundary + i] = + mem.scalingFactorNeg.neg() + + mem.scalingFactorPos.neg(); + + // Accumulate the const term contribution given by + // v^{2l} * Aₗ(r^{2ˡ}) /(z-r^{2^l}) + v^{2l+1} * Aₗ(-r^{2ˡ}) /(z+ r^{2^l}) + Fr accumContribution = mem.scalingFactorNeg * + proof.geminiAEvaluations[i + 1]; + accumContribution = + accumContribution + + mem.scalingFactorPos * + foldPosEvaluations[i + 1]; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + accumContribution; + } + // Update the running power of v + mem.batchingChallenge = + mem.batchingChallenge * + tp.shplonkNu * + tp.shplonkNu; + + commitments[boundary + i] = proof.geminiFoldComms[i]; + } + + boundary += $LOG_N - 1; + + // Denominators 1/(z - point_i) for the five opening points {r, g*r, r, 1, r}. + mem.denominators[0] = ONE.div(tp.shplonkZ - tp.geminiR); + mem.denominators[1] = ONE.div( + tp.shplonkZ - SUBGROUP_GENERATOR * tp.geminiR + ); + mem.denominators[2] = mem.denominators[0]; + mem.denominators[SMALL_IPA_BOUNDARY_OPENING_IDX] = ONE.div( + tp.shplonkZ - ONE + ); + mem.denominators[NUM_SMALL_IPA_OPENING_CLAIMS - 1] = mem.denominators[ + 0 + ]; + + // Iterate the opening claims in three segments — the inner loops can't be merged without an extra induction + // variable, which pushes us into stack-too-deep. + for (uint256 i = 0; i < SMALL_IPA_BOUNDARY_OPENING_IDX; i++) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i]; + } + + // Boundary slot: claimed value is hardcoded 0, so no constantTermAccumulator contribution. + { + Fr scalingFactor = mem.denominators[ + SMALL_IPA_BOUNDARY_OPENING_IDX + ] * mem.batchingChallenge; + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX] = scalingFactor + .neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + } + + for ( + uint256 i = SMALL_IPA_BOUNDARY_OPENING_IDX + 1; + i < NUM_SMALL_IPA_OPENING_CLAIMS; + i++ + ) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i - 1]; + } + + // Group per-claim batching scalars by commitment: [G], [A] (three openings), [Q]. + scalars[boundary] = mem.batchingScalars[0]; + scalars[boundary + 1] = + mem.batchingScalars[1] + + mem.batchingScalars[2] + + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX]; + scalars[boundary + 2] = mem.batchingScalars[ + NUM_SMALL_IPA_OPENING_CLAIMS - 1 + ]; + + for (uint256 i = 0; i < LIBRA_COMMITMENTS; i++) { + commitments[boundary++] = proof.libraCommitments[i]; + } + + commitments[boundary] = Honk.G1Point({ x: 1, y: 2 }); + scalars[boundary++] = mem.constantTermAccumulator; + + require( + checkEvalsConsistency( + proof.libraPolyEvals, + tp.geminiR, + tp.sumCheckUChallenges, + proof.libraEvaluation + ), + Errors.ConsistencyCheckFailed() + ); + + Honk.G1Point memory quotient_commitment = proof.kzgQuotient; + + commitments[boundary] = quotient_commitment; + scalars[boundary] = tp.shplonkZ; // evaluation challenge + + PairingInputs memory pair; + pair.P_0 = batchMul(commitments, scalars); + pair.P_1 = negateInplace(quotient_commitment); + + // Aggregate pairing points (skip if default/infinity — no recursive verification occurred) + if (!arePairingPointsDefault(proof.pairingPointObject)) { + Fr recursionSeparator = generateRecursionSeparator( + proof.pairingPointObject, + pair.P_0, + pair.P_1 + ); + ( + Honk.G1Point memory P_0_other, + Honk.G1Point memory P_1_other + ) = convertPairingPointsToG1(proof.pairingPointObject); + + // Validate the points from the proof are on the curve + rejectPointAtInfinity(P_0_other); + rejectPointAtInfinity(P_1_other); + + // accumulate with aggregate points in proof + pair.P_0 = mulWithSeperator( + pair.P_0, + P_0_other, + recursionSeparator + ); + pair.P_1 = mulWithSeperator( + pair.P_1, + P_1_other, + recursionSeparator + ); + } + + return pairing(pair.P_0, pair.P_1); + } + + function checkEvalsConsistency( + Fr[LIBRA_EVALUATIONS] memory libraPolyEvals, + Fr geminiR, + Fr[CONST_PROOF_SIZE_LOG_N] memory uChallenges, + Fr libraEval + ) internal view returns (bool check) { + Fr one = Fr.wrap(1); + Fr vanishingPolyEval = geminiR.pow(SUBGROUP_SIZE) - one; + require( + vanishingPolyEval != Fr.wrap(0), + Errors.GeminiChallengeInSubgroup() + ); + + SmallSubgroupIpaIntermediates memory mem; + mem.challengePolyLagrange[0] = one; + for (uint256 round = 0; round < $LOG_N; round++) { + uint256 currIdx = 1 + LIBRA_UNIVARIATES_LENGTH * round; + mem.challengePolyLagrange[currIdx] = one; + for ( + uint256 idx = currIdx + 1; + idx < currIdx + LIBRA_UNIVARIATES_LENGTH; + idx++ + ) { + mem.challengePolyLagrange[idx] = + mem.challengePolyLagrange[idx - 1] * + uChallenges[round]; + } + } + + mem.rootPower = one; + mem.challengePolyEval = Fr.wrap(0); + for (uint256 idx = 0; idx < SUBGROUP_SIZE; idx++) { + mem.denominators[idx] = mem.rootPower * geminiR - one; + mem.denominators[idx] = mem.denominators[idx].invert(); + mem.challengePolyEval = + mem.challengePolyEval + + mem.challengePolyLagrange[idx] * + mem.denominators[idx]; + mem.rootPower = mem.rootPower * SUBGROUP_GENERATOR_INVERSE; + } + + Fr numerator = vanishingPolyEval * Fr.wrap(SUBGROUP_SIZE).invert(); + mem.challengePolyEval = mem.challengePolyEval * numerator; + mem.lagrangeFirst = mem.denominators[0] * numerator; + mem.lagrangeLast = mem.denominators[SUBGROUP_SIZE - 1] * numerator; + + mem.diff = mem.lagrangeFirst * libraPolyEvals[2]; + + mem.diff = + mem.diff + + (geminiR - SUBGROUP_GENERATOR_INVERSE) * + (libraPolyEvals[1] - + libraPolyEvals[2] - + libraPolyEvals[0] * + mem.challengePolyEval); + mem.diff = + mem.diff + + mem.lagrangeLast * + (libraPolyEvals[2] - libraEval) - + vanishingPolyEval * + libraPolyEvals[3]; + + check = mem.diff == Fr.wrap(0); + } + + // This implementation is the same as above with different constants + function batchMul( + Honk.G1Point[] memory base, + Fr[] memory scalars + ) internal view returns (Honk.G1Point memory result) { + uint256 limit = $MSMSize; + + // Identity bases are accepted: VK selector/table polys may be identically zero, + // and the ecAdd/ecMul precompiles treat (0,0) as the additive identity per EIP-196. + // Soundness against an attacker substituting (0,0) for a non-zero commitment is + // upheld by sumcheck/Shplemini, which would fail on inconsistent evaluations. + + bool success = true; + assembly { + let free := mload(0x40) + + let count := 0x01 + for {} lt(count, add(limit, 1)) { + count := add(count, 1) + } { + // Get loop offsets + let base_base := add(base, mul(count, 0x20)) + let scalar_base := add(scalars, mul(count, 0x20)) + + mstore(add(free, 0x40), mload(mload(base_base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalar_base)) + + success := and( + success, + staticcall( + gas(), + 7, + add(free, 0x40), + 0x60, + add(free, 0x40), + 0x40 + ) + ) + // accumulator = accumulator + accumulator_2 + success := and( + success, + staticcall(gas(), 6, free, 0x80, free, 0x40) + ) + } + + // Return the result + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + } + + require(success, Errors.ShpleminiFailed()); + } + + // Calculate proof size based on log_n (matching UltraKeccakZKFlavor formula) + function calculateProofSize(uint256 logN) internal pure returns (uint256) { + // Witness and Libra commitments + uint256 proofLength = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM; // witness commitments + proofLength += NUM_ELEMENTS_COMM * 3; // Libra concat, grand sum, quotient comms + Gemini masking + + // Sumcheck + proofLength += + logN * + ZK_BATCHED_RELATION_PARTIAL_LENGTH * + NUM_ELEMENTS_FR; // sumcheck univariates + proofLength += NUMBER_OF_ENTITIES_ZK * NUM_ELEMENTS_FR; // sumcheck evaluations + + // Libra and Gemini + proofLength += NUM_ELEMENTS_FR * 2; // Libra sum, claimed eval + proofLength += logN * NUM_ELEMENTS_FR; // Gemini a evaluations + proofLength += NUM_LIBRA_EVALUATIONS * NUM_ELEMENTS_FR; // libra evaluations + + // PCS commitments + proofLength += (logN - 1) * NUM_ELEMENTS_COMM; // Gemini Fold commitments + proofLength += NUM_ELEMENTS_COMM * 2; // Shplonk Q and KZG W commitments + + // Pairing points + proofLength += PAIRING_POINTS_SIZE; // pairing inputs carried on public inputs + + return proofLength * 32; + } + + function loadVerificationKey() + internal + pure + virtual + returns (Honk.VerificationKey memory); +} + +contract DecryptionAggregatorVerifier is + BaseZKHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) +{ + constructor() { + validateVerificationKey(HonkVerificationKey.loadVerificationKey()); + } + function loadVerificationKey() + internal + pure + override + returns (Honk.VerificationKey memory) + { + return HonkVerificationKey.loadVerificationKey(); + } +} diff --git a/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/small/DkgAggregatorVerifier.sol b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/small/DkgAggregatorVerifier.sol new file mode 100644 index 0000000000..8b3c88a125 --- /dev/null +++ b/packages/interfold-contracts/contracts/verifiers/bfv/honk/secure-16384/small/DkgAggregatorVerifier.sol @@ -0,0 +1,3262 @@ +// SPDX-License-Identifier: LGPL-3.0-only +// +// This file is provided WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. +pragma solidity >=0.8.21; + +uint256 constant N = 2097152; +uint256 constant LOG_N = 21; +uint256 constant NUMBER_OF_PUBLIC_INPUTS = 62; +uint256 constant VK_HASH = 0x245a601096093626f1a6af6382709ea484c72d69959ae4272887a7c7d590bb51; +library HonkVerificationKey { + function loadVerificationKey() + internal + pure + returns (Honk.VerificationKey memory) + { + Honk.VerificationKey memory vk = Honk.VerificationKey({ + circuitSize: uint256(2097152), + logCircuitSize: uint256(21), + publicInputsSize: uint256(62), + ql: Honk.G1Point({ + x: uint256( + 0x2de52e9db7c92e8d3c9bb9722838a03977afd79cb8c60d699e571bda280c1a93 + ), + y: uint256( + 0x26b206fb7bd707d15d96b906b763e341359e96de66364d32f1cbb991f42730d6 + ) + }), + qr: Honk.G1Point({ + x: uint256( + 0x089f787e2dc66c741101d9a94d3f4957e29a56d141db5971bb047367882b0112 + ), + y: uint256( + 0x22e0ebc223ce7e2c41f93dbe1867a104f4433d219ce45f05ddd89aad1086eb5a + ) + }), + qo: Honk.G1Point({ + x: uint256( + 0x24715de2d72781f78e26ff8e37c34d24f4f5d8109bd07485a4e9260079e815ce + ), + y: uint256( + 0x1d30e12efef5fc38d4a5a425abb385b3eb9ebb65d639c626052a746db64718f5 + ) + }), + q4: Honk.G1Point({ + x: uint256( + 0x03af843abe09218ab66f7fa1873b7237ea348d454640dca0a6e95401c38479f2 + ), + y: uint256( + 0x25d020e96f2f0e69bc6820856dc9f83a7995af0b1f5063447edb2dae3991af21 + ) + }), + qm: Honk.G1Point({ + x: uint256( + 0x1e11b748b9bca18314f1f0d22d4bdc6d75d4793bfaeae5fd37f7b504578a0450 + ), + y: uint256( + 0x0411776bff7359d15e52af5874836bdd36e0840409b8452c8dffcf9c063ba4b5 + ) + }), + qc: Honk.G1Point({ + x: uint256( + 0x2126bb6a0c9855af9f8f90eee16b91f4acff79bf7768b0350b80e1dc459f2b15 + ), + y: uint256( + 0x0205a829858ec0a6ae4e0f1a092946b77c33819455c980b541af9039a956abec + ) + }), + qLookup: Honk.G1Point({ + x: uint256( + 0x07decae55629495330c3da15f6f2c0be18906fafea84c922e0de42dc3d4c4a87 + ), + y: uint256( + 0x0f61a514cca0114b9b69ab615669e47d6825d12d94251dabda103c05bdec5709 + ) + }), + qArith: Honk.G1Point({ + x: uint256( + 0x2e62e9d2ca0f1ebc9a7a7d7482eb1e50f0e78222a1b5af4b8e273d6eab793e25 + ), + y: uint256( + 0x227970f15ff11edc6df123354dc6698db0b107ce83ad7c651edc7d13b2e83a1f + ) + }), + qDeltaRange: Honk.G1Point({ + x: uint256( + 0x1fc2057f5837713b438e03ed7a382b6feb9eb857436ae57eadb3f5a5818031f4 + ), + y: uint256( + 0x002f7bbe9f84e7d15fe655711dd2b73a95f9d4f941f057317db92397c10764cc + ) + }), + qElliptic: Honk.G1Point({ + x: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ), + y: uint256( + 0x0000000000000000000000000000000000000000000000000000000000000000 + ) + }), + qMemory: Honk.G1Point({ + x: uint256( + 0x29cf2d876042e628efda1b6c7a616751b89a6d28e1031ab162953dd33ff66354 + ), + y: uint256( + 0x0e7b75ea71ff7da1d6596f63e16e854f6aa296d969787c25a228fca1611afa67 + ) + }), + qNnf: Honk.G1Point({ + x: uint256( + 0x099dee22af776e4b688360f69f39d11ecb51a126a8725915facaed7bf370edea + ), + y: uint256( + 0x23dd16f52ee1145d8e55762baa340f93ef17a1c9dc979fff9c0cae7d1dfb6643 + ) + }), + qPoseidon2External: Honk.G1Point({ + x: uint256( + 0x29bdbcbef7bf29a676d443ffc34a475a02142327d1377bc4b1ab3faccec2d119 + ), + y: uint256( + 0x0d00146d3eda791b56fb9279a5cf121cd74a6aad5b0d738d7918160bbb1e3435 + ) + }), + qPoseidon2Internal: Honk.G1Point({ + x: uint256( + 0x0cd29d802314eecf0418c31539a5c24ee3b5f05851928baf4d98ccf04e994c6d + ), + y: uint256( + 0x0b24b2d24ac5f47b04b1ae59645d8fd98a6596bb0c62c6a88f3089155a2d3528 + ) + }), + s1: Honk.G1Point({ + x: uint256( + 0x0f788abb1422003aa2dd7255ff2a306dae020d928dbe6ad7f888f527628828c5 + ), + y: uint256( + 0x1b3c60b9d5faca4ed231184be1ca1814f00af71e7528bff9ae3a0ed67b0a42d3 + ) + }), + s2: Honk.G1Point({ + x: uint256( + 0x0ba683a6705bc1f09b1bfd789fbe687fcca296e28124f76881747a45705b5133 + ), + y: uint256( + 0x1906e81f7c9f1a354e76ce569c628ea33bb617dc003de79756729c64ced9e910 + ) + }), + s3: Honk.G1Point({ + x: uint256( + 0x26a3c5770bb4d0a28fdfa6ee5919905523caf97e7a8e40529451f8e58bce8a5c + ), + y: uint256( + 0x2c7a4a1cb119d90aa33569ca2739fa962331e8cc71635d0e7d0f772458353a12 + ) + }), + s4: Honk.G1Point({ + x: uint256( + 0x1f83be1a2862aa041e1e6758afafb013587e21e9d437f8dcadd59d6886269b89 + ), + y: uint256( + 0x1094d46cf7351069a4e879732856906242ef0b1ef0722be8e0f3fef81143a4d7 + ) + }), + t1: Honk.G1Point({ + x: uint256( + 0x2dec1113879ec9e894d2e63cab4f6b70b4f0453de3f71c0b7cef5d07ccc5fb16 + ), + y: uint256( + 0x2e569bd7eb479c5d513edc4d10a5eb210ddde4e10a46291b659e3e904f7cb9ed + ) + }), + t2: Honk.G1Point({ + x: uint256( + 0x14c5e72fb4850c73117d61faafb41666f499732f77b2acd2927985e0a44d7a0c + ), + y: uint256( + 0x263108f9225b99fb35c4239a8d0efeb35dbe9f791937033c621e397344de6522 + ) + }), + t3: Honk.G1Point({ + x: uint256( + 0x1046bbe830ffeb03264fa686a6507e553f840a287a840b12d9628c85306d271c + ), + y: uint256( + 0x14da3e1300109c126d74a9b37a8d5cf302a31757293feb3bdf52acd9e99d7257 + ) + }), + t4: Honk.G1Point({ + x: uint256( + 0x122b57aac7c9e1cc87c8fa7a67aba40e3ee3e1540dc9f02eb58a8bcb86fe6eca + ), + y: uint256( + 0x2b4c091e41c1cbad2b4ead8946df008438021eb24532d23d03063af92151a5f7 + ) + }), + id1: Honk.G1Point({ + x: uint256( + 0x29e982b175dbf74a43bc8d2cd457b55036a6fb0bb1e3582bc631582dc486d2c1 + ), + y: uint256( + 0x1ecd311111b6aa535829731d727dab20d384560110577b15d823d7efc9436b13 + ) + }), + id2: Honk.G1Point({ + x: uint256( + 0x2aeea4d05b3714bff83f912264fec22f52150a1293d40e49d54f984b58d02a81 + ), + y: uint256( + 0x1b8fd4fcdc6c281b5a8e76e5f39617ac76d95955ad5f24c0ea72a4751f01b61f + ) + }), + id3: Honk.G1Point({ + x: uint256( + 0x07183ead41bcf6f87e2ede6c3631681e1465289c4d3db805f403bcf6eb98e173 + ), + y: uint256( + 0x1c93db4d8f00322ba48b7570566311e4c91ded2fc796c757cb0c62d63417f818 + ) + }), + id4: Honk.G1Point({ + x: uint256( + 0x06e1229bccbf68b0607f2780f63269d850f9e00e6b80b0881f5d67c3ef66c02c + ), + y: uint256( + 0x1fc1a1b6da87efcf8d091ae3c048a92883134e12c0883a5369beec41ea8d8024 + ) + }), + lagrangeFirst: Honk.G1Point({ + x: uint256( + 0x2a56ce41f6b0be13b9c26747621b821eee81b23a887f299049b14c11e98460d6 + ), + y: uint256( + 0x1aa98f2de3ddda547d8f6de4e725ded5827d6338c78656c0d12ca1aea6ef2c7c + ) + }), + lagrangeLast: Honk.G1Point({ + x: uint256( + 0x2fc1b1461f78bc1e198cbadfa6a6c617368bcb3422bb4296753d22ad40831937 + ), + y: uint256( + 0x2ad4538b72b985d13bd0de7034d78741a75bbf1febc9e95236870a0a6b595133 + ) + }) + }); + return vk; + } +} + +pragma solidity ^0.8.27; + +interface IVerifier { + function verify( + bytes calldata _proof, + bytes32[] calldata _publicInputs + ) external view returns (bool); +} + +/** + * @notice Library of error codes + * @dev You can run `forge inspect Errors errors` to get the selectors for the optimised verifier + */ +library Errors { + error ValueGeLimbMax(); + error ValueGeGroupOrder(); + error ValueGeFieldOrder(); + + error InvertOfZero(); + error NotPowerOfTwo(); + error ModExpFailed(); + + error ProofLengthWrong(); + error ProofLengthWrongWithLogN( + uint256 logN, + uint256 actualLength, + uint256 expectedLength + ); + error PublicInputsLengthWrong(); + error SumcheckFailed(); + error ShpleminiFailed(); + + error PointAtInfinity(); + + error ConsistencyCheckFailed(); + error VerificationKeyConfigurationMismatch(); + error GeminiChallengeInSubgroup(); +} + +type Fr is uint256; + +using { add as + } for Fr global; +using { sub as - } for Fr global; +using { mul as * } for Fr global; + +using { notEqual as != } for Fr global; +using { equal as == } for Fr global; + +uint256 constant SUBGROUP_SIZE = 256; +uint256 constant MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Prime field order +uint256 constant P = MODULUS; +Fr constant SUBGROUP_GENERATOR = Fr.wrap( + 0x07b0c561a6148404f086204a9f36ffb0617942546750f230c893619174a57a76 +); +Fr constant SUBGROUP_GENERATOR_INVERSE = Fr.wrap( + 0x204bd3277422fad364751ad938e2b5e6a54cf8c68712848a692c553d0329f5d6 +); +Fr constant MINUS_ONE = Fr.wrap(MODULUS - 1); +Fr constant ONE = Fr.wrap(1); +Fr constant ZERO = Fr.wrap(0); + +// SmallSubgroupIPA opening-claim layout — mirrors SMALL_IPA_CLAIMS in +// barretenberg/cpp/src/barretenberg/commitment_schemes/small_subgroup_ipa/small_subgroup_ipa_utils.hpp. +uint256 constant NUM_SMALL_IPA_OPENING_CLAIMS = 5; +uint256 constant SMALL_IPA_BOUNDARY_OPENING_IDX = 3; +uint256 constant NUM_SMALL_IPA_TRANSCRIPT_EVALS = 4; +// Instantiation + +library FrLib { + bytes4 internal constant FRLIB_MODEXP_FAILED_SELECTOR = 0x1f7ec5f0; + + function invert(Fr value) internal view returns (Fr) { + uint256 v = Fr.unwrap(value); + require(v != 0, Errors.InvertOfZero()); + + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), v) + mstore(add(free, 0x80), sub(MODULUS, 2)) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function pow(Fr base, uint256 v) internal view returns (Fr) { + uint256 b = Fr.unwrap(base); + // Only works for power of 2 + require(v > 0 && (v & (v - 1)) == 0, Errors.NotPowerOfTwo()); + uint256 result; + + // Call the modexp precompile to invert in the field + assembly { + let free := mload(0x40) + mstore(free, 0x20) + mstore(add(free, 0x20), 0x20) + mstore(add(free, 0x40), 0x20) + mstore(add(free, 0x60), b) + mstore(add(free, 0x80), v) + mstore(add(free, 0xa0), MODULUS) + let success := staticcall(gas(), 0x05, free, 0xc0, 0x00, 0x20) + if iszero(success) { + mstore(0x00, FRLIB_MODEXP_FAILED_SELECTOR) + revert(0, 0x04) + } + result := mload(0x00) + mstore(0x40, add(free, 0xc0)) + } + + return Fr.wrap(result); + } + + function div(Fr numerator, Fr denominator) internal view returns (Fr) { + unchecked { + return numerator * invert(denominator); + } + } + + function sqr(Fr value) internal pure returns (Fr) { + unchecked { + return value * value; + } + } + + function unwrap(Fr value) internal pure returns (uint256) { + unchecked { + return Fr.unwrap(value); + } + } + + function neg(Fr value) internal pure returns (Fr) { + unchecked { + return Fr.wrap(MODULUS - Fr.unwrap(value)); + } + } + + function from(uint256 value) internal pure returns (Fr) { + unchecked { + require(value < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(value); + } + } + + function fromBytes32(bytes32 value) internal pure returns (Fr) { + unchecked { + uint256 v = uint256(value); + require(v < MODULUS, Errors.ValueGeFieldOrder()); + return Fr.wrap(v); + } + } + + function toBytes32(Fr value) internal pure returns (bytes32) { + unchecked { + return bytes32(Fr.unwrap(value)); + } + } +} + +// Free functions +function add(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function mul(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(mulmod(Fr.unwrap(a), Fr.unwrap(b), MODULUS)); + } +} + +function sub(Fr a, Fr b) pure returns (Fr) { + unchecked { + return Fr.wrap(addmod(Fr.unwrap(a), MODULUS - Fr.unwrap(b), MODULUS)); + } +} + +function notEqual(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) != Fr.unwrap(b); + } +} + +function equal(Fr a, Fr b) pure returns (bool) { + unchecked { + return Fr.unwrap(a) == Fr.unwrap(b); + } +} + +uint256 constant CONST_PROOF_SIZE_LOG_N = 25; + +uint256 constant NUMBER_OF_SUBRELATIONS = 29; +uint256 constant BATCHED_RELATION_PARTIAL_LENGTH = 8; +uint256 constant ZK_BATCHED_RELATION_PARTIAL_LENGTH = 9; +uint256 constant NUMBER_OF_ENTITIES = 41; +// The number of entities added for ZK (gemini_masking_poly) +uint256 constant NUM_MASKING_POLYNOMIALS = 1; +uint256 constant NUMBER_OF_ENTITIES_ZK = NUMBER_OF_ENTITIES + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_UNSHIFTED = 36; +uint256 constant NUMBER_UNSHIFTED_ZK = NUMBER_UNSHIFTED + + NUM_MASKING_POLYNOMIALS; +uint256 constant NUMBER_TO_BE_SHIFTED = 5; +uint256 constant PAIRING_POINTS_SIZE = 8; + +uint256 constant FIELD_ELEMENT_SIZE = 0x20; +uint256 constant GROUP_ELEMENT_SIZE = 0x40; + +// Powers of alpha used to batch subrelations (alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)) +uint256 constant NUMBER_OF_ALPHAS = NUMBER_OF_SUBRELATIONS - 1; + +// Must match UltraFlavor_Generated::EntityId order. +enum WIRE { + SIGMA_1, + SIGMA_2, + SIGMA_3, + SIGMA_4, + ID_1, + ID_2, + ID_3, + ID_4, + LAGRANGE_FIRST, + LAGRANGE_LAST, + Q_LOOKUP, + TABLE_1, + TABLE_2, + TABLE_3, + TABLE_4, + Q_M, + Q_R, + Q_O, + Q_C, + Q_L, + Q_4, + Q_ARITH, + Q_RANGE, + Q_ELLIPTIC, + Q_MEMORY, + Q_NNF, + Q_POSEIDON2_EXTERNAL, + Q_POSEIDON2_INTERNAL, + W_L, + W_R, + W_O, + W_4, + Z_PERM, + LOOKUP_INVERSES, + LOOKUP_READ_COUNTS, + LOOKUP_READ_TAGS, + W_L_SHIFT, + W_R_SHIFT, + W_O_SHIFT, + W_4_SHIFT, + Z_PERM_SHIFT +} + +library Honk { + struct G1Point { + uint256 x; + uint256 y; + } + + struct VerificationKey { + // Misc Params + uint256 circuitSize; + uint256 logCircuitSize; + uint256 publicInputsSize; + // Selectors + G1Point qm; + G1Point qc; + G1Point ql; + G1Point qr; + G1Point qo; + G1Point q4; + G1Point qLookup; // Lookup + G1Point qArith; // Arithmetic widget + G1Point qDeltaRange; // Delta Range sort + G1Point qMemory; // Memory + G1Point qNnf; // Non-native Field + G1Point qElliptic; // Auxillary + G1Point qPoseidon2External; + G1Point qPoseidon2Internal; + // Copy constraints + G1Point s1; + G1Point s2; + G1Point s3; + G1Point s4; + // Copy identity + G1Point id1; + G1Point id2; + G1Point id3; + G1Point id4; + // Precomputed lookup table + G1Point t1; + G1Point t2; + G1Point t3; + G1Point t4; + // Fixed first and last + G1Point lagrangeFirst; + G1Point lagrangeLast; + } + + struct RelationParameters { + // challenges + Fr eta; + Fr beta; + Fr gamma; + // derived + Fr publicInputsDelta; + } + + struct Proof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // Free wires + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Lookup helpers - Permutations + G1Point zPerm; + // Lookup helpers - logup + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Sumcheck + Fr[BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr[NUMBER_OF_ENTITIES] sumcheckEvaluations; + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + G1Point shplonkQ; + G1Point kzgQuotient; + } + + /// forge-lint: disable-next-item(pascal-case-struct) + struct ZKProof { + // Pairing point object + Fr[PAIRING_POINTS_SIZE] pairingPointObject; + // ZK: Gemini masking polynomial commitment (sent first, right after public inputs) + G1Point geminiMaskingPoly; + // Commitments to wire polynomials + G1Point w1; + G1Point w2; + G1Point w3; + G1Point w4; + // Commitments to logup witness polynomials + G1Point lookupReadCounts; + G1Point lookupReadTags; + G1Point lookupInverses; + // Commitment to grand permutation polynomial + G1Point zPerm; + G1Point[3] libraCommitments; + // Sumcheck + Fr libraSum; + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH][CONST_PROOF_SIZE_LOG_N] sumcheckUnivariates; + Fr libraEvaluation; + Fr[NUMBER_OF_ENTITIES_ZK] sumcheckEvaluations; // Includes gemini_masking_poly eval at index 0 (first position) + // Shplemini + G1Point[CONST_PROOF_SIZE_LOG_N - 1] geminiFoldComms; + Fr[CONST_PROOF_SIZE_LOG_N] geminiAEvaluations; + Fr[4] libraPolyEvals; + G1Point shplonkQ; + G1Point kzgQuotient; + } +} + +// ZKTranscript library to generate fiat shamir challenges, the ZK transcript only differest +/// forge-lint: disable-next-item(pascal-case-struct) +struct ZKTranscript { + // Oink + Honk.RelationParameters relationParameters; + Fr[NUMBER_OF_ALPHAS] alphas; // Powers of alpha: [alpha, alpha^2, ..., alpha^(NUM_SUBRELATIONS-1)] + Fr[CONST_PROOF_SIZE_LOG_N] gateChallenges; + // Sumcheck + Fr libraChallenge; + Fr[CONST_PROOF_SIZE_LOG_N] sumCheckUChallenges; + // Shplemini + Fr rho; + Fr geminiR; + Fr shplonkNu; + Fr shplonkZ; + // Derived + Fr publicInputsDelta; +} + +library ZKTranscriptLib { + function generateTranscript( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + uint256 logN + ) external pure returns (ZKTranscript memory t) { + Fr previousChallenge; + ( + t.relationParameters, + previousChallenge + ) = generateRelationParametersChallenges( + proof, + publicInputs, + vkHash, + publicInputsSize, + previousChallenge + ); + + (t.alphas, previousChallenge) = generateAlphaChallenges( + previousChallenge, + proof + ); + + (t.gateChallenges, previousChallenge) = generateGateChallenges( + previousChallenge, + logN + ); + (t.libraChallenge, previousChallenge) = generateLibraChallenge( + previousChallenge, + proof + ); + (t.sumCheckUChallenges, previousChallenge) = generateSumcheckChallenges( + proof, + previousChallenge, + logN + ); + + (t.rho, previousChallenge) = generateRhoChallenge( + proof, + previousChallenge + ); + + (t.geminiR, previousChallenge) = generateGeminiRChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkNu, previousChallenge) = generateShplonkNuChallenge( + proof, + previousChallenge, + logN + ); + + (t.shplonkZ, previousChallenge) = generateShplonkZChallenge( + proof, + previousChallenge + ); + return t; + } + + function splitChallenge( + Fr challenge + ) internal pure returns (Fr first, Fr second) { + uint256 challengeU256 = uint256(Fr.unwrap(challenge)); + // Split into two equal 127-bit chunks (254/2) + uint256 lo = challengeU256 & 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; // 127 bits + uint256 hi = challengeU256 >> 127; + first = FrLib.from(lo); + second = FrLib.from(hi); + } + + function generateRelationParametersChallenges( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize, + Fr previousChallenge + ) + internal + pure + returns (Honk.RelationParameters memory rp, Fr nextPreviousChallenge) + { + (rp.eta, previousChallenge) = generateEtaChallenge( + proof, + publicInputs, + vkHash, + publicInputsSize + ); + + ( + rp.beta, + rp.gamma, + nextPreviousChallenge + ) = generateBetaGammaChallenges(previousChallenge, proof); + } + + function generateEtaChallenge( + Honk.ZKProof memory proof, + bytes32[] calldata publicInputs, + uint256 vkHash, + uint256 publicInputsSize + ) internal pure returns (Fr eta, Fr previousChallenge) { + // Size: 1 (vkHash) + publicInputsSize + 8 (geminiMask(2) + 3 wires(6)) + bytes32[] memory round0 = new bytes32[](1 + publicInputsSize + 8); + round0[0] = bytes32(vkHash); + + for (uint256 i = 0; i < publicInputsSize - PAIRING_POINTS_SIZE; i++) { + require(uint256(publicInputs[i]) < P, Errors.ValueGeFieldOrder()); + round0[1 + i] = publicInputs[i]; + } + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + round0[1 + publicInputsSize - PAIRING_POINTS_SIZE + i] = FrLib + .toBytes32(proof.pairingPointObject[i]); + } + + // For ZK flavors: hash the gemini masking poly commitment (sent right after public inputs) + round0[1 + publicInputsSize] = bytes32(proof.geminiMaskingPoly.x); + round0[1 + publicInputsSize + 1] = bytes32(proof.geminiMaskingPoly.y); + + // Create the first challenge + // Note: w4 is added to the challenge later on + round0[1 + publicInputsSize + 2] = bytes32(proof.w1.x); + round0[1 + publicInputsSize + 3] = bytes32(proof.w1.y); + round0[1 + publicInputsSize + 4] = bytes32(proof.w2.x); + round0[1 + publicInputsSize + 5] = bytes32(proof.w2.y); + round0[1 + publicInputsSize + 6] = bytes32(proof.w3.x); + round0[1 + publicInputsSize + 7] = bytes32(proof.w3.y); + + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round0))) % P + ); + (eta, ) = splitChallenge(previousChallenge); + } + + function generateBetaGammaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr beta, Fr gamma, Fr nextPreviousChallenge) { + bytes32[7] memory round1; + round1[0] = FrLib.toBytes32(previousChallenge); + round1[1] = bytes32(proof.lookupReadCounts.x); + round1[2] = bytes32(proof.lookupReadCounts.y); + round1[3] = bytes32(proof.lookupReadTags.x); + round1[4] = bytes32(proof.lookupReadTags.y); + round1[5] = bytes32(proof.w4.x); + round1[6] = bytes32(proof.w4.y); + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(round1))) % P + ); + (beta, gamma) = splitChallenge(nextPreviousChallenge); + } + + // Alpha challenges non-linearise the gate contributions + function generateAlphaChallenges( + Fr previousChallenge, + Honk.ZKProof memory proof + ) + internal + pure + returns (Fr[NUMBER_OF_ALPHAS] memory alphas, Fr nextPreviousChallenge) + { + // Generate the original sumcheck alpha 0 by hashing zPerm and zLookup + uint256[5] memory alpha0; + alpha0[0] = Fr.unwrap(previousChallenge); + alpha0[1] = proof.lookupInverses.x; + alpha0[2] = proof.lookupInverses.y; + alpha0[3] = proof.zPerm.x; + alpha0[4] = proof.zPerm.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(alpha0))) % P + ); + Fr alpha; + (alpha, ) = splitChallenge(nextPreviousChallenge); + + // Compute powers of alpha for batching subrelations + alphas[0] = alpha; + for (uint256 i = 1; i < NUMBER_OF_ALPHAS; i++) { + alphas[i] = alphas[i - 1] * alpha; + } + } + + function generateGateChallenges( + Fr previousChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory gateChallenges, + Fr nextPreviousChallenge + ) + { + previousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(Fr.unwrap(previousChallenge)))) % + P + ); + (gateChallenges[0], ) = splitChallenge(previousChallenge); + for (uint256 i = 1; i < logN; i++) { + gateChallenges[i] = gateChallenges[i - 1] * gateChallenges[i - 1]; + } + nextPreviousChallenge = previousChallenge; + } + + function generateLibraChallenge( + Fr previousChallenge, + Honk.ZKProof memory proof + ) internal pure returns (Fr libraChallenge, Fr nextPreviousChallenge) { + // 2 comm, 1 sum, 1 challenge + uint256[4] memory challengeData; + challengeData[0] = Fr.unwrap(previousChallenge); + challengeData[1] = proof.libraCommitments[0].x; + challengeData[2] = proof.libraCommitments[0].y; + challengeData[3] = Fr.unwrap(proof.libraSum); + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(challengeData))) % P + ); + (libraChallenge, ) = splitChallenge(nextPreviousChallenge); + } + + function generateSumcheckChallenges( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) + internal + pure + returns ( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckChallenges, + Fr nextPreviousChallenge + ) + { + for (uint256 i = 0; i < logN; i++) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH + 1] memory univariateChal; + univariateChal[0] = prevChallenge; + + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + univariateChal[j + 1] = proof.sumcheckUnivariates[i][j]; + } + prevChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(univariateChal))) % P + ); + + (sumcheckChallenges[i], ) = splitChallenge(prevChallenge); + } + nextPreviousChallenge = prevChallenge; + } + + // We add Libra claimed eval + 2 libra commitments (grand_sum, quotient) + function generateRhoChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr rho, Fr nextPreviousChallenge) { + uint256[NUMBER_OF_ENTITIES_ZK + 6] memory rhoChallengeElements; + rhoChallengeElements[0] = Fr.unwrap(prevChallenge); + uint256 i; + for (i = 1; i <= NUMBER_OF_ENTITIES_ZK; i++) { + rhoChallengeElements[i] = Fr.unwrap( + proof.sumcheckEvaluations[i - 1] + ); + } + rhoChallengeElements[i] = Fr.unwrap(proof.libraEvaluation); + i += 1; + rhoChallengeElements[i] = proof.libraCommitments[1].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[1].y; + i += 2; + rhoChallengeElements[i] = proof.libraCommitments[2].x; + rhoChallengeElements[i + 1] = proof.libraCommitments[2].y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(rhoChallengeElements))) % P + ); + (rho, ) = splitChallenge(nextPreviousChallenge); + } + + function generateGeminiRChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr geminiR, Fr nextPreviousChallenge) { + uint256[] memory gR = new uint256[]((logN - 1) * 2 + 1); + gR[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 0; i < logN - 1; i++) { + gR[1 + i * 2] = proof.geminiFoldComms[i].x; + gR[2 + i * 2] = proof.geminiFoldComms[i].y; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(gR))) % P + ); + + (geminiR, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkNuChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge, + uint256 logN + ) internal pure returns (Fr shplonkNu, Fr nextPreviousChallenge) { + uint256[] memory shplonkNuChallengeElements = new uint256[]( + logN + 1 + 4 + ); + shplonkNuChallengeElements[0] = Fr.unwrap(prevChallenge); + + for (uint256 i = 1; i <= logN; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.geminiAEvaluations[i - 1] + ); + } + + uint256 libraIdx = 0; + for (uint256 i = logN + 1; i <= logN + 4; i++) { + shplonkNuChallengeElements[i] = Fr.unwrap( + proof.libraPolyEvals[libraIdx] + ); + libraIdx++; + } + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkNuChallengeElements))) % P + ); + (shplonkNu, ) = splitChallenge(nextPreviousChallenge); + } + + function generateShplonkZChallenge( + Honk.ZKProof memory proof, + Fr prevChallenge + ) internal pure returns (Fr shplonkZ, Fr nextPreviousChallenge) { + uint256[3] memory shplonkZChallengeElements; + shplonkZChallengeElements[0] = Fr.unwrap(prevChallenge); + + shplonkZChallengeElements[1] = proof.shplonkQ.x; + shplonkZChallengeElements[2] = proof.shplonkQ.y; + + nextPreviousChallenge = FrLib.from( + uint256(keccak256(abi.encodePacked(shplonkZChallengeElements))) % P + ); + (shplonkZ, ) = splitChallenge(nextPreviousChallenge); + } + + function loadProof( + bytes calldata proof, + uint256 logN + ) internal pure returns (Honk.ZKProof memory p) { + uint256 boundary = 0x0; + + // Pairing point object + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + uint256 limb = uint256( + bytes32(proof[boundary:boundary + FIELD_ELEMENT_SIZE]) + ); + // lo limbs (even index) < 2^136, hi limbs (odd index) < 2^120 + require( + limb < 2 ** (i % 2 == 0 ? 136 : 120), + Errors.ValueGeLimbMax() + ); + p.pairingPointObject[i] = FrLib.from(limb); + boundary += FIELD_ELEMENT_SIZE; + } + + // Gemini masking polynomial commitment (sent first in ZK flavors, right after pairing points) + p.geminiMaskingPoly = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Commitments + p.w1 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w2 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.w3 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + + // Lookup / Permutation Helper Commitments + p.lookupReadCounts = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.lookupReadTags = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.w4 = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.lookupInverses = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.zPerm = bytesToG1Point(proof[boundary:boundary + GROUP_ELEMENT_SIZE]); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[0] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + p.libraSum = bytesToFr(proof[boundary:boundary + FIELD_ELEMENT_SIZE]); + boundary += FIELD_ELEMENT_SIZE; + // Sumcheck univariates + for (uint256 i = 0; i < logN; i++) { + for (uint256 j = 0; j < ZK_BATCHED_RELATION_PARTIAL_LENGTH; j++) { + p.sumcheckUnivariates[i][j] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + } + + // Sumcheck evaluations (includes gemini_masking_poly eval at index 0 for ZK flavors) + for (uint256 i = 0; i < NUMBER_OF_ENTITIES_ZK; i++) { + p.sumcheckEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + p.libraEvaluation = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + + p.libraCommitments[1] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + p.libraCommitments[2] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + + // Gemini + // Read gemini fold univariates + for (uint256 i = 0; i < logN - 1; i++) { + p.geminiFoldComms[i] = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + } + + // Read gemini a evaluations + for (uint256 i = 0; i < logN; i++) { + p.geminiAEvaluations[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + for (uint256 i = 0; i < 4; i++) { + p.libraPolyEvals[i] = bytesToFr( + proof[boundary:boundary + FIELD_ELEMENT_SIZE] + ); + boundary += FIELD_ELEMENT_SIZE; + } + + // Shplonk + p.shplonkQ = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + boundary += GROUP_ELEMENT_SIZE; + // KZG + p.kzgQuotient = bytesToG1Point( + proof[boundary:boundary + GROUP_ELEMENT_SIZE] + ); + } +} + +library RelationsLib { + struct EllipticParams { + // Points + Fr x_1; + Fr y_1; + Fr x_2; + Fr y_2; + Fr y_3; + Fr x_3; + // push accumulators into memory + Fr x_double_identity; + } + + // Parameters used within the Memory Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct MemParams { + Fr memory_record_check; + Fr partial_record_check; + Fr next_gate_access_type; + Fr record_delta; + Fr index_delta; + Fr adjacent_values_match_if_adjacent_indices_match; + Fr adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation; + Fr access_check; + Fr next_gate_access_type_is_boolean; + Fr ROM_consistency_check_identity; + Fr RAM_consistency_check_identity; + Fr timestamp_delta; + Fr RAM_timestamp_check_identity; + Fr memory_identity; + Fr index_is_monotonically_increasing; + } + + // Parameters used within the Non-Native Field Relation + // A struct is used to work around stack too deep. This relation has alot of variables + struct NnfParams { + Fr limb_subproduct; + Fr non_native_field_gate_1; + Fr non_native_field_gate_2; + Fr non_native_field_gate_3; + Fr limb_accumulator_1; + Fr limb_accumulator_2; + Fr nnf_identity; + } + + struct PoseidonExternalParams { + Fr s1; + Fr s2; + Fr s3; + Fr s4; + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr t0; + Fr t1; + Fr t2; + Fr t3; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr q_pos_by_scaling; + } + + struct PoseidonInternalParams { + Fr u1; + Fr u2; + Fr u3; + Fr u4; + Fr u_sum; + Fr v1; + Fr v2; + Fr v3; + Fr v4; + Fr s1; + Fr q_pos_by_scaling; + } + + Fr internal constant GRUMPKIN_CURVE_B_PARAMETER_NEGATED = Fr.wrap(17); // -(-17) + uint256 internal constant NEG_HALF_MODULO_P = + 0x183227397098d014dc2822db40c0ac2e9419f4243cdcb848a1f0fac9f8000000; + + // Constants for the Non-native Field relation + Fr internal constant LIMB_SIZE = Fr.wrap(uint256(1) << 68); + Fr internal constant SUBLIMB_SHIFT = Fr.wrap(uint256(1) << 14); + + function accumulateRelationEvaluations( + Fr[NUMBER_OF_ENTITIES] memory purportedEvaluations, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges, + Fr powPartialEval + ) external pure returns (Fr accumulator) { + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations; + + // Accumulate all relations in Ultra Honk - each with varying number of subrelations + accumulateArithmeticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePermutationRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateLogDerivativeLookupRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateDeltaRangeRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateEllipticRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulateMemoryRelation( + purportedEvaluations, + rp, + evaluations, + powPartialEval + ); + accumulateNnfRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonExternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + accumulatePoseidonInternalRelation( + purportedEvaluations, + evaluations, + powPartialEval + ); + + // batch the subrelations with the precomputed alpha powers to obtain the full honk relation + accumulator = scaleAndBatchSubrelations( + evaluations, + subrelationChallenges + ); + } + + /** + * Aesthetic helper function that is used to index by enum into proof.sumcheckEvaluations, it avoids + * the relation checking code being cluttered with uint256 type casting, which is often a different colour in code + * editors, and thus is noisy. + */ + function wire( + Fr[NUMBER_OF_ENTITIES] memory p, + WIRE _wire + ) internal pure returns (Fr) { + return p[uint256(_wire)]; + } + + /** + * Ultra Arithmetic Relation + * + */ + function accumulateArithmeticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + // Relation 0 + Fr q_arith = wire(p, WIRE.Q_ARITH); + { + Fr neg_half = Fr.wrap(NEG_HALF_MODULO_P); + + Fr accum = (q_arith - Fr.wrap(3)) * + (wire(p, WIRE.Q_M) * wire(p, WIRE.W_R) * wire(p, WIRE.W_L)) * + neg_half; + accum = + accum + + (wire(p, WIRE.Q_L) * wire(p, WIRE.W_L)) + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_R)) + + (wire(p, WIRE.Q_O) * wire(p, WIRE.W_O)) + + (wire(p, WIRE.Q_4) * wire(p, WIRE.W_4)) + + wire(p, WIRE.Q_C); + accum = accum + (q_arith - ONE) * wire(p, WIRE.W_4_SHIFT); + accum = accum * q_arith; + accum = accum * domainSep; + evals[6] = accum; + } + + // Relation 1 + { + Fr accum = wire(p, WIRE.W_L) + + wire(p, WIRE.W_4) - + wire(p, WIRE.W_L_SHIFT) + + wire(p, WIRE.Q_M); + accum = accum * (q_arith - Fr.wrap(2)); + accum = accum * (q_arith - ONE); + accum = accum * q_arith; + accum = accum * domainSep; + evals[7] = accum; + } + } + + function accumulatePermutationRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr grand_product_numerator; + Fr grand_product_denominator; + + { + Fr num = wire(p, WIRE.W_L) + + wire(p, WIRE.ID_1) * + rp.beta + + rp.gamma; + num = + num * + (wire(p, WIRE.W_R) + wire(p, WIRE.ID_2) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_O) + wire(p, WIRE.ID_3) * rp.beta + rp.gamma); + num = + num * + (wire(p, WIRE.W_4) + wire(p, WIRE.ID_4) * rp.beta + rp.gamma); + + grand_product_numerator = num; + } + { + Fr den = wire(p, WIRE.W_L) + + wire(p, WIRE.SIGMA_1) * + rp.beta + + rp.gamma; + den = + den * + (wire(p, WIRE.W_R) + + wire(p, WIRE.SIGMA_2) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_O) + + wire(p, WIRE.SIGMA_3) * + rp.beta + + rp.gamma); + den = + den * + (wire(p, WIRE.W_4) + + wire(p, WIRE.SIGMA_4) * + rp.beta + + rp.gamma); + + grand_product_denominator = den; + } + + // Contribution 2 + { + Fr acc = (wire(p, WIRE.Z_PERM) + wire(p, WIRE.LAGRANGE_FIRST)) * + grand_product_numerator; + + acc = + acc - + ((wire(p, WIRE.Z_PERM_SHIFT) + + (wire(p, WIRE.LAGRANGE_LAST) * rp.publicInputsDelta)) * + grand_product_denominator); + acc = acc * domainSep; + evals[0] = acc; + } + + // Contribution 3 + { + Fr acc = (wire(p, WIRE.LAGRANGE_LAST) * + wire(p, WIRE.Z_PERM_SHIFT)) * domainSep; + evals[1] = acc; + } + + // Contribution 4: z_perm initialization check (lagrange_first * z_perm = 0) + { + Fr acc = (wire(p, WIRE.LAGRANGE_FIRST) * wire(p, WIRE.Z_PERM)) * + domainSep; + evals[2] = acc; + } + } + + function accumulateLogDerivativeLookupRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr table_term; + Fr lookup_term; + + // Calculate the write term (the table accumulation) + // table_term = table_1 + γ + table_2 * β + table_3 * β² + table_4 * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + table_term = + wire(p, WIRE.TABLE_1) + + rp.gamma + + (wire(p, WIRE.TABLE_2) * rp.beta) + + (wire(p, WIRE.TABLE_3) * beta_sqr) + + (wire(p, WIRE.TABLE_4) * beta_sqr * rp.beta); + } + + // Calculate the read term + // lookup_term = derived_entry_1 + γ + derived_entry_2 * β + derived_entry_3 * β² + q_index * β³ + { + Fr beta_sqr = rp.beta * rp.beta; + Fr derived_entry_1 = wire(p, WIRE.W_L) + + rp.gamma + + (wire(p, WIRE.Q_R) * wire(p, WIRE.W_L_SHIFT)); + Fr derived_entry_2 = wire(p, WIRE.W_R) + + wire(p, WIRE.Q_M) * + wire(p, WIRE.W_R_SHIFT); + Fr derived_entry_3 = wire(p, WIRE.W_O) + + wire(p, WIRE.Q_C) * + wire(p, WIRE.W_O_SHIFT); + + lookup_term = + derived_entry_1 + + (derived_entry_2 * rp.beta) + + (derived_entry_3 * beta_sqr) + + (wire(p, WIRE.Q_O) * beta_sqr * rp.beta); + } + + Fr lookup_inverse = wire(p, WIRE.LOOKUP_INVERSES) * table_term; + Fr table_inverse = wire(p, WIRE.LOOKUP_INVERSES) * lookup_term; + + Fr inverse_exists_xor = wire(p, WIRE.LOOKUP_READ_TAGS) + + wire(p, WIRE.Q_LOOKUP) - + (wire(p, WIRE.LOOKUP_READ_TAGS) * wire(p, WIRE.Q_LOOKUP)); + + // Inverse calculated correctly relation + Fr accumulatorNone = lookup_term * + table_term * + wire(p, WIRE.LOOKUP_INVERSES) - + inverse_exists_xor; + accumulatorNone = accumulatorNone * domainSep; + + // Inverse + Fr accumulatorOne = wire(p, WIRE.Q_LOOKUP) * + lookup_inverse - + wire(p, WIRE.LOOKUP_READ_COUNTS) * + table_inverse; + + Fr read_tag = wire(p, WIRE.LOOKUP_READ_TAGS); + + Fr read_tag_boolean_relation = read_tag * read_tag - read_tag; + + evals[3] = accumulatorNone; + evals[4] = accumulatorOne; + evals[5] = read_tag_boolean_relation * domainSep; + } + + function accumulateDeltaRangeRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + Fr minus_one = ZERO - ONE; + Fr minus_two = ZERO - Fr.wrap(2); + Fr minus_three = ZERO - Fr.wrap(3); + + // Compute wire differences + Fr delta_1 = wire(p, WIRE.W_R) - wire(p, WIRE.W_L); + Fr delta_2 = wire(p, WIRE.W_O) - wire(p, WIRE.W_R); + Fr delta_3 = wire(p, WIRE.W_4) - wire(p, WIRE.W_O); + Fr delta_4 = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_4); + + // Contribution 6 + { + Fr acc = delta_1; + acc = acc * (delta_1 + minus_one); + acc = acc * (delta_1 + minus_two); + acc = acc * (delta_1 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[8] = acc; + } + + // Contribution 7 + { + Fr acc = delta_2; + acc = acc * (delta_2 + minus_one); + acc = acc * (delta_2 + minus_two); + acc = acc * (delta_2 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[9] = acc; + } + + // Contribution 8 + { + Fr acc = delta_3; + acc = acc * (delta_3 + minus_one); + acc = acc * (delta_3 + minus_two); + acc = acc * (delta_3 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[10] = acc; + } + + // Contribution 9 + { + Fr acc = delta_4; + acc = acc * (delta_4 + minus_one); + acc = acc * (delta_4 + minus_two); + acc = acc * (delta_4 + minus_three); + acc = acc * wire(p, WIRE.Q_RANGE); + acc = acc * domainSep; + evals[11] = acc; + } + } + + function accumulateEllipticRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + EllipticParams memory ep; + ep.x_1 = wire(p, WIRE.W_R); + ep.y_1 = wire(p, WIRE.W_O); + + ep.x_2 = wire(p, WIRE.W_L_SHIFT); + ep.y_2 = wire(p, WIRE.W_4_SHIFT); + ep.y_3 = wire(p, WIRE.W_O_SHIFT); + ep.x_3 = wire(p, WIRE.W_R_SHIFT); + + Fr q_sign = wire(p, WIRE.Q_L); + Fr q_is_double = wire(p, WIRE.Q_M); + + // Contribution 10 point addition, x-coordinate check + // q_elliptic * (x3 + x2 + x1)(x2 - x1)(x2 - x1) - y2^2 - y1^2 + 2(y2y1)*q_sign = 0 + Fr x_diff = (ep.x_2 - ep.x_1); + Fr y1_sqr = (ep.y_1 * ep.y_1); + { + // Move to top + Fr partialEval = domainSep; + + Fr y2_sqr = (ep.y_2 * ep.y_2); + Fr y1y2 = ep.y_1 * ep.y_2 * q_sign; + Fr x_add_identity = (ep.x_3 + ep.x_2 + ep.x_1); + x_add_identity = x_add_identity * x_diff * x_diff; + x_add_identity = x_add_identity - y2_sqr - y1_sqr + y1y2 + y1y2; + + evals[12] = + x_add_identity * + partialEval * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 11 point addition, x-coordinate check + // q_elliptic * (q_sign * y1 + y3)(x2 - x1) + (x3 - x1)(y2 - q_sign * y1) = 0 + { + Fr y1_plus_y3 = ep.y_1 + ep.y_3; + Fr y_diff = ep.y_2 * q_sign - ep.y_1; + Fr y_add_identity = y1_plus_y3 * + x_diff + + (ep.x_3 - ep.x_1) * + y_diff; + evals[13] = + y_add_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + (ONE - q_is_double); + } + + // Contribution 10 point doubling, x-coordinate check + // (x3 + x1 + x1) (4y1*y1) - 9 * x1 * x1 * x1 * x1 = 0 + // N.B. we're using the equivalence x1*x1*x1 === y1*y1 - curve_b to reduce degree by 1 + { + Fr x_pow_4 = (y1_sqr + GRUMPKIN_CURVE_B_PARAMETER_NEGATED) * ep.x_1; + Fr y1_sqr_mul_4 = y1_sqr + y1_sqr; + y1_sqr_mul_4 = y1_sqr_mul_4 + y1_sqr_mul_4; + Fr x1_pow_4_mul_9 = x_pow_4 * Fr.wrap(9); + + // NOTE: pushed into memory (stack >:'( ) + ep.x_double_identity = + (ep.x_3 + ep.x_1 + ep.x_1) * + y1_sqr_mul_4 - + x1_pow_4_mul_9; + + Fr acc = ep.x_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + evals[12] = evals[12] + acc; + } + + // Contribution 11 point doubling, y-coordinate check + // (y1 + y1) (2y1) - (3 * x1 * x1)(x1 - x3) = 0 + { + Fr x1_sqr_mul_3 = (ep.x_1 + ep.x_1 + ep.x_1) * ep.x_1; + Fr y_double_identity = x1_sqr_mul_3 * + (ep.x_1 - ep.x_3) - + (ep.y_1 + ep.y_1) * + (ep.y_1 + ep.y_3); + evals[13] = + evals[13] + + y_double_identity * + domainSep * + wire(p, WIRE.Q_ELLIPTIC) * + q_is_double; + } + } + + function accumulateMemoryRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Honk.RelationParameters memory rp, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + MemParams memory ap; + + // Compute eta powers locally + Fr eta_two = rp.eta * rp.eta; + Fr eta_three = eta_two * rp.eta; + + /** + * MEMORY + * + * A RAM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * t: `timestamp` of memory cell being accessed (used for RAM, set to 0 for ROM) + * * v: `value` of memory cell being accessed + * * a: `access` type of record. read: 0 = read, 1 = write + * * r: `record` of memory cell. record = access + index * eta + timestamp * eta_two + value * eta_three + * + * A ROM memory record contains a tuple of the following fields: + * * i: `index` of memory cell being accessed + * * v: `value1` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * v2:`value2` of memory cell being accessed (ROM tables can store up to 2 values per index) + * * r: `record` of memory cell. record = index * eta + value2 * eta_two + value1 * eta_three + * + * When performing a read/write access, the values of i, t, v, v2, a, r are stored in the following wires + + * selectors, depending on whether the gate is a RAM read/write or a ROM read + * + * | gate type | i | v2/t | v | a | r | + * | --------- | -- | ----- | -- | -- | -- | + * | ROM | w1 | w2 | w3 | -- | w4 | + * | RAM | w1 | w2 | w3 | qc | w4 | + * + * (for accesses where `index` is a circuit constant, it is assumed the circuit will apply a copy constraint on + * `w2` to fix its value) + * + * + */ + + /** + * Memory Record Check + * Partial degree: 1 + * Total degree: 4 + * + * A ROM/ROM access gate can be evaluated with the identity: + * + * qc + w1 \eta + w2 \eta_two + w3 \eta_three - w4 = 0 + * + * For ROM gates, qc = 0 + */ + ap.memory_record_check = wire(p, WIRE.W_O) * eta_three; + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_R) * eta_two); + ap.memory_record_check = + ap.memory_record_check + + (wire(p, WIRE.W_L) * rp.eta); + ap.memory_record_check = ap.memory_record_check + wire(p, WIRE.Q_C); + ap.partial_record_check = ap.memory_record_check; // used in RAM consistency check; deg 1 or 4 + ap.memory_record_check = ap.memory_record_check - wire(p, WIRE.W_4); + + /** + * Contribution 13 & 14 + * ROM Consistency Check + * Partial degree: 1 + * Total degree: 4 + * + * For every ROM read, a set equivalence check is applied between the record witnesses, and a second set of + * records that are sorted. + * + * We apply the following checks for the sorted records: + * + * 1. w1, w2, w3 correctly map to 'index', 'v1, 'v2' for a given record value at w4 + * 2. index values for adjacent records are monotonically increasing + * 3. if, at gate i, index_i == index_{i + 1}, then value1_i == value1_{i + 1} and value2_i == value2_{i + 1} + * + */ + ap.index_delta = wire(p, WIRE.W_L_SHIFT) - wire(p, WIRE.W_L); + ap.record_delta = wire(p, WIRE.W_4_SHIFT) - wire(p, WIRE.W_4); + + ap.index_is_monotonically_increasing = + ap.index_delta * + (ap.index_delta - Fr.wrap(1)); // deg 2 + + ap.adjacent_values_match_if_adjacent_indices_match = + (ap.index_delta * MINUS_ONE + ONE) * + ap.record_delta; // deg 2 + + evals[15] = + ap.adjacent_values_match_if_adjacent_indices_match * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + evals[16] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 + + ap.ROM_consistency_check_identity = + ap.memory_record_check * + (wire(p, WIRE.Q_L) * wire(p, WIRE.Q_R)); // deg 3 or 7 + + /** + * Contributions 15,16,17 + * RAM Consistency Check + * + * The 'access' type of the record is extracted with the expression `w_4 - ap.partial_record_check` + * (i.e. for an honest Prover `w1 * eta + w2 * eta^2 + w3 * eta^3 - w4 = access`. + * This is validated by requiring `access` to be boolean + * + * For two adjacent entries in the sorted list if _both_ + * A) index values match + * B) adjacent access value is 0 (i.e. next gate is a READ) + * then + * C) both values must match. + * The gate boolean check is + * (A && B) => C === !(A && B) || C === !A || !B || C + * + * N.B. it is the responsibility of the circuit writer to ensure that every RAM cell is initialized + * with a WRITE operation. + */ + Fr access_type = (wire(p, WIRE.W_4) - ap.partial_record_check); // will be 0 or 1 for honest Prover; deg 1 or 4 + ap.access_check = access_type * (access_type - Fr.wrap(1)); // check value is 0 or 1; deg 2 or 8 + + // reverse order we could re-use `ap.partial_record_check` 1 - ((w3' * eta + w2') * eta + w1') * eta + // deg 1 or 4 + ap.next_gate_access_type = wire(p, WIRE.W_O_SHIFT) * eta_three; + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_R_SHIFT) * eta_two); + ap.next_gate_access_type = + ap.next_gate_access_type + + (wire(p, WIRE.W_L_SHIFT) * rp.eta); + ap.next_gate_access_type = + wire(p, WIRE.W_4_SHIFT) - + ap.next_gate_access_type; + + Fr value_delta = wire(p, WIRE.W_O_SHIFT) - wire(p, WIRE.W_O); + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation = + (ap.index_delta * MINUS_ONE + ONE) * + value_delta * + (ap.next_gate_access_type * MINUS_ONE + ONE); // deg 3 or 6 + + // We can't apply the RAM consistency check identity on the final entry in the sorted list (the wires in the + // next gate would make the identity fail). We need to validate that its 'access type' bool is correct. Can't + // do with an arithmetic gate because of the `eta` factors. We need to check that the *next* gate's access + // type is correct, to cover this edge case + // deg 2 or 4 + ap.next_gate_access_type_is_boolean = + ap.next_gate_access_type * + ap.next_gate_access_type - + ap.next_gate_access_type; + + // Putting it all together... + evals[17] = + ap + .adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 5 or 8 + evals[18] = + ap.index_is_monotonically_increasing * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 + evals[19] = + ap.next_gate_access_type_is_boolean * + (wire(p, WIRE.Q_O)) * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 6 + + ap.RAM_consistency_check_identity = + ap.access_check * + (wire(p, WIRE.Q_O)); // deg 3 or 9 + + /** + * RAM Timestamp Consistency Check + * + * | w1 | w2 | w3 | w4 | + * | index | timestamp | timestamp_check | -- | + * + * Let delta_index = index_{i + 1} - index_{i} + * + * Iff delta_index == 0, timestamp_check = timestamp_{i + 1} - timestamp_i + * Else timestamp_check = 0 + */ + ap.timestamp_delta = wire(p, WIRE.W_R_SHIFT) - wire(p, WIRE.W_R); + ap.RAM_timestamp_check_identity = + (ap.index_delta * MINUS_ONE + ONE) * + ap.timestamp_delta - + wire(p, WIRE.W_O); // deg 3 + + /** + * Complete Contribution 12 + * The complete RAM/ROM memory identity + * Partial degree: + */ + ap.memory_identity = ap.ROM_consistency_check_identity; // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_timestamp_check_identity * + (wire(p, WIRE.Q_4) * wire(p, WIRE.Q_L)); // deg 4 + ap.memory_identity = + ap.memory_identity + + ap.memory_record_check * + (wire(p, WIRE.Q_M) * wire(p, WIRE.Q_L)); // deg 3 or 6 + ap.memory_identity = + ap.memory_identity + + ap.RAM_consistency_check_identity; // deg 3 or 9 + + // (deg 3 or 9) + (deg 4) + (deg 3) + ap.memory_identity = + ap.memory_identity * + (wire(p, WIRE.Q_MEMORY) * domainSep); // deg 4 or 10 + evals[14] = ap.memory_identity; + } + + function accumulateNnfRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + NnfParams memory ap; + + /** + * Contribution 12 + * Non native field arithmetic gate 2 + * deg 4 + * + * _ _ + * / _ _ _ 14 \ + * q_2 . q_4 | (w_1 . w_2) + (w_1 . w_2) + (w_1 . w_4 + w_2 . w_3 - w_3) . 2 - w_3 - w_4 | + * \_ _/ + * + * + */ + ap.limb_subproduct = + wire(p, WIRE.W_L) * + wire(p, WIRE.W_R_SHIFT) + + wire(p, WIRE.W_L_SHIFT) * + wire(p, WIRE.W_R); + ap.non_native_field_gate_2 = (wire(p, WIRE.W_L) * + wire(p, WIRE.W_4) + + wire(p, WIRE.W_R) * + wire(p, WIRE.W_O) - + wire(p, WIRE.W_O_SHIFT)); + ap.non_native_field_gate_2 = ap.non_native_field_gate_2 * LIMB_SIZE; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 - + wire(p, WIRE.W_4_SHIFT); + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 + + ap.limb_subproduct; + ap.non_native_field_gate_2 = + ap.non_native_field_gate_2 * + wire(p, WIRE.Q_4); + + ap.limb_subproduct = ap.limb_subproduct * LIMB_SIZE; + ap.limb_subproduct = + ap.limb_subproduct + + (wire(p, WIRE.W_L_SHIFT) * wire(p, WIRE.W_R_SHIFT)); + ap.non_native_field_gate_1 = ap.limb_subproduct; + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 - + (wire(p, WIRE.W_O) + wire(p, WIRE.W_4)); + ap.non_native_field_gate_1 = + ap.non_native_field_gate_1 * + wire(p, WIRE.Q_O); + + ap.non_native_field_gate_3 = ap.limb_subproduct; + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 + + wire(p, WIRE.W_4); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 - + (wire(p, WIRE.W_O_SHIFT) + wire(p, WIRE.W_4_SHIFT)); + ap.non_native_field_gate_3 = + ap.non_native_field_gate_3 * + wire(p, WIRE.Q_M); + + Fr non_native_field_identity = ap.non_native_field_gate_1 + + ap.non_native_field_gate_2 + + ap.non_native_field_gate_3; + non_native_field_identity = + non_native_field_identity * + wire(p, WIRE.Q_R); + + // ((((w2' * 2^14 + w1') * 2^14 + w3) * 2^14 + w2) * 2^14 + w1 - w4) * qm + // deg 2 + ap.limb_accumulator_1 = wire(p, WIRE.W_R_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_O); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_R); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * SUBLIMB_SHIFT; + ap.limb_accumulator_1 = ap.limb_accumulator_1 + wire(p, WIRE.W_L); + ap.limb_accumulator_1 = ap.limb_accumulator_1 - wire(p, WIRE.W_4); + ap.limb_accumulator_1 = ap.limb_accumulator_1 * wire(p, WIRE.Q_4); + + // ((((w3' * 2^14 + w2') * 2^14 + w1') * 2^14 + w4) * 2^14 + w3 - w4') * qm + // deg 2 + ap.limb_accumulator_2 = wire(p, WIRE.W_O_SHIFT) * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_R_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_L_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_4); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * SUBLIMB_SHIFT; + ap.limb_accumulator_2 = ap.limb_accumulator_2 + wire(p, WIRE.W_O); + ap.limb_accumulator_2 = ap.limb_accumulator_2 - wire(p, WIRE.W_4_SHIFT); + ap.limb_accumulator_2 = ap.limb_accumulator_2 * wire(p, WIRE.Q_M); + + Fr limb_accumulator_identity = ap.limb_accumulator_1 + + ap.limb_accumulator_2; + limb_accumulator_identity = + limb_accumulator_identity * + wire(p, WIRE.Q_O); // deg 3 + + ap.nnf_identity = non_native_field_identity + limb_accumulator_identity; + ap.nnf_identity = ap.nnf_identity * (wire(p, WIRE.Q_NNF) * domainSep); + evals[20] = ap.nnf_identity; + } + + function accumulatePoseidonExternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonExternalParams memory ep; + + ep.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + ep.s2 = wire(p, WIRE.W_R) + wire(p, WIRE.Q_R); + ep.s3 = wire(p, WIRE.W_O) + wire(p, WIRE.Q_O); + ep.s4 = wire(p, WIRE.W_4) + wire(p, WIRE.Q_4); + + ep.u1 = ep.s1 * ep.s1 * ep.s1 * ep.s1 * ep.s1; + ep.u2 = ep.s2 * ep.s2 * ep.s2 * ep.s2 * ep.s2; + ep.u3 = ep.s3 * ep.s3 * ep.s3 * ep.s3 * ep.s3; + ep.u4 = ep.s4 * ep.s4 * ep.s4 * ep.s4 * ep.s4; + // matrix mul v = M_E * u with 14 additions + ep.t0 = ep.u1 + ep.u2; // u_1 + u_2 + ep.t1 = ep.u3 + ep.u4; // u_3 + u_4 + ep.t2 = ep.u2 + ep.u2 + ep.t1; // 2u_2 + // ep.t2 += ep.t1; // 2u_2 + u_3 + u_4 + ep.t3 = ep.u4 + ep.u4 + ep.t0; // 2u_4 + // ep.t3 += ep.t0; // u_1 + u_2 + 2u_4 + ep.v4 = ep.t1 + ep.t1; + ep.v4 = ep.v4 + ep.v4 + ep.t3; + // ep.v4 += ep.t3; // u_1 + u_2 + 4u_3 + 6u_4 + ep.v2 = ep.t0 + ep.t0; + ep.v2 = ep.v2 + ep.v2 + ep.t2; + // ep.v2 += ep.t2; // 4u_1 + 6u_2 + u_3 + u_4 + ep.v1 = ep.t3 + ep.v2; // 5u_1 + 7u_2 + u_3 + 3u_4 + ep.v3 = ep.t2 + ep.v4; // u_1 + 3u_2 + 5u_3 + 7u_4 + + ep.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_EXTERNAL) * domainSep; + evals[21] = + evals[21] + + ep.q_pos_by_scaling * + (ep.v1 - wire(p, WIRE.W_L_SHIFT)); + + evals[22] = + evals[22] + + ep.q_pos_by_scaling * + (ep.v2 - wire(p, WIRE.W_R_SHIFT)); + + evals[23] = + evals[23] + + ep.q_pos_by_scaling * + (ep.v3 - wire(p, WIRE.W_O_SHIFT)); + + evals[24] = + evals[24] + + ep.q_pos_by_scaling * + (ep.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + function accumulatePoseidonInternalRelation( + Fr[NUMBER_OF_ENTITIES] memory p, + Fr[NUMBER_OF_SUBRELATIONS] memory evals, + Fr domainSep + ) internal pure { + PoseidonInternalParams memory ip; + + Fr[4] memory INTERNAL_MATRIX_DIAGONAL = [ + FrLib.from( + 0x10dc6e9c006ea38b04b1e03b4bd9490c0d03f98929ca1d7fb56821fd19d3b6e7 + ), + FrLib.from( + 0x0c28145b6a44df3e0149b3d0a30b3bb599df9756d4dd9b84a86b38cfb45a740b + ), + FrLib.from( + 0x00544b8338791518b2c7645a50392798b21f75bb60e3596170067d00141cac15 + ), + FrLib.from( + 0x222c01175718386f2e2e82eb122789e352e105a3b8fa852613bc534433ee428b + ) + ]; + + // add round constants + ip.s1 = wire(p, WIRE.W_L) + wire(p, WIRE.Q_L); + + // apply s-box round + ip.u1 = ip.s1 * ip.s1 * ip.s1 * ip.s1 * ip.s1; + ip.u2 = wire(p, WIRE.W_R); + ip.u3 = wire(p, WIRE.W_O); + ip.u4 = wire(p, WIRE.W_4); + + // matrix mul with v = M_I * u 4 muls and 7 additions + ip.u_sum = ip.u1 + ip.u2 + ip.u3 + ip.u4; + + ip.q_pos_by_scaling = wire(p, WIRE.Q_POSEIDON2_INTERNAL) * domainSep; + + ip.v1 = ip.u1 * INTERNAL_MATRIX_DIAGONAL[0] + ip.u_sum; + evals[25] = + evals[25] + + ip.q_pos_by_scaling * + (ip.v1 - wire(p, WIRE.W_L_SHIFT)); + + ip.v2 = ip.u2 * INTERNAL_MATRIX_DIAGONAL[1] + ip.u_sum; + evals[26] = + evals[26] + + ip.q_pos_by_scaling * + (ip.v2 - wire(p, WIRE.W_R_SHIFT)); + + ip.v3 = ip.u3 * INTERNAL_MATRIX_DIAGONAL[2] + ip.u_sum; + evals[27] = + evals[27] + + ip.q_pos_by_scaling * + (ip.v3 - wire(p, WIRE.W_O_SHIFT)); + + ip.v4 = ip.u4 * INTERNAL_MATRIX_DIAGONAL[3] + ip.u_sum; + evals[28] = + evals[28] + + ip.q_pos_by_scaling * + (ip.v4 - wire(p, WIRE.W_4_SHIFT)); + } + + // Batch subrelation evaluations using precomputed powers of alpha + // First subrelation is implicitly scaled by 1, subsequent ones use powers from the subrelationChallenges array + function scaleAndBatchSubrelations( + Fr[NUMBER_OF_SUBRELATIONS] memory evaluations, + Fr[NUMBER_OF_ALPHAS] memory subrelationChallenges + ) internal pure returns (Fr accumulator) { + accumulator = evaluations[0]; + + for (uint256 i = 1; i < NUMBER_OF_SUBRELATIONS; ++i) { + accumulator = + accumulator + + evaluations[i] * + subrelationChallenges[i - 1]; + } + } +} + +library CommitmentSchemeLib { + using FrLib for Fr; + + // Avoid stack too deep + struct ShpleminiIntermediates { + Fr unshiftedScalar; + Fr shiftedScalar; + Fr unshiftedScalarNeg; + Fr shiftedScalarNeg; + // Scalar to be multiplied by [1]₁ + Fr constantTermAccumulator; + // Accumulator for powers of rho + Fr batchingChallenge; + // Linear combination of multilinear (sumcheck) evaluations and powers of rho + Fr batchedEvaluation; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] denominators; + Fr[NUM_SMALL_IPA_OPENING_CLAIMS] batchingScalars; + // 1/(z - r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr posInvertedDenominator; + // 1/(z + r^{2^i}) for i = 0, ..., logSize, dynamically updated + Fr negInvertedDenominator; + // ν^{2i} * 1/(z - r^{2^i}) + Fr scalingFactorPos; + // ν^{2i+1} * 1/(z + r^{2^i}) + Fr scalingFactorNeg; + // Fold_i(r^{2^i}) reconstructed by Verifier + Fr[] foldPosEvaluations; + } + + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., m-1 + function computeFoldPosEvaluations( + Fr[CONST_PROOF_SIZE_LOG_N] memory sumcheckUChallenges, + Fr batchedEvalAccumulator, + Fr[CONST_PROOF_SIZE_LOG_N] memory geminiEvaluations, + Fr[] memory geminiEvalChallengePowers, + uint256 logSize + ) internal view returns (Fr[] memory) { + Fr[] memory foldPosEvaluations = new Fr[](logSize); + for (uint256 i = logSize; i > 0; --i) { + Fr challengePower = geminiEvalChallengePowers[i - 1]; + Fr u = sumcheckUChallenges[i - 1]; + + Fr batchedEvalRoundAcc = ((challengePower * + batchedEvalAccumulator * + Fr.wrap(2)) - + geminiEvaluations[i - 1] * + (challengePower * (ONE - u) - u)); + // Divide by the denominator + batchedEvalRoundAcc = + batchedEvalRoundAcc * + (challengePower * (ONE - u) + u).invert(); + + batchedEvalAccumulator = batchedEvalRoundAcc; + foldPosEvaluations[i - 1] = batchedEvalRoundAcc; + } + return foldPosEvaluations; + } + + function computeSquares( + Fr r, + uint256 logN + ) internal pure returns (Fr[] memory) { + Fr[] memory squares = new Fr[](logN); + squares[0] = r; + for (uint256 i = 1; i < logN; ++i) { + squares[i] = squares[i - 1].sqr(); + } + return squares; + } +} + +uint256 constant Q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // EC group order. F_q + +// Fr utility + +function bytesToFr(bytes calldata proofSection) pure returns (Fr scalar) { + scalar = FrLib.fromBytes32(bytes32(proofSection)); +} + +// EC Point utilities +function bytesToG1Point( + bytes calldata proofSection +) pure returns (Honk.G1Point memory point) { + uint256 x = uint256(bytes32(proofSection[0x00:0x20])); + uint256 y = uint256(bytes32(proofSection[0x20:0x40])); + require(x < Q && y < Q, Errors.ValueGeGroupOrder()); + + // (0,0) is the canonical EIP-196 encoding of the identity. It is accepted here + // because polynomial commitments to identically-zero polynomials (e.g. unused + // selector or table polys) are legitimately the identity. On-curve validation + // (y² = x³ + 3) is handled by the ecAdd/ecMul precompiles per EIP-196. + point = Honk.G1Point({ x: x, y: y }); +} + +function negateInplace( + Honk.G1Point memory point +) pure returns (Honk.G1Point memory) { + // When y == 0 (order-2 point), negation is the same point. Q - 0 = Q which is >= Q. + if (point.y != 0) { + point.y = Q - point.y; + } + return point; +} + +/** + * Convert the pairing points to G1 points. + * + * The pairing points are serialised as an array of 2 limbs representing two points + * (P0 and P1, used for lhs and rhs of pairing operation). + * + * There are 2 limbs (lo, hi) for each coordinate, so 4 limbs per point, 8 total. + * Layout: [P0.x_lo, P0.x_hi, P0.y_lo, P0.y_hi, P1.x_lo, P1.x_hi, P1.y_lo, P1.y_hi] + * + * @param pairingPoints The pairing points to convert. + * @return lhs P0 point + * @return rhs P1 point + */ +function convertPairingPointsToG1( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (Honk.G1Point memory lhs, Honk.G1Point memory rhs) { + // P0 (lhs): x = lo | (hi << 136) + uint256 lhsX = Fr.unwrap(pairingPoints[0]); + lhsX |= Fr.unwrap(pairingPoints[1]) << 136; + + uint256 lhsY = Fr.unwrap(pairingPoints[2]); + lhsY |= Fr.unwrap(pairingPoints[3]) << 136; + + // P1 (rhs): x = lo | (hi << 136) + uint256 rhsX = Fr.unwrap(pairingPoints[4]); + rhsX |= Fr.unwrap(pairingPoints[5]) << 136; + + uint256 rhsY = Fr.unwrap(pairingPoints[6]); + rhsY |= Fr.unwrap(pairingPoints[7]) << 136; + + // Reconstructed coordinates must be < Q to prevent malleability. + // Without this, two different limb encodings could map to the same curve point + // (via mulmod reduction in on-curve checks) but produce different transcript hashes. + require( + lhsX < Q && lhsY < Q && rhsX < Q && rhsY < Q, + Errors.ValueGeGroupOrder() + ); + + lhs.x = lhsX; + lhs.y = lhsY; + rhs.x = rhsX; + rhs.y = rhsY; +} + +/** + * Hash the pairing inputs from the present verification context with those extracted from the public inputs. + * + * @param proofPairingPoints Pairing points from the proof - (public inputs). + * @param accLhs Accumulator point for the left side - result of shplemini. + * @param accRhs Accumulator point for the right side - result of shplemini. + * @return recursionSeparator The recursion separator - generated from hashing the above. + */ +function generateRecursionSeparator( + Fr[PAIRING_POINTS_SIZE] memory proofPairingPoints, + Honk.G1Point memory accLhs, + Honk.G1Point memory accRhs +) pure returns (Fr recursionSeparator) { + // hash the proof aggregated X + // hash the proof aggregated Y + // hash the accum X + // hash the accum Y + + ( + Honk.G1Point memory proofLhs, + Honk.G1Point memory proofRhs + ) = convertPairingPointsToG1(proofPairingPoints); + + uint256[8] memory recursionSeparatorElements; + + // Proof points + recursionSeparatorElements[0] = proofLhs.x; + recursionSeparatorElements[1] = proofLhs.y; + recursionSeparatorElements[2] = proofRhs.x; + recursionSeparatorElements[3] = proofRhs.y; + + // Accumulator points + recursionSeparatorElements[4] = accLhs.x; + recursionSeparatorElements[5] = accLhs.y; + recursionSeparatorElements[6] = accRhs.x; + recursionSeparatorElements[7] = accRhs.y; + + recursionSeparator = FrLib.from( + uint256(keccak256(abi.encodePacked(recursionSeparatorElements))) % P + ); +} + +/** + * G1 Mul with Separator + * Using the ecAdd and ecMul precompiles + * + * @param basePoint The point to multiply. + * @param other The other point to add. + * @param recursionSeperator The separator to use for the multiplication. + * @return `(recursionSeperator * basePoint) + other`. + */ +function mulWithSeperator( + Honk.G1Point memory basePoint, + Honk.G1Point memory other, + Fr recursionSeperator +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + result = ecMul(recursionSeperator, basePoint); + result = ecAdd(result, other); + + return result; +} + +/** + * G1 Mul + * Takes a Fr value and a G1 point and uses the ecMul precompile to return the result. + * + * @param value The value to multiply the point by. + * @param point The point to multiply. + * @return result The result of the multiplication. + */ +function ecMul( + Fr value, + Honk.G1Point memory point +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write the point into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | point.x + // free + 0x20| point.y + mstore(free, mload(point)) + mstore(add(free, 0x20), mload(add(point, 0x20))) + // Write the scalar into memory (one 32 byte word) + // Memory layout: + // Address | value + // free + 0x40| value + mstore(add(free, 0x40), value) + + // Call the ecMul precompile, it takes in the following + // [point.x, point.y, scalar], and returns the result back into the free memory location. + let success := staticcall(gas(), 0x07, free, 0x60, free, 0x40) + if iszero(success) { + revert(0, 0) + } + // Copy the result of the multiplication back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x60)) + } + + return result; +} + +/** + * G1 Add + * Takes two G1 points and uses the ecAdd precompile to return the result. + * + * @param lhs The left hand side of the addition. + * @param rhs The right hand side of the addition. + * @return result The result of the addition. + */ +function ecAdd( + Honk.G1Point memory lhs, + Honk.G1Point memory rhs +) view returns (Honk.G1Point memory) { + Honk.G1Point memory result; + + assembly { + let free := mload(0x40) + // Write lhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free | lhs.x + // free + 0x20| lhs.y + mstore(free, mload(lhs)) + mstore(add(free, 0x20), mload(add(lhs, 0x20))) + + // Write rhs into memory (two 32 byte words) + // Memory layout: + // Address | value + // free + 0x40| rhs.x + // free + 0x60| rhs.y + mstore(add(free, 0x40), mload(rhs)) + mstore(add(free, 0x60), mload(add(rhs, 0x20))) + + // Call the ecAdd precompile, it takes in the following + // [lhs.x, lhs.y, rhs.x, rhs.y], and returns their addition back into the free memory location. + let success := staticcall(gas(), 0x06, free, 0x80, free, 0x40) + if iszero(success) { + revert(0, 0) + } + + // Copy the result of the addition back into the result memory location. + // Memory layout: + // Address | value + // result | result.x + // result + 0x20| result.y + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + + mstore(0x40, add(free, 0x80)) + } + + return result; +} + +function rejectPointAtInfinity(Honk.G1Point memory point) pure { + require((point.x | point.y) != 0, Errors.PointAtInfinity()); +} + +/** + * Check if pairing point limbs are all zero (default/infinity). + * Default pairing points indicate no recursive verification occurred. + */ +function arePairingPointsDefault( + Fr[PAIRING_POINTS_SIZE] memory pairingPoints +) pure returns (bool) { + uint256 acc = 0; + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + acc |= Fr.unwrap(pairingPoints[i]); + } + return acc == 0; +} + +function pairing( + Honk.G1Point memory rhs, + Honk.G1Point memory lhs +) view returns (bool decodedResult) { + bytes memory input = abi.encodePacked( + rhs.x, + rhs.y, + // Fixed G2 point + uint256( + 0x198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2 + ), + uint256( + 0x1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed + ), + uint256( + 0x090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b + ), + uint256( + 0x12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa + ), + lhs.x, + lhs.y, + // G2 point from VK + uint256( + 0x260e01b251f6f1c7e7ff4e580791dee8ea51d87a358e038b4efe30fac09383c1 + ), + uint256( + 0x0118c4d5b837bcc2bc89b5b398b5974e9f5944073b32078b7e231fec938883b0 + ), + uint256( + 0x04fc6369f7110fe3d25156c1bb9a72859cf2a04641f99ba4ee413c80da6a5fe4 + ), + uint256( + 0x22febda3c0c0632a56475b4214e5615e11e6dd3f96e6cea2854a87d4dacc5e55 + ) + ); + + (bool success, bytes memory result) = address(0x08).staticcall(input); + decodedResult = success && abi.decode(result, (bool)); +} + +abstract contract BaseZKHonkVerifier is IVerifier { + using FrLib for Fr; + + struct PairingInputs { + Honk.G1Point P_0; + Honk.G1Point P_1; + } + + struct SmallSubgroupIpaIntermediates { + Fr[SUBGROUP_SIZE] challengePolyLagrange; + Fr challengePolyEval; + Fr lagrangeFirst; + Fr lagrangeLast; + Fr rootPower; + Fr[SUBGROUP_SIZE] denominators; // this has to disappear + Fr diff; + } + + // Constants for proof length calculation (matching UltraKeccakZKFlavor) + uint256 internal constant NUM_WITNESS_ENTITIES = + 8 + NUM_MASKING_POLYNOMIALS; + uint256 internal constant NUM_ELEMENTS_COMM = 2; // uint256 elements for curve points + uint256 internal constant NUM_ELEMENTS_FR = 1; // uint256 elements for field elements + uint256 internal constant NUM_LIBRA_EVALUATIONS = 4; // libra evaluations + + uint256 internal constant LIBRA_COMMITMENTS = 3; + uint256 internal constant LIBRA_EVALUATIONS = 4; + uint256 internal constant LIBRA_UNIVARIATES_LENGTH = 9; + + uint256 internal constant SHIFTED_COMMITMENTS_START = 30; + uint256 internal constant PERMUTATION_ARGUMENT_VALUE_SEPARATOR = 1 << 28; + + uint256 internal immutable $N; + uint256 internal immutable $LOG_N; + uint256 internal immutable $VK_HASH; + uint256 internal immutable $NUM_PUBLIC_INPUTS; + uint256 internal immutable $MSMSize; + + constructor( + uint256 _N, + uint256 _logN, + uint256 _vkHash, + uint256 _numPublicInputs + ) { + $N = _N; + $LOG_N = _logN; + $VK_HASH = _vkHash; + $NUM_PUBLIC_INPUTS = _numPublicInputs; + $MSMSize = NUMBER_UNSHIFTED_ZK + _logN + LIBRA_COMMITMENTS + 2; + } + + function validateVerificationKey( + Honk.VerificationKey memory vk + ) internal view { + require( + $N == vk.circuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $LOG_N == vk.logCircuitSize, + Errors.VerificationKeyConfigurationMismatch() + ); + require( + $NUM_PUBLIC_INPUTS == vk.publicInputsSize, + Errors.VerificationKeyConfigurationMismatch() + ); + } + + function verify( + bytes calldata proof, + bytes32[] calldata publicInputs + ) public view override returns (bool verified) { + // Calculate expected proof size based on $LOG_N + uint256 expectedProofSize = calculateProofSize($LOG_N); + + // Check the received proof is the expected size where each field element is 32 bytes + require( + proof.length == expectedProofSize, + Errors.ProofLengthWrongWithLogN( + $LOG_N, + proof.length, + expectedProofSize + ) + ); + + Honk.VerificationKey memory vk = loadVerificationKey(); + Honk.ZKProof memory p = ZKTranscriptLib.loadProof(proof, $LOG_N); + + require( + publicInputs.length == vk.publicInputsSize - PAIRING_POINTS_SIZE, + Errors.PublicInputsLengthWrong() + ); + + // Generate the fiat shamir challenges for the whole protocol + ZKTranscript memory t = ZKTranscriptLib.generateTranscript( + p, + publicInputs, + $VK_HASH, + $NUM_PUBLIC_INPUTS, + $LOG_N + ); + + // Derive public input delta + t.relationParameters.publicInputsDelta = computePublicInputDelta( + publicInputs, + p.pairingPointObject, + t.relationParameters.beta, + t.relationParameters.gamma, + 5 // pubInputsOffset = NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS = 4 + 1 + ); + + // Sumcheck + require(verifySumcheck(p, t), Errors.SumcheckFailed()); + require(verifyShplemini(p, vk, t), Errors.ShpleminiFailed()); + + verified = true; + } + + function computePublicInputDelta( + bytes32[] memory publicInputs, + Fr[PAIRING_POINTS_SIZE] memory pairingPointObject, + Fr beta, + Fr gamma, + uint256 offset + ) internal view returns (Fr publicInputDelta) { + Fr numerator = Fr.wrap(1); + Fr denominator = Fr.wrap(1); + + Fr numeratorAcc = gamma + + (beta * FrLib.from(PERMUTATION_ARGUMENT_VALUE_SEPARATOR + offset)); + Fr denominatorAcc = gamma - (beta * FrLib.from(offset + 1)); + + { + for ( + uint256 i = 0; + i < $NUM_PUBLIC_INPUTS - PAIRING_POINTS_SIZE; + i++ + ) { + Fr pubInput = FrLib.fromBytes32(publicInputs[i]); + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + + for (uint256 i = 0; i < PAIRING_POINTS_SIZE; i++) { + Fr pubInput = pairingPointObject[i]; + + numerator = numerator * (numeratorAcc + pubInput); + denominator = denominator * (denominatorAcc + pubInput); + + numeratorAcc = numeratorAcc + beta; + denominatorAcc = denominatorAcc - beta; + } + } + + // Fr delta = numerator / denominator; // TOOO: batch invert later? + publicInputDelta = FrLib.div(numerator, denominator); + } + + function verifySumcheck( + Honk.ZKProof memory proof, + ZKTranscript memory tp + ) internal view returns (bool verified) { + Fr roundTargetSum = tp.libraChallenge * proof.libraSum; // default 0 + Fr powPartialEvaluation = Fr.wrap(1); + + // We perform sumcheck reductions over log n rounds ( the multivariate degree ) + for (uint256 round; round < $LOG_N; ++round) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory roundUnivariate = proof.sumcheckUnivariates[round]; + Fr totalSum = roundUnivariate[0] + roundUnivariate[1]; + require(totalSum == roundTargetSum, Errors.SumcheckFailed()); + + Fr roundChallenge = tp.sumCheckUChallenges[round]; + + // Update the round target for the next rounf + roundTargetSum = computeNextTargetSum( + roundUnivariate, + roundChallenge + ); + powPartialEvaluation = + powPartialEvaluation * + (Fr.wrap(1) + + roundChallenge * + (tp.gateChallenges[round] - Fr.wrap(1))); + } + + // Last round + // For ZK flavors: sumcheckEvaluations has 42 elements + // Index 0 is gemini_masking_poly, indices 1-41 are the regular entities used in relations + Fr[NUMBER_OF_ENTITIES] memory relationsEvaluations; + for (uint256 i = 0; i < NUMBER_OF_ENTITIES; i++) { + relationsEvaluations[i] = proof.sumcheckEvaluations[ + i + NUM_MASKING_POLYNOMIALS + ]; // Skip gemini_masking_poly at index 0 + } + Fr grandHonkRelationSum = RelationsLib.accumulateRelationEvaluations( + relationsEvaluations, + tp.relationParameters, + tp.alphas, + powPartialEvaluation + ); + + // Row-disabling polynomial: 1 - ∏_{i≥2}(1 - u_i) + Fr evaluation = Fr.wrap(1); + for (uint256 i = 2; i < $LOG_N; i++) { + evaluation = evaluation * (Fr.wrap(1) - tp.sumCheckUChallenges[i]); + } + + grandHonkRelationSum = + grandHonkRelationSum * + (Fr.wrap(1) - evaluation) + + proof.libraEvaluation * + tp.libraChallenge; + verified = (grandHonkRelationSum == roundTargetSum); + } + + // Return the new target sum for the next sumcheck round + function computeNextTargetSum( + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory roundUnivariates, + Fr roundChallenge + ) internal view returns (Fr targetSum) { + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] + memory BARYCENTRIC_LAGRANGE_DENOMINATORS = [ + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000000240 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593effffd31 + ), + Fr.wrap( + 0x00000000000000000000000000000000000000000000000000000000000005a0 + ), + Fr.wrap( + 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffec51 + ), + Fr.wrap( + 0x0000000000000000000000000000000000000000000000000000000000009d80 + ) + ]; + + // To compute the next target sum, we evaluate the given univariate at a point u (challenge). + + // Performing Barycentric evaluations + // Compute B(x) + Fr numeratorValue = Fr.wrap(1); + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + numeratorValue = numeratorValue * (roundChallenge - Fr.wrap(i)); + } + + Fr[ZK_BATCHED_RELATION_PARTIAL_LENGTH] memory denominatorInverses; + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + denominatorInverses[i] = FrLib.invert( + BARYCENTRIC_LAGRANGE_DENOMINATORS[i] * + (roundChallenge - Fr.wrap(i)) + ); + } + + for (uint256 i = 0; i < ZK_BATCHED_RELATION_PARTIAL_LENGTH; ++i) { + targetSum = + targetSum + + roundUnivariates[i] * + denominatorInverses[i]; + } + + // Scale the sum by the value of B(x) + targetSum = targetSum * numeratorValue; + } + + function verifyShplemini( + Honk.ZKProof memory proof, + Honk.VerificationKey memory vk, + ZKTranscript memory tp + ) internal view returns (bool verified) { + CommitmentSchemeLib.ShpleminiIntermediates memory mem; // stack + + // - Compute vector (r, r², ... , r²⁽ⁿ⁻¹⁾), where n = log_circuit_size + Fr[] memory powers_of_evaluation_challenge = CommitmentSchemeLib + .computeSquares(tp.geminiR, $LOG_N); + // Arrays hold values that will be linearly combined for the gemini and shplonk batch openings + Fr[] memory scalars = new Fr[]($MSMSize); + Honk.G1Point[] memory commitments = new Honk.G1Point[]($MSMSize); + + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[0]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[0]).invert(); + + mem.unshiftedScalar = + mem.posInvertedDenominator + + (tp.shplonkNu * mem.negInvertedDenominator); + mem.shiftedScalar = + tp.geminiR.invert() * + (mem.posInvertedDenominator - + (tp.shplonkNu * mem.negInvertedDenominator)); + + scalars[0] = Fr.wrap(1); + commitments[0] = proof.shplonkQ; + + /* Batch multivariate opening claims, shifted and unshifted + * The vector of scalars is populated as follows: + * \f[ + * \left( + * - \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{i+k-1} \times \left(\frac{1}{z-r} + \nu \times \frac{1}{z+r}\right), + * - \rho^{i+k} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right), + * \ldots, + * - \rho^{k+m-1} \times \frac{1}{r} \times \left(\frac{1}{z-r} - \nu \times \frac{1}{z+r}\right) + * \right) + * \f] + * + * The following vector is concatenated to the vector of commitments: + * \f[ + * f_0, \ldots, f_{m-1}, f_{\text{shift}, 0}, \ldots, f_{\text{shift}, k-1} + * \f] + * + * Simultaneously, the evaluation of the multilinear polynomial + * \f[ + * \sum \rho^i \cdot f_i + \sum \rho^{i+k} \cdot f_{\text{shift}, i} + * \f] + * at the challenge point \f$ (u_0,\ldots, u_{n-1}) \f$ is computed. + * + * This approach minimizes the number of iterations over the commitments to multilinear polynomials + * and eliminates the need to store the powers of \f$ \rho \f$. + */ + // For ZK flavors: evaluations array is [gemini_masking_poly, qm, qc, ql, qr, ...] + // Start batching challenge at 1, not rho, to match non-ZK pattern + mem.batchingChallenge = Fr.wrap(1); + mem.batchedEvaluation = Fr.wrap(0); + + mem.unshiftedScalarNeg = mem.unshiftedScalar.neg(); + mem.shiftedScalarNeg = mem.shiftedScalar.neg(); + + // Process all NUMBER_UNSHIFTED_ZK evaluations (includes gemini_masking_poly at index 0) + for (uint256 i = 1; i <= NUMBER_UNSHIFTED_ZK; ++i) { + scalars[i] = mem.unshiftedScalarNeg * mem.batchingChallenge; + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[i - NUM_MASKING_POLYNOMIALS] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + // g commitments are accumulated at r + // For each of the to be shifted commitments perform the shift in place by + // adding to the unshifted value. + // We do so, as the values are to be used in batchMul later, and as + // `a * c + b * c = (a + b) * c` this will allow us to reduce memory and compute. + // Applied to w1, w2, w3, w4 and zPerm + for (uint256 i = 0; i < NUMBER_TO_BE_SHIFTED; ++i) { + uint256 scalarOff = i + SHIFTED_COMMITMENTS_START; + uint256 evaluationOff = i + NUMBER_UNSHIFTED_ZK; + + scalars[scalarOff] = + scalars[scalarOff] + + (mem.shiftedScalarNeg * mem.batchingChallenge); + mem.batchedEvaluation = + mem.batchedEvaluation + + (proof.sumcheckEvaluations[evaluationOff] * + mem.batchingChallenge); + mem.batchingChallenge = mem.batchingChallenge * tp.rho; + } + + commitments[1] = proof.geminiMaskingPoly; + + commitments[2] = vk.s1; + commitments[3] = vk.s2; + commitments[4] = vk.s3; + commitments[5] = vk.s4; + commitments[6] = vk.id1; + commitments[7] = vk.id2; + commitments[8] = vk.id3; + commitments[9] = vk.id4; + commitments[10] = vk.lagrangeFirst; + commitments[11] = vk.lagrangeLast; + commitments[12] = vk.qLookup; + commitments[13] = vk.t1; + commitments[14] = vk.t2; + commitments[15] = vk.t3; + commitments[16] = vk.t4; + commitments[17] = vk.qm; + commitments[18] = vk.qr; + commitments[19] = vk.qo; + commitments[20] = vk.qc; + commitments[21] = vk.ql; + commitments[22] = vk.q4; + commitments[23] = vk.qArith; + commitments[24] = vk.qDeltaRange; + commitments[25] = vk.qElliptic; + commitments[26] = vk.qMemory; + commitments[27] = vk.qNnf; + commitments[28] = vk.qPoseidon2External; + commitments[29] = vk.qPoseidon2Internal; + + // Accumulate proof points + commitments[30] = proof.w1; + commitments[31] = proof.w2; + commitments[32] = proof.w3; + commitments[33] = proof.w4; + commitments[34] = proof.zPerm; + commitments[35] = proof.lookupInverses; + commitments[36] = proof.lookupReadCounts; + commitments[37] = proof.lookupReadTags; + + /* Batch gemini claims from the prover + * place the commitments to gemini aᵢ to the vector of commitments, compute the contributions from + * aᵢ(−r²ⁱ) for i=1, … , n−1 to the constant term accumulator, add corresponding scalars + * + * 1. Moves the vector + * \f[ + * \left( \text{com}(A_1), \text{com}(A_2), \ldots, \text{com}(A_{n-1}) \right) + * \f] + * to the 'commitments' vector. + * + * 2. Computes the scalars: + * \f[ + * \frac{\nu^{2}}{z + r^2}, \frac{\nu^3}{z + r^4}, \ldots, \frac{\nu^{n-1}}{z + r^{2^{n-1}}} + * \f] + * and places them into the 'scalars' vector. + * + * 3. Accumulates the summands of the constant term: + * \f[ + * \sum_{i=2}^{n-1} \frac{\nu^{i} \cdot A_i(-r^{2^i})}{z + r^{2^i}} + * \f] + * and adds them to the 'constant_term_accumulator'. + */ + + // Add contributions from A₀(r) and A₀(-r) to constant_term_accumulator: + // Compute the evaluations Aₗ(r^{2ˡ}) for l = 0, ..., $LOG_N - 1 + Fr[] memory foldPosEvaluations = CommitmentSchemeLib + .computeFoldPosEvaluations( + tp.sumCheckUChallenges, + mem.batchedEvaluation, + proof.geminiAEvaluations, + powers_of_evaluation_challenge, + $LOG_N + ); + + mem.constantTermAccumulator = + foldPosEvaluations[0] * + mem.posInvertedDenominator; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + (proof.geminiAEvaluations[0] * + tp.shplonkNu * + mem.negInvertedDenominator); + + mem.batchingChallenge = tp.shplonkNu.sqr(); + uint256 boundary = NUMBER_UNSHIFTED_ZK + 1; + + // Compute Shplonk constant term contributions from Aₗ(± r^{2ˡ}) for l = 1, ..., m-1; + // Compute scalar multipliers for each fold commitment + for (uint256 i = 0; i < $LOG_N - 1; ++i) { + bool dummy_round = i >= ($LOG_N - 1); + + if (!dummy_round) { + // Update inverted denominators + mem.posInvertedDenominator = (tp.shplonkZ - + powers_of_evaluation_challenge[i + 1]).invert(); + mem.negInvertedDenominator = (tp.shplonkZ + + powers_of_evaluation_challenge[i + 1]).invert(); + + // Compute the scalar multipliers for Aₗ(± r^{2ˡ}) and [Aₗ] + mem.scalingFactorPos = + mem.batchingChallenge * + mem.posInvertedDenominator; + mem.scalingFactorNeg = + mem.batchingChallenge * + tp.shplonkNu * + mem.negInvertedDenominator; + scalars[boundary + i] = + mem.scalingFactorNeg.neg() + + mem.scalingFactorPos.neg(); + + // Accumulate the const term contribution given by + // v^{2l} * Aₗ(r^{2ˡ}) /(z-r^{2^l}) + v^{2l+1} * Aₗ(-r^{2ˡ}) /(z+ r^{2^l}) + Fr accumContribution = mem.scalingFactorNeg * + proof.geminiAEvaluations[i + 1]; + accumContribution = + accumContribution + + mem.scalingFactorPos * + foldPosEvaluations[i + 1]; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + accumContribution; + } + // Update the running power of v + mem.batchingChallenge = + mem.batchingChallenge * + tp.shplonkNu * + tp.shplonkNu; + + commitments[boundary + i] = proof.geminiFoldComms[i]; + } + + boundary += $LOG_N - 1; + + // Denominators 1/(z - point_i) for the five opening points {r, g*r, r, 1, r}. + mem.denominators[0] = ONE.div(tp.shplonkZ - tp.geminiR); + mem.denominators[1] = ONE.div( + tp.shplonkZ - SUBGROUP_GENERATOR * tp.geminiR + ); + mem.denominators[2] = mem.denominators[0]; + mem.denominators[SMALL_IPA_BOUNDARY_OPENING_IDX] = ONE.div( + tp.shplonkZ - ONE + ); + mem.denominators[NUM_SMALL_IPA_OPENING_CLAIMS - 1] = mem.denominators[ + 0 + ]; + + // Iterate the opening claims in three segments — the inner loops can't be merged without an extra induction + // variable, which pushes us into stack-too-deep. + for (uint256 i = 0; i < SMALL_IPA_BOUNDARY_OPENING_IDX; i++) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i]; + } + + // Boundary slot: claimed value is hardcoded 0, so no constantTermAccumulator contribution. + { + Fr scalingFactor = mem.denominators[ + SMALL_IPA_BOUNDARY_OPENING_IDX + ] * mem.batchingChallenge; + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX] = scalingFactor + .neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + } + + for ( + uint256 i = SMALL_IPA_BOUNDARY_OPENING_IDX + 1; + i < NUM_SMALL_IPA_OPENING_CLAIMS; + i++ + ) { + Fr scalingFactor = mem.denominators[i] * mem.batchingChallenge; + mem.batchingScalars[i] = scalingFactor.neg(); + mem.batchingChallenge = mem.batchingChallenge * tp.shplonkNu; + mem.constantTermAccumulator = + mem.constantTermAccumulator + + scalingFactor * + proof.libraPolyEvals[i - 1]; + } + + // Group per-claim batching scalars by commitment: [G], [A] (three openings), [Q]. + scalars[boundary] = mem.batchingScalars[0]; + scalars[boundary + 1] = + mem.batchingScalars[1] + + mem.batchingScalars[2] + + mem.batchingScalars[SMALL_IPA_BOUNDARY_OPENING_IDX]; + scalars[boundary + 2] = mem.batchingScalars[ + NUM_SMALL_IPA_OPENING_CLAIMS - 1 + ]; + + for (uint256 i = 0; i < LIBRA_COMMITMENTS; i++) { + commitments[boundary++] = proof.libraCommitments[i]; + } + + commitments[boundary] = Honk.G1Point({ x: 1, y: 2 }); + scalars[boundary++] = mem.constantTermAccumulator; + + require( + checkEvalsConsistency( + proof.libraPolyEvals, + tp.geminiR, + tp.sumCheckUChallenges, + proof.libraEvaluation + ), + Errors.ConsistencyCheckFailed() + ); + + Honk.G1Point memory quotient_commitment = proof.kzgQuotient; + + commitments[boundary] = quotient_commitment; + scalars[boundary] = tp.shplonkZ; // evaluation challenge + + PairingInputs memory pair; + pair.P_0 = batchMul(commitments, scalars); + pair.P_1 = negateInplace(quotient_commitment); + + // Aggregate pairing points (skip if default/infinity — no recursive verification occurred) + if (!arePairingPointsDefault(proof.pairingPointObject)) { + Fr recursionSeparator = generateRecursionSeparator( + proof.pairingPointObject, + pair.P_0, + pair.P_1 + ); + ( + Honk.G1Point memory P_0_other, + Honk.G1Point memory P_1_other + ) = convertPairingPointsToG1(proof.pairingPointObject); + + // Validate the points from the proof are on the curve + rejectPointAtInfinity(P_0_other); + rejectPointAtInfinity(P_1_other); + + // accumulate with aggregate points in proof + pair.P_0 = mulWithSeperator( + pair.P_0, + P_0_other, + recursionSeparator + ); + pair.P_1 = mulWithSeperator( + pair.P_1, + P_1_other, + recursionSeparator + ); + } + + return pairing(pair.P_0, pair.P_1); + } + + function checkEvalsConsistency( + Fr[LIBRA_EVALUATIONS] memory libraPolyEvals, + Fr geminiR, + Fr[CONST_PROOF_SIZE_LOG_N] memory uChallenges, + Fr libraEval + ) internal view returns (bool check) { + Fr one = Fr.wrap(1); + Fr vanishingPolyEval = geminiR.pow(SUBGROUP_SIZE) - one; + require( + vanishingPolyEval != Fr.wrap(0), + Errors.GeminiChallengeInSubgroup() + ); + + SmallSubgroupIpaIntermediates memory mem; + mem.challengePolyLagrange[0] = one; + for (uint256 round = 0; round < $LOG_N; round++) { + uint256 currIdx = 1 + LIBRA_UNIVARIATES_LENGTH * round; + mem.challengePolyLagrange[currIdx] = one; + for ( + uint256 idx = currIdx + 1; + idx < currIdx + LIBRA_UNIVARIATES_LENGTH; + idx++ + ) { + mem.challengePolyLagrange[idx] = + mem.challengePolyLagrange[idx - 1] * + uChallenges[round]; + } + } + + mem.rootPower = one; + mem.challengePolyEval = Fr.wrap(0); + for (uint256 idx = 0; idx < SUBGROUP_SIZE; idx++) { + mem.denominators[idx] = mem.rootPower * geminiR - one; + mem.denominators[idx] = mem.denominators[idx].invert(); + mem.challengePolyEval = + mem.challengePolyEval + + mem.challengePolyLagrange[idx] * + mem.denominators[idx]; + mem.rootPower = mem.rootPower * SUBGROUP_GENERATOR_INVERSE; + } + + Fr numerator = vanishingPolyEval * Fr.wrap(SUBGROUP_SIZE).invert(); + mem.challengePolyEval = mem.challengePolyEval * numerator; + mem.lagrangeFirst = mem.denominators[0] * numerator; + mem.lagrangeLast = mem.denominators[SUBGROUP_SIZE - 1] * numerator; + + mem.diff = mem.lagrangeFirst * libraPolyEvals[2]; + + mem.diff = + mem.diff + + (geminiR - SUBGROUP_GENERATOR_INVERSE) * + (libraPolyEvals[1] - + libraPolyEvals[2] - + libraPolyEvals[0] * + mem.challengePolyEval); + mem.diff = + mem.diff + + mem.lagrangeLast * + (libraPolyEvals[2] - libraEval) - + vanishingPolyEval * + libraPolyEvals[3]; + + check = mem.diff == Fr.wrap(0); + } + + // This implementation is the same as above with different constants + function batchMul( + Honk.G1Point[] memory base, + Fr[] memory scalars + ) internal view returns (Honk.G1Point memory result) { + uint256 limit = $MSMSize; + + // Identity bases are accepted: VK selector/table polys may be identically zero, + // and the ecAdd/ecMul precompiles treat (0,0) as the additive identity per EIP-196. + // Soundness against an attacker substituting (0,0) for a non-zero commitment is + // upheld by sumcheck/Shplemini, which would fail on inconsistent evaluations. + + bool success = true; + assembly { + let free := mload(0x40) + + let count := 0x01 + for {} lt(count, add(limit, 1)) { + count := add(count, 1) + } { + // Get loop offsets + let base_base := add(base, mul(count, 0x20)) + let scalar_base := add(scalars, mul(count, 0x20)) + + mstore(add(free, 0x40), mload(mload(base_base))) + mstore(add(free, 0x60), mload(add(0x20, mload(base_base)))) + // Add scalar + mstore(add(free, 0x80), mload(scalar_base)) + + success := and( + success, + staticcall( + gas(), + 7, + add(free, 0x40), + 0x60, + add(free, 0x40), + 0x40 + ) + ) + // accumulator = accumulator + accumulator_2 + success := and( + success, + staticcall(gas(), 6, free, 0x80, free, 0x40) + ) + } + + // Return the result + mstore(result, mload(free)) + mstore(add(result, 0x20), mload(add(free, 0x20))) + } + + require(success, Errors.ShpleminiFailed()); + } + + // Calculate proof size based on log_n (matching UltraKeccakZKFlavor formula) + function calculateProofSize(uint256 logN) internal pure returns (uint256) { + // Witness and Libra commitments + uint256 proofLength = NUM_WITNESS_ENTITIES * NUM_ELEMENTS_COMM; // witness commitments + proofLength += NUM_ELEMENTS_COMM * 3; // Libra concat, grand sum, quotient comms + Gemini masking + + // Sumcheck + proofLength += + logN * + ZK_BATCHED_RELATION_PARTIAL_LENGTH * + NUM_ELEMENTS_FR; // sumcheck univariates + proofLength += NUMBER_OF_ENTITIES_ZK * NUM_ELEMENTS_FR; // sumcheck evaluations + + // Libra and Gemini + proofLength += NUM_ELEMENTS_FR * 2; // Libra sum, claimed eval + proofLength += logN * NUM_ELEMENTS_FR; // Gemini a evaluations + proofLength += NUM_LIBRA_EVALUATIONS * NUM_ELEMENTS_FR; // libra evaluations + + // PCS commitments + proofLength += (logN - 1) * NUM_ELEMENTS_COMM; // Gemini Fold commitments + proofLength += NUM_ELEMENTS_COMM * 2; // Shplonk Q and KZG W commitments + + // Pairing points + proofLength += PAIRING_POINTS_SIZE; // pairing inputs carried on public inputs + + return proofLength * 32; + } + + function loadVerificationKey() + internal + pure + virtual + returns (Honk.VerificationKey memory); +} + +contract DkgAggregatorVerifier is + BaseZKHonkVerifier(N, LOG_N, VK_HASH, NUMBER_OF_PUBLIC_INPUTS) +{ + constructor() { + validateVerificationKey(HonkVerificationKey.loadVerificationKey()); + } + function loadVerificationKey() + internal + pure + override + returns (Honk.VerificationKey memory) + { + return HonkVerificationKey.loadVerificationKey(); + } +} diff --git a/packages/interfold-contracts/scripts/protocol/tx/interfold.ts b/packages/interfold-contracts/scripts/protocol/tx/interfold.ts index 9fcfec9b73..0d642c4656 100644 --- a/packages/interfold-contracts/scripts/protocol/tx/interfold.ts +++ b/packages/interfold-contracts/scripts/protocol/tx/interfold.ts @@ -75,7 +75,9 @@ function appendCommitteeAndPricingTxs( const activeParams = bfvConfig.paramSet === 0 ? BFV_PARAMS.insecure512 - : BFV_PARAMS.secure8192; + : bfvConfig.paramSet === 1 + ? BFV_PARAMS.secure8192 + : BFV_PARAMS.secure16384; txs.push( safeTx( c.interfold, diff --git a/packages/interfold-contracts/scripts/utils.ts b/packages/interfold-contracts/scripts/utils.ts index 562228a4ec..dd2a6f06b1 100644 --- a/packages/interfold-contracts/scripts/utils.ts +++ b/packages/interfold-contracts/scripts/utils.ts @@ -104,7 +104,7 @@ export const ACTIVE_BFV_PARAM_SET = 0; export const ACTIVE_BFV_COMMITTEE_SIZE = 0; export const ACTIVE_BFV_COMMITTEE_N = 3; -export type BfvArtifactPreset = "insecure" | "secure-8192"; +export type BfvArtifactPreset = "insecure" | "secure-8192" | "secure-16384"; export type BfvCommittee = "minimum" | "micro" | "small"; export interface ActiveBfvConfig { @@ -127,19 +127,35 @@ const SECURE_PARAM_SET_HASH = "0x80775a19b6126a12943f9c1c53f92299f0c92ece819b625026ab1406bbbe0721"; const SECURE_CONFIG_ID = "0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb"; +const SECURE_16384_PARAM_SET_HASH = + "0x8afd5dddf1bc0cfb00c70e9a7d0a0fb11bd0617df27574fa7d2ccf9ae3a6bdb8"; +const SECURE_16384_CONFIG_ID = + "0x81f3edb4c49db1c2baf578d6ade4aea6839ee6a71d7458c1bfc79670d2ece7cd"; function bfvConfig( preset: BfvArtifactPreset, committee: BfvCommittee, params: Pick, ): ActiveBfvConfig { - const secure = preset === "secure-8192"; + const paramSet = preset === "insecure" ? 0 : preset === "secure-8192" ? 1 : 2; + const paramSetHash = + paramSet === 0 + ? INSECURE_PARAM_SET_HASH + : paramSet === 1 + ? SECURE_PARAM_SET_HASH + : SECURE_16384_PARAM_SET_HASH; + const configId = + paramSet === 0 + ? INSECURE_CONFIG_ID + : paramSet === 1 + ? SECURE_CONFIG_ID + : SECURE_16384_CONFIG_ID; return { preset, committee, - paramSet: secure ? 1 : 0, - paramSetHash: secure ? SECURE_PARAM_SET_HASH : INSECURE_PARAM_SET_HASH, - configId: secure ? SECURE_CONFIG_ID : INSECURE_CONFIG_ID, + paramSet, + paramSetHash, + configId, ...params, }; } @@ -180,6 +196,24 @@ export const SECURE_SMALL_BFV_CONFIG: ActiveBfvConfig = bfvConfig( { committeeSize: 2, h: 10, t: 9, n: 19 }, ); +export const SECURE_16384_MINIMUM_BFV_CONFIG: ActiveBfvConfig = bfvConfig( + "secure-16384", + "minimum", + { committeeSize: 0, h: 2, t: 1, n: 3 }, +); + +export const SECURE_16384_MICRO_BFV_CONFIG: ActiveBfvConfig = bfvConfig( + "secure-16384", + "micro", + { committeeSize: 1, h: 5, t: 4, n: 9 }, +); + +export const SECURE_16384_SMALL_BFV_CONFIG: ActiveBfvConfig = bfvConfig( + "secure-16384", + "small", + { committeeSize: 2, h: 10, t: 9, n: 19 }, +); + export const PRODUCTION_BFV_CONFIG: ActiveBfvConfig = SECURE_SMALL_BFV_CONFIG; export const TESTNET_BFV_CONFIG: ActiveBfvConfig = INSECURE_MINIMUM_BFV_CONFIG; @@ -197,6 +231,9 @@ export const TESTNET_BFV_CONFIGS: readonly ActiveBfvConfig[] = [ SECURE_MINIMUM_BFV_CONFIG, SECURE_MICRO_BFV_CONFIG, SECURE_SMALL_BFV_CONFIG, + SECURE_16384_MINIMUM_BFV_CONFIG, + SECURE_16384_MICRO_BFV_CONFIG, + SECURE_16384_SMALL_BFV_CONFIG, ] as const; export function isTestnetOrLocalChainId(chainId: number): boolean { diff --git a/packages/interfold-contracts/tasks/interfold.ts b/packages/interfold-contracts/tasks/interfold.ts index 42169ac9ee..c25f60932b 100644 --- a/packages/interfold-contracts/tasks/interfold.ts +++ b/packages/interfold-contracts/tasks/interfold.ts @@ -26,6 +26,9 @@ function cryptoConfigIdForParamSet(paramSet: number): string { if (paramSet === 1) { return "0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb"; } + if (paramSet === 2) { + return "0x81f3edb4c49db1c2baf578d6ade4aea6839ee6a71d7458c1bfc79670d2ece7cd"; + } throw new Error(`Unsupported BFV parameter set: ${paramSet}`); } diff --git a/packages/interfold-contracts/test/Interfold.spec.ts b/packages/interfold-contracts/test/Interfold.spec.ts index 8d82549b79..ee4a001b34 100644 --- a/packages/interfold-contracts/test/Interfold.spec.ts +++ b/packages/interfold-contracts/test/Interfold.spec.ts @@ -10,6 +10,7 @@ import { ADDRESS_TWO as AddressTwo, BFV_PARAMS_DEFAULT, BFV_PARAMS_SECURE, + BFV_PARAMS_SECURE_16384, PRODUCTION_CRYPTO_CONFIG_ID, buildMockAggregationPublishArgs, deployInterfoldSystem, @@ -223,9 +224,12 @@ describe("Interfold", function () { await expect(interfold.setParamSet(1, BFV_PARAMS_SECURE)) .to.emit(interfold, "ParamSetRegistered") .withArgs(1, BFV_PARAMS_SECURE); + await expect(interfold.setParamSet(2, BFV_PARAMS_SECURE_16384)) + .to.emit(interfold, "ParamSetRegistered") + .withArgs(2, BFV_PARAMS_SECURE_16384); await expect( - interfold.setParamSet(2, BFV_PARAMS_DEFAULT), - ).to.be.revertedWithCustomError(interfold, "UnsupportedCryptoConfig"); + interfold.setParamSet(2, BFV_PARAMS_SECURE), + ).to.be.revertedWithCustomError(interfold, "ParamSetAlreadyRegistered"); }); it("does not overwrite the active parameter set", async function () { diff --git a/packages/interfold-contracts/test/fixtures/constants.ts b/packages/interfold-contracts/test/fixtures/constants.ts index 2f491dc8d9..02b3fe3a10 100644 --- a/packages/interfold-contracts/test/fixtures/constants.ts +++ b/packages/interfold-contracts/test/fixtures/constants.ts @@ -61,6 +61,9 @@ export const BFV_PARAMS_DEFAULT = encodeBfvParams(BFV_PARAMS.insecure512); /** The secure-8192 parameter set that Sepolia/local deployments can also register. */ export const BFV_PARAMS_SECURE = encodeBfvParams(BFV_PARAMS.secure8192); +/** The secure-16384 parameter set that Sepolia/local deployments can also register. */ +export const BFV_PARAMS_SECURE_16384 = encodeBfvParams(BFV_PARAMS.secure16384); + /** Circuit, BFV parameters, and verifier generation used by this build. */ export const ACTIVE_CRYPTO_CONFIG_ID = ethers.keccak256( abiCoder.encode( diff --git a/packages/interfold-sdk/src/utils.ts b/packages/interfold-sdk/src/utils.ts index 46cff1aa5f..c4fdcf6a0e 100644 --- a/packages/interfold-sdk/src/utils.ts +++ b/packages/interfold-sdk/src/utils.ts @@ -90,6 +90,9 @@ export function cryptoConfigIdForParamSet(paramSet: number): Hash { if (paramSet === 1) { return '0x2af9e43a7b95b11300b6185f3ffaece530facafd2ce98c5e1a1cece8a80ad3cb' } + if (paramSet === 2) { + return '0x81f3edb4c49db1c2baf578d6ade4aea6839ee6a71d7458c1bfc79670d2ece7cd' + } throw new SDKError(`Unsupported BFV parameter set: ${paramSet}`, 'UNSUPPORTED_CRYPTO_CONFIG') } diff --git a/scripts/build-circuits.ts b/scripts/build-circuits.ts index 29d7f098b9..df53aed653 100644 --- a/scripts/build-circuits.ts +++ b/scripts/build-circuits.ts @@ -5,9 +5,21 @@ // without even the implied warranty of MERCHANTABILITY // or FITNESS FOR A PARTICULAR PURPOSE. -import { execSync } from 'child_process' +import { execFileSync, execSync } from 'child_process' import { createHash } from 'crypto' -import { appendFileSync, copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'fs' +import { + appendFileSync, + copyFileSync, + existsSync, + mkdirSync, + mkdtempSync, + readdirSync, + readFileSync, + rmSync, + statSync, + writeFileSync, +} from 'fs' +import { tmpdir } from 'os' import { basename, join, resolve } from 'path' import { AbiCoder, id, keccak256 } from 'ethers' import { BFV_PARAMS } from '../packages/interfold-contracts/scripts/protocol/constants' @@ -274,10 +286,11 @@ class NoirCircuitBuilder { * Patch the active BFV and committee constants used by deployment tooling. */ private patchUtilsTs(preset: CircuitPreset, committee: CircuitCommittee): void { - if (this.options.skipUtilsPatch || preset === CIRCUIT_PRESETS.SECURE_16384) return + if (this.options.skipUtilsPatch) return const { h, t, n, paramSet, committeeSize } = this.bfvConfig(preset, committee) const insecure = this.bfvConfig(CIRCUIT_PRESETS.INSECURE_512, CIRCUIT_COMMITTEES.MINIMUM) const secure = this.bfvConfig(CIRCUIT_PRESETS.SECURE_8192, CIRCUIT_COMMITTEES.SMALL) + const secure16384 = this.bfvConfig(CIRCUIT_PRESETS.SECURE_16384, CIRCUIT_COMMITTEES.MINIMUM) const path = join(this.rootDir, 'packages', 'interfold-contracts', 'scripts', 'utils.ts') if (!existsSync(path)) return // optional in minimal checkouts const before = readFileSync(path, 'utf-8') @@ -301,6 +314,11 @@ class NoirCircuitBuilder { .replace(/const INSECURE_CONFIG_ID =\s*\n\s*"0x[0-9a-fA-F]+"/, `const INSECURE_CONFIG_ID =\n "${insecure.configId}"`) .replace(/const SECURE_PARAM_SET_HASH =\s*\n\s*"0x[0-9a-fA-F]+"/, `const SECURE_PARAM_SET_HASH =\n "${secure.paramSetHash}"`) .replace(/const SECURE_CONFIG_ID =\s*\n\s*"0x[0-9a-fA-F]+"/, `const SECURE_CONFIG_ID =\n "${secure.configId}"`) + .replace( + /const SECURE_16384_PARAM_SET_HASH =\s*\n\s*"0x[0-9a-fA-F]+"/, + `const SECURE_16384_PARAM_SET_HASH =\n "${secure16384.paramSetHash}"`, + ) + .replace(/const SECURE_16384_CONFIG_ID =\s*\n\s*"0x[0-9a-fA-F]+"/, `const SECURE_16384_CONFIG_ID =\n "${secure16384.configId}"`) if (!after.includes(`export const BFV_DKG_H = ${h}`)) { throw new Error(`patchUtilsTs: could not update BFV_DKG_H in ${path} (expected export const BFV_DKG_H = )`) @@ -322,6 +340,8 @@ class NoirCircuitBuilder { ['INSECURE_CONFIG_ID', insecure.configId], ['SECURE_PARAM_SET_HASH', secure.paramSetHash], ['SECURE_CONFIG_ID', secure.configId], + ['SECURE_16384_PARAM_SET_HASH', secure16384.paramSetHash], + ['SECURE_16384_CONFIG_ID', secure16384.configId], ] as const) { if (!after.includes(`const ${name} =\n "${value}"`)) { throw new Error(`patchUtilsTs: could not update ${name} in ${path}`) @@ -348,36 +368,93 @@ class NoirCircuitBuilder { /** Regenerates the protocol constants without compiling circuit artifacts. */ syncProtocolConfig(preset: CircuitPreset, committee: CircuitCommittee): void { + const modNrPath = join(this.rootDir, 'circuits', 'lib', 'src', 'configs', 'default', 'mod.nr') this.regenerateConfigModules(preset) + this.setNoirConfigPreset(modNrPath, preset) + this.setNoirCommittee(committee) + this.regenerateParityMatrices(committee) this.patchUtilsTs(preset, committee) this.writeActiveCryptoConfig(preset, committee) } private regenerateConfigModules(preset: CircuitPreset): void { if (this.generatedConfigPresets.has(preset)) return + const generatedRoot = mkdtempSync(join(tmpdir(), 'interfold-config-')) try { - execSync( - `cargo run --quiet --release --bin generate_config_modules -- --preset ${preset === CIRCUIT_PRESETS.INSECURE_512 ? 'INSECURE_THRESHOLD_512' : preset === CIRCUIT_PRESETS.SECURE_8192 ? 'SECURE_THRESHOLD_8192' : 'SECURE_THRESHOLD_16384'}`, - { - cwd: this.rootDir, - stdio: ['ignore', 'pipe', 'inherit'], - }, - ) + this.runConfigModuleGenerator(preset, generatedRoot) + const module = PRESET_NOIR_CONFIG[preset] + for (const file of ['mod.nr', 'threshold.nr', 'dkg.nr']) { + copyFileSync(join(generatedRoot, module, file), join(this.rootDir, 'circuits', 'lib', 'src', 'configs', module, file)) + } this.generatedConfigPresets.add(preset) } catch (err: any) { throw new Error( `Failed to regenerate BFV config modules for preset=${preset}: ${err.message}\n` + - ` Try: cargo run --release --bin generate_config_modules -- --preset ${preset}`, + ` Try: cargo run --release --bin generate_config_modules -- --preset ${this.configModuleName(preset)}`, ) + } finally { + rmSync(generatedRoot, { recursive: true, force: true }) + } + } + + private verifyConfigModules(preset: CircuitPreset): void { + const generatedRoot = mkdtempSync(join(tmpdir(), 'interfold-config-')) + try { + this.runConfigModuleGenerator(preset, generatedRoot) + const module = PRESET_NOIR_CONFIG[preset] + const normalize = (content: string) => content.replace(/\s+/g, '').replace(/,([}\]])/g, '$1') + for (const file of ['mod.nr', 'threshold.nr', 'dkg.nr']) { + const committed = join(this.rootDir, 'circuits', 'lib', 'src', 'configs', module, file) + const generated = join(generatedRoot, module, file) + if (!existsSync(committed) || normalize(readFileSync(committed, 'utf8')) !== normalize(readFileSync(generated, 'utf8'))) { + throw new Error( + `Generated config drift detected for ${module}/${file}. ` + + `Run: pnpm build:circuits sync-config --preset ${preset} --committee ${this.options.committee ?? CIRCUIT_COMMITTEES.MINIMUM}`, + ) + } + } + } finally { + rmSync(generatedRoot, { recursive: true, force: true }) } } + private configModuleName(preset: CircuitPreset): string { + return preset === CIRCUIT_PRESETS.INSECURE_512 + ? 'INSECURE_THRESHOLD_512' + : preset === CIRCUIT_PRESETS.SECURE_8192 + ? 'SECURE_THRESHOLD_8192' + : 'SECURE_THRESHOLD_16384' + } + + private runConfigModuleGenerator(preset: CircuitPreset, outputRoot: string): void { + execFileSync( + 'cargo', + [ + 'run', + '--quiet', + '--release', + '--bin', + 'generate_config_modules', + '--', + '--preset', + this.configModuleName(preset), + '--output-root', + outputRoot, + ], + { + cwd: this.rootDir, + stdio: ['ignore', 'pipe', 'inherit'], + }, + ) + } + /** Writes the circuit-bound constants consumed by Interfold. */ private writeActiveCryptoConfig(preset: CircuitPreset, committee: CircuitCommittee): void { const production = this.bfvConfig(CIRCUIT_PRESETS.SECURE_8192, CIRCUIT_COMMITTEES.SMALL) const secureMinimum = this.bfvConfig(CIRCUIT_PRESETS.SECURE_8192, CIRCUIT_COMMITTEES.MINIMUM) const secureMicro = this.bfvConfig(CIRCUIT_PRESETS.SECURE_8192, CIRCUIT_COMMITTEES.MICRO) const testnet = this.bfvConfig(CIRCUIT_PRESETS.INSECURE_512, CIRCUIT_COMMITTEES.MINIMUM) + const secure16384 = this.bfvConfig(CIRCUIT_PRESETS.SECURE_16384, CIRCUIT_COMMITTEES.MINIMUM) const path = join(this.rootDir, 'packages', 'interfold-contracts', 'contracts', 'lib', 'ActiveCryptoConfig.sol') const source = `// SPDX-License-Identifier: LGPL-3.0-only // @@ -389,8 +466,8 @@ pragma solidity >=0.8.27; import { IInterfold } from "../interfaces/IInterfold.sol"; // Auto-generated by scripts/build-circuits.ts. Active local selection: ${preset}/${committee}. -// Mainnet supports secure BFV with minimum, micro, and small committees. Sepolia and local chains -// support insecure and secure BFV with every committee size. +// Mainnet supports secure-8192 BFV with minimum, micro, and small committees. Sepolia and local +// chains support insecure, secure-8192, and secure-16384 BFV with every committee size. library ActiveCryptoConfig { bytes32 internal constant ENCRYPTION_SCHEME_ID = keccak256("fhe.rs:BFV"); bytes32 internal constant CIRCUIT_VERSION = keccak256("interfold-bfv-v1"); @@ -407,6 +484,12 @@ library ActiveCryptoConfig { bytes32 internal constant SECURE_PARAM_SET_HASH = ${production.paramSetHash}; + bytes32 internal constant SECURE_16384_CONFIG_ID = + ${secure16384.configId}; + uint8 internal constant SECURE_16384_PARAM_SET = ${secure16384.paramSet}; + bytes32 internal constant SECURE_16384_PARAM_SET_HASH = + ${secure16384.paramSetHash}; + uint8 internal constant MINIMUM_COMMITTEE_SIZE = ${secureMinimum.committeeSize}; uint32 internal constant MINIMUM_T = ${secureMinimum.t}; uint32 internal constant MINIMUM_H = ${secureMinimum.h}; @@ -450,6 +533,7 @@ library ActiveCryptoConfig { ) internal pure returns (bytes32) { if (paramSet == INSECURE_PARAM_SET) return INSECURE_CONFIG_ID; if (paramSet == SECURE_PARAM_SET) return SECURE_CONFIG_ID; + if (paramSet == SECURE_16384_PARAM_SET) return SECURE_16384_CONFIG_ID; revert IInterfold.UnsupportedCryptoConfig(); } @@ -464,7 +548,9 @@ library ActiveCryptoConfig { function isParamSetSupported(uint8 paramSet) internal view returns (bool) { if (isTestnetOrLocal()) { return - paramSet == INSECURE_PARAM_SET || paramSet == SECURE_PARAM_SET; + paramSet == INSECURE_PARAM_SET || + paramSet == SECURE_PARAM_SET || + paramSet == SECURE_16384_PARAM_SET; } return paramSet == SECURE_PARAM_SET; } @@ -517,7 +603,9 @@ library ActiveCryptoConfig { revert IInterfold.UnsupportedCryptoConfig(); bytes32 expectedHash = paramSet == INSECURE_PARAM_SET ? INSECURE_PARAM_SET_HASH - : SECURE_PARAM_SET_HASH; + : paramSet == SECURE_PARAM_SET + ? SECURE_PARAM_SET_HASH + : SECURE_16384_PARAM_SET_HASH; if (paramSetHash != expectedHash) revert IInterfold.UnsupportedCryptoConfig(); } @@ -713,7 +801,7 @@ library ActiveCryptoConfig { return result } - this.regenerateConfigModules(preset) + this.verifyConfigModules(preset) if (modNrPath) { this.syncPresetAndCommittee(modNrPath, preset, committee) } diff --git a/scripts/check-committee.sh b/scripts/check-committee.sh index 3c695f5132..7f49746fa4 100755 --- a/scripts/check-committee.sh +++ b/scripts/check-committee.sh @@ -247,7 +247,7 @@ ts_bytes32() { | head -n1 } -for prefix in INSECURE SECURE; do +for prefix in INSECURE SECURE SECURE_16384; do utils_param_hash=$(ts_bytes32 "${prefix}_PARAM_SET_HASH") utils_config_id=$(ts_bytes32 "${prefix}_CONFIG_ID") sol_param_hash=$(sol_bytes32 "${prefix}_PARAM_SET_HASH") @@ -275,7 +275,7 @@ extract_rust_config_id() { | head -n1 } -for prefix_and_param_set in INSECURE:0 SECURE:1; do +for prefix_and_param_set in INSECURE:0 SECURE:1 SECURE_16384:2; do prefix="${prefix_and_param_set%%:*}" param_set="${prefix_and_param_set##*:}" expected_id=$(sol_bytes32 "${prefix}_CONFIG_ID") @@ -313,18 +313,21 @@ check_utils_route INSECURE_SMALL insecure small 2 check_utils_route SECURE_MINIMUM secure-8192 minimum 0 check_utils_route SECURE_MICRO secure-8192 micro 1 check_utils_route SECURE_SMALL secure-8192 small 2 +check_utils_route SECURE_16384_MINIMUM secure-16384 minimum 0 +check_utils_route SECURE_16384_MICRO secure-16384 micro 1 +check_utils_route SECURE_16384_SMALL secure-16384 small 2 route_list() { local array_name="$1" sed -n "/^export const ${array_name}:.*= \[/,/^\] as const;/p" "$UTILS_TS" \ - | grep -oE '(INSECURE|SECURE)_(MINIMUM|MICRO|SMALL)_BFV_CONFIG' \ + | grep -oE '(INSECURE|SECURE(_16384)?)_(MINIMUM|MICRO|SMALL)_BFV_CONFIG' \ | paste -sd, - } TESTNET_ROUTES=$(route_list TESTNET_BFV_CONFIGS) -EXPECTED_TESTNET_ROUTES="INSECURE_MINIMUM_BFV_CONFIG,INSECURE_MICRO_BFV_CONFIG,INSECURE_SMALL_BFV_CONFIG,SECURE_MINIMUM_BFV_CONFIG,SECURE_MICRO_BFV_CONFIG,SECURE_SMALL_BFV_CONFIG" +EXPECTED_TESTNET_ROUTES="INSECURE_MINIMUM_BFV_CONFIG,INSECURE_MICRO_BFV_CONFIG,INSECURE_SMALL_BFV_CONFIG,SECURE_MINIMUM_BFV_CONFIG,SECURE_MICRO_BFV_CONFIG,SECURE_SMALL_BFV_CONFIG,SECURE_16384_MINIMUM_BFV_CONFIG,SECURE_16384_MICRO_BFV_CONFIG,SECURE_16384_SMALL_BFV_CONFIG" [[ "$TESTNET_ROUTES" == "$EXPECTED_TESTNET_ROUTES" ]] \ - || fail "$UTILS_TS testnet routes must contain the exact six-pair matrix; got $TESTNET_ROUTES" + || fail "$UTILS_TS testnet routes must contain the exact nine-pair matrix; got $TESTNET_ROUTES" MAINNET_ROUTES=$(route_list MAINNET_BFV_CONFIGS) EXPECTED_MAINNET_ROUTES="SECURE_SMALL_BFV_CONFIG,SECURE_MICRO_BFV_CONFIG,SECURE_MINIMUM_BFV_CONFIG" @@ -494,4 +497,4 @@ else echo " (skipping parity-matrix drift check: $GEN_BIN not built. Run \`cargo build -p e3-zk-helpers --bin generate_parity_matrices --release\` to enable.)" >&2 fi -echo "✓ check:committee: BFV tuples, configuration IDs, all six routes, and local $ACTIVE_COMMITTEE (H=$EXPECTED_H, T=$EXPECTED_T) are consistent across TypeScript, Rust, Noir, and Solidity$([ "$RAN_STAMP_CHECK" = true ] && echo ', .active-preset.json')$([ "$RAN_PARITY_CHECK" = true ] && echo ', parity_*.nr')" +echo "✓ check:committee: BFV tuples, configuration IDs, all nine testnet routes, and local $ACTIVE_COMMITTEE (H=$EXPECTED_H, T=$EXPECTED_T) are consistent across TypeScript, Rust, Noir, and Solidity$([ "$RAN_STAMP_CHECK" = true ] && echo ', .active-preset.json')$([ "$RAN_PARITY_CHECK" = true ] && echo ', parity_*.nr')" diff --git a/scripts/circuit-constants.ts b/scripts/circuit-constants.ts index 5ce5eb27c5..b401bf0076 100644 --- a/scripts/circuit-constants.ts +++ b/scripts/circuit-constants.ts @@ -97,8 +97,7 @@ export const COMMITTEE_PARAMS: Record = { * Every pair can be generated because committee-dependent circuit artifacts are regenerated from * the BFV presets and the committee's `(N, T)` by `generate_parity_matrices`. * - * Secure-16384 is generation-only. It is not part of the deployed chain matrix until contracts, - * verifier routes, and an artifact release support it. + * Secure-16384 is enabled on Sepolia and local chains. Mainnet remains on secure-8192. */ export const SUPPORTED_PRESET_COMMITTEE_PAIRS: ReadonlyArray<{ preset: CircuitPreset @@ -109,9 +108,7 @@ export const SUPPORTED_PRESET_COMMITTEE_PAIRS: ReadonlyArray<{ export const RELEASE_PRESET_COMMITTEE_PAIRS: ReadonlyArray<{ preset: CircuitPreset committee: CircuitCommittee -}> = [CIRCUIT_PRESETS.INSECURE_512, CIRCUIT_PRESETS.SECURE_8192].flatMap((preset) => - ALL_COMMITTEES.map((committee) => ({ preset, committee })), -) +}> = ALL_PRESETS.flatMap((preset) => ALL_COMMITTEES.map((committee) => ({ preset, committee }))) export function isPresetCommitteeSupported(preset: CircuitPreset, committee: CircuitCommittee): boolean { return SUPPORTED_PRESET_COMMITTEE_PAIRS.some((p) => p.preset === preset && p.committee === committee) diff --git a/scripts/generate-circuit-configs.sh b/scripts/generate-circuit-configs.sh index 745100ed9b..d981d36f3d 100755 --- a/scripts/generate-circuit-configs.sh +++ b/scripts/generate-circuit-configs.sh @@ -21,7 +21,7 @@ # path; this script is the deterministic matrix sweep. # # Usage: -# ./scripts/generate-circuit-configs.sh [--preset insecure|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] +# ./scripts/generate-circuit-configs.sh [--preset insecure|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] [--allow-failures] set -euo pipefail @@ -39,7 +39,10 @@ DEFAULT_OUTPUT="$REPO_ROOT/dist/circuit-codegen" # Canonical circuit list. Mirrors `circuits/benchmarks/config.json`; entries are either # a plain path string (`"dkg/pk"`) or a `{name, modes}` object (`config`). CONFIG_JSON="$REPO_ROOT/circuits/benchmarks/config.json" -mapfile -t ALL_CIRCUITS < <(jq -r '.circuits[] | if type == "object" then .name else . end' "$CONFIG_JSON") +ALL_CIRCUITS=() +while IFS= read -r circuit; do + ALL_CIRCUITS+=("$circuit") +done < <(jq -r '.circuits[] | if type == "object" then .name else . end' "$CONFIG_JSON") SELECT_PRESETS=() SELECT_COMMITTEES=() @@ -48,39 +51,44 @@ OUTPUT="$DEFAULT_OUTPUT" while [[ $# -gt 0 ]]; do case "$1" in - --preset) - if [[ "$2" == "all" ]]; then - SELECT_PRESETS=("${ALL_PRESETS[@]}") - else - SELECT_PRESETS+=("$2") - fi - shift 2 - ;; - --committee) - if [[ "$2" == "all" ]]; then - SELECT_COMMITTEES=("${ALL_COMMITTEES[@]}") - else - SELECT_COMMITTEES+=("$2") + --preset|--committee|--circuits|--output) + if [[ $# -lt 2 ]]; then + echo "Missing value for $1" >&2 + exit 1 fi + case "$1" in + --preset) + if [[ "$2" == "all" ]]; then + SELECT_PRESETS=("${ALL_PRESETS[@]}") + else + SELECT_PRESETS+=("$2") + fi + ;; + --committee) + if [[ "$2" == "all" ]]; then + SELECT_COMMITTEES=("${ALL_COMMITTEES[@]}") + else + SELECT_COMMITTEES+=("$2") + fi + ;; + --circuits) + IFS=',' read -r -a SELECT_CIRCUITS <<< "$2" + ;; + --output) + OUTPUT="$2" + ;; + esac shift 2 ;; - --circuits) - IFS=',' read -r -a SELECT_CIRCUITS <<< "$2" - shift 2 - ;; - --output) - OUTPUT="$2" - shift 2 + --allow-failures) + ALLOW_FAILURES=1 + shift ;; --strict) - # Abort on the first codegen failure. Without it, infeasible (preset, committee) - # combinations (e.g. a smudging bound violating the correctness budget) are - # recorded in `failures.txt` and the sweep continues. - STRICT=1 shift ;; -h|--help) - echo "Usage: $0 [--preset insecure|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] [--strict]" + echo "Usage: $0 [--preset insecure|secure-8192|secure-16384|all] [--committee minimum|micro|small|all] [--circuits ] [--output ] [--allow-failures]" exit 0 ;; *) @@ -110,9 +118,9 @@ echo " circuits=$(( ${#SELECT_CIRCUITS[@]} )) output=$OUTPUT" mkdir -p "$OUTPUT" -STRICT="${STRICT:-0}" -declare -a MANIFEST -declare -a FAILURES +ALLOW_FAILURES="${ALLOW_FAILURES:-0}" +MANIFEST=() +FAILURES=() for preset in "${SELECT_PRESETS[@]}"; do zk_preset="$(preset_to_zk_name "$preset")" @@ -154,11 +162,11 @@ for preset in "${SELECT_PRESETS[@]}"; do else printf -v fail "%s\t%s\t%s\t(zk_cli %s %s failed)" "$preset" "$committee" "$circuit_path" "$zk_circuit" "$zk_inputs" FAILURES+=("$fail") - if [[ "$STRICT" == "1" ]]; then + if [[ "$ALLOW_FAILURES" != "1" ]]; then echo " ✗ $preset/$committee/$circuit_path failed (strict mode) — aborting" >&2 exit 1 fi - echo " ✗ $preset/$committee/$circuit_path failed (recorded; continue)" >&2 + echo " ✗ $preset/$committee/$circuit_path failed (recorded; --allow-failures)" >&2 fi done done